

Undergraduate programming - lackbeard
http://www.joelonsoftware.com/items/2008/01/08.html

======
geebee
I was about to submit this one myself...

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).

~~~
Alex3917
"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."

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.

~~~
pg
_we tend to only talk about truly great programmers because that is what is
required for startups_

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.

~~~
asdflkj
Are there ways to make yourself more driven?

~~~
pg
Definitely. Graduating from college, because you lose the option of going back
to school if you fail. Having a taste of success. Doing something that will be
judged by your peers. Feeling like what you do will make a difference to the
world. Having people depend on you. Losing the illusion that you have infinite
time.

~~~
Alex3917
Trying to increase your productivity by changing your intrinsic work ethic
seems difficult and also inefficient.

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.

~~~
ashu
In many ways, PG's suggestions do imply a change in your environment as well.
And so, it may not necessarily be contradictory to your position / the cited
research.

------
mrtron
>There are already several programs going in this direction: a lot of Canadian
universities, notably Waterloo, have Software Engineering programs...

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.

------
jcd
Richard Gabriel came up with something similar several years ago: The software
MFA.

<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.

------
danw
He makes a great point. Perhaps an apprenticeship more than a degree? I know
friends in a neighbouring university where part of the course requirement is
to work in industry at least one day a week. I've learnt far more working for
6 months in a startup than I did in 3 years of Computer Science.

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...](http://en.wikipedia.org/wiki/Franklin_W._Olin_College_of_Engineering)]

------
iamwil
In all fairness, I guess it depends on what you need to do. For the vast
majority of the day to day coding, it involves more of the architecturing and
creative and puzzle solving side that joel talks about.

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.

------
Tichy
"kids who are really interesting in programming, not computer science"

I have troubles imagining that kind of person? In any case, I would be wary of
a programmer who doesn't even know Quicksort.

------
greendestiny
I have nearly the exact opposite opinion of Joel here. I think the problem is
that Java schools try to teach programming without teaching computer science.
Mostly they avoid programming and computer science as much as possible and try
prepare their students for jobs in IT departments and enterprise and
maintenance coding.

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.

------
tarkin2
I spoke to 2nd year Comp Sci undergraduate a few days ago. I'm about 70% sure
he said the main language they teach is Java (I don't recall him ever speaking
about C/C++). I was telling him about my forays into Haskell and how function
composition combined with recursion often confuses me.

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.

------
comatose_kid
I wonder if the focus/content of an undergrad program really influences the
outcome for whether or not person x will be a great programmer.

Many great programmers began before university, and many didn't attend
university at all (John Carmack immediately springs to mind).

------
jsnx
There is a lot of cynicism about undergraduate CS -- but no one in the
industry offers internships to anyone but students. If you don't like what the
Universities are selling, stop buying it!

------
Funky_
My college switched from C++ to Java based coding in 2005 for learning the
fundamentals. I would have much rather learned C++.

~~~
Tichy
So get a good book on C++. Frankly, I don't consider programming languages
university level at all...

------
edw519
"The teachers are experienced software developers from industry. The studio
operates like a software company."

Oh, you mean like ycombinator?

~~~
tomh
Maybe more like ArsDigita University. That went over well, but the website at
least is still serving the videos:

<http://www.aduni.org/>

