The road to become an alpha programmer

Sunday, 10 December 2006, in categories: Programming

Update: Version 1.2, 07.05.07 - A lot of typos and grammar errors fixed, added new positions again, rewritten some of the descriptions.

Update: Version 1.1, 21.03.07 - I reorganized the whole thing and rewritten various parts of it, added some new positions, expanded the mind-map etc.

So, you wanna be a programmer, but you don’t have a fortune to spend to start learning in a decent college nor whole days for studying. Or maybe you’re too young to go to a college, but you wanna get an idea of what CS is about. Or you hate people because you’re a nerd, or you got a sucking score on the SATs, or you didn’t make it to the MIT like I didn’t, or whatever…

The good news is: I’m 100% sure one can get really, really good on your own at home - it needs a lot of dedication and effort, through. It’s much easier to just sit whole days and read posts on weblogs about how to get good at something than to really start studying hard (speaking from my own experience). I found that I already have so much stuff that I want to learn that I don’t need even more new inputs to overwhelm me, so I cut out a lot of programming related blogs from my feed reader. The article below is supposed to be a road-map primarily for myself, so feel free to make suggestions, but remember it isn’t meant to be objective, authoritative or complete.

I started the project with drawing a paper mind-map, as I found it to be the best way to comprehend a vast amount of knowledge. When I ran out of place on the sheet of paper I digitalized it using the great open source FreeMind application. This is the result:

Free Image Hosting at www.ImageShack.us

You can also download the FreeMind source file for the mind map and modify it in any way you want it.

The second part of my work was collecting the resources necessary to get a solid understanding of each of the nodes in the map. I mainly did a lot of Googling, and used the knowledge gained by tracking programming.reddit.com and other programming related sites. The list became very big and some of the positions are so tough, it would probably take several years to get it all, but nevertheless it’s useful to get a birds-eye view at what one already knows and where one could make an improvement. I at least skimmed through most of the books listed here, so the selection isn’t based on other people opinion. Here we go:

Books, links, resources:

Learning to learn:

Mastery - I will copy an idea from the “Personal MBA” and start with a book completely unrelated with the field. It is a must-read nevertheless - it describes the path to becoming good no matter which discipline you want to excel in, along with the common pitfalls people make trying to accomplish this.

Getting Things Done - Self-learning CS requires a lot of time and a solid system for tracking your progress and avoiding procrastination - and GTD happens to be the best system for that. Mind Performance Hacks has some useful advice as well.

Fundamentals:

C2 Wiki - If you took this Wiki and visualized the connections between pages you would get a much more complete mind-map of programming that I’ve drawn. You can find resources for almost everything programming-related there, take the advantage from it.

Structure and Interpretation of Computer Programs - available online for free, but as a cornerstone of any serious personal programming library I think it’s better to just buy it. There was so much good things written about this book you probably already heard about it. Anyway, the authors introduce a very basic subset of the Scheme programming language and use it for gradually creating higher and higher levels of abstractions. You will learn about state, iteration, recursion, writing interpreters etc. When I first started studying it it was like an enlightenment for me. If you’re looking for alternatives / companion (the book is tough, you may need it) take a look at How To Design Programs (available for free online) or Concrete Abstractions (also for free)

Introduction to Algorithms - This canonical text-book is both the most widely recommended introductory algorithms book and also a great dictionary of algorithms. Plenty of useful stuff here, with examples easily convertible into any not too exotic language like C++/Java/whatever. It’s also tough and full of math, but so are most great CS books. If you’re already a hardcore geek, there is also “The Art Of Computer Programming” but for most of us, mere mortals, its a bit tough (not that ItA is easy, but hey, at least they don’t use a made up assembler “to not hide the complexity” of the algorithms). I will try to tackle in it my fifties, through.

