In an attempt to be a better programmer, I am planning to read a lot of books and learn at least one new language (which I think is going to be python) during the 3-month long holiday that I am going to have.

The list of books that I am planning to read --


The list of things that I want to do --

  • Start using Linux (probably starting with Ubuntu).
  • Learning to use the bunch of tools mentioned here.
  • Setup a blog (hopefully).

I enjoy watching lectures as well, so, along with Introduction to Algorithms I am going to watch a bunch of Stanford Courses.

A little background: I am a 17 year old guy and I really enjoy programming and every aspect related to it. I have been programming in C and C++ for a while now. The former is more stronger than the latter. I was hoping to utilize the time that I have got on hand thoroughly. Any changes needed with the plan or any additions?

EDIT: Did not mention programming projects.

  1. Making a game using Allegro.
  2. Using QT4 to create a GUI-based database for my school.
+20  A: 

Do not just passively read all that information, instead practice after every book chapter or lecture. Practice by writing those algorithms or regexpes for yourself, check your previous code in the light of what code complete has taught you and so on.

If that doesn't give you enough time to do it all, doesn't matter, you better learn properly instead of swallowing material as fast as you can. And all of that is probably too much to do it in only three months anyway, so prioritize by your interests. Take one book and a set of lectures and go at them until finished, then pickup the next, never forgetting to put in practice the concepts shown.

Vinko Vrsalovic
Thanks for the advice, I am working on a couple of projects and they are almost finished (mentioned in edit). I am currently looking for some good projects.
Totally true - do the exercises and compare the ideal of the exercise against what you had to do to get it done.
John Fiala
+1  A: 

I want to add the following book:

  • Project Behaviors: from Adrenalin Junkies to Template Zombies(ISBN: 0932633676)
I am not going into a company already! But, it seems to be an interesting book.
+2  A: 

For an introduction to source control, I'd recommend reading Chapter 1 "Fundamental Concepts" of Version Control with Subversion. This gives a better introduction to the basic concepts of source control than Eric Sink's Source Control HOWTO, in my opinion, and is more directly relevant if you'll be using Subversion anyway. Of course, read both if you have the time. Good luck!

Thanks for the recommendation.
+2  A: 

Looks like you have your hands full for the 3 months. I wouldn't suggest additions except to say that programming is a practical exercise. Make sure that you write lots of programs while reading. Thanks for the stanford link. MIT has some online lectures too.

Vincent Ramdhanie
Yeah, I sure will practice, hopefully I will be able to write some really useful programs.
+2  A: 

I would say it would also be a good idea to specifically plan to write some software that sounds interesting and does something interesting for you. If you like sudoku, it might be nice to build a sudoku puzzle generator and UI. You might also consider a chat client, or maybe a topic sorter that finds the common words between documents. If you're not interested in starting anything, I'm sure also many people would be happy to have somebody working with them on a project, even loosely. You could consider going to Sourceforge and looking for projects that seem interesting. But, the best way to learn is to apply programming skills to other tasks.

John the Statistician
Yeah, I am already dreaming of things to do once I am upto the mark in python.
+3  A: 

I would add the following two books if you haven't read them already:

Programming Pearls by Jon Bentley

Code by Charles Petzold

Even as it stands, you're going to have a very busy, hopefully productive break. Good luck!

Response to question edit: If you're interested in learning about databases, then I recommend Database in Depth by Chris Date. I hope by "create a GUI-based database" you mean implementing a front-end application for an existing database back end. There are plenty of database solutions out there, and it will be well worth it for your future career to learn a few of them.

Bill the Lizard
I did consider these two books, but, I wanted to keep the list down to four books.
Programming Pearls is an excellent source of hands-on, practical programming problems.
+1  A: 

Podcasts and mailing lists might be valuable additions to your list. One of the best ways to learn is to listen to/read about other developers discuss how they are solving problems. The types of discussions that happen on developer mailing lists are quite different from what happens here on stack overflow.

Daniel Auger
Will going to IRC of a particular developer channel suffice or should I join mailing lists?
I prefer mailing lists because some of the more insightful discussions span several days.
Daniel Auger
+2  A: 

