Microsoft .NET 技術代言人專欄:
預防軟體專案失敗的妙方 - AntiPattern
作者:林耀珍
2004年 1 月
充滿風險的軟體開發專案
自從電腦發明後,數百萬的程式設計師將系統需求轉譯成電腦看得懂的指令,不知產出了多少億行的程式,有一些程式已經在機器裡面執行多年,創造了許多商業價值,也有一些程式因為失誤而導致重大損失,但相當大比率 (70%) 的程式則因為偏離需求、或無法解決問題而宣告失敗。根據 The Standish Group 對軟體專案進行大規模的調查,2000 年的報告顯示軟體專案的成功率不到 30%,所以我們需要有更好的方法來進行軟體開發的工作。
什麼是 AntiPatterns
為了提高軟體專案成功的比率,專家學者提出許多先進的軟體開發技術,例如 Iterative development process、物件導向技術、設計模式 (design patterns)、軟體元件、平台與框架 (Platform & Framework),這些正向且具有建設性的技術協助我們正確地建構資訊系統。本文要介紹的內容屬於逆向思考的技術,稱為 AntiPatterns,它們是從許多失敗的軟體專案中歸納出來的錯誤模式,所以軟體中包含越多 AntiPatterns,失敗機率越高。AntiPatterns 廣泛出現在舊的系統上,但仍有許多軟體人員在開發新系統時重蹈覆轍,而且目前有一半以上的 MIS 資訊人員需要維護或延展老舊的系統,所以熟悉 AntiPatterns 不但有助於改善舊系統的維護工作,而且可以降低開發新系統的失敗風險。
AntiPattern 的描述與分類
描述 AntiPattern 有簡明及完整二種形式,簡明形式 (Mini-Form) 包含名稱 (name)、問題描述 (Problem)、解決問題的方案 (Refactored Solution),有時候使用一幅漫畫或一則趣聞來突顯問題的本質。完整形式 (Full-Template) 則包含名稱與別名,問題的描述,藉以辨識問題的症狀,不良的後果,問題的根本原因,及解決問題的方案。AntiPatterns 按照軟體開發的大略分工規則分為三大種類:Development (程式設計)、Architecture (架構) 與 Management (管理),分別介紹如下。
程式設計的 AntiPatterns
Development AntiPatterns 主要是描述不良程式設計,例如初學物件導向技術的程式設計師常犯 The Blob AntiPattern,The Blob 的別名是 God Class,其症狀是程式中包含一個非常複雜的類別 (class) 負責執行全部的功能,而其他的類別則只有資料或含有少量的功能,導致這種 AntiPattern 的根本原因是程式設計師仍使用 Procedural 方式設計程式,解決這問題的方法是將應用程式的功能均衡分配到適當的類別。其他常見的 AntiPatterns 例如 Spaghetti code:表示一團混亂的程式碼,通常連原來撰寫的人都搞不清楚其中的邏輯,更不用說接手維護的人。Lava Flow (火山岩漿流):表示程式的功能改變或持續演化後,留下許多已經不再使用或無人關心的程式碼,但又沒有人搞清楚刪除這些 code 會不會有意外影響。Input Kludge:程式中包含七拼八湊的輸入驗證功能,通常是因為輸入欄位允許使用 Free format,導致難以處理輸入的資料。
架構的 AntiPatterns
Architecture AntiPattern 常見的例子是 Architecture by Implication (沒有明確的架構),所以每個人根據自己認為的架構 Coding,這種狀況的根本原因是沒有人負責架構設計,其解決方法是有人負責把系統切割為數個主要的軟體元件,定義每個元件的介面及元件間的溝通標準。其他常見的 AntiPatterns 例如 Jumble (雜亂):軟體元件互相呼叫,其間的關係糾纏混亂,解決的方法之一是遵循多層式架構的設計規範。Vendor Lock-in:應用程式直接呼叫外購軟體元件的功能,使得應用程式高度倚賴此外購軟體,其解決方式是跟據需求設計一層介面與外購軟體溝通,應用程式即可得到較高的獨立性。
管理的 AntiPatterns
Management AntiPattern 的典型是 Project MisManagement (不良的專案管理):根本原因通常是對專案的不關心,因而忽略了適度地規劃、控制與檢查等等專案成功的必要因素。其他的 AntiPatterns 例如 Analysis Paralysis (分析癱瘓):系統分析師為求完美或過度仔細而延誤規格確立,擠壓後續工作的時程,其解決方案是採用遞增式開發流程 (Incremental & Iterative development process)。Viewgraph Engineering:開發人員被製作圖表及文件的工作延誤時程,原因通常是開發人員使用不當的工具,解決的方法則是設法取得適當的工具。
謹慎應用 AntiPatterns
應用 AntiPatterns 時必須注意一些狀況以避免反效果,首先要注意的是指出組織或程式的 AntiPatterns 可能偒及他人,並引起互相指責的情事,所以要把 AntiPattern 融入軟體開發流程,使之順利成為改善品質的工作技巧。其次是遵循『如果沒壞就不要修理』原則,不要為了追求技術完美而冒然動手。如果需要進行改善,則應妥善規劃,並避免同一時間處理多個 AntiPatterns。
結論
Design Patterns 與 AntiPatterns 是相輔相成的技術,Design Patterns 是解決問題的正確模式,而 AntiPatterns 則是導致失敗的錯誤方法,所以我們使用 Design Patterns 開發軟體,使用 AntiPatterns 提醒我們避開陷阱。但是環境或技術的變遷,現在的 Design Patterns 可能變成未來的 AntiPatterns,例如當年的結構化系統分析與設計技術便是最明顯例子。所以軟體開發人員在運用 Patterns 時,務必考慮適用的條件、範圍、及付出的成本,方能實現希望得到的效益。
相關資源:
作者簡介
林耀珍為 Microsoft.NET 技術代言人,目前任職第三波資訊技術總監,歷任第三波資訊教育訓練處處長及育碁數位科技總經理。專長於資訊系統規劃及軟體開發技術,擁有 Microsoft MCSD / MCSE / MCDBA,Rational OOAD,Lotus Notes / Domino 等認證資格,並為 Microsoft.NET / Java J2EE / 物件導向系統分析設計的資深講師及多家公民營機構的 e 化顧問。
意見與支援
您有任何問題、意見或建議嗎?您可以透過下列電子郵件與作者連絡:
lyaochen@ms3.hinet.net