Take the 2-minute tour ×
Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. It's 100% free, no registration required.

I'm only 13 but i'm genuinely interested in CS and would really like it if I could actually accomplish it. I've read books on C++ and C#, but ALL of them are the same!! They all say "Ok so since you have no prior knowledge in this what so ever, write a snippet that will do this and then make a GUI and then throw it into the Priafdhsu hfad then add the program and then program your own compiler to do some stuff". It's really getting annoying.

I've payed near $40 (via Paypal) on ebooks that supposedly taught people to program with no prior knowledge. ALL OF THEM EXPECT ME TO ALREADY KNOW THE LANGUAGE. Is there something that I'm missing or am I suppose to be born with the property of CS?

I would very much appreciate it if someone could explain this to me or possibly refer me to a tutorial on Programming Theory that starts from below ground zero as I have know knowledge in CS at all.

share|improve this question

closed as not constructive by S.Robins, Jim G., Oleksi, World Engineer, maple_shaft Jun 2 '12 at 2:55

As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center for guidance. If this question can be reworded to fit the rules in the help center, please edit the question.

Why not start with a tutorial. All you literally have to do is search "[insert language here] tutorial". –  Dynamic Jun 1 '12 at 22:37
Computer Science is not the same as Computer Programming or Software Development. Computer Science deals with "What can we compute and how fast?" Computer Programming deals with instructing a computer to do tasks. Software Development/Engineering deals with the production of software in the large using Computer Programming and occasionally (but only occasionally) Computer Science. –  World Engineer Jun 1 '12 at 22:39
Check out this post: programmers.stackexchange.com/questions/96504/… –  Dynamic Jun 1 '12 at 22:46
How can I not post this? cdsmith.wordpress.com/2011/08/16/haskell-for-kids-week-1 –  user16764 Jun 1 '12 at 23:41
@GavinSapp This probably should have been closed earlier because the answers and comments have devolved into flame wars about which programming language is best for beginners, when that isn't even what you were asking for help on. You must be terribly confused now :) If you have a more specific problem that you need help understanding then post back. Good luck! –  maple_shaft Jun 2 '12 at 2:59

7 Answers 7

up vote 3 down vote accepted

I think that a perfectly gentle introduction to the computing in general for someone not in the field is Feynman Lectures on Computation. I think it's a brilliant book because it only concerns itself with some of the essence of what makes up the discipline of computing, both the theoretical and engineering aspects. It's minimalist, spartan even, but is focused on conveying the feel of it. I enjoyed some 20+ years after writing the first line of code :) Your library system should have it. I've found that librarians like Feynman, at least ones in our metro systems.

share|improve this answer

Some suggested reading for you...

To Get Your Hands Dirty

