如何提高自身編碼能力--定位bug篇

學(xué)會(huì)定位bug真的很重要

1、定位bug的數(shù)量、種類、級(jí)別越多, 真的真的真的(重要的事三遍)能快速拉升自身編碼水平、對(duì)很多原理的理解和對(duì)編程的認(rèn)知。
2、能提高開(kāi)發(fā)效率很多很多, 避免長(zhǎng)時(shí)間都在解決bug的路上。
3、對(duì)app也是相當(dāng)友好,至少對(duì)自己的app穩(wěn)定性信心大增。

“打怪升級(jí)法則”

?? 本人是個(gè)游戲迷,對(duì)于程序員的成長(zhǎng)歷程,覺(jué)得就像是在玩游戲一樣。 只有不斷的增加經(jīng)驗(yàn),獲得新的裝備,才能提高自身戰(zhàn)斗力, 才能被一些“組織”收納。游戲中有很多途徑可以去增加經(jīng)驗(yàn), 同樣對(duì)于程序員的成長(zhǎng)也會(huì)有很多方式去提高自己的編程能力,這里閑談一下定位bug的方式去提升。

??開(kāi)發(fā)過(guò)程中,會(huì)出現(xiàn)各種bug,產(chǎn)生原因不一。 如果對(duì)每種類型bug都能透析產(chǎn)生的原因和如何避免。 就會(huì)對(duì)各個(gè)開(kāi)發(fā)知識(shí)點(diǎn)都會(huì)有更深刻的見(jiàn)解。所以《打怪升級(jí)法則》最重要的一就是積累各種bug, 只有見(jiàn)多識(shí)廣才能應(yīng)對(duì)自如, 建立自己的bug庫(kù)很重要, 這里會(huì)說(shuō)兩點(diǎn)如何建立自己的bug庫(kù)。

法則一 : 刷自己的副本

??根據(jù)自己開(kāi)發(fā)過(guò)程中所產(chǎn)生的bug, 包括代碼類型bug,策略類型bug,業(yè)務(wù)類型bug。 每個(gè)bug都要尋根問(wèn)祖找到根源, 如果只在半途解決或者屏蔽bug,那么就領(lǐng)會(huì)不了這個(gè)bug的精髓(至少前期積累bug庫(kù)的時(shí)候都要尋根問(wèn)祖,如果后面經(jīng)驗(yàn)豐富能對(duì)bug很熟悉,或者能很優(yōu)雅的屏蔽后可以忽略)

  • 代碼類型bug的產(chǎn)生一般來(lái)源于自己的編碼不夠規(guī)范和嚴(yán)謹(jǐn), 透析此類bug可以提高自己的代碼質(zhì)量和編程能力。

  • 策略類型bug 一般來(lái)源于自身的代碼設(shè)計(jì)有缺陷, 透析此類bug有助提高我們的代碼局部或者全局構(gòu)造能力, 可以為后續(xù)的封裝、組件化、架構(gòu)設(shè)計(jì)思維有很大的幫助。

  • 業(yè)務(wù)類型的bug很明顯來(lái)源于自己對(duì)業(yè)務(wù)流程、需求邏輯的理解或業(yè)務(wù)代碼設(shè)計(jì)不夠嚴(yán)謹(jǐn)產(chǎn)生的bug, 此類bug也是相當(dāng)重要,如果前面兩點(diǎn)說(shuō)的是對(duì)于自身編程能力, 那么這點(diǎn)就是切切實(shí)實(shí)跟業(yè)務(wù)開(kāi)發(fā)有關(guān),也是最常見(jiàn)的bug。 自身編程能力作為基石,只有自己的代碼質(zhì)量提高了才能編寫出優(yōu)雅高效率的代碼。 但如果自己對(duì)業(yè)務(wù)的理解很馬虎很隨意, 即使編程能力再?gòu)?qiáng), 也只能是一個(gè)很普通甚至差勁的程序員。程序員的本職是對(duì)一個(gè)產(chǎn)品賦予頭、手、腳、軀干等等(功能),如果不能制造出健全穩(wěn)定的功能,那么最終的產(chǎn)品可能就會(huì)是一個(gè)殘廢 。 透析此類bug, 對(duì)自己的業(yè)務(wù)能力, 功能分析,方案制定有很大的幫助; 還能獲得部門的認(rèn)可。 業(yè)務(wù)能力,也是公司晉升的重要衡量指標(biāo)。

總之,一個(gè)bug就猶如一個(gè)副本,自己的副本都不刷掉,那升級(jí)就會(huì)很慢; 如果對(duì)于自己的副本只刷掉門口幾個(gè)小兵,中途就離開(kāi),其實(shí)也跟沒(méi)刷一樣。 只有在干掉最終boss, 才會(huì)有成就感,才能拿到本副的裝備, 才能以更高的戰(zhàn)斗力去刷其他副本。 裝備越來(lái)越多,越來(lái)越好,那升級(jí)就是分分鐘的事情。

法則二:跟同事組隊(duì)刷副本

