This essay was prompted by a post on comp.lang.lisp by Joe Marshall.
Some of the people in this group have, or are pursuing, advanced degrees in computer science. Some have bachelor's degrees. Some have degrees in related fields. Some have degrees in completely unrelated fields. Some have dropped out before getting a degree. Some are autodidacts.
Is there a correlation between studying computer science and knowing about computers? Do people gain anything by pursuing an advanced degree in computer science, or would they be as well served by saving the money, buying a PC, and teaching themselves? There is a romantic ideal of the untutored hacker that program circles around MIT grad students. Is that absurd or commonplace?
This reminds me of another debate which takes place in martial arts - about martial arts students and street fighters. Geoff Thompson touched on this in his excellent and extremely funny book 'Watch My Back'. Geoff is a trained martial artist, a karateka, a grappler and the victor in over 200 street fights as a bouncer. In his book he compares two styles of fighter - the school-trained martial artist and the untutored but hardened street fighter.
The street fighter fights in a ring with no rules and no boundaries. The school-trained martial artist trains for a circumscribed contest with known parameters. What Geoff says is roughly this: the street fighter, if transplanted to the tournament ring, will often fare poorly. Contrariwise the trained martial artist in no-holds fighting will generally be taken out by a good street fighter unless his level of skill is very high and he has trained for combat situations. However, the combination of the two, the street fighter who has also formally trained in the dojo, will surpass either.
This is also true for programmers. There are a number of people who have a natural gift for programming and just pick it up; in the same way that some people have a gift for fighting and pick that up. As programmers they will surpass the average level ability CS student in a straight programming contest. These naturals may not have passed through a CS course or sat a single CS lecture, but they can walk the walk and do the job. These people we can call 'street programmers' - hackers without any formal qualifications, who have picked up their knowledge on the fly and through self-teaching, but who can blow most competitors away when it comes to code productivity.
I started my career as a street programmer. In 1984 my father brought round a BBC model B microcomputer. Running with 32K of main memory, I learned to program in BBC Basic. Armed with this slender knowledge, I talked my way into a small software company and was given 'in-house training'. My in-house training consisted of a DBase II manual and a coffee machine. My immediate boss was in charge of a pile of flakey in-house legacy DBase II systems which they wanted to get rid of but could not. My job, for a princely £5000 per year was to keep this mouldering pile of legacy code upright.
What I learnt in this job were street programmer's skills. Being able to digest a manual without any lecture course to help me. Being able to dive into a pile of manky code and come up smelling sweet. Being able to locate and fix an errant bug before the client blew a fuse. Also being able to take a drink at lunchtime and still be useful in the afternoon (a challenge this one). It was high-pressure and low pay and I quit after a few months, just before in fact, I would have got a raise. But it was a useful in teaching me what is required in a commercial software house. After that I migrated towards computer applications at university and there it was a very different story.
In academia you do not get promoted for being a good hacker but for writing papers and getting grants. There are even professors who actually look down on implementors as blue-collar workers who exist to implement the grand designs of people like themselves. Typically coding is thought of as the preserve of post-doctoral RAs. Hence the metric by which street hackers assess each other does not function here. During my time at the LFCS, Rod Burstall actually felt impelled to give a lecture to a bunch of recycled mathematicians doing CS on why implementors were important . They were not interested - as one put it "Hacking code is not why we're here."
Coming into academic computing from street programming, I was unimpressed by this attitude. It took me several years and several dead end turns before I came to accept the idea that actually getting to grips with the theoretical end of CS was well worthwhile. Like many streetwise programmers I had become dependent on and over-confident of, my ability to solve problems by simply improvising Lisp code on the computer. I was a rough and tumble guy who would mix it with the biggest problem sans textbook. No problem was too big or tough that my street programming skills couldn't take it out.
Except that wasn't true. As my ambitions grew, I grew to recognise that metal-bashing programming was not going to take out all of my problems and that by importing a little of the conventional wisdom from the learning of the greats, I could improve my problem-solving skills. After all, who wants to reinvent quicksort? So I could be seen at the terminal with a CS book (generally AI) paging the text and pouring out reams of Lisp. Theory and practice were melded together. I was becoming not a mere brawler, but that more potent combination of theorist and bareknuckle code monkey. I was transforming, day by day, into the programming equivalent of what Geoff Thompson has described as the most potent fighter - the theory-hardened street fighter.
In following this path I was lucky. I was lucky to have the time to do it. I was lucky not to be weighed down with the nonsense of a conventional CS degree and I was lucky because I was using Lisp. And I was following a path that was well trodden because the best people in CS have followed exactly this path. These are the people who ride above the divide; who have a grasp of theory and make it work on the computer.
If you check out the history of computing, a lot of the old aces in artificial intelligence (like Newell and Simon of GPS fame), were accomplished street programmers. There's a reason for that. The reason is that AI programs are difficult to predict and often the only way to tell if your program works is to run it and see. Hence you need to have both theory (a clear idea of what you are doing) and implementation skills if you want to do AI. The old timers of CS were physicists, mathematicians and what-have-you (Simon was a political scientist) who were accomplished street programmers. Joe wonders whether such people are romantic ideals. They were not romantic ideals, they were real living, breathing people; and many of them are still around.
Officially these old timers are the kind of persons professors are producing from CS courses; people well grounded in theory and practice. However it does not work like that. The martial arts analogy comes back to mind again.
If you train in martial arts, you'll find there are some schools of martial arts which are essentially empty. These are schools where the students train in katas which have to be memorised with little or no understanding of application. These schools avoid subjecting their students to any combat situations and emphasise artifical grading systems with little relationship to combat effectiveness. The graduates of these schools are not a match for the experienced street fighter.
Unfortunately a lot of CS departments are like these empty dojos. In CS a lot of student time can be taken up in courses which require little or no programming expertise. In the UK it is quite possible to walk off with a CS degree and be quite hopeless at programming. Why is this? For several reasons.
First, a pick-'n-mix approach to education which allows weak programmers to avoid programming-intensive courses.
Second, CS courses at university are rarely bleeding edge. Staying ahead of the game, knowing all the latest Java tools, being up at 1 a.m. on forums swapping information with other street programmers, is not what professors want to do after they go home at 6 p.m. With the weight of admin, teaching, reading and scribbling papers to be done there is simply not the time for the street programmer's lifestyle. So students learn what the professor feels comfortable with or get palmed off on an instructor. And people who do know the bleeding edge can get better money (and often better conditions) in industry. You can graduate from these courses just by jumping through the hoops. Unfortunately a lot of very bright students become disenchanted with this type of course.
Third, is the conservatism of CS courses that comes from always needing a consensus to originate anything. A good example of this came up in my old department in the early '90s. Back then the language of choice for teaching students was Pascal. Nearly all the staff knew Pascal had to go - it was out of date. I attended a meeting in which computer scientists chased the question of how to replace Pascal. Several hours later Pascal was still on the curriculum because they could not get a consensus. Seven years later I attended a meeting on the same subject with the same lack of agreement and the same arguments. It took eight years to move from Pascal to C++. Trying to do anything innovative in teaching at University or instituting change is a gruelling business. If your course is foundational then your teaching is tied to the courses which list your course as a requirement . Try to do anything radical, even a change of approach, and you can be in trouble with the Old Guard. I know; I learned the hard way.
This resistance to change was always part of the university character (and human nature!) because universities have been, for the greater part of their history, repositories of the Conventional Wisdom. The material that got taught there was carefully filtered through a long laborious process of peer review, starting with workshops, conferences, and finally into book form. It took about 6 years for Prolog to move from research paper level to the point were there was a useful introductory book (Clocksin and Mellish's 1981 text Programming in Prolog). Universities are not places for learning the latest thing, but places for learning what has already passed into received opinion.The advantage of this traditional model is that it filters out the bogus and the weak. The disadvantage is that much that is new, useful and exciting is not transmitted and for a fast-moving discipline like computing, the model seriously sucks.
Traditionally universities had a mechanism for offsetting the ossifying effects of traditionalism. This powerful counter-potion was called academic freedom and it gave the professor the right to lecture on what interested him. So wonderful and theatrical lecturers like Feynmann and Wittgenstein gave sparkling lectures on physics and philosophy. Wittgenstein's Cambridge lectures became historically famous and created a whole school of brilliant post-war philosophers.
Sadly universities have lost this aspect at the very time when they most have need of it. Wittgenstein today would be simply out of a job. Courses are centrally planned and bureaucratically delivered - often from canned standard texts. Teaching loads at the junior end are heavy and the only way to deliver five or six courses a year (the standard in many American colleges) is to reach for the shelf and open a canned course with canned slides and a set book. Professors do not have the time for their students.
And all this is a damned shame, because, fundamentally, learning and discovery is a social process. To rely purely on a language manual and an idea is to ignore all the painful learning processes that previous computer scientists went through in order to arrive at their state of understanding. It invites the repetition of all the past mistakes and the reinvention of old ideas. Unfortunately the state of university CS departments is such that students would be better off in my situation - having a computer and a good book and the time to do their own thing.
So to answer the post: yes, the street programmer is generally better than the CS graduate - at programming because CS courses are often so woeful. And the professor will beat the street programmer hands-down in the black arts of churning out papers. But in the CS departments which are not empty dojos, the graduates who have absorbed the wisdom of their intellectual fathers, and learnt to apply it under pressure will surpass the street programmer.