The C Programming Language - You may brag that C is hard, that C is “passe”, that C is stupid, but there is a whole fuckin’ lot of C code around and there certainly will be times that you will need to do something in C. And there is also a lot of things that are actually fun to do in C, even through the language has it quirks. This book was a bit like the bible for a whole generation of programmers, not without reason. I personally learned the very basics of programming from it and if I wanted to learn someone to program, I would still gave him/her this book.

Design Patterns - Wheter you like it or not, OOP is now one of the most widely used paradigms and this books defines what OOP is all about. And if you’re writing your programs in C++, Java or C# you will also probably find the stuff practically useful on a day-to-day basis. Head First Design Patterns is a bit easier to read, and still has a lot of useful stuff inside.

Pragmatic Programmer - By professionals, for professionals. You can learn a whole lot of practical things from this book. It will help you get your programming done faster (by teaching code generation, using shell tools etc.), more reliable (by emphasizing testing) and more humane (check out The Agile Manifesto). Its also one of the very few books that talk about something like programming “work ethic”. Hard to explain, but it’s definitely one of my favorite books ever.

Programming Pearls - This book is like a good novel, or maybe like a funny story told you by your friend. No problems with going through, and I personally had a lot of “Aha!” moments reading it. It has one other very rare quality I appreciate above everything else - it shows how programming can be fun.

Algorithms:

Programming Challenges - This is one of the rare book which approaches algorithms from the side of real problems, stepping beyond giving you hundreds of ways to sort an array which your programming language probably already can do better. So, if you want to know why and how the stuff can be useful to you, take a look at this book. Also a must if you want to participate in some sort of programming competition (like TopCoder). The author has also a nice page with resources about algorithms and a second book (which is also great) called The Algorithm Design Manual.

You can also download free Algorithms video lectures from MIT or from Berkley. You can lookup useful stuff on Wikipedia, too. If you still don’t have enough, visit the Algorithmist wiki.

Math, logic, formal systems etc.:

Goedel, Escher, Bach - Wanna know what Bach has to do with Zen, logic and Escher paintings? This book will tell you that. Self-promotion on a geek-party guaranteed.

Wikipedias Math Category will give you a basic overview of the various branches of math. You can lookup more specific stuff in the MathWorld.

Concrete Mathematics - as everything than Knuth written its damn smart and more damn hard to understand.

Steve Yegge has a nice post on Math for programmers.

MIT OpenCourse has a course on Mathematics for Computer Science.

What is Mathematics? is often quoted as the best introduction to what modern mathematics is about.

Compilers, interpreters, programming language theory:

Let’s Build a Compiler - an old, free tutorial about building compilers. You don’t have to be a genius to actually understand it, which is a major advantage over most of the other resources about building compilers.

Essentials Of Programming Languages and Programming Language Pragmatics are often quoted as SICP competition. And there is of course also “the Dragon Book”.

Problem solving:

The really hard problems in programming are most of the time hard conceptually, not because of the technology side. You need techniques to cope with them and you need to learn to be creative, too.

Thinking Forth - Forth may be not the most fashionable programming language like now, but this book is worth a read and you don’t have to know the language to read it. It touches a lot of various topics in an interesting way, but the sections about problem decomposition are especially inspiring. The author also described some Extreme Programming principles before it was even “invented”.

How To Solve It? - The classic introduction to heuristics or the art of solving problems. Here in relation to mathematics, but also useful when programming.

Six Thinking Hats - Edward De Bono is the master of Out Of The Box Thinking. This books teaches categorizes various ways of thinking, so you can tackle problems from various sides. Google for “lateral thinking”, too.

Languages:

Ruby:

This one is my favourite, so I will start with it. For start you have three excellent, free online books: Learn To Program, Why’s Poignant Guide to Ruby and an old copy of Programming Ruby.

Especially why’s poignant guide is interesting, as a comic book about programming… If you’re really a beginner its an excellent way to start programming in general. Ruby is easy, you have ultra-fun, free tutorials and instead of learning some sucking language designed for education-only you get to know a ultra-powerful tool. And its hot now, too. If you’re serious about Ruby, make sure you get the newest edition of Programming Ruby and Agile Web Development with Rails.

