对话:#22 想睡觉,偶然

类别:VC语言 点击:0 评论:0 推荐:
[声明]:本英文资料源自于Herb Sutter 创建的“Conversation”栏目,“C++ 翻译小组”的翻译作品供学习交流与参考用途,不得用于任何商业用途。未经Herb Sutter、Jim Hyslop同意,不得转载;对于违反以上条款,翻译小组对此不负任何责任;特此声明。

文章来源:http://www.gotw.ca
版权归属:Herb Sutter and Jim Hyslop
译    者:csdnfriend(CSDN)

对话:#22 想睡觉,偶然

    整个星期和周末我都在深夜里惊醒, 被我的追捕者所 "采访" 。 我显然已经开始不喜欢我的新境遇, 但是我必须承认这可以变得更糟,非常的糟。我想到了那些被大笨蛋吞食而来到另一个世界的人们,想到在舞厅大门外曾是我们的避难所。

    我在寒冷潮湿的房间里颤抖。金属椅子座位的前面戳着我的腿。我移来移去,想找一个不是那么不舒适的位置。

    “入口究意在哪儿? 你对外星设备了解多少?” 我的质问者又问我, 他的口音不像有些人那么重。 我尽我所能回答他,,虽然我知道的很少。但是同一个问题问了一遍又一遍: "你们接到了哪些命令? 你的上司计划怎样使用外星技术? 你什么时候—?"

一小时很长,一天就更长了。在那段时间里,我见到自己一方的人顶多只是一瞬间,往往是我们被押解着经过走廊相遇时彼些默默而又徒劳地对望一眼,然后回到各自的审讯间。

- - - - - - - - - - - - - - - - - - - - - - - - -

    整个星期和周末我都工作到很晚,向工程的截止日期冲击。我显然开始不喜欢我们新经理“哪些必须做”的风格。即使是三倍剂量的貌似咖啡的掺入咖啡因的饮料也无法让我保持清醒。

   “嘿,新来的,你最近研究的代码怎么了?” 听到这突然的声音,我猛地抬起头来。 好的。正是我想要的 — 鲍勃来了。鲍勃, Guru的反对者。 我该怎样... 我的思路打断了。他还够不上面对犯罪控诉。我叹了口气,强行睁开眼,转过去面对他。

    "我不认为你关心弄明白那些, 是吗?" 我问。我没有注意我的语气有多暴躁, 大棒外交— 我累了。

   然而鲍勃似乎没有注意到:“你的代码,不具有可读性。” 他晃着他的杯子,还发出让人厌烦的咯咯笑声,“那些ostream插入操作挡住了你被咖啡因激活的思路,小子。”

    我盯着鲍勃。我的眼睛开始膨胀。这个傲慢的、无能的、程序员的赶超崇拜者胆敢说我的代码不具有可读性? 我坐了一会儿, 让我的愤怒积聚成一股怒火, 因此我可以压倒他. 我想我的脸颊开始抽擅。

    就在这时温迪 — 过完产假回来 — 象只地鼠一样钻了进来: “嘿, 鲍勃, 谢谢你为我打碎了这块冰。”(温迪, 对鲍勃很和蔼? 我眨眼,开始怀疑我是不是在做梦。) “我注意到这个问题,”她继续说, “但是没有想到合适的方法说出来,我将和他一起检查代码。”

    那时我明白了— 温迪也不想让我受到犯罪控诉.

   “好的,没问题,宝贝,” 鲍勃说, 边走边吮吸着他的咖啡。温迪的眼睛眯了起来。

    就在那时我听到啪的一声。我以为是温迪把她的工作间的一面墙拉到了,但是我听到鲍勃的一声叫喊。我转过去,他正在摸他的脖子后面。一块大的有弹性的带子躺在他脚下的地板上。

    “出什么事了, 我的同事?” 听到Guru温和的嗓音,我跳了起来。总是这样, 她不声不响的出现了, 静静的, 手里拿着一本厚书。书看起来很旧, 我们没有认出封面来. 鲍勃对我们三个怒目而视, 想弄清楚是谁扔的那块有弹性的东西, 然后他拿起他的咖啡杯子愤怒的走了。

   “漂亮的一击,警官大人。”我懒洋洋的说。

    “我过去可以击中三十步远的苍蝇,”Guru回答道,捡回那块东西,把它放到书里面,当那本大书合上时就成了书签。

   “你知道, 鲍勃很有特点,” 温迪说。 我看了她一眼,她正在擦因为笑而流出来的眼泪。

    “是的,” 我嘲弄的说, “但是如果他把头发向右梳,再戴上帽子, 恐怕没有人会注意。”这让温迪一阵大笑, 然后她就坐到工作间里去了。

    “我年轻的学徒,”Guru走着 — 更确切的说是滑 — 朝我过来了。我严肃起来 — 鲍勃不在周围, 然而她依然保持领导的姿态,这预示这形势对我不太妙,“你重新看过你昨天晚上上交的代码了吗?”

   我转过去面对我的键盘,调出那个我写的文件:“哦,我的,”我说道,然后开始阅读:

class Car { public: explicit Car( list<Occupant>& ); private: virtual ostream& InsertIntoStream( ostream& ) const; friend ostream& operator<<( ostream&, const Car& ); Mutex m_; // ... }; ostream& operator<<( ostream& o, const Car& c ) { return c.InsertIntoStream(o); } ostream& Car::InsertIntoStream( ostream& traffic ) const { Lock lock( m_ ); // acquire mutex, be thread-safe! string rep = MakeDelim( occupants_.begin(), occupants_.end(), "," ); // 前提: // 交通流量中还有给我的空间吗? if( traffic.width() < rep.size() || accelerationLane.length() < 100 ) throw TrafficTooHeavy(); if( !DoShoulderCheck() ) { Sleep( 500 ); Retry(); } SignalLaneChange(); traffic << rep; CancelSignal(); if( CurrentSpeed() > SPEED_LIMIT * 1.3 ) EaseOffGas(); return traffic; } // 锁被释放

