在 2025 收官前,看清 Data + AI 的真实走向,点击查看 BUILD 大会精华版 了解详情
写点什么

Kent Beck 建议超短项目跳过测试

  • 2009-06-23
  • 本文字数:1948 字

    阅读完需:约 6 分钟

Kent Beck 《解析极限编程》《测试驱动开发》的作者,他认为软件开发就如同高尔夫一样,是一项长期和短期相结合的运动。JUnit 是适合于长期运动项目的例子——大量的用户,稳定的收入(如果收入不幸是分文无有的话,对所有参与者都是可悲的),其关键目标是要保证开发领先于使用者的需要。

当我开始实现 JUnit Max 时,才逐渐明白规则已经发生了变化。最要命的问题曾经是(现在也是):“哪些功能可以吸引付费客户?”从定义来看,这是一个无解的问题。如果 JUnit(或任何其他免费软件)实现了一个同样的功能,没有人会为 Max 付费。

JUnit Max 的成功之处在于它开始赢利并不断扩大收入:付费用户越来越多,每个用户所带来的收入越来越多,病毒传播系数【译者注】也越来越高。从定义来看,既然取得成功的方式不为人知,那就进行大量实验,并结合实际使用得到的反馈,这就可以使得成功的机率最大化。

JUnit Max 将所有内部错误报告到一台中央服务器,一旦问题出现,Kent 就立即可以获悉。这种错误日志可以帮助找出两个问题。对于第一个问题,他可以写一个简单的测试使之重现,并验证相应的修补程序。第二个问题解决起来很容易,但 Kent 预计需要几个小时才能为它写出一个测试。在这样的情况下,他就直接修复问题并交付了。

Kent 接着说:

当我开始实现 Max 时,在第一个月里没有做任何自动化测试,所有的测试都是我手动做的。有了最初几个付费用户后,我才回头为已有的功能写测试。并且,我认为这种工作次序让我在单位时间内可以验证的实验数量最多。只用少许或根本不写代码、不写测试,这让我可以更快地开始(我花了近一周的时间才写完第一个测试)。一旦前面的代码被证明是有价值的(就这个项目来说,我的一些朋友愿意为它付费),这种测试就能让我能更有信心地快速完成实验。

是否进行自动化测试,需要对一系列因素进行权衡。即使在 Max 项目中我也写了不少的测试。如果我能找到一种简单的方式写测试,我就会先为所有功能开发验收测试。尤其是在我不能确定某个功能该如何实现时,写测试会给我很好的想法。在 Max 项目中,是否写测试这个问题发生了变化,变成了测试能否有助于我在单位时间内验证更多实验。如果有帮助,那我就写测试。如果没有就不写,甭管有啥危险。我正在力图通过 Max 获得更多收入。要论证围绕设计所付出的努力,这个过程同样复杂,只不过那是下一篇文章要讨论的话题了。

Ron Jeffries 是《极限编程实施》的作者,他回应说:“我相信你,此外还包括三个人,你们能在短期项目中做出正确决策。多年来的经验告诉我:在针对短期项目的决策影响曲线中有一个拐点,项目的可靠性和开发进度会从该点急剧下降。

Johannes Link 是敏捷软件教练 ,他说: “我看到有那么几个开发人员能够作出合理的短期或长期决定,但还没见到过能做到这一点的团队,更不用说一个组织了。”

Michael O’Brien 则给出了不同的评论:“在我看来,这是出色的文章,他也作出了正确的决定。我们在写代码时常常陷于追求漂亮和一致,而忘记了写代码的目的 。我写测试,是因为这可以让我写起代码来更容易,而且让我确信代码按我预想的方式工作。如果写测试不能帮我达到上面的目的,我会说:跳过它。”

Olof Bjarnason 认为:“Kent 提出了反馈流的概念。如果我们着眼于让单位时间内的反馈流多起来,那就走对方向了。例如,他提到在JUnitMax 这个短期项目中,他发布的功能都没有经过测试,这样在项目一开始就可以带来最多反馈流,其原因在于编写第一个测试太困难了,竟用了他一个多星期时间。他通过频繁地修改和发布获得了很高的反馈流。他的‘红色测试’是由早期的少数用户和他们的反馈意见构成。”

