怪怪 | Nothing, Everything

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

三问TDD: 单元测试总是好的吗?

原帖:再问TDD: 扩散角模型

有关测试“后行”也可以接受的说法,说明了一个事实:即使是最中坚的测试粉丝,也经常需要修正自我。很多理论抛出来之后,在现实面前,都不断的妥协。一些妥协到基本完善,一些妥协到基本完蛋。

说实话,我表面上是一个保守派,其实骨子里是个激进派。几年前我的想法深度和广度都不足,实际上也非常容易跟潮流; 现在情况稍微好了一点(我只敢这么说),所以我的激进反而表现在,无论你多牛的人提出,再多的人捧场,只要让我觉得不舒服,同时这种不舒服是存在道理支撑的,我就会比倡导者更早的进入砍掉多余内容或增加判定条件的过程。 如果我说我对流行趋势不屑一顾,那我太张狂了,也不是实情。实际情况是,我关注它们能带来的东西,但也确实持谨慎态度,同时或多或少的能感觉到一点它们必将发生的修正道路。

关于先行还是后行(虽然后行已然很难说是TDD,同时失去了先行测试的一些重要优势),其实我在乎的不是这个。存在很多情况,后行会比较舒服,这是必然的。但是关于“必须”这个词,我觉得还是太绝对了。我们都不必考虑单元测试对静态语言到底发挥多大作用,也不必去注意单元测试的最大受益者是动态语言这一事实,只要再考虑一下我说的“扩散角”模型就够了。

在很多情况下,一个隐含BUG但能以95%的概率正确完成任务的东西,比因为抱有单元测试在各个粒度级别必须达到一定覆盖的想法,而超过了成本能承担的极限所造成的问题,还是要好得多。 反过来,另一些情况下,一个隐含着定时炸弹的程序是相当危险的,比如医疗方面的嵌入式软件。 虽然软件和参与人员的规模本身就会对流程和组织结构的进行产生重大影响,但是如上所述的基本道理,仍然是在何种程度上确立测试的标准和规模的重要因素。

如果让我倡导测试理念,我觉得除了掌握好测试的切入点和目标的粒度,一个首先要学会的东西,就是在列表里划出优先级,同时标出不可获缺的测试,和那些如果砍掉对置信度影响极其轻微的测试。 另外一方面,排除那些“先行测试”的重大优势,具体到可以“后行”的单元测试,我认为单元测试的必要性,很多时候来自于开发者脑中对该单元的不确定性。有些时候,直接抹掉不确定性的成本要高于使用测试的成本,这时候测试就是必要的;而再另一些时候,测试不过是对脑海中确定的东西换一种方式重复一遍罢了。

后者本身是不需要什么单元测试的,但是很多人总在强调一件事:是人就会犯错。但这种说法没有考虑该事实的另外一个方面:既然是人就会犯错,当你重复自己的时候,或别人重复相同的知识的时候,也仍然存在犯错的几率。这个事实所带来的结果可能是非常让人惊诧的:当我们无差别的认为所有目标都应该进行单元测试时,有可能使得结果的置信度被降低; 最终要么造成更大的麻烦,要么反而使得软件的可靠性受到影响。 这或许有点耸人听闻,但这就是我为什么强调,增加一个环节,有时候并不只是增加工作量,而是引入更多的混乱的其中一个可能的原因。

所以在这里,我可以很个人的给单元测试增加一个“必要性指标”,这个指标是由测试目标可能存在的不确定性所决定的。对于较大型的组织来说,应该对这事有一个统一的判断标准,哪怕仅仅是测试目标的预期的代码行数; 更好的做法是对复杂度建立起统一且规范的判定标准。这样做甚至对于那些肯定应该进行的测试,也能起到一定的辅助作用(比如认识上的)。

好钢要使在刀刃上。说到底,无论是测试,还是硬生生的调试,我们关心的不是别的,还是成本的问题: 哪怕一团糟,我们如果有无限的时间,无限的金钱,爱怎么写根本无所谓。所以当我们说测试是“必须”的时候,或者说测试毫无用处的时候,最好还是先看看表,数数人头,再摸摸自己的钱包; 也许他们会让你不得不选择去写某些测试,但是对另一些情况和其它一些测试,答案正好相反。另外,如果对负面效果无法做出清晰的认识,我们可以去用,但不要对测试产生依赖性。

