本书是系统介绍软件工程理论的经典教材,自1982年初版以来,随着软件工程学科的发展不断更新,销售逾400 000册,培养了一代又一代软件工程人才,对学科本身也产生了重大影响。这个最新版重点论述在开发大型复杂软件系统时可以采用的一些实用方法。全书重新组织为7篇,涵盖了整个软件开发过程各个阶段的内容,从初始的需求导出到设计和开发,再到软件项目管理。本书适合作为本科生和研究生教材,同时也可供软件工程人员参考。
本书的主要特点
●涵盖软件工程理论和实践领域的最新发展。
●整合软件工程和相关领域的知识。
●着重讨论了需求和体系结构设计的重要内容。
●提供Java程序示例以及用UML表示系统模型。
●配套网站(www.software-engin.com)提供了丰富的软件工程资源和教学材料。
本版新增内容
●新增4章,分别是:'应用系统体系结构'、'快速软件开发'(包括敏捷方法)、'基于构件的软件工程'和'软件进化'。
●大幅改写和重组了11章的内容,增加了许多最新资料。
●其余各章也进行了修订和更新。
●通过一个信息系统和一个控制系统的案例分析,阐述了不同的软件工程技术,
●增加了敏捷方法和软件复用的相关知识。
●结合讨论了系统的可靠性和安全性。
Preface
Part 1 Overview
Chapter 1 Introduction
Chapter 2 Socio-technical systems
Chapter 3 Critical systems
Chapter 4 Software processes
Chapter 5 Project management
Part 2 Requirements
Chapter 6 Software requirements
Chapter 7 Requirements engineering processes
Chapter 8 System models
Chapter 9 Critical systems specification
Chapter 10 Formal specification
Part 3 Design
Chapter 11 Architectural Design
Chapter 12 Distributed Systems Architectures
Chapter 13 Application Architectures
Chapter 14 Object-oriented Design
Chapter 15 Real-Time Software Design
Chapter 16 User Interface Design
Part 4 Critical Systems
Chapter 17 Rapid Software Development
Chapter 18 Software Reuse
Chapter 19 Component-based Software Engineering
Chapter 20 Critical Systems Development
Chapter 21 Software Evolution
Part 5 Verification and Validation
Chapter 22 Verification and Validation
Chapter 23 Software Testing
Chapter 24 Critical Systems Validation
Part 6 Managing People
Chapter 25 Managing People
Chapter 26 Software Cost Estimation
Chapter 27 Quality Management
Chapter 28 Process Improvement
Chapter 29 Configuration Management
Glossary
References
Index
Ian Sommerville著名的软件工程学家, 英国兰卡斯特大学软件工程学教授, 在软件工程的教学和科研方面有20多年经验. 他是IEEE CS组织编撰“软件工程知识体系”(SWEBOK)的专家委员会三成员之一. 目前, 他的研究领域包括:计算机系统工程. 需求工程. 系统可靠性以及软件进化.
The first edition of this textbook on software engineering was published more than twenty years ago. That edition was written using a dumb terminal attached to an early minicomputer (a PDP-11) that probably cost about $50,000. I wrote this edi- tion on a wireless laptop that cost less than $2,000 and is many times more pow- erful than that PDP- 11. Software then was mostly mainframe software, but personal computers were just becoming available. None of us then realised how pervasive these would become and. how much they would change the world.
Changes in hardware over the past twenty or so years have been absolutely remark- able, and it may appear that changes in software have been equally significant. Certainly, our ability to build large and complex systems has improved dramati- cally. Our national utilities and infrastructure--energy, communications and trans- port--rely on very complex and, largely, very reliable computer systems. For building business systems, there is an alphabet soup of technologies--J2EE, .NET, EJB, SAP, BPEL4WS, SOAP, CBSE--that allow large web-based applications to be deployed much more quickly than was possible in the past.
However, although much appears to have changed in the last two decades, when we look beyond the specific technologies to the fundamental processes of software engineering, much has stayed the same. We recognised twenty years ago that the water- fall model of the software process had serious problems, yet a survey published in December 2003 in IEEE Software showed that more than 40% of companies are still using this approach. Testing is still the dominant program validation technique, although other techniques such as inspections have been used more effectively since the mid 1970s. CASE tools, although now based around the UML, are still essen- tially diagram editors with some checking and code-generation functionality.
Our current software engineering methods and techniques have made us much better at building large and complex systems than we were. However, there are still too many projects that are late, are over budget and do not deliver the software that meets the customer's needs. While I was writing this book, a government enquiry in the UK reported on the project to provide a national system to be used in courts that try relatively minor offenders. The cost of this system was estimated at ~156 million and it was scheduled for delivery in 2001. In 2004, costs have escalated to ~390 million and it is still not fully operational. There is, therefore, still a pressing need for software engineering education.
Over the past few years, the most significant developments in software engineering have been the emergence of the UML as a standard for object-oriented system descrip- tion and the development of agile methods such as extreme programming. Agile methods are geared to rapid system development, explicitly involve the user in the development team, and reduce paperwork and bureaucracy in the software process. In spite of what some critics claim, I think these approaches embody good software engineering practice. They have a well-defined process, pay attention to system spec- ification and user requirements, and have high quality standards.
However, this revision has not become a text on agile methods. Rather, I focus on the basic software engineering processes--specification, design, development, verification, and validation and management. You need to understand these processes and associated techniques to decide whether agile methods are the most appropri- ate development strategy for you and how to adapt and change methods to suit your particular situation. A pervasive theme of the book is critical systems--systems whose failure has severe consequences and where system dependability is critical. In each part of the book, I discuss specific software engineering techniques that are relevant to critical systems engineering.
Books inevitably reflect the opinions and prejudices of their authors. Some read- ers will disagree with my opinions and with my choice of material. Such disagree- ment is a healthy reflection of the diversity of the discipline and is essential for its evolution. Nevertheless, I hope that all software engineers and software engineer- ing students can find something of interest here.
The structure of the book
The structure of the book is based around the fundamental software engineering
processes. It is organised into six parts with several chapters in each part:
Part 1: Introduces software engineering, places it in a broader systems context and presents the notions of software engineering processes and management.
Part 2: Covers the processes, techniques and deliverables that are associated with requirements engineering. It includes a discussion of software requirements, system modelling, formal specification and techniques for specifying dependability. Part 3: This part is devoted to software design and design processes. Three out of the six chapters focus on the important topic of software architectures. Other topics include object-oriented design, real-time systems design and user inter- face design.
Part 4: Describes a number of approaches to development, including agile meth- ods, software reuse, CBSE and critical systems development. Because change is now such a large part of development, I have integrated material on software evolution and maintenance into this part.
Part 5: Focuses on techniques for software verification and validation. It includes chapters on static V & V, testing and critical systems validation. Part 6: The final part covers a range of management topics: managing people, cost estimation, quality management, process improvement and configuration management.In the introduction to each part, I discuss the structure and organisation in more detail.
Changes from the 6th edition
There are significant changes to the organisation and content from the previous edition. I have included four new chapters and made major revisions of 11. other chapters. All other chapters have been updated and, where appropriate, new material has been added. More and more systems have high availability and reliability requirements, and I believe that we have to consider dependability as a basic driver for software engineering, so the chapters on critical systems have now been integrated into other sections. To avoid content creep, I have reduced the amount of material on software maintenance and have integrated material on maintenance and evolution with other chapters in the book. There are two running case studies---one on a document management system used in a library and the other on a medical system--that I draw on in several chapters.
The case study material is indicated by margin icons. Table 1 summarises the changes, with the number in parentheses indicating the corresponding chapter in the 6th edi- tion. Further information on the changes is available on the book's web site.
Chap. 13: Application architectures
Chap. 17: Rapid software development
Chap. 19: Component-based software engineering
Chap. 21: Software evolution
Chapters with significant new material and/or major structural revisions
Cha.2: Socio-technical systems (2)
Cha.4: Software processes (3)
Cha.7: Requirements engineering processes (6)
Cha.9: Critical systems specification (17)
Cha.12: Distributed systems architectures (11)
Cha.16: User interface design (15)
Cha.18: Software reuse (14)
Cha.23: Software testing (20)
Cha.25: Managing people (22)
Cha.24: Critical systems validation (21)
Cha.28: Process improvement (25)
Updated chapters
Chap. 1: Introduction (1)
Chap. 3: Critical systems (16)
Chap. 5: Project management (4)
Chap. 6: Software requirements (5)
Chap. 8: System models (7)
Chap. 10: Formal specification (9)
Chap. 11: Architectural design (10)
Chap. 14: Object-oriented design (12)
Chap. 15: Real-time systems design (I 3)
Chap. 20: Critical systems development (18)
Chap. 22: Verification and validation (19)
Chap. 26: Software cost estimation (23)
Chap 27: Quality management (24)
Chap. 29: Configuration management (29)
Deleted chapters
Software prototyping (8)
Legacy systems (26)
Software change (27)
Software re-engineering (28)
Readership
The book is aimed at students taking undergraduate and graduate courses and at software engineers in commerce and industry. It may be used in general software engineering courses or in courses such as advanced programming, software speci- fication, and software design or management. Software engineers in industry may find the book useful as general reading and as a means of updating their knowl- edge on particular topics such as requirements engineering, architectural design, dependable systems development and process improvement. Wherever practicable, the examples in the text have been given a practical bias to reflect the type of appli- cations that software engineers must develop. Using the book for teaching I have designed the book so that it can be used in three types of software engi-
neering course:
General introductory courses in software engineering For students who have no previous software engineering experience, you can start with the introductory section then pick and choose chapters from the other sections of the book. This will give students a general overview of the subject with the opportunity of more detailed study for those students who are interested. If the course's approach is project-based, the early chapters provide enough material to allow students to get started on projects, consulting later chapters for reference and further infor- mation as their work progresses.
2. Introductory or intermediate courses on specific software engineering topics The book supports courses in software requirements specification, software design, software engineering management, dependable systems development and soft- ware evolution. Each part can serve as a text in its own right for an introduc- tory or intermediate course on that topic. As well as further reading associated with each chapter, I have also included information on other relevant papers and books on the web site.
3. More advanced courses in specific software engineering topics The chapters can form a foundation for a specific software course, but they must be sup- plemented with further reading that explores the topic in greater detail. For exam- ple, I teach an MSc module in systems engineering that relies on material here. I have included details of this course and a course on critical systems engi- neering on the web site.
The benefit of a general text like this is that it can be used in several related courses. At Lancaster, we use the text in an introductory software engineering course and in courses on specification, design and critical systems. Courses on component- based software engineering and systems engineering use the book along with addi- tional papers that are distributed to students. Having a single text presents students with a consistent view of the subject--and they don't have to buy several books.
To reinforce the student's learning experience, I have included a glossary of key terms, with additional definitions on the web site. Furthermore, each chapter has:
~ A clearly defined set of objectives set out on the first page
~ A list of key points covered in the chapter
~ Suggested further reading--either books that are currently in print or easily avail- able papers (lists of other suggested readings and links can be found on my web site)
~ Exercises, including design exercises.
The Software Engineering Body of Knowledge project (http://www.swebok.org) was established to define the key technical knowledge areas that are relevant to pro- fessional software engineers. These are organised under 10 headings: requirements, design, construction, testing, maintenance, configuration management, manage- ment, process, tools and methods, and quality. While it would be impossible to cover all of the knowledge areas proposed by the SWEBOK project in a single textbook,
all of the top-level areas are discussed in this book.
Web pages
The web site that is associated with the book is:
http://www.sofiware-engin.com
This offers a wide range of supplementary material on software engineering. From there, you can access web pages dedicated to supporting both this and previous edi- tions of Software Engineering.
It has been my policy, both in the previous edition and in this edition, to keep the number of web links in the book to an absolute minimum. The reason for this is that these links are subject to change and, once printed, it is impossible to update them. Consequently, the book's web page includes a large number of links to resources and related material on software engineering. If you use these and find problems, please let me know and I will update the links.
To support the use of this book in software engineering courses, I have included a wide range of supplementary material on the web site. If you follow the Material for Instructors links, you can find:
~ Lecture presentations (PowerPoint and PDF) for all chapters in the book
~ Class quiz questions for each chapter
~ Case studies
~ Project suggestions
~ Course structure descriptions
~ Suggestions for further reading and links to web resources for each chapter
~ Solutions for a selection of the exercises associated with each chapter and for the quiz questions (instructor's only).
I welcome your constructive comments and suggestions about the book and the web site. You can contact me at ian@software-engin.com. I recommend that you include [SE7] in the subject of the e-mail message to ensure that my spam filters do not accidentally reject your mail. I regret that I do not have time to help stu- dents with their homework, so please do not ask me how to solve any of the prob- lems in the book.
Acknowledgements
A large number of people have contributed over the years to the evolution of this book and I'd like to thank everyone (reviewers, students and book users who have e-mailed me) who has commented on previous editions and made constructive sug- gestions for change. The editorial and production staff at Pearson Education in England and the US were supportive and helpful, and produced the book in record time. So thanks to Keith Mansfield, Patty Mahtani, Daniel Rausch, Carol Noble, and Sharon Burkhardt for their help and support.
Finally, I'd like to thank my family, who tolerated my absence when the book was being written and my frustration when the words were not flowing. A big thank- you to my wife, Anne, and daughters, Ali and Jane, for their help and support.
Ian Sommerville,
February 2004