CHANNELS
 
 
 
 
 
 
 
 
ON THE WEB
 
 
 
 
PRINT EDITION
 
 
 
 
BZ MEDIA
 
 
 
 
ADVERTISER LINKS
 
 
 
 
 
LOADING...
LOADING...
 
 
AS OF 8/7/2008 4:06PM EST
Is Software Engineering an Oxymoron?
By Allen Holub

March 15, 2005 — There has been a lot said about education on these pages in the past few weeks. Nonetheless, I want to worry this issue a bit more before going back to the mundane topics I’m supposed to be writing about, like Java. I believe there’s an underlying issue that is really at the root of the matter: The nature of computer programming has changed radically in the past 30 years, but our definition of computer science has not. Consequently, we’re approaching the subject in a way that’s simply incorrect.

Computer science started out as a kind of mathematics. Computers were little more than glorified adding machines intended to ease the drudge work associated with solving some classes of mathematical problems. The task of programming a computer was little more than presenting an algorithm to the machine so that it could crunch numbers.

Computer science departments, then, sprung from the math departments, like Athena from the head of Zeus, fully armed. Computer science is still sometimes defined as that branch of mathematics that concerns itself with the analysis of computer programs. This topic is interesting but has little relevance when it comes to actually creating computer programs.

Computers are good at solving mathematical problems of course, but the vast majority of programs have little or nothing to do with algorithms and number-crunching. Consequently, training in mathematics is of little or no value when it comes to writing good computer programs. If it were, then mathematicians and physicists would be brilliant programmers. The reality is that this group tends to write miserable code that’s focused too much on algorithms and too little on structure.

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.

As an aside, this is why I believe that it’s not possible to certify software engineers. You can test structural engineers, for example, by presenting them with a structure and having them tell you if it’s going to fall down or not. There’s a provable right answer and a wrong answer. You can’t do this with software, though. There’s no right design and wrong design—just different designs. The only definition of “good” is “I agree with the test writer,” but certification has to be based on an absolute standard of correctness. There is no such thing in the world of software design, however.

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.

UML diagrams are really an application of symbolic linguistics. They diagram the structure of the problem statement and use cases in the same way that a sentence diagram illustrates the structure of a sentence. The best training for doing this sort of design work (and for creating the code that these designs specify) is the study of languages and writing.

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.

The problem, then, is that programming has changed from the study and implementation of algorithms to the study and creation of complex documents. It’s moved from math to English. It’s about time that our educational system moved in the same direction.

Allen Holub is an architect, consultant and instructor in C/C++, Java and OO Design. Reach him at www.holub.com.
 


 
 
 
 
 
 
 
 
 
 
SUBSCRIBE TODAY!
 E-Newsletters:
  News on Mon/Thurs.
  Test & QA Report
  EclipseSource
 
 
JOB BOARD
 
PDF & PRINT EDITION
* Requires Resource Account!  LOGIN or SIGN UP

Download Current Issue!
ISSUE 8/1/2008 PDF

Need Back Issues?
DOWNLOAD HERE

Receive The Print Edition?
SUBSCRIBE HERE
 
REGISTER
 
GET NOTIFIED!
About all of the latest Resources
 
 
SD TIMES 100
It's time once again to
recognize the organizations
or individuals that have
demonstrated leadership in
their markets.