Ruby software masterpiece to study: Ruby On Rails

Java:

A lot “l33t hackers” like to bash Java from time to time, but well, I still think its quite a nice language. It has the best GUI toolkit programming-wise I’ve ever saw (Swing, its a pity its sucks user-wise), a HUGE ecosystem, a great amount of books and its “safe” - You will spend less time finding stupid bugs than in C++ or C. And it got open-source recently, which can bear some fruits… From Java books I would recommend Thinking in Java, Core Java and Effective Java. But hey, you have a free tutorial from Sun, you can grab a free copy of Thinking in Java or take a look at MIT OpenCourseWare materials.

Java software masterpiece to study: Eclipse.

C:

I’m not sure if you really need any books about C besides “The C Programming Language” mentioned earlier. Maybe some system specific stuff, if you want to use parts of UNIX or WinAPI, but about the language itself? Just read some C discussion group, use splint to check your programs and maybe some memory tool like Valgrind from time to time too. For the system specific stuff check out Stevens books and Programming Windows respectively.

C software masterpiece to study: Apache, Linux, Ruby, Gcc and hundreds of others.

C++:

Accelerated C++ - This is probably the best introductory C++ book on the market today. What makes it unique is the approach to learning the language - they try present the most useful concepts as quickly as possible, so the reader/student can start writing useful programs early on. One way this is accomplished is by making heavy use of the STL from the very beginning ie. you learn to use a vector before you learn to initialize an array. The focus of the book is on modern C++ techniques, a lot of the “C” in C++ is skipped. The difficulty level of the content gets higher nearer the end of the book, where topics like memory management are covered, so people already knowing some C++ should also enjoy this. I wish I had this book when I first have been learning C++…

For the definitive C++ reference, see The C++ Programming Languages - also known as “The New Testament”. Tough to read, but C++ is hard too. If you don’t believe me try to read C++ Tempate Metaprogramming or Beyond The C++ Standard Library. More user-friendly and in-depth C++ books include Lippmans C++ Primer and The C++ Standard Library by Josuttis. The free C++ In Action is a good book about C++ and about programming techniques in general. It has even a Windows programming intro in it. Considering the price, it’s a clear winner.

C++ software masterpiece to study: The STL itself. Wicked cool algorithms and even more wicked C++ magic.

Lisp / Scheme:

Successful Lisp, also available for free.

Practical Common Lisp, also available for free. A nice talk to help get you started.

On Lisp, also available for free.

How To Design Programs, also available for free. Wow, those Scheme/Lisp guys are generous (or maybe no-one wants to read it?).

You can learn a lot from Scheme/Lisp so seize the opportunity. Functional programming will give A LOT of insight, especially after years of writing programs in languages that don’t differ too much conceptually i.e. C++, Java, C#. If you like you might even go a step forward and learn Haskell. Or even write yourself a Scheme interpreter in it.

More resources here.

Lisp software masterpiece to study: GNU Emacs

Smalltalk:

Smalltalk and Lisp have one thing in common - fans of both of them like to boast about their language giving her programmers almost super-human powers. With all those nice, dynamic scripting language with nice object orientation, functional programming capabilities and huge amount of libraries I think its not that valid anymore. But of course you can still learn a whole lot from studying them. So, if you want to know what OO is really about install Squeak, get familiar with the language and take a try at Kent Becks Smalltalk Best Practice Patterns. You have also a lot of free Smalltalk books available.

Software masterpiece in Smalltalk: perhaps Seaside or Sqeuak itself.

Erlang:

With a different approach to concurrency than the one used in other programming languages and being declarative Erlang is certainly an interesting and mind-expanding technology to learn. Trying to grok it is also a good occasion to read why traditional threads suck. When you know it, the best book available for learning Erlang is probably Programming Erlang. You might also want to look at some free alternatives like Thinking In Erlang or Erlang In Real Time. I also wrote about Erlang in a separate post.

