每日一遍,BUG再見(jiàn)硬毕!程序員bug修復(fù)寶典重現(xiàn)天日呻引!

前言

bug,又名程序缺陷或者程序漏洞吐咳,是每個(gè)程序員每天都回避不了的東西苞七。程序員對(duì)bug的感情可謂是五味雜陳:一方面bug非常可惡挪丢,尤其是一些偶現(xiàn)的bug蹂风,它強(qiáng)大到可以摧毀一個(gè)優(yōu)秀程序員的意志;另一方面很多bug又是程序員自己親手寫(xiě)下的乾蓬,無(wú)奈之余只能自嘲一句:不寫(xiě)bug我們就要失業(yè)了惠啄!

作為一名職業(yè)程序員,同時(shí)也是一名開(kāi)源創(chuàng)作者, 夸張點(diǎn)說(shuō)任内,我解過(guò)的bug可以繞地球一圈, 每天寫(xiě)bug解bug幾乎是我的日常撵渡。

但是,作為一個(gè)善于思考和總結(jié)的技術(shù)博主死嗦,我怎么能止步于每天寫(xiě)bug和解bug呢趋距?更何況,人生在世越除,總得有點(diǎn)追求节腐。既然我不能夠阻止bug的產(chǎn)生,那么就讓我總結(jié)一點(diǎn)bug的修復(fù)技巧摘盆,讓bug消失地更快點(diǎn)吧翼雀!

1.bug修復(fù)的生命周期

中醫(yī)講究"望聞問(wèn)切",其實(shí)修復(fù)一個(gè)bug就像給病人看一場(chǎng)病孩擂,本質(zhì)上是相通的狼渊。

當(dāng)我們遇到一個(gè)bug(問(wèn)題)的時(shí)候,一般我們需要經(jīng)歷如下6個(gè)步驟:

  • 1.了解bug类垦。我們首先需要到底出了什么bug狈邑,現(xiàn)象是什么,怎樣發(fā)生的蚤认。
  • 2.復(fù)現(xiàn)bug米苹。在了解了bug的大致情況之后,我們需要能夠找到復(fù)現(xiàn)的路徑烙懦,這就為后面bug的定位提供可靠的依據(jù)驱入。
  • 3.定位bug赤炒。當(dāng)有了穩(wěn)定的復(fù)現(xiàn)途徑之后,要做的就是打斷點(diǎn)亏较、打日志進(jìn)行調(diào)試莺褒,來(lái)一步一步分析和定位bug,到底是那塊代碼導(dǎo)致的錯(cuò)誤雪情。
  • 4.確認(rèn)bug遵岩。當(dāng)我們定位到bug出錯(cuò)的地方之后,我們就需要分析這到底是不是bug巡通。如果是bug尘执,那么這個(gè)bug出現(xiàn)的根源是什么,到底能不能解決宴凉。
  • 5.修復(fù)bug誊锭。在明確了bug的根本原因之后,下面就需要發(fā)揮我們的聰明才智去修復(fù)這個(gè)bug了弥锄。
  • 6.驗(yàn)證bug丧靡。并不是每次我們修復(fù)完bug之后就可以萬(wàn)事大吉了,此時(shí)我們還需要去重現(xiàn)bug以確保bug被真正修復(fù)籽暇。除此之外温治,有條件的我們還需要去驗(yàn)證相關(guān)場(chǎng)景,以保證修復(fù)該bug不會(huì)引入其他bug戒悠。

以上可以總結(jié)為12字方針--"了解熬荆、復(fù)現(xiàn)、定位绸狐、確認(rèn)卤恳、修復(fù)、驗(yàn)證"bug六孵。 一般在稍微大一點(diǎn)的公司纬黎,都會(huì)有對(duì)應(yīng)的流程對(duì)bug的修復(fù)進(jìn)行流程控制,最終形成閉環(huán)劫窒。

可以看到的是,其實(shí)修復(fù)bug只是解決一個(gè)bug的6個(gè)步驟中的其中一步拆座。很多剛剛參與工作的程序員經(jīng)常犯的錯(cuò)誤就是一遇到bug主巍,就開(kāi)始漫無(wú)目的地看代碼或者是上網(wǎng)各種瞎搜索,又或者各種無(wú)腦問(wèn)挪凑,最后搞了一圈可能連自己要解決的bug到底是什么都不知道孕索,這樣解決bug的效率可想而知。

可能讀到這的你此刻非常想問(wèn):怎樣才可以更快地修復(fù)一個(gè)bug呢躏碳?那么下面我就根據(jù)上面講的六個(gè)步驟來(lái)分別講解一下對(duì)應(yīng)的技巧搞旭。

2.解決bug的藝術(shù)

在我看來(lái),修復(fù)一個(gè)bug是相對(duì)容易的。因?yàn)樾迯?fù)一個(gè)bug的方法可能有很多種肄渗,但是如何從根本上解決一個(gè)bug镇眷,并保證這個(gè)bug下次不再?gòu)?fù)現(xiàn)的話,其實(shí)是非常難的翎嫡,這就需要我們學(xué)習(xí)一下解決bug的藝術(shù)欠动。

2.1 了解bug

俗話說(shuō),知己知彼百戰(zhàn)不殆惑申。bug修復(fù)的第一步當(dāng)然是先了解bug了具伍。

