優(yōu)秀程序員寫可調(diào)試的代碼
所有的程序都需要某種形式的日志記錄建立在它們之上,以便我們可以觀察到它正在做什么。這尤其在程序出錯(cuò)時(shí)就顯得非常重要。一個(gè)優(yōu)秀的程序員和一個(gè)糟糕的程序員之間的一個(gè)不同之處是一個(gè)優(yōu)秀的程序員會(huì)增加日志或其他工具以便在程序失敗時(shí)方便調(diào)試。
當(dāng)程序如同預(yù)期的一樣工作時(shí),有日志和沒日志往往沒什么差異。然而,一旦程序失敗,或你得到一個(gè)錯(cuò)誤的結(jié)果的時(shí)候,你會(huì)立即明白優(yōu)秀的程序員和糟糕的程序員之間的差別。
例1:“讓我們做一個(gè)可調(diào)試的版本”
比如說,測試關(guān)于一個(gè)不能正常工作的調(diào)用case過來找我。我們查看了日志,然后發(fā)現(xiàn)問題貌似出在一個(gè)相鄰的模塊。對其他模塊的調(diào)用返回值為 空。然后我們在那個(gè)相鄰的模塊中做了日志記錄,重新跑了一遍測試case,卻沒有得到任何更多的有用信息。沒有任何線索表明為什么會(huì)返回空 -難道是我們下錯(cuò)了參數(shù),或者是某個(gè)外部系統(tǒng)導(dǎo)致的失敗,那個(gè)相鄰的模塊中是不是存在一個(gè)錯(cuò)誤,又或者?
當(dāng)我們?nèi)ピ儐栘?fù)責(zé)這塊代碼的開發(fā)人員時(shí),我們得到的回答是:“Oh,我們必須做一個(gè)debug的版本來看看到底發(fā)生了什么”。失??!從某種意義 來說,從日志中找到問題所在應(yīng)該是可能的,如果問題存在一個(gè)運(yùn)行的系統(tǒng)中,添加一個(gè)調(diào)試版本將會(huì)有大量的工作要做。代碼需要包含足夠多的信息在日志,以便你至少可以對失敗的原因有一些了解。
例2:“讓我看看我們是如何走到這里的” ??
我們的一個(gè)產(chǎn)品在工作時(shí)會(huì)找到一個(gè)短信息傳遞到手機(jī)***的路徑。依據(jù)手機(jī)的當(dāng)前位置和目標(biāo)用戶所屬的運(yùn)營商,有很多可能的路由選擇, 每一個(gè)都有一個(gè)給定的成本和其他特征。除此之外,可以有一些例外,比如說禁止一些路線,以促進(jìn)其他路線,通常 會(huì)有成千上萬的路由被定義,在每個(gè)case中系統(tǒng)找到***的一個(gè)路由,加上限定條件,并且傳遞消息。
現(xiàn)在,假想某個(gè)SMS信息使用A路線傳遞,但是我們認(rèn)為他應(yīng)該使用B,為什么A會(huì)被選擇呢?如果沒有任何日志記錄信息,我們只剩下成百個(gè)可能的途徑, 他們的成本,例外,以及一個(gè)復(fù)雜的算法,那么祝你好運(yùn)搞清楚為什么A會(huì)被選擇。
在我們的實(shí)現(xiàn)中,所有可能存在的路由以成本大小的順序羅列在日志中,當(dāng)路由被不同的限制條件排除時(shí),排除掉的路由和原因就會(huì)被列在log中。 隨著算法的輸入,以及采取的步驟信信息列在log中,就會(huì)很容易的看出為什么某個(gè)路徑會(huì)被選取。
為什么不呢?
所以,為什么不是所有的程序員都會(huì)寫可調(diào)式的代碼呢?我能想到三個(gè)原因:
1.你必須足夠謙虛的意識(shí)到你的代碼會(huì)有不按預(yù)期工作的時(shí)候。我相信很多程序員會(huì)對此比較難過。
2.如果你徹底地測試了你的代碼,你應(yīng)該確保它會(huì)在很多不同場合工作或失敗。對于每個(gè)方案,很自然地加入日志記錄,如果你沒有測試 那些情況,你不太可能會(huì)在那里添加記錄。
3.很多程序員往往不會(huì)在產(chǎn)品系統(tǒng)中修復(fù)他們自己的代碼。如果在在線系統(tǒng)中有一個(gè)問題,但log并沒有反饋任何信息給你為什么這里會(huì)有一個(gè)問題, 你會(huì)有一個(gè)很強(qiáng)烈的動(dòng)機(jī)去增加log,以便下次遇到相同的情況時(shí)幫助到你。
你的代碼可調(diào)試嗎?
當(dāng)然會(huì)有一些情況,對于程序?yàn)槭裁磿?huì)失敗好的日志信息也不能給你一個(gè)確切的信息。你可能還是要做出那樣的調(diào)試版本, 但是你經(jīng)常做記錄至少還是會(huì)提供給你一些隱藏信息關(guān)于問題的可能性。
所以,你準(zhǔn)備的怎么樣了?當(dāng)你的程序失敗時(shí),log會(huì)告訴你哪兒出錯(cuò)了嗎?
原文鏈接: henrikwarne 翻譯: 伯樂在線 - hahakaka