Russ Olsen:我得到的最佳编程建议
Russ Olsen作为《Eloquent Ruby》一书的作者,同时也是一名Clojure开发者。他把一个与古老的CAD[1]程序、办公室政治、及其进展有关的故事娓娓道来,整个故事可以总结为一句简单的口头禅:“千万别碰其他人的代码!”
姓名:
Russ Olsen
编程能力及工作经验:
从穿孔卡片到ClojureScript无所不能。
最显著的成就:
作者,《Design Patterns in Ruby | Ruby设计模式》,《Eloquent Ruby》
最常用的编程语言:
Ruby为首,Clojure紧随其后。
建议:
我收到的最佳编程建议来自于我的职业生涯早期,那时我正在一个令我爱恨交加的系统上工作。那个系统最酷部分是我们正在做计算机辅助设计——想象一下Adobe Illustrator,不过它是为工程师设计的。那时候,具有交互式图形的CAD软件堪称高科技的顶峰。让我痛恨的事情是,系统很慢、慢得令人抓狂:你会坐在那里,看着画面中一条接一条地出现令人痛苦的线条。完成一个简单的绘图会花费几十秒,然而当显示复杂画面时,你就有机会去喝杯咖啡慢慢等了。即便我们用早期的计算机标准来衡量,该系统的性能也是极其糟糕的,这一定传达了某些信号。如果是黑客(hacker)会做些什么?而你又该做些什么?
我所做的就是仔细查看代码。尽管图形部分不是我的职责范围,但是我花了数个夜晚和周末乐此不疲地钻研此问题,设法弄清系统如此缓慢的原因。我并没有花很长时间就找到了这个问题:一旦你启动该系统,你实际上就开启了两个进程。一个进程是正常的CAD系统,而第二个进程则用于完成与绘图功能有关的全部工作。这两个程序彼此之间通过某种类似套接字(socket-like)的网络连接进行通讯。显然,开发图形子系统的程序员已经爱上了客户端/服务器(client/server)风格的程序,并且已经在我们的CAD系统中如法炮制了他自己的程序。问题在于,由于我们是在这种早期硬件上运行该系统,因此将全部绘图压缩为一个有限的套接字要耗费我们一个数量级的性能,然而我们对正在付出的成本却给不出充分的理由。
我用接下来的整个周末将把系统整合到一起,这个版本中所有的内容被打包到单个进程中。系统的变化更是引人注目。现在,简单图像差不多瞬间就能绘制出来,然而更为复杂的图像也只需抿口咖啡的工夫就能完成。星期一早上,我一遍又一遍地演示我的整合版本:首先是给我的老板演示,接着是我老板的老板,然后又是他的老板,直至全体高层领导。
然后就大难临头了。许多那些老板的老板的老板非常生我的气,但是没有人可以或打算阐明个中缘由。我的一些同事见到我就像见了瘟神一样,避之唯恐不及。慢慢地我想通了,我已经闯入一些错综复杂的跨部门权力斗争之中。因为我用我自己的笨方法并没有给图形处理加速,而是为某个组织派系提供了制胜法宝,同时也让其他派系感到很不爽。最终,他们勉强地将第二个进程连同套接字(socket)一起移除了,从而我们获得处理速度更快的图形。不过兴高采烈的人却寥寥无几。
就在那时,所有员工的最大老板要我去他的办公室走一趟,并送给了我一个关键的建议。随着办公室的门牢牢地关上,他转过身来,二目圆睁地看着我,然后说道:
“今后,千万别碰其他人的代码!(In the future, stay the Hell out of other people’s code.)”
实际上,这是个很糟糕的建议,从那以后的数年中,我都以自己的方式对它置之不理。不过这些话还是有价值的,因为我曾多次回忆起它们。
每当一些恼人的新员工带着一个明显行不通的馊主意来找我时,“千万别碰其他人的代码!”这句话就会在我的脑海里回荡,而且声音越来越大。
每当其他工程师对我的代码有见解时,我记得当时心里是这么想的,你应该管好你自己的技术工作,但同时我又力求解除我的自尊心。
在后来的那些年里,随着我自己也在建立并管理软件开发团队,我已经意识到,对于那种古来的项目而言,可能会有整整一打程序员都知道系统到底为何如此缓慢,而且也知道该如何修复它。尽管他们心知肚明,但是他们却把解决方案烂在肚子里。因为在那种组织里,与让系统变得更好相比,还有一些更重要的事情(派系之争、办公室政治等等)要关注。“今后,千万别碰其他人的代码,”,这句话假设将会有未来。但是,拥有未来的最好方法是让以下内容成为团队的一部分:看重系统进步高于办公室政治(progress over politics)、奇思妙想高于固步自封(ideas over territory)、自告奋勇高于彬彬有礼(initiative over decorum)。