Jul 01
2008

So You Want To Be A Programmer?

Posted by Walter Bright in TheoryThe Business of ProgrammingProgramming LanguagesMiscellaneous MusingsengineeringeducationCompilers

WalterBright

 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.



Comments (24)Add Comment
You might use calculus.
written by Bill Baxter, July 01, 2008
Calculus - No, you won't use calculus in programming.

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.
...
written by Mark Nelson, July 01, 2008
For most of the classes you've mentioned here, I think it's safe to add a caveat: if you don't have fun taking these courses in college, there's a very good chance you aren't going to like programming any better. If you enjoyed the challenge, and even the grind, of making it through these courses, you are probably going to like working as a programmer just as much.

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

scientific coding versus the rest
written by nick carrasco, July 01, 2008
there was a time that almost all coding was science/math related, hence the reason computer science is attached to the math department at most universities. this said, I'd love to see the statistics on how many programmers actually still work in the science related fields. I know anytime I mention that I occasionally program in Fortran I typically get either a blank stare either because they are too young or are just so removed from the roots of programming. I write code for meteorologist, and they still prefer Fortran, but in terms of other knowledge needed, I use trig and physics more than anything, calculus just kind of helps and works with both. The one topic/subject I think was mistakenly left off is Statistics.

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.
statistics
written by Walter Bright, July 01, 2008
I left off statistics because I did not take a statistics course in college, and so do not have a perspective on its value. But I do regret not taking it. I also regret not taking an analog electronics course.
Music!
written by Peter Roth, July 01, 2008
Learn to play an instrument - any instrument -
Music?
written by Walter Bright, July 01, 2008
I've heard a lot of good things about learning an instrument. I played the trumpet for 5 years. I was a miserable failure at it. As far as I can tell, the only thing I got out of it was an appreciation for someone who can really play the trumpet well, because I knew how hard it was.
Philosophy
written by Steve Horth, July 02, 2008
Alright, I'm sure I'll get grief, but knowing what you believe (and being able to explain why) has helped me a lot, especially in writing specs from users who have a hard time explaining business processes. I can see "We've always done it that way" for miles off, and although it still frustrates me when someone cannot explain their rationale for something, I can walk them through the thought processes for defining goals and defining a success project.

It also is a HUGE help when arguing...
smilies/grin.gif
...
written by nick carrasco, July 02, 2008
I think the bottom line is that the more well rounded you are, the better programmer you'll probably end up being. Philosophy is a good example of a course that helps on both sides of programming, personal thought process to help solve an issue, and working with others and being able to explain yourself. Thinking back on my 'education' (in quotes since it never ends) I even took an intro to education course in undergrad thinking it might help me find new ways of looking at a task.
...
written by Mark Nelson, July 02, 2008
@nick:

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
Humanities
written by Jack Woehr, July 02, 2008
Study the humanities. The modalities of the cubicle farm are very much the same modalities humanity has experienced for millenia. Life is less confusing as a programmer if you have a good humanities background.
Laws and Poetry
written by Rosfran Borges, July 02, 2008
Every programmer should understand something about Laws: not only the informatics laws, but everything related with laws jurisprudence, which are a kind of Logic applied to the human beings. If you can find some fun in solving first order logic problems, certainly you will have a great time reading the constitutional laws of your country. And understand what happened with a famous programmer that couldn't understand it at that time: http://www.philzimmermann.com/...opped.html
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!
Disappointing article but the comments are on target
written by Terry Owen, July 09, 2008
Programming can mean anything from web development or data center operations to rocket science.

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
>articles like this underscore just a few of the
>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.
Re: Disappointing article but the comments are on target
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?
It's , Like, Logical, Eh?
written by Dave Amorde, July 10, 2008
Three keys skills for ANY job:
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
@Dave:

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
@Dave:
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
Obviously people have to learn higher level languages. The question is whether that education must take place at the University or the workplace. I believe an education in C is redundant to assembler in the sense that the skills necessary to properly with todays macro assemblers on todays x86 processors is very much akin to procedural C. If you are able to acquire the skill and enjoy the process, C is a piece of cake. Frankly, todays MASM tools are much closer to traditional C compilers than older ASM tools.

