上回介紹了一本敏捷發展製程(Agile)的書《Agile and Iterative Development – A Manager’s Guide》,它著重在高階觀念的融會貫通。這回介紹如何利用一些開放源碼的工具,來協助Java軟體開發人員體現敏捷製程的精神,透過開發人員的角度來 介紹敏捷製程,讓你覺得它不只是理論,也能落實在軟體開發的實務中。

Java瘦身非夢事
近來Java軟體的發展也逐漸走向「健怡」風,從軟體製程的改良(OOAD及Iterative法,以測試為中心的發展方式),到軟體框架的減重 (像是Spring Framework的興起,POJO重新受到推祟),慢慢地大家認同為了加速整個軟體專案的時程,有效提高軟體品質,並以目標導向為主,不一昧追求複雜技 術。

就因為是以目標導向為開發基本方針,本書作者Jeff Langr有鑑於此,便以TDD(Test-Driven Development)為中心思想,結合Java 5本身的OO特性,將TDD的觀念以程式撰寫的方式落實在Java開發人員身上,說明落實敏捷製程時需要重視的細節。所以本書中採用Java 5為主要程式語言,以目前最熱門的JUnit為軟體單元測試之主要框架,而透過Apache Ant工具達到自動化測試及編譯工作。由於是實務導向的內容,書中詳細提到這些工具的運用方式及程式的撰寫細節。

本書適合Java新手,或沒用過JUnit測試框架,甚至對兩者都十分陌生的開發人員。不論是拿來當成Java的自學教材,或是用來當成研究 JUnit的書籍都相當合適。本書內容以十分平實的方式來介紹,透過案例研究的方式,讓入門者也能一步一步體驗Java及TDD的樂趣。
全書共分十五個課程外加三章補充章節。第一章開始以簡單的程式碼說明如何利用JUnit測試框架來進行測試,從建立單元測試之物件(TestCase)開始,然後設計測試用的方法,最後並評斷(Assertion)測試結果是否正確。

第二章起便以五個章節的篇幅介紹Java語言的基本觀念,將物件導向的概念簡單化,從類別(Class)的定義開始,如何設計屬性及方法,如何實 體化物件,字串(String)物件的運用,如何規畫Package,介面的設計(interfaces)及多型(polymorphism)的觀念,物 件的繼承(inheritance)等。

接下來的章節便介紹例外處理(Exception)及記錄(Logging)機制,對不同資料結構(Collections)的操作,數值運算, 輸出輸入(IO)機制,反射機制(Reflection),多執行緒機制,泛型(Generics)的運用,Assertions及 Annotations等。

介紹完畢邏輯層面後,補充章節則透過設計學生資訊系統的操作介面,介紹如何使用Swing套件。在這裡提到了MVC的觀念,說明Swing套件中 對應元件的相互關係。最後一章則一併說明在Java開發過程中所會遇到的其他課題,像是JAR檔的製作、JDBC的使用、多國語系的設計等等。

以實例及TDD為主

單從這些章節的規畫看來,就像是一般介紹Java程式語言的書籍一樣,分別針對Java本身的特性進行介紹,但不同的是,所有搭配說明的程式碼都 與撰寫JUnit TestCase內容有關。從本書中可以得到作者對測試作業的建議,同時習得Java程式撰寫方式,以及測試元件的設計要領,有效地來進行敏捷製程開發。

另外,本書與其他介紹Java語言書籍的差異在於,作者不會一直鑽研Java核心理論及原理之中,而是以實例研究的方式(本書以學生資訊系統為主要案例),讓讀者可以將Java的精神與實際的系統設計相結合,閱讀起來更有感覺。

在每個章節均提供習題讓讀者練習,這些習題則是以一個西洋棋程式為主要目標,你可以用相同的觀念,嘗試落實在不同的案例上,解決其中的問題,以確保習得的觀念正確無誤,對Java及TDD也能有更紮實的理解。

當然,若你已是Java老鳥,本書也是讓你溫故知新的好書,除了重新整理Java 5的特性外,談論每個觀念時,都會提到如何將程式改良的作法(Refactoring),幫助你在程式撰寫上能有更佳的設計思維,進行提高開發的生產力。