总而言之,很多测试倡导者的问题,恰恰不是过于重视测试,而是对待测试的态度过于轻易了。我们无论使用什么手段,实质上追求的仅仅是一个概率,这数字到底是会上升还是下降,是一个问题; 提高每一个百分比所要付出的代价,也还是要精打细算才成。 对每一个可能带来变化的决定,只有四个字: 如临大敌,如履薄冰。

另外,我希望大家注意一个倡导了20年的,比测试要轻量的多,甚至更应该作为一种良好习惯的编程技巧,既子程序(Routine)内的断言。一个测试如果“后行”是可以被允许的,那么也许这个测试可以部分的用断言代替:当断言认证了所有造成不确定的点,我们就没必要在测试中重复这些知识,从而避免引入新的不确定性。 凡是适合使用断言增加置信度的地方,我个人的看法是,断言的性价比相对测试要高得多;唯一需要注意的是,断言在某些场景下也会连带一些负面的效果,或者成本比测试还要高; 这仍然是对不同手段适用性的判断。更多的思考是,在稍微大一些的组织内,我们无法确认程序员是不是正确的在子程序内使用了断言。但在这上面,我觉得,信任程序员比信任测试员好: 对相同的知识,前者有一个产生风险的主体,后者却有两个。

说实话,我觉得有些大牛和他们的文章都有点,怎么说呢? 不够严肃,或者说不够严谨。 实际上建立简单的模型和进行基本的分析,对一些要素的覆盖达到一定比例,就可以获得更好的指导原则;但是我要说的是,他们在宣传时忽略了这些工作,或者说对这些方面没有很好的展开;更没有尽职尽责的把这些表面之下的工作结果,推广到受众群里去。一些人可能是没时间,也没这个义务;但另一些人,就像我说MS隐藏ASP.NET的复杂性一样,是故意的。

我觉得这才是我这类哗众取宠之人存在的最大的必要性:做一个提醒。但是我这类人也绝不可能花几个月时间,进行分析研究工作,然后拿出一个严谨的,令人信服的行动的初步指南。这些工作还是必须大家自己去做,尤其是某一理念的追随者们需要付出更多。

最后说明,如果场景要求或者规定非测试不可,我更多的倾向于“先行测试”;主要是因为“先行测试”不仅仅带来提高置信度的好处: 在很多情况下,这些额外的东西才是TDD的理念或者比如使用测试的方法如敏捷所关心的首要问题。另外,我不太想探讨测试或具体某种测试的必要性;我真正想强调的是,我们需要更多的拥有足够判断力的人,才可以做出更多的正确的决定,让从行业到具体组织内部的软件构件水平,上升一个台阶。

Update:
附录:
取自Venus神庙小扯一下调试。。。后半段。红色为怪怪的注释。

到调试器,不得不说测试(这里指的是程序员个人的单元测试...)。在此前一点概念需要说明。在很多人概念里,调试简单的对应使用调试器,与测试是格格 不入的。而在本书中,调试,指为了发现错误的起因所使用的所有手段,其中包含测试。测试最最最最优良的一点在于它是自动化的(这是个要点)。或者说是可永远重现的(这是付出好几方面的代价交换来的,因为测试也是人手工编写的)。这就 是说,使用测试,可以帮你解决诱发错误,重现错误等及其麻烦的事情。但是,测试往往只是能够帮你找到错误的出现点,而不总是能快速的把你带到错误的起因 点,而为了部署这些测试你需要花费很多的精力。正是基于此,包括云风老大(此人真是让人又爱又恨...,从这方面来说和linus有点像)等很多人不屑使用测试(再次强调,这是指个人的单元测试...)。但是,这部以为这测试不重要,而成为你可以肆意偷懒放低代码质量的借口。而是因为其带来的好处被其他的一些技术抵消了(也可以被非技术因素抵消),这样的话,为其付出的代价就会显得很沉重。