了解bug是解決bug最重要的一步,它直接決定了后面五步執(zhí)行的效率和質(zhì)量圈驼。糟糕的錯(cuò)誤報(bào)告和不負(fù)責(zé)任的問(wèn)題描述都是埋葬程序員修復(fù)bug意志的罪魁禍?zhǔn)住?/p>

在了解bug之前人芽,我們需要收集足夠的信息,了解它產(chǎn)生的現(xiàn)象绩脆、描述啼肩、復(fù)現(xiàn)步驟、以及解決后的預(yù)期是什么等等衙伶。那么我們應(yīng)該怎么做才能更加全面地了解它呢祈坠?

下面我給幾點(diǎn)建議供大家參考:

2.1.1 觀察現(xiàn)象

光憑文字說(shuō)明是無(wú)法準(zhǔn)確領(lǐng)悟到bug的精髓的。因?yàn)槊總€(gè)人思考問(wèn)題的角度以及文字表達(dá)描述都是千差萬(wàn)別的矢劲。

如果說(shuō)這個(gè)時(shí)候能提供一段出錯(cuò)的視頻或者問(wèn)題截圖赦拘,又或者能夠現(xiàn)場(chǎng)演示錯(cuò)誤的話,這樣觀察現(xiàn)象芬沉,然后再結(jié)合問(wèn)題描述之后躺同,一定能夠幫助你快速地了解這個(gè)bug。

2.1.2 詢問(wèn)相關(guān)人員

這里你詢問(wèn)的可以不僅限于發(fā)現(xiàn)bug的人(一般是測(cè)試人員)丸逸,當(dāng)然你首先應(yīng)當(dāng)詢問(wèn)的還是這個(gè)發(fā)現(xiàn)bug的人蹋艺。

這里你需要著重詢問(wèn)bug報(bào)告上你覺(jué)得迷惑的點(diǎn),比如出現(xiàn)bug的應(yīng)用版本黄刚、設(shè)備型號(hào)捎谨、bug出現(xiàn)的頻率、bug產(chǎn)生的步驟和恢復(fù)的途徑憔维、bug修復(fù)的預(yù)期效果等涛救。這里你需要進(jìn)行刨根問(wèn)底地詢問(wèn),因?yàn)榭赡躡ug發(fā)現(xiàn)人覺(jué)得一些無(wú)關(guān)緊要的細(xì)節(jié)业扒,對(duì)你來(lái)說(shuō)卻是至關(guān)重要的點(diǎn)检吆。

問(wèn)完發(fā)現(xiàn)bug的人之后,我們還可以向bug對(duì)應(yīng)模塊的負(fù)責(zé)人(測(cè)試程储、開(kāi)發(fā)蹭沛、產(chǎn)品)詢問(wèn)該模塊的業(yè)務(wù)邏輯臂寝,說(shuō)不定能夠獲取到有價(jià)值的信息哦。

2.1.3 提供bug報(bào)告模板

一份優(yōu)秀的bug報(bào)告模板摊灭,可以讓程序員直接跳過(guò)bug修復(fù)的前三步咆贬,直接進(jìn)入到確認(rèn)bug步驟,從而能夠極大地提高bug修復(fù)的效率斟或。那么一份優(yōu)秀的bug報(bào)告模板應(yīng)當(dāng)具備哪些內(nèi)容呢素征?

  • bug的標(biāo)題和問(wèn)題描述
  • 出現(xiàn)bug的應(yīng)用版本
  • 出現(xiàn)bug的設(shè)備信息(型號(hào)、版本等)
  • bug產(chǎn)生相關(guān)的視頻萝挤、截圖和錯(cuò)誤日志
  • bug復(fù)現(xiàn)的步驟
  • bug出現(xiàn)的必要條件(環(huán)境)和恢復(fù)途徑
  • bug修復(fù)后的預(yù)期效果
  • bug對(duì)應(yīng)的模塊或者關(guān)聯(lián)bug

有了以上的內(nèi)容之后御毅,相信程序員能夠很快地了解這個(gè)bug,定位出bug產(chǎn)生的原因并予以解決怜珍。

2.2 復(fù)現(xiàn)bug

如果你在第一步了解bug中獲得了良好的bug報(bào)告的話端蛆,則此部分可以很容易。你只需要按照bug報(bào)告中的bug復(fù)現(xiàn)步驟酥泛,按順序操作即可穩(wěn)定復(fù)現(xiàn)bug今豆。

當(dāng)然,很多時(shí)候往往并不是一帆風(fēng)順的柔袁,即使你手握bug報(bào)告呆躲,做了非常詳細(xì)的調(diào)查工作,然而bug就是無(wú)法復(fù)現(xiàn)捶索,那么這個(gè)時(shí)候我們應(yīng)該怎么做呢插掂?

2.2.1 重新了解bug

此時(shí)為了能夠復(fù)現(xiàn)bug,你可能需要回到上一步腥例,重現(xiàn)去了解bug辅甥。因?yàn)槟阒皩?duì)bug的理解可能產(chǎn)生偏差,又或者你第一步并沒(méi)有做好才導(dǎo)致了bug未能復(fù)現(xiàn)燎竖。這個(gè)時(shí)候帶著疑問(wèn)去重現(xiàn)了解bug璃弄,可能你會(huì)發(fā)現(xiàn)新的大陸。

2.2.2 將偶現(xiàn)bug轉(zhuǎn)為必現(xiàn)bug

