Discovery Testing the Game of Life (From google group)

Daniel Teng:

Justin Searls正在比較底特律派TDD和倫敦派TDD,這是第一集搓译,用的是成為“Discovery Testing”的倫敦派玩法悲柱。題目還是Gameof Life
https://www.youtube.com/watch?v=aeX5OXO-w30

第二集
https://www.youtube.com/watch?v=jGs55tQS7ww

第三集
https://www.youtube.com/watch?v=iL2l_pbOlug

第四集
https://www.youtube.com/watch?v=Z7h696C0Du8

Joseph Yao:

為了方便大家看視頻,我已經(jīng)把全部四集(已完結(jié))傳到了土豆上面侥衬,你懂的诗祸。整個(gè)四集的時(shí)間大概在兩個(gè)半小時(shí)。
Part 1: http://www.tudou.com/listplay/dlhRQuC3a4g/nsSXLo3CE-4.html
Part 2: http://www.tudou.com/listplay/dlhRQuC3a4g/c5SOegUcqmc.html
Part 3: http://www.tudou.com/listplay/dlhRQuC3a4g/S0fs3Z7uMHQ.html
Part 4: http://www.tudou.com/listplay/dlhRQuC3a4g/JN6GRH2Gl4A.html
Justin 有關(guān) Discovery Test 的 Blog http://blog.testdouble.com/posts/2015-09-10-how-i-use-test-doubles.html
Justin 的實(shí)現(xiàn)代碼在這里 https://github.com/searls/game-of-life-java-example