但是无论你使用什么样的手段进行调试。代码结构的质量才是最最最根本的内容。一个函数划分很细致,不大量滥用全局变量的代码,使用很多无副作用的函数,通 过测试你发现错误出现点,往往你就能很快到达错误起点(因为你把错误可能出现的地方限定在了有限的范围)。而如果你代码结构混沌不堪,函数/类之间关系错 综复杂,哪怕你用测试找到了错误出现点,开着调试器进去看,你也会很快转晕。所以提高代码质量,合理应用适合的调试工具和手段,正确使用调试的方法才是正 道。在这里,不得不提一下TDD。最初的时候我总觉得TDD最核心的是T,Test。后来才开始明白,它最核心的其实是D,Drive(我非常认同,这就是我说的测试之外的东西)。你可以把测试写的 很弱,但你一定要在此影响下把代码重构的很好。由此得到一个蛮歪的理:如果你或你团队的代码素质很高,可以尝试不用TDD的一些开发手段(不认同简单的以人的水平决定,而是如我正文所说,按照一定的条件作出判断);但如果你或你团 队代码素质不够高,请把自己套在TDD里面磨练一下。之所以说歪,是因为我其实只想说后半句,前半句纯属为了对仗工整而用。

最后我发现我忘提一个很好玩的东西,断言。我一直觉得这个东西很有意思。是一种游离在单元测试与调试器之外的手段,是一个隐藏在事后分析中的事前推测派来 的间谍。assert的意义在于猜测并提醒一些最有可能的错误,它不精确但也不死板。我一直觉得,全面合理的铺下断言这张网(三个部分,输入输出不变 式),可以很有效的提高调试速度。
(呵呵,对这段没啥可说的,支持)


posted on 2008-03-16 02:36 怪怪 阅读(6680) 评论(42)  编辑 收藏

评论

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

另外,求免费汉译英共同署名作者一名。
2008-03-16 03:10 | 怪怪      

#2楼    回复  引用  查看    

汉译英 是什么呀。

这么晚了还不睡,就为了发这篇文章吗?

付出与收获平衡吗?
2008-03-16 08:51 | 金色海洋(jyk)      

#3楼    回复  引用  查看    

要把那些汉语译成英语呢?数据字典吗?
2008-03-16 08:51 | 金色海洋(jyk)      

#4楼    回复  引用  查看    

...一看标题就知道是谁写的了,对guaiguai文章有个建议,写完之后把观点整理一下,写一个简洁的“观点总结”
关于TDD 说实话我还很不习惯这种思想,也从来没实践过……就不评论了
2008-03-16 10:34 | Yannic Yang      

#5楼    回复  引用  查看    

虽然大牛说:各位一个支点,我可以撬起地球。
如果你真去撬地球,那就说自己比较蠢。
因为大牛说的是他可以撬地球,不是你可以。
2008-03-16 10:40 | 戏水      

#6楼    回复  引用  查看    

自动单元测试,编写自动测试以验证您的代码是否按预期执行.还有持续集成等工作,自动测试对于获得生产质量的代码同时仍保持条理性至关重要,尤其是当您更新现有项目时更是如此。所以编写单元测试是一个专业程序员必须做的

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

@自由、创新、研究、探索……
所以我说, 如果测试, 最好还是“先行测试”。

不过,自动化流程和持续集成就一定得通过编写单元测试? 这个问题咱们先放下不谈。 即使测试, 不同的切入点和粒度,其成本不同, 对于不同情况的项目的持续集成等方面,有时却可以得到相似的结果,这些问题都考虑清楚了吗?

另外请仔细想想我说的因素和情况:在一个具体情况下,某种测试方案更多的可能是引入混乱、高成本,换回的价值却不足以抵消前者,如果一个程序员或管理者还要坚持这个测试方案, 他确实专业的不一般了。

说实话, 有时大家引用的这些照本宣科话的不容置疑的态度,开个玩笑,让我觉得把播放器设置为循环播放了... :P

@金色海洋(jyk)
大半夜爬起来发的, 平衡不平衡, 其实要看反对声音中凝结了多少回复者自己的思考, 也不是我能决定了的...

不是数据字典, 就是和我共同写作。 我想看看国外社区的风格, 只是光我一个人写作, 速度太慢了..

@戏水
地球已经开始四处乱飞了...

@Yannic Yang
谢谢你的建议..., 我会改进的, 只是精力太有限了。
2008-03-16 11:38 | 怪怪      

#8楼    回复  引用  查看    

写的太赞了。。。着实受教~~~~通过老兄的注释,一些问题想的更清楚了,谢谢:)
2008-03-16 12:20 | duguguiyu      

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