??上面論述的是針對(duì)于自己在開(kāi)發(fā)過(guò)程中遇見(jiàn)的bug, 這類bug實(shí)際上是很局限的, 如果你處于一個(gè)版本迭代流水線式的開(kāi)發(fā)環(huán)境, 每天造輪子、造螺絲, 在開(kāi)發(fā)過(guò)程中遇見(jiàn)的bug會(huì)更有限。除了刷掉自己的副本外, 還要學(xué)會(huì)如何吃掉別人的經(jīng)驗(yàn)。

?? 當(dāng)身邊的同事有問(wèn)題時(shí),這時(shí)候一定要伸出援助之手(xx副本求帶)。 因?yàn)槌鞘菍?shí)習(xí)生,同等水平左右的同事發(fā)出的“求救信號(hào)” , 大部分是自己偶爾遇見(jiàn)過(guò)但卻忘了,或者自己根本不熟悉的bug。 這是一個(gè)增加自己bug庫(kù)的大好機(jī)會(huì),即使是自己熟悉的bug,也別放過(guò), 也許你覺(jué)得會(huì)耽誤自己的時(shí)間, 但很多時(shí)候會(huì)重新刷新你對(duì)上一次bug的認(rèn)識(shí)(也許會(huì)撿到+1的新裝備哦),還能促進(jìn)同事之間的關(guān)系。 如果是全新的bug, 之前自己并沒(méi)有這方面的bug經(jīng)驗(yàn), 那么升級(jí)的時(shí)候就到了, 因?yàn)橥@類副本難度偏大,但boss經(jīng)驗(yàn)多,裝備豪華, 如果你能和同事組隊(duì)干掉,必然會(huì)經(jīng)驗(yàn)大漲。但對(duì)于那些難度太大,耗時(shí)很長(zhǎng)的,也并沒(méi)有要求你就此一直卡在這副本, 你只有50級(jí)的裝備卻想干掉100級(jí)的boss,畢竟那是你同事的bug,他會(huì)尋找資料或者更高級(jí)別的大神來(lái)解決, 此時(shí)只需等待同事的心得就好了。 當(dāng)然如果你有多余的時(shí)間可以慢慢研究,收獲更多。

法則三:吃別人經(jīng)驗(yàn)

??除了自己的bug和同事的bug外, 還有很多bug是我們不熟悉的。 當(dāng)自己的bug庫(kù)有了一定的積累, 定位bug有了一定的經(jīng)驗(yàn)和心得后,可以去逛逛論壇、交流群、博客等,見(jiàn)識(shí)見(jiàn)識(shí)別人的疑難雜癥和解決方案, 這會(huì)有助于提高自己bug定位能力和解決能力。

??如果能有上述或類似的一些習(xí)慣,我相信用不了多久, 你們代碼中的bug會(huì)越來(lái)越少,定位bug也將會(huì)輕車熟路, 個(gè)人能力會(huì)得到很大的提升。

“開(kāi)局一堆bug,裝備全靠刷。 我是渣渣輝,皇城pk,等你來(lái)戰(zhàn)”

定位bug

??上面用了大量的篇幅介紹了定位bug的重要性以及如何建立一個(gè)自己的bug庫(kù),(這里說(shuō)明一下, bug庫(kù)并不是用筆記做成的倉(cāng)庫(kù), 而是對(duì)各種bug理解認(rèn)知之后的集合,如果擔(dān)心被遺忘做筆記也是很好的。) 并沒(méi)有介紹如何去定位一個(gè)bug的根源,與分析bug產(chǎn)生的原因。我相信每一個(gè)程序員都有自己的一套定位bug的方式。 這里簡(jiǎn)單介紹一下以常用思維去分析定位一個(gè)bug,當(dāng)然大神很多,可用以自動(dòng)化的方式去定位項(xiàng)目中的bug,如使用工具、腳本等方式。

猜測(cè)

