(This is not a criticism of the authors of specific quotes I use, but rather what I believe is a somewhat widely held opinion)
There is an interesting question here, which is why do we teach students how to write linked-lists, stacks etc anyway? It seems to some degree that statements like 'but I know how a quicksort works, and if I were writing in a different language I could write it myself. Otherwise I don't know how to program.' Have become sufficiently accepted to no longer need justification. There are a few things which give me cause for concern: A. This argument seems to reflect a form of dishonesty on the part of computer science. - If abstractions and implementation hiding worked properly, then you'd never have to know how a sorting function worked, unless you needed to implement one. How many people need to implement one? Primarily (perhaps exclusively?), framework developers. So are we saying that if you can't write a framework, you're not a programmer? I don't know how many framework programmers there are outside academia, it would be an interesting question to ask. I suspect very few. (I've now seen several companies doing things that you would think might need a framework, like high security embedded systems development. But they just used an available one) - The alternative view, is that abstractions don't work properly, and we need to peer inside them every now and again to understand why something isn't working, or something is going slowly, or indeed to achieve security. I can remember the first time I looked inside something that implemented one of the algorithms that I had to learn, 'to be a programmer', it was a very unpleasant shock. I couldn't understand what on earth the code was doing. The reason I suggest being that the internals of algorithm libraries are one of the places, where companies can spend money to get high performance implementations without making life very hard for their 'consumer programmers'. Consequently they look nothing like the nice theoretical, psudeo-mathematical descriptions. In my, somewhat limited, experience, they're full of nasty sensitive threading models and scarey CPU + Compiler optimizations. So what are we teaching: -> We're not teaching what's practically relevant. Very few people write sorting algorithms. When people have to peer inside the abstractions, they need a set of intellectual skills which I believ may be somewhat disjoint for being able to create a simple linked list in C. -> We're not teaching concentrating on theoretical value. The requirement to make people 'implement them' means that they have to be able to express something which is comparatively simple to describe in pseudo-code in a somewhat tedious notation. This indeed seems to put many people off. During my algorithms course, we were encouraged to implement the things that we were being taught, I did for the first couple of times, but rapidly stopped because the time to implement was so much higher than the time to understand. Further, as suggested above, the theoretical knowledge is only weakly transferable, I couldn't go and implement quicksort in any manner which competed with a real implementation despite knowing what the algorithm is. If what we're doing is teaching a set of techniques for analysis of algorithms, that's fine, but isn't that rather different to saying 'if you can't write quicksort you're not a programmer?'? ------------- B. What are the side effects of mandating that people have to learn, and implement things like quicksort? I believe the statement below precisely the effect: 'If students must do GUI programming or they will find programming 'boring' - well, they should drop out now. More sensibly, they should not have been enrolled to start with.' People who are not interested in programming for its' own sake drop out and do something else. This is something of a tragedy is it not? So as a collective, we're simultaneously arguing that people should be taught to think computationally, and also, that if they aren't interested in the computer for its own sake, well then, they should go away. Perhaps we should teach programming as a tool, and mathematical theory as mathematical theory and acknowledge that they're really increasingly separate disciplines? Perhaps we might allow people to choose? Just some musings.... Luke ___________________________________________________________ Try the all-new Yahoo! Mail. "The New Version is radically easier to use" The Wall Street Journal http://uk.docs.yahoo.com/nowyoucan.html ---------------------------------------------------------------------- PPIG Discuss List (discuss@ppig.org) Discuss admin: http://limitlessmail.net/mailman/listinfo/discuss Announce admin: http://limitlessmail.net/mailman/listinfo/announce PPIG Discuss archive: http://www.mail-archive.com/discuss%40ppig.org/