@duguguiyu
我应该谢谢你才是, 本来我因为说不清楚,都快哭了...
2008-03-16 12:28 | 怪怪      

#10楼    回复  引用  查看    

我倒是想帮你,但是我英语很烂,时间也不是太充裕.

你可以把这个"汉译英共同署名作者",再说得详细一点,大家看看谁符合要求,才好参与呀,我愿意帮忙,但是不知道能够帮多少.:)
2008-03-16 12:38 | 金色海洋(jyk)      

#11楼    回复  引用  查看    

你说的那个断言的方法,其实就有点DbC(Design by Contract)的意思.可惜主流的环境并不能很好地施行这一技术.Spec#本来有可能把它引入大众工具箱,可惜被迫在眉睫的并行计算,函数式编程抢了风头.可见很多人对质量(bug的多少)的关注还是少于速度.
我有一段也在想,DbC和测试,哪个才能更好地保证软件质量.后来的结论是两者的职能有一定重复,但也各有优势.孟岩在翻译的<<契约式设计>>里说,DbC是给保证软件正确性的过程添加了一个新的维度,我觉得这样的话也可以对单元测试来说吧.
说实在的,仅管测试有可以随时重复验证的好处,但是我宁愿在代码中直接指出"这个值永远不应该为空","执行这个方法之后,count的值会增加1"..
2008-03-16 12:48 | deerchao      

#12楼    回复  引用  查看    

受教!
2008-03-16 13:12 | Anders Cui      

#13楼    回复  引用  查看    

一个问题一直让我对于单元测试心存芥蒂。一个Class Library中很多类是internal的但是为了测试我不得不把它们写成public的,让我很恶心。
2008-03-16 15:57 | Jeffrey Zhao      

#14楼    回复  引用  查看    

@Jeffrey Zhao
这个问题倒是可以用InternalsVisibleToAttribute属性解决..
2008-03-16 16:32 | deerchao      

#15楼    回复  引用    

同志 那么恨那些水平差的人
这样吧 去codeplex 开个开源项目,做一个简单的例子 比方说domain design方面的。
给他们看看TDD的威力 就这样。
顺便在搞个比TDD更厉害的概念

楼主大人您还是对TDD不放啊 这样吧 这么喜欢那就在多翻译基本UNIT测试的书吧。我不相信KENT BECKm 没有碰到过你这样的问题直接去问问他吧。
他可能遇到过你的问题
2008-03-16 17:04 | gakaki [未注册用户]

#16楼    回复  引用    

Addison.Wesley.xUnit.Test.Patterns.Refactoring.Test.Code.May.2007.pdf
2008-03-16 17:21 | gakaki [未注册用户]

#17楼    回复  引用  查看    

@deerchao
的确可以,不过这个好吗?
这就变得为测试而在代码中添加额外特性了,还要强签名等等。
2008-03-16 17:44 | Jeffrey Zhao      

#18楼    回复  引用  查看    

@gakaki
其实我看的书也不算少,不过书中扬长避短的状况的确不少。
书上的东西都明白,又如何?实际项目和书的差别很大。
2008-03-16 17:45 | Jeffrey Zhao      

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

@gakaki
哥们,如果说我还不喜欢水平差的人,那真是冤屈我啊。 我个人在这方面的观点是,人都会成长的。说句实话,我反而对一些牛人很不满意;而且我相信每一个小菜(包括我),只要肯努力,不用到大牛的年纪就比他们牛。

我倒不见得会在codeplex上项目, 而且也不会为了展示什么就搞个项目污染大家眼球。一个软件或者库的好与坏,关键在于它解决了什么问题。我确实计划着两三年内, 做一些或多或少体现我自己理念的开源项目;但可能更多的考虑参与建设国内的开源环境。

我确实也想和老外多交流一下,问题是我想大家(无论是大牛还是我这个小菜)时间有限,E-Mail来去的,其实效率太低了。所以如果暂时不能直接参与国外社区的讨论,现存的问题就暂时搁置吧,我也不属于某方面的狂热分子。

@Jeffrey Zhao
呵呵,我觉得老赵真是平和客观之人,关于你先做人的观念,我得好好学习。

@deerchao
Spec#我大概看了一下, 还是太具体;在已有的语言中实践Design By Contract,也挺烦躁的。

