l

2011年7月4日 星期一

CI 之看來看去少了一點什麼

July 04 21:35~22:55

前一陣子為了找資料花了點時間把 Continuous Integration: Improving Software Quality and Reducing Risk 這本書再讀過一遍,這本書 Teddy 讀過好幾次了,但總是沒有耐心把全部的內容都看完,這次當然也不例外...XD...不過這次有『很用力』的把 50% 以上的內容仔仔細細地重讀一次。以 Continuous Integration (CI) 這個領域來講,這本書算是寫得不錯了,該講的事情大概都有提到,但是不知為什麼,Teddy 讀起來總是覺的少了那麼一點什麼 。

如果鄉民們讀過 GoF 的 Design Patterns,『一路上』應該會有那種『不停地被打一拳』的感覺。這種感覺,雖然痛,但是卻痛的很值得,讓人覺的這是本有層次,有深度的書(史瑞克內心獨白:妖怪就像洋蔥一樣,是有層次滴)。而這本 CI 的書,雖然也提供了許多有用的 guidelines,但卻只是讓人有一種『知道了』的感覺,有點不痛不癢。到底少了什麼?

對,到底少了什麼?Teddy 原本也不知道,但是這次舊地重遊之後,Teddy 似乎發現了一絲線索。話說 Teddy 最近在想一個問題:

你打算要開發一個軟體,要如何將該軟體放到 CI 系統上?

路人甲:嘿嘿嘿... Teddy... 你不是『號稱』對 CI 很熟嗎?怎麼連這個問題都不知道?

是啊,如果鄉民們仔細去看一下 CI 相關的資料,大概可以發現,大部分談得都是:
  • CI 的好處:這一點就不用在多做解釋了。
  • CI 應該能做什麼:編譯,測試,程式碼分析,產生文件,產生安裝軟體,自動佈署等等。
  • 工具:在 CI 系統上有哪些(自動化)工具可以使用。
有沒有提到『如何將一個軟體開發專案放到 CI 系統上面』?其實是有滴,不有提的很少,大體上就是,舉個例子,給你看一個 ant script(build script),然後要把你的軟體專案(通常對應到 SVN 或是 CVS 上面某個目錄)放到 CI 系統上面,等時間到了 CI 系統自然會去執行這個 build script 然後一切順利之下安裝程式就產生了。

***

不知道鄉民們都是如何使用 CI 系統?如果軟體不是很大,依據一般書上所寫得方式,一個軟體產品一個專案,一個 build script,這也 OK。但是假設鄉民們的軟體有,例如,1 百萬行的程式,其中包含 Java code + Javascripts + XML + 一些有的沒的檔案,那麼如果在 CI 系統上面就只有一個專案,則可能會有下面幾點問題:
  • 這個專案的 build script 極可能變得超級複雜,不容易寫,也不容易維護。
  • 不容易分工也不容易理解。假設這個專案包含了很多模組,現在鄉民們只是要修改其中一個很底層的程式。為了修個這個底層的程式,鄉民們可能要把整個專案(1 百萬行)的程式給 checkout 下來到自己本地端的 workspace 裡面。然後,弄清楚自己這一次要改的功能在那裡,可能又要花一點時間才能找到程式碼的位置。光是用想得就已經累了。
  • 每次 build 一次專案很可能會跑很久。
***

另一種方法,Teddy 之前有介紹過,可參考這裡的文章。簡單的說,就是把這個 1 百萬行的軟體分成很多個不同的專案,然後將這些專案全部放到 CI 系統上面。每一個專案都有一個 build script,可以個別地被建構。專案和專案之間有相依性,在最上層的專案是一個『安裝程式專案 (Installation Project)』,負責用來產生安裝程式(最後交給客戶的軟體產品)。

分成很多專案的優點剛好可以解決上面 Teddy 所提到只有一個超級大專案的缺點。Teddy 之前已經介紹過幾種不同的專案類型,例如  Interface Project, Cross-Platform Project, Native Project, Single Shared Library Project, Installation Project, Patch Project,鄉民們可以參考一下這種作法(也許老早就有很多人也用類似的方法了)。

***

Teddy 之前還在研究 e-learning pattern languages 的時候,整理了一個 Separate Material Preparation from Integration pattern,大意是說,製作一個數位化多媒體教材的手續(流程),可以分成以下兩大部份:
  • Material preparation: 準備基本的教學內容素材,例如,文字稿,圖片,影音資料等等。在這個階段考慮的是,如何用最方便,簡單又有效率的方法與工具來產生數位化教學內容素材。 
  • Material integration: 把準備好的素材打包成一個課程,在這個階段考慮的是,用那一種教學流程來呈現這些基本的學內容素材,才容易被學生所了解。
為什麼會突然提到這個 pattern?套用 Teddy 之前介紹過的 CI patterns,其中 Installation Project 與 Patch Project 就好比 material integration 階段所要做的事情,而其他類型的專案(Interface Project, Cross-Platform Project, Native Project, Single Shared Library Project)則屬於 material preparation。希望下面這張圖可以幫忙說明這個概念:

***

也許鄉民們會說,阿把軟體系統分成很多專案不就是軟體架構裡面講的 module decomposition 的觀念嗎,這有什麼了不起的。或是說,這種區分專案的作法不是應該屬於 configuration management 的範疇嗎?CI 的書沒有提到也還好吧。也許吧,但就不知道是不是每一個學 CI 的鄉民們都能夠把 Continuous Integration: Improving Software Quality and Reducing Risk 這本書看完之後就可以『CI 一次就上手』。

***

友藏內心獨白:沒有什麼東西是一次就上手的。

沒有留言:

張貼留言