「轉(zhuǎn)載」 整天說(shuō)Code Review重要,你知道應(yīng)該關(guān)注哪些關(guān)鍵點(diǎn)嗎久信?

查看原文

眾所周知窖杀,在團(tuán)隊(duì)中進(jìn)行代碼審查(Code Review)可以提升代碼質(zhì)量,分享項(xiàng)目知識(shí)裙士、明確責(zé)任入客,最終達(dá)到構(gòu)建更好的軟件、更好的團(tuán)隊(duì)。如果你花幾秒鐘搜索代碼審查的相關(guān)信息桌硫,你會(huì)看到許多關(guān)于代碼審查帶來(lái)的價(jià)值的文章夭咬。也有許多方法來(lái)進(jìn)行代碼審查:在GitHub中提pull request,或使用像JetBrains的Upsource之類的工具铆隘。然而即使擁有清晰的流程和正確的工具卓舵,還遺留了一個(gè)大問(wèn)題需要解決——我們需要找尋哪些問(wèn)題。

可能沒(méi)有明確關(guān)于“我們需要找尋哪些問(wèn)題”的文章膀钠,是因?yàn)橛性S多不同的要點(diǎn)需要考慮掏湾。正如任何其他的需求,各個(gè)團(tuán)隊(duì)對(duì)各個(gè)方面都有不同的優(yōu)先級(jí)肿嘲。

本文的目標(biāo)是列出一些審查者可以找尋的要點(diǎn)融击,而各個(gè)方面的優(yōu)先級(jí)就因各個(gè)團(tuán)隊(duì)而異了使碾。

在我們繼續(xù)之前偿警,讓我們考慮一下大家在代碼審查時(shí)會(huì)討論到的問(wèn)題。對(duì)于代碼的格式城看、樣式命名以及缺少單元測(cè)試這些問(wèn)題是很常見(jiàn)的幾點(diǎn)封救。
如果你想擁有可持續(xù)的拇涤、可維護(hù)的代碼,這些是有用的檢查點(diǎn)誉结。然而工育,在代碼審查時(shí)討論這些就有些浪費(fèi)時(shí)間,因?yàn)楹芏噙@樣的檢查可以(也應(yīng)該)被自動(dòng)化搓彻。


那哪些要點(diǎn)是只能由人工進(jìn)行審查而不能依靠工具的呢如绸?回答是有驚人數(shù)量的點(diǎn)只能由人工進(jìn)行審查, 以下:

  • 如何讓新代碼與全局的架構(gòu)保持一致?
  • 代碼是否遵循SOLID原則旭贬?
  • 是否遵循團(tuán)隊(duì)使用的設(shè)計(jì)規(guī)范怔接,如領(lǐng)域驅(qū)動(dòng)開(kāi)發(fā)等?
  • 新代碼使用了什么設(shè)計(jì)模式稀轨?這樣使用是否合適扼脐?
  • 基礎(chǔ)代碼是否有結(jié)合使用了一些標(biāo)準(zhǔn)或設(shè)計(jì)樣式?
  • 新的代碼是否遵循當(dāng)前的規(guī)范奋刽?
  • 代碼是否正確遷移瓦侮,或參照了因不規(guī)范而淘汰的舊代碼?
  • 代碼的位置是否正確佣谐?比如涉及訂單的新代碼是否在訂單服務(wù)相關(guān)的位置肚吏?
  • 新代碼是否重用了現(xiàn)存的代碼?
  • 新代碼是否可以被現(xiàn)有代碼重用狭魂?
  • 新代碼是否有重復(fù)代碼罚攀?如果是的話党觅,是否應(yīng)該重構(gòu)成一個(gè)更可被重用的模式,還是當(dāng)前還可以接受斋泄?
  • 新代碼是否被過(guò)度設(shè)計(jì)了杯瞻?是否引入現(xiàn)在還不需要的重用設(shè)計(jì)?團(tuán)隊(duì)如何平衡可重用和YAGNI(You Ain’t Gonna Need It)這兩種觀點(diǎn)炫掐?
  • 字段魁莉、變量、參數(shù)募胃、方法旗唁、類的命名是否真實(shí)反映它們所代表的事物。
  • 我是否可以通過(guò)讀代碼理解它做了什么摔认?
  • 我是否理解測(cè)試用例測(cè)了什么逆皮?
  • 測(cè)試是否很好地覆蓋了用例的各種情況宅粥?它們是否覆蓋了正常和異常用例参袱?是否有忽略的情況?
  • 錯(cuò)誤信息是否可被理解秽梅?
  • 不清晰的代碼是否被文檔抹蚀、注釋或容易理解的測(cè)試用例所覆蓋?具體可以根據(jù)團(tuán)隊(duì)自身的喜好決定使用哪種方式企垦。
  • 代碼是否真的達(dá)到了預(yù)期的目標(biāo)环壤?如果有自動(dòng)化測(cè)試來(lái)確保代碼的正確性,測(cè)試的代碼是否真的可以驗(yàn)證代碼達(dá)到了協(xié)定的需求钞诡?
  • 代碼看上去是否包含不明顯的bug郑现,比如使用錯(cuò)誤的變量進(jìn)行檢查,或誤把a(bǔ)nd寫成or荧降?
    -是否需要滿足相關(guān)監(jiān)管需求接箫?
  • 作者是否需要?jiǎng)?chuàng)建公共文檔或修改現(xiàn)存的幫助文檔?
  • 是否檢查了面向用戶的信息的正確性朵诫?
  • 是否有會(huì)在生產(chǎn)環(huán)境中導(dǎo)致應(yīng)用停止運(yùn)行的明顯錯(cuò)誤辛友?代碼是否會(huì)錯(cuò)誤地指向測(cè)試數(shù)據(jù)庫(kù),是否存在應(yīng)在真實(shí)服務(wù)中移除的硬編碼的stub代碼剪返?

