written by Walter Bright
June 30, 2008
I often get personally asked, and see the question come up online a lot, what courses a person should take in college if they want to become a professional programmer. I took a fairly broad range of classes in college (Caltech), and have been programming for 30 years now, so I have some perspective on what has worked for me and what hasn't. I've ordered them from most important to least.
- No, you won't use calculus in programming. But it turns out that the training of your mind that happens when learning calculus is very beneficial to programming. This training seems to happen in math courses and doesn't happen in programming courses. If you find yourself selecting college courses based on which ones don't require calculus, you should seriously consider changing professions, because you won't make it as a programmer. Take at least 3 years of calculus.
- For unknown reasons, the best programmers tend to be physicists by training. The way physics is taught seems to teach the brain how to go about solving problems in an organized way. Besides, understanding newtonian and quantum mechanics is just freaking cool. You'll be able to proudly wear your Maxwell's Equations t-shirt. Fair warning: once you understand physics, Star Trek, Star Wars, and other hollywood sci-fi craptastic films won't seem so cool anymore.
- Compiler Construction
- You'll be using a compiler probably more than any other tool, and understanding them will help a lot in getting the most out of them and bending them to your will. Furthermore, the skills learned in writing a compiler pretty much cover the gamut of computer science concepts.
- Assembler Programming
- You'll never learn how a computer really works by learning high level languages. I know too many programmers who have a fear of assembler. They will go to great lengths to avoid even glancing at the assembler output of their compiler, as if it would strike them blind. But they'll never be in the top tier of programmers. You can learn an awful lot about the compiler you're using, and how to get the most out of it by looking at the asm output. You'll also find that sometimes that's the only way to figure out what is going wrong.
- Business Accounting
- Eventually in your career, you'll want to move into management or spin off and start your own company. At that point, knowing the fundamentals and language of business accounting is indispensible. I know it's dull, dull, dull, and lion taming is so much more fun and you've even got a hat for it, but without knowledge of accounting you'll be crippled talking to investors, your bank, or the tax man.
- Digital Electronics
- Understanding how the hardware actually functions will help you approach a computer as a machine that can be mastered rather than a magic black box. You're going to be working with it a lot, might as well understand it.
- Jet Engine Analysis
- I'm fascinated by engines of all types. Jet engines are especially cool. I'll never forget going to the test bunker while the engineers lit off an F-100 engine. If I could figure out what this has to do with programming, I'd tell you. So sue me.
- It was a waste of time, because FORTRAN shortly thereafter went out of fashion. Generally, any programming course that focusses on learning a particular language is a waste of time. Instead, courses that teach a thought process that is applicable in general to programming is far more valuable. Learning particular languages is just a detail you can do later.
- I never properly understood chemistry. This deficit doesn't seem to have mattered in my career. Chemistry seemed to be more oriented towards memorization, and trial and error. I don't think that applies much to programming.
- Ok, this has nothing to do with programming. But economics is one of those dismal fields where everyone thinks they are an expert, from 16 years old on. Few would dream of pontificating about physics or calculus without learning something about it first, but nobody seems to have any qualms about doing it for economics. I see this all the time on reddit, digg, etc. So please, please, take a course in economics and at least understand the basic concepts!
- Foreign Language
- I'm going to get flamed for this, but I see little point to it for a programming career. I took German, and aside from the personal pleasure in learning it, it's been professionally useless to me. It's a global economy, but knowing German won't help you in dealing with the Chinese or the French, and vice versa. English is the global language of business, and if you know that, you'll be fine.
Interestingly, there's not a lot of actual programming courses in this list. If you're training to be a programmer, shouldn't programming courses be the bulk of them? Not necessarily. College should not be viewed as learning particular knowledge, but as learning how to think. Math will teach you how to think abstractly and logically, and physics will teach you how to approach solving problems. Once that is working in your head, you'll find you can pick up programming rather easily, and those thought processes will serve you well for anything you want to tackle, for the rest of your life.