Related link: http://www.jamesshore.com/Blog/Five-Design-Skills.html
I’ve often wished that there were some field of higher education between the theoretical computer science and the practical IT/IS degree programs for people interested in careers in software development. Both perspectives are valuable, but I see the purpose of undergraduate education to teach you how to learn and to do research and to organize and express your thoughts clearly. If it’s just vocational training, you might as well join a vocational training program at the cost of far less time and money.
I do regret not studying more mathematics, but everything else I know about software I learned outside of the classroom. When I see that my naive data structure isn’t working out, I can always look up an algorithm for a heap or a binary tree (and I always have to look up algorithms for dealing with graphs), but when my problem is more philosophy than fact I have to deal with my experience.
Imagine how far ahead we would be toward writing high-quality, effective, and maintainable software if we could count on new developers already knowing how to read, analyze, understand, and improve code. As Jim says, they may be a little slow and will probably need a little help, but even just knowing that these skills exist and are valuable and necessary could be a huge improvement.
Perhaps free software would be more effective if our projects actively encouraged this kind of review and maintenance — not just with words, but with actions as well. Of course, software development in general has to grow up to acknowledge maintenance as not only the largest part of the software lifecycle but the most important and, by far, the most valuable.
What do you wish they had taught you in school?