在本文剩下的部分废累,我們會(huì)覆蓋一系列廣泛的特性,并深入其中的兩點(diǎn)具體的區(qū)域:性能和安全脱盲。
你對(duì)性能的需求是什么邑滨,你是否考慮了安全問(wèn)題?這些是需要覆蓋到的重大區(qū)域也是至關(guān)重要的話題钱反。

讓我們深入探討下性能驼修,這是一個(gè)真正能從代碼審查中獲益的方面殿遂。

系統(tǒng)對(duì)性能方面的非功能性需求應(yīng)當(dāng)同所有架構(gòu)、設(shè)計(jì)的領(lǐng)域一樣被置于重要位置乙各。無(wú)論你是開(kāi)發(fā)只容許納秒級(jí)延時(shí)的低延遲交易系統(tǒng)墨礁,還是管理“待辦事項(xiàng)”的手機(jī)應(yīng)用,你都應(yīng)該了解用戶所認(rèn)為的“太慢”耳峦。

在考慮我們是否需要就代碼性能進(jìn)行代碼審查之前恩静,我們應(yīng)該問(wèn)自己幾個(gè)關(guān)于具體需求是什么的問(wèn)題。雖然一些應(yīng)用確實(shí)不需要考慮每毫秒都花費(fèi)在哪里蹲坷,對(duì)于大部分應(yīng)用驶乾,花費(fèi)幾個(gè)小時(shí)的折騰進(jìn)行優(yōu)化來(lái)獲得的些許CPU下降的價(jià)值也是有限的,但有些地方還是審查者可以檢查一下的循签,進(jìn)而確保代碼不會(huì)有一些常見(jiàn)可避免的性能缺陷级乐。

這段代碼是否有硬性的性能需求?

接受審查的代碼是否涉及之前發(fā)布的服務(wù)等級(jí)協(xié)議(SLA)县匠?或這個(gè)需求本身有特別的性能需求风科?

如果代碼導(dǎo)致“登錄頁(yè)面加載太慢”,那原始的開(kāi)發(fā)者需要找出合適的加載時(shí)間是多久乞旦,不然審查者或作者本人如何確保改進(jìn)后的速度足夠快贼穆?

如果有硬性的需求,是否有測(cè)試能證明滿足了該需求兰粉?任何注重性能的系統(tǒng)應(yīng)該就性能提供自動(dòng)化測(cè)試故痊,這能確保發(fā)布的SLA達(dá)到預(yù)期(如所有訂單請(qǐng)求要在10毫秒內(nèi)處理)。沒(méi)有這些玖姑,你只能依靠你的用戶來(lái)告訴你沒(méi)有達(dá)到對(duì)應(yīng)的SLA愕秫。這不僅是一種糟糕的用戶體驗(yàn),還會(huì)帶來(lái)原本可避免的罰金和支出焰络。

