2012年1月28日 星期六

軟體專案的素質之二 ─ 整體設計之 系統設計篇

上一次跟大家談的是專案管理,這次輪到談談整體設計的部分,整體設計主要分為系統設計,架構設計和圖形語言的有效使用,這些東東同樣地都是範圍相當大的題目,這次takeshi將先從系統設計講起...

由於takeshi本身是developer出身,自認為自己對這一塊領域和其他領域相比(專案管理和自動化工具)應該要來的更得心應手一點吧,同樣地takeshi再把心智圖放在底下供大家參考囉~
軟體專案的素質,本blog整理

如果朋友們有其它想法或意見,takeshi歡迎大家的意見ㄛ~

首先takeshi要先推薦之前在Kenming's鮮思維blog看到的好文「{程序員邀稿} 以架構為中心的主要設計產出(1)」(希望各位有興趣的朋友也能閱讀此文,會有很多收穫ㄛ),在此文中,Kenming提出了以下概念圖

就takeshi理解,Kenming在文章中提及,軟體系統開發應該由需求觀點開始,向user蒐集功能性和非功能性需求;然後再把蒐集到的需求帶進結構觀點,該觀點主要是處理系統的功能性需求,對問題領域(Problem Domain)作分析以導出領域模型(Domain Model);接著再進入實作觀點,該觀點主要是處理非功能性需求,考慮使用什麼樣的架構、平台或技術來支援領域模型的運作。

takeshi要提醒三點

1. 以上這三個主要步驟是使用覆往式(Iterative & Incremental)開發來進行的,一次覆往(Iteration),針對當下蒐集欲實作之需求(usecase)為主,走到下一個覆往,再慢慢重構(Refactoring)。

2.需求價值高(對user)和技術難度高(對開發團隊)的需求先作,這樣一來,專案走到越後面,會越穩定,可參考RUP的Elaboration和Construction之介紹。

3. 不要忘記專案管理和自動化測試與相關工具的支援ㄛ!

然而,takeshi自己在實務上的經驗,發現到很多開發團隊所採取的步驟如下
takeshi在實務上的觀察,本blog整理

由上圖可看出,這些開發團隊收到需求之後(需求觀點),立刻就開始決定技術平台和設計等,並開始實作(實作觀點),完全忽略了領域模型的存在(結構觀點),這樣的軟體開發步驟,會導致最終產出的系統缺乏彈性,以至於少許的需求變動就讓系統面臨大改的窘境;而系統不斷的面臨大改,導致系統的整體設計概念崩潰,而讓系統最終走入惡性循環的命運。

所以結構性觀點到底是什麼呢?takeshi認為結構性觀點其實是物件導向系統開發的核心,也就是領域模型(Domain Model),那領域模型到底是啥東東呢?takeshi可能要先稍微介紹一下程式語言的歷史演進,再跟大家說明到底啥是領域模型。

程式語言的演進簡史
從程式語言開始發展的1950年早期,到目前為止,軟體系統的開發方向是往越來越高階的抽象化層次
  • 機器語言(Machine Language)
電腦問世後的第一個程式語言,直接使用二進位表示,可由機器CPU直接讀取的語言,執行速度非常快,因為是由機器直接讀取,所以可讀性(human readability)低,故學習曲線相當高,且在不同的機器上,程式就得改寫,(不同的CPU吃的指令集不同),完全無可攜性(portability)可言。

  • 組合語言(Assembly Language)
為提高機器語言可讀性,一種便於記憶和理解的符號表示式,由組譯器(Assembler)轉譯成特定CPU的機器語言,然後再給其CPU執行,可攜性部分,是針對一種家族的CPU,如果是其它廠牌的CPU,轉譯出來的機器語言可能無法執行,目前在底層硬體操作或是驅動程式仍然可見到它的蹤跡。

  • 高階程式語言(High Level Programming Language)
為了提高程式設計師的生產力,故開發了可讀性更高的程式語言種類,由人類容易閱讀的英文單字組成,不同的機器有提供不同版本的編譯器(compiler),將撰寫好的高階語言吃進其編譯器,編譯成相對可執行之機器語言。

  • 結構式語言(Structured Programming)
高階程式語言的一種,具有三種特性,為依序執行(Sequence)、條件判斷(Selection)和反覆執行(Repetition),結構式語言通常是以演算法的資料結構和執行的流程與順序來解決問題領域的問題,故系統開發人員是從電腦運算平台的角度來看待問題領域。

  • 物件導向語言(Object-Oriented Programming)
高階程式語言的一種,除了包含結構式語言的特性之外,還另外具有三種特性,封裝(Encapsulation)、繼承(Inheritance)和多型(Polymorphism),物件導向語言可將問題領域之重要概念的相關資料與處理行為加以封裝,形成類別(Class),將概念相關之類別作一般化/特殊化(Generalization/Specialization)繼承處理,抽取出共用與非共用的程式碼區塊,最後也可藉由多型去改變類別行為的變異點,達到程式演算法共用的效果。故物件導向語言可將問題領域加以抽象化,將程式演算法從問題領域概念中抽離出來,系統開發人員便有機會從問題領域本身的角度來看待問題,接著才去思考運算平台的實作

由上簡史可看出,我們常說物件導向語言的特性就是封裝、繼承和多型,而它跟結構式語言之間的分野,最大的不同,就是可以幫助系統開發團隊可以使用一個更直覺、更有彈性的方式來開發系統,讓相關人員可以更聚焦在領域問題上!

有關於系統設計方面,近年主要採用的兩種設計風格如下
Transaction Script設計風格

Martin Fowler的定義如下
Organize business logic by procedures where each procedure handles a single request from presentation.

Transaction Script設計風格,本blog整理

簡言之就是SD依照SA開出的需求規格,重頭到尾地把相關設計與開發實作出來,然而這樣的設計風格,會不自覺地使得系統的架構與商業邏輯之程式碼綁在一個或多個需求上,如上圖所示,系統的每一個tier都綁在由需求延伸出來的紅線上,然而end user的需求是一天到晚都在變動的(I know it when I see it),所以Transaction Script設計風格的系統架構很容易就會因需求變動發生大範圍的影響,使得接受需求變動的彈性較低。

 Domain Model設計風格

