随笔-60  评论-98  文章-0  trackbacks-0
我和充斥臭味代码的战争
by leetaolion 2008-01-12
从去年8月份到现在,我一直在从事一个261k行代码的项目(不含空行和注释)。
其中由我本人编写的代码10.9k行(不含空行和注释,我本人所写的注释大约1/8有效代码行,属于比较少的)。
其他模块注释非常少,只在接口文件声明虚接口的时候会有一行注释,实现文件中几乎没有注释,大部分文件连文件头都没有。
在我加入小组之前,小组是稳定的,每人负责几个模块,不采用TDD,依靠的是每日集成。每日的目标是:可以Build的代码。
我加入之后,起初做些边边角角的工作。这样的日子大概持续了1个半月的样子。然后在一个午睡并没有完全醒来的状态下,接手了一个核心模块DataMgr_Module,这个模块管理所有的计算的输出结果。
一开始对工作的估计过于乐观,认为1个月就可以搞定。接手之后才发现,原来的DataMgr_Module其实是两个module,小组的老大和另外一位同事对于DataMgr是各自为政,每个人都有一份自己的数据结构和管理方法。由于同事同时负责多个上层模块的开发,所以,DataMgr_Module和上层完全耦合在一起,DataMgr_Module的大部分功能都分布在各个上层模块之中,每个上层模块重复实现的这些功能,如果有一个功能需要更新,那么就要改动所有的上层模块。所谓的DataMgr_Module只不过是把自己的所有接口都公布出来的任人欺负的家伙,公布的大部分接口都应该是私有接口。DataMgr_Module就像是个受气包,Manager变成了Clark。
首先要做的是恢复Manager的地位。统一数据结构,统一传输协议,从上层模块收回所有接口实现,规范业务流程,private所有私有接口和成员变量。Manager就该有个Manager的样子。
模块做到最后,我的感受是越到集成测试的时候,我就会越想念TDD。为什么呢?
DataMgr_Module一开始就采用了TDD。知道所有的PR会上确认的接口都完成,并通过了测试用例。单元测试做的并不充分,因为当时没有采用任何的测试用例方法。只是凭借自己对模块可能存在的缺陷进行了测试。整个单元测试的过程与其说是在测试,倒不如说是在验证,过程中对于错误的恐惧,使测试用例漏洞百出,覆盖效果是比较差劲的。另外一个原因是,TDD是把测试用例当作用户手册的,但是,同事们根本不在意你的测试用例。别说测试用例了,有时候连注释都懒得看,有问题直接沟通,人就是一部用户手册。沟通解决问题,是积极高效的,有时候是重复的。另外一个原因就是,注释的模式不好,常常要更新同样的3个不同位置的注释。之前健健告诉我,应该把这看成是必须做好的工作,就好了。但是我人比较懒,需要个好办法,变3次为1次。(目前也没有找到好办法,因为我压根就没有怎么好好找过。)
所以我常常在想,怎么样才能让TDD深入我的日常工作呢?
TDD的老爹Kent说如果已经有可以运行的代码,这时候是不适合引入TDD的。对已经可以运行的261k行代码重新写测试用例,怕是要出人命的。我想Kent老爹说的是老代码从新TDD,言之有理,对于一个成年人你来T他的小DD,当然就要踢出大事情来。但是对于一些新模块,或者说是老模块需要彻底修改(几乎全部抛弃)的时候,年轻人吗,从小开始T他的小DD,慢慢培养,说不定能T出一个会铁裆功的模块来,到时候岂不是天下无敌了。
正因为DataMgr_Module从小开始TDD,集成测试的时候,需要增加一个接口(主要用来提高模块的易用性)的时候,从提出需要到拆入,不过5分钟,令用户满意的嘴都合不拢了。为什么啊?因为TDD了。
嘴上无毛,办事不牢。调试除了问题,几位用户首先想到的是DataMgr_Module出了问题,肯定要找我。10次有8次是因为用户没有按照事先约定的协议进行操作引起的错误。为什么啊?因为TDD了。
当然也有T的不好的时候。一个哥们把DWORD编码的模块,内部全部用int代替,因为他自认不会有超过0x7FFFFFFF个数据要处理。好嘛,新的规则把编码的首位置1,0区分两类不同数据,每次操作全是失败。上层模块(DataMgr_Module也是相对的上层模块)拿着这哥们的DLL调的天昏地暗,也丈二和尚摸不着头。没办法,把老兄的的代码搞过来研究一下,原来老兄偷懒,把所有的字符串全部中转成了int(因为没有现成的字符串到双字的转换函数),他T到最后也没把这个臭虫给T出来。Shit,害死人不抵命的啊。(于是有了上一篇浏览量不高的字符串转双字方法。)
DataMgr_Module出生,使用使得部分Module因此瘫痪,老大不得已,注释掉了大量的代码,最上面打上“TODO”的MsgBox,每次运行的时候,大家都会想起我。
当然,最后这些次生修改工作必须由我来承担的。老大不得已,开辟了部分原来限制访问代码的拆出。不看则以,一看晕菜。老Clark的臭味绵延的如此之远,上至业务模块,下至基础模块,无一不沾腥带臭。
有一些代码甚至到了令人发指的地步,老大Z写的一个短短20行的函数,为了使用方便封装成n个宏函数,并对其中的部分函数再次#define,用户老大S为了方便,在此基础上又#define了一次,不知怎么回事,老大S换了个名字又是一次#define。两位老大在开发理念上的分歧在这短短的几行代码之中体现的淋漓尽致。Sigh,何必呢。(注:老大S是以每日Build通过为目标,效率至上。老大Z是一完美主义者,每日Build通过是他的目标之一,更注重Execute的代码。两位老大的共同点技术功力深厚,另外就是从未及时Meet过DeadLine。我本人更倾向于老大Z的开发理念,不过现在是老大S的小弟。)
看来两位老大都有问题,到底以啥子为目标呢?
看看微软的一天
 每日构造: daily build (mid-night)
 开发: 解决blocking bugs, 实现功能, check-out, code review, check-in
 测试: BVT, 使用测试用例进行测试
 项目经理/组长: 专家会诊
