IEEE COMPUTER, December 1992
An Integral Approach to Software Engineering
Pankaj Jalote (Springer-Verlag, New York, 1991, ISBN 0-387-97561-6, 375 pp.)
Software engineering is, at long last, an established discipline. This book proves the point not only by referencing 15 other major textbooks in the field, but also by mostly expanding on existing subject material.
So what sets this book apart from other software engineering textbook? First, its stated focus is on practice. A case study is introduced in the first chapter and elaborated at the end of every chapter. The study is based on a scheduling system for a computer science department, which students should find amusingly familiar. In addition, each chapter includes worked-out examples that give additional practical exposure to such systems as office automation, ATM, and text formatting. These examples are brief (to the point of being "toys"), but they illustrate points and make the book quite enjoyable to read, especially for a textbook.
Second, each chapter includes software metrics. This is a more realistic and sensible approach than viewing metrics in isolation. They are compared with metrics that other disciplines used to quantify performance and are defined with the same precision. For example, the author makes a clear distinction between Halstead's software science measure, which requires completed code, and McCabe's cyclomatic complexity measure, which can be estimated with design modules as well as completed code. This basic distinction is somewhat blurred in some other software engineering references.
Finally, the writing is surprisingly fresh. As with many software engineering textbooks, the chapters follow the software life cycle; requirements analysis, software planning, system and detailed design, coding, and testing. (The author considers maintenance extremely important, suggesting that it requires three times the effort of all the other life cycle phases combined; but he does not give it a separate chapter, because it is not officially part of software development.) The book focuses on integrating the software engineering life-cycle phases. In addition, the author separates product-versus- process software-engineering considerations. He stresses software structure and follows his own advice in tightly structured chapters that address metrics, exercises, and the case study.
The content is suitable for an intriductory upperclass-undergraduate or graduate course for either computer science or computer engineering students. Each of the seven chapters concludes with a summary and 12 to 30 exercises. Computer practitioners who need a recent reference/ textbook on the basics will also find it useful. It gives enough exposures to interesting advanced topics (such as data abstraction and cost estimation) to constitute a primer in the subjects.
The book is relatively short -- 320 pages of text plus the appendix, which contains complete code for the case study. It includes a fair but not overwhelming number of graphs, charts, and equations. The equations are presented with mnemonics rather than numbers; for example, risk exposure is given as RE = Prob (UO) * Loss (UO), where UO is an unsatisfactory outcome. This approach is adequate for an introduction and adds to the book's readability.
All in all, this book accomplishes what it set out to do and adds some interesting new perspectives on the "crisis" field of software engineering.