怪怪 | Nothing, Everything

"有过一个发疯的时刻,有感觉的钢琴以为它是世界上仅有的一架钢琴,宇宙的全部和谐都发生在它身上." - 狄德罗
随笔 - 109, 文章 - 3, 评论 - 2072, 引用 - 60
数据加载中……

再问TDD: 扩散角模型

原贴:回帖整理: 关于TDD引发的流行方法的思考

其实我相信ThoughtWorks能做好TDD, 只是我不相信大多数中小公司和目前存在着这样那样混乱情况的组织可以做好TDD。

像Ruby之类的情况, 编译期检查根本没有,测试就变得非常重要,节约时间,提高效率那是可以肯定的。在这方面,由于各种测试在实质上替代了一部分编译器和连接器的工作, 自然用处要大得多。

但是对于静态语言来说,拿Test来提高软件质量的作用又有多少呢? McConnell等一大片人不都提到测试能覆盖和发现的BUG极其有限。我觉得这并非是框架或者数据库的原因。在WebForm上,照样可以使用MVP/MVC,数据库则是哪儿都再用的。前者又涉及到成本上是否值得选取更复杂的架构。 说到底我觉得是一个权衡的问题。

就像我文章中说的,我个人也碰到过非测试先行不可的场景(往往我是处在一个库作者的角色之中)。问题是在一个项目里,如果去设定选取测试点的问题,选择测试范围的问题。最极端的TDD恐怕也不会面面俱到。这才是我所认为的复杂度。

这方面, 我有一个直觉上的方法, 就叫做“扩散角”吧。 想两条直线, 同时从一点出发, 它们中间有一个夹角。 这个夹角越大, 两条直线的另一端的两个端点,相距距离就越远。 我们假设靠近出发点这一端取一个三角形, 是被依赖的模块(或模块组); 而外面的梯形, 是依赖这个三角形所表示的模块的模块集合。

 

如果这个夹角非常大,测试想要追求全面, 其成本就非常高。 我们可以考虑, 如果这个夹角接近180度, 全面应用TDD的成本就接近于无限大。可以对应到现实中的是, 我们在一个执行TDD的项目中, 很可能会发现测试仍然是不全面的, 因为全面的测试超过了成本;当然,我们可以找出各种各样的理由,说明哪些地方,为什么,没有做测试。

如果这个夹角非常小,比如接近0度,这时候考虑两种情况:这个被依赖部分存在大量在其它方向上的夹角(可以考虑有非常多的这样的扩散角)中的重用; 这个被依赖部分没有因为重用被包括在其它夹角之内,而仅仅存在在当前夹角之中。 后者的情况, 我们可以把它们看作一个部分, 在最外围进行一个测试; 前者的情况, 也许我们只对这个被依赖部分进行一个测试, 才是性价比最优的: 对于其它模块,是不是测试,仅依赖于其自身的复杂度可能造成问题的概率。

我特别认同思归说的这些,这东西应该就是工具箱里的一个工具, 不要把它当作特别玄的或者别的什么。而且有机会使用TDD的场景, 不妨一试, 而不是抗拒它。

但是经过多少练习和实践才能确定自己拥有这个能力, 不是空谈, 我想是可以商榷的。比如我相信, 有的人严格的实践了若干次, 不如带着问题实践几次。所以我说, 能否正确的采取TDD也好其它也好, 关键是人的水平的问题。我指的高水平, 更多的是知道怎么提出问题, 如何实践, 积极思考这些方面。

比如这个扩散角模型,也不是仅仅存在着这些简单的情况; 同时,这个模型也绝不是用来评估或者产生影响的唯一一个需要用到的模型。Kent他们有把事情都交代的非常清楚吗? 即使他们交代了, 对于一个技术人员来说, 有那么多东西要学,时间和精力又有限, 能在每一个涉及领域里把这些东西一下子全记住并掌握吗?

恐怕我们需要的恰恰是很多善于思考的人, 虽然可能我们也缺已经在某一方面有大量实践的人;后面这种人,应该专人专用才是;这才是我发出疑问的地方。另外一个让我不满的就是,TDD宣传者们经常用“每一个”/“所有”这样的词汇;但是我觉得,光考虑上面这个“扩散角”接近180度这个极端的情况的存在性,如果再考虑那些依赖者中的大多数所存在的行为都是严格的可以预期的, 性价比的问题就会凸显出来了。这就是为什么我经常向这些宣传者开炮的原因。

换句话说,有多少人达到了真正能够“纸上谈兵”的水平呢? 我们考虑两个没啥经验的小伙子: 赵括和孙武。 能“纸上谈兵”的人中间,有多少是前者呢? 很显然我们需要大量的后者。 幸亏我们需要的智力和眼界, 比《兵法十三篇》需要的智力要少的多,所以我个人觉得,我所指望的行业整体水平的提高, 还是可以做到的。

有了足够多的高水平的人, 而且社会上雇佣别人的组织能够分辨它们, 在正确的时候采取正确的手段, 就是顺理成章的事情了。这是一个行业视角上的问题, 而不是一个具体技术的问题。

