This post originated from an RSS feed registered with Agile Buzz
by James Robertson.
Original Post: Science, or the Humanities?
Feed Title: Cincom Smalltalk Blog - Smalltalk with Rants
Feed URL: http://www.cincomsmalltalk.com/rssBlog/rssBlogView.xml
Feed Description: James Robertson comments on Cincom Smalltalk, the Smalltalk development community, and IT trends and issues in general.
This column by Allen Holub of SDTimes magazine has to be the best thing I've read about development in eons. He points out that software engineering isn't engineering, and that mathematics simply isn't that relevant to most developers. I couldn't agree with him more:
In fact, computer science is neither a science nor an engineering discipline. Science concerns itself with the formulation and proof of hypotheses. Programmers just don’t do that. Similarly, all engineering disciplines except software engineering concern themselves primarily with the mathematical analysis of structures, be they physical structures or electronic circuits. Programmers don’t do that, either.
Indeed, “software engineering” books don’t talk about engineering at all, at least not in the way that mechanical or electrical engineering books cover their subjects. Software engineering is about process, not structural analysis. The closest thing that software engineering has to real engineering is the study of design patterns, but even these are nebulous. There is no single “correct” structure for the realization of a design pattern. Even calling the creation of software “engineering” is a misnomer in my mind.
That's exactly right. Think about Unit tests, for instance. A structural engineer building a bridge doesn't need tests - what he needs is a blueprint and the materials. Armed with those, he can tell you whether the bridge will stay up or not. In software, the basic design tells us nothing of the kind. If it did, we wouldn't need tests. So given that, what is software development? Back to Allen:
So if programming isn’t science or engineering, what is it? It’s a liberal art. Modern programming bears more similarity to creative writing than to engineering or physics. The design process that you go through (or at least should go through) to create a program is almost identical to the process that you use to write a book: research, formulating a thesis (or problem definition), an orderly exposition of the thesis. These steps are central to both expository writing and object-oriented analysis and design.
In other words, it's not really a "hard" science at all - it's one of the soft, squishy ones, where the answers are subjective and we have to puzzle out the best answers from among many possible ones. Consider what we actually have in the popular languages in this light - we have primitive data types in Java (and in the CLR as well) - because someone decided that premature optimization of low level math stuff was important. Yes, I know that some people need that speed. But for the vast majority of developers on the vast majority of projects - you aren't one of those people. The problem for most of us is developer productivity and time to market - not how fast we can add up the numbers that show how many users of IE hit the web page today. Carrying on from that point:
We should really give up on the notion of math being the foundation of computer science, drop hard-core mathematics from the curriculum, and replace it with English composition (which teaches you how to write large, complex, documents like computer programs) and Latin (which teaches you how to analyze complex linguistic systems).
Bear in mind that logic—the one “mathematical” subject that is inarguably part of programming—is traditionally taught by the philosophy, not the math, department. As an added benefit, if programmers were trained as writers, they’d be able to write coherent documentation and put meaningful comments in their code.
The mathematics that is actually relevant—a bit of set theory and the like—is easily covered in a one-semester class on the order of the Math-for-English-Majors classes offered by most universities.
There are a lot of developers who will have a really hard time letting go of the idea that all inbound CS people should take a compiler class. Ask yourself though - how many people are doing that kind of work, and how many are creating what amounts to glorified reporting interfaces?