Books to Read

  • Learn Code the Hard Way series (they are online and free!)

    • Learn Python the Hard Way

      The one that started it, and Python probably is a good language for you to get started at your age, as it may be more fun and less constraining than other languages, while being very expressive and powerful: definitely a good choice to get into programming).

    • Learn Ruby the Hard Way

      Might actually be even more appropriate for you, as Ruby is an extremely fun language to play with, and extremely fast to pick up! That being said, I tend to find that people develop a few bad habits with Ruby, that will them be hard to shake off and that might hinder their learning of other languages. Still, if motivation is one of your issues, then Ruby might be even better than Python in your case.

    • Learn C the Hard Way

      That being said, I'm a strong defender of C and of its importance for programmers. Still think it's a bit early to tackle it, but doable, and this book could help you (though I haven't used it, to be honest, but it does get you from basics to more complicated stuff without assuming much). I don't think your age really is the issue to learn C in any way, but it does impose a lot of constraints and it does take TIME to learn, LOTS OF TIME to master, and a decent amount of TIME to do even somewhat simple things sometimes, in comparison with what we know call high-level languages (a label C once had itself, back in the fun days of machine code and assembly).

  • Learn Yourself a Haskell For Great Good

    OK, I expect many people will say maybe I shouldn't point you to that one, for many (some potentially valid) reasons. But you may like it, and if you do it can get you places. It can also spoil you for life and make you look down on all other languages afterwards, but mostly it can teach you some cool stuff and make you see what powerful languages can do.

  • Why's (Poignant) Guide to Ruby

    Also a very fun guide to get started with.

Environments to Experiment

Computer Science?

You mentioned CS, not progamming nor software engineering. This means theoretical stuff as well, though you seemed more enclined to see the practical aspects from what I gathered from your question.

Eventually, you really should get into these theoretical stuff, but it's hard to find resources that aren't borderline (if not extremely) boring. That's not the case for some of them, but many of the references and textbooks are pretty... well, compact, solid and dangerous to hit people in the face with. Doesn't mean they're bad, they may just not an example of good pedagogy. Plus, some day, you might come across something and from a deep and dusty corner of your memory you'll remember there was something about it it one of these books that are more akin to bricks than to guides. That's what they're for, though with today's online resources, that's a bit less relevant.

Some of my favourite reads are:

this is a work in progress, will keep editing this answer

It's Not Just by Programming...

... that you get interested in programming. Maybe some other stuff can get your motivation going. These are amazing books to inspire you to do great things and learn how others got into it before you, and built and modelled the computers and their systems you use today.

For more on this, read my answer (and others') to What are some things you have read that inspired and guided you as a programmer?, where I detail this a lot more. But my top-list for this would be:

A Personal (and Cautionary) Tale...

Hmm, sorry, that part got way longer than I originally planned.

I got into computers when I was about 10, in a time where they were not as accessible as now, in your case (and they were still a LOT more accessible than for some of my older peers, of just a few years... we live a fast-paced era, in terms of technology advances). I got into "programming" (yes, quotes, and I'll bet you a beer - when you reach legal drinking age wherever you are - you'll use some yourself in retrospect in a few years) shortly afterwards, after having broken my first computer a few times and provoked a few blunders.

I had a first contact with some LOGO (though at the time I didn't know it was LOGO) early in primary school (actually, was 7 at the time, I think), and that got me thinking I liked to know how that stuff worked and what else that damn turtle could do. Later, when our family got a computer, I got my hands on QBasic, Windows .BAT files, had to understand why different games would require different kinds of memory to accept to run, and slowly discovered HTML and later JavaScript when the Internet made its entrance (CSS wasn't even in the picture). I got decently good at that, though not exceptional, and for some reason got very interested in some areas of IT: security, operating systems, more serious programming languages.

And here's the point of this (wow, already lengthy) anecdote: though I was extremely motivated at the time to learn, I did pick up at the time things that were too big to chew for me, I have to admit. Maybe I could have learned them, had I had the right things at hand (again, the internet was a bit less wide-spread at the time...). But I failed at some things back then that I excel at nowadays.

I remember trying to learn C, without even quite knowing much about it and without even having a development environment at the time, because I wanted to understand the stuff I saw in these funky Phrack and 2600 articles, for instance (oh yes, I wanted to play with the stack for fun and profit too, but mostly for fun... gimme...). I just wasn't ready, and didn't quite manage to do anything with that, as I didn't even have any environment at hand to do this, or didn't know where to find one (also, I'm not English native, so back then that considerably reduced the pool of online-resources to look for).

I also remember that I went to a class trip to England carrying with me a huge Java 1.2 book. I still have it somewhere. Worst book ever, won't even mention it. It was so bad and so unpractical, and full of things now recognized as bad practices. But maybe, had I known a bit more and had more experience, would it have taught me something. But quite frankly it didn't. Read the thing cover to cover, tried to run examples, tried to write my own stuff, but it assumed I knew some principles that I hadn't seen until now (Object Oriented programming isn't exacly a staple of BASIC, for instance, and so weren't really the Observer Pattern and event-driven APIs like Java's Swing). I gave up, and funnily enough years later I picked up Java in just a few days, remembering some of this (and not even needing that book), because in-between I had properly learned other stuff. And failed at learning other ones.

In-between, I had an high-school optional class for programming, where we mostly did Pascal and Delphi. It was a bit of an half-baked class, to be honest (plus, it was done in German, which also isn't my native language, so that didn't quite help, I guess), but the guy was interesting and that was still programming... even though sometimes it was programming on paper... Ah the joy of losing points because you forgot a semi-colon (son of a gun...). And, well, early Pascal was easy to pick up, because I knew BASIC well and had a read a herd of other stuff, but other stuff hit me in the face. Hmm, recursion to do Koch's snow-flake? What the heck is that? Multiple recursions? You're dreaming, boss... And then early attempts at using Delphi introduced me to a concept I'd really only fully grasp later: pointers (mostly one of the reason why C is important to learn, and also mostly one of the reasons why it may not be the best to start with for you right now). I think the German didn't help at all here, when the guy used to speak about "Hut"s for the Pascal/Delphi pointer sign and so forth... :) They say communication is everything, well, that's not only for marriage.

But, despite these road-blocks, I learned some stuff, was still interested, and when I entered a software engineering school right adter high-school I knew a bunch of stuff. I didn't let it go to my head and think I already knew much, and instead pretty much assumed I knew nothing to really force myself to learn the basics with my peers, and keeping in mind most of what I had taught myself may have been wrong. And every now and then, some concept I had to learn made sense because of something had learned back then. Sometimes I thought I must had been a dumb-ass to not get it back then from the get-go, and sometimes I realized why I didn't. To everyone their own pace.

I had even started to get interested, for some odd reason, in operating systems (maybe for the security aspects, I recall). In particular, I got my hands on a QNX copy, which at the time was previewing a new version of Real Time Operating System based on their brand new Neutrino microkernel. Didn't know shit, didn't know C, wasn't quite sure why the kernel was different or what RTOS or POSIX implied, but figured it looked way cool to be able to play with that, and it was a UNIX. Finally had something I could write C on, and it had this amazing operating system and kernel, this different user interface called Photon, and it did that thing called "real time" which didn't quite make sense to me back then. So I bought the books on the QNX Neutrino Architecture and the QNX Programming Guide by Rob Krten and... well, failed to grasp most of it because my general knowledge of Operating Systems, of C, of kernel design (and of English, quite simply) wasn't well established enough at the time.

And years later, when I had an operating systems course, suddenly I was one of the rare guys who knew QNX, or even what the words microkernel and real-time meant. And I could go back to this book and read it with a deeper understanding. And you know what? Just a few years after that, I was an assistant on a course for Operating System Programming AND a lecturer on Embedded Systems Programming, showing off QNX (and other competing RTOS) to my students.

The time difference between when I bought that QNX book and that class I gave? About 15 years. Looks like a lot of time for you (longer than your life) but it simultaneously seems like a very short time for me (it's less than half my life as of the time of this writing in 2012). Time difference between when I actually started to program (day one of my university, not when I dabbled in it when I was your age) and this course was pretty much 5 years.

I failed to learn basic stuff when I could have grasped them, and understood some ahead of my time. Probably learned more from the failures. Most importantly, even when I failed, I built some degree of understanding of an area, and some general knowledge about something.

And you know what, as dumb as it sounds, that's how you get an expert at something: by sucking at it, failing at it, over and over, time and time again, picking up pieces here and there. Until you finally totally get it... and still suck at other stuff you can now try to improve.

Bottom line, don't sweat it. I was very eager to learn back then, but didn't know where to look. So I tried to look everywhere, and try to do everything. Which is fine. But know this: I failed!! Very happily, but I failed. And so will you... until some day. And I'm sure many people will recognize themselves in this scenario.

Keep having fun, don't get frustrated by the books, and if that's really what you like doing, you'll have picked up a lot of things without realizing it.

So... keep failin'.

share|improve this answer
This is an awesome answer! –  Dynamic Jun 2 '12 at 2:32
@Dynamic: thanks, glad you like it. Still working on it, plus as I wrote a chunk of it in more or less one stream of thought, so it may be fairly unorganized for now. It could help with some further editing and proofreading, but... tomorrow :) 4.30 am here, time to call it a day (were we talking about motivation or what? ;) ) Feel free to edit if you have interesting bits to add. –  haylem Jun 2 '12 at 2:36
That is scarily close to my experience / now flourishing career. Getting into "programming" at age 10 too, by getting a sheet of "commands" at school telling me how to tell a turtle how to draw a square on the screen (LOGO). I soon got into trouble for taking too much time with the program. When the teacher came over, I'd discarded the paper and was already well onto writing my name. Never looked back but man I've found it hard at times, I have my scars from it but to read this post brought back so many memories. I wish I had someone say this when I was 13, I take my hat of too you good sir! –  Pace Jun 13 '12 at 18:51
@Pace: thanks a lot. Don't worrry, lots of people have lived this scenario, and I think that was probably more common a few years ago than now, where IT and programming have become more "industrial" fields that arent "reserved" to people who litteraly fell in love with the craft. Reading "Hackers, Heroes of the Computer Revolution" or "Dealers of Lightening: Xerox PARC and the Dawn of the Computer Age" should bring a lot of smiles to your face. It's not about my generation, but I recognize a lot of patterns and community-spirit in there. –  haylem Jun 15 '12 at 15:01

