[笔记] 我是如何设计 Cyber-dojo 的

TDD · asj · Created at · 2786 hits
377

本文是Cyber-dojo作者Jagger演讲第一部分的概要。
演讲视频见 http://www.infoq.com/presentations/cyber-dojo-1

缘起

2009年Jagger参加了一次Uncle Bob 的Coding Dojo。Dojo有30人左右参加,分成6组。每次练习45分钟,之后每组轮流在投影仪上展示代码。
有几件事给他留下了深刻的印象。
1. 有两组在整整2小时期间没有写出任何代码,因为需要安装语言和测试框架,但是网络有问题。
2. 当演示成果时,6组里有5组都遇到了连接投影仪问题。
3. 最终结束时,Uncle Bob宣布一组获胜。这在Jagger看来也是非常奇怪的。

晚上在酒店的时候,Jagger就开始想dojo中遇到的开发环境和投影仪问题。怎么解决这次Dojo中遇到的典型问题。参与者最少应该在电脑里准备什么?
结论是:什么也不用,通过Web页面来进行编码。这样所有代码都在服务端,可以用一台连接投影仪的电脑来展示所有人的代码。就这样Cyber-dojo的最初想法产生了。

基本功能

下面进入展示环节。截至演讲时Cyber-dojo上已经有4万多次Dojo练习了。
创建练习session,首先需要选择语言。然后需要选择测试框架。这是很早就确定的设计决定之一,测试是不可缺少的。
之后可以选择练习题目,可以选择Verbal进行随便什么题目的练习。一般来说,我们用Fizzbuzz作为编程练习的入门题目。就像hello world一样。
题目选择后,就得到ID。任何人只要有了ID就可以参与练习,这样就算不在一个地方的人也可以一起进行练习了。
输入ID,开始练习。系统会分配一个动物头像给你。
这里有个系统很重要的一个设计,你可能已经注意到了,这里没有login。你不需要输入用户id,密码,你的名字等等。
1. 一方面,注册和登陆不好玩。对于练习的人来有什么必要输入这些信息呢?
2. 更重要的是,这和Cyber-dojo的设计理念有关,这是一个练习编程的环境,而不是开发环境。
Jagger发现,当一个公司事情不太顺利时,往往他们的文化有问题。那么怎么通过练习来改变文化呢?在一个大家对编程练习都没什么概念的的环境中,如果我们需要输入名字等等,等到review代码时,大家就可以看到,哦这是某某人的代码。这样代码就直接和个人以及自尊心关联起来。这对讨论和练习都是有阻碍作用的。在文化开放的组织中这没什么问题,但是如果组织的文化不太友好,匿名的设计带来很大的好处。当我们review的时候,就只能看到动物头像,并且猜测“犀牛这里这样写可能是因为……”。当然,犀牛这组的成员可以进行解释“我们这里是想做什么什么”。重要的是他们可以自己选择是不是要揭示身份。在文化不怎么好的环境中。很可能前一两轮大家并不愿意表明自己,随着练习的进行,大家会逐步理解到这是练习而非最终结果。渐渐的放开心态融入讨论。

之后就进入了编码的环节,可以看到练习题目的介绍,以及基础的起始代码和测试。这些代码和练习题目无关,只与选择的语言以及测试框架相关。
之后就是,“test”按钮,没有保存,没有编译,没有代码高亮。唯一能做的就是写代码,然后点击测试,但愿如此。
在课程中Jagger能见到一种常见的模式,在第一轮练习的整整45分钟里,往往有一两组一次测试都没有进行。因为这就是他们平时工作的方式,他们不习惯测试驱动开发。这样很好,Jagger并不会去告诉他们应该怎么做,只是让他们按照自己习惯的方式去工作,然后结果就会自然的显示出来。在review的时候,他只是说:“我们无法对犀牛进行review,因为他在45中里一次测试都没有跑。”不需要再说什么。他们自己会决定在后面的练习中是不是要增加测试的频率。

当你点击测试按钮,代码会被提交到服务器,运行测试。红灯表示测试失败。然后你根据输出找到错误并且进行修改,如果一切正确,就会看到一个绿灯。如果代码根本无法执行,比如输入拼写错误,就会得到一个黄灯。

答疑,测试频率和代码之间有什么联系么?


假如你不断的输入,写代码,写测试,写代码,写测试……,25分钟之后,你按下测试按钮。最有可能得到的是什么灯?想想看
黄灯
随着你不断的输入代码的过程,完全不犯错的可能性会不断的降低。距离你上次测试越久,修改代码越多,你越有可能得到一个黄灯。
而这之后呢?你输入了25分钟代码,运行测试结果是黄灯,之后会发生什么?
你会修正一个输入错误,再次测试,这时得到的什么?
黄灯,有更多的输入错误
再次修正错误,测试,什么灯?
黄灯
这是一个很典型的模式,当不熟悉TDD的人进行第一轮练习中往往会出现。长时间的空档,既没有绿灯也没有黄灯。然后黄灯,黄灯,黄灯,黄灯……
然后
时间用完了。
Jagger并未有意去做什么,只是设置好了系统,然后让他们做平时他们会去做的事情。之后系统就清晰的显示出我们所做的。
在这45分钟里,展示了什么?
一次微型的瀑布软件开发过程。

继续展示

每次运行的结果都列在页面顶部,Jagger想要鼓励练习者尝试和回退,因而他设计在任何时候都可以点击一盏灯,就可以选择回到这次的历史版本。
到这里基本上已经演示了Cyber-dojo编码相关的功能。
假定现在有10个动物头像进行dojo,第一轮45分钟过去了。很有趣的一件事,如果你说:“时间到。”会发生什么?
他们想要延长时间!

“我们还没做完。我们老是黄灯。我们已经连续16个黄灯了。但是我们真的真的差一点点就做完了。”
但是Jagger会说:“不,不,时间到,我们不需要交付什么东西”

然后我们回到首页,进入仪表盘页面。在这里可以看到所有动物按时间排列的所有灯。这里我们可以进行review,这是Jagger设计这个系统的最重要目的之一。
review之后,我们重复进行练习。点击创建练习,系统会记住上次选择的语言,测试框架和题目。然后,我们又从头开始了。
常常有人要求增加一个功能,从上次没完成的练习继续进行。这对开发而言是很正常的,我们想完成一件事。但是在练习中我们不需要完成什么,我们不交付什么。所以有意设计为每轮从头开始。
有时,这会让一些人觉得抵触。然而,Jagger的设计就是想要的让你不舒适。这个练习的环境被故意设计的和开发环境不一样。 在开发环境里你有各种各样的高级功能让你进行的更快,这对开发是很必要的。而在练习中,你并不是在开发,你不需要完成什么。但是Jagger发现,只是这样说并不会有任何效果。他发现,把Cyber-dojo设计的与开发环境越不一样,它越有效果。因为更有助于练习者理解,这不是个开发环境,这是用来练习的。
练习的概念听起来很简单,但是对很多参与者来说都是非常难的一个转变。他们太习惯于赶着时间尽快编写出代码,他们满脑子想着做的更快,而非质量。
因而,这是有意设计的,没有语法高亮,没有自动补全,没有编译,没有保存。这是Jagger能想到的,可以提供的最少功能。Jagger常常主动去想,什么功能是可以去掉的,而非增加功能
最近Jagger所做了一项改动。所有的测试框架的输出中都会有错误行号来定位错误。如果根本没有行号呢?Jagger设计在输出框边上点击后可以隐藏代码行号。这样练习者就可以选择关掉行号显示,从而写的更慢。

捐助

Cyber-dojo对非商业使用是免费的,商业使用需要进行捐助来获得授权。
所有的捐助都用来为孩子们买树莓派。
网站的运营成本由谷歌承担

核心原则

  • 开心而非赚钱
  • 基于团队而非基于个人

所以在review页面每个人都可以看到所有动物的所有记录。这也是做出无login,匿名等设计背后的理念。这种基本的价值理念会在系统设计演化时提供重要的参考。
比如,常常有人要求添加一个功能,让一次Dojo里的每个人可以选择语言。因为每个人熟悉的语言不同。他们想用自己最熟悉的语言进行练习。很合情合理。但是Jagger一直拒绝这个要求,因为这是着眼于个人而不是团队的。如果这么做了,带来的后果是review时就会看到各种不同的语言,这样的效果比一种统一的语言差得到。
另一个原因,我们在练习中并不是为了舒适。我们练习是为了学到东西。有人说:

“如果我学到了一些东西,但是我的行为没有任何改变,那么我并没有真的学到”

对Jagger来说,如果他来一个组织进行培训,几天过后他离开了,每个人又做着和以前一样的事情。那么他的工作是失败的。所以他通过让练习者不适应来促使改变。当你使用Cyber-dojo时,Jagger想要让你用的不舒服。

  • 关注学习而非完成
  • 做得慢一些而非做得更快

学习很重要的一方面就是,慢下来。

因为总是有人要求增加功能,而Jagger感兴趣的是,告诉我什么功能是可以去掉的。他在Cyber-dojo上增加了一个FAQ:

你干嘛不增加……?
不,听着。
不要再想着怎么进展得更快,开始尝试做得更慢。
不要总想着完成,想想改进。
想想以一个团队进行练习。
这才是建立Cyber-dojo的原因。


「软件匠艺社区」旨在传播匠艺精神,通过分享好的「工作方式」和「习惯」以帮助程序员更加快乐高效地编程。
No Reply at the moment.
需要 Sign In 后回复方可回复, 如果你还没有账号你可以 Sign Up 一个帐号。