依Martin Fowler的定義如下

An object model of the domain that incorporates both behavior and data.
Domain Model設計風格,本blog整理

此設計風格主要是強調在開發系統時,除了user的需求之外,其實我們還要更關注user所在的商業環境!因為user會提出需求,其背後是因為商業環境的驅動使然,所以系統除了要提供滿足user需求的服務之外,其核心應該建立在user背後的商業環境上,因為其和需求本身相較,是本質上穩定不變的部分。如此,即使user的需求天天在變,系統受到影響的部分將會有效減少,因為user的商業環境並不是天天在變動的。然而此種設計風格是需要SA大力支持的,因為需要有人作商業塑模,所以SA對於軟體工程的認知和系統抽象化思考是此設計風格事觀重要的一環。

此外,Martin Fowler也在『Patterns of enterprise application architecture』 一書中,提出了他對Stransaction風格和Domain Model風格的適用範圍,如下圖(質化,非量化)...

不同設計風格在不同系統複雜度之下所花費的心力比較圖,Patterns of enterprise application architecture
在上圖中的三條線各自代表不同的設計風格,其中Table Model 為.NET 相關技術,不在此討論範圍內,X 軸代表系統的複雜程度,Y 軸代表系統的維護心力,由此可看出Transaction Script 的設計風格是適合較小型、邏輯簡單的系統,而Domain Model 的是適合較大型、邏輯複雜的系統。

一般的作法是,當系統規模較小、商業邏輯相對簡單時,首先可以考慮先使用Stransaction style,來快速產出可運作系統(因為它初期所要花費的心力最小),但當系統欲處理之商業邏輯慢慢演變得越來越複雜、規模也越來越大時,takeshi建議趕快把系統重構成Domain Model style,來取得 面對複雜需求,仍然可以有效降低花費心力和提成系統彈性的能力。

如何使用Domain Model設計風格
Domain Model設計風格是目前takeshi在作系統設計的主力,所以本文章之後都聚焦在Domain Model上來作討論;另一方面,takeshi認為,Transaction style在實務上到處可見,有想要繼續討論的朋友可以跟takeshi說ㄛ~


Domain Driven Design
Domain Model設計風格是一種概念,換言之,可以實踐它的方式著實不少,takeshi目前實踐Domain Model的方式是遵照著Domain Driven Design社群的建議來作為設計的指導原則,有興趣的朋友們也可以參考此社群提供的功能完整的sample project(也有.NET版本的ㄛ);這個社群網站最初是起源於對一本書的讀書會,這本書就是『Domain-Driven Design: Tackling Complexity in the Heart of Software』,takeshi認為,此書是想要跨入Domain Model設計領域的朋友們,一定要讀的一本著作ㄛ,強力推薦~

FOG Design Pattern
這是欲加強自身功力的developer的必讀著作『Design Patterns: Elements of Reusable Object-Oriented Software』,這本書是討論design pattern的第一本書(1994年出版),也是作者的論文,所以有很多不易咀嚼的文章段落和少見的程式範例(Small Talk和C++),現今已有很多很友善的書籍來針對design pattern作討論,像takeshi的第一本design pattern的書是『Head First Design Patterns』,真的有好懂很多,強力推薦給有興趣的朋友們~

另外takeshi要再跟朋友們分享的是,takeshi在一開始學習design pattern時,一直找不到機會使用它們,過程中也和許多developer討論過,有些developer的論點是:「design pattern只是一種理論,實務上很難作發揮」,但經過takeshi多年下來的驗證 ,發現這完全是因為設計風格的問題!我們學了design pattern但使用不上的原因,完全是因為我們採取的是Transaction風格的關係,一旦我們採用了Domain Model風格,design pattern你想不用都難

實務經驗分享

takeshi使用Domain Model設計風格來實作專案大約經歷了兩個寒暑,其中也專案上線後由其他Developer接手維護的例子(當時takeshi已離開此工作環境了),當初takeshi在使用Domain Model設計風格來實作專案,希望能達到以下三點效益
1. 系統能有一個整體設計概念(核心)
在Domain Driven Design中提出,一個基於Domain Model作出的系統設計,會成為Ubiquitous Language,它記錄著此系統的核心概念;takeshi認為只要後手developer能搞懂這個由Domain Model組成的類別圖(當然還是要搭配循序圖和code),後手developer應該很快地就能搞懂此系統的商業邏輯全貌。

2.彈性大、擴充能力佳
由於系統提供的服務,是基於Domain Model之物件互動所產生的,一旦需求有變動,後手developer只要重新搭配物件互動的流程,即可完成變動之需求,系統彈性大 ;如果是新的需求, 後手developer也可以在domain model的整個繼承樹裡,找出變異的方法,透過繼承和多型的手段,來快速提供新的行為,而不須更動原本已撰寫好的物件互動流程,系統擴充能力佳。

3. 系統邏輯與使用者介面(User Interface,UI)完全隔離
由於系統的商業邏輯是基於Domain Model及其產生物件之互動所完成,所以跟系統的UI是完全沒有關係的(有效隔離);一旦End User要求變動UI,後手developer在更改UI時,完全不會影響到系統商業邏輯;如果是需要在UI上增加新的欄位,通常該欄位值也是Domain Model類別的特定屬性(Property)(也就是封裝),所以對後端系統商業邏輯也不會有大的影響(甚至沒有影響)。

而實際上,當後手developer在接手takeshi的專案時,的確要經過一段陣痛期(期間長度因人而異),因為從原本的Transaction設計風格要轉換到Domain Model設計風格,是一種思想轉換(paradigm shift),當通過陣痛期之後,經takeshi跟這位後手developer的確認,的確達到了takeshi一開始希望產生的效益!但對於沒有通過陣痛期的developer來說,他們大概會說:「這是什麼鬼東西,這種程式到底是怎麼寫出來的啊!」,對這些developer,takeshi也只能說:「你們的固執己見,有可能讓你們自己喪失了一個發現軟體開發新視界的機會ㄚ」。