No valium, but I'm a big Tangueray fan. smilies/smiley.gif
...
written by Vincent Tume, July 11, 2008
As someone who started in elec eng and saw the light before it was too late, I spent five years doing a four year degree so had the opportunity to take an assortment of electives outside of computing science. Did I learn how to think? I'm not sure, I certainly learned how to write exams smilies/kiss.gif
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
- Mark Nelson
"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.
Courses I've found beneficial
written by Glen Thompson, July 22, 2008
Public Speaking - It helps in the interview process and in presenting your ideas in meetings

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
A Philosophy I took, "Introduction to Logic", was one of the better courses I took. I would recommend it as a freshman course to help with critical thinking.
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
Good point which mentions that college learning should be about the thought process rather than learning about particular programming languages. Languages are just tools to be used to solve problems. While it is important to know how to use the tools, it is even more important to learn where and when to use them.

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

Write comment
You must be logged in to a comment. Please register if you do not have an account yet.

busy

Get your FREE Subscription to Dr. Dobb’s Digest today!

Dobbs Code Talk Quick Poll

This time next year, your most important operating system (host and/or target) will be:

Look Who's Code Talking


Niklas Hemdal
City: Leesport

Robert Santuci
City: Orlando

Juan Pereira
City: São Paulo

Trevor Gipson
City: Sacramento

Stephen Constable
City: Crawley

Chris Underwood
City: Houston

Dobbs Code Talk Tags

.NET abstraction Ada Adobe Agile Ajax algorithm Algorithmic complexity ALM Analogical reasoning Android Anecdotes Apple Application Development AppStore Architecture and Design ARM Artificial Intelligence Artificial Life Assembler Programming Audio files AVX AWK Banking Bazaar Best Practices Blender Books Brain computer interfacing Build C C Programming C Sharp Cartoon Category theory Cellular automata Clojure Cloud Computing Cobol Cocoa Coder Of The Month Cognition as compression Collaboration Common Process/Frameworks Compilers Computational humour Computational narrative Computational politics Computer Science Computers in art computing pioneers concurrency Conferences Consciousness research Contest Contest140 contests CPlusPlus crime CSharp D Programming Data Centers Databases Debugging Delphi Deployment design Design Patterns Digital Signal Processing Distributed Django Documentation DSL dynamic language Eclipse EDA education Emacs Embedded Systems Encryption engineering Erlang Etymology Excel exception handling Facebook Financial computing Five Questions Flash Flash Lite Flex Forth Fortran Fraud FreeBSD Fun Functional Programming gadgets Games Gender Git gnuplot Go Google Graphics GUI hardware Heron High School High-Performance Computing History Holographic reduced representations HTML5 Humanity Humour Hungarian Notation Identity Inkscape Innovation Intel Interview iPhone J2EE Java JavaFX JavaOne JavaScript language engineering Legal lex LINQ Linux Lisp Literate Programming Logic Programming m4 Mainframes Make Mathematica Mercurial Mesh messaging Metaprogramming Microsoft MID Miscellaneous Musings ML Mobile Software Mobility modeling modular programming multicore Music MVC myblog Natural Language Processing Networking Neural networks newspeak Nokia numerical computing Object Rexx ObjectiveC Office Office 2007 Online spreadsheets OOP Open Source Openaccess publishing OpenBSD OpenSolaris Operating Systems Optimization Oracle Pair Programming Parallelism Concurrency Parsing Pascal Patents Patterns Performance Perl PHP Podcast Pop11 Poplog Privacy Processing Productivity Programming Language Implementation Programming Language One Programming language semantics Programming Languages Programming Style Project Management Prolog Psychology Public understanding of science puzzle Python QA Quantum Computing Quotes Rails Realtime recls Requirements Research practice REST Review RIA rich internet applications Robotics Ruby SaaS Software as a service Scala Schadenfreude Science fiction Screencast Scripting SD Best Practices Search Security Semantic Web Silverlight Snobol SOA social Social Networks Society for the Study of Artificial Intelligence a Software Development Methodology and Management Songs and poems Spending Priorities Spreadsheets SQL Startups Statistics Storage String pattern matching Survey Teaching Testing The Business of Programming The Dobbs Challenge The Future Theory Topology Transhumanism Travel on the Job Twitter Types Unix Upgrade Usability Use Cases USENET User Experience User Interface Design Version Control video virtual machines Virtualization Visual Studio Visual Studio Sponsored Post WCF Web Development Windows Windows 7 Windows Live Wireless WOA WPF X Window System yacc

