簡體版 繁體版 《瘋狂的程式設計師》29

《瘋狂的程式設計師》29


鄉村首富 狗孃養的青春 萬華仙道 異界流氓劍師 網遊之大玄幻 重生之窈窕薯女 三國之江山美色 如花美眷:醉戀紅顏 明日記

《瘋狂的程式設計師》29

見螢幕一黑,絕影也不知道是怎麼回事,以前在公司測試的時候從來沒出現這種情況,反正肯定是程式出了問題,壞就壞在還是全屏,影象一黑,整個螢幕就黑了。他用眼角的餘光瞟了瞟周總,還好周總正在興致勃勃地給醫生們介紹KIPACS是如何如何好,只有醫院領導一個人發現了問題。他趕忙退出全屏關掉KIPACS,再次開啟。

醫院領導正要開口,絕影搶在他前面說:“這是正常現象,一般KIPACS用久了就要重啟一次。”那言外之意就是:“這黑屏的事,沒啥大不了的,我們早就知道了。並且這又是不能解決的,要能解決我們還不早就解決了。就比如手機一樣,就算是Nokia N95,夠高檔了吧,可是你能拿它放DVD嗎?放不了,還是將就著用吧。所以還是麻煩你們偶爾重啟一下吧。”

周總聽他這麼說,回過頭來,丈二和尚摸不著頭。

最後醫院領導還是在驗收報告上籤了字,一行人撤回公司的時候,周總問:“小絕阿,那個KIPACS重啟是怎麼回事呢?以前怎麼沒聽你說過?”

絕影哪敢給他講很話,忙說:“沒什麼大不了的,回去我調研一下,估計還有些小BUG。”

在公司做CASE就是這樣,雖然公司要求所有BUG的發現和修正都要最終體現到軟體開發文件裡,但實際操作起來,往往是程式設計師發現了自己的BUG能隱瞞下來的都隱瞞下來,自己抽個時間或者加班把它修改了,這樣給領導的印象要好一些。這和現在很多小煤窯的做法差不多,雖然上頭三令五申要杜絕安全隱患,但事故總還是要發生的,雖然又說發生事故要如實上報及時補救,但小老闆們總是能隱瞞不報就隱瞞不報,自己私下處理了事。你想真要是如實上報你一個小小煤窯一年12個月就報了二十多個事故上去明年的開採許可證還怎麼可能拿得到?

絕影說是小事,回到公司又看了半天都還是沒搞明白,問題就出在調窗上,這個調窗原理說簡單點其實就是把影象的一些屬性調整一下然後重新繪製到DC上,小幅度地調整都沒有問題,就是大幅度長時間調整最後顯示影象的部分都會黑掉。先他以為是對WM_PAINT訊息的處理有問題,這個就比較麻煩,系統經常要傳送WM_PAINT這個訊息,在裡面下個斷點或者加個MessageBox就一直要不停地彈出。搞了半天還是找不出個所以然。你想要是真是對這個訊息處理出現了問題,那應該一早調窗就有問題才對。

除錯了幾次,絕影發現系統變得越來越慢,開啟工作管理員,乖乖,KIPACS居然佔用了300多M記憶體。要知道KIPACS剛啟動時不過只佔用了17M記憶體。看樣子像是記憶體洩漏。這樣想,他繼續調窗,調一下發現記憶體漲上去可又沒降下來,果然是調窗的時候發生了記憶體洩漏。

知道了原因解決起來就要快得多,原來是GetDC獲取DC後沒有使用ReleaseDC把它釋放,這部分在WM_PAINT訊息中,WM_PAINT訊息又頻繁傳送,所以那記憶體洩漏起來真是要命得很。

加上ReleaseDC,KIPACS終於可以流暢地調窗,看看工作管理員,記憶體佔用基本穩定在20M。

搞完這個BUG,絕影看看時間,已經是晚上9點多,公司的人早不知道什麼時候都**了。這次的事情還是給絕影留下了深刻的教訓以至於在很常一段時間,別人問他:“影頭,你看看我這程式,怎麼老是出問題阿?”他都會跟別人說:“先看看是不是有記憶體洩漏。”

問題解決了,等到第二天周總來到公司,絕影便輕描淡寫地對周總說:“昨天那個KIPACS需要重啟的問題我已經解決了,是個小問題,記憶體洩漏。”

