前言
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
- 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ì)
- 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í)踐
- 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)核解析
- 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í)
- 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)
......
- 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)
-
4.8 Android相關(guān)源碼解讀
只要是程序員印颤,不管是Java還是Android弦讽,如果不去閱讀源碼,只看API文檔膀哲,那就只是停留于皮毛,這對(duì)我們知識(shí)體系的建立和完備以及實(shí)戰(zhàn)技術(shù)的提升都是不利的被碗。