TDD随想录

谨以本文献给TDD的开创者与传播者

本文纯属个人经历,如有雷同纯属巧合

我从不觉得自己是一个好的程序员,甚至可能连合格都谈不上,不过在内心深处我却渴望着在编程这件事上获得成功。

可惜每次审视自己写的暂且称之为代码的东西,都会有挫折感,想重构却又感觉盘根错节,难以下手;想重写却又感觉自己好不容易写出来的,也花了不少心思,就这样丢弃心有不甘。

也曾思考过如何才能写好代码,有段时间觉得只有严格符合编程规范的代码才是好代码进而如同遵守戒律一样地字字斟酌,还有段时间觉得只有用上设计模式才能称之优秀代码进而非模式不用,一切套用模式。不过这些都没有让我走出开发的迷雾,永远是加不完的班,修不完的bug。

究竟是否有一种方法能够让我拨开开发迷雾,至少能够让我能够轻松地修剪代码,降低bug发生率,那么我觉得这种方法在我身上就是成功的。

初次接触到TDD是通过公司内部的“代码大全培训”,犹如十月革命中阿芙勒尔号的一声炮响,为我打开了软件开发的视野。先测试后开发,小步迭代,持续集成,这些新名词突然涌进了我的大脑,既新鲜又晦涩。犹如人的幼年容易犯幼稚病一样,初识这些新名词就以为了解了TDD的一切,结果却发现在实践过程中处处碰壁,举步维艰。对TDD中每个环节真正隐含的开发思想的囫囵吞枣,让这一次的培训只在我脑中留下TDD的一个模糊身影:为软件开发结下一张安全网。

虽然未领悟精髓,但培训后体验和直觉告诉我TDD是一条通往我向往的软件成功的道路,尽管自己摸索前行比较坎坷。很幸运的是团队获得了随队敏捷教练的支持,结对让我系统地了解到了TDD的思想。

测试先行,其实讲的是需求边界,测试不是漫无目的而是精确计算成本的一项活动。测试从何而来,从需求来,需求推演出测试,也规划出产品边界,不能反映需求的测试是一种浪费,因此引申出开发需要讲求适当。开发是一项功利性的活动,永远都在追求盈利,而测试就一条红线,一旦跨过就意味着亏损。

小步迭代,“让子弹飞”中有句话很经典:步子要一步一步迈,一步迈大了,咔,容易扯着蛋。代码堆叠的后遗症是复杂,复杂到没人愿意触碰,且不停地咒骂这代码有多烂,这是步子迈太大的真实写照。TDD讲求的小步迭代是写完一个测试再去写完一个实现,每个实现都是通过测试的,如此累加小胜为大胜,最后所有代码的收尾也不过是让最后一个测试通过而已,就是这样简单。

重构,这是我最喜欢的部分,为啥?因为这里面所有的活动都会要求你去思考,且看上去都像是让你的代码向着大师级代码前进。漂亮的代码并不是堆砌各种技巧,而是在正确的时间,正确的地点做正确的事,重构很容易实现这个目标。重构是一件让人一旦开始就会欲罢不能的事,会让开发者在整个开发阶段都能够不停地去思考、实践再思考,直到无法再添加或删除一个字母。

持续集成,你终究是需要交付产品的,产品就是客户需要的价值,就如同厨师终究会端出客人点的大餐一样,没有哪个厨师是把所有食材罗列着呈现给你的,而是混合在一起,蒸煮炖烧,有些食材需要先处理,这样吃起来才软硬适中,而有些则是最后下锅,这样吃起来才鲜嫩多汁,厨师就是这样一步步将食材集成起来,每一步的处理都是可用都是有价值的,都是为后续进行的铺垫。软件开发也一样,持续集成就要保证每一次的完成都是有价值都可以为后续提供支撑。

写到这里也许会有人问你如何知道TDD是真理,是康庄大道,它一定适合每个人吗?不,我并不知道,我所写的一切只是发生在我身上的一段经历。这段经历告诉我TDD迫使我去更多的思考,去切割我那些冗长且复杂又不切实际的胡思乱想,把它们碾碎成一个个小片段,提炼,过滤,不断累加,最终变成最接近交代价值的东西,而这最终的东西正是我一直在追求的那个成就感。如果想要知道TDD是不是适合自己,最好的办法就是去尝试,去亲身体验一下,无论好坏也许你能获得比我更多的体会。

最后特别感谢指导我的教练传湘,扎西和小崔!