偶現(xiàn)bug算是bug家族中最調(diào)皮的一個(gè)了构回。它們以沒(méi)有規(guī)律夏块,難以復(fù)現(xiàn)等特性,經(jīng)常能把以一個(gè)好好的程序員給逼瘋捐凭。

但是既然是要復(fù)現(xiàn)bug拨扶,那么肯定要找到bug穩(wěn)定復(fù)現(xiàn)的路徑,這樣才能方便下面bug的定位茁肠。這里我推薦大家的一個(gè)做法就是想辦法把偶現(xiàn)的bug轉(zhuǎn)化為必現(xiàn)的bug。因?yàn)榧词故桥棘F(xiàn)的bug缩举,很多也是特定條件下必現(xiàn)的bug垦梆,只不過(guò)此時(shí)你還沒(méi)發(fā)現(xiàn)這個(gè)特定條件而已匹颤。

那么怎樣才能將偶現(xiàn)bug轉(zhuǎn)為必現(xiàn)bug呢?這里我簡(jiǎn)單介紹一下我常用的技巧:

  • 1.對(duì)比法:觀察并對(duì)比復(fù)現(xiàn)和不復(fù)現(xiàn)的各方面條件托猩,找到那個(gè)必現(xiàn)的特定條件印蓖。

  • 2.注釋(刪除)代碼法:對(duì)懷疑的代碼進(jìn)行注釋(刪除),直到徹底將偶現(xiàn)bug轉(zhuǎn)變?yōu)楸噩F(xiàn)bug京腥。

2.3 定位bug

一旦我們找到了bug穩(wěn)定復(fù)現(xiàn)的步驟之后赦肃,下面的工作就是開(kāi)始定位bug產(chǎn)生的地方了。

這一步可以說(shuō)是解決bug的關(guān)鍵環(huán)節(jié)公浪,這一步驟的難易程度一般取決于以下幾個(gè)因素:

  • 1.程序員自身的代碼量(工作經(jīng)驗(yàn))
  • 2.對(duì)項(xiàng)目代碼(業(yè)務(wù))的熟悉程度他宛。
  • 3.分析問(wèn)題和解決問(wèn)題的能力

那么我們?nèi)绾尾拍芨斓囟ㄎ怀鯾ug產(chǎn)生的位置呢?下面我提供一些思路供大家參考:

  • 1.斷點(diǎn)調(diào)試法欠气。這是程序員通用厅各,同時(shí)也是最有效的定位問(wèn)題的方式。一個(gè)不會(huì)斷點(diǎn)調(diào)試的程序員和瞎子沒(méi)有本質(zhì)上的區(qū)別预柒。
  • 2.日志分析法队塘。其實(shí)并不是所有bug都可以進(jìn)行斷點(diǎn)調(diào)試的。比如在一些循環(huán)調(diào)用或者業(yè)務(wù)較為復(fù)雜的場(chǎng)景下宜鸯,打日志分析定位是較為適合的方式憔古。
  • 3.排除法。如果一個(gè)bug產(chǎn)生的原因可能有多種情況的時(shí)候淋袖,這個(gè)時(shí)候采取排除法的方式是最優(yōu)的鸿市。你可以把可能導(dǎo)致bug產(chǎn)生的代碼塊都打上日志或者斷點(diǎn),然后重現(xiàn)一下bug進(jìn)行問(wèn)題的定位适贸。
  • 4.代碼回滾法灸芳。如果你這個(gè)bug在之前的版本是好的,但是在現(xiàn)在版本上又出現(xiàn)了拜姿,這個(gè)時(shí)候就可以使用代碼回滾大法烙样。把你的代碼回滾到你懷疑的版本,運(yùn)行看bug是否消失蕊肥,然后對(duì)兩個(gè)版本之前代碼有何區(qū)別谒获,最終定位出bug產(chǎn)生的位置。這里我們可以使用二分法來(lái)提高代碼的回滾效率壁却。
  • 5.注釋(刪除)代碼法批狱。這個(gè)我在上一個(gè)步驟中也提到過(guò)。對(duì)于一些難以理解和定位的bug展东,我們可以使用這個(gè)方法進(jìn)行嘗試赔硫。不過(guò)這個(gè)方法使用起來(lái)有一定的風(fēng)險(xiǎn),因?yàn)榭赡苣銊h除的那一串代碼雖然能夠解決bug盐肃,但是卻不是bug產(chǎn)生的根源爪膊,這個(gè)時(shí)候你可能會(huì)將必現(xiàn)bug改成了偶現(xiàn)bug权悟,讓問(wèn)題變得更加復(fù)雜。
  • 6.源碼分析法推盛。有的時(shí)候有些bug可能并不是你的代碼導(dǎo)致的問(wèn)題峦阁。可能是第三方庫(kù)本身的bug耘成,又或者是系統(tǒng)本身的bug榔昔,又或者是你誤用api導(dǎo)致的問(wèn)題,這個(gè)時(shí)候就需要你擁有源碼分析的能力瘪菌。深入源碼中撒会,一層層分析直到最終找到bug產(chǎn)生的原因。
  • 7.聯(lián)想法控嗜。通過(guò)一些類似的bug修改經(jīng)驗(yàn)從而聯(lián)想猜測(cè)出bug產(chǎn)生的位置茧彤。這個(gè)方法對(duì)使用者本身有較高的要求。需要使用者對(duì)項(xiàng)目代碼和業(yè)務(wù)邏輯非常熟悉疆栏,同時(shí)對(duì)問(wèn)題分析的能力有較高的要求曾掂。這就是我們常說(shuō)的牛人能夠一眼就能看出問(wèn)題,他們常用的就是這種方式壁顶。
  • 8.場(chǎng)外支援法珠洗。這是實(shí)在定位不出bug才采取的下下策。因?yàn)樗⒉荒芴岣吣愣ㄎ籦ug的能力若专,同時(shí)請(qǐng)別人幫忙定位bug许蓖,你就需要把你之前所做的工作都要全盤(pán)地向他表述一遍,這樣不僅會(huì)降低bug修復(fù)的效率调衰,同時(shí)還不一定能保證定位出bug產(chǎn)生的位置膊爪,它取決于你表述問(wèn)題的能力和幫你的人分析和解決問(wèn)題的能力。

