http://blog.gkong.com/more.asp?name=linkman&id=27854
我不知道,自己現(xiàn)在還算不算一個程序員。如果還算程序員的話,我肯定不是那種絕頂聰明的程序員。
我不是一個聰明的程序員,不能在鍵盤上手指翻飛,靈光似劍,一日千行,閉目成章。大師的高度,遠(yuǎn)非我能指望,我會犯很多錯誤,只是一個普通的程序員。
所以,對于編程,我是一個悲觀主義者。
我不相信,所編寫的程序能夠一次編譯通過;也不相信,能在家里將程序的所有錯誤都找出,而不需要出差現(xiàn)場;更不相信,我的程序能夠在不同的環(huán)境下,對各種異常,都處理得非常完美;尤不相信,我的程序沒有任何內(nèi)存丟失,可以連續(xù)運(yùn)行一周。
我本來不是一個悲觀主義者,曾經(jīng)的我,是那么激揚(yáng)那么狂妄,只是一次次被打擊,讓我越來越務(wù)實(shí),越來越冷靜,越來越清醒地看待自己。隨著歲月的增長,我編程的次數(shù)已越來越少,但是,我的悲觀主義思想?yún)s越來越濃。
一打開程序,我便想到,因?yàn)檐浖鲥e,而不得不給用戶寫檢討;便想到,因?yàn)槊吭滤罊C(jī)一次,客戶對我大發(fā)雷霆;便想到,因?yàn)楫a(chǎn)品質(zhì)量問題,而陪客戶喝酒,連飲七大瓶啤酒。
那七瓶要命的啤酒,依然不能讓客戶回心轉(zhuǎn)意,于是,我成了一個悲觀程序員。
我是悲觀主義程序員,好在還有五件武器。
第一件武器:斷言(ASSERT);
我希望,任何調(diào)用我的模塊的程序,都能按照希望的參數(shù)格式和調(diào)用方法,正確地調(diào)用我的模塊。因此,在我所編寫的每一個模塊內(nèi),都會大量地使用斷言(ASSERT),在模塊中加上了斷言,我便相信,程序模塊有了一個一個相對真實(shí)的調(diào)用環(huán)意,便有了一種虛幻的安全感。
第二件武器:靜態(tài)代碼檢測工具,如PC-lint,有時也使用編譯器的最嚴(yán)格的編譯級別;
我從不認(rèn)為,自己是一個對C/C++/VC等,都非常熟悉的程序員,經(jīng)常會不小心使用一些不正常的語法,或是不太考慮字段的邊界,因此,在程序編到一定的階段,都會采用pc-lint,對我所編寫的程序,進(jìn)行嚴(yán)格的編譯檢查。
第三件武器:動態(tài)代碼檢測工具,如boundcheck;
對于C/C++程序員而言,最大的痛苦就是內(nèi)存泄漏,或其它資源泄漏了,我對內(nèi)存泄漏有天生的恐懼,也經(jīng)常在內(nèi)存丟失方面犯錯誤,因此,在產(chǎn)品發(fā)布給用戶前,一定會采用動態(tài)代碼檢測工具,進(jìn)行一次徹底的測試。
第四件武器:單元測試工具,如cppunit;
我沒有足夠的自信,認(rèn)為自己能夠很好地駕馭多個模塊的大型程序,也不相信自己寫過的、超過50行的程序會沒有問題,因此,我會盡量引入單元測試,對每一個重要的函數(shù)或模塊進(jìn)行地毯式單元測試,當(dāng)看到那一遍測試通過的綠色,才能夠安心地回家睡覺。
第五件武器:調(diào)試信息;
我相信,我所編寫的所有程序,都不可能一次成功,即便再認(rèn)真地調(diào)試檢查,再多地廠內(nèi)工作,在現(xiàn)場還是免不了會出問題。因?yàn)椋豢赡茉诩依锬M現(xiàn)場所有的情況,也不能夠?qū)Ω鞣N異常情況進(jìn)行完整地猜測。因此,在我所編寫的很多程序中,特別是與監(jiān)控有關(guān)的、需要長期、連續(xù)運(yùn)行的程序,都會加上盡可能多的調(diào)試信息。
在程序中加上調(diào)試信息,是我最后的稻草,有了它,我終于敢將產(chǎn)品戰(zhàn)戰(zhàn)兢兢地交給客戶。
那么,調(diào)試信息應(yīng)該記錄哪些內(nèi)容?我想說的是,調(diào)試信息應(yīng)該能夠記錄現(xiàn)場所有的信息,包括:
程序的啟停狀態(tài);
調(diào)用它人程序的邊界參數(shù);
被它人調(diào)用的程序的邊界參數(shù);
與外部環(huán)境的邊界,包括操作系統(tǒng)、文件系統(tǒng)、硬件、數(shù)據(jù)庫等;
與網(wǎng)絡(luò)交互的兩端邊界;
重要模塊的被調(diào)用參數(shù);
模塊內(nèi)的重要過程的當(dāng)前參數(shù);
有了這些調(diào)試信息,我便可以不出差了,當(dāng)現(xiàn)場發(fā)生了事情時,我的第一反應(yīng)便是要求查看這些調(diào)試信息。
今天一位朋友問我,你如何保證你的程序能夠穩(wěn)定,我告訴他:我有五件武器。
寶刀配英雄,現(xiàn)在我已很少編寫程序了,這些武器,就送給戰(zhàn)斗在第一線的程序員吧,也許你們現(xiàn)在不覺得它們有多重要,但總有一天,你們會自覺地將它們帶在身邊的。