TDD随想录的更多相关文章

  1. TDD(测试驱动开发)培训录

    2014年我一直从事在敏捷实践咨询项目,这也是我颇有收获的一年,特别是咨询项目的每一点改变,不管是代码质量的提高,还是自组织团队的建设,都能让我们感到欣慰.涉及人的问题都是复杂问题,改变人,改变一个组 ...

  2. TDD(测试驱动开发)培训录(转)

    本文转载自:http://www.cnblogs.com/whitewolf/p/4205761.html 最近也在了解TDD,发现这篇文章不错,特此转载一下. TDD(测试驱动开发)培训录 2015 ...

  3. TDD(测试驱动开发)

    TDD(测试驱动开发)培训录 2014年我一直从事在敏捷实践咨询项目,这也是我颇有收获的一年,特别是咨询项目的每一点改变,不管是代码质量的提高,还是自组织团队的建设,都能让我们感到欣慰.涉及人的问题都 ...

  4. TDD在Unity3D游戏项目开发中的实践

    0x00 前言 关于TDD测试驱动开发的文章已经有很多了,但是在游戏开发尤其是使用Unity3D开发游戏时,却听不到特别多关于TDD的声音.那么本文就来简单聊一聊TDD如何在U3D项目中使用以及如何使 ...

  5. 初步认识TDD

    TDD,测试驱动开发(Test Driven Development)是极限编程中倡导的程序开发方法,以其倡导先写测试程序,然后编码实现其功能得名.本文将对TDD有一个较为系统的认识.    基础属性 ...

  6. Asp.Net Core + Dapper + Repository 模式 + TDD 学习笔记

    0x00 前言 之前一直使用的是 EF ,做了一个简单的小项目后发现 EF 的表现并不是很好,就比如联表查询,因为现在的 EF Core 也没有啥好用的分析工具,所以也不知道该怎么写 Linq 生成出 ...

  7. TDD原则

    TDD 介绍 测试驱动开发,或者叫 TDD,是一个敏捷方法,通过确保在代码是先前手动编写测试用 例,用测试来驱动开发,从而翻转开发生命周期(它不只是作为一种校验工具). TDD 的原则很简单的: 只有 ...

  8. Atitit各种SDM 软件开发过程SDP sdm的ddd tdd bdd设计

    Atitit各种SDM 软件开发过程SDP sdm的ddd tdd bdd设计 1.1. software development methodology (also known as SDM 1 1 ...

  9. 使用IdleTest进行TDD单元测试驱动开发演练(3) 之 ASP.NET MVC

    一.[前言] (1)本文将用到IOC框架Unity,可参照<Unity V3 初步使用 —— 为我的.NET项目从简单三层架构转到IOC做准备>(2)本文的解决方案是基于前述<使用I ...

随机推荐

  1. C# WebBrowser控件详解

     作者:827969653     0.常用方法 Navigate(string urlString):浏览urlString表示的网址 Navigate(System.Uri url):浏览url表 ...

  2. 3dContactPointAnnotationTool开发日志(二四)

      添加了清空2d接触点的按钮,将输出的2d接触点的单位变成了像素,原点在图像的左下角.   对于obj文件的适配更加多样化了.

  3. activemq控制面板里的NumberOfPendingMessages、MessagesEnqueued、MessagesDequeued含义

    Number Of Consumers 消费者 这个是消费者端的消费者数量.Number Of Pending Messages 等待消费的消息 这个是当前未出队列的数量.可以理解为总接收数-总出队列 ...

  4. 检测固定IP的端口是否开放批出

    因为运维工作经常需要telnet某个IP的端口是否正常,因此有了下文 .BAT内容如下: @echo off for /f %%i in ('type ip.txt') do ( echo %%i t ...

  5. arp_ignore

    上一篇文件说了arp_announce,那么到这里arp_ignore,我们直接看代码应该也比较容易立即了 目前我知道的是arp_ignore = 0,只要IP是自己机器上的,都可以回复: 说实话就是 ...

  6. 第43天:事件对象event

    一.事件对象事件:onmouseover. onmouseout. onclickevent //事件的对象 兼容写法:var event = event || window.event; event ...

  7. set类型没有单独取值功能 通过循环取值

    set类型没有单独取值功能 通过循环取值

  8. Docker的结构(6-13)

    一.Docker的结构. Docker命令不清楚的时候可以在命令的最后加上--help Docker和虚拟机的区别? 虚拟机的实现原理是:先模拟出一套硬件,然后在这基础上跑一个操作系统,然后在这个操作 ...

  9. BZOJ4103 [Thu Summer Camp 2015]异或运算 【可持久化trie树】

    题目链接 BZOJ4103 题解 一眼看过去是二维结构,实则未然需要树套树之类的数据结构 区域异或和,就一定是可持久化\(trie\)树 观察数据,\(m\)非常大,而\(n\)和\(p\)比较小,甚 ...

  10. BZOJ1037 [ZJOI2008]生日聚会Party 【DP】

    1037: [ZJOI2008]生日聚会Party Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2800  Solved: 1654 [Submi ...