Jon Jagger 专注于TDD的咨询师。
为了培训和练习TDD他设计了网站cyber-dojo.org。
被《The Coding Dojo Handbook》誉为当前最好的TDD练习工具。
本文是Jagger在nor(DEV):con演讲第一部分的概要。
演讲视频地址 http://www.infoq.com/presentations/cyber-dojo-1
缘起
2009年,Jagger参加了一次Uncle Bob组织的Coding Dojo。有30人左右参加,分成6组。进行两轮练习,每轮编码45分钟,之后各组轮流在投影仪上展示代码。
这次Dojo有几件事给他留下了很深的印象:
- 有两组在整整2小时期间没有写出任何代码,因为他们需要安装编程语言和测试框架,但是网络有问题。
- 在演示成果时,6组里有5组都遇到了连接投影仪问题。
- 活动结束时,Uncle Bob宣布一组获胜。这在Jagger看来也是非常奇怪的。
晚上回到酒店,Jagger开始回想dojo中遇到的开发环境和投影仪问题。怎么解决这次Dojo中遇到的典型问题。参与者至少应该在电脑里准备什么?
结论是:什么也不用,通过Web页面来进行编码。
这样所有代码都在服务端,可以用一台电脑连接投影仪来展示所有人的代码。
就这样,Cyber Dojo的最初想法诞生了。
基本功能
截至2015年3月演讲时,Cyber-dojo上已经有4万多次Dojo练习了。
在开始一次Dojo练习时,首先需要选择语言。然后需要选择测试框架。这是很早就确定的设计决定之一,测试是必不可少的。
之后可以选择练习题目,可以选择Verbal进行随便什么题目的练习。一般来说,我们用Fizzbuzz作为编程练习的入门题目。就像用hello world做语言展示的传统一样。
题目选择后,会产生Dojo的ID。任何人只要有了ID就可以参与练习。这样就算不在一个地方的人也能一起进行练习了。
这里有个很重要的一个设计,你可能已经注意到了,没有login。你不需要输入用户id,密码,姓名等等等等。
为什么呢?
- 一方面,注册和登陆不好玩。对于参与练习的人来说,有什么必要输入这些信息呢?
- 更重要的原因,是Cyber Dojo的设计理念。这是一个练习编程的环境,而不是开发环境。
- Jagger发现,如果一个公司事情不太顺当,往往他们的文化有问题。那么怎么通过练习来改变文化呢?
- 在一个大家对Dojo式编程练习都没什么概念的的环境里。如果我们每个人输入名字,等到review代码时,大家就会看到,哦这是某某人的代码。
- 这样代码就直接和个人以及自尊心关联起来。这对讨论和练习都是有阻碍作用的。
- 在文化开放的组织中知道是谁的代码并没什么问题,但是如果组织的氛围不太友好,匿名的设计带来很大的好处。
当我们review的时候,就只能看到动物头像,并且猜测“犀牛这里这样写可能是因为……”。
当然,犀牛这组的成员可以进行解释“我们这里是想做什么什么”。重要的是,他们可以自己选择是不是要揭示身份。 - 在氛围不怎么好的环境中。很可能前一两轮大家并不愿意表明自己,随着练习的进行,大家会逐步理解到这是个练习,最重要的不是最终结果。渐渐的放开心态融入讨论。
进入编码的环节,可以看到练习题目的介绍,以及基础的起始代码和测试。这些代码和练习题目无关,只与选择的语言以及测试框架相关。
之后,“test”按钮。
没有保存,没有编译,没有代码高亮。
唯一能做的就是写代码,然后,点击测试——但愿如此。
在课程中能见到一种常见的模式,在第一轮练习的整整45分钟里,往往有一两组一次测试都没有运行。因为这就是他们平时工作的方式,他们不习惯测试驱动开发。
这样很好,Jagger并不会去告诉他们应该怎么做,只是让他们按照自己习惯的方式去工作,然后结果就会自然的显示出来。在review的时候,他只是说:“我们无法对犀牛进行review,因为他们在45分钟里一次测试都没有跑。”
不需要再说什么。他们自己会决定在后面的练习中是不是要增加测试的频率。
当你点击测试按钮,代码会被提交到服务器,运行测试。
红灯表示测试失败。
然后你根据输出找到错误并且进行修改,如果一切正确,就会看到一个绿灯。
如果代码根本无法执行,比如输入拼写错误,就会得到一个黄灯。
答疑,测试频率和代码之间有什么联系么?
有
假如你不断的敲码:写代码,写测试,写代码,写测试……,25分钟之后,你按下测试按钮。
最有可能得到的是什么灯?想想看
黄灯
随着你不断的输入代码的过程,完全不犯错的可能性会不断的降低。距离你上次跑测试越久,修改代码越多,你越有可能得到一个黄灯。
而这之后呢?
你输入了25分钟代码,运行测试结果是黄灯,之后会发生什么?
你会修正一个输入错误,再次测试,这时得到的什么?
黄灯,你会发现原来还有其它的输入错误。
再次修正错误,跑测试,什么灯?
黄灯
这是一个很典型的模式,当不熟悉TDD的人进行第一轮练习中往往会出现。
长时间的空档,既没有绿灯也没有黄灯。
然后黄灯,黄灯,黄灯,黄灯……
然后
时间用完了。
Jagger并未有意去做什么,只是设置好了系统,然后让他们做平时他们会去做的事情。
之后系统就清晰的显示出我们所做的。
在这45分钟里,展示了什么?
一次微型的瀑布软件开发过程。
继续展示
每次运行的结果都列在页面顶部,Jagger想要鼓励练习者尝试和回退,因而他设计在任何时候都可以点击一盏灯,就可以选择回到这次的历史版本。
假定现在有10个动物头像进行dojo,第一轮45分钟过去了。很有趣的一件事,如果你说:“时间到。”会发生什么?
他们想要延长时间!
“我们还没做完。我们老是黄灯。
我们已经连续16个黄灯了。但是我们真的真的差一点点就做完了。”
但是Jagger会说:“不,不,时间到,我们不需要交付什么东西”
然后我们回到首页,进入仪表盘页面。在这里可以看到所有动物按时间排列的所有灯。
这里我们可以点击任何一盏灯进行代码review,这是Jagger设计这个系统的最重要目的之一。
review之后,我们重复进行练习。点击创建练习,系统会记住上次选择的语言,测试框架和题目。
然后,我们又从头开始了。
不要增加功能,想想能删掉什么功能
常常有人要求增加一个功能,从上次没完成的练习继续进行。
这对开发而言是很正常的,我们想完成一件事。但是在Dojo练习中我们不需要完成什么,我们不交付什么。
所以Jagger有意设计每次Dojo从头开始。
有时,这会让一些人觉得抵触。
然而,Jagger的设计就是想要让你不舒适。
这个练习的环境被故意设计的和开发环境不一样。
在开发环境里,你有各种各样的高级功能,让你进行的更快。
对开发而言是很必要的。
然而在练习中,你并不是在开发,你不需要完成什么。
但是Jagger发现,只是这样说说并不会有任何效果。
他发现,把Cyber Dojo设计的与开发环境越不一样,它越有效果。
因为更有助于练习者理解,这不是个开发环境,这是用来练习的。
练习的概念听起来很简单,但是对很多参与者来说都是非常难的一个转变。他们太习惯于赶着时间尽快编写出代码,他们满脑子想着做的更快,而非质量。
因而,Cyber Dojo被有意设计为没有语法高亮,没有自动补全,没有编译,没有保存。
这是Jagger能想到的,可以提供的最少功能。
Jagger常常主动去想,什么功能是可以去掉的,而非增加功能。
最近Cyber Dojo又有了一项改动。
所有的测试框架的输出中都会有错误行号来定位错误。
如果根本没有行号呢?
Jagger增加了功能,在输入框边上点击,就可以隐藏代码行号。
这样练习者就可以选择关掉行号显示,从而使自己写的更慢。
捐助
Cyber-dojo对非商业使用是免费的,商业使用需要进行捐助来获得授权。
所有的捐助都用来为孩子们买树莓派。
网站的运营成本由谷歌承担。(这是去年演讲时的情况,目前费用已改由BDD测试框架 http://cucumber.io 承担)
核心设计理念
- 开心而非赚钱
- 基于团队而非基于个人
所以在review页面每个人都可以看到所有动物的所有记录。
这也是做出无login,匿名等设计背后的理念。
这种基本的价值理念会在系统设计演化时提供重要的参考。
比如,常常有人要求添加一个功能,让一次Dojo里的每个人可以选择不同的语言。因为每个人熟悉的语言不同。他们想用自己最熟悉的语言进行练习。
这很合情合理。但是Jagger一直拒绝这个要求。
因为这是着眼于个人而不是团队的。
如果这么做了,带来的后果是review时就会看到各种不同的语言,这样的效果比一种统一的语言差得到。
另一个原因,我们在练习中并不是为了舒适,我们练习是为了学到东西。
“如果我学到了一些东西,但是我的行为没有因此有任何改变。
那么我并没有真的学到什么”
对Jagger来说,如果他来一个组织进行培训,几天过后他离开了,每个人又做着和以前一样的事情。那么他的工作是失败的。
所以他通过让练习者不适应来促使改变。
当你使用Cyber Dojo时,Jagger想要让你用的不舒服。
- 关注学习而非完成
- 做得慢一些而非做得更快
学习很重要的一方面就是,慢下来。
因为总是有人要求增加功能,而Jagger感兴趣的是,可以去掉什么功能。他在Cyber-dojo上增加了一个FAQ:
你干嘛不增加……?
不,听着。
不要再想着怎么进展得更快,开始尝试做得更慢。
不要总想着完成,想想改进。
想想以一个团队进行练习。
这才是建立Cyber Dojo的原因。