Handbasket model
Several definitions will be necessary for the enjoyment of this post:
IT: Information Technologies. A department/division/branch of a U.S. corporation responsible for accomplishing things with computers and, as I will elaborate, generally failing. Corporations outside the United States probably have IT departments as well, but I don't know anything about them so I'm going to exclude them from discussion right up front.
C: A programming language. C has been said to combine all the power of assembler with all the readability of assembler, but that is not true. C can, in the hands of a skilled practitioner, be either much more readable or much less readable than assembler.
C++: A bizarre combination of punctuation. It is also an enhancement to C in which all the popular ideas between the conception of C and the conception of C++ were crammed into C, leaving a mush. Most significantly, C++ is object-oriented. However, C++ also has a number of other exciting features, such as being able to encode compile-time compilation, objects outside its own type system, etc.
Java: Another object oriented programming language with C-like syntax. It is much cleaner, from a design perspective, than C++ and programs written in Java run correspondingly slower.
C#: The result of Sun telling Microsoft they were taking Java and going home. These days, Microsoft has its own Java.
Visual Basic: a crawling horror. Whereas it is possible, although with varying degrees of difficulty, to write readable code in each of the aforementioned object-oriented languages, we contend that it is, in fact, not possible in Visual Basic. This is an extremely rare accomplishment in programming language design, although it has been accomplished before; see Perl, APL, etc.
Haskell: a functional programming language. Every place that I refer to Haskell in the remainder of this article, you may substitute the functional programming language of your choice. (If you substitute Scheme, you must assume that anything I saw will be "easy" will actually be "moderately difficult." This extends to such things as "tying your shoes.") If you specifically do not prefer any functional language, you may close your web browser at this time and return to hopefully throwing bones at monoliths. You are lost already.
Finally, to truly appreciate this post, you must care about the state of software engineering and IT in the United States. I figure that should weed out the rest of you.
It is a well known fact that for every promise of how information technology
(which is a particularly loathsome term. Book publishing is "information technology." A bullhorn is "information technology." "Technology" is a word which conjures up simultaneous images of ivory towers and pocket protectors and needs to go away completely.)
is going to improve American corporations and the lives of their workers, twenty people wait around for a computer system to come back online, two IT workers curse impotently at the idiotic tasks which fill their days, five office workers play games of solitaire on their computer, and eight factory workers are put out of jobs by robots. To the outside observer (or me) this does not seem like the unqualified improvement that was originally promised.
For every IT-related promise, there is a failure. For every failure, there is an explanation and a promise that things will be better next time. This is known in some circles as a recursive relationship.
I used to believe that this was primarily because most software developers were not trained in software development. Just as chemistry and chemical engineering are difference disciplines, and their practitioners are not considered interchangeable, computer science and software engineering shouldn't be considered the same disciplines. Sadly, at least most places, software engineering is lumped into computer science, taught by (generally uninterested) computer science professors, and it's hard to be tremendously surprised when the graduates of these programs, no matter how personally interested they may have been in software development, are not engineers.
Then I saw a software engineering textbook,
(It is certainly true that there are plenty of lousy textbooks in the world; however, it is my sincere hope that most of them are not used. This book is used at Northern Illinois University which, while it may not be considered at the same level as my particular alma mater in most ranking schemes, does produce ten graduates for every Dartmouth grad and thus probably has a much greater educational impact on most people (and most software engineering projects) than Dartmouth could ever hope to. Following this line of logic, it would seem significantly more important that the quality of education be high at NIU than at Dartmouth, which tends to be the opposite of how it works out.)
and I won't go into details on who wrote this particular book (George M. Marakas) or where you could get more information on said book if you were interested (but here's a start) or whether the author doesn't seem to have noticed any changes in mainstream programming languages since the early 1980s (he devotes one poorly written appendix to a demonstration that he doesn't understand object-oriented design) or changes in mainstream software development techniques since about the same time (he doesn't mention agile programming or any of its variants, and his discussion of rapid application development is anemic) or his tendency to use straw-man arguments (for example, he suggests that rapid application development techniques are inadequate for applications that use cutting edge technology, while proposing a model that takes a minimum of 36 months to produce any results and thus by definition can't use cutting edge anything) or even his inability to produce diagrams that correlate with his text (his discussion of terrariums as closed systems is accompanied by a picture of a tank filled with water and fish) because those are all incidental to whether his core point has any value. It was his core point that crushed all my beliefs about software development education.
I shall summarize his core point as the idea that serious software requires serious design. This is elaborated to the Software Development Life Cycle, or, in more common usage, the Waterfall model. The waterfall model of software development, so called because it consists of a series of stages, and sometimes requires moving from one stage back to a previous stage as a result of newly discovered problem details or research, is a serious design process. Of its seven stages, the first five do not involve writing code or buying hardware. Instead, the first five stages involve discovering problems, researching industry best practices, modeling existing systems, interviewing users and managers about their expectations and experiences with the existing solutions, prioritizing elements of the proposed solution, and performing a variety of other four-syllable tasks. After you have finished all of that up, Marakas seems to claim, you get someone to go write some code and buy some boxen and slap it together and pass maintenance off to someone else, because the important things are done.
I should start out by saying that I fully support, in the abstract, industry best practices, users, models, existing systems, expectations, experiences, and while I have skepticism about managers I suppose I should allow them for the time being. However, I believe his combination of these factors is completely wrong-headed. Primarily, Marakas (and other proponents of the waterfall model, I suspect) ignores all the realities of software. Just as it is not possible to design a building without taking into account the details of the materials you will use, the construction techniques available, the ground it will be built on, etc., it is impossible to prepare a useful analysis or design of a software project without considering the physical and mental resources available and the language and coding techniques that will be used. Most programmers would recognize the ridiculous nature of claiming that a single design document proposes the best solution to a given problem in C, C++, Java and Haskell, but Marakas suggests that the majority of software development should be devoted to producing just such design documents. It is a necessary corollary that design at such a high level cannot produce any sort of verification except at a similarly high level. Unfortunately, such high level verification is completely useless. Observing that a finished inventory system does not produce the right inventory reports does nothing to suggest why it does not or what should be done to fix it, and tests that come from a design that is independent of any particular physical resources or coding techniques cannot be any more specific.
In short, the waterfall model, as Marakas proposes it, is not a model for software development. It might be a management process that could keep managers amused while programmers wrote software, but the more it was allowed to affect the software the worse the resulting product would be. The real tragedy is not, I think, that wrong-headed ideas exist. Wrong-headed ideas are an indispensable part of intellectual progress. The problem is that with stunning evidence to the contrary clearly available, Marakas is touting a phlogiston-based model of software development and that people are listening to him.

