development

Science, or the Humanities?

March 18, 2005 21:20:12.679

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?

Comments

Re: Software is engineering

[Terry] March 19, 2005 7:05:46.756

Sounds to me that the author does not have an engineering background.

Software development is engineering. Enginneering is basically the process of developing a solution to a problem. The process generally involves analysis, synthesis, and testing. All three of these are used in software development, bridge building, and circuit design.

You stated that a structural engineer building a bridge doesn't need tests. Quite the contrary, his tests are simulations using different load conditions.

The primary difference between SD and the other engineering diciplines is that the foundations of the traditional engineering disciplines is math whereas the foundations of SD are logic and communication.

I would agree that education involving the communication component is lacking considerably.

 Share Tweet This
-->