为什么将康威的“生命游戏”用于代码撤退?


15

Code Retreat是一整天的培训活动,着重于软件开发的基础知识。即将到来的是“全球”代码撤退日,我很期待。就是说,我以前去过那里,不得不说有很多混乱……这很好。

我仍然不明白的一件事是,为什么“生命游戏”对TDD来说是个好问题,以及TDD的好坏是什么样子。

意识到这是一个相当开放的问题,请随时发表评论。


感觉这是一个非常注重讨论的问题,最好在我们的软件工程聊天室中进行
亚当李尔

@Anna Lear:谢谢,但不想聊天,寻找答案。如果不是一个好问题,那很好。
错误

3
@AnnaLear我认为问题比OP值得称赞的更多。
汤姆·斯奎尔

1
@Tom我自己在考虑它,很高兴看到它运行良好。乐于犯错。:)
亚当·李尔

Answers:


26

最初,之所以选择Conway的《人生游戏》,是因为我们在2009年1月的第一个coderetreat上手头有一个Java applet。今天的目标是尝试一些关于有时间限制的练习的想法,而我们只是选择了GoL小程序,因为我们拥有它。

不过,此后,作为几个积极的协助者(尤其是我在2009年的我的巡回演出中和在布加勒斯特的Alex Bolboaca期间担任我),研究了GoL作为学习工具的用途。同时,我们正在将coderetreat格式发展为今天的格式。2009年,Alex尝试了至少另一个问题(扑克手得分),但没有发现它像GoL一样有用。您可以在http://coderetreat.org/history中找到有关历史的更多信息

Coderetreat致力于提高我们对简单设计(特别是简单设计的4条规则),测试驱动的开发以及软件开发的其他基本方面的理解。GoL的好处是它是一个非常容易理解的问题,但从结构的角度来看仍然非常丰富。它很容易提供系统的各个部分,可以用作我们在coderetreat练习的所有主题的示例。例如,在多种方法中采用(x,y)参数的通用实现是讨论DRY原理(系统中的每一知识都应具有一个且只有一个表示形式)的绝佳机会。系统。还有许多其他方面可以用作构建使变更成本最小化的设计的示例。

现在有很多人已经完成了多个代码隐退,他们仍然发现该问题的有趣方面可以用作实践。


10

康威的《人生游戏》将是一个很好的选择,因为它是一个相当简单的编码集,具有强大的结果。至于使用它来驱动测试驱动的开发,我敢打赌,因为编写测试很棘手,因为您正在寻找的结果在编写的代码中并不明显。如果您之前没有做过或者很长时间没有做过,那么编写使您滑翔的代码就是相当不错的选择。因此,它适合于扩展学科领域,特别是在像TDD这样的成对编程中执行时。

就教你有用的东西;这是一种横向思考的练习。您必须概念化代码如何运行,运行,查看失败,收集数据,重构并继续迭代。所有这些事情对于TDD至关重要。将其链接到现实世界,类似于客户给您一个模糊的需求文档,其中仅显示“我想要X”。因此,您给他们X即可,但是进入X可能很棘手。康威的《人生游戏》擅长于教授这一点。它也很容易编写代码,通常不需要花费很多代码。(APL是更极端的实现示例之一。)因此,它非常适合撤退所需要的短期会议,而不是通常在生产环境中可能需要一周或两周的迭代时间。


10
我认为滑翔机是“紧急”行为。给定特定数量的邻居,您的单元测试仅需编码细胞的生存和死亡规则。
罗伯特·哈维,

1
滑行绝对是一种新兴的行为。Coderetreats的一些参与者将构建一些较大的测试,其中包括滑翔机之类的东西,但这只是指导性测试,而不是面向单元/ tdd的测试。行为来自建立良好定义的规则。
coreyhaines 2011年

3

人生游戏一方面是一组非常简单的规则,另一方面则包含了与可扩展性相关的高级编程的一些最糟糕的警告。尽管结果是确定性的,但仍然存在无限的运动场和无限数量的待处理像元的挑战。

如果挑战规范包括最低性能最大内存占用量,那么测试将包括快速增长的模式或沿不同方向传播的模式,这将成为一个非常令人沮丧的挑战。

在X次迭代之后,您获得了已知的输入和已知的输出,并且您知道到达那里的所有步骤...除了这些步骤花费太多和太长时间。您必须执行一些非常极端的优化以符合规格。扫描固定大小的双缓冲2d位数组的琐碎算法由于其性能随大小的O(n ^ 2)降低而变得完全不足。将填充的块当作新的生成对象突然吃掉了很多内存并变得缓慢。将所有东西分成有限大小的板有时会奏效,有时会失败...

而且由于大多数“全局”测试将无法通过性能标准,因此您需要制定较小的目标,较小的子测试以消除警告。


2

这完全取决于您要练习/训练的过程的哪个方面。

无论您选择哪种方法/项目管理范例,一天都不足以涵盖软件工程的所有方面。因此,要使其有效,您可能应该专注于整体的一小部分。

例如,如果您专注于TDD的技术方面,则可能希望放宽围绕需求和与客户的关系的灰色区域,并直接使用解决方案的编码。

在这方面,“生命游戏”是一个很好的选择,因为它简单,易于理解,并且没有很多灰色区域可供讨论。因此,您可以立即开始编写测试并针对它们进行编码。

另一方面,如果目标是看我们如何使用TDD来满足需求,那么我可能选择了生活游戏,但我不会告诉开发人员这就是我想要的。取而代之的是,我会绕圈提供提示和想法,而无需实际提及其名称。那就是说,对于这种锻炼,生活游戏可能会有点太简单了,因为与会者很可能很快就会看到这种方法。

此类合成练习并不总是容易找到示例。它必须简单到一天就可以完成,而要一天完成则不是那么简单。它必须是有趣的,但不是没有意义的。但是对我来说,它必须有点原创,我想不起来我被要求让学生创建一个视频俱乐部管理系统做家庭作业的次数了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.