2012年1月3日 星期二

軟體專案的素質之一 ─ 專案管理

有時候takeshi會跟同事們討論,軟體專案天生擁有這麼多複雜的特性,像是客戶需求不停地變動、新技術不停出現、系統效能不彰、外在環境變動(市場波動或政治因素等)、內在環境變動(資源不足或溝通障礙等)等...,在這些複雜的因素之下,我們到底要怎麼判斷一個軟體專案的體質優劣呢?

關於這點,雖然 takeshi也只是新手PM,有很多東東要學習,但是仍有一些個人的想法可以跟各位朋友們分享(沒看過豬走路,也吃過豬肉ㄚ),takeshi認為至少可以從三點來判斷軟體專案的素質,那就是專案管理、整體設計和自動化支援程度!

takeshi雖然嘴巴上講了粉多次,但還沒把它們好好地寫下來過,為了可以讓takeshi自己可以好好整理這些概念,takeshi就這三個概唸作出發,畫出了以下心智圖,心智圖檔案在這裡



由心智圖可看出,這三個概念其實是由很多子概念組成的,這每個子概念至少都可以多讀個好幾本書說>"<, takeshi也不是全都懂,或是全使用過,不過察覺是智慧的開端,takeshi"儘量"就每個概唸作簡單的介紹,並附上相關連結,讓有興趣的朋友們去深入瞭解~

但礙於要提及的東東粉多,所以takeshi打算拆成多個文章來介紹它們,這次就先從專案管理說起,其他的部分就請各位朋友們耐心期待一下嚕~

專案管理
說到專案管理,是每個人都掛在嘴上的東東,它的定義是指「一個暫時性(temporary)的組織與努力付出,在一段事先確認的時間內,運用事先決定的資源,以產出一個獨特的(unique)且可以事先定義的產品、服務或結果。」,就此定義來說,每個人多少都有專案管理的經驗了,只是範圍和目的的不同罷了,買房子是一種專案管理,結婚也是一種專案管理,甚至生小孩也是一個偉大的專案管理工作ㄚ!當然我們這邊主要是針對 軟體開發 作討論啦 :p

方法論
定義為「在軟體工程與專案管理中,方法學通常是指一系列編撰好的建議方法,有時還包括訓練材料、正規教育性程序、工作表和圖像工具。與其被稱為方法學,這些概念比較適合叫作方法」;雖然以工程角度來看,軟體開發是一項非常年輕的學門,但已有許多專家學者提出了非常多的方法論,來解決軟體開發中各項活動所遇到的各種問題。takeshi只就常見的 瀑布式開發 和近年非常容易聽到的 疊代式開發 作介紹~

瀑布式開發
定義為「開發被認為是按照需求分析,設計,實現,測試 (確認), 集成,和維護堅定地順暢地進行」,其實也就是依循著系統開發生命週期(SDLC, System LifeCycle)的順序,一步一步的往下走;其定義背後其實有一種假設,那就是使用者需求變動很少,所以該模型假設因需求變動而回到上一步驟的頻率很低,而且每次回到上一步的風險是很大的,例如在測試階段使用者發現系統效能不符合預期,故要求改善,然而因系統架構已然定型,故最後為了要克服系統效能不彰的缺陷,必須冒著更改架構的高風險來達成。

然而在實務上takeshi接觸到的專案,幾乎都是以此概念在進行的,即使是他們表面上打著疊代式開發的招牌...

疊代式開發
定義為「整個開發工作被組織為一系列的短小的、固定長度(通常兩到四週)的小項目,被稱為一系列的疊代。每一次疊代都包括了需求分析、設計、實現與測試。採用這種方法,開發工作可以在需求被完整地確定之前啟動,並在一次疊代中完成系統的一部分功能或業務邏輯的開發工作。再通過客戶的反饋來細化需求,並開始新一輪的疊代」;在以上這麼冗長的定義來看,takeshi覺得最重要的概念是提早把風險暴露出來,在每一個疊代要被release之前,一定要讓系統的終端使用者確認和使用,讓他們越早把問題和需求變更反饋給開發團隊,調整的功夫就越小;takeshi認為這是疊代式開發最具有價值的環節之一,然而在上一節提到,許多表面上打著疊代式開發招牌的團隊,通常是開發的確切了多個疊代,但往往卻在最後系統上線之前的UAT(User Acceptance Test),才讓終端使用者上測試環境測試,導致在最後一刻爆出許多問題需要處理,在此時花費的成本是最大的...

以下秀出一個defect在系統不同的生命週期所要花費的成本比較圖 (美元計),供大家參考
參考網站在這裡

敏捷式開發方法 (Agile Software Development)
敏捷式開發方法是近年來相當火紅的軟體開發概念,他的中心思想是Lean Software Development(精益軟體開發思想,takeshi不太想用中文講它啦...),源自於日本豐田汽車公司的製造概念Lean Manufacturing(同時他們也是Just In Time的創造者),其重點就是要組織全面消除浪費;而在軟體開發領域來說,軟體的交付對於客戶公司的管理階層來說,其實是一種端對端的概念,也就是說「我付了一筆錢,等一段時間,就有一個軟體自動化系統可以使用」,而Lean就是針對這端到端之間的所有流程,都要把浪費降到最低;而所謂的浪費是指「任何不能為客戶增加價值的行為即是浪費」;敏捷式開發即是把其思想當作核心,演變出了相對應的方法論,來幫助軟體專案流程。

此外,敏捷式開發方法也被稱為是「低儀式性」的,就是它跟傳統的開發方法比較起來,在系統開發週期中的每個階段所要求的產出文件,要少了很多,一般的敏捷式開發方法通常到專案結束的產出只有 需求文件(user stories)、自動化測試程式和滿足客戶需求的可運行系統。通常少於20人的團隊較適合敏捷式開發,不過takeshi認為還是要看當下環境怎麼去做配合啦。

