文章来源:http://www.gotw.ca
版权归属:Herb Sutter and Jim Hyslop
译 者:sebastian
“下周,队伍就要下去了,我想我们会在一周后到那儿。”珍妮总结道,“他们仍在水晶石塔上方挖掘,但没有什么新发现。进展很缓慢,我们不打算进行这样的探查。这超出了我们的探索和采矿的命令。弗兰奈尔仍然认为这是个玩笑。”
我笑道:“弗兰奈尔总是留有余地,要从他那儿掏出点什么。颜色不对,地点也不对,真是——”
“是啊,几个月前我们就知道它深处冰层之下。”
“形状也不对,如果有人真想开玩笑,完全可以做得比这个高明些。不管怎样,没有一个开玩笑的人会搞得这么复杂。”
“我已经听了一个好一点的消息,”珍妮打断道:“奥布里认为这是真的,但是他认为这是阴谋。如果是2001年,年代好象太近了。”她用用她那夸张的特有的口音模仿那些年轻职员。
“哦,奥布里发现政府到处在掩饰些什么。记不记小时候,当魔幻跳弹被藏起来后我们暴跳如雷的样子?”我停顿了一下,意味深长地笑了一下,“谈到庞然大物,我有没有跟你说起过我在新年后的奇怪发现,那是在真正的2001年......?没有?那好,这事发生在我第一份工作期间......”
- - - - - - - - - - - - - - - - - - - - - - - - -
那是一月二日,一个星期二,我发现鲍勃的大块头代码。我们刚过完假期,每个人都兴高采烈,肚子吃得圆圆的。不幸的是,交付期限可不等人。慢慢地,我们又回到了紧张的工作状态。我也很高兴我已经设法熬过我的工作试用期了,现在我是真正的雇员了。尽管我有时仍然怀疑这是不是完全的好事,因为现在的工作使我跟Guru捆在一起。她很能干,确实如此,但又有点怪异。
当温迪打断我的时候,已经快吃午饭了。“哎,”她说道。
我抬起头:“什么事?”我正在执行一个调试任务,想找出我代码中的一个错误,正准备休息。跟几十次单步跟踪同一个函数相比,干啥事都要强上一筹。
温迪道:“鲍勃这个星期还在外边,我需要快速修复你上个月让他接手的功能模块;我在第510行发现缓冲器溢出错误,你能在今天下午找到它并修复吗?”
“当然。” 她给了我一个文件名,我把它调入了我的编辑器。
一个半小时后,我必须承认我的错误:调试程序里真的有一些比我单步跟踪代码更坏的事情。我最终放弃了,朝着温迪的房间走去。“对不起,”我沮丧的说。
温迪吃了一惊,我估计她没有听到我来到她身后。我挤出一点笑容....这通常Guru对我们的动作。“对不起,你说什么?”她问道。
“你希望能早一点修复代码,但我很对不起,温迪,我恐怕我办不到。”
“出了什么问题?”
“我想你已经知道了我刚才所出的问题。”
“你在说什么?”
我叹了口气,不再捉迷藏:“我无法很快修复它。在我把这个模块交给鲍勃后你知不知道鲍勃是怎么干的?我发誓他的做法跟我的毫无相似之处。它的原来面目、它的目的对我来说完全是个谜。我必须要半天时间去研究他在这上面做了些什么。”我靠近她,在她的屏幕上拉出文件,来到函数开始的地方,然后按住滚屏键,几乎2000行以后,我们在文件的末尾找到了代表函数结束的}号。“这个函数现在的长度是1908行。大致是一个1200行的if语句块,接下来是700行的else语句块。我想剩余的大部分都可用源代码优化器来修正。”
温迪难以置信地摇摇头,但最终又点了点头:“我以前看他这样做过,但我真的想阻止他任意地使用标号和长长的代码行,尤其是随意的垂直空格。”
“至少有一个地方,你必须翻遍整屏的空行才能看到下一条代码行。并且你有没有注意到有时他在进入for或while语句块后用goto跳出到标号处? Guru从来不提倡这么做 . . . 她不是要实行代码的标准化吗?”
“事实上我们是这样做的,我的孩子,”一个感叹的声音从我们身后传来,我们都跳了起来。Guru忧愁地继续道,“Bob已经被警告过了。他应该再被警告一次,而这次他应该被扣工资了。但是 . . .”她思考了一下。
温迪和我都不想立即说话。沉默镇定了。最终,我静静地催促着“但是,什么?”
Guru慎重地眨眼睛了:“文件里最长的一行有多长?”
温迪快速的检查了一遍:“确切的说最长的有848个字符。这是最长的。”
“最短的有多长?”
这用了温迪更长时间:“他最短的没有空白的代码行是212个字符。这么长的有好几行。”
Guru好象了做一些快的心算,并且再一次叹息:“我明白了,也许他在做一个声明。”
我想了一会儿说:“Oh,我了解了:1~4~9。这是一行的长度和整个函数大小的比率。”
温迪叹息。
Guru把她的头发推到她的耳朵后边,调整了她的眼镜。“避免了整块集成代码,”她说。“Bob是一个结构化的程序员,但是,他应该好好地了解功能分解的存在价值。这个函数很明显可以分成两部分。但是,甚至那些部分都会太复杂,还应该进一步被分解。温迪,教这年轻人:好的代码分解有什么好处?”
“清楚,”温迪说,敲打这每个手指的关节。“复用性。封装。可维护性 . . .”
正在此时,就在这个不幸的瞬间,我们听到前门打开了,从外面传来口哨声,接着门又关上了,然后鲍勃走了进来。
“嗨,花花公子,”鲍勃说道,他脱下他的手套并在地毯上敲打靴子上的雪。他心不在焉地抓了抓脑门,“什么事?”
“我以为你整个星期都不来了呢。”温迪抱怨道。
“对,确实如此,小乖乖。我过来拿一些下载在这里的文件...并上上网....嗯,哈,当然,这些并不重要。”他斜视了一下温迪的显示器,“那是我的代码。”
“那是我的代码。在你使它变成玩笑前,它曾是一段不错的代码,”我激动的说。鲍勃比我有更多年的经验,但是我的试用期已结束了,我很生气,我猜测我本可以还有一点理智,我应该有相当美好的最后几个夜晚。我觉得好象是在冒着危险。
鲍勃耸耸肩:“嗨,看。我明白你对这很心烦。”
“心烦?鲍勃,”我反驳道,“你已经把我的代码变得很滑稽!”
“这只能归因于人的错误,”Guru平静地表示赞同。
“嗨,”Bob自卫地说,“我真心希望你能平静下来。吃一粒镇定药并且仔细思考一下这件事。”
“鲍勃,”Guru说道,“滚。”
“嗨,我并被要求...”这时鲍勃才明白过来,并冷静下来,“嗨,看。很好。我知道最近我的某些决定不是很好,但我向你绝对保证我的工作会恢复正常的...”
“鲍勃,这谈话已经达不到目的了。再见,去过你的假期吧。我们会在周一私下再讨论这件事。
鲍勃抱怨着,但是好像仔细的考虑了一下就离开了。Guru也是。两个人都从听力所及的范围里消失了。温迪和我都咯咯的笑了起来。当我们恢复过来后,温迪通过源代码优化器执行了文件,而我把当天剩余的时间都用于重写鲍勃的代码。我发现作为结果产生的更小的函数应该被重用,现在它们的功能很好地被分离开来,比集成在一个大块里好多了。更小的代码块更容易理解,很快我就发现了温迪的问题,并把它解决了。我给温迪的问题添加了一个单元测试,重新执行了整个单元测试,确保一切顺利,并重新检查了整个模块。
- - - - - - - - - - - - - - - - - - - - - - - - -
“你肯定这是你第一次在工作中发火,”珍妮摇了摇头。
在我正要回答时,休息处门开了,布拉森科沃斯基走了进来。 他看也不看的朝休息室另一边走去,对他来说有点不同寻常。
“嗨,”我叫道,“你在那里都不打招呼?”
布拉森拉沃斯基转了过来:“什么?哦,对不起,你刚才听到消息了吗?”
珍妮皱眉了:“什么消息?从发掘现场那里来的吗?”
“对,看上去那个方形尖塔,”布拉森拉沃斯基平静地说,“不仅仅是个石塔,它好象是某个建筑物的顶部。” Note [注释]
[1] Note from the authors: Believe it or not, this is an actual example of code written by a programmer the authors encountered some years ago.
作者注:相不相信随你,这的确是作者几年以前遭遇的程序员写代码中的真实的例子。 [关于作者]
Herb Sutter
是个独立顾问,也是ISO/ANSI C++标准委员会的秘书。你可通过[email protected].联系他
Jim Hyslop
Leitch Technology International Inc.资深的软件设计师,你可通过[email protected]联系他
本文地址:http://com.8s8s.com/it/it2453.htm