Guilherme Chapiewski 有这样的顾虑:在很多情况下人们会误认为某些项目是短期项目。Guilherme 遇到的情况是:之前为了验证某个想法,他打算开发一个没有任何测试的小项目。项目完成后人们开始使用它,很快就找到一些无法修复的 bug。最后,他得出结论: 代码写得太烂,根本无法测试。他只得扔掉已有代码,再从头来过。

Kent 对许多评论做出了回复:“我同意,实践和原则的混乱会导致问题。测试会产生更好的设计。这就是为什么我有大概 30 个功能测试和 25 个单元测试(奇怪的平衡吧,这是由于 Eclipse 应用很难进行测试)。几乎所有的新功能我都先加了验收测试。这样做减少了整个周期耗费的时间。”

这个想法能安全应用到不止一、两个人的团队中吗?除了 Kent Beck,人们是否有能力去判断该不该采用这种方式呢?

译者注:病毒传播系数,英文名为 viral coefficient,用来度量每个已有用户带来的新用户数,与“病毒营销(viral marketing)”相关。可参考: http://robert.zubek.net/blog/2008/01/30/viral-coefficient-calculation/

查看英文原文: Kent Beck Suggests Skipping Testing for Very Short Term Projects

2009-06-23 04:422149
用户头像

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

关注

评论

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

中国信通院发布2021年首批“可信AI成果” 百度摘取5项大奖

百度大脑

人工智能

百度AI师资培训兰州站启动 社会科学家的第一节人工智能课来了!

百度大脑

人工智能 启蒙 教室

云计算深度挖掘“创新潜力”,北鲲云深耕生命科学领域

北鲲云

阿里面试必备:100个高频Spring面试题,助你一臂之力

java小李

Spring Boot Sprin

MySQL 基础知识+索引相关

java小李

MySQL

☕️【Java技术之旅】【AbstractQueuedSynchronizer】教你自定义实现自己的同步器

码界西柚

Java 并发编程 AQS 同步器

来自阿里资深架构师的吐血制作,39W字千道Java一线大厂面试题手册

愚者

Java 面试

模块三

泰戈

MySQL数据的备份和恢复

java小李

myqr java基础

Java集合框架

愚者

Java 集合

[架构实战营]模块三作业

xyu

#架构实战营

21道最新Java面试题剖析(数据库+JVM+微服务+高并发)

java小李

dubbo Spirng

「从零开始学SpringBoot」—如何开始使用?

java小李

maven Sprint Boot

一篇文章告诉你什么是Spring

愚者

Java spring

Git提交信息规范化

admin

git flow git cherry-pick Git Commit git 规范

Spring Boot中常用数据库的配置

偏执

Java spring 后端

区块链技术在产品溯源领域的应用

CECBC

架构实战营 - 模块 3 - 外包学生管理系统架构文档

蔸蔸

非常全面!Java的方法详解和总结,建议收藏

java小李

java基础

多线程交替输出

愚者

Java 多线程

弯道超车!阿里甩出Spring Security宝典我粉了

java小李

java 14 Sprin

从一线城市回到三四线城市的第四个月

布衣骇客

回忆 个人总结 生活随想

外包学生管理系统架构文档

十二万伏特皮卡丘

架构实战营

多鲸专访拍乐云赵加雨:素质教育进化,音视频探路新风口

拍乐云Pano

2021年涌现大量低代码玩家,如何辨别低代码平台“真假”?

优秀

低代码

百度人脸离线识别SDK安卓版升级指南

百度大脑

人工智能 升级迭代

下一个颠覆的领域:区块链如何影响审计行业?(上)

CECBC

插件编排在 Apache APISIX 中的应用与实践

API7.ai 技术团队

lua 开源 网关 APISIX

学生管理系统架构设计文档示例-模块3

小牧ah

架构实战营

降低“美丽成本”,区块链助力化妆品行业数字化转型

CECBC

全栈工程师必备技能栈,聊聊月薪两万以内都该会点啥?

java小李

jquery less

Kent Beck建议超短项目跳过测试_研发效能_Mark Levison_InfoQ精选文章