First of all, rather than approaching a language, try approaching a problem. What is it that you want to make or solve?

Second, find someone you can learn that unsaid stuff from. Books are a great reference and, sometimes, guide but are no substitute for a mentor. I bet you could find an after-school program in your local computer lab. I did that when I was your age. Actually, I figured out how to break from the program we were learning on our Apple IIe's, to a prompt, and was inspired to learn BASIC that ran it.

BASIC is a great way to start but, nowadays, I'd almost say Javascript is a perfect starter. Hit F12 in most modern browsers and you've got an instant sandbox. Start playing with code from tutorials in the console and you'll see magic stuff happen on the page. Hopefully, that'll inspire you to figure out how to make your thing, and pretty soon you'll know a programming language. No books, just lots of tutorials, forum posts, and language references... and, of course, Stack Exchange!

Good luck.

share|improve this answer
You had me right up until you said "Javascript." With all due credit to Djikstra, dynamic typing and garbage collection cripple the mind, and their teaching ought to be regarded as a criminal offense. You can't learn what's going on when the language actively hides the fundamentals from you. –  Mason Wheeler Jun 2 '12 at 0:02
+1 You said what I was going to say. I used to teach intro programming, and we started all students off in BASIC, because it's easy to get started. The object is to get into an individual project ASAP. Later courses taught Pascal. (This was before C was widely used.) The main thing is to get started on some problem that you find interesting, but is not too hard. –  Mike Dunlavey Jun 2 '12 at 0:14
(continued) I would give suggestions of problems, such as Hangman, Wumpus, baseball or football simulation (without graphics), science simulation like sailboat racing or genetics, family banking or investment system, maybe something that plays music, or Conway's Life game. Students would get the idea and then come up with their own. –  Mike Dunlavey Jun 2 '12 at 0:20
Thanks, @MikeDunlavey! I knew the purists like @MasonWheeler would jump on my JS suggestion but you have to admit it's so highly accessible, nowadays. If he's really interested, he'll move on to something proper when the problem calls for it. –  jkoreska Jun 2 '12 at 0:33