這個(gè)修復(fù)或新增的功能是否會(huì)反向影響到任何現(xiàn)存的性能測(cè)試結(jié)果

如果你定期運(yùn)行性能測(cè)試或有測(cè)試套件可以按需運(yùn)行它們戴甩,那你就需要檢查新的代碼是否使得性能關(guān)鍵區(qū)域的系統(tǒng)性能有所下降。這可以是一個(gè)自動(dòng)化的流程舔琅,但由于在持續(xù)集成環(huán)境中更常運(yùn)行單元測(cè)試而不是性能測(cè)試等恐,所以值得特別指出可以在代碼審查中檢查這項(xiàng)。

調(diào)用外部的服務(wù)或應(yīng)用的代價(jià)是昂貴的

任何通過(guò)網(wǎng)路來(lái)使用外部系統(tǒng)的方式通常會(huì)比沒(méi)有很好優(yōu)化的方法有更差的性能备蚓】问撸考慮以下幾點(diǎn):

調(diào)用數(shù)據(jù)庫(kù):最壞的情況是問(wèn)題隱藏在系統(tǒng)抽象中,如關(guān)系對(duì)象映射(ORM)中郊尝。但是在代碼審查中你應(yīng)該可以找到常見(jiàn)的導(dǎo)致性能問(wèn)題的問(wèn)題二跋,如在循環(huán)中逐個(gè)調(diào)用數(shù)據(jù)庫(kù),一種情況就是加載ID列表之后流昏,再在數(shù)據(jù)庫(kù)中逐個(gè)查詢ID對(duì)應(yīng)的每條數(shù)據(jù)扎即。

不必要的網(wǎng)絡(luò)調(diào)用:就像數(shù)據(jù)庫(kù)一樣吞获,遠(yuǎn)程服務(wù)有時(shí)也會(huì)被過(guò)度使用,原來(lái)只要一個(gè)遠(yuǎn)程調(diào)用就可實(shí)現(xiàn)的谚鄙,或者可以使用批量或緩存防止昂貴網(wǎng)絡(luò)調(diào)用的各拷,卻使用多個(gè)遠(yuǎn)程調(diào)用來(lái)實(shí)現(xiàn)。再次強(qiáng)調(diào)闷营,像數(shù)據(jù)庫(kù)一樣烤黍,有時(shí)抽象類會(huì)隱藏調(diào)用遠(yuǎn)程API的方法。

移動(dòng)或可穿戴應(yīng)用過(guò)于頻繁地調(diào)用后端程序:這基本上和“不必要的網(wǎng)絡(luò)調(diào)用”相同傻盟,但是在移動(dòng)設(shè)備上會(huì)產(chǎn)生其他問(wèn)題速蕊,這不僅會(huì)產(chǎn)生不必要的調(diào)用后端使得性能變差,還會(huì)更快地消耗電量甚至導(dǎo)致用戶的金錢支出娘赴。

有效且高效地使用資源

代碼是否用鎖來(lái)控制共享資源的訪問(wèn)规哲?這是否會(huì)導(dǎo)致性能降低或死鎖?

鎖是一個(gè)性能開(kāi)銷大戶诽表,并在多線程環(huán)境中很難理清唉锌。考慮使用以下模式:?jiǎn)尉€程寫或修改值关顷,其余線程只讀糊秆,或使用無(wú)鎖算法武福。

是否存在內(nèi)存泄露议双?Java中一些常見(jiàn)的原因會(huì)是:可變的靜態(tài)字段,使用ThreadLocal變量和使用類加載器捉片。

是否存在內(nèi)存無(wú)限增長(zhǎng)平痰?這個(gè)和內(nèi)存泄露不同,內(nèi)存泄漏是指無(wú)用的對(duì)象不能被垃圾回收器回收伍纫。但對(duì)于任何語(yǔ)言宗雇,就算是沒(méi)有垃圾回收的語(yǔ)言,也能創(chuàng)建無(wú)限變大的數(shù)據(jù)結(jié)構(gòu)莹规。作為審查者赔蒲,如果你看見(jiàn)新的變量不斷被加到list或map中,你就要問(wèn)下良漱,這個(gè)list或map什么時(shí)候失效或清除無(wú)用數(shù)據(jù)舞虱。

