本书为《Test-Driven Development By Example》by Kent Beck[America].由人民出版社出版,孙方注释。
以下为学艺不精的我综合英文原文和注释对这本书的翻译。小部分参考了孙平平等人的译本。
介绍
早在星期五,老板到Ward这儿向他介绍一个WyCash的潜在客户,Peter。WyCash是公司正在销售的债券组合管理系统。Peter说,”我对我看到的功能印象深很刻。不管怎么说,我注意到你只办理美元计价的债券。我正在创办一种新的债券,我的战略需要办理不同货币的债券。“老板转身向Ward,“好,我们能做到吗?”
这对任何软件设计者都是噩梦般的场景。你正在快乐成功地游弋在一组假设里。突然,一切都变了。这不仅是Ward的噩梦。在指导软件开发有丰富经验的老板也不确定答案会是什么。
一个小团队已经开发WyCash超过一两年的时间了。这个系统能处理大多数美国市场上常见的固定收益证券的品种,和一些外来的新工具,比如投资担保合同,其他竞争产品是不能处理的。
WyCash一直使用对象和对象数据库进行开发。在开始的时候,计算的功能抽象,美元,是外包给一队聪明的软件工程师的。他们生成的对象合并了格式化和计算。
在过去六个月里,Ward和该团队的其他成员已经慢慢剥离美元的职责。Smalltalk的数值类原来在计算方面很不错。所有的棘手代码四舍五入至三个十进制数字获得了生产精确答案的方式。随着答案变得更加精确,在测试框架中,预期结果和实际结果的精确匹配取代了一定容差范围内的复杂的比较机制。
信息格式化的操作实际上属于用户接口类。因为测试是写在用户接口类层面的,尤其是报告框架,所以这些测试不需要修改来适应这些改动。经过六个月认真的削减,Dollar类所负责的操作已经不剩什么了。
加权平均,一个在这个系统中最复杂的算法,同样经历了一个缓慢的转变。有段时间内,很多不同种类的加权平均代码分散在系统里。就像报告框架是从最初的对象里合并而来一样,加权平均算法也会有一个容纳它的地方,这个地方就是AveragedColumn。
AveragedColumn现在就是Ward要着手的地方。如果加权平均能支持多种货币,那系统其他部分应该也可以。这个算法的核心是保持一定数量的钱在相应栏里。事实上,这个算法已经足够抽象来计算任何能用算术表示的对象的加权平均数。举个例子来说,一个可以计算日期的加权平均。
周末像往常一样过去了。星期一早上老板回来了,“我们能做吗?”
“再给我一天时间,我会告诉你确切的答案。”
美元的作用就像加权平均里的一个计数器。因此,为了多币种计算,他们需要一个有每种货币计数器的对象,就像多项式。只不过条目可能是15 USD和200CHF,而不是3x^2和4y^3。
一个快速实验表明,用一种通用货币对象代替美元计算,当两种不同的货币相加时返回一个PolyCurrent对象是有可能。现在的问题是给新的功能腾出空间而不改变现有功能。如果Ward运行这些测试会发生什么呢?
在为Currency类添加一些未实现的操作后,大部分测试通过了。在这天结束的时候,所有的测试都通过了。Ward上传代码到系统创建,然后去老板那儿“我们能做到。”,他自信地说。
让我们来思考下这个故事。在两天内,这个潜在的市场乘以数倍,乘以WyCash数倍的价值。这种如此快速地创造出如此大的商业价值的能力不是偶然的。很多方面发挥了作用。
1、方法——Ward和WyCash团队需要有一定的经验,知道如何持续地进行系统设计。因此转变的机制能够很好地实践。
2、动机——Ward和他的团队需要清楚地知道建设WyCash多币种的商业重要性,同时有勇气开始如此一个看起来不可能的任务。
3、机遇——周全而金发信心的测试、构造良好的程序、可以隔离设计决策的程序设计语言使得只有少数错误来源且错误容易更正。
你不能控制你曾经是否有这个动机,通过施展技术法宝来增值你的项目。方法和机遇,另一方面,是完全在你控制下的。Ward和他的团队通过组合超级天赋、经历、纪律创造了方法和机遇。这是不是意味着加入你不是这个世界上十个最好的软件工程师之一,在银行也没有一打钱,因此你告诉你的老板你要加薪,然后你花时间把这个做好,像这样永远的时刻就属于你呢?
不是。你完全可以把项目放在发挥你才能的位置,尽管你是一个技术普通的软件工程师,你在有压力的时候会乱成一团,偷工减料。测试驱动开发是一套任何软件工程师能够领会且鼓励采用简单设计和增强信心的测试套件的技术。如果你是一个天才,你不需要这些规则。如果你是一个白痴,这些规则不会有帮助。对于介于中间的绝大多数的我们,遵循这两条原则能使我们工作得更加接近我们的潜力。
1、在你写任何代码之前,先写一个失败的自动化测试。
2、删除重复。
究竟如何做到这一点,细微层次的应用这些规则,并且你可以推进这两个简单的规则到什么程度是这本书的主题。我们将从Ward在他灵感一现的那一刻所创建的对象——多种货币资金。