Cyber Dojo 設(shè)計者談 Cyber Dojo——為了好玩執(zhí)行代碼

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有幾件事給他留下了很深的印象:

  1. 有兩組在整整2小時期間沒有寫出任何代碼,因為他們需要安裝編程語言和測試框架,但是網(wǎng)絡(luò)有問題。
  2. 在演示成果時,6組里有5組都遇到了連接投影儀問題。
  3. 活動結(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í)了。


創(chuàng)建練習(xí)session

在開始一次Dojo練習(xí)時,首先需要選擇語言。然后需要選擇測試框架。這是很早就確定的設(shè)計決定之一,測試是必不可少的。

選擇練習(xí)題目

之后可以選擇練習(xí)題目,可以選擇Verbal進行隨便什么題目的練習(xí)。一般來說,我們用Fizzbuzz作為編程練習(xí)的入門題目。就像用hello world做語言展示的傳統(tǒng)一樣。
題目選擇后,會產(chǎn)生Dojo的ID。任何人只要有了ID就可以參與練習(xí)。這樣就算不在一個地方的人也能一起進行練習(xí)了。

輸入ID,開始編碼。系統(tǒng)會分配一個動物頭像給你。
你好,小蜜蜂

這里有個很重要的一個設(shè)計,你可能已經(jīng)注意到了,沒有l(wèi)ogin。你不需要輸入用戶id,密碼,姓名等等等等。

為什么呢?

  1. 一方面,注冊和登陸不好玩。對于參與練習(xí)的人來說,有什么必要輸入這些信息呢?
  2. 更重要的原因,是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!

之后,“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的原因。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,761評論 25 708
  • 做TDD是為什么? 關(guān)于TDD的概念、工具、技巧等,經(jīng)典的書籍材料可能介紹的更為全面細致。這篇文章想分享的是從一個...
    武可閱讀 2,617評論 2 21
  • "青青,陪朕說說話吧。" "皇上喚我青青還是青卿?"她收回繁雜的思緒,雖回過頭來,卻并不看他,只是懶懶地問了句她自...
    劉袖子閱讀 647評論 0 0
  • 調(diào)試ueditor的時候遇到了一個問題,如圖: 后臺報錯提示找不到JsonObject類,于是引入下面的jar包后...
    李北北閱讀 3,937評論 2 0
  • 一個事物,你厭惡他,不喜愛它,但不去管它,用“忍一時風(fēng)平浪靜,退一步海闊天空”的氣量來對它,可能永遠只是那一個事物...
    我謝心寧閱讀 462評論 0 0