現今的敏捷式開發方法,可謂是百家爭鳴,就takeshi的理解,目前的主流可分為三個部分...
指導管理階層如何使用敏捷式管理。
指導工程人員如何使用敏捷式開發。
指導如何把開發團隊跟維運團隊緊密結合。

以上列出的這三個不論是要稱它們為框架、方法論或概念也好,反正它們就是分別從不同的角度 管理、開發和維運來切入,幫助其中參與之相關角色來採用敏捷式開發。takeshi對這三個東東雖然寫得少,但它們是粉重要的ㄛ,只是這三個東東可以寫得粉長,而網路上已經有很多優秀的資源可供參考了,takeshi有機會再跟大家討論唄~

關於敏捷式開發有一個非常重要的觀念是大家不可不知的,那就是一定要採用 TDD(Test Driven Development) !(自動化、可回歸的測試程式貫穿整個單元、整合、系統測試)因為當測試程式的涵蓋率夠高的時候,它會形成一張品質的安全網,成為整個專案的重要基石,敏捷式開發之中提到的每個疊代都要release可用的系統、不停重構、提早暴露風險,etc,都是建構在自動化測試之上的ㄛ!通常這時候就會有人問說,到底測試程式要寫多少才足夠呢?Martin Fowler的回答是「至少要跟專案程式碼差不多多吧!」

Rational Unified Process (RUP)
目前由IBM公司在維護和推廣此方法論,RUP也是疊代式開發的一種類型,但它跟敏捷式開發比較起來,就好像是在光譜的兩個極端(也就是高儀式性),它要求在其定義的管理活動的每個階段,都需要產出或修改相關文件,所以相關人員需花費許多時間來作維護。所以RUP通常適合多於20人以上的大型專案。撇開專案文件的要求不說,takeshi是相當喜歡此方法論的概念^^

Agile Unified Process (AUP)
剛剛提到Agile Software Development和RUP就像是兩個極端對立的世界,而Scott Amber提出了敏捷化(agilize)的RUP版本 AUP,它介於Agile和RUP之間,既顧及了在RUP規範中要求的必要文件產出,在其他部分則是採用了Agile的活動,如TDD、AMDD (Agile Modeling Driven Development)、Agile Change Management和DataBase Refactoring等,使得開發團隊又多了一個新的選擇;以takeshi的看法,在台灣面向客戶的專案,採用Agile可能執行面有困難(公司內部的專案可行性可能比較高),因為通常客戶還是會要求要有專案相關文件(需求文件、設計文件、測試計畫、佈署計畫,etc),而RUP是太重量級了,所以AUP可能不失為是個好的選擇ㄛ~

裁切(Tailor)
takeshi要提醒一下,這世上所有的軟體開發方法論,都要求使用者在使用時,要配合當下環境作適度的裁切,而不是一味的照單全收,到最後通常會落得消化不良的下場ㄛ

風險
以上takeshi所提到的軟體開發的方法論,其主要用意都是一樣的,就是如何規避風險,來產出user滿意且品質良好的軟體系統,只是採取的工具與方法不同罷了(有些是強調文件的完整性,有些是強調產出隨時可運行的系統);所以我們也要來瞭解一下這些"風險"到底有哪些呢?takeshi曾經上過的OO-226課程,把風險作了以下五種分類

  • 政治風險
人際關係不良、組織中的各種小團體、人性等,所產生的風險

  • 需求風險
溝通不良、誤解、亦或是User自己沒想清楚而造成需求衝突(I know it when i see it)所產生的風險

  • 資源風險
專案範圍、時程、資源(人力和預算等)和品質之間的衝突,所產生的風險

  • 技術風險
採用開發團隊所不熟悉的新技術,所產生的風險

  • 技能風險
開發團隊成員技能與任務的調配,所產生的風險,例如把系統UI的任務指派給專門寫Store Procedure的Developer :p

所以專案團隊在選擇開發方法論的時候,要考量此方法論是不是真的能解決或降低當下環境的風險,確定了方法論後,再依需求對方法論作裁切動作,試著run兩、三個疊代,再慢慢的調整方法論的細節,到整個方法論跟開發團隊非常契合為止~

專案管理 與 整體設計和自動化支援程度 的關係
從專案管理開始,決定採用哪種開發方法論,間接指定了採取哪一種 整體設計概念 和 自動化工具的支援程度;而決定了以上兩者,在專案實際開始執行時,又會回過頭來影響的專案管理的部分,而良性的影響,會漸漸成為良性循環,反之亦然。


takeshi在台灣實務上的經驗是,為數不少的清況下,專案成員不知道自己的專案是在run哪種方法論 或是把覆往式run成瀑布式 亦或是 壓根沒聽過上述提到的東東...,但takeshi認為這是影響專案優劣的重要起點,不可不慎ㄚ...

2011年12月27日 星期二

關於簡介

關於takeshi的簡介,是這樣寫的...
Software Development for me, is like an ancient japanese samurai with his katana... which is not only a tool for feeding my belly, but also a tool for feeding my soul.

翻成中文是以下意思
對我來說,軟體開發就好像 古代的日本武士跟他的武士刀 一樣,這把武士刀不只是填飽我肚子的生財工具,同時也磨練我的心靈。

說來有趣,其實這句話是從takeshi生平第一次看完的日本大河劇場「龍馬傳」中得來的體認,龍馬傳在日本播映時似乎蠻熱門的,而takeshi自己也是看得津津有味地,此劇在重要的場景相當熱血,粉符合takeshi的口味ㄚ~

凡是關於龍馬的片子,一定會有「黑船來航!」這個名場面,話說此時的主人公龍馬,正在神戶的千葉道場練劍順便跟看板娘搞個小曖昧啦,聽到黑船來航的消息,平時就精力旺盛的龍馬,當然就迫不及待地,跑去湊熱鬧啦!他急急忙忙地跑到消息指向的海灣,原本是為了要滿足他比一般人還要旺盛的好奇心,結果卻被眼前的場景給嚇傻了不知有沒閃尿!眼前巨大無比、船體漆上黑色塗料的四艘蒸汽船,從他的眼前緩緩逼近,龍馬急忙地拔出他最信賴的武士刀,卻發現自己跟任何一艘黑船相比,都像是個用手指頭就可以隨意捏死的小螞蟻一般地無力...當然人家黑船艦隊根本鳥都不鳥他,往他們的目的地漸漸駛遠了,只剩下嚇的全身無力的龍馬,攤坐在地上,久久不能回神...

