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