|
Jul 01
2008
|
So You Want To Be A Programmer?Posted by Walter Bright in Theory, The Business of Programming, Programming Languages, Miscellaneous Musings, engineering, education, Compilers |
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.
Calculus - 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.
Physics - 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.
FORTRAN - 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.
Chemistry - 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.
Economics - 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.

written by Mark Nelson, July 01, 2008
It's always kind of sad to me to run into people in my profession who don't like their work. If you don't like it, you should be doing something else that you'll find more rewarding. Your college years should be helping you figure out just what it is that helps you get up and go to work in the morning for the next 50-odd years.
- mark
written by nick carrasco, July 01, 2008
one more comment:
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.
Now here is a statement I can totally agree with and tell people all the time when asked what language to learn first.
written by Steve Horth, July 02, 2008
It also is a HUGE help when arguing...
written by nick carrasco, July 02, 2008
written by Mark Nelson, July 02, 2008
The problem with the well-rounded theory is that you always end up with people like Jack Ganssle who think that the CS curriculum needs to be strictly drawn from a vocational menu:
http://www.embedded.com/columns/technicalinsights/207500788
Try and find anything in his article that praises, say, Latin or Statistics. He's annoyed that CS students are taking classes on OO methods and algorithms that don't require programming!
- mark
written by Jack Woehr, July 02, 2008
written by Rosfran Borges, July 02, 2008
And how about Literature? I'm 100 percent sure that Poetry is a kind of collection of Programming Languages... The work of writing poetry is something related with the work of making programs: it is to mix a little of creativity with a lot of logic reasoning. Read William Blake, Baudelaire, Shakespeare, Cruz & Sousa, Fernando Pessoa - these were some of bigger programmmers I haven't see!
written by Terry Owen, July 09, 2008
It's true that for most engineers calculus probably is essential but computer languages are just that - languages. Languages with grammar and syntax like any other. If I had known that earlier in life I might have actually wanted to pursue a computer science degree, instead of buying in to the math and science geek propaganda.
You don't need to be able to create an OS or write a compiler to compile a kernel, flash an embedded board, write technical documentation, script and automate software tools or just create useful applications that solve real world problems. In fact, programmers with that kind of math and physics background would be bored silly doing those kinds of tasks. Scaring away literate, competent people who might actually enjoy it benefits no one.
By the way, articles like this underscore just a few of the many reasons why younger women are leaving or not even considering tech fields at all. I'm sure the bias isn't intentional but it adds up, especially when girls are often not encouraged to get that advanced math background in the first place.
So I would say go ahead and take Philosophy, Advanced English Lit, Latin, Russian, French or whatever. :-)
But also maybe consider taking several plain old C classes. If you can have fun making your computer do tricks with C, you should be fine with whatever else comes along. If debugging bores instead of challenges you or the byzantine syntax makes you irritable and hostile, there's always time to switch to pre-Law.
written by Mark Nelson, July 09, 2008
>many reasons why younger women are leaving or not
>even considering tech fields at all.
And that's because? You didn't detail it, but it almost sounds like you're using the Barbie pull-quote.
written by Dave Amorde, July 10, 2008
1) English & Grammar. "Like fershur dude!"
2) Logic & Critical Thinking. "How did you POSSIBLY come to that conclusion?"
3) Job Interviewing. "Do you mind if I smoke?"
I'm tired of trying to deal with people who talk like they're still in High School.
I'm tired of "engineers" who code up a storm, but couldn't debug or troubleshoot to save their lives.
I'm tired of "documentation" written with the english skills of a fourth-grader.
I'm tired of interviewing people who smell, chew gum, can't make eye contact, studder, fidget, etc.
I'm tired of interviewing people who dress like bums, hookers, or bank tellers from 1950.
If I have to deal with one more college grad who asks "what's an interrupt?" I'm going to blow my brains out.
Assembler? Yes. C? If you can handle Assembler, C is redundant. A generic overview of Procedural, Object-Oriented, and Functional languages with practical applications for each would be a nice bonus.
Calculus? Maybe. Better yet: Boolean Algebra and Statistics.
Philosophy? What the hell does God or the meaning of life have to do with problem solving; give you a shoulder to cry on?
Accounting? Maybe, but if you really want to market yourself and engage the "suits", take a good Public Speaking course.
written by Mark Nelson, July 10, 2008
I don't know about the 'C is redundant' part. Knowing how to program in the appropriate assembly language is pretty much always a plus, but most people seem to agree that as the project size scales up, it has to give way to C first, and then maybe C++. Definitely depends on the job though.
As for the rest of it: maybe a valium would help?
- Mark
written by nick carrasco, July 10, 2008
Philosophy doesn't necessarily have to deal with 'God' or the meaning of life... Philosophy is just another type of reasoning, just a little more 'flowery' than good old fashion logic and critical thinking.
written by Dave Amorde, July 10, 2008
No valium, but I'm a big Tangueray fan.
written by Vincent Tume, July 11, 2008
Now when I'm asked "what 'electives' to my program should I be taking?", I always recommend some sort of effective writing course. I do so for the simple reasons that, if you can't communicate your ideas in an organized, structured fashion, you're lost! I've lost count of how many formal documents I've sent back because I couldn't make sense of what a programmer was trying to tell me. Their inability to clearly express their ideas here is reflected in the code they produce; difficult to understand, poorly structured and ultimately unmaintainable.
written by Terry Owen, July 17, 2008
"And that's because? You didn't detail it, but it almost sounds like you're using the Barbie pull-quote."
You're right, I didn't. Women in science and technology (or lack of, more precisely) is a complex subject and it comes up regularly. The NY Times had a pretty good piece recently on it (although Title IX for science seems like a really bad idea as a solution).
http://www.nytimes.com/2008/07...wanted=all
What I might have expressed more clearly is that the article had some good points but it felt almost condescending to those who don't feel the need to have an old school computer science background.
On one hand, we have employers and academics worried about attracting a more diversified workforce in the tech fields but then articles like these just seem to reinforce old stereotypes. It's those stereotypes that can discourage someone without a background in advanced math from looking at computer science. And for whatever reason, young women will be more likely to not have that kind of background.
Would it really be so difficult (when asked about classes) to at least point out that his answers have a strong engineering bias? And that students should give some serious thought about what fields interest them and what kind of career they envision? (NASA? Future CEO of Microsoft?) Because it isn't that taking calculus is a bad thing, implying that it's a necessity for professionally programming is what can create that psychological barrier.
JMO, YMMV and all the rest.
written by Terry Owen, July 17, 2008
written by Walter Bright, July 10, 2008
For someone who's going to invest 4 years of their life in training, why not make that training pay off? If one wants to be a professional athlete, one applies the training regimen that is known to work, not whatever feels good. If all one aspires to is flashing eeproms and following someone else's build instructions or documenting others' work, then why go to college?
As a dirt poor, blue collar kid back in the day I didn't have a chance to go to college. And even if I had, my choices of careers would have been limited to teaching or nursing. I went back to school (a community college) after my kids were old enough where I learned how to program for the IBM midrange AS400. (I have more fun now flashing eeproms than when I worked as an RPG programmer and carried a beeper.)
I learned most of what I know about professional process (requirements, verification, quality) from working with engineers or reading magazines like Dr. Dobbs Journal. I'm still paying off those loans and still learning ten years later.
If I had it all to do over again, I think I would have liked to become an electrical engineer. And yes, I do enjoy managing builds and working with embedded hardware and software (the documentation, not so much) but I'm baffled at why you would sneer at that. My original point was that if I had known that there so much variety and opportunity in the tech sector, I would have considered going back to school earlier and not settled for an associates degree (in spite of my life-long lack of interest in math).
While my lack of a four year degree currently limits my opportunity to advance, the work I do is often exactly the same as some engineering positions. Perhaps what I do is not professional in your opinion but I enjoy it.
written by Glen Thompson, July 22, 2008
Business Law - Always nice to know what the law is.
Statistics - A good understanding here prevents others from feeding you bad numbers.
Applied Algebra - It covered Boolean algebra, coding theory, and finite state machines among other topics. It was a special class aimed at CS and EE majors. Most useful math class I had in college.
written by Jim Young, July 22, 2008
I worked for a company that built jet engine test cells and I agree "Jet engines are especially cool". Sitting at a control console as an engine is lit is very cool. Plus I was able to travel all over the world.
Linear Algebra helped a lot when I work with machine vision. I would think it would also help with 3-D graphics.
written by Kevin Rodrigues, January 02, 2010
While having a background in calculus and physics might help in programming, I don't consider it necessary. What is necessary is a logical view of solving problems.
http://kevinrodrigues.com










You will if you want to do 3D graphics or games! I suppose you can get by without it, but you'll be at a disadvantage.