Programmer != Computer Scientist
Joel on Software writes in The Perils of JavaSchools
| Quote: |
|
CS is proofs (recursion), algorithms (recursion), languages (lambda calculus), operating systems (pointers), compilers (lambda calculus) — and so the bottom line is that a JavaSchool that won’t teach C and won’t teach Scheme is not really teaching computer science, either. As useless as the concept of function currying may be to the real world, it’s obviously a prereq for CS grad school. I can’t understand why the professors on the curriculum committees at CS schools have allowed their programs to be dumbed down to the point where not only can’t they produce working programmers, they can’t even produce CS grad students who might get PhDs and compete for their jobs. |
There is a basic assumption Joel makes here: a Computer Science degree is necessary or sufficient to be a real world programmer [I will leave aside his point about training to be a CS grad student]. My personal experience in the industry, working with numerous really good programmers, tells me otherwise. I will put general analytical and quantitative skills ahead of recursion, lambda calculus or pointers [ok, pointers may be a stretch]. In fact, as technologies like operating systems and programming languages commoditize rapidly [how many OS designers does the world need? And even Paul Graham says that programming languages are massively over-supplied, to the point that even when they are given away, most of them won’t ever achieve critical mass!], the challenges of real-world software is how to assemble cool products out of commodity ingredients. Take Joel’s company’s latest launch, CoPilot: I bet it primarily required clever integration and packaging of pre-existing ingredients and nice user experience design, and not much of recursion/lambda/pointers.
My only “Computer Science exposure” if it can even be called that was Introduction to Computing course in my first year of college [1985], and the language taught was Fortran [no recursion, no lambda, no pointers!]. I never wrote another program for nearly 10 years after that, when I entered my job, which required programming. I learnt C++ [some pointers, but still no recursion or lambda]. Later on, I found myself in a project that needed C, so I had to be good with pointers. Then I learnt Java, a smattering of Lisp mainly to understand what functional style is all about, and lately paying attention to Ruby.
A lot of programmers I know would fit the description of never-studied-Computer-Science-but-picked-up-skills-on-the-job. They do just fine [take a look at our products!]. My strong belief is that if you have strong analytical/quantitative skills, and have a bent for programming, and a strong desire to learn whatever is needed, that is sufficient to be a real world programmer. Formal Computer Science education is helpful, but not absolutely necessary. Neither is a Computer Science education sufficient, especially if a practically-minded programmer is fed reams of boring theory that he/she could not appreciate at that time, and so just went through the motions to graduate. For example, I would have found the theory of programming languages absolutely boring in college, though I appreciate it better with experience.
Joel makes the comment
| Quote: |
|
It’s bad enough that JavaSchools fail to weed out the kids who are never going to be great programmers, which the schools could justifiably say is not their problem. |
Surely among those weeded out because they just couldn’t stand Lambda [I am fairly mathematically oriented, and I can barely tolerate Lambda Calculus] may have been some great would-be programmers. What about people who code numerical algorithms for NASA? Do they need lambda calculus? I would argue they need excellent knowledge of convergence properties of various numerical algorithms. In fact, I know people who code those in Fortran to this day. How about people writing statistical data mining code? Should such people be banished from programming because they don’t happen to do well in lambda calculus in college?
A broader point: there seems to be two kinds of applied mathematics. The mathematics of physical sciences and engineering, and the mathematics of Computer Science. I put more value in the former [my personal bias], stuff like Fourier transforms, numerical methods, statistics, and so on, and less value on the latter even for a programming job. Even the first kind is increasingly programming driven, and I would say that in today’s software world, those skills are quite valuable.