代碼是否關(guān)閉了連接或數(shù)據(jù)流?關(guān)閉連接或文件母市、網(wǎng)絡(luò)數(shù)據(jù)流很容易會(huì)被忘記矾兜。當(dāng)你審查別人代碼時(shí),如果使用到文件患久、網(wǎng)絡(luò)或數(shù)據(jù)庫(kù)連接椅寺,就要確保它們被正確地關(guān)閉了浑槽。

資源池是否配置正確?針對(duì)一個(gè)環(huán)境的最佳配置取決于很多因素返帕,所以作為審查者你很難馬上知道像數(shù)據(jù)庫(kù)連接池大小是否正確等這些問(wèn)題桐玻。但是有一些是你一眼就可以看出來(lái)的,像資源池是否太芯S(比如大小設(shè)置為1)或太大(如數(shù)百萬(wàn)線程)畸冲。如果無(wú)法確定,就從默認(rèn)值開(kāi)始观腊。沒(méi)有使用默認(rèn)值的就需要提供一定的測(cè)試或計(jì)算來(lái)證明這么配置的合理性邑闲。


審查者可以輕松找出的警告信號(hào):
一些代碼一眼就能看出存在潛在性能問(wèn)題。這依賴于所使用的語(yǔ)言和類庫(kù)梧油。

  • 反射苫耸,Java的反射比正常調(diào)用要慢。如果你在審查含有反射的代碼儡陨,你就要問(wèn)下是否必須使用它褪子。
  • 超時(shí),當(dāng)你審查代碼時(shí)骗村,你可能不知道一個(gè)操作合適的超時(shí)時(shí)間嫌褪,但是你要想一下“如果超時(shí)了,會(huì)對(duì)系統(tǒng)其他部分造成什么影響胚股?”笼痛。作為審查者你應(yīng)該考慮最壞的情況:當(dāng)發(fā)生5分鐘的延時(shí),應(yīng)用是否會(huì)阻塞琅拌?如果超時(shí)時(shí)間設(shè)置成1秒鐘最壞的情況會(huì)是怎么樣的缨伊?如果代碼作者不能確定超時(shí)長(zhǎng)度,你作為審查者也不知道一個(gè)選定的時(shí)間的好壞进宝,那么是時(shí)候找一個(gè)理解這其中影響的人參與代碼審查了刻坊。
  • 并行,代碼是否使用多線程來(lái)運(yùn)行一個(gè)簡(jiǎn)單的操作党晋?這樣是否花費(fèi)了更多的時(shí)間以及復(fù)雜度而并沒(méi)有提升性能谭胚?如果使用現(xiàn)代化的Java,那其中潛在的問(wèn)題相較于顯示創(chuàng)建線程中的問(wèn)題更不容易被發(fā)現(xiàn):代碼是否使用Java 8新的并行流計(jì)算但并沒(méi)有從并行中獲益未玻?比如灾而,在少量元素上使用并行流計(jì)算,或者只是運(yùn)行非常簡(jiǎn)單的操作深胳,這可能比在順序流上運(yùn)算還要慢绰疤。

正確性

這些不一定影響系統(tǒng)的性能,但是它們與多線程環(huán)境運(yùn)行關(guān)系密切舞终,所以和這個(gè)主題有關(guān):
代碼是否使用了正確的適合多線程的數(shù)據(jù)結(jié)構(gòu)轻庆。

代碼是否存在競(jìng)態(tài)條件(race conditions)癣猾?多線程環(huán)境中代碼非常容易造成不明顯的競(jìng)態(tài)條件。作為審查者余爆,可以查看不是原子操作的get和set纷宇。

代碼是否正確使用鎖?和競(jìng)態(tài)條件相關(guān)蛾方,作為審查者你應(yīng)該檢查被審代碼是否允許多個(gè)線程修改變量導(dǎo)致程序崩潰像捶。代碼可能需要同步、鎖桩砰、原子變量來(lái)對(duì)代碼塊進(jìn)行控制拓春。

代碼的性能測(cè)試是否有價(jià)值?很容易將小型的性能測(cè)試代碼寫得很糟糕亚隅,或者使用不能代表生產(chǎn)環(huán)境數(shù)據(jù)的測(cè)試數(shù)據(jù)硼莽,這樣只會(huì)得到錯(cuò)誤的結(jié)果。

緩存:雖然緩存是一種能防止過(guò)多高消耗請(qǐng)求的方式煮纵,但其本身也存在一些挑戰(zhàn)懂鸵。如果審查的代碼使用了緩存,你應(yīng)該關(guān)注一些常見(jiàn)的問(wèn)題行疏,如匆光,不正確的緩存失效方式。