我也有自己的DBC,Design By Concept,不过我的这个东西关注的倒不仅仅是代码的质量问题,而是在追求结构灵活性,降低耦合的同时,正好该方法不会像C#使用反射那样,降低置信度,破坏封装。因为它在建模时,角度和面向对象有所不同。

我这种方法带来的设计和实践的变化不小,我自己做起来都不习惯;因为检验的机会还不够多,我也没法断定它是不是个胡扯蛋的东西;尤其是一个很大的障碍在于,现在的大多数语言(尤其是面向对象语言),从出发点上和我的出发点有差异,所以在这些语言上的实现有点别别扭扭。

最近比较多的思考在于,现有的广泛使用的语言,能不能提供足够的表达力,支撑我这个理念。说到软件质量这一块,惭愧的说,我的力度其实还是很不够,只是有些自己的看法,想起个抛砖引玉的作用罢了。
2008-03-16 19:49 | 怪怪      

#20楼    回复  引用  查看    

@怪怪
C++ 0x里加了个Concept的概念,可能与你的那个"Concept"在某些方面有些相同.
2008-03-16 21:17 | deerchao      

#21楼    回复  引用  查看    

感觉是纯粹逻辑算法的地方比较需要单元测试,其他一些简单的代理方法或是顺序执行逻辑就不必了。
2008-03-16 22:03 | Dflying Chen      

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

@Dflying Chen
提到算法的单元测试,刚才随手翻了一下前一阵子买的一本Martin手下写的书,Amazon五星,Martin还亲自帮他吹牛皮; 说实话我倒不是冲着这些去的,而是觉得译者(刘未鹏)是个认真的人;觉得支持一下好了,所以买回来也没仔细看。

这一看之下,差点没被活活气死。这位老哥说,*凡是*速度不快的测试就不是单元测试,而且来回强调好几遍...咱们的一个算法在单一子程序内实现,也没有涉及任何其它资源; 如果它本身耗时20秒,原来以它为目标的测试就不是单元测试了!

然后又随便翻了翻此书,不是说没有可以学习的东西,不过作为一个商业作者,脑子也太混乱了...很多屁话就不细说了,总之我算是彻底折服了。 即使某理论是好的,这些乱七八糟的东西也会把大家带沟里去。最可怕的是他们中一些人还是有一定的开发经验的; 当这种人说起似是而非的话,不知道那些冲着名人和评级去的读者,有几个有足够免疫力和眼光, 避免被忽悠的晕头转向? 倒是那些讨论更具体的技术问题的作者, 比他们要好得多!

还有关于我文章开头说的妥协问题, 最让我想发笑的是,虽然旧的理论逝去了,新的理论的鼓吹手中, 哪怕是赤裸裸的抛弃与否定,很大比例居然还是那些老面孔。 有些东西真的是不想多说了....

说实在的,这就是我冲动的来源: 我觉得开发者社区真的不能再任由某些声音呼风唤雨了...; 不过,也许这世界本来就是这样,过去我太肤浅了看不出来而已。现在的我,只不过从一种肤浅,又变成另外一种罢了。

@deerchao
C++ 0x的Concept确实很好很强大,不过更多关注的还是具体问题。 我更多的把它看作一个接口的升级版: 更加灵活和掩盖细节,同时容易兼容和扩充。

我的东西和它在一些方面上确实有相似性,但本质上是完全不同的; 我追求的更多的是在建模、设计层面上的改变。 现在就不知道它的最终实现版本,能不能给我更多的实践手段上的支持了。
2008-03-17 01:01 | 怪怪      

#23楼    回复  引用  查看    

这些专家的鼓吹无非就是一种概念罢了,类似TDD这种确实是有用,类似于建立一个自动的质量监控器,但也并不是什么大不了的东西,也就是开发的时候结合了测试,简单的东西非要提升到一个理论高度,然后再玄乎一下,基本上就成了忽悠人的最佳手段了.最早实践tdd时候,就感觉应该是测试辅助开发而并非是驱动,因为压根就没办法驱动,问题都是意外的,哪里会有所有问题都能事先预料的,如果有的话,那测试更没有存在的必要了。
2008-03-17 09:03 | 寒枫天上      

#24楼    回复  引用    

