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. 3ds Max学习日记(二)

      搞了一天终于把第二章弄完了,虽然有点慢,但也是没有办法,毕竟中途学累了总得放松一下吧.   又get到了一个新知识点,是关于3ds max的捕捉工具的,详情见3DS MAX 学习笔记 一(捕捉工具 ...

  2. windows与linux下执行.class(包含main方法)

    来源:http://blog.csdn.net/hanqunfeng/article/details/4327325 一般来说,执行一个java文件采用执行jar包的方式最为方便(java -jar ...

  3. do_try_to_free_pages

    /* * This is the main entry point to direct page reclaim. * * If a full scan of the inactive list fa ...

  4. 关于对 NUMA 理解(学习笔记,便于以后查阅)

    对NUMA的理解: NUMA是多核心CPU架构中的一种,其全称为Non-Uniform Memory Access,简单来说就是在多核心CPU中,机器的物理内存是分配给各个核的,架构简图如下所示: 每 ...

  5. [剑指Offer] 64.滑动窗口的最大值

    题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6 ...

  6. springBoot配置分析(属性和结构化)

    使用idea自带插件创建项目 一直下一步到完成 application.properties local.ip.addr = 192.168.2.110 redis.host = 192.168.3. ...

  7. 【bzoj4641】基因改造 特殊匹配条件的KMP

    题目描述 如果两个长度相等的字符串,如果存在一种字符的一一映射,使得第一个字符串的所有字符经过映射后与第二个字符串相同,那么就称它们“匹配”.现在给出两个串,求第一个字符串所有长度等于第二个字符串的长 ...

  8. 【状压DP】【UVA11825】 Hackers' Crackdown

    传送门 Description 你是一个hacker,侵入了一个有着n台计算机(编号为1.2.3....n)的网络.一共有n种服务,每台计算机都运行着所有服务.对于每台计算机,你都可以选择一项服务,终 ...

  9. JS深度合并对象

    /** * 如果target(也就是FirstOBJ[key])存在, * 且是对象的话再去调用deepObjectMerge, * 否则就是FirstOBJ[key]里面没这个对象,需要与Secon ...

  10. POSIX.2 正则表达式

    By francis_hao    Oct 1,2017   这里的正则表达式主要是指扩展正则,也就是egrep(grep -e)用到的正则表达式. 字符 含义 类别说明 | 分割分支,正则表达式会去 ...