代碼級(jí)優(yōu)化

對(duì)大部分并不是要構(gòu)建低延時(shí)應(yīng)用的機(jī)構(gòu)來(lái)說(shuō)酿联,代碼級(jí)優(yōu)化往往是過(guò)早優(yōu)化终息,所以首先要知道代碼級(jí)優(yōu)化是否必要。
代碼是否在不需要的地方使用同步或鎖操作货葬?如果代碼始終運(yùn)行在單線程中采幌,鎖往往是不必要的劲够。
代碼是否可以使用原子變量替代鎖或同步操作震桶?
代碼是否使用了不必要的線程安全的數(shù)據(jù)結(jié)構(gòu)?比如是否可以使用ArrayList替代Vector征绎?
代碼是否在通用的操作中使用了低性能的數(shù)據(jù)結(jié)構(gòu)蹲姐?如在經(jīng)常需要查找某個(gè)特定元素的地方使用鏈表。
代碼是否可以使用懶加載并從中獲得性能提升人柿?
條件判斷語(yǔ)句或其他邏輯是否可以將最高效的求值語(yǔ)句放在前面來(lái)使其他語(yǔ)句短路柴墩?
代碼是否存在許多字符串格式化?是否有方法可以使之更高效凫岖?
日志語(yǔ)句是否使用了字符串格式化江咳?是否先使用條件判斷語(yǔ)句校驗(yàn)了日志等級(jí),或使用延遲求值哥放?

簡(jiǎn)單的代碼即高效的代碼

Java代碼中有一些簡(jiǎn)單的東西可以供審查者尋找歼指,這些會(huì)使JVM很好地替你優(yōu)化你的代碼:
短小的方法和類爹土。
簡(jiǎn)單的邏輯,即消除嵌套的條件或循環(huán)語(yǔ)句踩身。

你在構(gòu)建一個(gè)安全胀茵、穩(wěn)固的系統(tǒng)所花費(fèi)的精力,和花在其他特性上的一樣挟阻,取決于項(xiàng)目本身琼娘,項(xiàng)目運(yùn)行的地方、它使用的用戶附鸽、需要訪問(wèn)的數(shù)據(jù)等脱拼。我們現(xiàn)在著重看一些你可能在代碼審查時(shí)關(guān)注的地方。

盡可能使用自動(dòng)化

有驚人數(shù)量的安全檢查可以被自動(dòng)化坷备,而不需要人工干預(yù)挪拟。安全測(cè)試不一定要啟動(dòng)所有系統(tǒng)進(jìn)行完整的滲透測(cè)試,一些問(wèn)題可以在代碼級(jí)就能被發(fā)現(xiàn)击你。

常見(jiàn)問(wèn)題如SQL注入或跨站腳本可以在持續(xù)集成環(huán)境通過(guò)相應(yīng)工具檢查出玉组。你也能通過(guò)OWASP依賴檢測(cè)工具自動(dòng)化檢查你依賴中已知的漏洞。

但是有時(shí)也需要“看情況”丁侄,對(duì)有的校驗(yàn)?zāi)憧梢院?jiǎn)單回答“是”或“否”惯雳,有時(shí)你需要一個(gè)工具指出潛在的問(wèn)題,之后再由人工來(lái)決定這個(gè)是否需要解決鸿摇。這也正是Upsource真正的閃光點(diǎn)石景。Upsource顯示代碼檢查結(jié)果,審查者可以利用這些來(lái)決定代碼是否需要改動(dòng)或還可以接受目前的情況拙吉。

理解你用到的依賴

第三方類庫(kù)是侵蝕系統(tǒng)安全并引起漏洞的一個(gè)途徑潮孽。當(dāng)審查代碼時(shí)至少你要檢查是否引入了新的依賴(如第三方類庫(kù))。如果你還沒(méi)有自動(dòng)化檢查漏洞筷黔,你應(yīng)該檢查新引入的類庫(kù)中已知的問(wèn)題往史。

你也應(yīng)該嘗試著最小化每個(gè)類庫(kù)的版本,當(dāng)然如果其他依賴有一個(gè)額外的間接依賴佛舱,這點(diǎn)可能達(dá)不到椎例。但最簡(jiǎn)單的最小化自己代碼暴露在他人代碼的(通過(guò)類庫(kù)或服務(wù))安全問(wèn)題中的方法有:

