Undergraduate programming
joelonsoftware.com
joelonsoftware.com
The article referenced does identify a major problem in an undergraduate programming curriculum. I like the idea of a BFA in programming (this idea has been around for a while), as well as a rigorous program that requires a much deeper understanding of programming languages. Java schools are a problem, no question about it.
But I'm a little sceptical about how much it will help in the grand scheme of things. I'm starting to figure that trying to create a truly talented programmer through a CS curriculum is like trying to create a truly talented novelist through a creative writing program. An intellectual environment is valuable... but how many students are there who would have learned the things listed in this report (functional programming, proper memory management in C, LISP, ada, proper use of threads, a deep understanding of what happens under the hood, as well as solid mathematics) if and only if the curriculum had been different? Or would these students, who will be few under any circumstances, find their way to these subjects anyway?
I don't know the answer to this question. I have a feeling that a better curriculum is worthwhile, and would improve the number of excellent graduates - in other words, while I think that some will find their way to this material on their own, I do agree that there are people who will not achieve the talent level they are capable of because of misguided course requirements. But I wouldn't expect this to turn lots of people into highly talented programmers any more than a writing program is going to produce a bunch of spectacular novels. It just ain't in a lot of people (including, I'm starting to suspect, myself).
On news.yc we tend to only talk about truly great programmers because that is what is required for startups, but I feel like there is still some role in the world for programmers who are merely competent and good at what they do, in the same way that there is still a need for proficient writers to produce technical manuals and ad copy.
While truly great programmers will help the business become profitable and successful sooner, they are by no means required.
I think there are plenty of non-vc funded startup businesses out there that do ok with so-so programmers. You just don't hear about them in the media because they are privately held.
That's not what we look for. The evidence so far (and there is now quite a lot of it) suggests that it's more important that the founders be very effective people than great programmers.
I suspect this is true even in research, but certainly in startups, someone who is reasonably smart and very driven will beat someone who is brilliant but ineffectual.
How hard people work also depends to a large extent on the systemic environment in which the work takes place. The Hawthorne studies showed this back in the 20s. The basic idea was these researchers went to to study the effect of lighting on worker productivity. They went to this factory with two rooms, and they dimmed the lights in one and walked around and asked people how they felt about the change. The worker's output was measured in pieces produced, so it was easy to measure productivity. What they found was that when the room was dimmer, worker productivity increased. This didn't seem right to them, so they made the lights even dimmer and productivity increased again. And then they made it so it was almost pitch black and the productivity was at an all time high. What they found was that worker productivity was increasing due to having the scientists walk around and take interest in the factory workers. (I would have linked to the Wikipedia article, but it isn't very good.)
There are a whole series of studies since then showing that the idea that some people are hard workers and some people are lazy is misleading at best, because someone's work ethic is more determined by the environment than any intrinsic quality (although different people need different environments).
This is the same basic idea behind the Milgram experiments, where he showed that the majority of people had the capability to carry out the deeds of the Nazi's under the right systemic environment, and that the evil deeds of the Germans weren't so much intrinsic to the people themselves rather than the larger social system.
Even today there is a lot of really really valuable research coming out in this area. Just as an example, this is a good article on using psychology to motivate contributions to online communities:
http://jcmc.indiana.edu/vol10/issue4/ling.html
Bob Kraut has a lot of really good papers in this area relating to the Internet that are around online.
I would keep PG's advice in mind when raising children.
I still remember visiting a music store and seeing this dude take a guitar off the wall and blow everyone away with his talent. The things he could do with his fingers were amazing. He was probably a better guitarist than Dylan, Lennon, and Springstein. He was certainly a better guitarist than Andre3000, who (I read somewhere) used G, C, and E minor as the basis for "Hey Ya" because they were the three chords he knew how to play on the guitar.
Unlike the musicians mentioned above, he was also available for private beginner lessons ;)
Waterloo has Software Engineering, but its not really aimed in the direction he is suggesting. Software engineering is basically Computer Science (math dept) and Computer Engineering (engineering dept) combined. Really, I do mean combined, because it approaches double the work of either program, or it did a few years ago.
What Waterloo has done to address the issues Joel presents is to create a new Bachelor of Computer Science (not to be confused with a BS, it is a BCS). This program is designed to reduce some of the math requirements in later years and allow individuals to have more upper year CS courses. They have not eliminated any of the math or theory out of the curriculum in the first few years.
Waterloo has not had a problem teaching Java to first year students, mainly because the focus is not put on the language. They don't really have any courses designed to just teach you a language, the goal is to teach programming concepts. Early on OOP, data structures, and so on are taught, then things move into algorithms.
http://www.dreamsongs.com/MFASoftware.html
He draws analogies between software composition and creative writing, performing plays, etc. Worth a look for those interested in the current thread.
The trouble is you might not know that you don't enjoy computer science until you've tried it. How would you advertise the course?
Perhaps Olin College could serve as a model for this approach [http://en.wikipedia.org/wiki/Franklin_W._Olin_College_of_Eng...]
However, if an abstraction breaks down, you'll need to have a deeper understanding of the innards, which a sound theory can only help the deeper down you go. I think this is even more applicable if you're using something based on math that isn't as mature of a technology (which means they're not a commodity and you'll probably have to fix it if it goes haywire), such as machine learning techniques or computer vision.
How often would that happen? Not very often. But when it does, and you have the background to learn, understand, and fix it, that'll make all the difference between you and the next guy.
I have troubles imagining that kind of person? In any case, I would be wary of a programmer who doesn't even know Quicksort.
I have zero time for any programmer who isn't interested in algorithms, structures and languages. But I've never met a good programmer who isn't.
His reply: What's recursion?
It's surprising really. Although I hate Java it does have a wide range of concepts within, including recursion surely. Perhaps they focus on displaying a GUI window rather than understanding binary search, etc.
* * *
I think drawing up an "Arts" programme in computer science is a good idea. But only as a MA lest you'll see more variations of the aforementioned example. Things are different in the UK though because university enrolment is linked to university funding.
If I did meet an artistic person who was interested in computer science I'd give her the following advice: learn the very basics of computer hardware (input, encoding into bits and logic, ouput), learn how to read programming documentation/books/tutorials (I'm not sure how I'd expand on this). Once you've understood for loops, switch statements, closures, recursion, etc take those in the same way you took the building blocks you used in your childhood games. Then build something using them.
Of course it may well be wise to take an undergraduate in computer science (of the old c/c++ kind -- ones that focus on core concepts basically) to practice the for loops, closures, etc if the artistic person isn't great at self-study.
Many great programmers began before university, and many didn't attend university at all (John Carmack immediately springs to mind).
Oh, you mean like ycombinator?