40歲程序員談修bug的心態(tài)問(wèn)題
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
筆者是一個(gè)老碼農(nóng),早已年逾 40,目前仍然奮戰(zhàn)在一線寫(xiě)代碼、修 bug,并沒(méi)有出現(xiàn)傳說(shuō)中的 35 歲危機(jī)。工作這么多年,方方面面的 bug 也接觸了不少,想作為一個(gè)老碼農(nóng)分享關(guān)于修 bug 的心態(tài)問(wèn)題。 首先作為一個(gè)程序員,只要是寫(xiě)代碼,肯定是會(huì)產(chǎn)生 bug,除非這個(gè)人不寫(xiě)代碼。所以,這一個(gè)基本的常識(shí)我們得心平氣和的接受。要是有個(gè)人吹牛說(shuō)自己寫(xiě)的代碼沒(méi) bug,那一定是個(gè)騙子或者自大狂。但是這并不等于 bug 越多,就越牛逼,我們?cè)诰幊痰臅r(shí)候,肯定是要采取各種手段避免 bug 的發(fā)生。比如尤其要注意: 1、多線程、多進(jìn)程并發(fā)訪問(wèn)風(fēng)險(xiǎn); 2、邊界條件處理; 3、遺漏的分支處理等防御性編程的基本思想。 在修復(fù) bug 過(guò)程中,最重要的一個(gè)心態(tài)就是要切莫急躁,急躁是修復(fù)不了 bug 的。有的同學(xué),領(lǐng)導(dǎo)進(jìn)度催促的緊,他就東改一行,西改一行,企圖碰運(yùn)氣把這個(gè) bug 修掉。筆者工作這么多年,基本從來(lái)沒(méi)碰到過(guò)這樣的運(yùn)氣。 代碼是這個(gè)世界最符合邏輯的東西,反邏輯的運(yùn)氣是不會(huì)出現(xiàn)的。越是難修的 bug,越是進(jìn)度緊張的 bug,越是要心態(tài)平靜。反復(fù)復(fù)盤(pán)代碼邏輯,復(fù)盤(pán)自身的模塊與其他模塊的關(guān)系,復(fù)盤(pán)全局的多線程數(shù)據(jù)訪問(wèn)、時(shí)序邏輯。簡(jiǎn)單來(lái)說(shuō),對(duì)自身關(guān)注的代碼以及你的代碼與其他代碼的邏輯關(guān)系梳理地越清楚,修復(fù)這個(gè) bug 越成為可能。所以實(shí)在沒(méi)思路了,怎么辦?復(fù)盤(pán)邏輯!繼續(xù)沒(méi)思路了,怎么辦?復(fù)盤(pán)邏輯。 我印象比較深刻的,之前在修復(fù) wayland 的 client UI 和 server weston 之間通信的邏輯時(shí),crash 的是 Qt App,但是實(shí)際的問(wèn)題是出在 weston 和 app 之間通信的 wayland message 時(shí)序上,這個(gè)時(shí)候唯一的辦法,就是理清 wayland 的協(xié)議,什么時(shí)候 client 和 server 應(yīng)該發(fā)什么樣的消息,什么樣的消息導(dǎo)致窗口的 destroy 等,只能靜下來(lái)來(lái),反復(fù)分析。一條條看捕獲的 client 和 server 之間的 wayland socket 消息,對(duì)照協(xié)議分析 client 和 server 進(jìn)程之間的時(shí)序是否紊亂了。沒(méi)有其他的辦法。 退一萬(wàn)步講,哪怕一個(gè)人真地瞎試把 bug 僥幸“修復(fù)”了,對(duì)個(gè)人的成長(zhǎng)又有什么幫助呢?我們提煉了什么規(guī)律呢?理清了什么邏輯呢?自己能說(shuō)的清楚為啥修復(fù)了嗎?這樣的蠻干是不會(huì)成長(zhǎng)的。 在修復(fù) bug 的過(guò)程中,不妨嘗試 refresh 一下自己的大腦。有時(shí)候腦袋麻了,思路就會(huì)短路了。不如出去呼吸五分鐘新鮮空氣,看似浪費(fèi)了五分鐘,實(shí)則很可能在這五分鐘里面,獲得了一個(gè)思路。我個(gè)人經(jīng)常碰到的情況是,在電腦面前坐麻了,心情也比較焦急,因?yàn)榧敝?bug 啊。但是,娃放學(xué)到點(diǎn)了,我不得不出去接個(gè)娃,十來(lái)分鐘路上,我發(fā)現(xiàn)這個(gè) bug 我回來(lái)就可以修復(fù)了。所以,有時(shí)候,慢就是快。看似浪費(fèi)了十分鐘接娃,實(shí)則這十分鐘的新鮮空氣清醒了大腦,所以修復(fù)這個(gè) bug 的貢獻(xiàn)可能得算到娃的頭上。 寫(xiě)代碼的時(shí)候,不妨多加一些斷言/BUG_ON 之類(lèi),在不確定的位置,留下一下打印。代碼的世界充滿了神奇,你覺(jué)得走到某個(gè)位置的時(shí)候,a 必然是等于 1 了,但是代碼跑起來(lái)偏偏就等于 2。為啥呢?因?yàn)槭谴a就有 bug 啊,是 bug讓它不等于 1 的。那么我們可以嘗試加一個(gè) BUG_ON(a!=1)。任何的 bug,都是出現(xiàn)地位置越早,越好修的。BUG 遵循“早死早超生”的規(guī)律,如果你在 a 處犯錯(cuò)了,死在了 b 處、c 處、d 處,顯然你比較難追溯到 a 處,但是如果你在 a 處就提前偵測(cè)到了潛在的問(wèn)題,則主動(dòng)降低了修復(fù)這個(gè) bug 的難度。尤其是產(chǎn)品上線后,甚至?xí)霈F(xiàn)實(shí)驗(yàn)室反復(fù)測(cè)試都無(wú)法復(fù)現(xiàn)的 bug,這些異常點(diǎn)增加的 BUG_ON、打印之類(lèi),都可以幫忙提示修復(fù)的方向。 修復(fù) bug,需要建立業(yè)務(wù)領(lǐng)域知識(shí)的廣度和深度。作為一個(gè) Linux 內(nèi)核工程師,比如改了內(nèi)存管理、page fault、swap 等的代碼,看似僅改了一個(gè)模塊的很少一部分代碼,但是由于這個(gè)代碼太底層,它可能和很多其他的內(nèi)核組件比如調(diào)度、文件系統(tǒng)、VFS、page cache 等都有千絲萬(wàn)縷的聯(lián)系,這個(gè)時(shí)候,沒(méi)有對(duì)內(nèi)核的廣度和深度的理解,是很難修復(fù) bug 的。所以,我們千萬(wàn)不要小看了修復(fù) bug 這個(gè)事情本身,同樣的 bug 有的人弄一個(gè)月都不知所措,有的人兩天就解決了。你覺(jué)得差的這 28 天原因是啥?無(wú)他,懂還是不懂業(yè)務(wù)知識(shí),而不是編程語(yǔ)言本身。 所以,對(duì) C、C++、Java 等語(yǔ)言的掌握度是絕對(duì)拉不開(kāi)程序員距離的,能拉開(kāi)程序員距離的是對(duì)編程語(yǔ)言施加的業(yè)務(wù)的掌握度。語(yǔ)言是個(gè)最基本的東西,你比如每個(gè)美國(guó)人都會(huì)說(shuō)英語(yǔ),但是每個(gè)美國(guó)人的業(yè)務(wù)水平都不一樣,有人 0 元購(gòu),有人喬布斯。作為一個(gè)程序員,你能拿出來(lái)炫耀說(shuō)自己 C 語(yǔ)言爐火純青嗎?這個(gè)沒(méi)用的,就跟一個(gè)美國(guó)人說(shuō)自己英語(yǔ)說(shuō)的好一個(gè)道理,沒(méi)意義。 該文章在 2023/3/8 9:04:46 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |