Roger Pressman:software Engineering——a Practitioner’s Approach@2014 (第8版)

軟件工程基礎概念與過程模型解釋

本文摘錄並闡述了《軟件工程:實踐者方法(第八版)》序言及第一至第六章的核心論點,旨在深入解析軟件工程的基本概念、過程結構及不同模型的特點。

序言:軟件工程的重要性與本書定位

軟件工程,作為一門學科,其核心目標是建構高品質的電腦軟件並長期維護它。當軟件成功時,它能帶來正向的改變;而當它失敗時,則可能導致嚴重的後果。因此,在設計與建構軟件時,必須應用工程學的方法與紀律。這本書旨在為軟件工程領域的學生和從業人員提供一本指南,幫助他們理解並實踐這些必要的紀律。

軟件工程學科在過去幾十年中已從一個小眾概念演變成一門被廣泛認可的領域,儘管在具體的實踐方法上仍有爭議。許多組織在開發軟件時仍缺乏系統性的方法,這直接影響了軟件的品質。本書第八版在內容和結構上進行了修訂,以提升教學流暢性並強調新的重要過程與實踐,特別是關於敏捷方法Web 與行動應用程式,並擴充了品質管理專案管理的內容。配套的網站和線上資源也極大豐富了學習和教學的體驗。

第一章:軟件的本質

軟件在本質上扮演著雙重角色:它既是一種產品本身(提供期望的功能和效能),也是交付其他產品的載體(例如作業系統、網絡軟件、開發工具)。軟件與硬體不同,它不會因環境因素而「磨損」,但它會因變更劣化。每一次變更都可能引入新的錯誤,導致故障率上升,長此以往會使軟件結構複雜、難以維護。

當前,軟件廣泛應用於七大領域:
1. 系統軟件:用於服務其他程式,處理複雜或不確定的信息結構(如編譯器、作業系統元件)。
2. 應用軟件:獨立程式,解決特定商業需求(如辦公套件)。
3. 工程/科學軟件:處理大量數值計算的程式(如CAE、氣象軟件)。
4. 嵌入式軟件:內嵌在產品或系統中,用於控制產品功能(如汽車控制系統、微波爐控制)。
5. 產品線軟件:為許多不同客戶提供特定功能的軟件(如庫存管理軟件)。
6. Web/行動應用程式:基於網絡或行動裝置的應用程式,涵蓋廣泛的功能。
7. 人工智能軟件:使用非數值算法解決複雜問題(如機器人、專家系統)。

遺留軟件是已經開發了數十年並持續修改以應對需求的軟件,它們往往支撐著核心業務功能,但可能設計不良、缺乏文件、難以維護和演進。當需要進行顯著變更時,這些系統需要被再工程(reengineering)以維持其長期可用性。現代軟件工程方法應建立在軟件系統會持續演進的基礎上。

軟件的性質持續變化,新的軟件形態,如 Web 應用程式 (WebApps)行動應用程式 (MobileApps)雲端計算,正主導著行業的發展,並為軟件工程帶來新的挑戰。同時,軟件產品線的概念強調從一套通用的核心資產開發一系列相關產品,以提高效率。

第二章:軟件工程

軟件工程被定義為將系統化、紀律化、可量化的方法應用於軟件的開發、操作和維護。它是一種分層技術:最底層是品質焦點,之上是作為基礎的過程層,再往上是提供技術方法的方法層,最頂層是提供自動化支援的工具層

軟件過程是構建高品質軟件所需活動、行動和任務的集合。過程框架定義了適用於所有軟件專案的基本框架活動
1. 溝通 (Communication):與客戶和其他利害關係人建立聯繫,理解需求。
2. 規劃 (Planning):創建專案計劃,定義任務、風險、資源、排程和產出。
3. 建模 (Modeling):建立模型以更好地理解需求和設計解決方案。
4. 建構 (Construction):包括程式碼生成和測試以發現錯誤。
5. 部署 (Deployment):將軟件交付給客戶,並根據回饋進行調整。

這些活動可以迭代應用。傘形活動 (Umbrella Activities),如專案追蹤與控制、風險管理、軟件品質保證、技術審查、度量、配置管理、可重用性管理和工作產品準備,貫穿整個過程,提供管理和控制支援。軟件過程需要適應性,根據專案、團隊和組織文化進行調整。

軟件工程實踐的核心是解決問題,遵循喬治·波利亞提出的四個步驟:理解問題、規劃解決方案、執行計劃、檢查結果。這是一種常識性的方法。軟體工程實踐由一系列核心原則指導,包括:以使用者價值為中心(KISS原則)、保持願景、理解產品的使用者、擁抱未來、規劃重用以及思考

軟件開發中存在一些迷思,如「只憑目標描述就足夠開始寫程式」、「軟件靈活易於變更」、「完成程式碼就大功告成」、「程式碼執行後才能評估品質」、「只有程式碼是可交付成果」、「軟件工程會增加文件負擔並降低速度」。這些迷思可能導致錯誤的期望和專案問題,需要被認清並糾正。

第三章:軟件過程結構

軟件過程是一個框架,定義了構建高品質軟件所需的活動、行動和任務。每個框架活動由一系列軟件工程行動組成,每個行動則由一個任務集定義,包含需完成的工作任務、產出的工作產品、品質保證點和專案里程碑。

過程流 (Process Flow) 描述了框架活動和其包含的行動與任務在順序和時間上的組織方式,可以是線性、迭代、演化或并行。不同的專案需要不同的任務集和過程流。

過程模式 (Process Patterns) 描述了軟件工程中遇到的重複過程問題及其解決方案。模式提供了一個模板來描述問題解決方案,可以幫助軟件團隊構建最適合專案需求的過程。過程模式分為階段模式(框架活動層級)、任務模式(行動或任務層級)和階段模式(過程流層級)。

過程評估與改進 (Process Assessment and Improvement, SPI) 旨在確保過程滿足基本標準。評估方法(如 SCAMPI、CBA IPI、SPICE、ISO 9000)用於評估組織的過程成熟度,並據此制定改進策略。

第四章:過程模型

規程型過程模型 (Prescriptive Process Models) 強調軟件開發的結構和順序,儘管軟件世界充滿變化,這些模型仍提供有用的指導:
* 瀑布模型 (Waterfall Model):系統化、順序性方法,適用於需求明確且穩定的專案。其變體 V 模型強調驗證與確認活動與開發活動的關聯。缺點是難以應對需求變更,且產品交付較晚。
* 增量過程模型 (Incremental Process Models):結合線性與演化流程,分階段交付軟件增量。適用於需求明確但範圍大,且需要快速交付部分功能的專案。
* 演化過程模型 (Evolutionary Process Models):通過多次迭代開發更完整的軟件版本。
* 原型法 (Prototyping):適用於需求模糊時,快速構建原型以釐清需求。原型可能被拋棄或演化。
* 螺旋模型 (Spiral Model):結合迭代的性質和系統性的特點,強調風險分析。適用於大型、高風險專案。

專門化過程模型 (Specialized Process Models) 則針對特定情況:
* 基於元件的開發 (Component-Based Development):強調從現有可重用元件組裝軟件。
* 形式化方法模型 (Formal Methods Model):應用數學方法進行軟件規範和驗證,旨在減少缺陷,但成本高、需要專業技能。
* 面向切面的軟件開發 (Aspect-Oriented Software Development, AOSD):處理跨越系統多個功能的關注點(如安全性、容錯性)。

統一過程 (Unified Process, UP) 是一種迭代、增量的過程模型,強調使用案例驅動和架構中心。它有五個階段:初始 (Inception)詳盡 (Elaboration)建構 (Construction)轉移 (Transition)生產 (Production)。UP 旨在整合傳統方法的優點和敏捷開發的原則。

個人與團隊過程模型 (Personal and Team Process Models, PSP/TSP) 強調個人的紀律化和團隊的自我管理。PSP 注重個人度量和規劃,TSP 則關注團隊的協作、度量和持續改進。

第五章:敏捷開發

敏捷性 (Agility) 指的是快速應對變化的能力。敏捷軟件開發強調個人與互動可工作的軟件客戶協作響應變更。敏捷過程的目標是降低變更成本,通過頻繁交付軟件增量和持續回饋來適應需求變化。

敏捷過程基於一些原則,包括:客戶滿意、擁抱變更、頻繁交付、業務人員與開發者協作、圍繞有動力的個體構建專案、面對面溝通、可工作的軟件是主要衡量標準、持續的技術卓越和良好設計、簡潔性、自組織團隊、定期反思與調整。

極限程式設計 (Extreme Programming, XP) 是最廣泛使用的敏捷方法:
* 規劃:通過使用者故事、價值、成本和排程來規劃發布。
* 設計:遵循 KISS 原則,使用 CRC 卡片,強調重構。
* 編碼:先寫單元測試,實行結對編程,持續集成。
* 測試:單元測試、驗收測試。
* 工業 XP (IXP) 加入了更多管理和技術實踐以適應大型組織。

其他敏捷過程模型包括:
* Scrum:強調自組織團隊和衝刺 (sprints),使用產品待辦事項、每日 Scrum 會議和演示來管理專案。
* 動態系統開發方法 (DSDM):基於迭代和增量原型,遵循 80/20 原則。
* 敏捷建模 (Agile Modeling, AM):強調建模和文件的實踐,遵循模型有目的、使用多種模型、輕裝上陣、內容重於形式等原則。
* 敏捷統一過程 (AUP):結合 UP 的階段性結構和敏捷方法的迭代和輕量級實踐。

第六章:軟件工程的人為因素

軟件工程的成功不僅取決於技術,也高度依賴於的因素。一個有效的軟體工程師應具備個人責任感、意識、誠實、韌性、公平、注重細節、務實等特質。

軟件工程的心理學模型分層考慮個體認知、團隊動態和組織行為。團隊成員可以扮演不同的邊界擴展角色(如大使、偵察員、守衛、哨兵、協調員)來促進與外部和內部其他團隊的溝通與協作。

軟件團隊的關鍵在於能否形成一個「融洽的團隊」(jelled team),其整體大於部分之和。融洽的團隊具有共同的目標、高度的信任和協作。團隊失敗的「毒性因素」包括:忙亂的氛圍、高挫折感、支離破碎的過程、角色不明確以及持續的失敗。理解並尊重團隊成員的人際特質差異也很重要。

團隊結構取決於組織風格、團隊規模和問題難度。常見範式包括封閉型、隨機型、開放型和同步型。敏捷團隊通常是自組織的,強調溝通、簡潔、回饋、勇氣和尊重。XP 團隊的價值觀是溝通、簡潔、回饋、勇氣和尊重。

社交媒體對軟件工程產生了重大影響,增強了團隊成員之間的聯繫和協作,尤其對於分散的團隊。博客、微博、線上論壇和社交網絡網站等工具都可以用於建立軟件工程社群。然而,需要注意隱私和安全問題。

使用雲端進行軟件工程提供了對所有工作產品和資訊的集中存取,提高了地理分散團隊的協作效率,並提供了新的測試和配置管理方式。雲端也帶來了可靠性、安全性和互操作性等風險。

協作工具已從早期的軟件開發環境發展為協作開發環境 (CDEs),提供命名空間、日曆、模板、度量、溝通分析、工件聚類等服務,特別適用於全球軟件開發 (GSD) 團隊,幫助克服距離帶來的挑戰。GSD 團隊面臨協調、溝通、協作和決策方面的獨特挑戰。