While you are waiting in line, or on the bus, or other "wasted" time. Make sure you are trying to model aspects of the universe in your mind. "I wonder how the bus ticket dispenser works?"

Ali A
+1  A: 

Try to work alongside of someone who is a better, more experienced programmer. If you can, do some pair programming. Have a back and forth discussion about how to design and implement a solution touching upon the pros and cons of each decision.

Paul Croarkin
Good idea, but, unfortunately not possible.
+5  A: 

That's too much for three months.

Don't try to become a ``language lawyer'', things might change in the next couple of years. Python, however, is a good choice :) Learn it by practice, by solving small real-world problems.

Don't master regular expressions before you feel the need to use them. Try becoming a regular expression apprentice before becoming a master. You can't become real good at this in three months anyway, there are too many dialects. And you don't need to.

At seventeen your attitude to the world is still under development. Learning algorithms is helpful in the sense that it seasons your approach at problem solving. But most useful algorithms already have their implementations and you are more likely to reuse them. So, you should know how they work, and when to use which, but don't think you'll be implementing a red-black tree or network flow at work. If some day you get a job that requires design of algorithms, maybe you are lucky, or maybe you are doing nothing useful.

I didn't want to sound like a gray-haired preacher, but anyway... you should be selective and throttle your knowledge input.

I am not trying to be a "language lawyer". I wanted to learn a scripting language and because of my familiarity with C, I chose python. I am still not sure about regex, but, I thought I might as well learn it. Algorithms is going to help me with my math course, so, its a win-win. Thanks!
+2  A: 

Sounds good, and if you can do all that it would be great. However it seems like a pretty big goal all together. The danger is if you feel you can't meet the goal and lose all motivation and/or procrastinate things until the last minute and get nothing done. Plus you mentioned you are 17 so I am sure you want to do what normal 17 year olds do (hang out with friends, play video games, etc.) as well.

So anyway I'm not trying to discourage you, but I am trying to encourage you to set more realistic goals. Any one of these goals may be enough to take up your entire vacation.

So anyway as for your goals: 1. If you read a book on Python that doesn't mean you know python, you also have to make lots of programs with Python. It is easy to learn Python syntax and then go writing C#/C++/Java in Python. It is much more difficult to write Python in Python. This includes things like instead of concatenating a string as str += newstr + "," joining an array of strings together ",".join(array). There are performance reasons for that. All this being said, I think this goal is somewhat realistic for 3 months. You won't be an expert but you will probably have more than enough to play in Python and also to get little jobs done (moving your files around, generating templates for a web page, etc.).

  1. Code Complete - I read this book and it is not an easy read. The writing style is not dry like some academic texts. But the book is long and it has a lot. Not only that but if you read it more than once your understanding of the book will change. I think that with your goal of being a better programmer, this book is the best thing you can do. It may take the whole 3 months for you to read once. It is worth it. This book is basically an in depth essay on how to prepare code and keep it more maintainable and an overview on the entire software development process. WARNING---You will be frustrated when you start a career and realize almost no one else has read this book :) You may not know all the uses for this book until later in your career.

  2. "Introduction to Algorithms" is a good bible on algorithms, it is also pretty long and dry. Quite often an undergraduate first data structure and algorithms course is nowhere near the entire book. Most undergraduate data structure classes use other easier books and even then don't cover the whole book. Also most of the content will not help you to be a better programmer directly. Chances are you don't need to deal with Convex Hulls. Even the lectures you linked don't cover the entire book. But with the lectures it may be more digestible. Still this is probably overkill. I would say start with an easier book on Algorithms (follow the recommendations). Most likely you will only need the book as a cook book at most (and in the real world in most jobs you won't even need this as a cook book). If you want a PhD in computer science then sure learn everything in this book, but set it as a longer goal. Plus I'm not sure your mathematical background. But there is a strong emphasis on math at the beginning of the book. Just be careful here. I think there is a benefit. But there are many books that are easier reads to learn from. This book is best when you already know the basics and know what to look for.

  3. "Mastering REgular Expressions" -- I would recommend instead. Depending upon your language of choice regular expressions can vary a lot. But many languages adopt all or at least a lot of Perl Style regular expressions. I don't know every single syntax of regular expressions or every little detail of them. There is a core that handles most jobs (capture groups, quantifiers, special characters, character classes, etc.) and greedy vs nongreedy. Also it is very easy to build up incomprehensible regular expressions which won't serve you or the next maintainer. I would also recommend as a reference. But in general the best way to learn regular expressions is to read the overview in Perlretut and then as you need to match text, to USE regular expressions. This will help you much more than any book. Python has slightly harder to use regular expressions than Perl but most of the syntax is the same, it just isn't built into the language. So go find web pages and practice using regular expressions to match certain text. Go to your favorite gaming site and use the expressions to extract game names, authors, and ratings or something else. It is fairly easy to view source on an html page and save it. Have fun.