Subscribe to Dr. Dobbs Newsletter

Email:
Dr. Dobb's Update
Delivered twice a week, Dr. Dobb's Update provides unbiased and objective news, commentary and technical features spanning the entire software development marketplace.

Latest Comments

Jonathan's Last Day at Sun
For the 8 years I worked there, it was fantastic. I worked there under McNealy and I have undying admiration for the guy. I only knew Jonathan periphe...
Implementing Thread Local Storage on OS ...
Back in the day, I did a fair amount of work with PThreads. Wonderful design. Some quirks, but basically really, really nice. Although I wrote a lot ...
More Technonecrophilia with Snobol One-L...
Yeah, It's probably identical except for the (embedded) copy number, I would think. Once it became freely distributable, the copy I've been distribut...
More Technonecrophilia with Snobol One-L...
There's a spitbol-3.7-win.exe at http://code.google.com/p/spitbol/downloads/list . I found it via Dave Shield's blog page http://daveshields.wordpress...
Jonathan's Last Day at Sun
Sadness.

The Latest From Our Member Blogs

How To Select Trainees
Written by Joel Wiesen   
01/27/10
Hiring the right trainee can be harder than hiring a trained programmer.  One approach is described at my website: http://www.aprtestingservices.com/business/lpat/
 
Technical Job Interviews
Written by Keith Kerlan   
01/20/10
What is the best way to interview for software developer positions?  I've been on both sides of the job interviewing table, but have been on the interviewee side of some not too  great inter
 
Timers/timeouts in multi-threaded event-loops
Written by Christof Meerwald   
01/03/10
The traditional way to integrate timeout handling (or timers) in (single-threaded) event loops was to just pass the appropriate timeout value to the select/poll/epoll syscall. While this works fine
 
C vs C++
Written by Issam Lahlali   
12/04/09
I think that the debate "C vs C++" will end when the two langages died, and each one have its advantages and inconvenients, the choice of one instead of another depend on the application c
 
Great Jobs at CISCO
Written by Brent Rogers   
11/30/09
Hello! I am a recruiter at CISCO. We have a number of great jobopportunities at CISCO right now. Please take a look at the job links listedbelow and please send me an updated resume if you are interes
 
OK Labs, ST-Ericsson, and the Mobile/Wireless Ecosystem
Written by Steve Subar   
11/17/09
Two weeks ago, OK Labs and ST-Ericsson announced the selection of OK Labs as ST-Ericsson's mobile virtualization partner. To earn this coveted position, OK Labs prevailed in a rigorous evaluation
 
C++ Ninjas Needed in Santa Clara, California
Written by Brent Rogers   
09/30/09
Hello! I am a recruiter at CISCO. Our PostPath teamin Santa Clara is building a new Email SaaS business at CISCO. We are looking forsenior developers with Zimbra expertise to help us accomplish this t
 
Fighting Fragmentation with Mobile Virtualization
Written by Steve Subar   
09/21/09
Last week Motorola and T-Mobile announced the launch of a new and innovative Android-based smartphone, the Cliq. This attractive, feature-rich slider handset happens to build on a chipset and firmware
 
Insights into Router Design: Unit Testing of Networking Protocols
Written by Rajesh Kumar Venkateswaran   
09/07/09
  Unit testing is a software validation methodology through which a programmer tests individual modules or units of source code. If the programmer has been responsible for developing a networ
 
Insights into Router Design: Implementation of Networking Protocols
Written by Rajesh Kumar Venkateswaran   
09/06/09
  Modern data networking consists of a large number of networking protocols, each of which has its own domain of applicability. Some run on end stations (also called hosts), some on enterp
 
Insights and Innovations in Networking
Written by Rajesh Kumar Venkateswaran   
09/05/09
Networking devices such as routers and switches have evolved quite a bit over the past years, both in the service provider network and in the enterprise. It is a challenge to build these devices, bo
 
reddit threads community
Written by Christof Meerwald   
08/30/09
I have just started a threads community over at reddit to cover topics such as multithreading, concurrency and parallel programming. Feel free to join if you are interested. -- cmeerw.org 
 

The Latest From Dr. Dobbs

DDJ