"How to Design Programs" is the book you're looking for. It combines a gentle introduction to CS theory and discrete math with concrete programming tasks. The language used, PLT Scheme/Racket, may not be widely used in industry, but it will introduce you to key programming language ideas.

Racket, the dialect of scheme developed by this team, was designed with students your age in mind. Racket says

In parallel, the team started conducting workshops for high school teachers, training them in program design and functional programming. Field tests with these teachers and their students provided essential clues for the direction of the development.

Over the following years, PLT added teaching languages, an algebraic stepper,[15] a transparent read-eval-print loop, a constructor-based printer, and many other innovations to DrScheme, producing an application-quality pedagogic program development environment. By 2001, the core team (Felleisen, Findler, Flatt, Krishnamurthi) had also written and published their first textbook, How to Design Programs, based on their teaching philosophy.

share|improve this answer
I have to disagree. Scheme is a horrible language for beginning programmers, because it's built on a set of baseline abstractions that can be best described as "let's pretend we're not actually programming a computer." This means that the student will be left with no idea as to why the things he's learning work, which will render him unfit to write his own code. If you don't know why things work, you don't know how to fix them when something goes wrong. –  Mason Wheeler Jun 1 '12 at 22:52
-1. It does not matter if the person is 13 or 31. Kids can possibly learn Scheme at 13, but not as FIRST language. –  user7071 Jun 1 '12 at 23:44
@MasonWheeler It seems like many of the all-star CS universities and colleges in North America disagree with you (MIT, Stanford, Waterloo). Scheme is great for teaching the fundamentals of programming. Functional programming in general is a great way to learn the basics of programming without the complexity of mutation and state. And it's becoming more and more relevant in "real-life" programming. It's no coincidence that every major language is now getting many functional features like first-class functions. –  Oleksi Jun 2 '12 at 0:05
@oleski: You can't learn programming "without the complexity of mutation and state." It's one of the two most fundamental concepts in computer programming. Even languages that try their absolute best to avoid it (see: Haskell) have to bow to reality, usually in ways that make everything far more complicated than if they hadn't tried to sweep the state under the rug. (See: monads in Haskell.) –  Mason Wheeler Jun 2 '12 at 0:09
@Olksi. For old schoolers state is not a worry. Knowing whole state after every given step is peace of mind. If kids were learning combinatorial part of automata by bare hands using piles of LS74 series and paper and pencil, then world will be free of race condition bugs, stupid polling loops and "smallest in the world OS Linux edition 3GB size". And my blue ray theater will be booting in 1 millisecond instead of 1 minute. –  user7071 Jun 2 '12 at 0:18