I'm not saying you can't do all these tasks. But I think the task of learning Python alone may be more than enough of a project for 3 months. You won't be a master in that time. But you can probably write simple scripts to scrape things off web pages, move your files around, maybe even serve up a website. If you have tasks that require parsing text, then you can learn regular expressions by use. Definitely don't neglect to READ python code that other people wrote. Code Complete may be a good longer term goal, especially as you read other people's code and understand where the points apply to more. Algorithms is a good longer term goal as well. You will be responsible for some of that material if you get a degree in computer science. Or all of that material if you go for a PhD....

Thanks for a long and informative description of the books, I needed them. I am surely going to program more than read. The thing that I am considering dropping is Regex, as it is not going to help just now.
+1  A: 

These probably won't fit within your three month plan, but should you wish to master C and Unix, long have I been glad that I spent the time to follow The Loginataka. After that, I found Lions' Commentary on UNIX 6th Edition to be deeply enlightening.

I always wanted to learn more on C. This is surely helpful. But, its not going to happen it three months as you said.
+4  A: 

One thing I would recommend, personally, is to find a way to get some practice reading code written by other programmers. A good option for that sort of thing is to pick an open-source project (one that you admire) and try to figure out how parts of it work.

In my own personal experience, there are really three tiers of learning to program:

  1. Reading about programming
  2. Writing your own code from scratch
  3. Reading code and being able to debug or add to it

One might figure that #3 would come before #2, but in practice it doesn't. :) Every programmer I know has had the experience of reading code written by somebody else for the first time and going "yuck, why did they do things that way?" When you first get into programming, your own code will always be easier to understand than somebody else's. But part of the challenge of programming is that over time even your own code will lose its familiarity and maintaining your own software will be just as difficult as maintaining somebody else's.

Analyzing real-world, working code is also one of the most practical skills a programmer can have. You've probably heard the old expression "don't reinvent the wheel." :) Well, one of the traps that programmers fall into is reinventing the wheel because they don't feel that they can thoroughly understand complex code unless they've written it themselves. If you're really serious about writing the best software possible, you have to be just as willing to spend the time reading a solution written by somebody else as you are to write a solution of your own.

I haven't done #3 so far. I might as well start that now.
"Analyzing real-world, working code is also one of the most practical skills a programmer can have." Amen. Amen. Amen.
que que
+1  A: 

If you're interested in python, after reading "Learning Python" I'd absolutely recommend reading Dive Into Python. I learned about tons of language features I wasn't using before that made my python much more effective, and it even goes into stuff like reflection, using it for web programming, etc.

That will be the next stop after "Learning Python".
+1  A: 

Excellent choice of books.

In addition:

"Test Driven Development: By Example" by Kent Beck

And, how about contributing to an open source project? When you learn a new language you need to use it daily, otherwise you forget.


Had never heard of the book. Looked it up in Amazon, seems interesting.
+1  A: 

The best thing you can do for your programming future at the age of 17 is to spend the 3 months studying for the PRE-Undergraduate entrance exams (SAT, ACT, etc..).

Knowing how to program isn't going to get your into a good school, or give you credibility to get a job. The best thing to do is spend time improving the chance that you'll get into a top computer science department, in a college of engineering. Getting into a top-notch college for undergrad will also help you get into a top-notch grad school as well. With your current knowledge of programming, there's no doubt that you'll succeed in a college CS program. You just need to get into a good one.

It all start with your high school grades and your entrance exams. There are lots of great study tools you can download from torrent sites. Now get cracking!

Thankfully, this is a break where I won't be having any other things to worry about.
+1  A: 