我们的差距在哪?
在测试上。目前团队大部分成员对于测试用例的理解是:由测试组在系统测试的时候,按照需求说明书写出的测试用例。而单元测试的测试用例几乎就没有。咋整?这不就是TDD解决的问题吗。
对于加入工程组的新模块,开发初期需要执行TDD,测试用例,测试用例覆盖,到什么程度呢,如果是自己写,就写到自己不心虚为止吧,如果有人专门写,那就写到此人自己没有困惑为止吧。
每次Debug的代价
每次Debug,需要启动一次HostProgram,加载所有模块。鼠标点点,键盘按按,才走到自己想要的断点。每次这么搞,都感觉自己傻瓜一样。自动化测试测到哪,我现在的能力只能做没有界面的单元测试。界面测试已经提了需求,等着老大们开讲。
对队友离开的恐惧:
我有时候会突然冒出这样的念头:如果oy,或者xa离开了,我们怎么办?项目会不会因此而停掉。结论是:项目是不会停掉的,因为我们在一个大舰队中,一个小舢板部分水手的离开,老大不会坐视,新的水手稍后就到。但,进一步的进展是举步维艰的。大量没有注释的代码,足以让每一个新成员崩溃。没有注释的代码,是队员变得不可或缺,人是安全的。这只是我以最坏的恶意来揣测不注释代码的作者。或许是赶时间吧,之前几个版本的发布都显得很精彩,不过软件的内部都是一锅卤煮火烧。这种看起来很美,会在用户的手里土崩瓦解。如果是这样的话,我们因此被团队抛弃,都不会再有团队来接纳。在此之前,还是T自己狠一点吧。
posted on 2008-01-12 13:00 创建更好的解决方案 阅读(2214) 评论(26)  编辑 收藏 引用 所属分类: TDDXP敏捷心路历程闲话连篇软件测试软件设计

评论:
# re: 我和充斥臭味代码的战争 2008-01-12 13:57 | <a href=http://minidx.com>minidxer</a>
这样的项目,做起来要累死人了……  回复  更多评论
  
# re: 我和充斥臭味代码的战争 2008-01-12 16:26 | LOGOS
这样的情形,可以试试《修改代码的艺术》(《Working Effectively with Legacy Code》)里面介绍的东西,应该会有帮助。
祝你好运  回复  更多评论
  
# re: 我和充斥臭味代码的战争 2008-01-12 21:35 | K120
一个模块10.9k行的代码,这个模块划分的也够大了。
“大量没有注释的代码,足以让每一个新成员崩溃”。夸张了吧。  回复  更多评论
  
# re: 我和充斥臭味代码的战争 2008-01-12 21:45 | K120
不好意思,说错话了,我自己一个模块的代码也有11个CPP文件,平均每个文件超过600行,大致也在6.5K行代码,还没完成呢  回复  更多评论
  
# re: 我和充斥臭味代码的战争 2008-01-13 08:33 | 小笨象
这时候,注释是很重要的了。
我自己写的程序,怎么也有10万行了。不敢忘了写注释,怕自己转头就忘了。
还好,我公司写的程序,注释还多,接手的人基本上不问我怎么做的,看注释就行了。嗯。。。。可能是因为人家聪明吧。。。。。  回复  更多评论
  
# re: 我和充斥臭味代码的战争 2008-01-13 14:04 | 西门有悔
晕哦.我一同事写了一个模块,6K多代码,没有一行注释,而且通篇是:
testID, devicenumber,Int? Long? Unsigned Long?....

我直接晕倒了.这样下去真的会死人的  回复  更多评论
  