——————————— 建議你先看完視頻再看我下面的評(píng)論———————————
我在往來(lái)上海轴总,北京和福州的飛機(jī)上面看完了所有四集直颅。Justin 的英文說(shuō)的比較快,有時(shí)挺含糊的怀樟,有些地方?jīng)]太聽(tīng)懂功偿。好在有代碼演示,應(yīng)該使我能夠理解他的做法和理念了往堡。第一集開(kāi)始講的是他對(duì) Detroit School TDD 和 London School TDD 的理解械荷,這部分我很認(rèn)同,總結(jié)的很到位虑灰。然后他提出了自己根據(jù) London School TDD 發(fā)展出來(lái)的 Discovery Test 方法吨瞎,瞬間讓我很期待后面的三集。不過(guò)可惜的是穆咐,看完之后的感覺(jué)離我的預(yù)期差距較大颤诀,我無(wú)法認(rèn)同 Discovery Test 這種做法字旭。
先來(lái)簡(jiǎn)單介紹一下 London School TDD。這種方法源自于倫敦的極限編程社區(qū)崖叫,Steve Freeman 和 Nat Pryce 的著作 “Growing Object-Oriented Software Guided by Tests” (簡(jiǎn)稱為 GOOS)是對(duì)這種開(kāi)發(fā)方法的經(jīng)典總結(jié)遗淳。Steve 曾經(jīng)和我開(kāi)玩笑說(shuō),這本書(shū)是他們社區(qū)爭(zhēng)論十年的結(jié)果心傀。我覺(jué)得屈暗,相比 Detroit School TDD(由 TDD 之父 Kent Beck 提出),London School TDD(或者說(shuō) GOOS)是在其基礎(chǔ)上的發(fā)揚(yáng)光大脂男,而不是看似“對(duì)立”的另一種 TDD养叛。GOOS 方法使得 TDD 和 ATDD/BDD 可以結(jié)合在一起,更好的從業(yè)務(wù)和設(shè)計(jì)上疆液,以測(cè)試的形式一铅,來(lái)驅(qū)動(dòng)整個(gè)開(kāi)發(fā)過(guò)程。關(guān)于 GOOS 方法的細(xì)節(jié)堕油,我之前和伍斌有過(guò)一些討論潘飘,可以看這里 https://groups.google.com/forum/#!searchin/agileshanghai/DDD/agileshanghai/pbojfS61sBE/e-VPbUIfAgAJ
總體來(lái)說(shuō),我認(rèn)為 Discovery Test 并沒(méi)有很好的繼承 London School TDD 的做法掉缺,甚至產(chǎn)生了背離卜录。另一方面,整個(gè)過(guò)程有明顯的過(guò)度設(shè)計(jì)眶明。具體來(lái)說(shuō):
整個(gè)過(guò)程中 Justin 并沒(méi)有寫(xiě)驗(yàn)收測(cè)試艰毒,以至于我無(wú)法理解他要實(shí)現(xiàn)的需求是什么。比如搜囱,他在討論設(shè)計(jì)的時(shí)候提到 KeepsTime 和 TimeLimit 這樣的概念丑瞧,我就不明白到底是什么需求導(dǎo)致了這樣的設(shè)計(jì)。說(shuō)到底蜀肘,如果沒(méi)有明確的需求绊汹,我完全可以認(rèn)為 Game Of Life (GOF)和時(shí)間的關(guān)系很小。比如扮宠,GOF 可以無(wú)限制的把 Cell 變換下去西乖,每隔 0.1 秒變一次就可以了。
GOOS 方法中的驗(yàn)收測(cè)試坛增,等同實(shí)例化需求中的例子获雕,是對(duì)業(yè)務(wù)需求的最小拆分并擁有用戶價(jià)值,讓開(kāi)發(fā)過(guò)程始終有一個(gè)業(yè)務(wù)聚焦點(diǎn)收捣〗彀福夸張點(diǎn)說(shuō),程序員在寫(xiě)代碼和測(cè)試的每一秒都應(yīng)該思考的一個(gè)問(wèn)題罢艾,就是“我如何讓驗(yàn)收測(cè)試盡快通過(guò)楣颠,盡早交付業(yè)務(wù)價(jià)值”嫁乘。
Justin 甚至都沒(méi)有提到驗(yàn)收測(cè)試這件事,直接導(dǎo)致他在后面三集的開(kāi)發(fā)中球碉,對(duì)設(shè)計(jì)進(jìn)行不少“YY”(我在下面會(huì)提到)。他在第一集的最后給出過(guò)別人實(shí)現(xiàn)的帶界面的 GOF仓蛆,但是他自己的代碼到最后也沒(méi)有實(shí)現(xiàn)那種效果睁冬。
如果是我來(lái)開(kāi)發(fā)的話,我會(huì)先寫(xiě)一個(gè)驗(yàn)收測(cè)試看疙,比如豆拨,在網(wǎng)頁(yè)上面顯示一個(gè) 1*1 的矩陣,里面只有一個(gè)代表 dead cell 的點(diǎn)(白色)能庆,經(jīng)過(guò) 0.1 秒之后施禾,還是顯示這樣的矩陣。雖說(shuō)把矩陣顯示出來(lái)并不是開(kāi)發(fā)的風(fēng)險(xiǎn)所在(Justin 也這么說(shuō))搁胆,但是我在實(shí)際工作中遇到過(guò)太多以為沒(méi)有風(fēng)險(xiǎn)的地方最后卻發(fā)生了風(fēng)險(xiǎn)的事情弥搞。寫(xiě)一個(gè)簡(jiǎn)單的驗(yàn)收測(cè)試,或者至少手動(dòng)驗(yàn)收一下渠旁,可以很好的避免程序員喜歡“YY”的毛病攀例,減少開(kāi)發(fā)風(fēng)險(xiǎn)。
由于沒(méi)有驗(yàn)收測(cè)試的緣故顾腊,Justin 在他的 Design Session 里面提到了很多概念粤铭,并且在之后的演示中把這些概念一個(gè)不差的變成了代碼。這里面有明顯的過(guò)渡設(shè)計(jì)杂靶,具體表現(xiàn)如下:
KeepsTime 和 TimeLimit 為什么需要梆惯?至少這兩類到最后也沒(méi)有實(shí)際的代碼。
為什么有了 World吗垮,還要一個(gè) MutableWorld垛吗?我感覺(jué)有 World 這個(gè)類就可以了。Justin 的解釋是 GenerateSeedWorld 產(chǎn)生的 World 有可能對(duì) at(Coordinates) 的實(shí)現(xiàn)很不相同抱既,但是我覺(jué)得他在沒(méi)有證實(shí)這一點(diǎn)之前就引入 MutableWorld 就太早了
總的來(lái)說(shuō)职烧,我覺(jué)得 Coordinates, Point, Contents, Outcome 都可以被 Cell 代替
為什么需要 Contents?我覺(jué)得 Contents 可以被 Coordinates/Point 這個(gè)類代替防泵,同時(shí)給他增加一個(gè) neighbours 方法就可以了(其實(shí)這個(gè)類應(yīng)該改名叫 Cell 更合適)蚀之。到最后,Contents 里面都沒(méi)有代碼
為什么需要 Outcome捷泞?我覺(jué)得 ReplacesCell 的 replace 方法直接返回一個(gè)下一狀態(tài)的 Point (或者說(shuō) Cell)就可以了足删。到最后, Outcome 里面只有 Contents 和 neighbours 這兩個(gè)數(shù)據(jù)
DeterminesNextContents 和 GathersNeighbors 的代碼應(yīng)該被融合進(jìn) ReplacesCell锁右,這些本來(lái)就是 ReplacesCell 應(yīng)該做的事情失受。GathersNeighbors 沒(méi)有代碼實(shí)現(xiàn)讶泰,這個(gè)類不就是在做 Cell.neighbours 的事情嗎?
因?yàn)檫@些過(guò)度設(shè)計(jì)拂到,導(dǎo)致 Justin 的代碼中有很多 Middle Man 的代碼臭味
整個(gè)四集中痪署,Justin 很少花時(shí)間重構(gòu)代碼,我覺(jué)得并不合理兄旬。說(shuō)實(shí)話狼犯,測(cè)試代碼中有不少重復(fù)是可以去掉的。他在第一集里面提到過(guò) GOOS 方法要比 Detroit School TDD 做重構(gòu)的時(shí)間要少一點(diǎn)领铐,這點(diǎn)我認(rèn)同悯森。不過(guò),GOOS 雖然重構(gòu)少一點(diǎn)绪撵,但絕對(duì)不是沒(méi)有瓢姻,而且關(guān)鍵時(shí)刻還是會(huì)推翻現(xiàn)有設(shè)計(jì)的。大家看了 GOOS 這本書(shū)就會(huì)明白音诈。
有人認(rèn)為 GOOS 方法強(qiáng)調(diào)依賴倒置原則(DIP)幻碱,所以稱其為 Mockist TDD。我覺(jué)得這是一種誤解改艇,其實(shí) GOOS 首先強(qiáng)調(diào)的是單一職責(zé)原則(SRP)收班。因?yàn)樵?GOOS 中,每當(dāng)你寫(xiě)一個(gè)類的UT時(shí)谒兄,就應(yīng)該思考他的職責(zé)是什么摔桦,那么那些不是他的職責(zé)范圍的代碼就自然變成了依賴(在UT中被隔離)。Justin 其實(shí)也是這么做的承疲,只不過(guò)因?yàn)闆](méi)有一個(gè)體現(xiàn)需求的驗(yàn)收測(cè)試邻耕,也沒(méi)有從最小的需求入手,所以導(dǎo)致了過(guò)度設(shè)計(jì)燕鸽。
不知不覺(jué)寫(xiě)了這么多兄世,我也是醉了。最后預(yù)告一下啊研,經(jīng)過(guò)這一年在開(kāi)發(fā)和 coaching 中對(duì) GOOS 的應(yīng)用御滩,我發(fā)現(xiàn)他對(duì)提升代碼質(zhì)量和開(kāi)發(fā)團(tuán)隊(duì)設(shè)計(jì)編碼能力非常有幫助。我計(jì)劃在明年更大范圍的推廣 GOOS党远,并嘗試做些社區(qū)活動(dòng)或者課程來(lái)推廣他削解。
謝謝,