當(dāng)發(fā)現(xiàn)一個(gè)bug時(shí),首先要做的就是分析猜測(cè)這個(gè)bug會(huì)產(chǎn)生的原因。

  • 一般業(yè)務(wù)類型的bug最容易猜測(cè),如:文案錯(cuò)誤,信息空缺,集合元素缺失,等數(shù)據(jù)不對(duì)的情況。此類bug基本上都是數(shù)據(jù)在最終使用的時(shí)候,并不是自己想要的數(shù)據(jù)。如果能對(duì)自己代碼比較熟悉,那么就能很快的猜測(cè)出數(shù)據(jù)在獲取 - 解析 - 傳輸 - 轉(zhuǎn)換 - 使用 的哪個(gè)環(huán)節(jié)出了問(wèn)題。 如果無(wú)法猜測(cè)數(shù)據(jù)在哪個(gè)環(huán)節(jié)出了問(wèn)題, 排查起來(lái)也相對(duì)簡(jiǎn)單,數(shù)據(jù)的傳輸在代碼中還是很清晰可見(jiàn)的。 只要順藤摸瓜很快就能尋找到出問(wèn)題的地方。 PS: “數(shù)據(jù)驅(qū)動(dòng)編程”, 從數(shù)據(jù)源上規(guī)劃好數(shù)據(jù)結(jié)構(gòu),不僅可以避免掉很多不必要的bug,還能提高開(kāi)發(fā)效率。

  • 其次是策略類型bug,功能映射到的代碼設(shè)計(jì)有缺陷,猜測(cè)此類bug難度會(huì)大一些。 因?yàn)楹芏鄷r(shí)候咋一看以為是業(yè)務(wù)類型的bug。 猜測(cè)此類bug產(chǎn)生的原因,一是需要全局回想下自己的整體設(shè)計(jì)思路,確認(rèn)是否有隱患的地方, 二是根據(jù)bug發(fā)生的場(chǎng)景、時(shí)機(jī),推算猜測(cè)出可能存在的錯(cuò)誤設(shè)計(jì)思路。 如果發(fā)生較大的策略類型bug, 其實(shí)是很不好的,這很可能意味著自己之前的大部分設(shè)計(jì)思路需要調(diào)整,相應(yīng)的很多代碼也需要調(diào)整。 雖然要調(diào)整的地方很多, 但另一方面, 也說(shuō)明了你正在改變, 你重新設(shè)定了一套設(shè)計(jì)思路,你在追求最優(yōu)化,而不是去建立補(bǔ)丁。 PS: 拿到需求后去思考最優(yōu)化方案是很有必要的。

  • 其次是代碼類型的bug, 由于自身編碼規(guī)范不足,埋下一些坑,出現(xiàn)的一些奇葩bug。 要想猜測(cè)出此類bug產(chǎn)生的原因也是最難的, 它很可能跟數(shù)據(jù)關(guān)系不大,跟策略設(shè)計(jì)的影響也不大。 想要猜測(cè)出此類bug發(fā)生的原因, 需要結(jié)合更多的信息, 如 log、場(chǎng)景、時(shí)機(jī)、數(shù)據(jù)等, 加上經(jīng)驗(yàn)和感覺(jué)去推理猜測(cè)出bug產(chǎn)生的原因。 PS: 提高自己的基礎(chǔ)和注意平時(shí)的編碼習(xí)慣,應(yīng)該是每個(gè)猿需要做的事情。

不管是什么類型的bug,當(dāng)bug發(fā)生的時(shí)候,很多時(shí)候我們并不會(huì)知道這個(gè)bug是什么問(wèn)題造成的,所以在猜測(cè)的時(shí)候,需要對(duì)業(yè)務(wù)類型、策略類型、代碼類型的bug結(jié)合進(jìn)行推理猜測(cè)。

定位

??當(dāng)我們大概猜測(cè)出一個(gè)或者多個(gè)可能產(chǎn)生這個(gè)bug的原因后, 我們需要去定位具體產(chǎn)生bug的代碼。由于猜測(cè)環(huán)節(jié)我們已經(jīng)把范圍縮小到了某一區(qū)域。 如何在這個(gè)范圍定位到具體的問(wèn)題代碼? 這里可以提供幾種思路可以參考下, 一是直接瀏覽一下這塊代碼,排查有隱患的地方。 二是模擬數(shù)據(jù)、場(chǎng)景、時(shí)間,確定有問(wèn)題的代碼。 三是折半注釋法,通過(guò)折半注釋能快速的定位到具體代碼。 折半注釋法在很多疑難雜癥bug中更能見(jiàn)到奇效,通過(guò)注釋掉一部分代碼,讓產(chǎn)生bug所處的局部功能運(yùn)行正常, 再放開(kāi)被注釋掉的一半代碼,使運(yùn)行正常,直至找到最終打開(kāi)注釋就會(huì)有問(wèn)題的那塊代碼。 或者反注釋,一個(gè)個(gè)打開(kāi)注釋判斷是否正常,最后留下的將會(huì)是有問(wèn)題的代碼, 此類方法只能做輔助。

驗(yàn)證

驗(yàn)證就很簡(jiǎn)單了,定位到具體問(wèn)題代碼后,我們需要驗(yàn)證各種數(shù)據(jù)、場(chǎng)景、時(shí)機(jī)來(lái)完全確定是這里代碼產(chǎn)生的問(wèn)題。

猜測(cè) - 定位

有些時(shí)候從猜想 - 定位 - 驗(yàn)證, 最后可能會(huì)發(fā)現(xiàn)并不是這里的產(chǎn)生的問(wèn)題, 這時(shí)候需要重新去猜想和定位其他case。

其他方式

定位bug的方式有很多,也根據(jù)具體情況而定,只要積累的夠多, 不管用什么方式去定位都將會(huì)很快, 很多時(shí)候也許一個(gè)感覺(jué)就對(duì)了。 不管是建立bug庫(kù),還是學(xué)會(huì)如何定位bug, 都是一個(gè)持續(xù)的積累過(guò)程,也是一種不可言傳的編程思維,這里只是簡(jiǎn)單的描述大家都懂的道理,只有自己去體會(huì)實(shí)踐才能收獲。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容