l

2013年7月26日 星期五

BDD(4):第一個Cucumber-JVM範例,上集

July 23 21:12~22:45

看了前三集,假設鄉民們已經知道BDD的基本觀念、Cucumber運作原理、以及如何在Eclipse中執行Cucumber-JVM,在這一集利用一個簡單但完整的範例,介紹一個使用Cucumber-JVM開發應用程式的例子。

***

新增Feature檔案

這個例子在《BDD(2):大家來吃小黃瓜之Cucumber運作原理》已經介紹過了,客戶要你開發一支應用程式,這支程式有一個功能叫做Greeting。在撰寫程式之前,客戶(或是開發團隊)先幫這個功能寫出驗收測試文件。

螢幕快照 2013-07-23 下午9.25.16

 

Cucumber-JVM的驗收測試檔案要描述在.feature的文字檔當中。請鄉民們先用Eclipse建立一個Java專案,然後新增一個名為test的source folder。在這個目錄中建一個resources目錄,然後新增一個文字檔hello_world.feature,檔案內容就是上圖中的文字。

螢幕快照 2013-07-23 下午9.28.15

***

執行測試案例

Cucumber-JVM整合了JUnit 4,要執行上面這個驗收測試,請鄉民們先新增一個名為GreetingTest的Java class(檔案可以隨便取,只要開發團隊知道這個class是用來代表Greeting這個feature就可以了)。

螢幕快照 2013-07-23 下午9.39.28

 

新增CreetingTest class之後,在class上面貼上@RunWith@Cucumber.Options這兩個annotation。

螢幕快照 2013-07-23 下午9.44.45

@RunWith這個annotation告訴JUnit 4,這一個測試案例請用Cucumber.class來執行它,而不要用JUnit 4預設的runner(因為JUnit 4看不懂Cucumber-JVM的驗收測試格式)。@Cucumber.Options裡面包含傳給Cucumber.class執行驗收測試時的參數,features這個參數告訴Cucumber.class,請執行Java classpath裡面的resources/hello_world.feature這個檔案中的驗收測試(也就是檔案中的每一個scenario)。

寫好之後用JUnit執行這個測試。

螢幕快照 2013-07-23 下午9.53.23

 

執行結果如下圖所示。看到JUnit變「綠燈」不要高興得太早,其實沒有任何測試案例被執行。

螢幕快照 2013-07-23 下午9.51.51

 

真正的「綠燈」畫面應該是這個樣子,每一個測試案例前面會有一個「打勾」的小icon。這是鄉民們接下來要努力的目標。

image

****

撰寫膠水程式

執行完JUnit之後,請鄉民們切換到Eclipse的Console view,會看到如下的畫面。

螢幕快照 2013-07-23 下午9.59.26

 

Cucumber-JVM好心提醒鄉民們,它找不到這個feature裡面的scenario的每一個step相對應的step definition程式(相關名詞說明請參考《BDD(2):大家來吃小黃瓜之Cucumber運作原理》,step definition就是所謂的膠水程式)。為什麼找不到?因為根本還沒寫…挑眉質疑。所以下一步就是要撰寫step definition,Cucumber-JVM已經告訴鄉民們,有三個step definition要撰寫。請鄉民們新增一個名為HelloStepdefs的Java class(檔案名稱可以隨便取),然後把Console view裡面的這三個step definition拷貝起來複製到HelloStepdefs。

螢幕快照 2013-07-23 下午10.18.48

寫好之後執行JUnit,發現這次錯誤訊息不同。Cucumber-JVM找到step definition,但是step definition的內容尚未實做。所以接下來的步驟就是要去填滿step definition的內容,讓測試案例可以通過。

螢幕快照 2013-07-23 下午10.21.22

***

今天先練習到這邊,下一集再繼續完成後半段的練習。看到這邊鄉民們不知道有沒有感受到一點BDD—「行為驅動開發」的味道:

  1. 先定義驗收測試條件,也就是應用程式應有的行為。
  2. 然後執行驗收測試,這時候因為找不到step definition而測試失敗。
  3. 定義step definition。
  4. 然後執行驗收測試,這時候因為step definition的內容是空的所以測試失敗。
  5. 填寫step definition的內容,在這個步驟鄉民們會開始思考production code的設計與實作。
  6. 當production code完成,整個驗收測試案例便可通過(或是反過來說,當最後驗收案例通過,就代表production code已經完成)。

下集會介紹5、6兩個步驟,敬請期待。

***

