- 論壇徽章:
- 0
|
《瘋狂的程序員》29
見屏幕一黑,絕影也不知道是怎么回事,以前在公司測試的時候從來沒出現(xiàn)這種情況,反正肯定是程序出了問題,壞就壞在還是全屏,圖像一黑,整個屏幕就黑了。他用眼角的余光瞟了瞟周總,還好周總正在興致勃勃地給醫(yī)生們介紹KIPACS是如何如何好,只有醫(yī)院領(lǐng)導(dǎo)一個人發(fā)現(xiàn)了問題。他趕忙退出全屏關(guān)掉KIPACS,再次打開。
醫(yī)院領(lǐng)導(dǎo)正要開口,絕影搶在他前面說:"這是正常現(xiàn)象,一般KIPACS用久了就要重啟一次。"那言外之意就是:"這黑屏的事,沒啥大不了的,我們早就知道了。并且這又是不能解決的,要能解決我們還不早就解決了。就比如手機(jī)一樣,就算是Nokia N95,夠高檔了吧,可是你能拿它放DVD嗎?放不了,還是將就著用吧。所以還是麻煩你們偶爾重啟一下吧。"
周總聽他這么說,回過頭來,丈二和尚摸不著頭。
最后醫(yī)院領(lǐng)導(dǎo)還是在驗收報告上簽了字,一行人撤回公司的時候,周總問:"小絕阿,那個KIPACS重啟是怎么回事呢?以前怎么沒聽你說過?"
絕影哪敢給他講很話,忙說:"沒什么大不了的,回去我調(diào)研一下,估計還有些小BUG。"
在公司做CASE就是這樣,雖然公司要求所有BUG的發(fā)現(xiàn)和修正都要最終體現(xiàn)到軟件開發(fā)文檔里,但實際操作起來,往往是程序員發(fā)現(xiàn)了自己的BUG能隱瞞下來的都隱瞞下來,自己抽個時間或者加班把它修改了,這樣給領(lǐng)導(dǎo)的印象要好一些。這和現(xiàn)在很多小煤窯的做法差不多,雖然上頭三令五申要杜絕安全隱患,但事故總還是要發(fā)生的,雖然又說發(fā)生事故要如實上報及時補(bǔ)救,但小老板們總是能隱瞞不報就隱瞞不報,自己私下處理了事。你想真要是如實上報你一個小小煤窯一年12個月就報了二十多個事故上去明年的開采許可證還怎么可能拿得到?
絕影說是小事,回到公司又看了半天都還是沒搞明白,問題就出在調(diào)窗上,這個調(diào)窗原理說簡單點其實就是把圖像的一些屬性調(diào)整一下然后重新繪制到DC上,小幅度地調(diào)整都沒有問題,就是大幅度長時間調(diào)整最后顯示圖像的部分都會黑掉。先他以為是對WM_PAINT消息的處理有問題,這個就比較麻煩,系統(tǒng)經(jīng)常要發(fā)送WM_PAINT這個消息,在里面下個斷點或者加個MessageBox就一直要不停地彈出。搞了半天還是找不出個所以然。你想要是真是對這個消息處理出現(xiàn)了問題,那應(yīng)該一早調(diào)窗就有問題才對。
調(diào)試了幾次,絕影發(fā)現(xiàn)系統(tǒng)變得越來越慢,打開任務(wù)管理器,乖乖,KIPACS居然占用了300多M內(nèi)存。要知道KIPACS剛啟動時不過只占用了17M內(nèi)存?礃幼酉袷莾(nèi)存泄漏。這樣想,他繼續(xù)調(diào)窗,調(diào)一下發(fā)現(xiàn)內(nèi)存漲上去可又沒降下來,果然是調(diào)窗的時候發(fā)生了內(nèi)存泄漏。
知道了原因解決起來就要快得多,原來是GetDC獲取DC后沒有使用ReleaseDC把它釋放,這部分在WM_PAINT消息中,WM_PAINT消息又頻繁發(fā)送,所以那內(nèi)存泄漏起來真是要命得很。
加上ReleaseDC,KIPACS終于可以流暢地調(diào)窗,看看任務(wù)管理器,內(nèi)存占用基本穩(wěn)定在20M。
搞完這個BUG,絕影看看時間,已經(jīng)是晚上9點多,公司的人早不知道什么時候都走光了。這次的事情還是給絕影留下了深刻的教訓(xùn)以至于在很常一段時間,別人問他:"影頭,你看看我這程序,怎么老是出問題阿?"他都會跟別人說:"先看看是不是有內(nèi)存泄漏。"
問題解決了,等到第二天周總來到公司,絕影便輕描淡寫地對周總說:"昨天那個KIPACS需要重啟的問題我已經(jīng)解決了,是個小問題,內(nèi)存泄漏。"
所以什么叫打腫臉充胖子。明明昨天花了5,6個小時憋得幾乎走投無路終于解決出的問題現(xiàn)在在老總面前卻輕描淡寫地說:"是個小CASE而已。"想BOSS Liu也許也是這樣,自己不知道熬了幾個通宵腦細(xì)胞不知殺死多少終于給做出個多線程出來,卻輕描淡寫地說:"多線程嘛,那個還不容易,二三十分鐘就搞出來了。"兩個人都是愛吹牛,好像自己能耐大得不得了,什么技術(shù)阿方法阿算法阿解決方案阿還不一切都盡在掌握中,原以為牛這樣吹了,大家就決定自己有多了不起,結(jié)果最后受苦的是自己,開心的是老板,老板們正是利用了這種心理,他們會說:"不錯不錯,這么個大問題能這樣快地解決,這個程序里面還有二十多個BUG,都是小問題,給你一天的時間夠了吧。"
周總對絕影反映的問題還是比較關(guān)心,他說:"內(nèi)存泄漏這個問題是廣泛存在的阿,這種問題又最不好調(diào)試。我給你介紹個軟件吧,BoundsCheck,專門測試內(nèi)存泄漏。"
在以前,絕影絕對不會去關(guān)心別人介紹的什么軟件,首先那軟件是別人介紹的,自己又不熟悉,軟件好不好阿,怎么用阿都要自己去摸索,特別是這個BoundsCheck一聽就知道是個英文版的軟件,還要拿金山詞霸去翻譯菜單或者網(wǎng)上到處去找漢化版,本來以為用這個軟件能極大地提高勞動生產(chǎn)率,結(jié)果反而花在學(xué)習(xí)上的時間都遠(yuǎn)遠(yuǎn)超過了它提高的勞動生產(chǎn)率,這叫"磨刀誤了砍柴工"。
可這次絕影還是比較慎重,昨天雖然把問題解決了但實在把自己搞得太痛苦,也幸虧昨天開了任務(wù)管理器發(fā)現(xiàn)了問題,要不說不定把代碼跟蹤到太平洋還不知道問題在哪里。
去網(wǎng)上下個BoundsCheck6 for VC,原來是大名鼎鼎的Numega公司出的,想能出SoftICE這樣的軟件的公司出的東西還能有假嗎?就比如今天微軟宣布出了一個新的操作系統(tǒng),那還不成為各大網(wǎng)站的頭條新聞。所以不僅是衣服,就是軟件也有個品牌效應(yīng)。
那天在公司又調(diào)研了一整天,絕影第一次知道了"純化測試"這個詞。以后每次周總說:"OK,明天我們進(jìn)行Purification。"絕影就跟大家翻譯道:"好,明天我們進(jìn)行純化測試,沒裝BoundsCheck的把BoundsCheck裝上,不會用的找我。"
最近幾天BOSS Liu在公司頗為得意,看來醫(yī)院對KIREGIS試運行非常滿意,要他修改的地方也很少。KIREGIS的代碼一直是BOSS Liu在負(fù)責(zé),絕影從來沒去看,這也好,世界上最幸福的事情就是你把事情交給別人別人做好了交給你居然和你的要求一模一樣,根本不用改。因為沒什么事做,BOSS Liu正好潛心研究起C++來。
本來有好多事情都是一樣,會做容易做好難,就說這C++就算你是寫了五六年程序的程序員,說函數(shù)模板、類模板、純虛函數(shù)、虛基類這些東西你又用上了多少。BOSS Liu研究了一些這方面東西,再加上KIREGIS在醫(yī)院取得了成功,覺得差不多火候已到,絕影也不過爾爾,不過就是匯編好一點嗎?還是那句話,匯編不過100多個指令,有什么難的。
可絕影總以為他對C++的研究應(yīng)該僅限于"理論"上。
兩人見了面,BOSS Liu問:"你知道這個XXXX基類的構(gòu)造函數(shù)會被調(diào)用幾次么?"
絕影自知肯定回答不上來,在這種情況下最好就不要去回答,BOSS Liu是有備而來故意刁難你,不是帶著請教的,所以就算你僥幸答對了,也并不能讓他對你欽佩的感覺油然而生;要是你答錯了,就正中他的下懷,從此以后凡是有技術(shù)上的討論,他總是會拿"你XXXX這個問題都不知道,還說個P呀"來壓你。
這正如魯迅先生說的,一家人生了孩子,你說:"這孩子好呀,以后要當(dāng)什么什么大官有多少多少錢。"那你是騙人的,可人家父母愛聽。你說:"這孩子最后會死。"這是真話,可人家父母不愛聽。怎么辦,你最好就說:"呵,這孩子……你看……呵……哈哈……"
所以絕影避開問題地重點,也打起哈哈來:"研究C++阿?有什么好研究的?我告訴你,C++能做到的,用匯編都能做到。匯編能做到,C++還有些做不到哦。"
這是絕影的殺手锏。首先把問題轉(zhuǎn)移到匯編上來。這方面他有幾年積累,算是個小行家。再說的確在自定位和精確計算代碼長度這兩個技術(shù)上只有匯編能做到,這是高級語言的死穴。管它什么語言,他用這兩點都能把它殺了。
BOSS Liu很不服氣地說:"我知道你那匯編,在Windows下不過是換成‘invoke’來調(diào)用API罷了。還能唬我。BOSS Jue,你去各大公司看看。你那玩藝過時了。"
"你懂個P,存在就是合理,懂不?這是哪個大哲學(xué)家說的。"
"我知道我知道?赡隳峭嫠嚲涂爝B存在的價值都沒有了。我問你,除非你搞病毒,還能有什么匯編能做高級語言不能做的?"
這又將了絕影一軍,每次他跟別人說:"我嘛,擅長匯編。"就最怕別人問:"你搞病毒的?"別人這樣說,就好像說:"你這人,真長得就像個賊。"所以每次他都不得不跟別人講一大堆什么匯編不一定搞病毒,除了搞病毒匯編還有什么什么用途,還能寫什么什么程序。想了半天,絕影實在想不起匯編還有什么優(yōu)勢,但沉默下去就是認(rèn)輸,從此以后,BOSS Liu就可以名正言順在他面前顯擺C++,從此以后自己和匯編語言在公司中就再沒有什么地位。請急之下,他忽然又想起大學(xué)時候做過的大數(shù)運算庫,終于洋洋得意地說:"誰說沒用了,我曾經(jīng)把一個C++做的大數(shù)運算庫算法原封不動地翻譯成匯編,算1024位乘法速度居然提高了200倍。我用匯編,可以把大部分操作數(shù)都存到寄存器中,可憐的C++阿,還得全部存到內(nèi)存中,做高級運算還是應(yīng)該在一旁休息去吧。"
說完這話,BOSS Liu沉默了。這是理論論據(jù)和事實論據(jù)都充分。本來匯編速度快這是毋庸置疑的,再加上絕影有寫好的程序擺在那里,BOSS Liu從哪里駁都駁不倒。見他不說話,絕影大模大樣往自己桌子上一坐,心里嘀咕著:"還跟我比C++,我匯編是通吃。"
大概過了10分鐘,BOSS Liu忽然跳起來大聲說到:"BOSS Jue我差點讓你給忽悠了,剛才忘記了CACHE,F(xiàn)在的CPU都有CACHE,CPU對CACHE的訪問速度和寄存器差不多,C++會把經(jīng)常使用的變量放CACHE里面,速度應(yīng)該和匯編差不多才對。"
絕影本來以為可以穩(wěn)
釣魚臺了,沒想到BOSS Liu就是這么個不見棺材不掉淚的人,聽他這么說還是有道理,至少從理論上講應(yīng)該是這樣,這下他又解釋不了實踐上200倍的速度差,現(xiàn)在沒有理論作為依據(jù),就是牽強(qiáng)地去跟BOSS Liu解釋也會把自己在這次爭論中置于非常不利的地位。最后,還是絕影沉默了。
從那次爭論以后,BOSS Liu再也沒給絕影夸過C++的好,也沒再夸自己在C++上的造詣有多深。絕影也沒再在BOSS Liu面前顯擺匯編有多無所不能,自己匯編有多爐火純青。兩人都心知肚明,他們倆水平一般,要是繼續(xù)在這語言孰優(yōu)孰劣上爭論,誰都沒必勝的把握,如果輸了,臉就丟大了。還不如好好再深造幾年,到時再一比高低。
很多年以后,絕影終于想到當(dāng)初想不出來的問題:匯編語言使用寄存器并不是對寄存器訪問比對內(nèi)存訪問更快,而是對寄存器尋址比對內(nèi)存尋址更快。很多時候他想把這個告訴BOSS Liu,但他終于還是沒告訴他。
一晃兩個月過去,絕影和BOSS Liu去醫(yī)院對他們的軟件系統(tǒng)作了兩次例行維護(hù)和更新,醫(yī)院的規(guī)模還算大,登記數(shù)據(jù)已經(jīng)有三萬多條,KIREGIS還是經(jīng)受住了耐力測試。KIPACS經(jīng)過絕影兩次更新基本上也運行比較穩(wěn)定。在領(lǐng)工資的時候,周總對絕影說:"XXX醫(yī)院的CASE已經(jīng)驗收合格,這個月給你發(fā)500元的獎金。因為這個CASE的收入也不多,就你KIPACS貢獻(xiàn)最大,所以獎金也就你有,對其它的人就不要聲張了。"
本來絕影覺得這么大的CASE忙了這么久才500元的獎金周總也真是太扣門了,但聽周總這么說,絕影還心里笑著走出了他的辦公室,恨不得立馬當(dāng)眾大聲宣布:"知道嗎?XXX醫(yī)院項目獎金500元,就我絕影一個人有!"
BOSS Liu也進(jìn)了辦公室。周總還是說:"XXX醫(yī)院的CASE已經(jīng)驗收合格,這個月發(fā)給你500元的獎金。因為這個CASE的收入也不多,就你KIREGIS貢獻(xiàn)最大,所以獎金也就你有,對其它的人就不要聲張了。"
當(dāng)然,BOSS Liu在出來的時候也恨不得力馬當(dāng)眾大聲宣布:"知道嗎?XXX醫(yī)院項目獎金500元,就我BOSS Liu一個人有!"
大家一個二個領(lǐng)完工資,臉上都喜氣洋洋。公司的電話響了,張廠長積極地?fù)屩ソ恿穗娫,說了幾句,回過頭來說:"醫(yī)院打來的,找絕影,好像程序有些問題。"
絕影一下傻了。傻的不是程序有些問題,是醫(yī)院居然指名點姓要找絕影,而且醫(yī)院居然還知道"絕影"的名字,自己麻煩了。 |
|