refactoring

refactoring

早從1999年Martin Fowler的著作至今,重構(Refactoring)似乎已經成為提昇軟體品質的重要觀念,但軟體專案常常會因為時程壓力及人力不足的現實問題,在專 案執行的過程中進行Refactoring是很難被允許的。以專案管理的觀念看來,這是需要花費時間與金錢的。故在架構設計及程式撰寫上,這樣的觀念就相 對地不被重視,程式開發人員也都以「只要將功能開發出來」的想法來運作。

重構的實現較易在軟體產品研發上,落實在版本更新的規劃中,不過產品規劃的時程也不見得允許重構,因為Refactoring不會改變任何外部功能;而依客戶需求量身訂做的客製化軟體專案,甚至涉及到系統整合的案例,則更難以將重構落實在專案中。


累積預防經驗有助於日後專案發展

有鑑於Refactoring不易落實,所以一個適應性的做法-Prefactoring(預構)也許是個另類的解決方式。作者Ken Pugh提出這樣的觀念,根據自己或他人多年的軟體開發經驗,整理成開發專案時的指導方針,以利於未來專案啟始時做為遵循的準則。它與重構的差別主要在於 執行的時間點,Prefactoring是在專案開始前就先行思考,並非在專案執行期間才發生。

這裡的指導方針有絕大部份跟一般基本的設計原則(像是OOAD的特性)相符,而其他的方針則主要圍繞在分析抽象化(Extreme Abstraction),設計分離(Extreme Separation),提供可讀性(Extreme Readability),以及介面設計(Interface)幾個重點上。

抽象化設計其實已經是物件導件分析設計中的重要觀念,強調「做什麼(What)」而非「如何去做(How)」。所以在這個過程中,很難意會到實作 時的細節,容易造成分析階段到設計階段時實現(Realization)的落差。針對這個問題,本書建議在抽象化設計時搭配雛型系統 (Prototype)的使用,而在設計過程中使用與特定式語言與無關的的方式,採OOAD之標準原則(像是Class、Interface、 Exception等)來進行設計。

分離設計最常見的方式,便是將操作畫面的呈現與商業邏輯,以不同的元件各司其職。在日後需求變動時,不會牽一髮而動全身;而為了日後維護容易,寫出來的程式碼不僅是給電腦看,也要讓人能輕易地看得懂。本書建議最理想的程式是連您的客戶都看得懂。

預構強調軟體開發流程與方法

本書的內容共分成十七個章節,作者以開發一套CD出租店系統的虛擬故事為主軸,說明在進行一項軟體專案時會面臨到的課題。開宗明義不免俗地簡介 Prefactoring的觀念以及其基本方針,接下來便從與老板Sam聊起他理想中的系統應該長什麼樣子開始,文中不時穿插主角與客戶之間的對話,活生 生地如同您在與客戶之間的溝通互動。

為了精確掌握使用者在想什麼,首先釐清字詞明確的描述(光CDTitle、CDRelease、CDDisc的定義就引起一番爭論),再將相關的 字詞分類歸納,轉化成物件的方式來設計。這裡頭像是一些常見物件設計原則就會被討論到,像是多形(Polymorphism)、抽象化資料型態 (Abstract Data Type)等等,甚至直接用一個雛型系統(Prototype)來與使用者確認需求內容的正確性。

雖然設計必須奉行理論,但還是有無法被落實的狀況發生。起因可能是與使用者想法的不一致,對事物解讀的誤解。但這些軟體開發的準則並不是標準答 案,就像是開車一樣,每個人都有自己的風格,重要的是讓自己面臨類似問題時能快速且有效地解決。而且每個準則都有適用的使用時機,而非一條鞭式地適用於任 何狀況。

就本書的內容看來,還是在強調軟體開發流程與方法的重要性。在每個章節中作者以座右銘的方式提醒需要強調的重點,並在書末的附錄中整理了所有的原 則。如果了解物件導向分析設計的重要,同時亦希望用省時省錢的方法來進行專案,本書也許可以提供一些想法,雖然無法保證從此不需要 Refactoring,但次數的減少是可以肯定的。

