星期四, 3月 04, 2010

[軟貼軟體設計必讀經典(11)反覆測試與修正,讓錯誤消失

http://www.ithome.com.tw/itadm/article.php?c=47536

寫程式之路還有很多事情需要去學習,每每寫到一個程度的時候,都會想說,有沒有更好的寫法,或是更好的規劃方式。就是這種富有彈性的工作,所以才不會變得枯燥。

不過在這個競爭的行業裏面,效率往往決定一切,我仍然會害怕悠悠哉哉的寫程式,老闆會生氣~~。

測試驅動開發除了讓軟體人員對測試工具有自我主宰的感覺,並藉此探索測試內部的機制外,還能提升勇氣──取代沈默寡言,而勇於嘗試更多的溝通交流。

  Test Driven Development By Example
 Kent Beck /著
 Addison-Wesley Professional出版
 售價:44.99美元
 推薦:Amazon四顆星

有一位軟體設計的夥伴,是我看過上千軟體人員之中唯一的天才。他不只學習能力快速,更具備靈活的頭腦與身段,抽象思考能力極高,擅長把軟體作「軟」的他,作品總是令人嘆為觀止。不過,我覺得他與國外的軟體先驅仍差了一截,並不是實作或學習能力不夠好,最主要的差距在於「創新能力」。

什麼是創新能力?舉個例子,我可以看得出早期EJB規格的問題點(軟體結構會被該規格綁死死的),所以會批判與避免使用它。Rod Johnson 卻不只是批判反對而已,而且還身體力行,寫出Spring Framework,實現IoC(Inversion of Control)、AOP(Aspect-Oriented Programming)的輕量級開發框架,釐清軟體開發人員與系統層級服務的責任。

另外,《Test Driven Development By Examples》作者Kent Beck在輔導專案的過程,有感於測試應伴隨所開發的程式碼,而不是延遲,所以主張「測試先行」(Test First),他甚至設計免費開放的JUnit Framework等測試框架,並寫書推廣正確觀念,讓開發者了解測試先行是維繫軟體品質的重要關鍵。太多大型單位把測試當作一個重要製程,但又交給其他部門,而且在開發後才展開測試,這樣的應變測試效果令人懷疑。

先測試,再反覆修正到正確為止
全書分成三大部分,前兩大部分是範例,第三部分則是測試驅動開發(Test Driven Development,TDD)的設計模式(Patterns)。
第一部分以一個「幣值轉換」的程式範例,利用Java程式碼揭露TDD的設計意涵。

看到這個範例,你可能會覺得程式碼的寫法實在不高明。是的, Kent Beck盡量模仿初學者的程度撰寫程式碼,這同時說明TDD簡單明瞭,能讓初學者快速上手,並懂得如何修正程式碼 (這其實已經逐漸走向設計之道了)。這部分內容讓你了解什麼才是Test First──還沒寫類別程式碼之前先寫測試程式碼。當然,測試一定不會過,再來才開始寫主題程式,新增類別、編輯屬性、修改參數……等。簡單的設計、列出工作清單、一次只解決一個問題、測試它、讓它正確……如此地反覆修正,這正是TDD最重要的精神。

第二部分藉由Python語法探索xUnit測試框架的設計過程,教你如何撰寫屬於自己的測試框架。你也許認為開發Framework相當困難,但Kent beck的作法是如此簡單,三兩下就可以開發出測試框架,而且在設計的過程中,還能秉持測試先行的原則。作者使用Python作為範例,原因除了語法易懂之外,因為Python屬於Script-Based語言,也能藉此證明Python能實現測試框架的實作。

不過,目前已有30多種程式語言支援xUnit Framework,為何作者還要鼓勵程式人員開發屬於自己的測試框架?

有兩個理由:一、讓你對測試工具有自我主宰的感覺;二、藉此探索測試內部的機制。

第三部分是TDD的設計模式,這部分談到測試的策略思考,包括測試的意涵、什麼時候要測試、應該選擇什麼樣的邏輯與資料作測試。

簡單就是力量
TDD的核心精髓是:讓程式碼可以運行並能保持純潔無瑕(Clean code that works)。另外還有兩項原則:一、只有自動化測試失敗時,才寫新的程式碼;二、消除重複(Duplication)。其中,消除重複又與系統架構的相依性(Dependency)設計有相當密切的關係,消除重複的程式碼後,系統的耦合(Coupling)程度往往能夠降低,進而提升可再利用性的價值。

Kent Beck 還特別在序文提到「勇氣」(Courage)。他認為測試驅動可以在開發過程中控制開發者的憂慮感,它可以讓你:快速具體地學習,而不是一直處於試驗性的階段;取代沈默寡言,而有更多的溝通交流;不是躲開回報,而是更能尋求具體有幫助的回饋(Feedback)。

當閱讀完本書後,我相信你應該就能掌握TDD的開發精神,能落實:(1)從簡單開始做起;(2)寫自動化的測試程式;(3)重構 (Refactor),而且每次只增加一個新的設計。

《作者簡介》王克明
台北工專五專部電子科畢業。現於HSDc軟體設計顧問團隊擔任架構師/顧問/講師。興趣為整體架構性的思考與學習、期貨投機操作與閱讀。

沒有留言:

張貼留言