to 寒枫天上
此言差矣,你这是典型的非TDD应用,仅仅只是写单元测试罢了。TDD核心是中间的D,如果这个关键丢了那就不叫TDD了。

to 怪怪
其实是我们过于神话某些大牛或大牛的理论了。无论这些是一个方法或者是工具。都有他的应用场景,也当然得看使用人掌握方法或工具的程度了。

小步前进,逐步改进是可取的方法。

对于单元测试,一般来讲我觉得还是很有必要的。当然就单元测试的覆盖度是可以根据实际情况加以权衡的。
2008-03-17 10:13 | ifire [未注册用户]

#25楼    回复  引用    

适合的才收获最好的
2008-03-17 10:37 | 力大无比 [未注册用户]

#26楼    回复  引用  查看    

@怪怪
呵呵,有“声音呼风唤雨”是件好事,起码表明这个行业还有活力:)
2008-03-17 10:47 | Dflying Chen      

#27楼    回复  引用    

如果说速度的话
JOLT奖最近不是有一个Junit FACTORY的东西(开源的)吗
如果你认为TDD的最大问题在于速度
那么可以改进的地方就是单元测试的自动生成了
说实话VS的单元测试速度之慢 真是。。。

这就好比java的框架一样多如牛毛,可是真的做到敏捷的还不如rails
你就是这个意思吧,感觉TDD就如浮云一般,实际上TDD可以改进的地方还很多。
2008-03-17 12:05 | gakaki [未注册用户]

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

@ifire
"对于单元测试,一般来讲我觉得还是很有必要的。当然就单元测试的覆盖度是可以根据实际情况加以权衡的。 "

其实我的意思就是"权衡"在前,"必要与否"再后。

@Dflying Chen
那倒是 :)。

@gakaki
不完全是速度, 而是需要更全面的指导方针~
2008-03-17 17:30 | 怪怪      

#29楼    回复  引用  查看    

@怪怪
我实在没有英语水平, 虽然很想翻译, 但是估计出不了什么好货的.
2008-03-17 18:25 | 随风流月      

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

@随风流月
@金色海洋(jyk)
不知道有多少人想去探索一下国外社区?

也许咱们可以共建一个小组,把文章都放在一起,共同写作、讨论和锻炼; 只有一个要求: 求同存异,不是说每一篇文章都必须小组里的人大多数认可,才开始整理、翻译、去国外社区交流的工作。
2008-03-17 18:49 | 怪怪      

#31楼    回复  引用    

@随风流月
@金色海洋(jyk)
不知道有多少人想去探索一下国外社区?

首先推荐yahoo社区的DOMAIN DESIGN 社区
http://domaindrivendesign.org/
http://www.infoq.com/cn/news/2008/03/ddd-di-aop
http://tech.groups.yahoo.com/group/domaindrivendesign/message/6546
2008-03-17 21:50 | gakaki [未注册用户]

#32楼    回复  引用    

也许咱们可以共建一个小组,把文章都放在一起,共同写作、讨论和锻炼;

不是可以翻译一下 http://www.martinfowler.com/ 全站!

thoughtworks不是又出了几个不差的测试工具

WATIN ,FITNESS
2008-03-17 21:59 | gakaki [未注册用户]

#33楼    回复  引用    

写DDD书的ERIC
记得用ORBIT DOWNLOAD的GRAB++功能下载FLV文件
2008-03-17 22:01 | gakaki [未注册用户]

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

@gakaki
其实我觉得翻译老外的网络资源就不必啦,很多东西直接看英文的就挺好也能更准确的把握作者的意思; 同时现在并不缺乏做这项工作的人。我的目的主要是如何跟老外(尤其是老外的社区,而不是少数几个中国开发者熟知的老外)交流。

说实话,比如Matin Fowler,我觉得不是没人知道他在说,也不是没法知道他说的内容是什么; 我个人认为具体到他这个人和他的组织,在那里根本学不到太有价值的理念与思想,只能了解些皮毛(虽然皮毛有时候也是有益的)。

当然大家可以认为我这人不知天高地厚,但我的出发点,更多的是想了解那些没有商业运作和宣传的,国外的开发者社区中,更加真实的讨论和第一手的想法; 同时建立起一个交流渠道。 这才是我说的探索的真实含义,而不是在四处神话某些技术明星和他们所代表的理念的时候,再替这种不理智添一把火。