所以什麼叫打腫臉充胖子。明明昨天花了5,6個小時憋得幾乎走投無路終於解決出的問題現在在老總面前卻輕描淡寫地說:“是個小CASE而已。”想BOSS Liu也許也是這樣,自己不知道熬了幾個通宵腦細胞不知殺死多少終於給做出個多執行緒出來,卻輕描淡寫地說:“多執行緒嘛,那個還不容易,二三十分鐘就搞出來了。”兩個人都是愛吹牛,好像自己能耐大得不得了,什麼技術阿方法阿演算法阿解決方案阿還不一切都盡在掌握中,原以為牛這樣吹了,大家就決定自己有多了不起,結果最後受苦的是自己,開心的是老闆,老闆們正是利用了這種心理,他們會說:“不錯不錯,這麼個大問題能這樣快地解決,這個程式裡面還有二十多個BUG,都是小問題,給你一天的時間夠了吧。”

周總對絕影反映的問題還是比較關心,他說:“記憶體洩漏這個問題是廣泛存在的阿,這種問題又最不好除錯。我給你介紹個軟體吧,BoundsCheck,專門測試記憶體洩漏。”

在以前,絕影絕對不會去關心別人介紹的什麼軟體,首先那軟體是別人介紹的,自己又不熟悉,軟體好不好阿,怎麼用阿都要自己去摸索,特別是這個BoundsCheck一聽就知道是個英文版的軟體,還要拿金山詞霸去翻譯選單或者網上到處去找漢化版,本來以為用這個軟體能極大地提高勞動生產率,結果反而花在學習上的時間都遠遠超過了它提高的勞動生產率,這叫“磨刀誤了砍柴工”。

可這次絕影還是比較慎重,昨天雖然把問題解決了但實在把自己搞得太痛苦,也幸虧昨天開了工作管理員發現了問題,要不說不定把程式碼跟蹤到太平洋還不知道問題在哪裡。

去網上下個BoundsCheck6 for VC,原來是大名鼎鼎的Numega公司出的,想能出SoftICE這樣的軟體的公司出的東西還能有假嗎?就比如今天微軟宣佈出了一個新的作業系統,那還不成為各大網站的頭條新聞。所以不僅是衣服,就是軟體也有個品牌效應。

那天在公司又調研了一整天,絕影第一次知道了“純化測試”這個詞。以後每次周總說:“OK,明天我們進行Purification。”絕影就跟大家翻譯道:“好,明天我們進行純化測試,沒裝BoundsCheck的把BoundsCheck裝上,不會用的找我。”

最近幾天BOSS Liu在公司頗為得意,看來醫院對KIREGIS試執行非常滿意,要他修改的地方也很少。KIREGIS的程式碼一直是BOSS Liu在負責,絕影從來沒去看,這也好,世界上最幸福的事情就是你把事情交給別人別人做好了交給你居然和你的要求一模一樣,根本不用改。因為沒什麼事做,BOSS Liu正好潛心研究起C++來。

本來有好多事情都是一樣,會做容易做好難,就說這C++就算你是寫了五六年程式的程式設計師,說函式模板、類模板、純虛擬函式、虛基類這些東西你又用上了多少。BOSS Liu研究了一些這方面東西,再加上KIREGIS在醫院取得了成功,覺得差不多火候已到,絕影也不過爾爾,不過就是彙編好一點嗎?還是那句話,彙編不過100多個指令,有什麼難的。

可絕影總以為他對C++的研究應該僅限於“理論”上。

兩人見了面,BOSS Liu問:“你知道這個XXXX基類的建構函式會被呼叫幾次麼?”

絕影自知肯定回答不上來,在這種情況下最好就不要去回答,BOSS Liu是有備而來故意刁難你,不是帶著請教的,所以就算你僥倖答對了,也並不能讓他對你欽佩的感覺油然而生;要是你答錯了,就正中他的下懷,從此以後凡是有技術上的討論,他總是會拿“你XXXX這個問題都不知道,還說個P呀”來壓你。

這正如魯迅先生說的,一家人生了孩子,你說:“這孩子好呀,以後要當什麼什麼大官有多少多少錢。”那你是騙人的,可人家父母愛聽。你說:“這孩子最後會死。”這是真話,可人家父母不愛聽。怎麼辦,你最好就說:“呵,這孩子……你看……呵……哈哈……”

所以絕影避開問題地重點,也打起哈哈來:“研究C++阿?有什麼好研究的?我告訴你,C++能做到的,用匯編都能做到。彙編能做到,C++還有些做不到哦。”

這是絕影的殺手鐗。首先把問題轉移到彙編上來。這方面他有幾年積累,算是個小行家。再說的確在自定位和精確計算程式碼長度這兩個技術上只有彙編能做到,這是高階語言的死穴。管它什麼語言,他用這兩點都能把它殺了。

OSS Liu很不服氣地說:“我知道你那彙編,在Windows下不過是換成‘invoke’來呼叫API罷了。還能唬我。BOSS Jue,你去各大公司看看。你那玩藝過時了。”

“你懂個P,存在就是合理,懂不?這是哪個大哲學家說的。”

