One of the most common criticisms of software developers is that we are perpetually re-inventing the wheel.
It (re?) occurred to me today that this probably owes a lot to the way programming it taught.
I would argue that any good Computer Science degree will aim to have it’s readers come away with an understanding of the principles at work. Now, in order to do this effectively (or at least demonstrate their understanding), students will have to implement much of the basic software that has been around for decades (sorting algorithms are a good example of this).
Of course, this is great for ensuring that you get really good Computer Scientists who can deliver real innovation and solve hard problems, but the disadvantage of this, is that they don’t practice doing what one would normally do InTheRealWorld™, which is find an existing implementation that is ‘good enough’ and work from there.
Learning to use software libraries is a skill in and of itself, as it often requires an understanding that may not be available immediately. This is partly an issue of design or (more usually) documentation, but there is also an element of experience; it requires experience to understand how other programmers think and how they build and design libraries.
I think that teaching needs to acknowledge this; yes, get students to write the fundamental algorithms, but make sure that you follow-up with a course that makes them use existing libraries, as this is how they will expected to work in the future.