zhanggang:

多謝Joseph和Daniel沟娱,一口氣看完了其中3個(gè)視頻氛驮, 第一集真的很好,把London School TDD的優(yōu)勢(shì)列的很清楚济似,看了之后覺(jué)得思路又清晰了不少矫废。當(dāng)然作為L(zhǎng)ondon School/Top-down TDD的支持者和實(shí)踐者盏缤,我是覺(jué)得其實(shí)這是唯一正確的TDD方式, 并沒(méi)有所謂的缺點(diǎn):)從交付的角度蓖扑,Top-down TDD把設(shè)計(jì)的順序和實(shí)現(xiàn)的順序?qū)崿F(xiàn)了完美的統(tǒng)一唉铜,這個(gè)是非常重要的,非常懷疑過(guò)去首先自頂向下設(shè)計(jì)律杠,然后自底向上的構(gòu)建是在沒(méi)有Mock這種基礎(chǔ)設(shè)施的情況下的無(wú)奈之舉打毛。從精益的拉動(dòng)角度,其實(shí)被Mock掉的接口事實(shí)上扮演了對(duì)下游實(shí)現(xiàn)的訂單的角色俩功,從而消除了實(shí)現(xiàn)的盲目性,通過(guò)直接聯(lián)系到交付價(jià)值的真實(shí)反饋碰声,對(duì)下游的實(shí)現(xiàn)提供了真實(shí)的需求定義诡蜓。深深地覺(jué)得Justin選了Game Of Life作為例子實(shí)在失策,GOL算法比較重胰挑,設(shè)計(jì)不需要太強(qiáng)蔓罚,是演示簡(jiǎn)單TDD的好例子,但用來(lái)做Top-down TDD沒(méi)啥優(yōu)勢(shì)瞻颂,反而容易過(guò)度設(shè)計(jì)豺谈。 Top-down的方式在那種層次比較多,職責(zé)分配比較復(fù)雜的情況下才能顯出特別的價(jià)值來(lái)贡这。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末茬末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子盖矫,更是在濱河造成了極大的恐慌丽惭,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辈双,死亡現(xiàn)場(chǎng)離奇詭異责掏,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)湃望,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門换衬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人证芭,你說(shuō)我怎么就攤上這事瞳浦。” “怎么了檩帐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵术幔,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我湃密,道長(zhǎng)诅挑,這世上最難降的妖魔是什么四敞? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮拔妥,結(jié)果婚禮上忿危,老公的妹妹穿的比我還像新娘。我一直安慰自己没龙,他們只是感情好铺厨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著硬纤,像睡著了一般解滓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上筝家,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天洼裤,我揣著相機(jī)與錄音,去河邊找鬼溪王。 笑死腮鞍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的莹菱。 我是一名探鬼主播移国,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼道伟!你這毒婦竟也來(lái)了迹缀?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蜜徽,失蹤者是張志新(化名)和其女友劉穎裹芝,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體娜汁,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嫂易,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了掐禁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怜械。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖傅事,靈堂內(nèi)的尸體忽然破棺而出缕允,到底是詐尸還是另有隱情,我是刑警寧澤蹭越,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布障本,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏驾霜。R本人自食惡果不足惜案训,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望粪糙。 院中可真熱鬧强霎,春花似錦、人聲如沸蓉冈。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)寞酿。三九已至家夺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間伐弹,已是汗流浹背秦踪。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掸茅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓柠逞,卻偏偏與公主長(zhǎng)得像昧狮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子板壮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理逗鸣,服務(wù)發(fā)現(xiàn),斷路器绰精,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,167評(píng)論 25 707
  • 我又回來(lái)了撒璧,離初次來(lái)這座城十年,離告別這座城七年笨使。十年前卿樱,帶著惴惴不安、滿心忐忑的心情硫椰,我開(kāi)始在這座城市實(shí)習(xí)繁调。恰逢...
    ConnecToMe閱讀 1,127評(píng)論 0 3
  • 最近,“標(biāo)簽化”這話題靶草,似乎成為熱血青年的吐槽對(duì)象蹄胰,有對(duì)它愛(ài)不釋手的,有對(duì)它懷恨在心的奕翔,總之就是一連串的眾說(shuō)紛紜裕寨,...
    雪茵聊教育閱讀 277評(píng)論 0 1
  • 在15歲那年,我被體育老師因?yàn)橛羞\(yùn)動(dòng)天賦而選上了去練習(xí)體操技巧试和,自己很喜歡的項(xiàng)目讯泣,感覺(jué)到好幸運(yùn)。每天早上5點(diǎn)...
    美熊Rainbow閱讀 811評(píng)論 7 5