# re: 我和充斥臭味代码的战争 2008-01-13 15:14 | eXile
http://www.javaeye.com/topic/6294
关于文档和注释的讨论  回复  更多评论
  
# re: 我和充斥臭味代码的战争 2008-01-13 15:17 | eXile
http://www.javaeye.com/topic/5876
关于文档和注释的讨论  回复  更多评论
  
# re: 我和充斥臭味代码的战争 2008-01-14 08:31 | 创建更好的解决方案
@LOGOS
书中讲的大都是以有测试的系统为前提,但是以前老前辈们写的程序,连注释都少的可怜,基本上不考虑封装,改起来真是痛苦啊!

  回复  更多评论
  
# re: 我和充斥臭味代码的战争 2008-01-14 08:33 | 创建更好的解决方案
@小笨象
我刚工作半年多点,代码写的少了一些。到了10万行的时候,或许会提高一下层次。  回复  更多评论
  
# re: 我和充斥臭味代码的战争 2008-01-14 12:17 | 创建更好的解决方案
@&lt;a href=http://minidx.com&gt;minidxer&lt;/a&gt;
你可是我见过的最细心的管理员啊,呵呵
  回复  更多评论
  
# re: 我和充斥臭味代码的战争 2008-01-14 16:18 | LOGOS
@创建更好的解决方案
书里面讲的是以无测试的系统为前提的,和你理解的不太一样  回复  更多评论
  
# re: 我和充斥臭味代码的战争 2008-01-14 19:15 | 小笨象
写代码,经验是很重要的。
多写,多看,注释不要忘。这就足够了。
慢慢的你就知道了。
如果有人教你,那才能提高得快。但不能事事问人,问就问最强的。。。。。  回复  更多评论
  
# re: 我和充斥臭味代码的战争 2008-01-14 23:54 | 菌子
### 我负责的模块,10几年了,10k行,我都怕动。  回复  更多评论
  
# re: 我和充斥臭味代码的战争 2008-01-15 08:01 | 创建更好的解决方案
@菌子
好的模块你动它干嘛?
有臭味的模块,不动,留它干嘛?  回复  更多评论
  
# re: 我和充斥臭味代码的战争 2008-01-15 14:04 | 菌子
額。。 如果這個代碼已經在十年間添加和修改了無數次,充滿了臭味,但是仍然良好的工作。 其中很多定義,用法你根本不知道原因, 你如何修改它?   回复  更多评论
  
# re: 我和充斥臭味代码的战争 2008-01-15 22:01 | 创建更好的解决方案
@菌子
那要看你对代码的要求了。
代码能工作,没错。
但是这是基本的要求,可扩展性、可移植性、可测试性也要考虑啊。
这些指标在团队中尤为重要。  回复  更多评论
  
# re: 我和充斥臭味代码的战争 2008-01-17 11:49 | 小四
个人感觉10K行的代码,下决心花力气还是可以读通的。再多了,就很是触霉头。  回复  更多评论
  
# re: 我和充斥臭味代码的战争 2008-01-21 22:51 | abettor
早就发现,注释是一种美德。
所幸,自己天良未泯,好歹有1/10的注释。

我的Team里其他一些兄弟相比之下就残忍了一些。有为老兄,一个函数写了1798行,没有任何注释,局部变量没有任何语义,都是“h”、“f”之类。后来,他走了,留下的几个人哭了。  回复  更多评论
  
# re: 我和充斥臭味代码的战争 2008-01-22 13:53 | 岁月流冰
我现在工作的模块有35个cpp文件,n个h文件,cpp文件几乎每个都在8k行以上,而且注释极少。很郁闷。  回复  更多评论
  
# re: 我和充斥臭味代码的战争 2008-01-22 17:29 | 创建更好的解决方案
@岁月流冰
呵呵,8k行是不是太重量了些。
我看到2k行以上的代码都会心有戚戚焉。
所以都控制在2k以内吧(或许我们的项目规模就不够大吧)。
  回复  更多评论
  
# re: 我和充斥臭味代码的战争 2008-01-22 17:33 | 创建更好的解决方案
@abettor
割了吧,都烧焦了。
  回复  更多评论
  
# re: 我和充斥臭味代码的战争[未登录] 2008-01-25 15:31 | 汪江涛
臭味?吐啊吐的就习惯了  回复  更多评论
  
# re: 我和充斥臭味代码的战争 2009-05-26 17:46 | zsggsz
团队规则:没有注释代码的人就主动离开!  回复  更多评论
  
# re: 我和充斥臭味代码的战争 2010-08-06 13:32 | stepinto
@K120
我现在维护的代码,300多k,至少4,5个cpp都是在15000行左右的,基本没有注释,大量的Duplicated code,Long method,Large class  回复  更多评论
  
# re: 我和充斥臭味代码的战争 2010-08-06 13:33 | stepinto
这绝对是项目管理问题@abettor
  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理