“我知道我知道。可你那玩藝就快連存在的價值都沒有了。我問你,除非你搞病毒,還能有什麼彙編能做高階語言不能做的?”

這又將了絕影一軍,每次他跟別人說:“我嘛,擅長彙編。”就最怕別人問:“你搞病毒的?”別人這樣說,就好像說:“你這人,真長得就像個賊。”所以每次他都不得不跟別人講一大堆什麼彙編不一定搞病毒,除了搞病毒彙編還有什麼什麼用途,還能寫什麼什麼程式。想了半天,絕影實在想不起彙編還有什麼優勢,但沉默下去就是認輸,從此以後,BOSS Liu就可以名正言順在他面前顯擺C++,從此以後自己和組合語言在公司中就再沒有什麼地位。請急之下,他忽然又想起大學時候做過的大數運算庫,終於洋洋得意地說:“誰說沒用了,我曾經把一個C++做的大數運算庫演算法原封不動地翻譯成彙編,算1024位乘法速度居然提高了200倍。我用匯編,可以把大部分運算元都存到暫存器中,可憐的C++阿,還得全部存到記憶體中,做高階運算還是應該在一旁休息去吧。”

說完這話,BOSS Liu沉默了。這是理論論據和事實論據都充分。本來彙編速度快這是毋庸置疑的,再加上絕影有寫好的程式擺在那裡,BOSS Liu從哪裡駁都駁不倒。見他不說話,絕影大模大樣往自己桌子上一坐,心裡嘀咕著:“還跟我比C++,我彙編是通吃。”

大概過了10分鐘,BOSS Liu忽然跳起來大聲說到:“BOSS Jue我差點讓你給忽悠了,剛才忘記了CACHE。現在的CPU都有CACHE,CPU對CACHE的訪問速度和暫存器差不多,C++會把經常使用的變數放CACHE裡面,速度應該和彙編差不多才對。”

絕影本來以為可以穩坐釣魚臺了,沒想到BOSS Liu就是這麼個不見棺材不掉淚的人,聽他這麼說還是有道理,至少從理論上講應該是這樣,這下他又解釋不了實踐上200倍的速度差,現在沒有理論作為依據,就是牽強地去跟BOSS Liu解釋也會把自己在這次爭論中置於非常不利的地位。最後,還是絕影沉默了。

從那次爭論以後,BOSS Liu再也沒給絕影誇過C++的好,也沒再誇自己在C++上的造詣有多深。絕影也沒再在BOSS Liu面前顯擺彙編有多無所不能,自己彙編有多爐火純青。兩人都心知肚明,他們倆水平一般,要是繼續在這語言孰優孰劣上爭論,誰都沒必勝的把握,如果輸了,臉就丟大了。還不如好好再深造幾年,到時再一比高低。

很多年以後,絕影終於想到當初想不出來的問題:組合語言使用暫存器並不是對暫存器訪問比對記憶體訪問更快,而是對暫存器定址比對記憶體定址更快。很多時候他想把這個告訴BOSS Liu,但他終於還是沒告訴他。

一晃兩個月過去,絕影和BOSS Liu去醫院對他們的軟體系統作了兩次例行維護和更新,醫院的規模還算大,登記資料已經有三萬多條,KIREGIS還是經受住了耐力測試。KIPACS經過絕影兩次更新基本上也執行比較穩定。在領工資的時候,周總對絕影說:“XXX醫院的CASE已經驗收合格,這個月給你發500元的獎金。因為這個CASE的收入也不多,就你KIPACS貢獻最大,所以獎金也就你有,對其它的人就不要聲張了。”

本來絕影覺得這麼大的CASE忙了這麼久才500元的獎金周總也真是太扣門了,但聽周總這麼說,絕影還心裡笑著走出了他的辦公室,恨不得立馬當眾大聲宣佈:“知道嗎?XXX醫院專案獎金500元,就我絕影一個人有!”

OSS Liu也進了辦公室。周總還是說:“XXX醫院的CASE已經驗收合格,這個月發給你500元的獎金。因為這個CASE的收入也不多,就你KIREGIS貢獻最大,所以獎金也就你有,對其它的人就不要聲張了。”

當然,BOSS Liu在出來的時候也恨不得力馬當眾大聲宣佈:“知道嗎?XXX醫院專案獎金500元,就我BOSS Liu一個人有!”

大家一個二個領完工資,臉上都喜氣洋洋。公司的電話響了,張廠長積極地搶著去接了電話,說了幾句,回過頭來說:“醫院打來的,找絕影,好像程式有些問題。”

絕影一下傻了。傻的不是程式有些問題,是醫院居然指名點姓要找絕影,而且醫院居然還知道“絕影”的名字,自己麻煩了。