In general about the book
I have used this book in undergraduate and graduate courses since 1986 when the second edition was published. After fifteen years of using it, I can say that the book is the Bible for all who are interested in Software Engineering. As one of my students says: "In this book, I can find answers or references to answers for all my dilemmas in software engineering." The book provides a wide range of software engineering models, methods, techniques, tools and standards and describes how these can be used to develop more reliable and cost-effective software. Furthermore, this book presents what is currently known about software engineering, the factors which affect not only software engineer productivity but software process quality as well. In order to acquaint readers with different backgrounds, the author included sections that review the relevant theories and numerous examples that clarify discussion about described concepts. Each chapter is concluded by "Further reading", "Key points", and "Exercises" sections.
The book covers all suggested material in the SE Software Engineering component of the draft computer science body of knowledge proposed by the ACM/IEEE in the Computing Curricula 2001 document and it's also consistent with the IEEE/ACM "Software Engineering Body of Knowledge" document.
More information on the book is available over the Internet at URL http://www.software-engin.com including an instructor's guide, a set of overhead projector transparences for each chapter and a source code in Java for most of the individual program examples.
Chapter content
The author organized the book into six parts, divided into 29 chapters, added a references and index.
The Part 1 (Overview, chapters 1-4) is a overview of software system engineering. Chapter 1 (Introduction) introduces the subject of software engineering. In the section the author has answered to the FAQ (Frequently Asked Questions) list with 11 questions about software engineering. Chapter 2 (Computer-based system engineering) introduces the concept of computer-based system engineering and explains why knowledge of system engineering is important for software engineers. Chapter 3 ( Software processes) introduces the software process - a coherent set of activities for software production and presents a number of very general process models from an architectural perspective, namely the waterfall models, evolutionary development, formal system development and reused-based development. Chapter 4 (Project management) gives an overview of software project management. The author explains the differences between software project management and other types of engineering project management, describes the principal task of software project managers, presents how a bar charts and a activity charts are used by project managers to represent project schedules, and introduces a risk management process.
The Part 2 (Requirement, chapters 5-9) presents a broad perspective on requirement engineering. Chapter 5 (Software requirement) introduces the concepts of user requirements and system requirements, functional and non-functional requirements, and explains different ways of expressing these requirements. Chapter 6 ( Requirement engineering processes) describes the principal requirements engineering activities and their relationships, introduces several techniques of requirements elicitation and analysis (viewpoint-oriented and scenario-based elicitation) and presents a number of generic requirements engineering processes. Chapter 7 (System models) introduces a number of different types of system model, such as behavioral modeling, data modeling and object modeling, describes the notation defined in the Unifies Modeling Language (UML) and how these notations may be used to develop different types of system model, and presents how CASE workbenches support system modeling. Chapter 8 (Software prototyping) explains how software prototyping is used in software process and describes different approaches to prototype development. Chapter 9 (Formal specification) introduces formal specification techniques that can be used to add detail to s system requirements specification.
The Part 3 (Design, chapters 10-15) concerns with methods, tools and techniques for software design process. Chapter 10 (Architectural design) introduces the concepts of software architecture an architectural design, describes a number of different types of software architecture covering system structure, control and modular decomposition. Chapter 11 (Distributed systems architectures) describes the architectures of distributed systems, such as client-server and distributed object architectures, and presents the CORBA standard that supports distributed object architectures. Chapter 12 (Object-oriented design) introduces an approach to software design where the design is structured as interacting objects, and presents the UML notations that can be used to document an object-oriented design. Chapter 13 (Real-time software design) introduces techniques that are used in the design of real-time systems and to describes some generic real-time system architectures. Chapter 14 (Design with reuse) explains how the reuse of existing software may be incorporated into the systems design process. Software reuse is focused on component-based development and patterns. Chapter 15 (User interface design) includes some aspects of user interface design that are important for software engineers. It introduces the five different styles of interaction with software system, different styles of information presentation and presents interface evaluation principles.
Part 4 (Critical Systems, chapters 16-18) presents some development problems for systems where failures can result in significant economic losses, physical damage or threats to human life. Chapter 16 (Dependability) introduces the notation of dependability and its importance to critical systems. Chapter 17 (Critical system specification) explains how to specify functional and non-functional dependability requirements. It includes safety and security specification, risk and hazard analysis, too. Chapter 18 (Critical system development) introduces implementation techniques that are used in the development of critical systems.
Part 5 (Verification and Validation, chapters 19-21) presents some aspects of verification an validation, software testing and critical system validation. Chapter 19 (Verification and Validation) introduces software verification and validation with a particular focus on static verification techniques, such as program inspection and static analysis of programs. Chapter 20 (Software testing) introduces techniques and CASE tools that may be used to test programs to discover program faults. Chapter 21 (Critical systems validation) discusses verification and validation techniques that are used in the development of critical systems. It focuses on statistical testing and safety proofs.
Part 6 (Management, chapters 22-25) deals with management of people, estimating of software cost and management of software quality. Chapter 22 (Managing people) discusses the importance of people in the software engineering process and introduces the People Capability Maturity Model - a model that is a framework for enhancing the capabilities of software developers in a organization. Chapter 23 (Software cost estimation) introduces techniques for estimating the cost and effort required for software production. The chapter presents the COCOMO 2 costing model for algorithmic cost estimation. Chapter 24 (Quality management) presents software quality management and describes specific quality management activities. It includes quality assurance an standards, quality planning, quality controls and software metrics and measurement. Chapter 25 (Process improvement) explains how software processes can be improved to produce better software. The chapter includes process and product quality, process analysis and modeling, process measurement, the SEI Process Capability Maturity model and process classification.
Part 7 (Evaluation, chapters 26-29) deals with evaluation of software products. Chapter 26 ({\it Legacy systems}) introduces common legacy system structures, the principles of function- oriented design and presents how legacy systems can be assessed to decide if they should be scrapped, maintained, reengineered or replaced. Chapter 27 (Software change) introduces software change and describes a number of ways of modifying software including three different strategies for changing software systems, namely software maintenance, architectural evaluation and software re-engineering. The chapter presents how legacy systems may be transformed to distributes client-server systems to extend their life and to make effective use of modern hardware. Chapter 28 (Software re-engineering) explains the process of software re-engineering to improve the maintainability of a software system. The chapter includes reverse engineering, program restructuring, software and data re-engineering which may be involved in software engineering process. Chapter 29 (Configuration management) introduces the process of managing the code and documentation of an evolving software system, and CASE tools for configuration management. The authors identifies and describes four principal configuration management activities - configuration management planning, change management, version and release management and system building.
Useful book
The book can be used in several different related courses, such as a general introductory courses in software engineering, a introductory or intermediate courses on specific software engineering topics and a more advanced courses in specific software engineering topics.
The book is suitable both for software engineering students and for professionals who need to understand current software process theories and methods. I can strongly recommend reading this book.
Slobodanka Djordjevic-Kajan