(看了這么久嚎莉,看看美女放松下吧C壮辍)

2.4 確認(rèn)bug

在我們定位出bug產(chǎn)生的位置后,下面的工作就是分析bug產(chǎn)生的根源了趋箩。

這一步可以說(shuō)是bug修復(fù)6個(gè)步驟中最為關(guān)鍵的一步赃额。這一步直接決定了這個(gè)bug能否被徹底地解決,同時(shí)也是最能體現(xiàn)bug修復(fù)藝術(shù)的步驟叫确。

但是很遺憾的是跳芳,這一步往往被很多人給忽視了。我為什么會(huì)這樣說(shuō)呢竹勉?因?yàn)楹芏鄷r(shí)候我們修復(fù)bug的時(shí)候飞盆,都會(huì)受到各方面的限制:

  • 1.自身經(jīng)驗(yàn)水平的限制:一些初入項(xiàng)目的程序員經(jīng)常因?yàn)樾迯?fù)一個(gè)bug而導(dǎo)致了另一個(gè)bug,又或者只是看到了bug的表象卻不能感知到bug產(chǎn)生更深層次的原因,所以10種產(chǎn)生bug的情況他可能只改了一種桨啃,將必現(xiàn)問(wèn)題改成了偶現(xiàn)問(wèn)題车胡,讓bug變得更加復(fù)雜檬输。
  • 2.時(shí)間限制:這是我們程序員經(jīng)常碰到的限制照瘾。這在互聯(lián)網(wǎng)企業(yè)非常普遍,通常解決一個(gè)bug是有時(shí)間限制的丧慈,例如:這個(gè)項(xiàng)目明天就要上線了析命,并強(qiáng)制要求你今晚就得想辦法解決。這個(gè)時(shí)候你可能就被逼無(wú)奈逃默,采取硬編碼的方式去臨時(shí)把這個(gè)bug給按住鹃愤。其實(shí)這樣雖然bug是被臨時(shí)解決了,但是卻會(huì)讓這個(gè)bug變得愈加復(fù)雜完域。很多公司出現(xiàn)的那些祖?zhèn)鞔a就是在這種情況下產(chǎn)生的软吐,動(dòng)一下就可能產(chǎn)生無(wú)數(shù)未知的bug,令人絕望吟税。
  • 3.業(yè)務(wù)限制:很多時(shí)候?qū)е麓a邏輯非常復(fù)雜難懂的罪魁禍?zhǔn)拙褪沁@種業(yè)務(wù)限制凹耙。我們?cè)谛迯?fù)一個(gè)bug的時(shí)候,很多時(shí)候就是因?yàn)檫@種業(yè)務(wù)的限制肠仪,導(dǎo)致bug的修復(fù)一種不能從根源上予以解決肖抱,只要業(yè)務(wù)一調(diào)整就可能導(dǎo)致這個(gè)bug反復(fù)地出現(xiàn)。

說(shuō)了這么多限制异旧,那么我們?nèi)绾尾拍苷业絾?wèn)題的根源呢意述?

  • 1.多積累經(jīng)驗(yàn),提升自身的水平:這是打破自身經(jīng)驗(yàn)水平的限制吮蛹。
  • 2.及時(shí)處理bug:在收到bug報(bào)告的第一時(shí)間就去處理荤崇,盡可能打破時(shí)間的限制。
  • 3.多熟悉業(yè)務(wù):有時(shí)間就多去了解和梳理業(yè)務(wù)潮针,深入研究項(xiàng)目代碼术荤。這樣我們?cè)诮鉀Qbug的時(shí)候也不會(huì)因?yàn)閷?duì)業(yè)務(wù)不熟悉而無(wú)法分析出bug產(chǎn)生的根源。
  • 4.準(zhǔn)確定位bug:bug定位的準(zhǔn)確性直接決定了你能否分析出bug產(chǎn)生的根源然低。因此你需要仔細(xì)分析和定位bug喜每,使用我上面介紹的8種方式去定位bug。

2.5 修復(fù)bug

其實(shí)前面的四步都是為這一步所做的鋪墊雳攘。有了前面四步的工作带兜,相信到這兒也是相對(duì)微不足道的了,剩下的就是如何優(yōu)美地解決這個(gè)bug了吨灭。

到了這個(gè)階段刚照,bug通常不需要大的修改來(lái)修復(fù),因此這一步往往會(huì)非承郑快无畔,當(dāng)然也就沒(méi)有什么好的技巧啦啊楚。

