编程趣事——加速循环(The Speed-up Loop)

文章翻译自:The Daily WTF
“你对这份机会怎么看?”本(Ben)的人力经纪人询问他。本犹豫了一小会,这确实是他寻找的工作职位。然而,毕竟他从1989年11月开始就没有工作了,至今已经近三个月了。他的内心告诉他还需要再想想再决定。于是他告知经纪人想和对方谈谈,然后看看能不能下周再安排面试。
“事实上,他们需要马上能够到岗的人。”经纪人回复道,“比如今天的晚些时候。”

幸好,今天本出来的时候不但冲了个淋浴,还把胡须也刮得干干净净了!他同意了马上面试的要求,两个小时后,本赶到了对方的办公室,见到了技术负责人韦恩(Wayen)。

“十分感谢你能及时来”,韦恩开门见山地说,“之前的开发者突然丢下一切不管离开了!不过没关系,我看你之前在Initech写过几个月的代码,你在那都做些什么?”

“一些数据交……”,没等本说完,韦恩就打断了他,“你没有写过一些内联汇编的程序?”
“做过,再上一个项目……”,韦恩有一次打断了本,“你对多任务编程熟悉不?”
本切入了要点,讲到了1990早期的多任务编程话题。然后注意到韦恩的注意力转移到了他自己的笔记本电脑上,偶尔发出“呃,呃”的回应声,并开始画出来一些看不懂的符号。

“听起来不错”,韦恩再一次打断了本的话,“现在来看看这段代码,告诉我哪里出错了。”韦恩将笔记本电脑转向本,展示了一段手写的代码。

int i;
char *p = 0x10000;
for (i = 0; i < 1000000;i++) 
{
   *p++ = 0;
}

本注意到这是一个明显的整数溢出错误,他指出了错误,并补充到:“一般这种情况我会用memset函数设置初始值”。

“太好了!”韦恩兴奋地说道,“你被录用了!现在可以开始工作了吗?”
“我想可以”,本回答道,他有一点困惑,现在才下午3点零3分,离面试才过了3分钟而已!但本当天下午也没什么其他安排了,“那我们就开始?”

“完美!”韦恩几乎要跳起来了,“首先也是最重要的要和你说的,这将是你最轻松的一份工作。我们不需要外部的帮助,但是前面的开发者离开了,我们需要填补上空缺!你知道是什么意思,对吧?”

韦恩没等本回答,只停留一个念头闪过的时间,就又说道:“在这里我们遵循二八法则,你以前听过二八法则吧?”
韦恩没有给本回答的机会就继续解释道:“其实没什么,不管你认为实际会花上多少时间,在IT界,不到80小时的工作量,你告诉老板的时候,乘以20就对了!你看,这是就二八法则!”
这和本平时理解的二八法则并不相同,对本介绍了程序开发部门的一些“规则”后,韦恩向本解释了他需要做的工作内容。
这个程序其实是个无聊的后勤管理应用,运行在公司自己构建的多任务窗口系统(MTWS)上,实际上微软刚刚向市场推出了的Windows 2.11系统,但是整个公司对该系统并不信任,因此自己开发了一个。

韦恩是MTWS的设计者和主要开发者,这个系统基于DOS的窗口应用,并且使用ANSI图形绘制所谓的“窗口”。每个窗口可以同时允许4个不同应用中的1个(其中1个就是本接下来要负责的),支持拖拽,调整大小以及窗口间的通信。

仔细浏览了一遍MTWS和后勤应用后,本结束了当天的工作,并在第二天早早来到了公司。接下来几天十分过得平稳,然后是几周,然后是几个月。

在韦恩的指示下,本每天只需要花1小时对他负责的应用做一些维护或小的修改,而剩下的7小时就是在无所事事,或者说是“其他工作”。

在他停下来的时候也没办法上网冲浪,本开始深挖MTWS的内部代码逻辑。事实上,这个系统的代码写得结构清晰,注释也很完整,并且随处可见内嵌的一些汇编代码。有一天,本浏览到图形化子系统的时候,发现了一段奇怪的隐藏很深循环代码。

for (i = 0; i < 1000000;i++)  {;}

这段代码会在每次屏幕渲染的时候运行。本双击再次确认了一遍,确实时每次屏幕渲染的时候都会运行。
这可能是一个bug或者是忘记删除的多余代码,本询问韦恩该怎么处理。
“哈”,韦恩轻笑道,“老兄,这是我们所谓的‘加速循环代码’,我们放置在这里是为了保险起见,真的!”
本难以置信地摇了摇头,指出来这是技术上应该避免的问题。
“这段代码的意图是”,韦恩继续说道,“我们会有一些真的很耗时的开发工作——不是我们平时那些修复bug或小修小改的工作,然后我们就去掉循环次数后面的一个0。然后对老板说,在最近的开发工作中,我们解决了部分运行速度慢的问题!经过我们的深度优化,我们的系统运行速度得到了显著的提升,因此我们可以将新的开发工作往后推几周!”

“你看,还真是保险吧!”韦恩说道!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章