In your particular situation the disappointment came from contrast. You spent significant effort, money and time, doing 2 attempts in a row and falling behind your peers. No rewards after large spendings. It is perfectly OK, because you chose really hard targets.

So best way to learn, for you, is possibly to take lower risk path. Find smallest isolated platform you can program and start with it. Say, if you can borrow a programmable calculator for free and write a 5 lines program.

While writing this small program do not start next project until you completely in precise details understand what every instruction does. What parts, states are involved. Understand it perfectly, find answers to absolutely every question raised.

After completing it, you will wonder what every possible instruction does. There should not be too many of them. May be 40-50. Understand them at least half way.

After having done 2-3 projects, you will realise: I can express every given problem in code in this particular language. That is how every programmer feels if he/she is a programmer.

share|improve this answer

Well, you could try Java instead. If you have some idea what a variable or a loop is, Head First Java is a fabulous resource.

share|improve this answer
-1. Because Java will make no difference after trying C#. For beginner it is essentially the same syntax sugar all over again. The disappointment is already in place, why add another. –  user7071 Jun 1 '12 at 23:23
@RocketSurgeon - My point was more that the Head First book is an excellent one for beginners--not that Java is easier than C#. Also, I linked to a free download of the book, and Java is free. I'm not sure this merits a downvote, but whatever. –  Matthew Flynn Jun 1 '12 at 23:52
Right. You are possibly pointing to the best book. But I imagined myself back in time starting with any of contemporary high level languages, and I see myself failing. It is possibly a perfect 2nd book, but not first. –  user7071 Jun 2 '12 at 0:01

I'm only 13 but i'm genuinely interested in CS and would really like it if I could actually accomplish it. I've read books on C++ and C#

Well, here's your first mistake. CS has practically nothing whatsoever to do with the actual programming of non-trivial programs. Once you get past the "What's the fastest algorithm" stage, that's pretty much it. Software Engineering and Computer Science are not particularly related fields- pick one and go for it.

share|improve this answer
True, they're not the same, though I wouldn't say they're not particularly related. And you don't necessarily need to pick one, you can pick both. :) Really depends on what he wants to do, but there is a middle ground there for lots of people. –  haylem Jun 2 '12 at 0:52

Not the answer you're looking for? Browse other questions tagged or ask your own question.