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