Software masterpiece in Erlang: Yaws.

Artificial Intelligence:

Paradigms of Artificial Intelligence Programming are widely recommended for everyone wanting to get into AI. Its also nice for learning Lisp. One of the candidates for the best programming book ever? I didn’t yet read it personally, this is why it isn’t in the “Essentials” on the very beginning. You have also Artificial Intelligence: A Modern Approach, also by Peter Norvig.

Databases:

The SQL Handbook - This book is very general because it treats the general SQL standard, not any particular implementation. But I’ve learn most of the SQL I use in my work from this book in just a few sittings, so it isn’t bad. And don’t buy nothing to get to know a particular database engine. There is way too much online documentation available to waste your money on such books, which are 9 times out of 10 a printed version of the free docs. Use Google instead. Also, Phillip Greenspun has free books about SQL and building database backed up web sites.

Web stuff:

Learning about the Web from books is like learning to swim in a bathtub or whatever analogy you like better. There is so much resources about XHTML, CSS, JavaScript, DOM, AJAX etc. there is even no sense in mentioning them all. Just start with Web Developers Handbook and use Google when in doubt. Get familliar with RFCs. W3C references and Mozillas JavaScript docs. Specifications are a tough read, but thats how you became an expert and well, you can always use Google.

Tools:

This is where holy wars start, so I want go too much into details, for my software setup checkout the post called “My Linux stack”. Use your search engine of choice to look for more options - everyone has his own preferences. Also remember that tools change every year (besides emacs) and the fundamentals stay always the same… Some general tools resources:

Mastering Regular Expressions - The canonical book about regular expressions. You can get really bad with them as they get more and more ugly as you expand them, but they can also save you a great amount of time when you have to do a search and replace in 10000 of files.

UNIX command line are sure another time saver. Don’t forget that in the beginning was the command line. I don’t know any real good online tutorial for them, so just use the key “man” application for find, grep, xargs, sed, awk, etc. Do a ls /bin from time to time and choose one thing at random, or whatever.

Testing:

Test Infected - the article that started it all.

Test Driven Development: A Practical Guide - a non-sucking book about unit testing software. Not any easy find.

Behaviour Driven Development is the new hot kid in the testing world and the page has a lot of really interesting materials about testing in general. Watch the video for a start.

After you get into testing, don’t forget to refactor.

Also, don’t forget about testing more from the user side as in FitNesse or Selenium. Check out the Wikipedia page about Software testing to get familiar with the vast amount of subjects related to testing.

Project management:

Peopleware - Its not about programming per se, but its about the most important part of it - people. Those days its hard to build something really good on one own, and working in a team is one of the biggest challenges in programming, at least in my case and in my very humble opinion. Also, don’t forget that the goal of computer programs is to serve humans - so first you need to understand what people want.

The Mythical Man-Month - if you want to know wtf programming projects fail sometimes, read this. You probably already did :)

The Art Of Project Management and Getting Real. Some new wave advice about how to not get crazy when creating software. But if you really want to avoid this, maybe its better to choose delivering newspapers by bicycle as a job.

Extreme Programming Explained - XP is controversial, but you must at least superficially have an idea of what is it about. You can certainly find a lot of useful stuff in there, no matter what the critics say. There is probably also some shit there, nevertheless of what XP resellers may tell you.

Buildix - A LiveCD for setting up an “agile” project. It consists of Trac - a quite nice open source project management system, Subversion - the sucking VCS everybody is using and CruiseControl for Continuous Integration.

Low level hacking:

Art Of Assembly - The best Assembler book available and a free one. Programming in assembler is not too hip those days, but there is a lot of interesting stuff you can do in you know it. Like writing an operating system, or cracking software. You can even nicely creating WinAPI application in it, which Iczelion has tutorials for. Check them out even if you don’t know assembly too well - I’ve learnt Windows programming from those converting the examples to C without too much effort.

