This page looks plain and unstyled because you're using a non-standard compliant browser. To see it in its best form, please visit upgrade to a browser that supports web standards. It's free and painless.

Kenming's 軟體設計思維 會員登入 會員註冊

*** 第一個階段子目標 ***

  1. 確實在 Eclipse IDE工具內建立可以完整開發 Spring-based 的應用程式。
  2. 新增 middle-tier性質專案(純粹是 java class,沒有 UI),撰寫 {員工薪資管理Control.java} 這個控制物件的程式碼框架 (skeleton),新增一個 Spring Beans 的 XML設定檔 (config file),在設定檔內設定該控制物件的相關屬性。
  3. 利用 JUnit 測試框架 (Test Framework, Eclipse 內建),馬上撰寫該控制物件的功能測試程式碼。

一、新增專案

  1. 選擇 [File]  [New]  [Project…],當出現 [New Project] 的 wizard 對話框時,選擇 [Spring]  「Spring Project」,然後按下【Next】,出現 [New Spring Project] 對話框內,輸入新增的專案名稱: HRDemo,其它選項照預設即可,按下【Finish】完成,並將 eclipse的視界 (perspective)切至 Java EE。

    圖 3、新增 Spring Project 的對話框
    圖 3、新增 Spring Project 的對話框

  2. 在 [Project Explorer] 的專案視窗內,將滑鼠移至專案的根目錄 (HRDemo)下,右鍵點選 [Build Path]  [Configure Build Path …],出現 [Properties for HRDemo]的對話框,然後將標籤切換至 [Libraries],並點擊【Add Libraries…】,當出現 [Add Library] 對話框後,選擇 [User Library] 然後點擊 【Next】。

圖 4、Add User Library 的對話框
圖 4、Add User Library 的對話框

出現 [User Library] 對話框後,點擊 【User Libraries…】,再點擊 【New…】,在 [New User Library] 的對話框內填入自訂的 Library 名稱,在此例填入:「Spring 2.x Framework」 完成後點擊 【OK】。

圖 5、填入 User Library 名稱
圖 5、填入 User Library 名稱

點擊 【Add JARs】。Spring-based 的專案,至少必須載入三個相關的 jar: spring.jar, commons-logging.jar, log4j-1.2.14.jar。此三個檔案位於在上述所解壓縮 Spring Framework Library (此例目錄為 C:javalibspring-framework-2.X),路徑內的 /dist, /lib/Jakarta-commons, /lib/log4j 目錄下。

圖 6、Spring 專案必要參考的三個 jar 檔
圖 6、Spring 專案必要參考的三個 jar 檔


二、撰寫類別控制程式碼

  1. 從 [Project Explorer] 專案視窗內,按下滑鼠右鍵,選擇 [New]  [Class],在 [New Java Class] 對話框內,在 「Package」欄位內,填入: hr.demo.hsdc;在 「Name」欄位內,填入:員工薪資管理Control。

    圖 7、新增 Java 類別 (Class)的對話框
    圖 7、新增 Java 類別 (Class)的對話框

  2. 在 eclipse 程式碼編輯視窗內,撰寫下列 java 程式碼:

    員工薪資管理Control.java

    package hr.demo.hsdc;
    import java.util.ArrayList;
    public class 員工薪資管理Control {
    public float 計算員工薪資(String id){
    return 0f;
    }
    public ArrayList 計算所有員工薪資(){
    return null;
    }
    }

    *** 在這個階段重點是建立程式碼框架,而不是在細節的正確性。所以只要宣告好該控制類別所需要的功能 (method)、參數、回傳值即可;至於 method 內實做的細節,在建立起整個開發環境的框架後,再回頭來補充實做細節即可。(這是 Iteration 作法關鍵之所在,知道每一個階段的重點目標為何)

  3. 新增第一個 Java Class 程式後,eclipse IDE 的 Java EE視界如下圖所示:

    圖 8、新增第一個 Java Class 後 Java EE 的 Layout
    圖 8、新增第一個 Java Class 後 Java EE 的 Layout