2.6 驗(yàn)證bug

作為bug修復(fù)的最后一步,它是確保bug被真正修復(fù)的最后保障浑彰。

在這里需要我們著重注意以下幾點(diǎn):

  • 1.重復(fù)之前復(fù)現(xiàn)bug的步驟來(lái)驗(yàn)證bug是否被徹底解決恭理。
  • 2.驗(yàn)證bug修復(fù)可能改動(dòng)到的相關(guān)模塊是否正常,保證bug修復(fù)不引入新的bug郭变。

如果上述有任何一點(diǎn)沒(méi)有達(dá)到的話颜价,請(qǐng)返回步驟四和步驟五,重新修復(fù)bug诉濒!

3.如何提高bug修復(fù)的效率

上文我們著重講解了解決bug的藝術(shù)周伦,為的是能夠更好地解決bug。但是如何才能保證既有效未荒,又快速地修復(fù)bug专挪,提高bug修復(fù)的效率呢?

通過(guò)上面對(duì)于解決bug的藝術(shù)的講解片排,我們可以總結(jié)出以下影響bug修復(fù)效率的幾個(gè)關(guān)鍵點(diǎn):

  • 1.bug信息收集的效率以及有效性寨腔。
  • 2.時(shí)間限制的壓力。
  • 3.人員對(duì)項(xiàng)目代碼(業(yè)務(wù))的熟悉程度划纽。
  • 4.人員自身經(jīng)驗(yàn)和分析問(wèn)題的能力脆侮。

以上4點(diǎn)可以說(shuō)直接決定了bug修復(fù)的效率。那么如何才能提高bug修復(fù)的效率呢勇劣?下面我將一一給出我的看法靖避。

我的心是冰冰的

3.1 建立健全的信息收集機(jī)制

bug信息的收集可以說(shuō)是修復(fù)bug過(guò)程中最為耗時(shí)的環(huán)節(jié)。提升bug信息收集的效率以及有效性可以大幅度地提升我們修復(fù)bug的效率比默。

那么我們應(yīng)該如何建立健全的信息收集機(jī)制呢幻捏?這里我給出我的幾點(diǎn)建議:

3.1.1 提供優(yōu)秀的bug報(bào)告模板

上文我們?cè)?code>了解bug一步中提到過(guò):一份優(yōu)秀的bug報(bào)告模板,可以讓程序員直接跳過(guò)bug修復(fù)的前三步命咐,直接進(jìn)入到確認(rèn)bug步驟篡九,從而能夠極大地提高bug修復(fù)的效率。

這里我再次重復(fù)一步醋奠,一份優(yōu)秀的bug報(bào)告模板應(yīng)當(dāng)具備哪些內(nèi)容:

  • bug的標(biāo)題和問(wèn)題描述
  • 出現(xiàn)bug的應(yīng)用版本
  • 出現(xiàn)bug的設(shè)備信息(型號(hào)榛臼、版本等)
  • bug產(chǎn)生相關(guān)的視頻、截圖和錯(cuò)誤日志
  • bug復(fù)現(xiàn)的步驟
  • bug出現(xiàn)的必要條件(環(huán)境)和恢復(fù)途徑
  • bug修復(fù)后的預(yù)期效果
  • bug對(duì)應(yīng)的模塊或者關(guān)聯(lián)bug

3.1.2 建立完備的日志體系

一套完備的日志體系窜司,可以讓我們更加清晰地知道用戶到底做了什么才導(dǎo)致bug的出現(xiàn)沛善。

在項(xiàng)目的初期,我們可能為了趕工期而常常忽視了日志打印的重要性塞祈,這很可能就會(huì)導(dǎo)致該項(xiàng)目日后的維護(hù)將非常得艱難金刁。

那么我們?yōu)槭裁匆⒁惶淄陚涞娜罩倔w系呢?

  • 1.并不是所有的用戶(測(cè)試)都能夠給你描述清楚bug產(chǎn)生的信息。
  • 2.即使用戶(測(cè)試)給你描述了bug產(chǎn)生相關(guān)的信息尤蛮,但是他們并不理解你的代碼邏輯媳友,他們只能根據(jù)bug出現(xiàn)的現(xiàn)象告訴你問(wèn)題,可能他們的表述和你的理解不在一個(gè)頻道产捞。

如果你有這么一套完備的日志體系醇锚,那么你就可以在用戶(測(cè)試)不用開(kāi)口的情況下,直接get到用戶的操作行為以及對(duì)于的代碼邏輯轧葛。同時(shí)搂抒,可能一句關(guān)鍵點(diǎn)的報(bào)錯(cuò)日志就可以幫你直接定位到bug產(chǎn)生的位置,從而直接進(jìn)入第四步確認(rèn)bug尿扯。

說(shuō)了這么多,我們應(yīng)該如何打印高效的日志呢焰雕?

  • 1.在異常分支返回前打印日志衷笋。
  • 2.在復(fù)雜業(yè)務(wù)流程的關(guān)鍵點(diǎn)打印日志。
  • 3.在對(duì)外交互或者模塊交互點(diǎn)打印日志矩屁。
  • 4.在用戶交互或者生命周期的關(guān)鍵點(diǎn)打印日志辟宗。
  • 5.對(duì)重要的信息點(diǎn)打印日志,記錄用戶畫(huà)像吝秕。
  • 6.按重要性分等級(jí)打印日志泊脐。
  • 7.禁止在循環(huán)中打印日志,禁止打印無(wú)效的日志烁峭。
  • 8.禁止打印用戶隱私相關(guān)的信息容客。

