为什么这么多人不喜欢TDD

最近又有一个同事和我讨论TDD并质疑TDD是否真的有用,已经记不清是第几次类似的讨论了,前段时间王垠的一篇关于 AI 的文章中也顺带黑了一把 scrum 和 tdd,作为一个坚持实践 tdd 的tdd粉,我觉得应该深入讨论下这个问题,有时候听一听不同的意见,反而能让我们看的更加清楚。

那么,为什么这么多人不喜欢 TDD 呢?

TDD 和设计

有一个普遍存在的误解,认为采用 TDD 能够帮助我们做出更好的设计,而当抱着这个期待去 TDD 的时候,却发现得到的结果也只是 just so so,瞬间粉转黑😒

我自己在最初尝试 TDD 的时候也一直存在这种错觉,毕竟在 TDD 的过程中的确可以得到更加面向接口的设计,通过小步迭代进行快速重构,最终得出的代码相较于之前还是有明显提升的。观念的转变来源于两次Coding Dojo,第一次是TDD的Coding Dojo,通过使用TDD我自认为得到了一个很解耦的设计,而同一个题目在第二次关于软件设计的Coding Dojo中却得到了完全不一样的结果,采用抽象原子加组合的设计模式,代码更加简洁,可扩展性也更高。

这件事让我对 TDD 产生了怀疑,差一点也要粉转黑,不过,在进行一番思索之后我才发现我在纠结的根本是一个伪命题。

TDD 通常不提倡前期把详细的设计全部做好,而是鼓励在重构过程中进行涌现式设计,根据需要一步一步剥离或者调整接口,根据TDD的3步军规,你新增的所有代码应该是刚好能保证前一个测试用例通过,事实上,如果我们严格按照3步军规去做,很快就会发现一个问题:因为每次增加的代码不多,代码设计只能一点一点调整,在某一次的调整过程中如果代码设计进入一个岔道,往后可能就只能在这个岔道上一路向北,不能回头了!看起来是因为遵守了3步军规,导致驱动出一个 just so so 的设计。

实则不然。

虽然大多数时候我们要遵守3步军规,但是当我们意识到有更好的设计涌现出来的时候,要果断的抛弃现有的用例和代码,基于新的设计重新进行 TDD!

而至于我们能否意识到更好的设计,则和我们在设计方面的能力有关,和TDD无关!

所以 TDD 只是驱动开发(Develop),而不是驱动设计(Design)。

TDD 和单元测试的成本

另一个一直纠结不休的争论是关于成本,如果一个功能只需要200行代码就能搞定,我为什么要多写200行的测试呢?看起来工作量翻了一倍,而且一旦后面设计有调整,这200行的测试用例立马就打了水漂!

这个问题很难解释,特别是对因为存在类似疑问而从来不曾真正动手去写单元测试的人,不管什么样的解释都看起来很苍白。在尝试解释了 N 多遍并失败之后,这里我再尝试把这些失败的解释总结一下。

开发效率不仅仅体现在代码编写上

内部质量不受控的代码,在调试和后期维护中会耗费成倍的成本,一个简单的 for 循环越界,或者 == 写成 = 的手误,在写代码时只是那么一两秒的脑回路短路,但在未来可能会花上几天甚至几周的时间定位,更不用说复盘,分析报告和毫无意义的改进举措了!
单元测试能有效减少代码中的低级错误,而TDD能在编码环节就让你更清楚的理解需求边界和测试场景,不至于到调试阶段才发现某些场景在编码时遗漏。

即使是仅针对代码编写效率,TDD也有助于提升

TDD有助于我们进行出面向接口编程,合理的接口划分能将全局复杂的业务逻辑分解到各个独立的接口实现中,从而降低局部复杂度;另外,TDD让编码过程更专注,更容易进入到“心流”的状态,从而提升程序员的编码效率。

测试的重构是很自然

至于测试的重构,不妨和 FT 类比一下,如果用户需求发生了变化,测试场景需要调整,FT也要进行重新设计,UT 也是一样,当待测试的对象变更了(类重新设计),对应的测试代码肯定也要删除重写。实际情况中,除非是基础数据类型发生重构会触发大面积的测试用例重构外,大多数情况下代码之间依赖的都是接口,相对而言接口是比较稳定的,如果仅仅是接口实现的变更,往往只需要重构对应该接口实现的测试用例即可,对依赖该接口的类没有波及。

这个问题是最难解释的一个,只能说如果我们连这种成本都不愿意付出,那我们还是不要做软件了。

TDD 和大神

我想Linus在写Linux内核的时候,应该不是采用 TDD 的方式开发的,但是 Linux 绝对是非常伟大的产品,有很多伟大的设计,我们也看到,实际上很多大神级别的人物,并不采用 TDD 的开发方式,包括前面提到王垠的文章,这段时间在看《Unix编程艺术》甚至对于 C++/OO 都并不抱太多好感。

所以我在想,为什么呢?

后来想到一个可能的结论——对于这些大神级别的人物来说,因为他们对于软件开发本质的理解已经达到相当的高度,TDD这种工具或者方法对于他们来说,都太过于重量,或者说束手束脚。

这样一想就又释然了,谁叫咱还没到那高度呢,还是老老实实写 TDD 吧……

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,566评论 25 707
  • 做TDD是为什么? 关于TDD的概念、工具、技巧等,经典的书籍材料可能介绍的更为全面细致。这篇文章想分享的是从一个...
    武可阅读 2,560评论 2 21
  • 1.测试与软件模型 软件开发生命周期模型指的是软件开发全过程、活动和任务的结构性框架。软件项目的开发包括:需求、设...
    Mr希灵阅读 21,836评论 7 277
  • 1.测试与软件模型 软件开发生命周期模型指的是软件开发全过程、活动和任务的结构性框架。软件项目的开发包括:需求、设...
    宇文臭臭阅读 6,664评论 5 100
  • 有没有设想过这么一个尴尬的场景: 你老板从你的办公桌旁做过,看到你的工作电脑屏幕上居然开着一幅幅萌萌哒的小动物图片...
    效率火箭阅读 281评论 0 2