友藏內心獨白:到目前為止都還蠻簡單的。

2013年7月25日 星期四

Design Patterns這樣學就會了 入門實作班Day1教材分享

July 24 17:17~18:22

螢幕快照 2013-07-24 下午6.16.35

 

7/20~7/21是第四梯次「Design Patterns這樣學就會了入門實作班」前兩天的課程,這次上課Teddy把第一天介紹pattern方法的教材做了一點點小修改,主要反應了Teddy上次上課之後對於force與「設計是什麼」的最新體會。

課程進行過程中,Teddy多花了點時間在解釋這些觀念上面,而且把學員們實際練習撰寫pattern的時間加長,讓學員們對於組成pattern的六大元素:namecontextproblemforcesolutionresulting context,在經過實際討論與動手練習之後,能有第一手且更深刻的體驗。雖然這樣一來原定第一天要介紹的Singleton與Observer延後到第二天才上場,但Teddy覺得經過調整之後學員們對於pattern的理解得到比較好的成效。

螢幕快照 2013-07-24 下午6.22.12螢幕快照 2013-07-24 下午6.15.37螢幕快照 2013-07-24 下午6.12.57螢幕快照 2013-07-24 下午6.13.23

 

其實第一天的課程部分內容,關於pattern方法的介紹的部分,Teddy去年就已經分享到slideshare上面 :

***

前一陣子Teddy在slideshare上面看到某人也分享了一份design pattern的投影片,怎麼內容跟Teddy上課與寫在部落格裏面的資料那麼像?原來「作者」是上過Teddy課程的某位學員挑眉質疑既然上過課的學員們這麼認真地想幫Teddy傳遞pattern的知識與愛好,那倒不如Teddy自己 自爆 公開Day1的課程內容好了。

Design Patterns 這樣學就會了:入門實作班Day1 from Teddysoft

***

以上,有需要的鄉民請自行餵食微笑

***

友藏內心獨白:這樣算是日行一善嗎?

2013年7月24日 星期三

C. C. Agile 聚會Sprint 11 精華報導

July 23 16:19~17:13

螢幕快照 2013-07-18 下午11.55.16

鄉民內心獨白:可以放一張看的到臉的嗎挑眉質疑

 

C. C. Agile聚會從2012/09/13第一次活動到今年6月已經舉辦了10次。以往的聚會形式每次會邀請一位主講者針對某個主題分享60分鐘,之後是自由活動時間。想聊天的鄉民就留下來各自帶開繼續聊天,要回家帶小孩、繼續加班、或是準備明天便當的鄉民聽完分享便可以離開。

螢幕快照 2013-07-23 下午4.38.37

過去10次C. C. Agile活動分享內容。

 

螢幕快照 2013-07-23 下午4.40.33

C. C. Agile 活動剪影。

 

為了讓參加者有更多互動的機會,7/18號晚上第11次C. C. Agile每月聚會的活動嘗試另外一種新的方式:「世界咖啡館,這一夜我們談軟體開發」,由Erica帶領活動進行,。

螢幕快照 2013-07-23 下午4.36.46

 

鄉民們可能會很好奇,到底什麼是「世界咖啡館」。

螢幕快照 2013-07-23 下午4.43.08

螢幕快照 2013-07-23 下午4.45.04

 

活動場地。

螢幕快照 2013-07-23 下午4.52.57

螢幕快照 2013-07-23 下午4.53.05

 

每個人先在紙上寫下三個字,然後在自我介紹中說明寫下的三個字的意義。

螢幕快照 2013-07-23 下午4.54.22

 

這次活動進行三回合,每一回合討論的問題分別是:

  • 第一回合:
    • 回想一下最近工作上有沒有什麼 讓你覺得開心的事情?
    • 請回想最近工作上讓你覺得不爽的事情?
  • 第二回合:什麼樣的團隊與開發方式,會讓你每天睜開眼睛就迫不急待想去上班?
  • 第三回合:
    • 要將目前的專案開發變成你心目中理想中的模式,會遇到哪些困難?
    • 請試著將困難轉化為問題,並寫下來。

最後請每一組將第三回合所寫出的來問題攤開在桌上,與會者瀏覽每一桌上的問題,並投票給最有感覺的問題。

***

以下是當日活動照片。

