【代碼檢查指南】送給面對(duì)BUG的時(shí)候不知所措的你
一直聽(tīng)說(shuō)真正的工業(yè)界,真正的代碼量占用了很少的精力,更多的精力都在其他的環(huán)節(jié)。
50%的精力在討論、展示自己的想法和思路
20%的精力在造輪子、單元測(cè)試
20%的精力在寫(xiě)說(shuō)明文檔
10%的精力在真正寫(xiě)代碼
還有100%的精力在改自己發(fā)現(xiàn)的BUG,自己沒(méi)發(fā)現(xiàn)的BUG,別人發(fā)現(xiàn)的BUG。哎,不對(duì)啊,怎么總精力不是100%而是200%?沒(méi)錯(cuò),這就是程序員為什么需要經(jīng)常加班的原因。
那么,當(dāng)我們?cè)诿鎸?duì)程序出現(xiàn)了我們不能理解的BUG的時(shí)候,應(yīng)該怎么辦?
下面是幾個(gè)準(zhǔn)則,供大家參考。
1. 充分相信代碼和機(jī)器
程序員第一要義,要充分相信代碼和機(jī)器,就像戰(zhàn)士相信自己手上拿的東西一樣。
遇到最多的情況莫過(guò)于:“哎,明明我這樣這樣做了,為什么電腦不按照我的想法來(lái)呢?它總有自己的想法運(yùn)行?!焙敛豢鋸埖恼f(shuō),如果真有電腦可以擁有自己的思想運(yùn)行代碼的,請(qǐng)聯(lián)系我!
正經(jīng)點(diǎn),我們來(lái)看看這個(gè)問(wèn)題所在,我們把整個(gè)過(guò)程分為4個(gè)環(huán)節(jié)。
第一,我們有一個(gè)想法
第二,我們把想法實(shí)現(xiàn)成了代碼
第三,機(jī)器運(yùn)行了實(shí)現(xiàn)的代碼
第四,出現(xiàn)了預(yù)期之外的結(jié)果
現(xiàn)在就我而言,出問(wèn)題的環(huán)節(jié)按照概率大小排序的話:把想法實(shí)現(xiàn)成代碼>我們有一個(gè)想法>出現(xiàn)了預(yù)期之外的結(jié)果>機(jī)器運(yùn)行了實(shí)現(xiàn)的代碼。我優(yōu)先考慮是我們的實(shí)現(xiàn)部分出現(xiàn)了問(wèn)題,然后是我們的想法不正確,人的錯(cuò)誤率是相當(dāng)高的,而機(jī)器出錯(cuò)的概率微乎其微。
以人為本的考慮結(jié)果是:“這一定是機(jī)器出了問(wèn)題,我肯定不會(huì)出問(wèn)題的。什么,機(jī)器給我報(bào)錯(cuò)了,不,一定是機(jī)器錯(cuò)了。我不聽(tīng)解釋,不聽(tīng)!”
機(jī)器可不是人,不會(huì)說(shuō),先點(diǎn)幾下給你提示錯(cuò)誤,然后看你不高興了,再點(diǎn)的時(shí)候錯(cuò)誤沒(méi)了。機(jī)器能自己修復(fù)BUG嗎?顯然不能啊。
當(dāng)然,你說(shuō),會(huì)不會(huì)存在機(jī)器和代碼確實(shí)存在物理性的問(wèn)題。這個(gè)不排除有,但是我們一般人遇到的可能性幾乎為0。所以當(dāng)我們遇到BUG時(shí),應(yīng)該優(yōu)先考慮我們自己的問(wèn)題,然后才能夠解決這個(gè)問(wèn)題。不然,你會(huì)寄希望于機(jī)器自己解決這個(gè)問(wèn)題嗎?