总之,我觉得自己和国内不少开发者都已经到了这个阶段,需要的不是某人来给我上课,而是逐渐融入到比较贴近现实的讨论中去; 在这方面,即使我个人高估了自己,但是做一个直接的参与者,绝对比研究某些专家二次加工的东西,可以获得更快速的成长。

我觉得, 国内的研究者,应该不再满足于单方面的接受,而是是时候应该通过交流来获得真正的成长了。相对现在的"拿来",一旦"交流"走上正轨,我们就能够跟上国际开发者社区的发展,更好的把握住各种理念的指导思想。

同时, 通过和国外真正的开发者的接触,我们能更早的把一些人和一些理念请下神坛; 而不是直到国外社区的反思都完全成熟,老外们开始下一次尝试,这些变化才反映到国内社区。
2008-03-17 22:34 | 怪怪      

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

@gakaki
另外,看了你贴的InfoQ中文上翻译的那篇文章。 Eric太婉转了,感觉国内很多初学者还无法真正体会到表面文章之下隐藏的东西。

如果让我来解读这篇文章:

说实话,Ramnivas的做法先不论(肯定也存在着在很多解决问题上的优势); 他的说法,实际上是在引入混乱,模糊概念。 而Eric不愿意引起激烈的讨论,或者说不愿意自己成为这种讨论的主角, 所以绕着弯在说某些东西实际上在伤害“纯概念化”,污染“the philosophy of design”。

另外一个Eric采取太极做法可能的原因是,对于实际存在的问题和"keep as clean and conceptual as is practical"之间的冲突,他也无法给出太好的答案,为了避免让人在具体做法上抓小辫子,进而影响自己的声誉,他就不能乱说话。

说实在的,这完全是政治。

很多初学者由于还没有开始自己的思考, 总觉得这也对,那也有理, 不愧是大牛,老外就是先进。 这就是为什么我主张更多的搞一个“代表团”走进国外社区的原因: 这样可以更好和更具体的把握各种理念的脉搏,并把更清晰的轮廓更准确的描述给国内开发者。

另外一个原因就是,大家和那些靠说话吃饭的不一样。 我们往往都有自己的事情和时间安排,所以组团来做这件事,不同的人在不同的时候发挥不同的职责,效率能够高很多。
2008-03-17 22:53 | 怪怪      

#36楼    回复  引用  查看    

@怪怪
您的意思是,建立一个平台利于国内外社区的交流?
2008-03-18 12:11 | 随风流月      

#37楼    回复  引用  查看    

@怪怪
我想,如果是这样,可以采用类似 Wiki 的方式共同翻译协作。
2008-03-18 12:11 | 随风流月      

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

有道理, 我怎么没想到wiki呢? :)

大家都提提意见,我可以来策划一下这事~
2008-03-19 10:33 | 怪怪      

#39楼    回复  引用  查看    

@怪怪
支持
希望能献上绵薄之力
2008-03-21 15:57 | Anders Cui      

#40楼    回复  引用  查看    

刚注册成功,学习学习了.
2008-04-21 15:50 | 刘少凤      

#41楼    回复  引用    

汗 居然这么多人把dbc和tdd当作一类东西比较……
tdd不是为了提高代码质量 而是为了缩短开发迭代周期 tdd是可执行的需求说明书而已
2008-04-27 09:04 | areon [未注册用户]

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

@areon
你说的有一定道理, 我这么长文章没说出来的, 让你一句话给说出来了。 既然是“为了缩短开发迭代周期 tdd是可执行的需求说明书”, 那么就不得不考虑其方式、范围、粒度对这个可执行说明书的合理性及成本造成的影响; 为了提高代码质量, 面面俱到的去单元测试是不正当的; 提高代码质量在很多情况下是有替代品的。

不过也不能这么绝对。 因为将TDD用作提高代码质量, 也不仅仅是社区里在这么说这么做, 很多“砖家”、 “大牛”和他们的著作, 说实在的, 也或多或少在你说的“这么多人”之中。 毕竟他们是站在风口浪尖的, 也都表达了这种意思, 那么说TDD到底是干嘛地的, 也能不能说其目标一定就那么单一。
2008-04-27 09:31 | 怪怪      

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