Jon Jagger 專注于TDD的咨詢師。
為了培訓(xùn)和練習(xí)TDD他設(shè)計了網(wǎng)站cyber-dojo.org。
被《The Coding Dojo Handbook》譽為當(dāng)前最好的TDD練習(xí)工具。
本文是Jagger在nor(DEV):con演講第一部分的概要。
演講視頻地址 http://www.infoq.com/presentations/cyber-dojo-1
緣起
2009年,Jagger參加了一次Uncle Bob組織的Coding Dojo。有30人左右參加,分成6組。進行兩輪練習(xí),每輪編碼45分鐘,之后各組輪流在投影儀上展示代碼。
這次Dojo有幾件事給他留下了很深的印象:
- 有兩組在整整2小時期間沒有寫出任何代碼,因為他們需要安裝編程語言和測試框架,但是網(wǎng)絡(luò)有問題。
- 在演示成果時,6組里有5組都遇到了連接投影儀問題。
- 活動結(jié)束時,Uncle Bob宣布一組獲勝。這在Jagger看來也是非常奇怪的。
晚上回到酒店,Jagger開始回想dojo中遇到的開發(fā)環(huán)境和投影儀問題。怎么解決這次Dojo中遇到的典型問題。參與者至少應(yīng)該在電腦里準(zhǔn)備什么?
結(jié)論是:什么也不用,通過Web頁面來進行編碼。
這樣所有代碼都在服務(wù)端,可以用一臺電腦連接投影儀來展示所有人的代碼。
就這樣,Cyber Dojo的最初想法誕生了。
基本功能
截至2015年3月演講時,Cyber-dojo上已經(jīng)有4萬多次Dojo練習(xí)了。
在開始一次Dojo練習(xí)時,首先需要選擇語言。然后需要選擇測試框架。這是很早就確定的設(shè)計決定之一,測試是必不可少的。
之后可以選擇練習(xí)題目,可以選擇Verbal進行隨便什么題目的練習(xí)。一般來說,我們用Fizzbuzz作為編程練習(xí)的入門題目。就像用hello world做語言展示的傳統(tǒng)一樣。
題目選擇后,會產(chǎn)生Dojo的ID。任何人只要有了ID就可以參與練習(xí)。這樣就算不在一個地方的人也能一起進行練習(xí)了。
這里有個很重要的一個設(shè)計,你可能已經(jīng)注意到了,沒有l(wèi)ogin。你不需要輸入用戶id,密碼,姓名等等等等。
為什么呢?
- 一方面,注冊和登陸不好玩。對于參與練習(xí)的人來說,有什么必要輸入這些信息呢?
- 更重要的原因,是Cyber Dojo的設(shè)計理念。這是一個練習(xí)編程的環(huán)境,而不是開發(fā)環(huán)境。
- Jagger發(fā)現(xiàn),如果一個公司事情不太順當(dāng),往往他們的文化有問題。那么怎么通過練習(xí)來改變文化呢?
- 在一個大家對Dojo式編程練習(xí)都沒什么概念的的環(huán)境里。如果我們每個人輸入名字,等到review代碼時,大家就會看到,哦這是某某人的代碼。
- 這樣代碼就直接和個人以及自尊心關(guān)聯(lián)起來。這對討論和練習(xí)都是有阻礙作用的。
- 在文化開放的組織中知道是誰的代碼并沒什么問題,但是如果組織的氛圍不太友好,匿名的設(shè)計帶來很大的好處。
當(dāng)我們review的時候,就只能看到動物頭像,并且猜測“犀牛這里這樣寫可能是因為……”。
當(dāng)然,犀牛這組的成員可以進行解釋“我們這里是想做什么什么”。重要的是,他們可以自己選擇是不是要揭示身份。 - 在氛圍不怎么好的環(huán)境中。很可能前一兩輪大家并不愿意表明自己,隨著練習(xí)的進行,大家會逐步理解到這是個練習(xí),最重要的不是最終結(jié)果。漸漸的放開心態(tài)融入討論。
進入編碼的環(huán)節(jié),可以看到練習(xí)題目的介紹,以及基礎(chǔ)的起始代碼和測試。這些代碼和練習(xí)題目無關(guān),只與選擇的語言以及測試框架相關(guān)。
之后,“test”按鈕。
沒有保存,沒有編譯,沒有代碼高亮。
唯一能做的就是寫代碼,然后,點擊測試——但愿如此。
在課程中能見到一種常見的模式,在第一輪練習(xí)的整整45分鐘里,往往有一兩組一次測試都沒有運行。因為這就是他們平時工作的方式,他們不習(xí)慣測試驅(qū)動開發(fā)。
這樣很好,Jagger并不會去告訴他們應(yīng)該怎么做,只是讓他們按照自己習(xí)慣的方式去工作,然后結(jié)果就會自然的顯示出來。在review的時候,他只是說:“我們無法對犀牛進行review,因為他們在45分鐘里一次測試都沒有跑。”
不需要再說什么。他們自己會決定在后面的練習(xí)中是不是要增加測試的頻率。
當(dāng)你點擊測試按鈕,代碼會被提交到服務(wù)器,運行測試。
紅燈表示測試失敗。
然后你根據(jù)輸出找到錯誤并且進行修改,如果一切正確,就會看到一個綠燈。
如果代碼根本無法執(zhí)行,比如輸入拼寫錯誤,就會得到一個黃燈。
答疑,測試頻率和代碼之間有什么聯(lián)系么?
有
假如你不斷的敲碼:寫代碼,寫測試,寫代碼,寫測試……,25分鐘之后,你按下測試按鈕。
最有可能得到的是什么燈?想想看
黃燈
隨著你不斷的輸入代碼的過程,完全不犯錯的可能性會不斷的降低。距離你上次跑測試越久,修改代碼越多,你越有可能得到一個黃燈。
而這之后呢?
你輸入了25分鐘代碼,運行測試結(jié)果是黃燈,之后會發(fā)生什么?
你會修正一個輸入錯誤,再次測試,這時得到的什么?
黃燈,你會發(fā)現(xiàn)原來還有其它的輸入錯誤。
再次修正錯誤,跑測試,什么燈?
黃燈
這是一個很典型的模式,當(dāng)不熟悉TDD的人進行第一輪練習(xí)中往往會出現(xiàn)。
長時間的空檔,既沒有綠燈也沒有黃燈。
然后黃燈,黃燈,黃燈,黃燈……
然后
時間用完了。
Jagger并未有意去做什么,只是設(shè)置好了系統(tǒng),然后讓他們做平時他們會去做的事情。
之后系統(tǒng)就清晰的顯示出我們所做的。
在這45分鐘里,展示了什么?
一次微型的瀑布軟件開發(fā)過程。
繼續(xù)展示
每次運行的結(jié)果都列在頁面頂部,Jagger想要鼓勵練習(xí)者嘗試和回退,因而他設(shè)計在任何時候都可以點擊一盞燈,就可以選擇回到這次的歷史版本。
假定現(xiàn)在有10個動物頭像進行dojo,第一輪45分鐘過去了。很有趣的一件事,如果你說:“時間到。”會發(fā)生什么?
他們想要延長時間!
“我們還沒做完。我們老是黃燈。
我們已經(jīng)連續(xù)16個黃燈了。但是我們真的真的差一點點就做完了。”
但是Jagger會說:“不,不,時間到,我們不需要交付什么東西”
然后我們回到首頁,進入儀表盤頁面。在這里可以看到所有動物按時間排列的所有燈。
這里我們可以點擊任何一盞燈進行代碼review,這是Jagger設(shè)計這個系統(tǒng)的最重要目的之一。
review之后,我們重復(fù)進行練習(xí)。點擊創(chuàng)建練習(xí),系統(tǒng)會記住上次選擇的語言,測試框架和題目。
然后,我們又從頭開始了。
不要增加功能,想想能刪掉什么功能
常常有人要求增加一個功能,從上次沒完成的練習(xí)繼續(xù)進行。
這對開發(fā)而言是很正常的,我們想完成一件事。但是在Dojo練習(xí)中我們不需要完成什么,我們不交付什么。
所以Jagger有意設(shè)計每次Dojo從頭開始。
有時,這會讓一些人覺得抵觸。
然而,Jagger的設(shè)計就是想要讓你不舒適。
這個練習(xí)的環(huán)境被故意設(shè)計的和開發(fā)環(huán)境不一樣。
在開發(fā)環(huán)境里,你有各種各樣的高級功能,讓你進行的更快。
對開發(fā)而言是很必要的。
然而在練習(xí)中,你并不是在開發(fā),你不需要完成什么。
但是Jagger發(fā)現(xiàn),只是這樣說說并不會有任何效果。
他發(fā)現(xiàn),把Cyber Dojo設(shè)計的與開發(fā)環(huán)境越不一樣,它越有效果。
因為更有助于練習(xí)者理解,這不是個開發(fā)環(huán)境,這是用來練習(xí)的。
練習(xí)的概念聽起來很簡單,但是對很多參與者來說都是非常難的一個轉(zhuǎn)變。他們太習(xí)慣于趕著時間盡快編寫出代碼,他們滿腦子想著做的更快,而非質(zhì)量。
因而,Cyber Dojo被有意設(shè)計為沒有語法高亮,沒有自動補全,沒有編譯,沒有保存。
這是Jagger能想到的,可以提供的最少功能。
Jagger常常主動去想,什么功能是可以去掉的,而非增加功能。
最近Cyber Dojo又有了一項改動。
所有的測試框架的輸出中都會有錯誤行號來定位錯誤。
如果根本沒有行號呢?
Jagger增加了功能,在輸入框邊上點擊,就可以隱藏代碼行號。
這樣練習(xí)者就可以選擇關(guān)掉行號顯示,從而使自己寫的更慢。
捐助
Cyber-dojo對非商業(yè)使用是免費的,商業(yè)使用需要進行捐助來獲得授權(quán)。
所有的捐助都用來為孩子們買樹莓派。
網(wǎng)站的運營成本由谷歌承擔(dān)。(這是去年演講時的情況,目前費用已改由BDD測試框架 http://cucumber.io 承擔(dān))
核心設(shè)計理念
- 開心而非賺錢
- 基于團隊而非基于個人
所以在review頁面每個人都可以看到所有動物的所有記錄。
這也是做出無login,匿名等設(shè)計背后的理念。
這種基本的價值理念會在系統(tǒng)設(shè)計演化時提供重要的參考。
比如,常常有人要求添加一個功能,讓一次Dojo里的每個人可以選擇不同的語言。因為每個人熟悉的語言不同。他們想用自己最熟悉的語言進行練習(xí)。
這很合情合理。但是Jagger一直拒絕這個要求。
因為這是著眼于個人而不是團隊的。
如果這么做了,帶來的后果是review時就會看到各種不同的語言,這樣的效果比一種統(tǒng)一的語言差得到。
另一個原因,我們在練習(xí)中并不是為了舒適,我們練習(xí)是為了學(xué)到東西。
“如果我學(xué)到了一些東西,但是我的行為沒有因此有任何改變。
那么我并沒有真的學(xué)到什么”
對Jagger來說,如果他來一個組織進行培訓(xùn),幾天過后他離開了,每個人又做著和以前一樣的事情。那么他的工作是失敗的。
所以他通過讓練習(xí)者不適應(yīng)來促使改變。
當(dāng)你使用Cyber Dojo時,Jagger想要讓你用的不舒服。
- 關(guān)注學(xué)習(xí)而非完成
- 做得慢一些而非做得更快
學(xué)習(xí)很重要的一方面就是,慢下來。
因為總是有人要求增加功能,而Jagger感興趣的是,可以去掉什么功能。他在Cyber-dojo上增加了一個FAQ:
你干嘛不增加……?
不,聽著。
不要再想著怎么進展得更快,開始嘗試做得更慢。
不要總想著完成,想想改進。
想想以一個團隊進行練習(xí)。
這才是建立Cyber Dojo的原因。