在軟件行業(yè)中,個人覺得每個Coder、Leader(那些當了Leader以后就不需要Code的除外)都應該除了具有良好的編碼能力以外,最為主要的就是Debug的能力要堅實。千萬不要告訴我Debug工作是Tester和QA的事情,首先你要認識到Debug的能力是一個并不簡單的能力,能幫助你提高你的開發(fā)能力,加快開發(fā)速度,節(jié)約開發(fā)成本;其次你更應該知道,你所掌握的Debug的能力和技術并不可能搶去Tester或者QA的飯碗,他們做的工作更仔細、全面,更富有創(chuàng)造力。由于本人數(shù)年來一直使用VC6,所以下面使用的觀點和相關的描述都是從VC出發(fā)的,肯定有所偏頗、錯誤之處,還望各位看官不吝嗇地指出,本人定虛心接受,共同討論,共同學習,共同進步。個人覺得Debug能力包括以下三個個方面:
1、良好的編碼習慣,良好的邏輯結(jié)構能力,對Bug的預見能力。一個成熟的程序員,應該有一個良好的編程習慣,不僅需要有良好的編碼格式規(guī)范,更為需要的是對于程序中的邏輯實現(xiàn)時候有一種良好的結(jié)構。編程其實就是數(shù)據(jù)和邏輯的集合,數(shù)據(jù)的處理較為簡單,或者說是需要的邏輯思維能力比較少,當算法邏輯要在數(shù)據(jù)上實現(xiàn)的時候,同一種邏輯,讓不同的程序員來實現(xiàn)可能有各種各樣的不同實現(xiàn)結(jié)構,從這個角度來說,這里所說的“良好的編碼習慣”就應該指的是對于邏輯實現(xiàn)時候使用的良好的編程結(jié)構,一個好的編程結(jié)構應該是能預防錯誤的發(fā)生,對錯誤的預見和錯誤出現(xiàn)以后的錯誤處理與異常處理的良好安排。也許有人說這不好辦嗎?每個邏輯判斷的地方添加條件判斷或者異常處理不就行了?個人覺得不是那么回事,過多的if、assert、ASSERT等語句或者是宏,尤其是并列的if語句需要耗費很多判斷、執(zhí)行的時間,對于一個子程序(函數(shù)),尤其是調(diào)用頻率比較頻繁的子程序(函數(shù)),一次浪費了一點點時間,多次、頻繁地調(diào)用浪費的時候就顯得可觀了,所以并不是if語句使用的多,程序出錯的可能性就小,過猶不及!如果確實需要使用多個if語句進行條件判斷,最好能使用嵌套的if語句,逐步的縮小判斷范圍,這樣消耗的時間要比并列的if語句要小,還要注意的是if語句的條件判斷也不是萬能的;assert、ASSERT等判斷宏也不是萬能的,它會造成Debug和Release版本在響應速度和最終的編譯結(jié)果的不同,對于一些關注于性能、響應速度的程序,所造成的影響是不可忽視的。不過開發(fā)過程中的調(diào)試階段倒是提倡使用這些宏來發(fā)現(xiàn)算法錯誤和不足。另外對于異常處理段的使用,個人覺得能不用異常處理的地方盡量不要使用異常處理,除非當某個錯誤發(fā)生以后導致程序不能繼續(xù)執(zhí)行或者是崩潰的時候才使用異常,有時候你能使用異常處理,將發(fā)生錯誤的程序繼續(xù)執(zhí)行下去,但是可能產(chǎn)生的最后結(jié)果并不是客戶所需要或者是期望的,這樣就容易讓客戶產(chǎn)生質(zhì)疑:你是不是在程序中做了什么手腳?這也讓你失去了獲得Bug發(fā)生的前提狀況信息,從而失去了一次修改Bug的機會,所以說有時候當程序發(fā)生錯誤時,僅僅彈出一個MessageBox提示一些信息,然后關閉程序,也不失為一個好的辦法。
2、編碼過程中的調(diào)試跟蹤和錯誤定位能力。這個能力主要就是在開發(fā)過程中,當自己在Build程序,Run起來以后,竟然發(fā)生了Bug或者是Memory Leak,這時候就需要你使用各種工具進行調(diào)試跟蹤了。首先你要相信VC不僅是一個很好的IDE,也是一個很好的Debug工具,其提供的調(diào)用棧、條件斷點、數(shù)據(jù)斷點、反匯編等工具足夠強大,足夠應付平常的Bug,但是現(xiàn)在很多的程序員,包括一些自稱為老程序員的也未必能很好的使用這些工具,尤其是條件斷點和數(shù)據(jù)斷點(在下面介紹的第二本書中有詳細的使用說明)。當VC不能滿足你的要求的時候你就需要使用其他的工具了,例如:SmartChecker,BoundChecker,Purify,SoftICE等等了。從這個角度來說,這里的“調(diào)試跟蹤能力”不僅是程序員對Bug的定位能力,更為主要的還是對于調(diào)試工具的掌握、使用的能力。“磨刀不誤砍柴工”,在開發(fā)之前或者開發(fā)閑暇時,好好的研究一下一些開發(fā)、調(diào)試工具不愧為一種好的提升這種能力的好辦法。能靜下心來思考一下這些工具的工作原理就更好了,這樣不僅能幫助你在編程的時候預見Bug,并且對你提高你的編程技巧也會有所幫助。例如VC中的程序在Debug模式下為什么能發(fā)現(xiàn)數(shù)組訪問越界?這是因為在Debug模式下,在分配數(shù)組所占用的內(nèi)存時候,編譯器在數(shù)組內(nèi)存的兩端分別加入了一個字節(jié)的越界判斷內(nèi)存。這也就是為什么很多的MFC程序在使用自定義消息的時候在Debug模式下沒有錯誤而在Release模式下發(fā)生錯誤的原因了。這里我還想說一說我最喜歡做的兩種調(diào)試方法:當Bug出現(xiàn)的時候,首先確定Bug的位置,然后:A、注釋掉可能導致Bug的段落,在需要取得數(shù)據(jù)值的地方直接提供一個合理的值,然后看看程序是否能正確運行,如此循環(huán)往復,逐步縮小范圍,最終找出Bug所在;B、如果Bug被定位在一個小的功能、子程序或者函數(shù)中,可以使用新建一個Test工程,在一個完全“干凈”的環(huán)境下,對此功能、子程序或者函數(shù)進行測試,找出Bug所在。此節(jié)最后我想說的就是利用你的網(wǎng)絡。當一個Bug出現(xiàn)時,你也許感到茫然,也許感到無從下手,這時候你就可以利用的你網(wǎng)絡資源,使用強大的搜索引擎(比如Google、Baidu等等),輸入相關的錯誤提示信息,也許搜索到類似問題的網(wǎng)頁,也許別人也遇到過同樣或者同類的問題,其他人所提供的答案就是你所需要的,或者能給你以提示、啟發(fā)的!
3、對事后發(fā)生的Bug能有良好的感知能力。當一個Bug出現(xiàn)的時候,優(yōu)秀的程序員能根據(jù)Bug發(fā)生的前提和Bug發(fā)生的時間點、程序中的位置,很好的感知到Bug可能發(fā)生在哪一個函數(shù)或者哪幾個函數(shù)中,是什么情況導致Bug的出現(xiàn)的,并且能夠很快的定位錯誤并Fix這個錯誤。這種能力使用的地方往往是程序已經(jīng)Release了,已經(jīng)被客戶使用了,在使用的過程中發(fā)生了Bug,客戶向你“傾訴”時。那么怎么才能有這樣的能力呢?也許很多的這種能力都是在你不斷的摔倒,被經(jīng)理P了N次以后,所積累起來的經(jīng)驗,所以說這也是一種痛苦以后所獲得的快樂的能力,它需要你對自己所做的軟件產(chǎn)品的結(jié)構、運行條件、運行原理和相關的涉及部分有很好的理解、掌握。有的時候多在網(wǎng)站上看看別人的經(jīng)歷也能有所收獲。
在以上的三種能力中,第一種能力主要在于態(tài)度和思維能力,后兩種則偏向于學習能力和經(jīng)驗的積累;個人覺得第一種最為重要,所謂的“態(tài)度決定一切”嘛,呵呵。
最后向你推薦幾本關于調(diào)試的書籍:
1、《Writing Clean Code——Microsoft Techniques for Developing Bug-free C Programs》(中文版譯作《編程精粹——Microsoft編寫優(yōu)質(zhì)無錯C程序秘訣》或者叫做《零錯誤程序》)——這是一本出版很早的書,現(xiàn)在也許在書店中都看不到了,但是你要相信此書的作者Steve Maguire(曾是Microsoft資深的程序員,參加了Excel在多個平臺下的開發(fā)和移植工作)所提供的許多防錯、排錯、測試的準則還是能讓人從中獲益非淺的。作者將每章的要點都和自己實際工作經(jīng)歷相結(jié)合,提供了翔實的例子和相關代碼,使用的語言更是幽默風趣,讓人讀起來不會感覺晦澀難懂,尤其是每章結(jié)束部分提供的練習和思考題更是貼合實際,發(fā)人深省。也就是這些原因才使得這本書經(jīng)久不衰,一直為廣大程序所喜愛,所廣泛地討論。至今尚未能見到能與之相媲美的書籍。網(wǎng)上所流傳的林銳博士所著的《高質(zhì)量C++編程指南》和《軟件工程思想》在深度和廣度上與之相比也顯得遜色不少!
2、《Debugging Windows Programs》(中文版譯作《Windows程序調(diào)試》,中國電力出版社出版)——這是一本現(xiàn)在在書店很為流行的一本書。此書使用的語言比較樸實、易懂,也許是譯者精心處理的結(jié)果,敘述習慣比較符合國人口味。這本書主要包含調(diào)試策略、調(diào)試工具、調(diào)試技術三部分,本書主要介紹的是在VC這個IDE、編譯器下開發(fā)程序所應有的一些技術??赐甏藭憧隙〞鼮樯钊氲牧私?/span>MFC,了解結(jié)構化異常和C++異常的區(qū)別和聯(lián)系,了解怎么調(diào)試多線程程序,怎么調(diào)試COM程序,怎么調(diào)試內(nèi)存,怎么調(diào)試繪圖程序等等。不管你是自認為有多年的開發(fā)經(jīng)驗的開發(fā)高手,還是剛剛?cè)腴T的初學者,相信只要你耐心的看完此書,你一定會和我一樣深深的感嘆一句:原來VC的調(diào)試功能這么強大!如果早點看到這本書就好了!
3、《Debugging Applications》(本人尚未見到中文版)——這本書主要介紹的是VC和VB的調(diào)試,其中VC的調(diào)試占到70%-80%左右。本書也分為三部分:Debug的形式,強有力的Debug,Debug的工具和技術。其中有部分內(nèi)容和上一本書所說的相同。但是這本書還是提供了很多新的東西:介紹了遠程調(diào)試,提供了一些新的工具使用例子的說明,介紹了更多的底層的東西,甚至涉及匯編的相關信息的閱讀和理解。在閱讀了上一本書以后,如果你還想提高,這本書是你不錯的選擇。
第一本書主要就是培養(yǎng)大家第一種Debug能力的,后兩本書是培養(yǎng)大家第二種Debug能力的,對于第三種能力主要還是要靠經(jīng)驗的積累。
我現(xiàn)在就看到這三本書是比較好的書,如果你覺得有其他的比較好的相關書籍或者相關信息請告知我。在肯定這幾本書對你的開發(fā)過程會有所幫助的前提下,另外我想說的就是即使你看了這幾本書你也不會編寫出完全沒有Bug的程序,畢竟Bug的種類和發(fā)生的情況實在是有很多的客觀和主觀因素,不可能完全杜絕。程序設計是一門實踐性很強的工作,唯有在工作、實踐過程中總結(jié)教訓,總結(jié)經(jīng)驗才能不斷提高。祝大家在獲得知識,積累經(jīng)驗的過程中少走彎路,大踏步的前進?。。?/span>
(本文版權歸作者所有,如需轉(zhuǎn)載請注明作者和出處,否則也可以轉(zhuǎn)載,但千萬不要標注為你個人的作品,否則產(chǎn)生的一切后果請自負,尤其是被BS、被扔臭雞蛋的時候,千萬不要怨恨我,同時作者我還保留BS你的權利,^_^)