兩個傻b :p


 黑船事件過後,龍馬自暴自棄了好一陣子,他不明白,在這樣壓倒性的武力之下,他每天努力地練劍,到底有什麼幫助呢!?後來經過了龍馬的兄姐、朋友、師傅、看板娘的引導(印象中記得,這段劇情拖了有一、兩集之久,takeshi為了要看結果,整顆心都懸在那,所以只好一口氣一直看下去了>"<),龍馬終於走出了低潮,種下了往後特立獨行的尊皇攘夷思想的種子,關於劍道的部分,龍馬也有更深一層的理解,雖然隨著時代的演進,往後劍術發揮的機會越來越少,但是修煉劍道的另一層面,其實是磨練自己的心志!隨著劇情的演進,龍馬在實戰上用劍的機會越來越少,反而是用槍比較多呢!但是每當龍馬在思考國家大事時,他都會一人站在庭院裡專注地練劍,以藉此沉澱自己的思緒。

ㄚ!話題有點扯遠了:p  繼續回到正題
看完此段劇情後,takeshi心中就有一種感觸,以前生存在幕府時代 的武士們,都是靠不斷的修習自身的劍術,展現自己的武勇來獲得社會地位,也就是他們吃飯的傢伙!但另一層面,他們同時也靠著劍道修習,透過不斷地自我懷疑和驗證,來砥礪自身的心志。takeshi覺得,在古時享有盛名的偉大武術家,他們不只是武術高明,通常也是偉大的思想家!

回頭來看看現代的我們這些知識工作者,不也是這樣嗎?
以我們軟體開發領域來說,我們每天面對著日新月異的技術,處理跟解決顧客各式各樣的問題,這是我們賴以維生的方式,也就是要不斷地磨練自身的劍術;另一方面,takeshi之前看過一本書寫說:「你寫出來的code,就像一面鏡子反映出你的內心寫照」,所以takeshi認為,除了要依據承諾解決顧客的問題之外,我們對於好設計的追求,不斷地磨練自己的設計能力和撰寫出來的程式碼,其實就是磨練自己的心志,就像古代的日本武士一般。

好啦,takeshi這次想說的就到這唄~ 最後再容takeshi問一句...


你/妳希望自己的武士刀是什麼樣子的呢?



2011年12月15日 星期四

Opensource License研究心得

最近takeshi在研究關於Opensource License的相關資料,以前都只管用而已,現在是真的需要瞭解一下了...話說真的不是普通的複雜ㄚ...花了幾天,研究了一堆參考資料,到現在還是一知半解...,不過算是可以稍微分享一下心得啦,順便也當作是在作筆記,以後忘記了還可以回來看看:p

免責聲明
以下資訊是個人的讀書心得,不保證正確ㄛ,所以各位朋友真的要拿去作啥東東的話,還是要再去跟專業人士作確認會比較好ㄛ

使用工具
takeshi在研究東東時,有時會用到心智圖軟體,如以下所附心智圖圖片,takeshi目前用的是這套XMind,心智圖檔案在這裡;不過真的有需要的朋友再去下載就好了,只是稍微淺嚐即止的話,就繼續往下看唄~~

介紹
1. 先直接附上心智圖圖片如下

2. 簡略說明
takeshi就從右邊的"分類"項目起 ,接著是左下的"授權種類"項目,作一些簡略說明與介紹。

2.1 分類
2.1.1 自由軟體 (Free Software):Richard Stallman發起的一種軟體授權模式,目前由自由軟體基金會(Free Software Foundation)維護,保障軟體的使用者擁有以下四大自由。
  • 自由之零:為了任何目的執行程式的自由。
  • 自由之一:研究程式如何運作的自由,並且將程式修改符合本身需求。程式碼的近用是實現這個自由的先決條件。
  • 自由之二:再次散佈程式的自由,以幫助你的鄰居。
  • 自由之三:改進程式的自由,並將這些改進回饋給社群,讓整個社群均可以因此而受益。程式碼的近用是實現這個自由的先決條件。
這裡的Free指的不是免費,而是自由(Freedom)!我們常聽到的Linux就是自由軟體ㄛ

2.1.2 專屬軟體 (Proprietary Software)
目前市面上的商用營利軟體以專屬軟體為大宗 ,像是大家都很熟悉的OS Windows,就是其代表。

2.1.3 免費軟體 (Freeware)
通常只讓使用者有免費執行該程式的自由,而不及於其他諸如修改、散佈、商用等自由(不完全的四大自由)。像防毒軟體小紅傘個人免費版就是其代表,假如用戶想要使用其他進階版本,就要另外收費囉!

2.1.4 共享軟體 (Shareware)
其實就是試用軟體 (trial-ware)啦,現在很多軟體都有提供30天免費試用,等期限到了會自動詢問使用者要不要購買授權。

2.1.5 公共財軟體 (Public Domain Software)
作者自願放棄著作權,所以法律上的意義是沒有人擁有這個財產的產權,所以任何人都可以使用,不必取得任何人的同意。總而言之,它是比自由軟體還要更自由的軟體類型呢!takeshi對這一塊就沒那麼熟悉了,不知網友們有沒有好的例子呢?

2.1.6 開放源碼軟體 (Open Source Software)
也被簡稱為「開源軟體」,在作法上,這類型的軟體跟自由軟體一樣,都保障使用者的四大自由;它們之間的不同是在觀念,自由軟體是要保障使用者的四大自由,是從道德上的角度去看待軟體;而開源軟體則是認為由開源社群去發展和維護軟體,是比較有效率和品質的作法,所以它是從品質的角度去看待軟體。

不過網路上也有很多社群是把它們統稱在一起,如free/open source software (FOSS) 或 free/libre/open source software (FLOSS) 等。

2.2 授權種類
這世界上的授權種類太多了!takeshi只就平常容易接觸到的GPL和Apache授權作介紹囉~

2.2.1 GNU General Public License, version 2.0 (GPL-2.0)
也就是自由軟體所採用的授權啦!要使用者完全遵從四大自由規範,屬於約束力和感染力超強的授權(對商業應用不友善)!只要你的程式使用到GPL授權的程式(不論是透過動態或靜態連結),你的程式也必須要遵從GPL的授權。

換句話說,假如你寫的程式,以後是要當產品來賣並且不想公開原始碼,最好不要用到GPL授權的元件,因為你的程式會被迫成為GPL授權。假如你認為程式本身開源沒關係,你們是要賣的是服務的話,那就沒問題囉。另外像mySQL、或是ZK Framework等軟體也是GPL系列的授權,但對於商業客戶是可以轉換成商用授權的,所以它們是採用雙授權模式(Dual License)。

還有一點很重要的是,GPL-2.0和LGPL-2.1跟Apache License-2.0是不相容的ㄛ,也就是說你的程式不能同時使用GPL/LGPL-2.0和Apache License-2.0的軟體元件,但GPL-3.0和LGPL-3.0跟Apache License-2.0則是相容的(因為3.0多了附加條款,見下節)。

2.2.2 GNU General Public License, version 3.0 (GPL-3.0)
仍是延續保障四大自由的主要精神,加上一些修改來符合產業現況。主要有...
  • 附加條款 (Additional Terms)
用來提高跟其他自由軟體授權的相容性,所以GPL/LGPL-3.0可以相容於Apache License-2.0了。
  • 專利授權條款
之前的GPL/LGPL-2.0並沒有針對專利授權的相關條款,但現在3.0版本已經明定,要將程式含有的專利使用權利也要一起授權出去,以保障使用者的自由。

2.2.3 GNU Lesser General Public License, version 2.1 (LGPL-2.1)
相對於GPL授權的高感染性,以至於在商業應用的推廣上,很多人都避而遠之;FSF為了能進一步提高自由軟體的市佔率,因此提出了一個感染力較低的折衷授權方案,它就是LGPL!

LGPL主要是針對函式庫(Library)軟體元件為授權標的,如果第三方程式僅是單純地連結(定義粉模糊...)至LGPL授權的函式庫,那麼該第三方程式可以不採用GPL/LGPL授權;據takeshi找到關於"連結"定義的參考資料,是這樣說的...
  • 動態連結:程式與LGPL2.1函式庫之間可取代的連結關係,若喪失這個連結關係,則該程式仍具大部份的功能,僅部份的功能在表現上沒有連結之後優異;此類型被定義為「使用函式庫」,該程式可以不接受GPL授權。
  • 靜態連結:程式與LGPL2.1函式庫之間必然的連結關係,若喪失這個連結關係,則該程式喪失大部份的功能;此類型被定義為「基於函式庫」,該程式必須接受GPL授權。
看完之後還是霧傻傻啦...所以各位朋友們真的要使用LGPL-2.1的函式庫時,最好還是要找人問清楚比較好ㄛ

LGPL-2.1和GPL-2.0是相容的,且LGPL授權可以轉換成GPL授權(從低約束力轉成高約束力),但不允許反轉(從高約束力轉成低約束力)ㄛ!

2.2.4 GNU Lesser General Public License, version 3 (LGPL-3.0)
LGPL-3.0算是給商業應用的使用者帶來一大利多ㄛ,它的重大改版如下
  • 大幅度縮小的感染範圍
就如在上一節講到的「動態連結」和「靜態連結」的使用方式,都不會被LGPL感染囉!

  • 明示使用
加強了對使用者如何明確地幫使用到的LGPL函式庫打廣告;其實它跟上一條修改條款是一對的,也就是說,FSF給你更低的約束,但條件是你要好好幫他們打廣告:p
  • 使用範例,述明 LGPL3 的諸般義務性要求
比起上一版的模糊不清的"連結"定義,這次的版本給出了四種範例來明確說明其連結或是結合等關係,然而這些關係中,現在也只有去直接修改LGPL函式庫,才會被感染囉。

2.2.5 Affero General Public License, version 1 (AGPL-1.0)
GPL的加強版,具有極高度感染力,專門針對ASP廠商,如Google、Yahoo!等;大部分的自由軟體授權針對「散佈」的定義,是針對程式的物理性移動(拷貝給別人,etc),但AGPL包含程式如果是在客戶端執行也算在內,如網路應用程式在客戶端執行等;因為現行大部分的ASP業者對Internet提供服務,其後端都採用了大量的GPL程式,但卻不必對外開放他們的原始碼(因為基於GPL授權),但FSF並不支持此狀況,故提出了AGPL授權,來約束ASP業者;當然,ASP業者也可以選擇不要使用這些AGPL授權的軟體元件啦。

2.2.6 Apache License, version 2.0 (Apache 2.0)
Apache License從名稱就可以看得出來,它就是由大名鼎鼎的Apache Software Foundation所推出的授權啦!它可是對商業非常友善的授權ㄛ(約束力和感染力粉低),只要你在保有歸屬聲明(Attribution Notice)的前提之下,你就可以對Apache授權的軟體元件作再修改、自己決定要不要公開原始碼、甚至可以對它作重授權(sublicense);即使是此軟體元件有包含專利,Apache授權也要求原著作人必須連同專利使用權利也必須一起授與出來,在法律上保障使用者的自由。

不過它只跟GPL/LGPL-3.0相容,也就是說,你的專案可以同時使用這兩種授權的軟體元件,但Apache-2.0和GPL/LGPL-2.*就不被允許ㄛ...

3. 參考資料
takeshi這次作的這番研究,主要的參考資料是從 中研院 自由軟體鑄造場的法律源地 得來的(另外就是相關授權的英文原版),他們既專業,又是免費服務ㄛ!

各位繳了那麼多稅,也是該用一下了吧:p



2011年12月7日 星期三

Java MVC sample #2 with Maven

takeshi這幾天花了點時間,把sample project#2 從eclipse專案配置改成Apache Maven專案配置;之前的sample project #1 & #2,純粹是為了教導新人方便,所以直接基於Eclispe專案配置,讓新人直接把專案匯入Eclipse之後,就可快速運作程式並學習

但在實務上,takeshi比較偏好使用Maven來建置專案,原因主要如下

1. 依靠特定IDE的專案配置是不理想的
在Java的世界裡,有太多IDE在競爭了(Eclipse、Netbeans、IntelliJ、JDeveloper,etc...),所以你不能保證你的環境在使用的IDE,未來的某一天會不會被取代掉;像takeshi自己和同事就有遇過要把JBuilder-based專案配置 換成 Eclispe-based專案配置 的需求

使用了Maven,由Maven來提供一個預設的配置環境和完整建置流程,所有使用Maven的專案,大家的專案配置都一模一樣,這樣從別的專案過來支援的Developer,很快地就可以對你的專案上手;因為Maven是Apache Foundation的標準建置工具,所以理所當然地,所有還想繼續混下去的IDE,也不得不支援它囉!這樣的好處是你可以隨時抽換你使用的IDE或是不同Developer使用自己喜好的IDE,而不會帶來專案配置結構的任何改變,仍然可以維持版本控制系統source的一致性!

2. 相依性管理
使用Maven的另一個好處,就是它會幫你管理jar檔之間的一致性,你只需要在Maven的pom.xml設定檔,把相依性設定好,在運行Maven的時候,它就會自動地到Maven Repository去尋找你所指定的jar檔,並且幫你放置在你專案建置好的最終檔案中(例如war檔,就會把相依jar檔放置在/WEB-INF/lib中)

例如在pom.xml檔案中加入以下設定,請Maven在建置專案時,幫你把commons-lang-2.6.jar加入到你的專案中

    commons-lang
    commons-lang
    2.6


以下是sample project#2的相依性圖
在執行專案的時候,只要把專案和pom.xml一起放置在版本控制系統中,任何新加入專案的Developer,只要把整個專案從版本控制系統copy下來,運行Maven一次,專案的環境就建置完成了!(不包含IDE的設定啦...)

3. 完整的建置流程
隨著近代軟體開發方法論的演進,自動化可回歸的測試已成了顯學,像takeshi自己就有「無測試程式恐慌症」,就是看到沒有測試程式的案子,就會頭痛、暈眩、上吐下瀉等症狀一一浮現...假如你跟我有同樣症狀,那就恭喜你稍稍跟上時代的腳步了:p

但即使你撰寫了涵蓋率高的測試程式,仍然需要把它們整合到你的專案建置(build)流程中,這樣才能確保你的專案在每一次建置時,都通過了大家擠破腦袋、流血流汗產生的測試程式,藉以提高專案的品質;而Maven天生就提供了完整的建置流程,從compile class檔...運行單元測試...運行整合測試...到建置結果檔案(jar、war,etc),甚至是自動幫你佈署到特定環境(dev、test、prod,etc),這些都可以交給Maven幫你處理ㄛ!
Maven的建置流程基本如下圖所示,詳細文件請看這

更有甚者,Maven也可以整合進近年相當火紅的Continuous Integration開發模式中,不過takeshi目前也還沒接觸過這一塊,未來有機會再來討論囉~


講了這麼多,我還沒把sample project #2 with Maven的連結給大家哩:p,連結在這~
使用步驟如下...
1. 把專案下載至本機後,解壓縮至安裝路徑

2. 下載Maven並安裝,跟一般的Java程式(Ant、Tomcat,etc)安裝步驟大同小異,詳情請看這裡

3. 在專案安裝目錄(有pom.xml的那層目錄),執行mvn install,Maven就會幫你把專案執行測試並建置成war檔

4. 如果要在Maven中運行專案,可以執行mvn jetty:run,然後使用此URLhttp://localhost:8080/takeshi-mvc/bin-debug/連結至專案首頁,便可使用專案

5. 如果要把專案匯入到Eclispe的話,請先安裝m2eclispe,官網有教學影片,相當friendly

6. 安裝完m2eclispe之後,你就可以透過Eclispe來執行Maven,更重要的是,還可以使用Eclispe的debuggerㄛ!使用細節如下影片~

 
最後takeshi要提醒的是,Maven只是takeshi現階段喜好的專案管理工具,不過它已經是Java世界的老人了...現在也有其它的選擇,如Ivy、Buildr等,喜歡嘗鮮的朋友可以去試試看,到時記得要跟takeshi分享ㄛ ^^

2011年11月27日 星期日

Java MVC sample #2

很快地,一個禮拜又過去了,這次takeshi要介紹的是Sample Project#2
經過Sample Project#1使用標準JavaEE技術實作的MVC架構介紹後
這次的Sample Project#2使用的主要技術如下
視 專案需求/不同的Device 抽換/同時使用 不同的UI技術,就takeshi的理解,
要作到RIA(Rich Internet Application),目前的主要技術有兩種,一種是Ajax技術 ,另外一種是Plug-in based技術(以後takeshi再詳細討論吧...)

而這次主要是使用plug-in based中相當主流的Adobe Flex(之後takeshi也打算再介紹Spring-MVC)
  • UI MVC使用技術:PureMVC for FLEX3 2.0.4
由於雲端運算和Web2.0概念的流行,現今網站應用程式(Web AP) 的操作都越來越接近傳統的Rich GUI(也就是需要安裝在客戶端的應用程式),亦或是更為複雜,所以除了使用系統整體架構上的MVC之外,也在UI層中再使用一層MVC架構,來讓專屬於UI操作的邏輯可以切分清楚,並且達到程式碼重用等好處

PureMVC不但有Flex的版本,它還有其它平台的版本,例如Java、JS等
但說真的,takeshi認為Pure MVC的架構蠻不錯的,但學習曲線不低...
不過takeshi以後有機會,也會在其它平台上使用PureMVC啦(Learn once Write Anywhere :p)
這個framework就不用多說了 吧,這是takeshi最喜愛的frameworkㄛ!
說到ORM技術,一般都是聽到hibernate、JPA等名稱,但takeshi對myBatis可是情有獨鍾
嚴格來說,它是SQL mapping技術,而不是ORM技術,它目的很簡單,就是幫助使用者可以很簡單的使用SQL,可以省掉很多像使用JDBC要撰寫的繁瑣程式碼,如getConnection、prepareStatement、ResultSet.close等,好學、易用、輕量!


在takeshi參與專案的經驗,架構的設計通常都是Multitier Architecture,例如本文後續所附之架構圖,就分為Client、Presentation、Biz Logic、Data Integration和Resource等,在此框架內使用哪一種技術,就必須基於系統的運行環境、限制和開發團隊(主要是Architect)的經驗做判斷

一般來說,之前已建立的系統架構可以當作之後專案架構的template(例如Sample Project #1 & #2),稍作修改便可直接使用,所以每次基於不同專案所作的不同系統架構,都可以保存在版本控制系統內,讓架構設計之解決方案越來越豐富,加快開發團隊的效率(也歡迎你/妳拿takeshi整理的架構來用ㄛ ^^)

接下來又到了介紹如何使用Sample Project#2囉~
1. 下載Sample Project
Sample code在這裡,把下載之zip檔案解壓縮並匯入到Eclispe裡

2. Tomcat設定,請參考Sample Project#1

3. 資料庫設定和ER-Model設計,也請參照Sample Project#1

4. 執行和操作方式


5. 本專案使用到的技術和架構如下

6. 參考文件
由於此次Sample Project使用了不同的技術,所以特別註明參考網址,方便網友們參考
  • Adobe Flex
Getting Started
Reference
Flash Builder Download
  • PureMVC
documents
  • Adobe BlazeDS
Main Page 
  • Spring-Core
Java API docs
  •  Spring-Flex
Main Page
  • MyBatis
Main page for Java

takeshi當初在整這個專案時,也花了大約兩~三天的時間,過程中小問題不斷
所以網友們有問題可以提出來跟takeshi討論ㄛ~

2011年11月20日 星期日

Java MVC sample #1

前陣子因為公司長官的要求,現在負責訓練新進JavaEE工程師的training
目前大部分新進同仁都會被派駐在user site,提供資訊服務,如軟體開發、實作等
所以讓新進同仁能快速學習到實務上會遇到的情形是一大重點

因此takeshi寫了個簡單的sample project,期望此sample project能滿足以下目標
  • Trace code:在大多數情況,要先看懂前人寫的code,比自己會寫還重要
  • MVC Design:現今的資訊系統開發,大多有使用到MVC Pattern,但剛出社會的新鮮人可能還沒碰過
  • Requirement Change:在新人看懂sample project之後,takeshi會提出新功能需求,請新人依據此sample project之MVC架構,直接長出新功能並驗收
  • 熟悉工具:Eclipse IDE、WTP、Tomcat和Debugger(不是開玩笑的,takeshi還真遇到有不少人不會用debugger...)
  • Container的使用:本sample project #1有使用到Tomcat的安全性服務,takeshi在實務上也看到不少實作都是用自己開發的元件來作,但takeshi想提醒的是Java Container的功能遠遠比我們想像的還多...
  • 尋序漸進: sample project #1是簡單版本,尚未套用任何framework,主要是讓新人知道,使用JavaEE Web Spec.是如何實作出MVC架構的,之後還有#2(Flex版本,希望未來有空時,再加上其它的版本)
接下來是重頭戲啦~以下介紹如何使用Sample Project #1

1. 下載 Sample Code
1.1 sample code在這裡,SVN Borwser在這裡
1.2 接著把程式training01.zip解壓縮並匯入到Eclipse中

2. 設定Tomcat
2.1 Tomcat版本6.0.x,在這裡下載
2.2 因為本專案使用到Tomcat安全性服務,所以要另外下載設定檔在這裡
在ZIP檔案中有三個檔案
server.xml 要複製到 ${TOMCAT_HOME}\conf\
h2-1.2.121.jar 要複製到 ${TOMCAT_HOME}\lib\
keystore 要複製到 ${user.home} \
當然你也可以改成你要的路徑,也請一併更改server.xml的94行
<Connector SSLEnabled="true" clientAuth="false"
 keystoreFile="${user.home}/keystore" keystorePass="changeit"
 maxThreads="200" port="8443" 
 protocol="org.apache.coyote.http11.Http11Protocol" scheme="https"
 secure="true" sslProtocol="TLS"/>
2.3 如何使用SSL登入Tomcat在這裡,如何使用JDBC Realm在這裡
2.4 把Tomcat加入至Eclispe的WTP中,待會執行Sample Project時,Eclispe會把project佈署在Tomcat裡執行

3. 資料庫設定
假如是測試或學習的目的,takeshi很喜歡使用H2 DB,它非常輕量(一個JAR檔,h2-1.2.121.jar),且在embedded mode還可支援多個連線(不像Derby或其它DB)
3.1 運行H2 DB,把${sampleProject#1}\trainingWebAp02\docs\db\createData.sql檔案中的SQL Script丟到H2 DB執行
3.2 會長出以下Schema和相關測試資料


4. 終於可以執行專案了!
執行和操作方式粉簡單,如下影片所示

5. 在本專案主要使用到的技術和架構如下

 需要特別注意的是
  • MVC分別由 Biz/Data Integration Tier代表Model和Controller,Presentation代表View
  • Presentation只能使用JSP/EL,儘量不在View裡撰寫Java code(Scriptlet),如邏輯相當複雜,可考慮使用javax.servlet.jsp.tagext套件求解(SimpleTagSupport等類別)
  • 由Biz/Data Integration Tier來同時處理Request/Response/DAO等工作,之後的Sample會再切分

今天就先寫到這吧,之後takeshi會在把Sample Project #2給放上來~