4 diversions:
Another reason for the name of the so-called Waterfall model is its similarity, in many respects, to sending your project over a waterfall in a barrel. You do lots of up-front preparation, and pack yourself in nice and tight, but once you climb in the barrel and roll into the river, you're pretty much committed, for better or for worse, and there's no way to turn back. After all, you made all that up-front investment; what are you gonna do, scrap it and start over?
I haven't seen the Marakas book you're describing, but publishers send me lots of textbooks on software engineering methodology, and almost without fail, they are utterly crap. I think you're absolutely correct when you say that software engineering should be considered a separate discipline from computer science. Unfortunately, there are two reasons why that will take a very long time to happen, assuming it ever does:
(1) Not many people want to study computer science; lots want to study software engineering. Now, it is true that you cannot expect to be a competent software engineer unless you know something about computer science, but the converse is not true. This forces academic CS departments to cover software engineering as a means to draw students; the down side is that most academic CS departments have, as you correctly observed, very little interest in software engineering apart from that particular end.
(2) In the world of IT support, everybody wants it done fast, done cheap, and done right. Unfortunately, engineering reality says you only get to pick two of those, and IT budgets generally force you to choose only one (and that's if you are willing to do a half-assed job of it). The same thing applies to the treatment of software engineering at most good universities. Ironically, you might well get a better education in software engineering per se from an otherwise mediocre state university or community college than out of a first or second tier school. Your computer science background might suffer, but hey, you'd at least be able to write server-side VisualBasic.NET web components to interface with Microsoft Access, and your job might not even get outsourced to Bangladesh until next year.
Not that I'm bitter. Ten weeks to teach students everything they need to know about software engineering? What the hell were they thinking?
Sounds like someone has a case of the Mondays
*Ducks and runs*
*Patridge and jogs?*
Memo to Michael:
According to the Book, you have in fact NOT packed yourself in all neatly and tightly. The Author introduces the concept of "creeping commitment", which implies that the whole thing is re-evaluated at all possible moments, including part way down the waterfall, and is scrapped if it doesn't look so good any more -
Hope that makes you feel more comfortable -
- Petunia
Petunia writes: "the whole thing is re-evaluated at all possible moments, including part way down the waterfall, and is scrapped if it doesn't look so good any more."
Unfortunately, any willingness to revisit early design decisions in a waterfall project is usually quelled by the difficulty of exiting the barrel mid-fall, and hauling yourself back up the rocks in the face of a torrent of cold, wet opposition. That's where ideas like XP and agile software development get their traction.
Post a Comment