When you're looking to hire programmers, what do you look for in their education? How should the colleges and universities be educating the next round of students who are destined for careers in software development? There seem to be several schools of thought on this.Programming as a Science
Traditionally, going to school with the intention of becoming a programmer meant getting a degree in computer science, which was typically taught in either the mathematics or engineering school within a university. There was, and still is, in many schools, a lot of emphasis on mathematics, engineering, and science courses as part of the curriculum for earning this degree. Should the future programmers have to care about vector calculus or electronic circuits or fluid dynamics? What about graph theory, logic circuit design, or computer architecture? How much "science" do programmers really need to know?Programming as an Art
Some believe that programming is less of a science, and more of an art. Joel Spolsky seems to think this way. According to this school of thought, programming is an art, and aspiring artists go to school to learn by doing, and by studying under accomplished artists who can teach them how it supposed to be done.Programming as Engineering
To others, programming is an engineering discipline. You're not a programmer, you're a software engineer. You're an architect. You're building and creating with the finest attention to detail. You've measured your code twice and it will fit in 64K of memory. As you build more and more software, you begin to establish a set of practices and guidelines to prevent past failures from reoccurring. You have little patience for the new upstart programmers who lack all of the discipline you've carefully acquired.So what should the schools teach?
All of the above! Aspiring software developers need the science, the theory, the engineering principles and the artistic trade aspects in order to be well-rounded.
If you leave out the theory, you might create a batch of programmers who don't know why a Shlemiel the Painter's algorithm is bad, or how to avoid it.
If you leave out engineering principles, you might get programmers who don't know what to do in response to a bug that is found in their code. How do they know that bug is fixed? How do they prevent it from reoccurring?
If you leave out the art of programming, you might find people who know about software, but not why to create it, or what to create. The software industry might need a few well-trained critics, but this is probably not the best use of a university's software development curriculum.