If you're looking to improve your C++ knowledge I would definitely recommend the Schaum's Outline of Programming with C++ by John R. Hubbard:

The Outline Series covers just about any academic subject you can think of and this book has tons of examples and question/answer sets. Very thorough and great for practicing. This book seems almost devoid of any extraneous information.

It's conciseness has helped me out on more than one occasion in getting up to speed for job interviews - lot's of easy-to-read stuff on standard things like const correctness, pointer arithmetic and object oriented basics like polymorphism and multiple inheritance etc etc...

Just a suggestion...

Thanks, it seems that there are a lot of great books that I have never heard of. Hopefully, I will be able to read the better ones sometime.
+3  A: 

I might actually suggest trying to learn a programming language that has a wildly different syntax and/or structure from C/C++. In college, I had a class where the main assignment was to write a Scheme interpreter in Scheme. It was a fascinating class. Learning a totally different programming language/style can help you see common practices/techniques in a new light and maybe even see practices/techniques you wouldn't have considered before.

Jay Sheridan
I am learning python, which I believe is quite different from C, even thought its C underneath.
+1  A: 

Learn Lisp, read Code Complete, setup a SVN server, and work on getting openGL bindings for Lisp written/working for a game.

Seriously, you're biting off significantly more than you can fit in your mouth. (you can DO it all, just with poor quality).

Paul Nathan
Lisp... had never really thought about learning it. But, I guess I will learn Lisp after I master C, C++ and Python.
+4  A: 

Along with the excellent books you and others listed here I recommend The Little Schemer which will give you a perspective of functional programming. Do not lock yourself into imperative languages (C, C++, C#, Pascal, Java,.. ) while you can dive into different paradigms easily. 17 is a great age :-) Enjoy your journey!

+2  A: 

You might find this interesting as well-> structure and interpretation of computer programs

One of the other lecture series that I considered, but, I will learn LISP later.
+4  A: 

Get into the habit of solving (and submitting) a TopCoder problem a day.

Eric Smith
I am solving the problems.

Dont forget to learn the business of programming itself as well as the details of the business(es) that interest you. Why? Because these days you will go very far if you hybrid your skills. You should be able to talk to the users as well as the CFO and CEO. Learn your technical side very well but complement it with a very good knowledge of business and you will be unstoppable!

Optimal Solutions
+1  A: 

I would try and get something on Design Patterns in there for some higher level structural thought. For me this is more important than lower-level stuff like regular expressions, syntax of different languages, source-control, even algorithms. You can learn lots about these but if you're high-level design is poor, your code will never be any good. I'm reading 'Head First Design Patterns' at the moment. It's a lot of fun to read.

+6  A: 

For a somewhat less fun and far more abstract suggestion:

Learn math. But don't learn learn the basic, grunt stuff they make you deal with in school. I consider the way that we teach math in America to border on criminally negligent.

If high schools taught English the way they teach Math, you'd spend four years diagramming sentences. You'd get the what but not the why. There's a reason that we have kids read the likes of Oscar Wilde or Mark Twain; to show that these elements of good communication can bring out creativity and joy. They can improve our lives.

Math is the same way. I hated math until my mid-20's, when I became friends with a guy who loved math. He opened my eyes to the true and fascinating nature of mathematics and the mathematicians who built our understanding from the most basic elements.

But there's more to it. All computer programs are trying to present abstractions or representations of real-world concepts around us. There's a reason we have web pages and we put files into a folder. We're all using abstractions to help us wrap our heads around an essentially foreign binary system.

Here's the cool part: computers run on math, and only math. But if God has a language, it's Mathematics. Learning to pattern out problems in the real world mathematically and create mathematical solutions is the heart of good programming.

The rest is just syntax. That's the easy part.

Other than learning math, really learn the guts of the machine. Learn how the whole damn thing works. If, as a programmer, you can't open the box and look at each component and know, at least in the rough, how it works with the overall system then you won't be as good of a programmer as you should be.


Finally, have fun. Don't kill the excitement by overdoing it. You can't become a great programmer in 3 months. It'll take you three years to become decent. Don't let that discourage you; the journey is full of exciting moments of understanding. Let yourself enjoy it.

Jason L