3.2 建立自動(dòng)化測(cè)試機(jī)制

建立自動(dòng)化測(cè)試機(jī)制,可以讓突破時(shí)間限制成為可能。

3.2.1 更早地發(fā)現(xiàn)bug

很多時(shí)候來(lái)自時(shí)間限制的壓力约郁,往往是測(cè)試不充分導(dǎo)致的缩挑。很多bug直到產(chǎn)品臨近上線或者交付的時(shí)候才被發(fā)現(xiàn),這個(gè)時(shí)候唯一解決問(wèn)題的方式就是在時(shí)間上做出限制鬓梅,無(wú)情壓迫我們這些活在公司權(quán)力最底層的程序員們供置。

如果這個(gè)時(shí)候能有一套自動(dòng)化測(cè)試機(jī)制,每天下班后都進(jìn)行自動(dòng)測(cè)試的話绽快,那樣很多bug就能被提前發(fā)現(xiàn)芥丧,從而為我們修復(fù)bug預(yù)留了不少寶貴的時(shí)間。

3.2.2 節(jié)約bug驗(yàn)證的時(shí)間

對(duì)于一些復(fù)雜難解坊罢、偶現(xiàn)的bug续担,我們往往會(huì)在確認(rèn)bug驗(yàn)證bug之間花費(fèi)大量的時(shí)間。這個(gè)時(shí)候如果有一套自動(dòng)化測(cè)試機(jī)制或者工具幫助我們驗(yàn)證bug的話艘绍,就可以極大地縮減我們修復(fù)bug的時(shí)間赤拒。

3.3 提高項(xiàng)目代碼(業(yè)務(wù))的熟悉程度

提高人員對(duì)項(xiàng)目代碼(業(yè)務(wù))的熟悉程度,這樣就可以極大地提高人員定位bug的效率。

3.3.1 建立豐富的知識(shí)庫(kù)體系

建立一套豐富的知識(shí)庫(kù)體系挎挖,可以幫助我們加深對(duì)自己責(zé)任內(nèi)項(xiàng)目代碼(業(yè)務(wù))的理解这敬,同時(shí)還能幫助我們快速了解我們所不了解的業(yè)務(wù)模塊。

那么如何才能建立起豐富的知識(shí)庫(kù)體系呢蕉朵?下面我給出我的幾點(diǎn)建議:

  • 1.對(duì)知識(shí)進(jìn)行分類崔涂。
  • 2.定期添加和更新知識(shí)庫(kù)的內(nèi)容。
  • 3.提高知識(shí)庫(kù)的檢索效率始衅。
  • 4.定期組織知識(shí)的分享冷蚂。
  • 5.激勵(lì)貢獻(xiàn)知識(shí)庫(kù)的人員。

3.3.2 建立責(zé)任田劃分機(jī)制

劃分責(zé)任田的目的就是:讓專業(yè)的人做專業(yè)的事情汛闸。

劃分責(zé)任田的好處:

  • 1.專業(yè)的人做專業(yè)的事情蝙茶。劃分完責(zé)任田后,田主需要對(duì)自己負(fù)責(zé)的模塊負(fù)責(zé)诸老,這就必然要求其對(duì)模塊內(nèi)的代碼(業(yè)務(wù))更加熟悉隆夯。
  • 2.責(zé)任到人利于追責(zé)和bug跟蹤。

當(dāng)然責(zé)任田也不是想象中的那么完美别伏,它也存在一定的缺陷:

  • 1.職責(zé)明確之后可能導(dǎo)致缺少全局視野蹄衷。一些復(fù)雜的bug可能是幾個(gè)模塊共同作用下才產(chǎn)生的,對(duì)于這類bug的定位勢(shì)必會(huì)大大增加難度厘肮。
  • 2.劃分責(zé)任田之后愧口,可能導(dǎo)致踢皮球的情況。

責(zé)任田劃分機(jī)制类茂,它是一把雙刃劍耍属。所以是否需要建立責(zé)任田劃分機(jī)制,還是需要結(jié)合企業(yè)自身的情況而定的大咱。

4.打鐵還需自身硬

bug是永遠(yuǎn)都寫(xiě)不完的恬涧,而且程序員留在代碼里不僅僅只有bug,還有時(shí)光碴巾。在解決一個(gè)有一個(gè)bug的同時(shí)溯捆,相應(yīng)的自己能力有沒(méi)有也得到提升呢?下次遇到同樣的問(wèn)題厦瓢,會(huì)不會(huì)又是一臉蒙逼提揍?簡(jiǎn)而言之,對(duì)于程序員而言煮仇,技術(shù)才是王道劳跃。應(yīng)對(duì)bug最好的方法,還是不斷的提升自己的技術(shù)浙垫!我自己作為一個(gè)Android開(kāi)發(fā)者刨仑,應(yīng)該能給你一些這樣的幫助郑诺!

  • 4.1 架構(gòu)師筑基必備技能

目前Android APP開(kāi)發(fā)主流語(yǔ)言就是Java語(yǔ)言,Java語(yǔ)言最大的特性就是提高了軟件的交互可能性杉武,可以說(shuō)安卓手機(jī)幾乎所有應(yīng)用程序都是利用Java語(yǔ)言來(lái)進(jìn)行編寫(xiě)的辙诞。