三、新增 Spring Beans 設定檔 (Config File)

  1. 從 [Project Explorer] 專案視窗內,按下滑鼠右鍵,選擇 [New]  [Other…],然後在 Wizard 對話框內,選擇 [Spring]  [Spring Bean Definition] ,然後點擊 [Next]。

    圖 9、選擇新增 Spring Bean XML 設定檔
    圖 9、選擇新增 Spring Bean XML 設定檔

    在出現的對話框內的 [File Name] 填入自訂的設定檔名稱 (在本例中為 beans-config),並選擇該檔案儲放的位置在 src 目錄下。

    圖 10、填入 Spring設定檔名稱與儲放位置
    圖 10、填入 Spring設定檔名稱與儲放位置

    點擊 [Next],在出現選擇 XSD namespace的對方框內,點選 [bean] 後,在下方的對話框,改選 XSD 定義為符合 Spring 2.0 (spring-beans-2.0.xsd),然後點擊 [Finish] 完成。

    圖 11、改選符合 spring 2.0 規格的 XSD 定義
    圖 11、改選符合 spring 2.0 規格的 XSD 定義

    此時在 [Project Explorer] 專案視窗 src 目錄下,即會新增一個 beans-config 檔。在程式碼編輯視窗下編輯該設定檔內容為:

    beans-config:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    <bean id="EmpControl" class="hr.demo.hsdc.員工薪資管理Control">
    </bean>
    </beans>

    圖 12、新增 java spring 設定檔後 Java EE 的 Layout
    圖 12、新增 java spring 設定檔後 Java EE 的 Layout

  2. 值得留心的是,若程式碼有用到中文名稱 (如中文類別名稱),那就必須變更 eclipse 預設的編碼,否則在設定檔內有中文名稱的話,會出現 "Invalid byte 1 of 1-byte UTF-8 sequence" 的錯誤訊息。在 eclipse 的功能表 [Project]  [Properties],點選 [Resources],在右邊的「Text file encoding」,把原來是系統預設的編碼,改為 「UTF-8」。

    圖 13、改為 UTF-8 編碼,以避免中文問題
    圖 13、改為 UTF-8 編碼,以避免中文問題

四、撰寫控制類別的測試程式碼