Art Of Electronics - Good place to start if You want to hack not only software, but also hardware.

Fravia - Before SearchLores, there was another wicked page, but not about searching, yet about reverse engineering. Another time wired and attracting at same time.

Other advice:

Peter Norvig’s Learn programming in 10 years

Paul Graham’s essays contain a lot of interesting ideas and are a pleasure to read.

A list of free CS video lectures

Stiff asks, great programmers answer - shameless self-promotion, but there is certainly a lot of useful advice from people that surely succeeded in getting good at programming.

“Personal CS degree” - a discussion at Metafilter

Add to del.icio.us / Add to reddit.com / Digg it!

Comments (RSS):

Seban, 10 December 2006, 7:02 pm

Very, very interesting . Aspecially second part. It’s good that you wirte about math. I think this important think, not essential but important. I’ts better to know math :) Maybe UML can be useful to? Thinkinh in C++ is also good book, you should write about it.
Do you write some entry in polish or only english for now?

stiff, 10 December 2006, 7:15 pm

I still write some entires in Polish, they go to a separate weblog thorugh (http://www.stifflog.com/pl). Unfortunately I don’t always have enough time and energy to translate everything I write from English to Polish or from Polish to English. So they’re like completely separate now.

micro, 11 December 2006, 3:50 pm

It is great. I am highly impressed.However,you are biase toward Ruby. I

galo, 15 December 2006, 4:29 am

Good post. I personally never met anyone who tought themselves anything and became very good at it, but that does not mean it isnt possible. If it is tho, this post certainly helps. Great execution.

Maybe some notion on Operating Systems (Tanenbaum?) would be a nice thing to add to a “personal programmer resumé”.

As they said tho’, biase on Ruby :D Guess its the new thing nowadays…but you could’ve added a “/Python”.

stiff, 15 December 2006, 7:53 am

You’re right about the operating systems stuff, I will try to add it soon…

I don’t like Python and this post isn’t supposed to be objective ;P

biblog » Blog Archive » Stifflog, 19 March 2007, 1:50 am

[…] Come spesso accade, cercando risorse su un libro decisamente interessante a giudicare dalle recensioni di Amazon, sono capitato su un sito ancor più interessante (il cui ideatore è animato da una reale passione per la computer science). In particolare ho trovato enormemente piacevole la lettura di questo articolo, sia perché viene citato l’approccio Getting Things Done di Allen, sia perché l’autore del blog usa le mappe mentali e ne ha prodotto un bell’esempio con il software libero Freemind, sia per il fantastico elenco di libri da leggere… La cosa più sconvolgente è che questa piccola gemma del web proviene da una città della Polonia con meno di 80mila abitanti e Stiff ha soltanto 19 anni! Complimenti a Stiff per la sua passione, per le preziose informazioni che ha voluto condividere e per l’ottimo blog realizzato con Ruby on Rails! […]

jalanb, 14 April 2007, 12:08 am

Thanks for an excellent resource.

I’m in the game for > 20 years, but still found many useful links.

For the Unix command line I have always found the following link useful. Far better than mere man, as it is full of useful exmples which are easy to read and grasp:

http://tldp.org/LDP/abs/html/

مدونة خبير » أرشيف المدونة, 3 June 2007, 7:42 pm

[…] The road to become an alpha programmer […]

Raph, 19 October 2007, 10:23 pm

Very useful and interesting post. :)

Aaron, 14 December 2007, 3:11 pm

The link to thinking in erl seems to be broken, do you know where I can find this online book?

what is it about coding? ~ numerodix blog, 12 January 2008, 2:36 am

[…] not his job and no one is pushing him to it? Jarosław Rzeszótko is a Polish kid who tried to map out the entire realm of programming so that he can spend the next however many years learning… […]

Comment this post: