写点什么

使用测试驱动开发求解数独游戏

  • 2007-05-15
  • 本文字数:1143 字

    阅读完需:约 4 分钟

去年,Ron Jeffries撰写一个系列关于测试驱动开发文章,通过尝试用Ruby 编写一个数独游戏(Sudoku)解算器的方式,展示他如何实践测试驱动开发。 Ravi Mohan 最近找出这些文章,把它们与 Peter Norvig 的类似成果进行对比,指出了测试驱动模式作为设计方法的缺点。这一论据的核心在于,Norvig 博士提出了一种优雅的解决方案:

本文中,我处理了在解决每个数独迷题过程中遇到的问题。最后发现其解决方式还是非常简单的(只需要 100 行 Python 代码),它基于以下两个想法:约束传播查找

但是 Jeffries 的方法就繁琐多了:

我曾经设想过,或许可以先开始一个简单的数独游戏,然后试着用测试驱动开发来得出解决方案。但是我又觉得我没法那样做……所以,我打算以一套假定的内部数 据结构来构建游戏,然后并使用测试驱动开发来得到我认为应该会用得到的方法……会引起争议的是,这违反了 YAGNI 原则(You Aren’t Gonna Need It),但由于我不知道如何开始,也不知道怎样才算完成,所以按 TDD 的方式先写一些零碎的代码对我来讲是一个合适的开始方式。我不是在说这个好,也不是说你必须这么做,啥也不是。我只是在展示我在面对这些问题时是怎样做的,以及如何让我和我的电脑朝着数独游戏的解决方案这个方向前进。

换句话说,Norvig 的文章以一种将想法按逻辑递推的方式,来得到简洁优雅的解决方案(“推导求证(science as it’s shown)”),相反,在 Jeffries 的一系列文章中给出的见解是通过实践探索得出的(“实践求证(science as it’s done)”)。 devgrind 的众人对 Ron 的结果颇不感冒,他们对 TDD 做了如是评论:

“如果你手头只有锤子的话,那么所有的问题看起来就都像钉子。”而这也更加深了我对这些年来软件开发界的人士过多关注软件开发的方法论,从而低估了例如算法设计等基础方法重要性的看法。

Vladimir Levin 就此为测试驱动开发展开了辩护,他指出创建算法和构建软件的区别:

想以测试驱动开发来构造算法的做法是愚蠢的,他只会使人们更容易误认为测试驱动开发不是一个有效的设计技术。那么测试驱动开发的目的是什么?它的目标是让人们慢慢变得不再去提前考虑那些将来才使用的类和方法。

换句话说就是,尽管 TDD 可能并不是构建新算法最好的工具,但它的优势在于如何应用这些算法去解决实际问题。另外一点:Peter Norvig 是 Google 的研发主管,是一本领先的人工智能教材的作者,也许是目前在世的最好的程序员之一。尽管我们当中很少有人会有那么大的激情去仿效他的思考方法,但了解自己在解决苦难问题时到底能走多远,还是有所帮助的。

查看英文原文: Solving Sudoku with TDD - - - - - -

译者简介:张海龙,现就职于 Ethos ,注重对项目管理的过程建立和优化、设计模式的理解和实践。与 InfoQ 中文站分享内容,请邮件至 china-editorial@infoq.com

2007-05-15 06:00842
用户头像

发布了 90 篇内容, 共 12.0 次阅读, 收获喜欢 9 次。

关注

评论

发布
暂无评论
发现更多内容

被裁后半月面试8家公司无果,凭借这份Java面试指南成功入职阿里

Java全栈架构师

程序员 JVM 高并发 架构师 java面试

如何用 Serverless 低成本打造个人专属网盘?

阿里巴巴云原生

阿里云 Serverless 云原生 网盘 低成本

网络安全之内核提权漏洞深入分析

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 漏洞挖掘

利器解读!Linux 内核调测中最最让开发者头疼的 bug 有解了|龙蜥技术

OpenAnolis小助手

开源 内存 技术分享 内核 龙蜥大讲堂

数据库管理系统的未来是什么?

CnosDB

IoT 时序数据库 开源社区 CnosDB infra

多方安全计算(MPC)发展脉络及应用实践

洞见科技

数据安全 隐私计算 多方安全计算 密码学和算法

与多家机构战略合作,背后彰显PlatoFarm元宇宙龙头的实力

BlockChain先知

易观分析发布:证券类APP用户体验指数评测框架

易观分析

证券app

阿里云EMAS旗下低代码平台Mobi开放定向内测

移动研发平台EMAS

阿里云 低代码 公有云 研发工具 全端

自动化,怎么能少了性能测试

SoFlu软件机器人

受信通院之邀出席全球信息系统稳定性峰会,数列技术实力再获认可

TakinTalks稳定性社区

区块链合约安全系列(一)公链合约权限校验引发的严重安全问题

BSN研习社

区块链

架构训练营模块九作业

Geek_16d2b8

架构训练营

Java面试题库答案(技术+人事)

Java架构追梦

Java java面试 后端开发 程序员面试、

编程好习惯

源字节1号

软件开发

企业团队协同软件,SaaS模式产品快速增长

小炮

SaaS 企业团队协同

【今晚19点】关于论文复现赛,你想知道的都在这里啦!

OpenI启智社区

PaddlePaddle 论文复现

宜搭小技巧|巧用审批按钮,流程随心流转

钉钉宜搭低代码

低代码 数字化 钉钉宜搭

2022年短视频电商品牌营销专题—手机品牌抖音营销分析报告

Geek_2d6073

nginx配置系列(一)nginx配置语法解读

乌龟哥哥

4月月更

聚焦新基建,企业如何实现供应链管理再升级?

数商云

产业互联网 新基建 供应链

恒源云(Gpushare)_模块化oss数据上传小技巧

恒源云

深度学习 GPU服务器

架构训练营毕业总结

Geek_16d2b8

架构训练营

精巧的Boyer-Moore投票算法

皓月

算法

GameFi 赛道空投资产超1.5亿刀的PlatoFarm,未来想像空间巨大

石头财经

使用测试驱动开发求解数独游戏_敏捷_Kurt Christensen_InfoQ精选文章