本書是軟件工程的入門教材,系統(tǒng)地闡述了現(xiàn)代軟件開發(fā)過程、方法、技術(shù)以及相關(guān)工具,使讀者能夠全面掌握現(xiàn)代軟件工程的相關(guān)基礎(chǔ)知識以及軟件工程師所需要具備的基本實踐能力。 全書共分為10章,覆蓋了現(xiàn)代軟件工程的主要內(nèi)容,特別是需求分析、軟件設計、軟件構(gòu)造、軟件測試等。本書各章的順序按照軟件工程師的學習和成長過程進行編排,首先圍繞高質(zhì)量編碼所需的知識和能力進行介紹,然后逐漸過渡到更加抽象的軟件設計和需求分析等內(nèi)容。第1章介紹軟件工程的含義、發(fā)展歷程和重要思想。第2章介紹軟件過程模型、敏捷方法與精益思想以及開發(fā)運維一體化(DevOps)。第3章介紹軟件版本管理與開發(fā)任務管理。第4章介紹代碼質(zhì)量的含義以及高質(zhì)量編碼方法。第5章介紹軟件設計的整體內(nèi)容并具體介紹組件級詳細設計方法。第6章介紹組件級、框架級、平臺級三個層次上的軟件復用方法。第7章介紹軟件體系結(jié)構(gòu)的基本概念以及分布式軟件體系結(jié)構(gòu)和云原生軟件體系結(jié)構(gòu)。第8章介紹軟件需求分析方法、敏捷開發(fā)中的需求工程以及可信需求的含義。第9章介紹軟件測試方法以及相關(guān)工具。第10章介紹軟件持續(xù)集成、發(fā)布以及軟件構(gòu)建和依賴管理。 本書可作為高等院校計算機、軟件工程、人工智能、自動化等相關(guān)專業(yè)的本科生教材,也可供相關(guān)領(lǐng)域的專業(yè)技術(shù)人員參考。
教育學部高等學校軟件工程專業(yè)教學指導委員會推薦教材,以《高等學校軟件工程專業(yè)規(guī)范與知識體系》以及IEEE軟件工程知識體系(SWEBOK)為基礎(chǔ),在軟件構(gòu)造(Software Construction)知識和能力要求基礎(chǔ)上融入需求、設計、測試及團隊協(xié)作等方面的知識和能力要求。
本書具有以下特色:
1.在覆蓋經(jīng)典軟件工程方法與技術(shù)的同時突出體現(xiàn)了現(xiàn)代軟件工程在開發(fā)過程和技術(shù)上的特點,例如開發(fā)運維一體化以及持續(xù)集成與持續(xù)交付、演化式設計、軟件開發(fā)框架與平臺復用、分布式與云原生軟件體系結(jié)構(gòu)、敏捷開發(fā)需求分析等。
2.按照做中學的實踐化教學需要以及軟件工程師的成長過程進行教學內(nèi)容編排,從基本的協(xié)作開發(fā)和編碼能力開始,逐漸過渡到更加抽象的軟件設計和需求分析等內(nèi)容。
3.強化高質(zhì)量編碼與可信軟件開發(fā)的要求,體現(xiàn)現(xiàn)代軟件工程對于軟件工程師個人的質(zhì)量意識和可信軟件開發(fā)能力的要求。
4.華為公司軟件人才能力提升變革項目團隊參與編寫,融入華為多年來在信息通信領(lǐng)域積累的軟件開發(fā)方法、工具與相關(guān)實踐。
云計算、大數(shù)據(jù)、人工智能等技術(shù)的發(fā)展及ICT(Information and Communications Technology,信息與通信技術(shù))融合的趨勢推動著新的軟件應用形態(tài)、新的軟件開發(fā)技術(shù)及新的軟件開發(fā)過程不斷涌現(xiàn)。在應用形態(tài)方面,軟件以其極強的滲透性融入人們的日常生活,移動應用、小程序等網(wǎng)絡化應用成為主流,而通信、能源、交通等基礎(chǔ)設施也廣泛采用了軟件來實現(xiàn)數(shù)字化和智能化管理。在開發(fā)技術(shù)方面,以容器化和微服務為主要特征的云原生架構(gòu)及相關(guān)軟件技術(shù)成為越來越多軟件項目的選擇。在開發(fā)過程方面,敏捷方法已經(jīng)成為主流,開發(fā)運維一體化(DevOps)與持續(xù)集成、持續(xù)交付等實踐也得到了越來越多的應用,支撐這些新型開發(fā)流程與方法的云化開發(fā)平臺也逐漸成熟。
本書面向現(xiàn)代軟件工程所需要的基礎(chǔ)知識和基本能力進行介紹,在覆蓋經(jīng)典軟件工程方法與技術(shù)的同時突出體現(xiàn)了現(xiàn)代軟件工程在開發(fā)過程和方法上的特點,例如,開發(fā)運維一體化及持續(xù)集成與持續(xù)交付、演化式設計、軟件開發(fā)框架與平臺復用、分布式與云原生軟件體系結(jié)構(gòu)、敏捷開發(fā)需求分析等。此外,本書還強化了高質(zhì)量編碼與可信軟件開發(fā)的要求,體現(xiàn)了現(xiàn)代軟件工程對于軟件工程師個人的質(zhì)量意識和可信軟件開發(fā)能力的要求。
軟件工程課程具有很強的實踐性,所介紹的軟件開發(fā)過程、方法和技術(shù)都需要結(jié)合軟件開發(fā)實踐進行理解和掌握。然而,傳統(tǒng)的軟件工程教材一般都是按照軟件過程、軟件需求、軟件設計、軟件測試這樣的順序進行介紹,而且對于版本管理、編碼、構(gòu)建與依賴管理等軟件工程師的基本開發(fā)技能介紹較少。與之相對應的課程實踐項目往往花費了大量時間在需求分析、設計及相關(guān)的文檔撰寫上,對于編碼、構(gòu)建、測試等基本能力的實踐不夠并且缺少一個循序漸進的體驗過程。為此,我們與華為公司的軟件人員能力提升變革項目團隊一起合作,將華為多年來在ICT領(lǐng)域積累的軟件開發(fā)方法、工具與相關(guān)實踐融入軟件工程課程,并按照軟件工程師的學習和成長過程對相關(guān)內(nèi)容重新進行了編排,首先圍繞高質(zhì)量編碼所需的知識和能力進行介紹,然后逐漸過渡到更加抽象的軟件設計和需求分析等內(nèi)容。
建議通過本書學習軟件工程的讀者在按順序?qū)W習各章內(nèi)容的同時,能夠圍繞一個迭代化的軟件開發(fā)項目逐步體驗軟件工程師的成長過程: 在初步理解軟件開發(fā)過程以及版本和任務管理的基礎(chǔ)上,首先能夠高質(zhì)量地實現(xiàn)比較小的代碼單元(例如一個類),然后能夠完成涉及多個類的局部軟件設計并掌握一些常用的軟件復用手段,接著了解更高層面上的軟件體系結(jié)構(gòu)特別是分布式軟件體系結(jié)構(gòu)設計,后理解軟件需求并掌握常用的需求分析方法。此外,完整的軟件產(chǎn)品交付必須有相應的質(zhì)量保障及交付過程支持,因此還需要學習并體驗軟件測試方法和技術(shù),并了解軟件產(chǎn)品是如何進行集成和發(fā)布的。
本書由復旦大學計算機科學技術(shù)學院CodeWisdom團隊與華為公司軟件人員能力提升變革項目團隊合作撰寫完成。其中,彭鑫負責第1章及第5~8章的編寫,同時負責全書的修改及統(tǒng)稿; 游依勇負責第3~4章的編寫,并基于華為軟件開發(fā)經(jīng)驗進行了全書企業(yè)實踐內(nèi)容的歸納和總結(jié); 趙文耘負責第2章及第9~10章的編寫。除了三位作者外,復旦大學計算機科學技術(shù)學院CodeWisdom團隊的吳毅堅、沈立煒、陳碧歡以及華為公司軟件人員能力提升項目團隊的趙亮、呂新平、王書建、紀朋、錢逢兵、李春華、吳剛等也參加了部分章節(jié)的編寫和評審工作,為本書的出版做出了巨大的貢獻,在此一并表示感謝。
為方便教師教學和學生學習,本書還配套教學課件、教學視頻、示例代碼和課程實踐等資源,讀者可在清華大學出版社官網(wǎng)該書主頁下載。
感謝清華大學出版社的大力支持以及在本書撰寫過程中的細心指導!同時還要感謝教育學部高等學校軟件工程專業(yè)教學指導委員會、全國高等學校計算機教育研究會、復旦大學計算機科學技術(shù)學院的領(lǐng)導和老師們對本書的大力支持!
由于作者水平有限,書中難免有不足和疏漏之處,懇請廣大讀者批評指正!
作者2021年12月
彭鑫 復旦大學計算機科學技術(shù)學院副院長、軟件學院副院長、教授、博士生導師,中國計算機學會軟件工程專委會副主任,Journal of Software: Evolution and Process聯(lián)合主編,ACM Transactions on Software Engineering and Methodology等期刊編委。研究方向包括軟件智能化開發(fā)與運維、泛在計算軟件系統(tǒng)等。
游依勇 華為技術(shù)有限公司軟件工程學院院長,在軟件開發(fā)、產(chǎn)品線總裁、人才培養(yǎng)、產(chǎn)業(yè)管理、生態(tài)建設等崗位具有20多年的工作經(jīng)驗,曾獲得國家科學技術(shù)進步獎和中國電子學會科學技術(shù)獎一等獎。
趙文耘 復旦大學計算機科學技術(shù)學院教授、博士生導師。研究方向為軟件工程、企業(yè)信息化。曾獲國家科技進步二等獎、電子工業(yè)部科技進步特等獎、上海市科技進步二等獎、上海市教學成果二等獎等多項和省部級獎項。
第1章軟件工程概述
1.1軟件的產(chǎn)生與發(fā)展
1.2軟件工程的含義
1.3軟件工程的系統(tǒng)觀與演化觀
1.4軟件工程師的社會責任
1.5本書的內(nèi)容結(jié)構(gòu)
小結(jié)
第2章軟件過程
2.1軟件過程概述
2.1.1基本概念和發(fā)展歷史
2.1.2軟件生存周期過程標準
2.1.3軟件過程模型
2.1.4軟件過程改進
2.2敏捷方法與精益思想
2.2.1敏捷方法
2.2.2精益思想
2.2.3敏捷實踐方法論
2.3開發(fā)運維一體化
2.3.1概覽
2.3.2基本原則和技術(shù)實踐
2.3.3持續(xù)集成、持續(xù)交付和持續(xù)部署
小結(jié)
第3章版本與開發(fā)任務管理
3.1版本與開發(fā)任務管理概述
3.1.1配置管理概述
3.1.2版本發(fā)布計劃
3.2版本管理
3.2.1產(chǎn)品版本號命名
3.2.2代碼版本管理
3.2.3代碼分支與基線管理
3.3特性開發(fā)任務管理
3.3.1特性描述
3.3.2特性開發(fā)任務管理流程
3.3.3變更管理流程
3.4缺陷修復過程管理
3.4.1缺陷描述
3.4.2缺陷修復處理流程
3.5基于追蹤與回溯的工作量與質(zhì)量分析
3.5.1基于追蹤的分析
3.5.2基于回溯的分析
小結(jié)
第4章高質(zhì)量編碼
4.1代碼質(zhì)量概述
4.1.1代碼質(zhì)量的含義
4.1.2可理解性和可維護性
4.1.3可靠性和信息安全性
4.1.4高效性
4.1.5可移植性
4.2代碼風格
4.2.1標識符命名
4.2.2排版格式
4.2.3注釋
4.3代碼邏輯
4.3.1代碼編寫的基本要求
4.3.2重復代碼問題
4.3.3代碼復雜度問題
4.3.4高質(zhì)量的子程序
4.4安全與可靠性編碼
4.4.1數(shù)據(jù)驗證
4.4.2代碼邏輯問題
4.4.3錯誤處理
4.4.4斷言
4.4.5異常處理
4.4.6安全編程函數(shù)
4.5代碼質(zhì)量控制
4.5.1個人測試與調(diào)試
4.5.2代碼靜態(tài)檢查與質(zhì)量門禁
4.5.3代碼評審
4.5.4代碼質(zhì)量度量
4.6測試驅(qū)動開發(fā)
4.6.1TDD的概念與優(yōu)勢
4.6.2TDD的過程與原則
4.6.3TDD中的單元測試
小結(jié)
第5章軟件設計
5.1軟件設計概述
5.1.1軟件設計目標
5.1.2軟件設計層次
5.1.3軟件設計思想
5.2面向?qū)ο笤O計
5.2.1面向?qū)ο笤O計過程
5.2.2面向?qū)ο笤O計描述
5.2.3內(nèi)聚和耦合
5.2.4面向?qū)ο笤O計原則
5.2.5面向切面的編程
5.3契約式設計
5.4設計模式
5.5演化式設計
5.5.1演化式設計與計劃設計
5.5.2代碼壞味道
5.5.3軟件重構(gòu)
小結(jié)
第6章軟件復用
6.1軟件復用概述
6.1.1軟件復用概念
6.1.2軟件復用層次
6.1.3軟件復用過程
6.1.4軟件產(chǎn)品線
6.1.5開源軟件復用
6.2組件級復用
6.2.1軟件開發(fā)庫復用
6.2.2在線服務復用
6.2.3接口描述規(guī)范
6.3框架級復用
6.4平臺級復用
6.4.1典型平臺能力
6.4.2基于平臺的應用開發(fā)過程
6.5基于復用的軟件開發(fā)案例
6.5.1后端服務開發(fā)
6.5.2前端We碼小程序開發(fā)
小結(jié)
第7章軟件體系結(jié)構(gòu)
7.1軟件體系結(jié)構(gòu)概述
7.2軟件體系結(jié)構(gòu)決策
7.3軟件體系結(jié)構(gòu)描述
7.4軟件體系結(jié)構(gòu)風格
7.5分布式軟件體系結(jié)構(gòu)
7.5.1設計原則
7.5.2進程間通信
7.5.3負載均衡
7.5.4分布式存儲
7.5.5可靠性保障
7.6云原生軟件體系結(jié)構(gòu)
7.6.1微服務體系結(jié)構(gòu)
7.6.2微服務開發(fā)框架
7.6.3容器化部署
小結(jié)
第8章軟件需求
8.1軟件需求概述
8.1.1需求的含義及其來源
8.1.2需求的類型
8.1.3需求工程過程
8.1.4需求的質(zhì)量要求
8.1.5系統(tǒng)需求與軟件需求
8.2需求分解和精化
8.2.1系統(tǒng)愿景與上下文
8.2.2愿景與目標分解和精化
8.2.3優(yōu)先級排序
8.2.4沖突識別與協(xié)商
8.3需求分析與描述
8.3.1場景分析與描述
8.3.2類分析與描述
8.3.3行為分析與描述
8.3.4需求文檔
8.4敏捷開發(fā)中的需求工程
8.5軟件可信需求
小結(jié)
第9章軟件測試
9.1軟件測試概念與原則
9.1.1軟件質(zhì)量事故
9.1.2軟件測試概念
9.1.3軟件測試原則
9.2軟件測試過程模型
9.2.1V模型
9.2.2W模型
9.2.3敏捷測試模型
9.3軟件測試類型
9.3.1單元測試
9.3.2集成測試
9.3.3系統(tǒng)測試
9.3.4驗收測試
9.4黑盒軟件測試方法
9.4.1等價類劃分法
9.4.2邊界值分析法
9.4.3判定表
9.4.4錯誤推測法
9.5白盒軟件測試方法
9.6系統(tǒng)測試技術(shù)與工具
9.6.1功能測試
9.6.2性能測試
9.6.3兼容性測試
9.6.4易用性測試
9.6.5可靠性測試
9.6.6信息安全測試
小結(jié)
第10章軟件集成與發(fā)布
10.1軟件集成與發(fā)布概述
10.1.1持續(xù)集成與發(fā)布的前置條件
10.1.2持續(xù)集成與發(fā)布的價值
10.1.3云化與本地持續(xù)集成與發(fā)布
10.2持續(xù)集成
10.2.1集成過程
10.2.2持續(xù)集成的實踐
10.2.3持續(xù)集成的自動化支持工具
10.2.4軟件構(gòu)建
10.3軟件發(fā)布
10.3.1軟件發(fā)布的反模式與基本原則
10.3.2藍綠部署
10.3.3金絲雀發(fā)布
10.3.4暗發(fā)布
10.4部署流水線
10.4.1部署流水線概述
10.4.2華為軟件開發(fā)云中的部署流水線
小結(jié)
參考文獻