螢幕快照 2013-07-23 下午4.56.19螢幕快照 2013-07-23 下午4.56.30螢幕快照 2013-07-23 下午4.56.58螢幕快照 2013-07-23 下午4.57.49螢幕快照 2013-07-23 下午4.58.08螢幕快照 2013-07-23 下午4.58.38螢幕快照 2013-07-23 下午5.07.55螢幕快照 2013-07-23 下午4.58.53螢幕快照 2013-07-23 下午4.59.34螢幕快照 2013-07-23 下午5.00.15螢幕快照 2013-07-23 下午5.00.52螢幕快照 2013-07-23 下午5.01.06螢幕快照 2013-07-23 下午5.01.20螢幕快照 2013-07-23 下午5.01.31螢幕快照 2013-07-23 下午5.01.48螢幕快照 2013-07-23 下午5.02.00螢幕快照 2013-07-23 下午5.02.12螢幕快照 2013-07-23 下午5.02.19

最後看一張全景圖。

螢幕快照 2013-07-23 下午4.59.49

***

這次活動Teddy覺得還滿有趣的,雖然沒有主題分享,不過空出的時間讓與會者有更多的時間與機會和不同的人互動。三不五時也應該辦一下「非典型聚會」啊很棒

***

友藏內心獨白:每隔10個月辦一次,那不是跟生小孩一樣?

2013年7月23日 星期二

我無能,所以我加班

July 22 22:20~ July 23 00:08

螢幕快照 2013-07-22 下午11.46.35

畫面節錄自「破壞之王」電影。

 

有一位鄉民告訴Teddy,《笑談軟體工程:敏捷開發法的逆襲》這一本書,他最喜歡的一句話,就是「從此每天準時下班享受幸福人生」。雖然Teddy反對加班,但在這邊Teddy要澄清一下,這句話不是Teddy寫的,而是出版社的編輯在製作封面的時候加上去的。所以,如果讀完書之後鄉民們還是要加班,一概與Teddy無關,請洽出版社挑眉質疑

聽到這位鄉民的回應Teddy突然想起年輕時剛出社會的第一份工作,當時公司接了一個案子,打算找兩位程式設計師,在一年內要用Java開發完成一個intranet-based進銷存系統(當時拉了總公司與門市之間的網路專線,速度只有14.4Kbps嚎啕大哭)。由於公司沒有人懂進銷存系統的domain know-how,於是公司將需求分析工作外包給一位「據說」很懂進銷存系統的有經驗分析師。經過2~3個月之後,該位分析師生出了一本需求分析文件,公司就把這份文件交給代號為A、B的這兩位程式設計師。

又過了一段時間,公司發現這個案子的進度嚴重延遲,而且A君、B君壓力很大,快做不下去了。當時Teddy原本在負責開發另外一個系統,後來不忍同伴受苦,自告奮勇決定跳下來一起開發。

雖然進銷存系統並不算是什麼「高科技」的系統,但是由於當時這個案子夾帶了一些「技術創新」的要求,所以開發起來挑戰還蠻多的。在開發的過程中,團隊成員幾乎每天都加班,Teddy經常都是搭最後一班23:00左右的公車回家。有時候錯過公車,或是加班到1、2點,就只能「自費」搭計程車回家。到後來有好幾次加班太晚,乾脆直接睡在公司裏面(睡在地板上)。

Teddy印象中,這個案子最後上線時間花了將近兩年。公司想要把責任推給客戶一直變更需求,而客戶則是把責任歸咎於開發團隊「經驗不足」,沒有事先幫他們把可能發生的問題都考慮進去(Teddy內心獨白:千金難買早知道啊)。有一段時間雙方關係很緊張,Teddy每次去開會都被對方的總經理(一位女士)質疑經驗與能力不足。當時Teddy尚未練成「嘴砲神功」,雖然不服氣但很多時候也只能把委屈往心裏吞。會議結束之後,唯一能夠做的事情,除了加班,就是…加更多的班。

現在回想起來,當時的Teddy真的是很「水母 無能」。無能者,沒有能力是也。沒有哪些能力?

  • 無能判斷需求分析文件的完整性:剛開始拿到一本厚厚的分析文件的時候,Teddy覺得這位外包的分析師好厲害,可以寫出這麼厚一本的文件。隨著日子一天、一天過去,開發團隊發現,這份文件根本漏洞百出,很多資料一致性,或是跨年度資料處理的問題,甚至連客戶的基本需求,都沒有考慮的很周詳與完整。而這些問題,絕大部分都是到後期系統慢慢成形之後,客戶實際操作試用才被發現。因此,客戶就怪罪程式設計師沒有經驗。程式設計師則是在內心大聲吶喊:難道按照規格寫程式錯了嗎?分析書上面客戶代表也簽名了啊。
  • 無能判斷專案大小:當初專案的費用與時程,完全是公司業務跟客戶談定,根本沒有詢問開發人員的意見(雖然當時問了也可能沒有答案挑眉質疑),就在簽約之後才被告知兩個人要在一年內完成。最後搞得每天加班還做不完,還被老闆、客戶質疑「能力不足」與「經驗不足」。
  • 無能儘早得到客戶的回饋:這幾年帶了幾個敏捷專案之後,兩個禮拜跟客戶見一次面,展示這兩周開發的功能給客戶驗收,已經成了習慣。但是,在當年根本還沒有這樣的作法,專案還是採用waterfall的流程。最後就是一個…慘字。
  • 無能向公司爭取更多資源:因為沒有質疑原本業務承諾的時程到底是否合理,也就只好傻傻地做下去,而沒有要求公司提供合理的資源(公司會不會提供資源是一回事,但身為team leader應該有責任向公司提出要求)。
  • 無能判斷需求優先順序:當初根本沒有所謂的value-driven開發觀念(對客戶價值較高的需求要優先開發),反正分析書上面列出來的所有功能最後一定全部都要做完,對開發人員來講每個功能都一樣重要。在選擇開發順序的時候,通常優先考量的都是有趣、好玩、有挑戰性的技術問題。在這種情況下,對客戶而言比較重要的功能有時反而是在專案中後期才著手開發,因此就算客戶想要先看,也沒有東西可以給他看。
  • 無能逃離「禁閉室」:這種工作環境,當初怎麼沒想到要「塊陶啊」挑眉質疑

***

為什麼採用敏捷方法之後Teddy開始堅信軟體開發團隊不應該加班?因為Teddy曾經過了6~7年常態待在公司加班的日子,但手邊的開發案幾乎沒有一個是準時上線的。當時年幼無知覺得自己很爛,現在回想起來,很多案子根本不應該接。因為很多案子是業務為了業績,用不合成本的報價把案子接下來,最後要擦屁股的都是開發人員。

在不加班的情況下,公司又要可以生存下來,公司高層與開發團隊就要強迫自己專注思考:

  • 公司高層:公司各個部門之間溝通是否順暢,在完成產品的整個value-chain當中,是否有遭遇什麼阻礙(公司文化不良、人為因素、資源問題等)需要排除。
  • 公司高層或產品經理:產品的規格與功能到底有沒有競爭力?還是一開始就注定做白工。
  • 開發人員:在不加班的情況下,如何有效率的運用上班的8小時,作出高品質的產品。

***

Teddy覺得「不加班」,或是說至少做到「不常態加班」,是一種領導人「破釜沉舟」的態度,強迫自己想辦法提升員工的工作效率,並消除工作上不必要的浪費。可能有鄉民會說:「很多公務員也都準時下班啊,可是他們的工作效率還是很爛,私人公司怎麼可以這樣」。私人公司的確是不能跟公家機關一樣,但不一樣的不應該是下班時間,而是「領導、文化、考核、淘汰」等制度。公家機關是鐵飯碗,但私人企業不是。如果有哪一個私人企業,僅僅是因為員工不加班就變成公務人員心態,那麼有問題的不應該是員工,而是 水母 領導者。

***

嚴格講起來,Teddy到現在為止,也算是經常在加班。因為下班時間之後,Teddy還是花很多時間在看書、找資料、規劃新課程、寫部落格。這些事情廣義的來說都和工作有關。但Teddy堅持一個原則,時間到了就要離開公司,下班的時間是我(員工)可以自行運用的時間。我今天想看書,就多看點書。累了,想休息,就多看點海綿寶寶或烏龍派出所挑眉質疑。吃完晚飯想散散步,就出門散散步。散步回家之後有靈感想寫部落格就寫部落,累了想睡覺就睡覺(疑,吃飽睡、睡飽吃,這種行為跟豬有什麼兩樣…不要告訴別人)。

Teddy很幸運,工作就是自己的興趣,因此雖然廣義的每日工時超過8小時,但並不覺得自己在「加班」,只是離開公司後的自我學習。公司中不是每個人的工作都剛好是自己的興趣,也許大部分的人只是需要一份可以溫飽的工作。只要員工在上班時間全心全力工作,而公司在制度上也有計畫地提升每位員工的能力,正常上下班實在不應該被責備。

了解自己的無能,才有機會變得有能。

***

友藏內心獨白:每個公司,都是一個小朝廷。