知識(shí)要點(diǎn):
1、深入理解Java泛型
2轻抱、注解深入淺出
3飞涂、并發(fā)編程
4淌铐、數(shù)據(jù)傳輸與序列化
5障涯、Java虛擬機(jī)原理
6、高效IO

架構(gòu)師筑基必備技能
  • 4.2 設(shè)計(jì)思想解讀開(kāi)源框架

隨著互聯(lián)網(wǎng)企業(yè)的不斷發(fā)展裙秋,產(chǎn)品項(xiàng)目中的模塊越來(lái)越多容燕,用戶體驗(yàn)要求也越來(lái)越高梁呈,想實(shí)現(xiàn)小步快跑、快速迭代的目的越來(lái)越難缰趋,插件化技術(shù)應(yīng)用而生捧杉。如果沒(méi)有插件化技術(shù),美團(tuán)秘血、淘寶這些集成了大量“app”的應(yīng)用,可能會(huì)有幾個(gè)g那么大评甜。

所以灰粮,當(dāng)今的Android移動(dòng)開(kāi)發(fā),不會(huì)熱修復(fù)忍坷、插件化粘舟、組件化,80%以上的面試都過(guò)不了佩研。

知識(shí)要點(diǎn):
1柑肴、熱修復(fù)設(shè)計(jì)
2、插件化框架設(shè)計(jì)
3旬薯、組件化框架設(shè)計(jì)
4晰骑、圖片加載框架
5、網(wǎng)絡(luò)訪問(wèn)框架設(shè)計(jì)
6绊序、RXJava響應(yīng)式編程框架設(shè)計(jì)

設(shè)計(jì)思想解讀開(kāi)源框架
  • 4.3 360°全方位性能調(diào)優(yōu)

在不同層次的開(kāi)發(fā)工程師手里硕舆,因?yàn)榧夹g(shù)水平的參差不齊,即使很多手機(jī)在跑分軟件性能非常高骤公,打開(kāi)應(yīng)用依然存在卡頓現(xiàn)象抚官。

另外,隨著產(chǎn)品內(nèi)容迭代阶捆,功能越來(lái)越復(fù)雜凌节,UI頁(yè)面也越來(lái)越豐富钦听,也成為流暢運(yùn)行的一種阻礙。綜上所述倍奢,對(duì)APP進(jìn)行性能優(yōu)化已成為開(kāi)發(fā)者該有的一種綜合素質(zhì)朴上,也是開(kāi)發(fā)者能夠完成高質(zhì)量應(yīng)用程序作品的保證。

1娱挨、設(shè)計(jì)思想與代碼質(zhì)量?jī)?yōu)化

2余指、程序性能優(yōu)化

  • 啟動(dòng)速度與執(zhí)行效率優(yōu)化
  • 布局檢測(cè)與優(yōu)化
  • 內(nèi)存優(yōu)化
  • 耗電優(yōu)化
  • 網(wǎng)絡(luò)傳輸與數(shù)據(jù)儲(chǔ)存優(yōu)化
  • APK大小優(yōu)化

3、開(kāi)發(fā)效率優(yōu)化

  • 分布式版本控制系統(tǒng)Git
  • 自動(dòng)化構(gòu)建系統(tǒng)Gradle

4跷坝、項(xiàng)目實(shí)戰(zhàn)

  • 啟動(dòng)速度
  • 流暢度
  • 抖音在APK包大小資源優(yōu)化的實(shí)踐
  • 優(yōu)酷響應(yīng)式布局技術(shù)全解析
  • 網(wǎng)絡(luò)優(yōu)化
  • 手機(jī)淘寶雙十一性能優(yōu)化項(xiàng)目揭秘
  • 高德APP全鏈路源碼依賴分析
  • 徹底干掉OOM的實(shí)戰(zhàn)經(jīng)驗(yàn)分享
  • 微信Android終端內(nèi)存優(yōu)化實(shí)踐
360°全方位性能調(diào)優(yōu)
  • 4.4 Android框架體系架構(gòu)

Android框架體系架構(gòu)(高級(jí)UI+FrameWork源碼) 這塊知識(shí)是現(xiàn)今使用者最多的酵镜,我們稱之Android2013~2016年的技術(shù)。

Android開(kāi)發(fā)者也往往因?yàn)榫W(wǎng)上Copy代碼習(xí)慣了而導(dǎo)致對(duì)這塊經(jīng)巢褡辏“使用”的代碼熟悉而又陌生:熟悉的是幾乎天天在和它們打交道淮韭, 天天在復(fù)制這些代碼 ;陌生的是雖然天天和這些代碼打交道贴届,但是并沒(méi)有深入研究過(guò)這些代碼的原理靠粪,代碼深處的內(nèi)涵。

本篇知識(shí)要點(diǎn):
1毫蚓、高級(jí)UI晉升
2占键、Android內(nèi)核組件
3、大型項(xiàng)目必備IPC
4元潘、數(shù)據(jù)持久與序列化
5畔乙、Framework內(nèi)核解析

Android框架體系架構(gòu)
  • 4.5 NDK模塊開(kāi)發(fā)(音視頻系列)

