敏捷咨詢工具箱(一)──讀書寫代碼活動
只要功夫深,鐵杵磨成針。 ──宋·祝穆
在我們咨詢過程中,遇到一些開發技術很薄弱的團隊,大部分人只會通過復制和粘貼的方式寫代碼,然后花費大量的時間進行修改和調試。有些開發人員還只是剛剛從學校畢業,幾乎沒有什么開發經驗。面對這樣的團隊,如何教他們使用敏捷開發方法?如何教他們測試驅動開發?如何教他們簡單設計呢?
如果連一門語言還沒有完全吃透,還如何談測試驅動開發和簡單設計呢?這是一個很大的挑戰。我回想起自己學習新語言的方法。前些時間我自學了SCALA語言,看完了《Scala程序設計:Java虛擬機多核編程實戰》,但還是覺得很多概念沒有吃透,然后我就把書合上,然后把書上所有的例子獨立寫了一遍,這時才能感覺自己是學了一門語言。于是我用同樣的方法來訓練這個團隊:
一、找一本合適的書。
如果要快速吃透一門語言,最快的方法就是找一本好書,系統的把一門語言學習一遍,掃除語言的盲點。我們如何選擇一本合適的書呢,我總結了三個條件:
- 選擇國外大師的權威著作,這些大師應該有深厚的開發經驗,這樣可以從書上學到很多編程和設計的最佳實踐。
- 書不能太厚,最好在200-300頁左右,足夠介紹完一門語言的常用特性和最佳實踐。那些面面俱到的的厚磚頭一般適合做參考手冊。
- 書上的例子一定要經典,這樣比較適合練習。
因為團隊主要使用C語言,我就在Google上搜索了一下“C書籍推薦”,找到了很多網友推薦的Top C語言書籍。通過我幾天的閱讀和篩選比較之后,最后我為大家選擇了《C程序設計語言》這本書,完全符合上面的三個條件。如果你是使用的其它編程語言,可以參考下面的讀書列表:
- 如果你用的是C++,我推薦《Essential C++中文版》
- 如果你用的是Ruby,我推薦《Everyday Scripting with Ruby中文版》
- 如果你用的是Java,我推薦《Agile Java 中文版:測試驅動開發的編程技術》
- 如果你用的是SCALA,我推薦《Scala程序設計:Java虛擬機多核編程實戰》
二、具體的讀書計劃
選擇書之后,就要有一個具體可行的讀書計劃,這樣大家能有節奏的一步一步把書讀完。因為大家都有一些C語言基礎,所以我們把讀書活動安排為每天的家庭作業,每周讀完2章。我們的驗收標準是:在不看書的情況下用TDD實現每章全部的例題(這個后面會有詳細的介紹)。下面是我給大家制定的讀書計劃:
時間 |
內容 |
第一周 |
第1章 導言 第2章 類型、運算符與表達式 |
第二周 |
第3章 控制流 第4章 函數與程序結構 |
第三周 |
第5章 指針與數組 第6章 結構 |
第四周 |
第7章 輸入與輸出 第8章 unix系統接口 |
三、光看不練假把式
有了書,有了讀書計劃,當然這個還不夠。這個活動的重點就是要寫代碼。這是讀書寫代碼活動的驗收條件。要求每個人在不看書的情況下,把書上的例題改造成測試驅動的代碼。一章所有例題都改造完了,才算是把這章讀完。比如:Hello World 的例子
main()
{
printf("hello, world\n");
}
要求把這個例子改造成測試驅動的代碼。改造之后代碼分別為:
測試代碼:
EXPECT_EQ("hello, world", greetings());
}
業務代碼:
{
return ("hello, world");
}
通過這樣的訓練,每個人不但可以系統的學習一遍C語言的知識,并且可以鍛煉如何用TDD進行開發。
四、閉環──代碼展示
如何保證每個人可以完成寫代碼活動并且達到預期的效果呢?我們搭建了一個Subversion,讓每人把自己的代碼提交上去。我們每天早上會有一個代碼展示活動。準備一個投影儀,每個人花3-5分鐘展示和講解自己的代碼,然后集體鼓掌表示認可,然后其他的同事提出問題和改進建議。這樣有三個好處:
- 讓每人分享自己的代碼和經驗,這是對每人的認可和鼓勵
- 一個互相學習的氛圍; 通過展示可以學習一下其他同事是怎么寫代碼,怎么寫測試
- 互相督促,如果沒有完成代碼,這時候就沒有任何東西可以展示了
我們堅持了一個月之后,這個活動結束了。每個人都感覺很好,系統的把C語言掌握了一遍。一些有經驗的一個開發人員也覺得,系統的學習之后消除了C語言的很多盲點。現在對C語言編程更有信心了,并且還學會了如何做TDD開發。