    “真的,”Guru说, “你愿意解释一下吗?”

    “好的,” 我吞吞吐吐的说,有点局促不安,“我想起来了,昨天当我驾车来工作时,我开进了为高速公路修的加速道...”

   “然后呢?”

    “好的, 可能我那时觉得有点头晕. 我注意到高速公路上的交通流量非常大.突然, 我觉得我不再是开着车 — 我是正在被插入到一个流中的永久对象。”

    “继续。”

    “你知道,当要插入车流时。我的侧翼信号就象一个前置条件,如果没有合适的空间插入我的车,就抛出一个异常。接着,我进入快车道,然后检查后置条件,也就是检查速度。我觉得当我昨晚加班时,我所想的就是这些。”

    但是她只是摇头。“不是那些,” 她警告说,语气严厉, “那不是我要说的问题。”

   “不是?”

   “不是, 这令人讨厌。 你误用了ostreamwidth成员。函数width和能被插入的数据量一点关系没有。 它必须处理...? 知道吗?”

    “哦,” 我回答,深深的感到不安。我不知道什么更令我心烦:是Guru不相信我怪异的故事和混乱的思维还是她还是保持一种领导的姿态 — 那是保留给鲍勃和新手的。 “width是下一个输出的必要的最小宽度。 如果我的请求比width长, 它仍然会被写出来,所以我不必担心会被切断。”

   “那,” 她继续说,面色沉重,“首先是个令人讨厌的东西。其次,你违背了一些优秀的编码准则——也就是象100,500和1.3这样的魔幻数字。”

   “哦, 好的, 我将改正它。那个不是什么大问题。”

    “那,”她继续说,脸更加阴沉,“是第二个比较讨厌的东西。第三,是这样:你不会让对象变得线程安全。它是一个曲解。线程安全是好的, 但是现在系统中每个Car都将招致头上有一把罪恶的锁,不管 Car 对象实际上是被一个还是多个线程使用。这是早期所谓的线程安全的Java容器的错误之一。那些设计者很快发现了这个错误。如果一个对象能被多个线程使用, 那就是拥有该对象的外部代码的责任来序列化所有对它的访问。这也是一种封装,而且是在修正之后的努力。我甚至不想评论跟Sleep相关的话题。”

    “Sleep?”我问, 我马上想到了改进的方法, 但是太晚了。

   “Sleep!”她大声说,“等待一个得到后不会被释放的锁? 当这是一个基本的规则:长期的锁是被诅咒的东西! 用简单的代码进行本地系统调用,而没有在我们的System模块中使用包装器? 当我们的标准要求与具体平台相关的调用必须被隔离到System模块中时, 是为了可移植性! 当我们把代码移植到Linux时你猜猜会发生什么! 他是不是必须接触该模块! 为什么我们不抛弃所有的感觉,把整个基本代码扔到垃圾桶里,此时你想怎么做...” 她停住了, 笨拙地, 显然是控制自己, 然后接着说, 稍微停顿了一下: "但是我说过我不会评论, 而且我以后也不做。”

    我懒散地躺进椅子里, 无言以对。 我很少看见她如此愤怒。温迪后来对我解释说Guru刚和鲍勃吵了一架, 有一点失态,而且后来确实表明之后的几天里头头变的和善了一点, 因此我认为温迪肯定是对的。但在那时, 这对我来说是个谜。

    Guru面色沉重的看了我一会儿,然后变得有点温和。“对不起,” 她平静的说, “这只是... 唉. 无论如何, 我要忍住评论命名习惯,那简直接近于亵渎神明。以后请多加小心,但这都不是你最严重的错误。”

   “我 — 我想我昨天晚上想得不太清楚,”我吞吞吐吐的说。

    “你说的是今天早晨,”Guru指着我上交的代码的时间戳:星期二, 4.2 12:03 上午。 “这是你最大的错误, 我想. 你的目的是好的, 努力工作总是被人赞赏, 但是有时努力工作并不和工作出色等同。 向温迪解释你打算做什么,”她接着说, “然后回家休息,没有项目值得威胁到身体健康和家庭生活。” 当她悄悄走时, 她打开她的书轻轻读道, “有这样一种建筑梦的材料, 我们的生活被睡觉所包围' [1]。”

- - - - - - - - - - - - - - - - - - - - - - - - -

    过了一些时候, 也许是很多天之后,他们对我的回答满意了。也就是, 或者他们看到不能再从我这儿得到什么。最后,我被转移到另一个关押俘虏的地方,在外星城之外,基地之上。

    至少那儿比较暖和,最后我又和我的同事们到了一起。 最好的是,珍妮也在那里。

    当她看见我时她很愉快,径直向我走来,门在我身后砰的一响。 “你还活着! 哪儿—?”

   我举起手来算是回答了这个问题, 嘀咕着“过会儿, 亲爱的, 过会儿” ,然后一头扎进一个空铺呼呼大睡。

[参考文献]

[1] Wm. Shakespeare. The Tempest, Act IV, sc. i.

[关于作者]

Herb Sutter

是个独立顾问,也是ISO/ANSI C++标准委员会的秘书。你可通过[email protected].联系他

Jim Hyslop

Leitch Technology International Inc.资深的软件设计师,你可通过[email protected]联系他

本文地址:http://com.8s8s.com/it/it2482.htm