Agile and Iterative Development: A Managers Guide

Agile and Iterative Development: A Manager's Guide

要客戶在開發期間不會變更需求幾乎是不可能的,短期專案還好,那種一年半載的專案更是嚴重,如此惡性循環,專案結案日遙遙無期,需求變更永無止境。

在傳統的軟體開發流程中,瀑布式(Waterfall)仍是目前採用比例最高,且造成問題最多的開發方式之一。軟體就如同新產品研發一樣,開發時程的長短 與風險有相對的關係。所以敏捷觀念的出現,希望能透過反覆式的開發方法,配合自動化的開發工具,以多個較短的開發時程(Iteration),反覆地因應 不同階段的專案需求,如此才能外在環境及需求變化日益頻繁的狀況下,解決因為開發時程過長,而不能及時反應客戶需求變更的問題。


屬管理類書籍,融入專案管理及
開發流程新觀念

在軟體工程及物件導向領域中,本書作者Craig Larman堪稱大師級人物,其經典作品《Applying UML with Patterns》已成為研習OOAD及UML之必讀聖經。光從本書的副標您就可以知道,這本書是寫給長官們看的,書中內容說明敏捷與反覆式開發的基本原 則、使用的動機及時機,並提到其他相關的開發流程概念。由於新觀念的落實必須要有管理者的支持,讓管理者了解這些觀念的價值所在,才會提昇成功導入的機 率。同時,也有利於管理者與工程人員以此方式進行專案開發時,以共通的語言及想法來進行溝通。

本書一開始以兩個章節的篇幅,整理了反覆式、漸進式及敏捷式法則的重要觀念,對這些法則的特性以簡短的內容說明,幫助讀者(尤其是管理者)快速建立基本觀念。

有什麼動機非得要採用敏捷理論不可呢?本書第五章透過一些研究報告的結果,列出以往專案需求變更的常見原因,同時讓讀者了解瀑布式流程所造成的問 題,並歸納出採用敏捷理論的關鍵性因素。當然,再好的理論沒有實務的驗證,還是很難讓人採信,本書第六章作者採用類似研究報告的寫法,收集了許多參考文獻 與統計數據來說明敏捷理論的實用價值,而不是單純作者的自吹自擂。

接下來便針對四個值得注意的敏捷發展理論中的基本觀念及理論原則,包括Scrum、極限製程Extreme Programming(XP)、Unified Process(UP),以及Evo。對於這些理論未曾涉獵的讀者,在此分別以獨立的章節介紹,明確的結構讓讀者易於理解及比較有助於觀念的建立。其中包 括每個理論的概念介紹、生命週期(Lifecycle)、相關參與的角色、文件產出、施行要領、以最佳實踐法則(Best Practices)、常犯的錯誤及誤解、與其他理論的比較,並列出過去曾以這些理論實作的成功專案等。

提供實務施行準則,提高專案成功機率
最後精彩的第十一章,描述實際導入需要注意的技巧,讓敏捷理論更能成功順利地落實,包括在專案管理、環境配置、需求管理,及測試程序等層面。若您 有軟體專案外包的需求,本章提到在面對多個研發團隊(Multiteam)時的Iteration規劃及管理方式,以及在設計Iteration需要注意 的重點為何。同時在專案過程中所需的環境配置,包括軟硬體環境該如何搭配。另外本章也提供一些協助需求管理的管理技術及方法,像是願景(Vision)、 使用案例(Use Case)、心智圖(Mind Maps)等等。

一些保守的企業,不願意冒著變革的風險,對敏捷理論躊躇不前,對於外在環境迅速變化的因應程度相對較低,所以本書內容收集了相關的研究報告,及一些大型專案之案例分析,可以提供你實現理論之有力佐證,踏出變革的第一步。

最後,本書強調人的因素仍然是關鍵。其對整個專案的影響程度重要性遠大於流程本身。成員之間不斷地溝通,團隊協同運作,一直是敏捷方法中所強調的重點。所以,管理者也不能忽視這個環節。

Follow

Get every new post delivered to your Inbox.