NDK(Native Development Kit縮寫(xiě))一種基于原生程序接口的軟件開(kāi)發(fā)工具包,可以讓您在 Android 應(yīng)用中利用 C 和 C++ 代碼的工具翩概。通過(guò)此工具開(kāi)發(fā)的程序直接在本地運(yùn)行牲距,而不是虛擬機(jī)。

在Android中钥庇,NDK是一系列工具的集合牍鞠,主要用于擴(kuò)展Android SDK。NDK提供了一系列的工具可以幫助開(kāi)發(fā)者快速的開(kāi)發(fā)C或C++的動(dòng)態(tài)庫(kù)评姨,并能自動(dòng)將so和Java應(yīng)用一起打包成apk难述。

本篇知識(shí)要點(diǎn):
1、NDK開(kāi)發(fā)之C/C++入門(mén)
2参咙、JNI模塊開(kāi)發(fā)
3龄广、Linux編程
4、底層圖片處理
5蕴侧、音視頻開(kāi)發(fā)
6择同、機(jī)器學(xué)習(xí)

NDK模塊開(kāi)發(fā)
  • 4.6 Flutter學(xué)習(xí)進(jìn)階

2019 年無(wú)疑是 Flutter 技術(shù)如火如荼發(fā)展的一年。

每一個(gè)移動(dòng)開(kāi)發(fā)者都在為 Flutter 帶來(lái)的“快速開(kāi)發(fā)净宵、富有表現(xiàn)力和靈活的 UI敲才、原生性能”的特色和理念而癡狂裹纳,從超級(jí) App 到獨(dú)立應(yīng)用,從純 Flutter 到混合棧紧武,開(kāi)發(fā)者們?cè)诓煌膱?chǎng)景下樂(lè)此不疲的探索和應(yīng)用著 Flutter 技術(shù)剃氧,也在面臨著各種各樣不同的挑戰(zhàn)。

本篇知識(shí)要點(diǎn):
1阻星、Flutter跨平臺(tái)開(kāi)發(fā)概述
2朋鞍、Windows中Flutter開(kāi)發(fā)環(huán)境搭建
3、編寫(xiě)你的第一個(gè)Flutter APP
4妥箕、Flutter Dart語(yǔ)言系統(tǒng)入門(mén)

......

Flutter學(xué)習(xí)
  • 4.7 微信小程序開(kāi)發(fā)

微信小程序作為現(xiàn)在比較火的編程開(kāi)發(fā)應(yīng)用場(chǎng)景之一滥酥,深受市場(chǎng)的青睞,這讓不少開(kāi)發(fā)者眼饞不已畦幢。但是對(duì)于初學(xué)者來(lái)說(shuō)坎吻,就完全摸不著頭腦了,不知道微信小程序開(kāi)發(fā)制作需要學(xué)習(xí)那些知識(shí)宇葱,有需要的朋友可以參考本篇瘦真。

本篇知識(shí)要點(diǎn):
1、小程序概述及入門(mén)
2黍瞧、小程序UI開(kāi)發(fā)
3诸尽、API操作
4、購(gòu)物商場(chǎng)項(xiàng)目實(shí)戰(zhàn)

微信小程序開(kāi)發(fā)
  • 4.8 Android相關(guān)源碼解讀
    只要是程序員印颤,不管是Java還是Android弦讽,如果不去閱讀源碼,只看API文檔膀哲,那就只是停留于皮毛,這對(duì)我們知識(shí)體系的建立和完備以及實(shí)戰(zhàn)技術(shù)的提升都是不利的被碗。
Android相關(guān)源碼解讀

Android相關(guān)源碼解讀部分內(nèi)容

由于篇幅原因某宪,以上完整學(xué)習(xí)筆記pdf如有需要,請(qǐng)?bào)w諒下碼字不易锐朴,可以 點(diǎn)贊+評(píng)論 支持下我兴喂,然后點(diǎn)擊這里免費(fèi)自取

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末焚志,一起剝皮案震驚了整個(gè)濱河市衣迷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌酱酬,老刑警劉巖壶谒,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異膳沽,居然都是意外死亡汗菜,警方通過(guò)查閱死者的電腦和手機(jī)让禀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)陨界,“玉大人巡揍,你說(shuō)我怎么就攤上這事【瘢” “怎么了腮敌?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)俏扩。 經(jīng)常有香客問(wèn)我糜工,道長(zhǎng),這世上最難降的妖魔是什么动猬? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任啤斗,我火速辦了婚禮,結(jié)果婚禮上赁咙,老公的妹妹穿的比我還像新娘钮莲。我一直安慰自己,他們只是感情好彼水,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布崔拥。 她就那樣靜靜地躺著,像睡著了一般凤覆。 火紅的嫁衣襯著肌膚如雪链瓦。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天盯桦,我揣著相機(jī)與錄音慈俯,去河邊找鬼。 笑死拥峦,一個(gè)胖子當(dāng)著我的面吹牛贴膘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播略号,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼刑峡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了玄柠?” 一聲冷哼從身側(cè)響起突梦,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎羽利,沒(méi)想到半個(gè)月后宫患,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铐伴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年撮奏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了俏讹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡畜吊,死狀恐怖泽疆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情玲献,我是刑警寧澤殉疼,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站捌年,受9級(jí)特大地震影響瓢娜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜礼预,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一眠砾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧托酸,春花似錦褒颈、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至应结,卻和暖如春刨疼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鹅龄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工揩慕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扮休。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓漩绵,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親肛炮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容