The Great Programmer

On a private discussion forum that I frequent, someone asked for advice I would give to a 16 year old that they were mentoring that had an interest in programming. A healthy debate ensued about what constitured a real programmer. I asserted the following: (Edited for brevity)

“On one hand, I think that you’re not a “real programmer” unless you can write C/C++ (or similar) and have a good sense of the assembler that will be output by the compiler.

“However, I have to admit that modern languages like C# and Java are really compelling and incredibly powerful… I just feel that anyone who learns these higher level languages without understanding what’s happening a little closer to the metal isn’t really a programmer.”

<p>I went on to recommend a couple of great books:</p><ul><li>Ivor Horton’s Beginning C++ (a fantastic author with a great style for explaining stuff to beginners.) </li><li>Hackers Delight by Warren (A lot of fun) </li><li>CODE by Petzold (one of my favorite books and authors of all times– great for someone who wants to get into programming.) </li><li>Once he gets a little deeper, if he wants to understand some of the underlying computer science type concepts, I can heartily recommend “The Art of Programming” which is a fantastic three-volume set by Knuth. </li></ul><p>As can be predicted, a flame war ensued… I won’t post the others’ comments because I feel that they belong to them, and posting them would violate the letter and spirit of the terms of this private forum. However, my final response was as follows:</p><p>“…The smartest developers know how to best leverage the right tool for the job. Often times, that’s a great integrated development environment (i.e. VisualStudio.NET) and often it’s a higher level language (like C# or Java, or even Ruby or ColdFusion!) However, when building a complex application, there are often times situations where the right tool for the job is C or even Assembler, and the great developers know how to move down into that level when appropriate.”</p><p>“Also, it is impossible to write great code at even the highest level of abstraction without knowing exactly what’s hapening in the layers underneath you. To use a more concrete example, I’m not saying great programmers don’t use C# and VisualStudio.NET– I’m saying that when they do, they understand the IL (Intermediate Language) code that will be generated by the compiler, and the understand what Assembly will be generated when that IL is eventually compiled and run on a processor.”</p><p>“Bottom line, it’s not about what tools you choose to use– it’s about the degree to which you understand what those tools do, and how they work. It’s about understanding the layers beneath you.”</p><p>“Real programmer is probably not the best description. But there is definitely a line that separates people with a firm foundation in computer science and people who know how to write PHP (and only PHP.) A great developer can pick up a new language in a weekend– he or she is not dependant on knowledge of a given platform.” Of course, we’ve gone way off course from the question the original poster was asking. :)”</p><p>“Read books. Lots of books. If it sparks your interest, you may decide you want to go to school and study it… but you don’t have to. Experement– try things out. Learn. When “hello world” works for the first time, stand back and be proud of your achievement, but don’t stop there… seek to understand WHY it works, and think critically about what is happening underneath the covers. It’s a tough process, but it’s rewarding… you may not see the light at the end of the tunnel when you first start out on the journey, but the way out is through. It can be incredibly rewarding.”</p><p>I stand behind this, and think it’s good advice for aspiring developers. </p>