什么是代碼審查?
代碼審查是確保錯(cuò)誤和錯(cuò)誤在進(jìn)入生產(chǎn)環(huán)境之前被捕獲和修復(fù)的過(guò)程。這通常需要開(kāi)發(fā)人員的參與,他們沒(méi)有直接參與實(shí)施正在審查的代碼的特定部分。代碼審查是更大的質(zhì)量保證過(guò)程的一部分,以確保最終產(chǎn)品完全符合預(yù)期。
除了檢查源代碼的錯(cuò)誤之外,代碼審查是檢查代碼庫(kù)中是否存在最佳實(shí)踐和[反模式的好方法]
為什么代碼審查很重要?
人們經(jīng)常對(duì)各種各樣的事情有不同的看法,尤其是在代碼方面,這完全可以!但是,當(dāng)涉及到生產(chǎn)應(yīng)用程序中使用的代碼庫(kù)時(shí),您需要確保團(tuán)隊(duì)中的所有開(kāi)發(fā)人員在命名策略或架構(gòu)模式方面使用相同的語(yǔ)言。
為什么這很重要?想象一下,A 和 B兩個(gè)開(kāi)發(fā)人員一起編寫應(yīng)用程序。A 喜歡使用全局單例字符串(也稱為[Singleton 模式] )進(jìn)行狀態(tài)管理,而 B 更喜歡使用[State 模式] 。他們?cè)趹?yīng)用程序的不同部分工作,將他們的更改直接提交到共享存儲(chǔ)庫(kù)。
然后愛(ài)麗絲休假幾周離開(kāi)項(xiàng)目,現(xiàn)在鮑勃必須修復(fù)她實(shí)現(xiàn)的功能中的錯(cuò)誤。他看到全局單例字符串,困惑地將其更改為狀態(tài)模式實(shí)現(xiàn),就像他之前實(shí)現(xiàn)的所有功能一樣。
不幸的是,這樣做需要兩倍的時(shí)間來(lái)修復(fù)錯(cuò)誤,因此 B 很快變得惱火和失望。
如果他們從一開(kāi)始就實(shí)施代碼審查流程,A 和 B就會(huì)更快地識(shí)別出風(fēng)格上的差異。他們需要的是一個(gè)對(duì)雙方都有意義的協(xié)作工作流程。
**代碼審查應(yīng)該涵蓋哪些內(nèi)容? **
讓我們來(lái)看看成功的代碼審查應(yīng)該涵蓋哪些內(nèi)容以及審查者應(yīng)該密切關(guān)注代碼的哪些元素的基本輪廓。
在執(zhí)行代碼審查時(shí),審查代碼的人應(yīng)該關(guān)注以下幾點(diǎn):
- 代碼風(fēng)格
- 可讀性
- 圖案
- 建筑學(xué)
無(wú)代碼審查的影響
為什么代碼審查如此重要?如果沒(méi)有代碼審查或代碼審查過(guò)多會(huì)發(fā)生什么?
**1. 可能引入高風(fēng)險(xiǎn)錯(cuò)誤。 **
代碼審查主要用于查找代碼中的錯(cuò)誤。如果代碼審查太少,或者根本沒(méi)有代碼審查,一些錯(cuò)誤很可能會(huì)在不被注意的情況下傳遞到生產(chǎn)中。錯(cuò)誤可能會(huì)導(dǎo)致低風(fēng)險(xiǎn)(例如錯(cuò)誤的 UI)或高風(fēng)險(xiǎn)(例如安全漏洞)。如果沒(méi)有代碼審查,團(tuán)隊(duì)幾乎沒(méi)有工具來(lái)預(yù)測(cè)和評(píng)估此類風(fēng)險(xiǎn)。
**2. 不一致的代碼庫(kù)。 **
就像 A和 B 的例子一樣,人們傾向于喜歡不同的模式和代碼風(fēng)格,并且可能使用不同的方法來(lái)管理狀態(tài)。方法的差異可能會(huì)減慢進(jìn)一步的開(kāi)發(fā)和代碼支持。每次你需要實(shí)現(xiàn)新的東西或修復(fù)一個(gè)錯(cuò)誤時(shí),開(kāi)發(fā)人員都必須花時(shí)間和精力去學(xué)習(xí)一個(gè)新的過(guò)程,從而進(jìn)一步減慢這個(gè)過(guò)程。
3. 總線因素。
[總線因素] 是指與團(tuán)隊(duì)成員之間不共享信息和能力相關(guān)的風(fēng)險(xiǎn)度量。
因此,如果只有一個(gè)人知道項(xiàng)目的特定部分是如何工作的——編寫它的人——并且該人離開(kāi)了項(xiàng)目,你可能需要執(zhí)行另一次代碼審查,甚至一起重寫代碼。
太多的代碼審查
當(dāng)涉及到過(guò)多的代碼審查時(shí),相關(guān)的風(fēng)險(xiǎn)很少,但也有一些缺點(diǎn),可以這么說(shuō)。進(jìn)行大量代碼審查會(huì)導(dǎo)致生產(chǎn)延遲,并可能導(dǎo)致開(kāi)發(fā)人員過(guò)分關(guān)注滿足代碼審查,而不是實(shí)現(xiàn)高級(jí)業(yè)務(wù)目標(biāo)。
歸根結(jié)底,找到黃金中位數(shù)很重要。如果您必須優(yōu)先考慮更快的代碼生產(chǎn),請(qǐng)?jiān)u估與限制代碼審查相關(guān)的風(fēng)險(xiǎn)。
代碼審查清單
代碼審查首先是一個(gè)溝通過(guò)程。和其他任何人一樣,參與其中的每個(gè)人都應(yīng)該感到受到尊重,因?yàn)檫@個(gè)過(guò)程是高效的。因此,要遵循一些簡(jiǎn)單的規(guī)則,使您的代碼審查有用且美觀,同時(shí)還提供有用的反饋。
如果您是執(zhí)行審查的人,請(qǐng)考慮以下代碼審查清單:
**1. 解釋你的意見(jiàn)。 **
在指出錯(cuò)誤時(shí),添加一些解釋,說(shuō)明為什么您認(rèn)為這應(yīng)該被視為錯(cuò)誤。這會(huì)讓你聽(tīng)起來(lái)很自信,也會(huì)幫助代碼的作者在未來(lái)不再犯類似的錯(cuò)誤。
另一方面,可能是你錯(cuò)了。解釋您來(lái)自哪里將有助于鼓勵(lì)討論以在意見(jiàn)有任何差異時(shí)找到最佳解決方案。
2. 包括示例。
有時(shí),很難理解諸如“根據(jù)指南進(jìn)行更改”或“使用 X 模式”之類的消息。對(duì)你來(lái)說(shuō)可能很明顯的事情對(duì)其他人來(lái)說(shuō)可能是一個(gè)完整的謎語(yǔ)。
給出一個(gè)簡(jiǎn)短的例子,說(shuō)明你認(rèn)為最終結(jié)果應(yīng)該是什么樣子,以幫助作者理解你的想法。
3. 指出具體問(wèn)題。
“我不知道這段代碼有什么問(wèn)題,但你可以做得更好”并不是很有幫助。確切地告訴代碼的作者是什么導(dǎo)致了問(wèn)題。是內(nèi)存管理嗎?是代碼風(fēng)格嗎?
確保提供有用的詳細(xì)信息,尤其是在解決方案需要作者進(jìn)一步調(diào)查的情況下。大多數(shù)時(shí)候,當(dāng)代碼沒(méi)有以令人滿意的狀態(tài)提供時(shí),更好的解決方案不會(huì)突然出現(xiàn)在審閱者的腦海中。要求作者進(jìn)一步調(diào)查是可以的,但你應(yīng)該提供一些方向。
代碼審查技巧
人們?cè)诤献鲿r(shí)工作效率更高。“兩個(gè)頭比一個(gè)頭好,”對(duì)吧?這正是為什么,作為審稿人,您應(yīng)該嘗試聽(tīng)起來(lái)友好的原因。保持合作的語(yǔ)氣有助于團(tuán)隊(duì)專注于解決手頭的問(wèn)題,而不是升級(jí)沖突。
以下是一些關(guān)于語(yǔ)氣的代碼審查技巧:
- 避免責(zé)備。
- 不要說(shuō):“你做了壞事”;說(shuō):“這樣做不好,這就是為什么……” 畢竟,誰(shuí)編寫了錯(cuò)誤的代碼并不重要。重要的是這段代碼是否得到修復(fù)。所以專注于評(píng)論代碼而不是開(kāi)發(fā)人員。
- 代碼審查不是性能評(píng)估。
- 簡(jiǎn)單地告訴某人他們不夠好并不能幫助他們變得更好。將代碼審查視為異步結(jié)對(duì)編程過(guò)程的一部分。你不會(huì)告訴你的結(jié)對(duì)編程伙伴他們?cè)诰幋a方面很爛,是嗎?相反,你幫助他們糾正錯(cuò)誤。這種方法也適用于代碼審查。
- 要有同理心。
- 代碼審查評(píng)論充滿批評(píng)可能會(huì)讓人不知所措,即使批評(píng)寫得盡可能友好。當(dāng)你看到好的代碼時(shí),表現(xiàn)出一些同理心和贊美!它可以走很長(zhǎng)的路。當(dāng)開(kāi)發(fā)人員花費(fèi)時(shí)間和精力為團(tuán)隊(duì)和產(chǎn)品做一些有價(jià)值的事情時(shí),值得注意的是!
- 對(duì)進(jìn)一步討論持開(kāi)放態(tài)度。
- 每個(gè)代碼審查評(píng)論都應(yīng)該是可討論的。您可以主動(dòng)聯(lián)系參與該流程的任何人以詳細(xì)說(shuō)明此事或確保您的團(tuán)隊(duì)知道如何與您聯(lián)系。一個(gè)及時(shí)的電話甚至幾條消息都可以節(jié)省大量時(shí)間、減少誤解和痛苦。
誰(shuí)應(yīng)該進(jìn)行代碼審查?
代碼審查過(guò)程中的主要問(wèn)題之一是誰(shuí)應(yīng)該進(jìn)行審查?基本上,有兩種選擇:
- 一名指定人員(通常是高級(jí)開(kāi)發(fā)人員或團(tuán)隊(duì)負(fù)責(zé)人)為團(tuán)隊(duì)中的每個(gè)人執(zhí)行代碼審查。
- 團(tuán)隊(duì)中的每個(gè)人都可以進(jìn)行代碼審查。