你是一個(gè)編寫(xiě)可調(diào)試代碼的程序員嗎?
所有的程序***能夠以某種形式的日志記錄下來(lái),這樣能方便我們即時(shí)知道現(xiàn)在在做什么。而且一旦出現(xiàn)異常,其重要性就愈加明顯了。我們之所以要把程序員分成三六九等,很大一個(gè)原因就是,一個(gè)偉大的程序員會(huì)去寫(xiě)日志和調(diào)試工具,這樣一旦出現(xiàn)問(wèn)題就能調(diào)試程序。
如果程序運(yùn)作正常,那么可能寫(xiě)不寫(xiě)日志沒(méi)啥區(qū)別。但是,不怕一萬(wàn)就怕萬(wàn)一,萬(wàn)一程序崩潰或者出來(lái)一個(gè)錯(cuò)誤的結(jié)果,那么這個(gè)程序員好不好馬上高下立現(xiàn)。
例1:“我們先搞一個(gè)調(diào)試版本吧。”
舉個(gè)例子,測(cè)試人員跑來(lái)告訴我說(shuō)有一個(gè)調(diào)用函數(shù)不工作了。我們先查看了日志,然后發(fā)現(xiàn)原因可能出在相鄰的模塊上。調(diào)用這個(gè)模塊返回的卻是一連串 null 值。當(dāng)我們查閱相鄰模塊的日志記錄并重新運(yùn)行測(cè)試時(shí),卻沒(méi)有獲得任何有用的信息。對(duì)于為什么會(huì)返回 null 毫無(wú)頭緒——不知道是參數(shù)錯(cuò)了,還是外部系統(tǒng)出了故障,亦或是相鄰模塊有 bug,Who knows?
當(dāng)我們?nèi)プ稍冐?fù)責(zé)該段代碼的開(kāi)發(fā)人員時(shí),他們的回答是:“這個(gè)簡(jiǎn)單,我們先搞一個(gè)調(diào)試版本吧。”最終往往還是不行!因?yàn)槲覀兏静恢朗悄睦锍隽藛?wèn)題,出了什么問(wèn)題。而且要是已經(jīng)到了生產(chǎn)階段,增加調(diào)試版本就意味著增加更多額外的工作。代碼的日志里面得包含足夠多的信息,以便于一旦出現(xiàn)問(wèn)題我們可以找到解決的關(guān)鍵所在。
例2:告訴我我們應(yīng)該怎么做
我們產(chǎn)品的一個(gè)作用是為 SMS(短信)找到成本***的途徑并將路徑傳達(dá)給相應(yīng)的手機(jī)。由于當(dāng)前手機(jī)的位置以及用戶所屬的運(yùn)營(yíng)商的不同,理論上存在著很多很多的可能路徑,而且每一條路徑都有一定的成本和相應(yīng)的優(yōu)缺點(diǎn)。此外,還會(huì)有各種意外會(huì)導(dǎo)致不得不禁止某些路徑或者加重某些路徑的權(quán)重。系統(tǒng)通過(guò)給定約束條件,搜索到***的路線然后返回提供給 SMS。
現(xiàn)在,假設(shè)某短信建議使用路徑A發(fā)送,但是我們認(rèn)為路徑B更好,那么路徑A又是怎么被選上的呢?如果沒(méi)有日志資料,光看那可能的成百上千條的線路,看它們的成本和復(fù)雜的算法,我想我會(huì)瘋掉。幸虧日志里給出了之所以選擇路徑A的原因。Thank Godness!
日志里面包含了所有可能的路線,并按成本進(jìn)行排序。哪怕是由于條件限制而淘汰的路線也會(huì)列在日志里,并附上之所以淘汰的原因??傊谌罩纠飼?huì)將如何把所有信息輸入到算法中以得出結(jié)論的各個(gè)步驟描述得一清二楚,以便于我們知道為什么要選擇相應(yīng)路徑。
為什么不愿意寫(xiě)可調(diào)試的代碼?
既然好處大大的,那么為什么不是所有的程序員都愿意寫(xiě)可調(diào)試的代碼呢?原因有三:
1. 得有足夠的自知之明,能認(rèn)識(shí)到萬(wàn)一程序發(fā)生異常的情況。不過(guò)很多程序員往往要經(jīng)過(guò)很長(zhǎng)一段時(shí)間才會(huì)明白“老子并非天下***”。
2. 徹底地測(cè)試代碼才能保證它能在各種場(chǎng)景下都能正常運(yùn)作。而且每個(gè)場(chǎng)景都要寫(xiě)日志。如果不都測(cè)試一下,那你怎么知道哪里需要添加記錄。
3. 很多程序員往往對(duì)自己的代碼做不到精益求精。如果在現(xiàn)場(chǎng)演示的時(shí)候系統(tǒng)出了問(wèn)題,但是在日志里又看不出是為什么,那么***能在日志里加點(diǎn)什么,以防下次再碰到類(lèi)似的情況。
你的代碼是可調(diào)試的嗎?
當(dāng)然也會(huì)有這樣的情況,那就是日志寫(xiě)的很好,但是你還是不知道問(wèn)題的關(guān)鍵原因。這時(shí)候,你可能還是得創(chuàng)建一個(gè)調(diào)試版本。但是你的日志最最起碼得能給出問(wèn)題的線索。
***,請(qǐng)問(wèn)大家,你的代碼是可調(diào)試的嗎?當(dāng)代碼出現(xiàn)問(wèn)題,你的日志能告訴你是怎么回事嗎?
本文鏈接:http://www.cocoachina.com/programmer/20141025/10038.html