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?

A good development environment
What I wish I had known more about before I finished my own formal education came up while I was writing the upcoming O'Reilly book "Practical Development Environments" (http://www.oreilly.com/catalog/practicalde). In addition to how to understand and write code, I would include a better awareness of:
- source control (CVS, Subversion, ...)
- build tools (make, Ant, ...)
- test environments (harnesses)
- bug tracking tools
- documentation environments
- managing releases
All pretty prosaic, but very irritating if they don't work well.
I made a similar comment to this earlier this month on Dan's weblog here, but I really wanted to say this again.
~Matt
A good development environment
Agreed.
There's an element of pragmatism that developers need and aren't developing. Perhaps one solution is internships and mentoring.
I prefer to work with developers who don't know a lot about formal computer science but who do know how to write software effectively. People can read books about theory, but it takes a lot more work to develop good habits.