盡可能使用源碼并理解它的可信度。

使用你所能得到的質(zhì)量最高的類庫(kù)请祖。
追蹤你在何處使用了什么订歪,當(dāng)新的漏洞出現(xiàn),你可以查看你受影響的程度肆捕。

檢查是否新的路徑和服務(wù)需要認(rèn)證

無(wú)論你開(kāi)發(fā)web應(yīng)用刷晋、提供web服務(wù)或一些其他需要認(rèn)證的API,當(dāng)你增加一個(gè)新的URI或服務(wù)時(shí),你應(yīng)該確保它不能在沒(méi)有認(rèn)證的情況下被訪問(wèn)(假設(shè)認(rèn)證是你系統(tǒng)的需求)眼虱。你只要簡(jiǎn)單地檢查代碼的開(kāi)發(fā)者寫了合適的測(cè)試用例來(lái)展示進(jìn)行了認(rèn)證或舞。

你應(yīng)該不只針對(duì)使用用戶名和密碼的人類用戶來(lái)考慮認(rèn)證。其他系統(tǒng)或自動(dòng)化流程來(lái)訪問(wèn)你的應(yīng)用或服務(wù)也會(huì)需要認(rèn)證蒙幻。這可能影響你們系統(tǒng)中對(duì)“用戶”的定義映凳。

數(shù)據(jù)是否需要加密

當(dāng)你保存一些數(shù)據(jù)到磁盤或通過(guò)線纜傳輸,你需要了解數(shù)據(jù)是否應(yīng)該被加密邮破。顯然密碼永遠(yuǎn)不應(yīng)該是簡(jiǎn)單文本诈豌,但是有諸多其他情況數(shù)據(jù)需要加密。如果被審查的代碼通過(guò)線纜來(lái)傳送數(shù)據(jù)或保存在某地或以其他方式離開(kāi)你的系統(tǒng)抒和,且你不知道它是否應(yīng)該被加密矫渔,嘗試詢問(wèn)下你組織中可以回答這個(gè)問(wèn)題的人。

密碼是否被很好地控制摧莽?

這里的密碼包含密碼(如用戶密碼庙洼、數(shù)據(jù)庫(kù)密碼或其他系統(tǒng)的密碼)、秘鑰镊辕、令牌等等油够。這些永遠(yuǎn)不應(yīng)該存放在會(huì)提交到源碼控制系統(tǒng)的代碼或配置文件中,有其他方式管理這些密碼征懈,例如通過(guò)密碼服務(wù)器(secret server)石咬。當(dāng)審查代碼時(shí),要確保這些密碼不會(huì)悄悄進(jìn)入你的版本控制系統(tǒng)中卖哎。

代碼的運(yùn)行是否應(yīng)該被日志記錄或監(jiān)控鬼悠?是否正確地使用?

日志和監(jiān)控需求因各個(gè)項(xiàng)目而不同亏娜,一些需要合規(guī)焕窝,一些擁有比別人嚴(yán)格的行為、事件日志規(guī)范维贺。如果你有規(guī)章規(guī)定哪些需要記錄日志它掂,何時(shí)、如何記錄幸缕,那么作為代碼審查者你應(yīng)該檢查提交的代碼是否滿足要求群发。如果你沒(méi)有固定的規(guī)章,那么就考慮:

代碼是否改變了數(shù)據(jù)(如增刪改操作)发乔?是否應(yīng)該記錄由誰(shuí)何時(shí)改變了什么?

代碼是否涉及關(guān)鍵性能的部分雪猪?是否應(yīng)該在性能監(jiān)控系統(tǒng)中記錄開(kāi)始時(shí)間和結(jié)束時(shí)間栏尚?

每條日志的日志等級(jí)是否恰當(dāng)?一個(gè)好的經(jīng)驗(yàn)法則是“ERROR”觸發(fā)一個(gè)提示發(fā)送到某處只恨,如果你不想這些消息在凌晨3點(diǎn)叫醒誰(shuí)译仗,那么就將之降級(jí)為“INFO”或“DEBUG”抬虽。當(dāng)在循環(huán)中或一條數(shù)據(jù)可能產(chǎn)生多條輸出的情況下,一般不需要將它們記錄到生產(chǎn)日志文件中纵菌,它們更應(yīng)該被放在“DEBUG”級(jí)別阐污。

記得叫上專家

安全是個(gè)很大的話題,大到足以讓你的公司聘請(qǐng)技術(shù)安全專家咱圆。我們有安全專家就可以獲得他們的幫助笛辟,如,邀請(qǐng)他們參加代碼審查序苏,或邀請(qǐng)他們?cè)趯彶榇a時(shí)和我們結(jié)對(duì)手幢。如果這個(gè)無(wú)法實(shí)現(xiàn),我們可以充分學(xué)習(xí)我們系統(tǒng)的環(huán)境忱详,來(lái)理解我們有哪種安全需求(面向內(nèi)部的企業(yè)級(jí)應(yīng)用和面向客戶的網(wǎng)頁(yè)應(yīng)用有不同的標(biāo)準(zhǔn))围来,所以我們可以更好地理解我們應(yīng)該在代碼審查中看什么。


代碼審查是一個(gè)很好的方式匈睁,不僅確保了代碼質(zhì)量和一致性监透,也在團(tuán)隊(duì)中或團(tuán)隊(duì)間分享了項(xiàng)目知識(shí)。即使你已經(jīng)自動(dòng)化了基礎(chǔ)的校驗(yàn)航唆,還有許多不同代碼才漆、設(shè)計(jì)的方面需要考慮。代碼審查工具佛点,如Upsource醇滥,通過(guò)在每個(gè)代碼提交的檢查中高亮可疑的代碼并分析哪些問(wèn)題已經(jīng)被修復(fù),新引入哪些問(wèn)題超营,可以幫你定位一些潛在的問(wèn)題鸳玩。工具也可以簡(jiǎn)化流程,因?yàn)樗峁┝艘粋€(gè)平臺(tái)來(lái)討論設(shè)計(jì)和代碼實(shí)現(xiàn)演闭,也可以邀請(qǐng)審查者不跟、作者和其他相關(guān)人員參加討論直到達(dá)成共識(shí)。

最后米碰,團(tuán)隊(duì)需要花時(shí)間決定代碼質(zhì)量的哪些因素對(duì)他們是重要的窝革,也需要專家人工決定哪些規(guī)則應(yīng)用到各個(gè)代碼審查中,參與到審查中的每個(gè)人都應(yīng)該具備并使用人際交往的技巧吕座,如積極的反饋虐译、談判妥協(xié)以達(dá)到最終的共識(shí),即代碼應(yīng)該怎么樣才“足夠好”可以通過(guò)審查吴趴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末漆诽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌厢拭,老刑警劉巖兰英,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異供鸠,居然都是意外死亡畦贸,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門楞捂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)薄坏,“玉大人,你說(shuō)我怎么就攤上這事泡一〔梗” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵鼻忠,是天一觀的道長(zhǎng)涵但。 經(jīng)常有香客問(wèn)我,道長(zhǎng)帖蔓,這世上最難降的妖魔是什么矮瘟? 我笑而不...
    開(kāi)封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮塑娇,結(jié)果婚禮上澈侠,老公的妹妹穿的比我還像新娘。我一直安慰自己埋酬,他們只是感情好哨啃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著写妥,像睡著了一般拳球。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上珍特,一...
    開(kāi)封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天祝峻,我揣著相機(jī)與錄音,去河邊找鬼扎筒。 笑死莱找,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嗜桌。 我是一名探鬼主播奥溺,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼症脂!你這毒婦竟也來(lái)了谚赎?” 一聲冷哼從身側(cè)響起淫僻,我...
    開(kāi)封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤诱篷,失蹤者是張志新(化名)和其女友劉穎壶唤,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棕所,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闸盔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了琳省。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迎吵。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖针贬,靈堂內(nèi)的尸體忽然破棺而出击费,到底是詐尸還是另有隱情,我是刑警寧澤桦他,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布蔫巩,位于F島的核電站,受9級(jí)特大地震影響快压,放射性物質(zhì)發(fā)生泄漏圆仔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一蔫劣、第九天 我趴在偏房一處隱蔽的房頂上張望坪郭。 院中可真熱鬧,春花似錦脉幢、人聲如沸歪沃。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)沪曙。三九已至,卻和暖如春豆瘫,著一層夾襖步出監(jiān)牢的瞬間珊蟀,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工外驱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留育灸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓昵宇,卻偏偏與公主長(zhǎng)得像磅崭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瓦哎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

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