OPENING EDITORIAL

Phillip Robinson

Phillip Robinson is an editor and designer at Virtual Information, a Sausalito, Calif., publishing and programming firm.


The notions of software engineering and CASE (computer-aided software engineering) sometimes get tangled together. They aren't the same thing. CASE is the application of computers to the creation, testing, and modification of software. Software engineering goes beyond that, encompassing not only CASE but the entire process by which a program is imagined, structured, produced, verified, and maintained. CASE tools can certainly organize and speed most any software engineering effort, but they will be most effective if they are themselves designed and used in harmony with proven software engineering techniques.

After all, what is a CASE tool? The term is usually given only to specialized prototyping programs, version-control utilities, and the like. But a debugger is a CASE tool; so is an editor, for that matter, and even an operating system, with its attendant utilities. These are all certainly helpful tools, and the proliferation of sophisticated CASE utilities on the PC level is nothing short of a godsend for personal computer programmers. But the present form of these tools can sometimes obscure the more far-reaching questions of software engineering, such as: How should you organize the many steps and tools of a programming effort? What interface metaphor is most productive? How closely should a particular programming tool match its intended application area? How can large projects be coherently arranged and scheduled to use many computers and many programmers?

These are certainly not idle questions. We devote a staggering number of hours to programming computers and are often left shaking our heads at the inadequate performance that is the result of our labor. Heaps of features and entire applications are left waiting for that imaginary day when we will have the time to really get it right or even get to it at all. Meanwhile, hardware designers from the individual chip to the mainframe system level can boast every year that their products are twice as fast, twice as effective, many times the power at less price than the hardware of yesterday. Software designers are left in the dust, hoping for a few percentage point improvements in programming efficiency. The number of lines of correct code per day expected from a top-ranked programmer is still in the double digits. Combine that excruciating fact with the common wisdom that larger programming teams can have serious communication problems, and you have a recipe for anguish. (You've probably heard the joke, How long will it take twice as many programmers to finish the job? Answer: Twice as long if you're lucky and if they finish at all.)

Nor is the quest for programmer productivity one that only dreamers pursue. The company or individual that comes up with a program in less time can often win the race outright, or at least claim a powerful position in the market. If that program is also easily maintained and enhanced, the company or individual will have a head start every day of the competition. If some of the program's code can be reused in the product that succeeds it, the race will be over almost before it starts. Software productivity may even have an impact at the political level, from economic competition to military conflicts. The U.S. military spends a great deal of money on software. It even demanded a new programming language, armed to the teeth with software engineering ideas and structures, just so it could get its programming house in order. So if it's so important, what about some answers? How do you write good code quickly? A good compiler with a library of reusable modules is vital, as is a flexible editor, a potent debugger, and other such tools. These have long been advertised, reviewed, and otherwise touted in Doctor Dobb's and other journals. Other important tools, however, don't get as much press. Add a prototyper to the stew if you want to get some ideas right away about the program's general design and look. If it's a big project, you might consider adding a version control utility, a documentation librarian, and other such CASE utilities. There are even programs that help you analyze programs for their adherence to standards, and other programs that can draw a flowchart from someone else's program -- a real boon if you're stuck maintaining poorly documented code. For some niches there are fourth-generation languages (4GL): programs that can automatically generate application programs from descriptions of the desired input and output.

These utilities are part of one important avenue to improved programming productivity, and this special issue Sourcebook contains a guide to them, listing prices, platforms, and so on. Instead of rooting through the ads at the back of each programming magazine in your library, you can find the companies devoted to this market all collected in one place. Along with that resource guide, we've included a glossary that explains the terms of software engineering and CASE to help you pin down some of the ambiguous phrases and marketese you may encounter when discussing CASE tools. But the resource guide is not enough, by itself, to show where software engineering is going. Nor is fast coding enough to make a good programmer. You should know about research that points the way to huge improvements in productivity -- improvements that rocket far ahead of the mere doubling or tripling you might gain from an improved compiler or prototyper. You need to know the limiting implications of today's accepted programming technology and menageries of discrete tools. That's where the articles of this special issue come in. They represent some of the most important directions of software engineering, discussing issues such as programming environments, intelligent prototyping, distributed computing, version control on large software projects, graphics and object-oriented languages, tool integration, and application-specific virtual machines.

This issue touches on software engineering of both today and tomorrow, from the embedded real-time system through the personal computer to the network of workstations. We planned this issue so that it will remain useful for years, long past the time when any particular company, program, or review of that program may have become history. We've made a "keeper," a volume that could easily hold a place on your shelves well into the 1990s.