編程趣事——加速循環(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。然後對老闆說,在最近的開發工作中,我們解決了部分運行速度慢的問題!經過我們的深度優化,我們的系統運行速度得到了顯著的提升,因此我們可以將新的開發工作往後推幾周!”

“你看,還真是保險吧!”韋恩說道!

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