本書是軟件工程領(lǐng)域的經(jīng)典教材,自1982年第1版出版至今,伴隨著軟件工程學(xué)科的發(fā)展不斷更新,影響了一代又一代的軟件工程人才,對(duì)學(xué)科建設(shè)也產(chǎn)生了積極影響。全書共四個(gè)部分,完整討論了軟件工程各個(gè)階段的內(nèi)容,是軟件工程相關(guān)專業(yè)本科生和研究生的教材,也是軟件工程師必備的參考書籍。
軟件工程在過去50年之中取得了令人矚目的進(jìn)展。我們的社會(huì)已經(jīng)無法在缺少大型的專業(yè)化軟件系統(tǒng)的情況下正常運(yùn)轉(zhuǎn)了。國(guó)家的公用事業(yè)和基礎(chǔ)設(shè)施(如能源、通信、交通)全都依賴于復(fù)雜和可靠的計(jì)算機(jī)系統(tǒng)。軟件使得我們可以探索空間,并創(chuàng)造了萬維網(wǎng)這一人類歷史上最重要的信息系統(tǒng)。智能手機(jī)和平板電腦無處不在,而為這些設(shè)備開發(fā)軟件的整個(gè)“應(yīng)用開發(fā)產(chǎn)業(yè)”已經(jīng)在過去幾年中悄然形成。
人類現(xiàn)在正面臨著一系列迫切的挑戰(zhàn):氣候變化和極端天氣、自然資源的減少、需要為更多的人口提供食物和住房、國(guó)際恐怖主義的威脅,以及為老年人提供令人滿意的生活的要求。我們需要新技術(shù)來幫助我們應(yīng)對(duì)這些挑戰(zhàn),可以肯定的是軟件將在這些技術(shù)中扮演核心角色。因此,軟件工程對(duì)于我們?cè)谶@個(gè)星球上的未來極其重要。我們必須繼續(xù)培養(yǎng)軟件工程師并推動(dòng)軟件工程學(xué)科的持續(xù)發(fā)展,從而滿足開發(fā)更多的軟件系統(tǒng)以及創(chuàng)造我們所需要的越來越復(fù)雜的未來系統(tǒng)的需要。
當(dāng)然,軟件項(xiàng)目還存在很多問題。系統(tǒng)仍然有時(shí)會(huì)延遲交付并且成本超支。我們正在創(chuàng)造越來越復(fù)雜的軟件系統(tǒng)之系統(tǒng)(software systems of systems),在這條道路上遇到各種困難也是不足為奇的。然而,我們不應(yīng)該讓這些問題掩蓋軟件工程領(lǐng)域已經(jīng)取得的巨大成就以及所形成的各種令人印象深刻的軟件工程方法和技術(shù)。
本書的不同版本已經(jīng)有超過30年的歷史。這一版同樣遵循了在本書第1版中所建立的基本原則:按照工業(yè)界實(shí)踐介紹軟件工程,不對(duì)任何特定的方法(例如敏捷開發(fā)、形式化方法)持傾向性態(tài)度。在現(xiàn)實(shí)中,工業(yè)界往往將各種技術(shù)(例如敏捷以及基于計(jì)劃的開發(fā))混合在一起使用,這一點(diǎn)也在本書中有所反映。
根據(jù)我所知道的和所理解的知識(shí)來介紹軟件工程。我得到過很多關(guān)于增加并詳細(xì)介紹其他相關(guān)話題的建議,例如開源軟件開發(fā)、UML的使用以及移動(dòng)軟件工程等。但是我對(duì)這些領(lǐng)域了解得并不夠多。我個(gè)人的工作主要是在系統(tǒng)可靠性和系統(tǒng)工程方面,這一點(diǎn)在我為本書所選擇的高級(jí)主題中有所反映。
我認(rèn)為現(xiàn)代軟件工程的關(guān)鍵問題是管理復(fù)雜性,將敏捷和其他方法結(jié)合起來,并確保系統(tǒng)是安全的且有韌性的。這些問題是促使我在這一版中修改和新增內(nèi)容的驅(qū)動(dòng)力。
對(duì)第9版的更新這一版對(duì)第9版的更新內(nèi)容匯總?cè)缦拢喝娓铝岁P(guān)于敏捷軟件工程的章節(jié),增加了關(guān)于Scrum的新內(nèi)容。此外還根據(jù)需要對(duì)其他章節(jié)進(jìn)行了更新以反映敏捷方法在軟件工程中日益增長(zhǎng)的應(yīng)用。
增加了關(guān)于韌性工程、系統(tǒng)工程、系統(tǒng)之系統(tǒng)的新章節(jié)。
對(duì)于涉及可靠性、安全性、信息安全性的三章進(jìn)行了徹底的重新組織。
在面向服務(wù)的軟件工程一章中增加了關(guān)于RESTful服務(wù)的新內(nèi)容。
更新和修改了關(guān)于配置管理的章節(jié),增加了關(guān)于分布式版本控制系統(tǒng)的新內(nèi)容。
將關(guān)于面向方面的軟件工程以及過程改進(jìn)的章節(jié)從本書的紙質(zhì)版移到了網(wǎng)站上。
在網(wǎng)站上新增了補(bǔ)充材料,包括一系列教學(xué)視頻。我在視頻中對(duì)于一些關(guān)鍵話題進(jìn)行了解釋并且推薦了相關(guān)的YouTube視頻。
這一版保留了本書在此前版本中采用的四部分結(jié)構(gòu),但我對(duì)其中每個(gè)部分都進(jìn)行了大量的修改。
在第一部分軟件工程導(dǎo)論中,我徹底重寫了第3章(敏捷方法)并對(duì)其進(jìn)行了更新以反映Scrum方法在實(shí)踐中日益增長(zhǎng)的應(yīng)用。第1章中增加了一個(gè)關(guān)于數(shù)字化學(xué)習(xí)環(huán)境的案例研究,這個(gè)案例在其他幾章中也有用到。第9章更加詳細(xì)地介紹了遺留系統(tǒng)。所有其他章節(jié)都進(jìn)行了少量的修改和更新。
第二部分介紹系統(tǒng)可依賴性,這部分進(jìn)行了修改和重新組織。原來采用的面向活動(dòng)的組織方式使得與安全性、信息安全性、可靠性相關(guān)的信息分散在多個(gè)章節(jié)中,而重新組織之后,安全性、信息安全性、可靠性各屬于一章。這使得相關(guān)內(nèi)容(例如信息安全性)可以更加方便地作為獨(dú)立的專題在更加綜合性的課程中使用。我增加了一個(gè)全新的關(guān)于韌性工程的章節(jié),其中涉及網(wǎng)絡(luò)安全、組織韌性以及韌性系統(tǒng)設(shè)計(jì)。
第三部分增加了關(guān)于系統(tǒng)工程、系統(tǒng)之系統(tǒng)的新章節(jié),并對(duì)與面向服務(wù)的系統(tǒng)工程相關(guān)的內(nèi)容進(jìn)行了全面修改以反映RESTful服務(wù)的應(yīng)用增長(zhǎng)趨勢(shì)。面向方面的軟件工程相關(guān)的章節(jié)從本書的紙質(zhì)版中移除,但在網(wǎng)站上作為在線章節(jié)保留。
第四部分對(duì)配置管理相關(guān)的內(nèi)容進(jìn)行了更新以反映分布式版本控制工具(如Git)的日益普及。過程改進(jìn)相關(guān)的章節(jié)從本書的紙質(zhì)版中移除,但在網(wǎng)站上作為在線章節(jié)保留。
本書補(bǔ)充材料中的一個(gè)重要變化是為每個(gè)章節(jié)增加了視頻。我制作了關(guān)于一系列不同主題的40多段視頻,放在我的YouTube頻道上,并在本書網(wǎng)頁(yè)上提供鏈接。對(duì)于沒有制作視頻的地方,我推薦了一些可能有用的YouTube視頻。
我在下面這個(gè)視頻中解釋了我在這一版中所做的修改背后的原因:http://iansommerville.com/software-engineering-book/videos/10th-edition-changes-2/。
讀者對(duì)象本書主要面向各大學(xué)和學(xué)院里正在學(xué)習(xí)軟件和系統(tǒng)工程的初高級(jí)課程的學(xué)生。我假設(shè)讀者對(duì)于編程基礎(chǔ)和基本數(shù)據(jù)結(jié)構(gòu)都已有所理解。
工業(yè)界的軟件工程師們也會(huì)發(fā)現(xiàn)它是一本很好的讀物,能幫助他們?cè)谲浖䦶?fù)用、體系結(jié)構(gòu)設(shè)計(jì)、可依賴性和信息安全性以及系統(tǒng)工程等方面獲得新的知識(shí)。
教學(xué)建議針對(duì)三種不同類型的軟件工程課程,我對(duì)本書進(jìn)行了如下設(shè)計(jì):軟件工程一般導(dǎo)論課程。本書的第一部分專門用于一個(gè)學(xué)期的軟件工程導(dǎo)論課程。這部分包括9章,涵蓋了軟件工程領(lǐng)域的基礎(chǔ)內(nèi)容。如果你的課程中包含實(shí)踐性教學(xué)環(huán)節(jié),那么可以選講第四部分中關(guān)于管理的章節(jié)。
軟件工程特定主題的導(dǎo)論課程或進(jìn)階課程。通過使用本書第二~四部分的內(nèi)容,可以創(chuàng)建一系列更高級(jí)的課程。例如,我采用第二部分的各章加上關(guān)于系統(tǒng)工程和質(zhì)量管理的兩章來講授以關(guān)鍵系統(tǒng)為主題的課程。而對(duì)于討論軟件密集型系統(tǒng)的課程,我選擇的章節(jié)涉及系統(tǒng)工程、需求工程、系統(tǒng)之系統(tǒng)、分布式軟件工程、嵌入式軟件、項(xiàng)目管理和項(xiàng)目計(jì)劃。
軟件工程特定主題的更高階課程。對(duì)于這類課程,本書的各章可以構(gòu)成課程的基礎(chǔ),然后輔之以更多的閱讀以便進(jìn)一步探索某個(gè)主題。例如,關(guān)于軟件復(fù)用的課程就可以基于第15~18章的內(nèi)容。
用書教師可以訪問培生網(wǎng)站獲取相關(guān)教輔資源,網(wǎng)址為http://www.pearsonhighered.com/sommerville。部分資源為加密內(nèi)容,可在網(wǎng)站上通過注冊(cè)來獲取密碼。教輔資源包括:部分章末練習(xí)題的答案。
每章的測(cè)驗(yàn)題目及答案。
配套網(wǎng)站本書采用紙質(zhì)圖書和在線網(wǎng)站內(nèi)容相結(jié)合的方式,其中紙質(zhì)書的核心信息可以鏈接到網(wǎng)站上的補(bǔ)充材料。有些章節(jié)包含特別編寫的“在線段落”以提供更多的信息。網(wǎng)站上還有6個(gè)在線章節(jié),介紹了幾個(gè)紙質(zhì)版中未涉及的主題。
讀者可以從本書網(wǎng)站software-engineering-book.com下載各種豐富的補(bǔ)充材料,包括:本書所有章節(jié)的PowerPoint幻燈片。
我所錄制的針對(duì)一系列軟件工程主題的視頻,我還推薦了一些有助于學(xué)習(xí)本書內(nèi)容的YouTube視頻。
針對(duì)課程教師的指南,其中給出了在教授不同課程過程中如何使用本書的建議。
關(guān)于本書中案例研究(胰島素泵、心理健康護(hù)理系統(tǒng)、野外氣象站系統(tǒng)、數(shù)字化學(xué)習(xí)系統(tǒng))的附加信息,以及其他一些案例研究(例如阿麗亞娜5型發(fā)射器失效故障)。
6個(gè)在線章節(jié)介紹了過程改進(jìn)、形式化方法、交互設(shè)計(jì)、應(yīng)用體系結(jié)構(gòu)、文檔化以及面向方面的開發(fā)。
為每個(gè)章節(jié)提供補(bǔ)充內(nèi)容的在線段落,這些在線段落可以通過每一章中用方框突出顯示的鏈接來訪問。
一些附加的涉及一系列系統(tǒng)工程主題的PowerPoint幻燈片。
應(yīng)讀者的要求,我已經(jīng)在本書的網(wǎng)站上發(fā)布了其中一個(gè)系統(tǒng)案例研究的完整需求規(guī)格說明。對(duì)于學(xué)生而言,獲得這種文檔并理解其結(jié)構(gòu)和復(fù)雜性有些困難。為了避免保密問題,我對(duì)這個(gè)來自于真實(shí)系統(tǒng)的需求文檔進(jìn)行了再工程,因此使用該文檔沒有任何限制。
聯(lián)系信息網(wǎng)站 software-engineering-book.com郵件名字:software.engineering.book;域名:gmail.com博客iansommerville.com/systems-software-and-technologyYouTubeyoutube.com/user/SoftwareEngBookFacebookfacebook.com/sommerville.software.engineeringTwitter@SoftwareEngBook 或者 @iansommerville(有一些更廣泛的推文)歡迎在Twitter或Facebook上關(guān)注我以及時(shí)獲得關(guān)于軟件和系統(tǒng)工程的新材料和新評(píng)論。
致謝多年以來許多人都對(duì)本書的成長(zhǎng)做出了貢獻(xiàn),在此我想感謝每一位曾經(jīng)評(píng)論過本書之前的版本并且給出了建設(shè)性意見的人(審閱人、學(xué)生、讀者)。我想特別感謝我的家人Anne、Ali和Jane,感謝他們?cè)谖揖帉懕緯ㄒ约按饲八邪姹荆┻^程中給予我的愛、幫助和支持。
Ian Sommerville2014年9月
Contents
Part1 Introduction to Software Engineering 01
Chapter 1 Introduction 03
1.1 Professional software development 05
1.2 Software engineering ethics 14
1.3 Case studies 17
Chapter 2 Software processes 29
2.1 Software process models 31
2.2 Process activities 40
2.3 Coping with change 47
2.4 Process improvement 51
Chapter 3 Agile software development 58
3.1 Agile methods 61
3.2 Agile development techniques 63
3.3 Agile project management 70
3.4 Scaling agile methods 74
Chapter 4 Requirements engineering 87
4.1 Functional and non-functional requirements 91
4.2 Requirements engineering processes 97
4.3 Requirements elicitation 98
4.4 Requirements specification 106
4.5 Requirements validation 115
4.6 Requirements change 116
Chapter 5 System modeling 124
5.1 Context models 127
5.2 Interaction models 130
5.3 Structural models 135
5.4 Behavioral models 140
5.5 model-driven architecture 145
Chapter 6 Architectural design 153
6.1 Architectural design decisions 157
6.2 Architectural views 159
6.3 Architectural patterns 161
6.4 Application architectures 170
Chapter 7 Design and implementation 182
7.1 Object-oriented design using the UmL 184
7.2 Design patterns 195
7.3 Implementation issues 198
7.4 Open-source development 205
Chapter 8 Software testing 212
8.1 Development testing 217
8.2 Test-driven development 228
8.3 Release testing 231
8.4 User testing 235
Chapter 9 Software evolution 241
9.1 Evolution processes 244
9.2 Legacy systems 247
9.3 Software maintenance 256
Part 2 System Dependability and Security 269
Chapter 10 Dependable systems 271
10.1 Dependability properties 274
10.2 Sociotechnical systems 277
10.3 Redundancy and diversity 281
10.4 Dependable processes 283
10.5 Formal methods and dependability 285
Chapter 11 Reliability engineering 292
11.1 Availability and reliability 295
11.2 Reliability requirements 298
11.3 Fault-tolerant architectures 304
11.4 Programming for reliability 311
11.5 Reliability measurement 317
Chapter 12 Safety engineering 325
12.1 Safety-critical systems 327
12.2 Safety requirements 330
12.3 Safety engineering processes 338
12.4 Safety cases 347
Chapter 13 Security engineering 359
13.1 Security and dependability 362
13.2 Security and organizations 366
13.3 Security requirements 368
13.4 Secure systems design 374
13.5 Security testing and assurance 388
Chapter 14 Resilience engineering 394
14.1 Cybersecurity 398
14.2 Sociotechnical resilience 402
14.3 Resilient systems design 410
Part 3 Advanced Software Engineering 421
Chapter 15 Software reuse 423
15.1 The reuse landscape 426
15.2 Application frameworks 429
15.3 Software product lines 432
15.4 Application system reuse 439
Chapter 16 Component-based software engineering 450
16.1 Components and component models 453
16.2 CBSE processes 459
16.3 Component composition 466
Chapter 17 Distributed software engineering 476
17.1 Distributed systems 478
17.2 Client–server computing 485
17.3 Architectural patterns for distributed systems 487
17.4 Software as a service 498
Chapter 18 Service-oriented software engineering 506
18.1 Service-oriented architecture 510
18.2 RESTful services 515
18.3 Service engineering 519
18.4 Service composition 527
Chapter 19 Systems engineering 537
19.1 Sociotechnical systems 542
19.2 Conceptual design 549
19.3 System procurement 552
19.4 System development 556
19.5 System operation and evolution 560
Chapter 20 Systems of systems 566
20.1 System complexity 570
20.2 Systems of systems classification 573
20.3 Reductionism and complex systems 576
20.4 Systems of systems engineering 579
20.5 Systems of systems architecture 585
Chapter 21 Real-time software engineering 596
21.1 Embedded system design 599
21.2 Architectural patterns for real-time software 606
21.3 Timing analysis 612
21.4 Real-time operating s