2. 避免燈下黑
一定要仔細(xì)檢查那些你一致忽略的地方,80%的BUG都是我們自己的小失誤造成的,而不是真的邏輯上有問(wèn)題。這些小失誤可能是命名不規(guī)范,重復(fù)賦值,引用不正確,多寫(xiě)了個(gè)符號(hào),參數(shù)忘記傳等等,基本上都是在容易想當(dāng)然的認(rèn)為這個(gè)地方一定會(huì)正確的時(shí)候,恰恰是我們最難以發(fā)現(xiàn)的地方。
3. 問(wèn)題為導(dǎo)向
當(dāng)代碼出現(xiàn)與預(yù)期不符的時(shí)候,一定要先去思考,從邏輯上講,這個(gè)應(yīng)該是什么問(wèn)題,而不是直接就跳躍到代碼上查找。如果不清楚是什么類型的問(wèn)題,當(dāng)你面對(duì)代碼的時(shí)候,就很容易無(wú)從下手。這就像去醫(yī)院看病,醫(yī)生先會(huì)問(wèn)你出現(xiàn)什么癥狀,然后給你一個(gè)大致判斷你這是什么病,病因可能來(lái)源于哪個(gè)部分,然后再根據(jù)需要,進(jìn)行特定部位的檢查和分析。沒(méi)有見(jiàn)過(guò)醫(yī)生等你來(lái)到就先給你說(shuō),做個(gè)全身檢查吧,檢查完咱再看哪里有問(wèn)題。
4. 縮小觀察視野
當(dāng)預(yù)期不符合的時(shí)候,要學(xué)會(huì)倒推,看一下具體是哪個(gè)部分出了問(wèn)題。不要有跳躍思維,一定要聚焦問(wèn)題,才能夠縮小觀察視野,才能夠發(fā)現(xiàn)問(wèn)題所在。要把整個(gè)過(guò)程劃分為具體的若干個(gè)單元,如果在第n個(gè)單元出現(xiàn)了問(wèn)題,先去看它的前置單元第n-1個(gè)單元里哪些部分會(huì)影響這個(gè)出現(xiàn)問(wèn)題的部分。然后再看一下是第n-1單元里哪個(gè)部分出現(xiàn)了問(wèn)題,如果定位后,發(fā)現(xiàn)是第n-2個(gè)單元出了問(wèn)題,依次往前遞推即可。萬(wàn)萬(wàn)不要第n個(gè)單元出了問(wèn)題,就考慮是前面所有單元出了問(wèn)題,甚至斷言是第一個(gè)單元出了問(wèn)題。因?yàn)槊總€(gè)單元間的聯(lián)系可能不止一條兩條,所有出現(xiàn)問(wèn)題的可能性可能早就已經(jīng)超過(guò)了人工檢查的能力。
5. 多看官方手冊(cè)和源代碼
問(wèn)別人雖然能短平快的解決問(wèn)題,但是多看官方手冊(cè)和源代碼才是最終提升自己能力的正途。因?yàn)?strong>官方手冊(cè)是最正式和最正確的指南,從里面可以學(xué)習(xí)到很多精細(xì)化系統(tǒng)化的知識(shí),從而對(duì)于整個(gè)系統(tǒng)有更清晰的認(rèn)識(shí)。而觀看源代碼會(huì)讓你對(duì)于思維到實(shí)踐的映射有一個(gè)直觀的認(rèn)識(shí)。看完源代碼你會(huì)恍然大悟:“哦,原來(lái)這里是這樣實(shí)現(xiàn)的,真巧妙?!?/strong>
你也能夠?qū)W習(xí)到規(guī)范的代碼風(fēng)格以及編程思想,從而完成從觀察者到參與者的轉(zhuǎn)變。最后你就可以舉一反三,真正的將別人的代碼變?yōu)樽约旱拇a了。這就是為什么面試的時(shí)候,別人總喜歡問(wèn),你看過(guò)源代碼嗎?因?yàn)閯e人并不是真的想問(wèn)你源代碼的細(xì)節(jié),而是看你有沒(méi)有這個(gè)習(xí)慣。因?yàn)楣I(yè)開(kāi)發(fā)中,你經(jīng)常需要看別人的代碼。
那么什么時(shí)候是問(wèn)別人更合適呢?
如果問(wèn)題是比較精細(xì)的或者少見(jiàn)的小問(wèn)題,詢問(wèn)有經(jīng)驗(yàn)的人會(huì)更好一些。
如果這個(gè)問(wèn)題不在你的主流技術(shù)棧中,以后大概率也用不到。只是你現(xiàn)在臨時(shí)碰到,但是需要快速解決的時(shí)候。
如果這個(gè)問(wèn)題是比較抽象的,并不能從現(xiàn)有的展示中直接獲得答案的,需要高度凝練和總結(jié)的時(shí)候,可以詢問(wèn)有經(jīng)驗(yàn)的人。
6. 理解編程思想而不是代碼實(shí)現(xiàn)
寫(xiě)代碼本身并不是非常困難的事情,因?yàn)樗谋举|(zhì)就是思維的表達(dá)。就像是在寫(xiě)英語(yǔ)作文一樣。我們寫(xiě)英語(yǔ)作文難在哪?為什么寫(xiě)漢語(yǔ)作文就容易很多?我們不知道要說(shuō)什么,通常英語(yǔ)作文沒(méi)有抒情文,也很少有記敘文,都是議論文為主。只要想好論點(diǎn)、論據(jù),構(gòu)思一下說(shuō)明思路,只要單詞過(guò)關(guān),英語(yǔ)作文要比漢語(yǔ)作文容易。
寫(xiě)代碼也是一樣,只要記住某種語(yǔ)言的語(yǔ)法,本質(zhì)還是要實(shí)現(xiàn)某些功能的思路和想法是什么。在計(jì)算機(jī)里,這個(gè)就是算法的一種體現(xiàn)。算法不僅僅是實(shí)現(xiàn)某種特定功能的一串代碼集合,而且也是解決某一類問(wèn)題的特定方法,顯然學(xué)會(huì)后一種的思維方式比形而上的死記硬背一行行代碼更加重要。

總結(jié)
以上都是在日常調(diào)整BUG時(shí)遇到的一些小技巧,希望能夠幫助你更好的學(xué)習(xí)和工作。