posted on 2008-03-15 15:10 怪怪 阅读(1597) 评论(13)  编辑 收藏

评论

#1楼    回复  引用  查看    

奇怪了,你好像说要干活了,不说了呀


tdd没研究,也不想研究了。
2008-03-15 15:13 | 金色海洋(jyk)      

#2楼    回复  引用  查看    

同意前面的
人尽其才,物尽其用,才能最体现出价值
善行不如善思,我想却并不一定正确
要体现出价值还是要大量实践来证实的
2008-03-15 15:19 | 重典      

#3楼 [楼主]   回复  引用  查看    

@重典
我的想法是,两种人都必须有,然后相互配合,这就是团队组织的学问拉。世界上又不是只有咱一个人不是...

@金色海洋(jyk)
谢谢,我又忍不住了,赶紧匿了...
2008-03-15 15:21 | 怪怪      

#4楼    回复  引用  查看    

@怪怪
有理
不过这类的问题是个人有个人的想法的,这要看带队人的决策
现在大家主要是权衡的眼前利益
2008-03-15 15:26 | 重典      

#5楼    回复  引用    

大人,这个理念需要一个完整的教学方式呢,这么说就是对整个敏捷实施的方法问题,如果说服他们用好TDD就是关键了,毕竟测试还是要做的。我记得INFOQ上有一篇如何将RUBY引进团队的文章。
@怪怪
有理
不过这类的问题是个人有个人的想法的,这要看带队人的决策
现在大家主要是权衡的眼前利益

哎,毕竟没有做过TDD和做过TDD也没有办法比较。大部分项目有的时候急躁到单纯的2层结构。不过多数这种情况也是一个人开发一个系统很多见吧。反正也是一个人开发,不需要其他人用他的代码直接2层了。
这样看来的话TDD和敏捷还是必须要一起用的呢,什么结对编程,代码共享的理论。
2008-03-15 17:37 | gakaki [未注册用户]

#6楼    回复  引用  查看    

我在用TDD的方法,但是没有用它的那种方式做,都是有这个方法,代码也写完了,单元测试时要做的,而不是先写测试,再写实现代码。非常同意作为一个工具来看待。

#7楼 [楼主]   回复  引用  查看    

@gakaki
说实话,你说的好多只是想当然。

接受其中一种方法, 就要强行打包一揽子解决方案,你想这样的方法靠谱吗? 并非只有软件自身才需要解耦。

还有某理念需要完整教学,咱先不说哪些组织里角色需要培训,培训成本如何(虽说这些都是很现实的问题),过去广泛炒作的OO/UML之类培训其结果也很说明问题吧?如果合理使用需要较高的条件要求,这个方案的实践和推广往往难于成功;这是被历史无数次证明的。

另外,你说的这些互相都挨不着边似乎。比如引入某语言才能实行某方法,如果真是这样,那就这个方法肯定没有市场。同时正在讨论的话题和两层三层也没啥关系吧? 而几个人和两层三层又有啥必然联系? 很多现在在开发社区大规模重用的东西, 一大半都是一两个人开发出来的;尤其是一些库开发,正是TDD比较合适的场景;同时在这些领域国内外也存在着大量的TDD实践。

理想化的场景是永远不存在的,对软件构件过程的思考,不是靠某网站一篇两篇的文章就能成熟的。这些问题的复杂性和为什么不能乐观的认为这样那样的方法可以让开发效率与质量得到真正的提高,像人月神话之类的书早就说过不止一遍两遍的;当然,每一次潮流的宣传者们从来都不承认。在这方面, 还是思归的看法比较妥贴。

急于相信某些方法就一定能够较好的解决问题,似乎不是一个技术人员应该有的谨慎态度。
2008-03-15 20:37 | 怪怪      

#8楼    回复  引用  查看    

@怪怪
其实前几天InfoQ上就有一篇文章,认为一个专业的程序员,并不是要一定要遵循“测试先行”的做法,根据场景而定,在编码之后再做测试,也无不可。“怎么舒服怎么用!”

然而,做单元测试却是必须的,一个专业的程序员,必须是一个好的单元测试者。我同意这个观点。
2008-03-15 21:46 | 张逸      

#9楼 [楼主]   回复  引用  查看    

@张逸
人肉TrackBack:

http://www.cnblogs.com/guaiguai/archive/2008/03/16/1108079.html
2008-03-16 02:40 | 怪怪      

#10楼    回复  引用    

云里雾里
2008-03-17 10:41 | 力大无比 [未注册用户]

#11楼    回复  引用    

tdd不是测试 而是用例的代码形式
2008-04-27 08:51 | areon [未注册用户]

#12楼 [楼主]   回复  引用  查看    

@areon
你这是一种看法, 只是我觉得如果只这样看待TDD, 似乎与事实不符; 而且既然TDD的作用是更少而不是更多, 其具体粒度上的设定则更是应该根据具体条件商榷的了。
2008-04-27 09:36 | 怪怪      

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-03-15 15:20 编辑过


相关链接:
所属专题: 敏捷开发