在 eclipse 環境下要撰寫測試程式碼是非常簡單的一件事。原因是 eclipse 已內建了 JUnit 測試框架 (JUint Test Framework),作為一位程式撰寫人員,最起碼要為每一個控制性的功能(服務)性類別撰寫功能測試程式碼 (functional test code),可以說是軟體品質的最基本保障,也是應該要具備的責任與良心了。

  1. 在 [Project Explorer] 內,選擇 {員工薪資管理Control.java},按下滑鼠右鍵,選擇 [New]  [Other…],然後在 Wizard 對話框內,選擇 [JUnit]  [JUnit Test Case] ,然後點擊 [Next]。在出現的對話框內,填入以下資訊:
    • 點選 「New JUnit 4 Test」。 (新版本的測試框架可以根據 Java 5.0 以上版本的新特徵特性來建構;更簡單、易於使用,以及更敏捷的初始化與清理等工作)
    • Package: hr.demo.hsdc.test (端看 Developer 的習慣,這裡是採用將測試程式碼均放置於原始程式碼所在位置的子目錄下)
    • Name:員工薪資管理ControlTest (測試類別命名的建議為 原類別名稱+Test)
    • 勾選 setUp() method (讓測試類別可進行初始化的工作)

      圖 14、新增 JUnit 測試程式碼的對話框
      圖 14、新增 JUnit 測試程式碼的對話框

    點擊 【Next】,在出現「選擇測試的 method」對話框時,點選該控制類別所宣告的 method (此例為 「計算員工薪資()」、」計算所有員工薪資()」。 一般而言,功能測試的重心會在於測試功能性類別所揭露出的企業邏輯(business logic),這些企業邏輯的演算核心均會被封裝 (encapsulate)在功能性類別所宣告的 method 內。

    圖 15、選擇要測試的 method
    圖 15、選擇要測試的 method

  2. 編輯測試程式碼內容

    員工薪資管理ControlTest.java

    package hr.demo.hsdc.test;
    import static org.junit.Assert.*;
    import org.junit.*;
    import hr.demo.hsdc.*;
    public class 員工薪資管理ControlTest {
    private 員工薪資管理Control control;
    @Before
    public void setUp() throws Exception {
    control = new 員工薪資管理Control();
    }
    @Test
    public void test計算員工薪資() {
    assertEquals(0f, control.計算員工薪資("001"));
    }
    @Test
    public void test計算所有員工薪資() {
    assertEquals(null, control.計算所有員工薪資());
    }
    }
  3. 執行測試。
    在 eclipse 的工具列 (toolbar)中,選擇 [RUN] (綠色右箭頭符號圖示),在此例中點選「員工薪資管理ControlTest」後,在下方的 [JUnit] 標籤即可顯示測試的結果。 (綠棒代表通過;若有至少一個錯誤,則會出現紅棒)

    圖 16、執行 JUnit 測試
    圖 16、執行 JUnit 測試

*** 至此已完成第一階段子目標 ***
整個專案目錄備份至 /Stage-1 目錄下。 程式碼下載

※延伸參考
 o Java Spring 簡單範例操作與學習指引〈1〉

寫在前面

我想藉由一個小小的功能案例,來分享個人在學習所謂 "新的 IT 技術",尤其是偏向實作面的 "How-to" ,包括工具的操作,與程式的寫碼等,是如何從所設定的主要完成目標,再分解成數個階段性的子目標,然後一次只克服一小段問題,再往前漸增推進,往下一個階 段目標前進。 同時,這也算是一份提供給軟體開發入門的學習操作指引的分享文件。

實作的過程中,所有相關的參考文件,均是透過 Google 的查詢,以及與實作規格相關的線上文件。 當然若工作上的需要,也是可以考慮購買 "How-to" 操作性的參考書籍翻閱。 不過我是覺得好像透過網路上都可以查得到,雖然可能比較零散,但同時可以增進自己如何下關鍵字找 "How-to" 的技能,也是不錯的。

我想提供兩個不同平台的版本,一為本系列案例中的 Java + Spring;另一為 C#.NET + LINQ (會以另外一份操作指引文件分享)。 可以說是把 Spring 與 LINQ 主要實現在 O-R (Object-Relation) Mapping 的實作議題上。

這個功能案例很簡單: 系統提供 "計算員工薪資 By ID" 、 "計算所有員工薪資" 功能 (從使用案例的需求而來)。

案例雖然很簡單,但是它是可以 "成長" 的,而且也具延展性。 最起碼我把它可以區分為兩個階段的上線目標:

  • 第一個階段:快速實現功能需求,但保留了可以具延展性的框架。
  • 第二個階段:找出穩定的共用元素,讓系統更有彈性。

為了能順應這兩個階段的目標,一些軟體設計的最基本原則就會隱含在內,同時這也是這個範例期能達成的標的:

  1. 從系統中間層(middleware),表達服務(service),也就是功能需求的控制物件(control object)開始,撰寫程式碼;而非從展示層(presentation)的 UI 表單開始。 (焦點應該是擺在以服務為中心、置於中間層的控制物件;不要再從 UI 開始來開發系統了,那很容易會是 2-tier 思維。)
  2. 實現企業邏輯於中間層的控制物件,而不會寫在 UI scripts 上,或是資料庫的 stored-procedure。否則系統即喪失了延展性。
  3. 寫完一個個實現系統功能的控制物件後 (本例只完成一個控制物件— {員工薪資管理Control.java}),馬上就撰寫可以測試該控制物件功能的測試程式碼 (Functional Test Code);當控制物件與測試程式碼開發告一段落後,才開始寫 UI 表單來驗證控制物件所提供的功能服務。
  4. 實現 Java Spring Framework 的開發— 以 Spring DAO, O-R Mapping 框架為主。
  5. 確實可以滿足使用者所需要的系統功能後 (確實可以上線使用),下一個階段則是結構的重整,也就是重構 (Refactoring), 而重構的前提就是不能影響到已上線的功能。 本例會採物件導向的委派 (delegate)與多型 (polymorphism)的技巧。

開發環境建置

需要軟件

安裝 Spring Framework

  • 建議從上述網址所下載 Spring Framework 的壓縮檔為 spring-framework-2.X-with-dependencies.zip。 該壓縮檔內除了包括 Spring 所需的 library 外,還包括了諸多在系統開發上,其它經常用到的 Open Source 專案的相關連套件,包括 ant, axis, hibernate, log4j, struts …等。
  • 解壓縮該檔案,並將解壓縮的目錄放置在常用 java 開發的 library 路徑內,例如:
    C:javalibspring-framework-2.X

在 Eclipse (Java EE 版本)上安裝 Spring IDE

  1. 在 Eclipse 的選單 [Help]→[Software Updates], 選擇 [Find and Install…], 當出現 [Features Update] 對話框時, 選擇 [Search for new features to install], 按下【Next】進入 [update site to visit] 對話框。 然後點選 【New Remote Site】, 當出現 [New Update Site] 對話框時, 在 [Name] 欄位輸入:Spring IDE;在 [URL] 欄位輸入:http://springide.org/update 。 輸入完成後按下【Finish】,Eclipse 即會至該網址搜尋並列出最新版本的 Spring IDE 與其相關連的套件列表。

    Spring 簡單範例操作指引 ScreenShot
    圖 1、新增 Update Site 的名字與 URL 位址

  2. 現的對話框內,勾選「Spring IDE」與「AJDT」套件, 其中「Spring IDE」內的「Dependencies」套件不要勾選(該套件是適用在 eclipse 3.2.x 版本)。 勾選完畢後選擇【Next】進入下一 License對話框, 點選同意後再按下【Next】到下個對話框, 最終選擇 【Finish】後,eclipse 即會開始安裝 Spring IDE 等套件。 安裝完後重新啟動 eclipse 即可開發 Spring-based 的專案。

    Spring 簡單範例操作指引 ScreenShot
    圖 2、勾選要安裝的 Spring IDE 與 相關連的套件

對於大型系統利用 DoDAF 規格的架構規劃,其實均有個共同的特點,也就是有多個節點(Node)、多個資訊系統(Information System)。 包括軍事領域的聯合作戰指揮系統、以及政府單位防救災系統的架構規劃等,均是有這樣的特點:如何表達表達多個節點之間的關連性、如何表達多個資訊系統之間的互動。

兩個主要的觀點: Operation View and System View。 又依照每個觀點所涵蓋的層次(layer) 與 功能性質的不同,又分為 OV1~OV7, SV1~SV11。 有趣的是,即使是 Operation View,也會利用如 UML 的循序圖(sequence diagram),如 OV6,來表達節點之間的動態互動情形。 而 UML 循序圖一般是被用來表達軟體系統內部,參與物件之間的互動合作關係。 其實這隱含什麼意思呢? 很簡單的道理! 在 Operation View,也可以運用物件導向分析的手法,與 System View 所不同的只有:一個是把 Node 當物件;另一個是把 System 當物件;但是相同的是:兩者均用物件導向分析設計的思維來作塑模(Modeling)

依據「DoDAF Deskbook v1」的建議,Architecture View 的開發步驟可以參考如下圖的各種視圖的先後開發順序。 當然,這不會是絕對的,對我而言,在抓這類大型系統的架構時,首要就是要先能界定出系統的整體框架。當把某一個設計的目標框架,界定為一個系統時,就會分 出 "外" 與 "內",而兩者的分析手法與看待系統的角度就會不一樣了。 "外" 重視的是 "用",所以會觀察系統所提供的服務,而服務就會衍生出,系統應該提供什麼 "介面(interface" 讓外部的參與者來用;再來 "內" 重視的就是系統的組成元素,這就是屬於結構分析的角度。結構分析觀察的兩個重點是,一個為靜態的結構關係、另一個就是,在動態為了完成某一個 "用" 的功能服務時,會有哪些元素的參與、它們彼此之間又是如何傳遞訊息的。 最終,你就會發現到,到底是如何 "界定" 某一個框架為一個系統,會是架構師最大的課題與其必備的素養了。

DoDAF_Architecture_View 建議開發步驟
圖 1、 摘錄自「DoDAF Deskbook v1 p.2-5」

從上圖中可以看出, 「DoDAF Deskbook」所建議的開發步驟,是以 AV1 開始觸發、以 AV2 涵蓋所有的視圖。 事實上,AV-1 是什麼呢? "Overview and Summary"。 其實它就是一份 SAD(System Architecture Document)。 文件內容大概就是包含了專案的目的、專案的描述與說明、架構規劃的標的、情境、任務、願景與目標 ...等。 也就是說,在未來展開這個系統的規劃時,範圍與目標均是在該文件所描述的範圍之內。 AV-2 呢? "Integrated Dictionary",它就是未來在涵蓋所有的視圖內,經常會使用的術語(terminology),要能給予一個明確的定義及其該字彙的意涵。

所以, "All-View" 只是文件的報告而已,真正的第一張視圖是 OV1— "High Level Operational Concept"。 這一張也可以說是要能涵蓋所要規劃系統全貌最大格局的視圖了。 它是給指揮官以上的層級所看的概念性視圖,所以儘量不要以技術面的角度來表達這張視圖。 參考下圖:

DoDAF_OV1_Conceptual_Diagram
圖 2、OV-1— 高階概念視圖

前述所提,架構師當能從任何一張視圖,看得出系統的 "外" 與 "內"。 並且在心中就要能轉化的出來能表達出整體框架的設計圖。 哪一張 UML 設計圖最適合被用來表達 "外" 與 "內" 呢? 也就是說,要能表達的出 系統所提供的服務介面,以及系統內部的組件關係。 UML 合成結構圖(Composite Structure Diagram),可以說是最適切的表達了。

DoDAF_OV1_Composite_Structure
圖 3、將 OV-1 概念視圖在心中轉為合成結構圖

所以,OV-1 的精要(Essential)為何呢?
利用視覺化的視圖協助高階決策者(如指揮官),以 「鳥瞰」 的方式來看出系統的全貌 (包括系統的外與內部觀點)。

  • 開發的系統為何? (聯合作戰指揮系統)
  • 誰觸發(Trigger)系統作業? (通信雷達偵測系統偵測到敵空降部隊與敵軍機的來襲)
  • 系統的外部支援為何? (UDA, 台美聯防艦隊)
  • 系統的內部組成元素? (各節點,包括直屬部隊、陸、空軍作戰指揮中心、後勤中心等)

再來,我們就會利用戰情演練與情境描述等,來作為系統的架構規劃,以及持續驗證系統的作業。

戰情演練:
「海防部隊接獲情資,敵軍空降約一個營兵力的傘兵,於 0608:1200 在林口台地附近登陸,並往台北方向推進。約此同時,雷達偵測系統偵測敵 20 餘架戰鬥軍機於 0608:1230 往空降地點方向移動,預計約 10 分鍾後抵達林口台地,準備支援敵空降傘兵部隊。」

情境描述:
我軍聯合作戰指揮部 (Joint Force Commander,簡稱 JFC),偵察與接收到敵軍來襲狀況,指揮官即刻下達決策命令:

  • 即刻派遣直屬衛戍部隊,至敵空降單位守衛迎擊,並以殲滅敵登陸軍為主要作戰目標。
  • 協調空軍作戰指揮部 (AirForce Commander,簡稱 AFC),派遣軍機攔擊,並以殲滅敵軍機為作戰目標。
  • 即刻派遣防砲部隊,擔負迎擊敵軍機防禦任務。
  • 協調台美聯防艦隊 (Union Defense Armada,簡稱 UDA),防衛與監控敵海軍艦隊,防止敵艦隊登陸。
  • 聯絡陸軍作戰指揮部 (Army Commander ,簡稱 AC),整備作戰部隊、並緊急動員後備部隊,以備後續支援作戰。
  • 聯絡後勤補給中心 (Logistics Supply Center,簡稱 LSC),派遣前線必要物資,啟動後勤補給戰備支援作業流程。

※延伸參考
 o 聊聊 DoDAF/MoDAF 規格與實作議題

副標題:敏捷的開發首重的是人與人的共同合作、自我組織良好的團隊。人不是如同組成系統的元件,可以隨意被抽換的。

敏捷軟體開發:原則、樣式及實務
 敏捷軟體開發:原則、樣式及實務
 Agile Software Development: Principles, Patterns, and Practices
 -----------------------------------
 作者/Robert C.Martin /著, 林昆穎、吳京子 /譯
 出版社/碁峰
 ISBN/986-154-148-9
 Amazon 評鑑:五顆星

內容簡介
暢銷書作者及舉世聞名的軟體開發專家Robert C. Martin展示了當今軟體開發者、專案經理與軟體專案領導者如何解決眼前最具挑戰性的難題。這是既全面又實用的敏捷開發與極致編程的教學,由敏捷開發創 始人之一所撰寫。教導軟體開發者和專案經理如何使用敏捷開發的威力,讓軟體專案如期完成又能符合預算。

* 使用真實的個案研究來展示如何運用極致編程進行規劃、測試、重整、以及搭檔編程。
* 包括豐富而可復用的C++和JavaTM程式碼。
* 專注於使用統一建模語言(UML)與設計樣式(Design Patterns)來解決以客戶為導向的系統問題。

前言

本書原著在 Amazon 評鑑是極為罕見的五顆星滿分! 書籍也是少見的厚,有近 700 頁之多。 如此深厚的內容,可不像坊間一堆可拿來當枕頭的所謂 OOP 入門書一般,儘是充斥著圖形設定教學與程式碼,沒啥內容。 套一句 John Vissides (Design Patterns 之一作者)在引言上所推薦的:「這也許是第一本將敏捷方法 (agile methods)、樣式 (patterns),以及現代軟體開發方法交織成連貫的整體。當 Bob Martin 開口,你最好洗耳恭聽。」 六年! 是作者在這麼多年來所深刻體會到的軟體設計和開發經驗,而本書也可說是反應了作者自身的學習成果。

本書描述了軟體開發議程的三個主題:設計原則 (principle)、設計樣式(pattern),與開發實務(practice)。當軟體開發人員面對的是需求快速變動時,如何具備迅速的應變能 力,而表現在開發的過程中,即為敏捷性的開發;為了達成敏捷性,所以開發團隊要能有某種程度的共識以及具回饋 (feedback)的實務作法;利用專家與前人所提供的設計原則,使得軟體能具有彈性與易於維護;而如何平衡這些設計原則,所以也會瞭解到在特定一再重 覆的問題上應用設計樣式。作者就是嘗試著要把這三種觀唸成有一個有效的整體。 我覺得書中最大的特色就是,會藉由許多案例研究來說明與示範如何應用上述三種觀念,而且這些案例並非是最終的完成品而已,而是正在進行中的開發,所以讀者 也會看到這些設計者所犯下的錯誤,然後他們又如何發現錯誤,進而改正錯誤。

軟體開發的關鍵在於人,而不是製程

本書的目錄綱要編排,正是反映了上述作者想傳達的三種觀念,所以分為六個篇幅,第一、二篇論及的是軟體開發流程的最佳實務與能符合最佳實務的敏捷設 計原則;後四篇則是藉三個案例研討 (薪資、氣象臺、教育測驗服務),如何應用設計樣式,來解決一些特定的實務問題。再來就是四個附錄。前兩個附錄算是對於 UML 的語法說明;而附錄C (兩家公司的諷斥),挺特別的寫作方式,每一頁是個別描述兩家公司各自不同的開發方式,一個採需求凍結的瀑布開發、另一個採敏捷的反覆漸增開發。是一篇挺 有趣的寓言式寫實故事;附錄D則是摘錄 Jack Reeves 的一篇論文:「原始碼即設計」。我覺得該篇論文真的可以精讀,可以引導與觸發讀者思考,什麼叫做軟體設計。

每一大篇,都可以各自拆開獨立閱讀。軟體開發人員,若想對樣式作個一般性的學習,可以閱讀敏捷的設計原則;而想知道作者是如何應用書中所介紹的設計 樣式,則可以參考書內的三個案例研討;而若是專案經理甚或老闆,專心研讀第一篇關於敏捷式的開發流程,絕對會對現實的專案開發與管理的議題上,有很多的體 會與啟發。

尤其一開始本書所揭露出來的敏捷軟體開發宣言,我覺得是相當務實地揭露出軟體開發的本質— 流程和技術是影響專案結構的次要原因,人方是關鍵要素。 太多老闆與專案經理們總是常會把他們總是很關心人的永續成長之類的話掛在嘴邊,但是又往往想要創造或導入出一套流程,藉由許多管理工具與各階段的製程產 品,用來約束開發人員的活動。而靠一些約束與產出(通常是大量的文件),但錯誤仍持續不斷發生時,管理人員卻又在某些地方設定更多的約束和產出 …,這種造成負回饋的循環,使得軟體人員過度負荷了龐大笨重的流程,而嚴重妨礙了完成工作的能力,並因而喪失了軟體的創意設計能力。

奉勸許多老闆與專案經理們,不能再自欺欺人了,仔細審思敏捷宣言所揭露出來的價值觀吧:
o 個人及互動勝於流程與工具。
o 可用的軟體勝於詳盡的文件。
o 與客戶合作勝於合約談判。
o 回應變更更勝於墨守計畫。

敏捷開發的主張—程式碼即為設計本身?

本書在「敏捷式的設計」一篇中,所引用自附錄D Jack Reeves 所主張的:「真正能符合工程設計標準的唯一軟體文件就是源碼的列表」。本來我還以為敏捷開發的主張是將程式碼當作是設計的一切,這我當然是無法認同,這可 是會給一些程式設計人員藉口,只寫程式卻不需要有其它的設計文件。 我是一直覺得,程式碼既是設計(沒錯),但同時也是設計最現實有效的產出 (artifacts)。而程式碼的呈現是綜合了包括多個觀點與層面的設計,諸如需求、結構,甚或架構,而這些是需要透過其它如設計圖,突顯出設計的焦點 而隱藏了程式碼不必要的細節。還好,後來我很用力地研讀並思考 Reeves 論文的意涵,他應該指的是,程式碼本身就是一種設計。是的,這一點我是相當認同的,還有就是千萬不要認為 「設計就是一組與程式碼分離開來的 UML 圖示。」這麼說好了,我是一直這麼認為: UML 設計圖與程式碼都是設計,是軟體系統的一體兩面。」所以,個人一直主張,設計圖要作少、作精,不要作不必要的文件,且必然要時刻在開發的過程中保持與程式碼的一致性。

對於開發人員而言,要能看得懂本書所介紹的設計樣式,那就要先瞭解本書所揭露的設計原則,書中介紹了五種設計原則—SRP, OCP, LSP, DIP, ISP 等,全名與細節我就略過不提了。其實這些就是所謂物件導向式軟體設計的基本功與思維,諸如物件的責任分派、封裝的設計、相依性的分析、多型與介面的設計 等。還有,讀者要瞭解,這些設計原則不是為了協助你把東西做出來,而是讓你消除程式碼的壞味道,設計壞味是一種症狀,是某種可以被主觀而非客觀量測的東 西,會讓系統僵化而難以維護。不過適可而止就好,設計原則並非可以在系統中任意地到處噴灑的香水,過度遵從原則會導致不必要的複雜度的設計壞味。

書本雖然厚,討論的主題涵蓋也廣,但是內容還蠻淺顯易懂的,翻譯的品質也是相當不錯。每一個章節前頭又有很棒很炫的插圖,甚至還有作者引以自豪,是 其女兒散佈在各章節裝飾性插圖的可愛作品。還有若是像我不是那麼珍惜書本完整性的話,甚至也可以將各篇分開拆下來,這樣外出攜帶時閱讀就不會那麼厚重。 看到如此言之有物的專業書籍,又不難懂,可以說是生命的喜樂之一。