日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Code Review 是苦涩但有意思的修行

發(fā)布時(shí)間:2024/9/3 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Code Review 是苦涩但有意思的修行 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡(jiǎn)介:?孤盡,阿里巴巴高級(jí)技術(shù)專(zhuān)家,《阿里巴巴 Java 開(kāi)發(fā)手冊(cè)》、《碼出高效》的作者。本文將分享孤盡老師對(duì)于團(tuán)隊(duì) CodeReview 的一些看法和心得。

前言

最近 CodeReview(代碼評(píng)審,又叫代碼審查,下稱(chēng) CR)心態(tài)相當(dāng)?shù)钠胶?#xff0c;代碼是一個(gè)講道理的東西,是就是,否就否。在 CR 時(shí),溝通特別輕松,問(wèn)題討論也特別聚焦,因?yàn)樗橇炕投ㄏ虻?。CR 的過(guò)程不是恃強(qiáng)凌弱,也不是一言堂,大家看著代碼,當(dāng)是一種靈魂的交流,那么每一次的 CR 也是同事間提升和諧度的一種方式。優(yōu)良的 CR 傳統(tǒng)可以體現(xiàn)團(tuán)隊(duì)溫度,體現(xiàn)高年級(jí)同學(xué)傳幫帶的技術(shù)文化。平時(shí),大家抬頭看 PRD,低頭寫(xiě)代碼,很少有時(shí)間靜心氣閑地交流一下業(yè)務(wù)流程、業(yè)務(wù)邏輯、業(yè)務(wù)未來(lái)擴(kuò)展,在 CR 時(shí),往往可以反復(fù)被討論到。有些問(wèn)題是 CR 階段群智群力發(fā)現(xiàn)的。人的一個(gè)能力,不是解決了問(wèn)題,也不是發(fā)現(xiàn)了問(wèn)題,而是利用某種手段預(yù)知了問(wèn)題。曾經(jīng)有段代碼,我覺(jué)得取反邏輯生澀難懂,反復(fù)修改之后,發(fā)現(xiàn)寫(xiě)代碼的小伙伴是錯(cuò)誤的領(lǐng)會(huì)了業(yè)務(wù)意圖。

提升技術(shù)質(zhì)量、促進(jìn)人才成長(zhǎng)、培養(yǎng)技術(shù)情懷這些口號(hào)我們今天先放一邊,聊聊最近 CR 的切身體會(huì)。CR 不是互相看天書(shū),而是產(chǎn)生天天看書(shū)的感覺(jué),每一段寫(xiě)得好,寫(xiě)得不好的代碼都是一本書(shū),好的代碼希望見(jiàn)賢思齊,差的代碼希望見(jiàn)不賢而內(nèi)自省也??傊?#xff0c;CR 是一種修行,也是一種自我積累,苦澀的是看到慘不忍堵的代碼,心里說(shuō):我去!有意思的是看到優(yōu)雅的代碼,心里也說(shuō):我去!

業(yè)務(wù)跑得這么快,沒(méi)時(shí)間 CR

這是一個(gè)很大的謊言,不要為自己的丑代碼找個(gè)華麗的借口,沒(méi)有時(shí)間好好 CR,總有時(shí)間焦頭爛額地處理故障和投訴。時(shí)間老人是公平的,我一直認(rèn)為某個(gè)同學(xué)在工位上噼里啪啦打字,就是說(shuō)明他干活快,通過(guò)團(tuán)隊(duì)打字比賽,發(fā)現(xiàn)其中 20% 在按 BACKSPACE 鍵。業(yè)務(wù)跑得快,代碼寫(xiě)得快,可能寫(xiě)的是一堆沒(méi)有營(yíng)養(yǎng)甚至是有毒的代碼。我們需要追求的是 CR 的效能,而不是逃避 CR。CR 是一種修行,對(duì)于雙方都是一樣的收獲。因?yàn)槿绻胂蟪梢粋€(gè)攤派任務(wù),抵觸情緒總會(huì)油然而生。業(yè)務(wù)跑得快,也得兩腿是健康的, CR 就是讓業(yè)務(wù)持續(xù)快的一個(gè)小醫(yī)生。要不然,今天沖刺 100 米,明天就嗝 P,這樣的不正常的業(yè)務(wù)節(jié)奏對(duì)公司的中長(zhǎng)遠(yuǎn)發(fā)展肯定是弊大于利。

代碼是講道理的

我覺(jué)得靠燒香來(lái)保佑代碼不出問(wèn)題時(shí),保平安往往也是暫時(shí)的。牛叉的代碼,就是在小流量、單線程沒(méi)有問(wèn)題,在高流量、高并發(fā)時(shí)還是沒(méi)有問(wèn)題,你的限流,你的容災(zāi),你的降級(jí)各種導(dǎo)彈防御系統(tǒng)一樣自動(dòng)打開(kāi)并正確地發(fā)揮價(jià)值。很多人的思維覺(jué)得,代碼只要在場(chǎng)景和邏輯上沒(méi)有問(wèn)題就行,那是因?yàn)橐孤纷叩貌粔蚨?#xff0c;還沒(méi)有碰到鬼。代碼是講道理的,就像有一個(gè)同學(xué)說(shuō) >= 比 > 更加慢,那只是我們的潛意識(shí)猜測(cè),經(jīng)過(guò)深達(dá)編譯層的分析,發(fā)現(xiàn)兩個(gè)指令幾乎是完全一樣。其實(shí)憑我們的想象,那也是一個(gè)位運(yùn)算級(jí)別的操作,從左向右比,如果一處有 1,另一個(gè)沒(méi)有 1,那么前者一定是更大。沒(méi)有無(wú)緣無(wú)故的愛(ài),沒(méi)有無(wú)緣無(wú)故的恨,一切的故障總是代碼的字里行間。我們需要做的,就是讀懂她,用好她,寫(xiě)好她。如果代碼任性闖禍,那么是我們不懂代碼的心思。

每一行代碼的存在是有意義的

更加嚴(yán)格地說(shuō),每一個(gè)字符的存在都應(yīng)該是有意義的。如果某行代碼的存在完全是可有可無(wú)的,這個(gè)時(shí)候,我們考慮過(guò) JVM 的感受嗎?憑白無(wú)故地要編譯這些字節(jié)碼,然后棧進(jìn)棧出的忙活一陣子,然后告訴它,你的勞動(dòng)是沒(méi)有任何價(jià)值的。比如:

Boolean assetFlag = Boolean.true;

這里都已經(jīng)明確地給給出來(lái)顯示的初始值,可是在調(diào)用端,居然還有這樣的判斷:

if ( assetFlag != null && assetFlag == true) {...}

什么情況下為 null 值啊?另外參數(shù)在框架里已經(jīng)做了值的判斷,那么下邊又是 n 行,對(duì)所有參數(shù)重新判斷一遍,是對(duì)我們的代碼有多少不自信,還是對(duì)框架不自信?每一行的代碼,相當(dāng)于生命,它的存在一定是有意義的,一定是能夠被執(zhí)行到并且能夠?yàn)閷?shí)際的業(yè)務(wù)負(fù)責(zé)的。

我們比拼的不是代碼行數(shù)

在 CR 過(guò)程中,發(fā)現(xiàn)有些方法,重復(fù)用到一段邏輯,這段邏輯如果不抽取出來(lái)成為一個(gè)方法,未來(lái)的修改就成了一個(gè)必須多點(diǎn)全部修改的大坑,稍有不慎,容易遺漏。重復(fù)代碼在提交行數(shù)上,似乎挺壯觀的。如果在同樣的效果上,3 行代碼能夠?qū)崿F(xiàn)功能的價(jià)值,就不應(yīng)該用 4 行來(lái)實(shí)現(xiàn)。我們經(jīng)常說(shuō)曬出代碼行數(shù),并非是單純地鼓勵(lì)代碼行數(shù)多,而是提倡大家去寫(xiě)代碼,寫(xiě)優(yōu)質(zhì)的代碼,優(yōu)質(zhì)的代碼一定是少即是多的原則。代碼的實(shí)現(xiàn),不要像魯迅先生說(shuō)的一樣:懶婆娘的裹腳布又臭又長(zhǎng)。

用戶視角的成功與失敗

在交付時(shí),調(diào)用服務(wù)失敗,然后返回前臺(tái)一個(gè)空列表,那么前端業(yè)務(wù)的展示是后臺(tái)數(shù)據(jù)正常,這個(gè)人不擁有數(shù)據(jù)列表,這明明是對(duì)數(shù)據(jù)的一種曲解。所以,后臺(tái)調(diào)用服務(wù)失敗,就應(yīng)該明確告訴前臺(tái),服務(wù)出錯(cuò)了,這個(gè)用戶有沒(méi)有數(shù)據(jù)。系統(tǒng)出錯(cuò)的信息給用戶看,合適嗎?不合適。前后端的用戶交界面上,往往飛著兩類(lèi)信息:錯(cuò)誤碼、錯(cuò)誤信息。這樣夠了嗎?用戶提示需要額外地再給出來(lái),往往根據(jù)不同的錯(cuò)誤碼,有不同的用戶提示,可能是一個(gè)多對(duì)多的關(guān)系。多個(gè)錯(cuò)誤碼,提示給用戶的信息:請(qǐng)輸入必填項(xiàng)。多個(gè)用戶信息,可能也對(duì)應(yīng)一個(gè)錯(cuò)誤碼。一般來(lái)說(shuō)后臺(tái)承包這三者的聯(lián)動(dòng)關(guān)系,json 串推送給前端時(shí),前端拿來(lái)主義即可。

有重復(fù)使用的量一定要找個(gè)地方集中隔離

不管是變量,還是常量,工具類(lèi),如果是多個(gè)地方同時(shí)用到,那么如果硬編碼在代碼或者沉淀在包里,未來(lái)一定是一個(gè)災(zāi)難。比如,一個(gè)組裝 SQL 語(yǔ)句的代碼,到處都是"from"、"where"、"limit",都是這類(lèi)語(yǔ)句直接寫(xiě)死在代碼中,注意問(wèn)題來(lái)了,這些單詞前后都需要加空格。有時(shí)候在復(fù)制粘粘時(shí),發(fā)現(xiàn)少了一個(gè)空格,出現(xiàn)的問(wèn)題,往往是致命的。再比如,一個(gè)互相約定的分隔符“###”,定義在本類(lèi)中 private String,這明顯是兩個(gè)共同遵守的常量,單獨(dú)定義的結(jié)果就是容易造成不匹配。隔離的目的是復(fù)用它,保護(hù)程序地正常運(yùn)行,易于維護(hù)。

單測(cè)沒(méi)必要代碼 CR

單測(cè)有時(shí)候感覺(jué)像是闌尾,有或沒(méi)有感覺(jué)都是無(wú)關(guān)緊急,這是錯(cuò)誤的觀點(diǎn)。單測(cè)感覺(jué)就是一個(gè)任務(wù)。你寫(xiě)單測(cè)了嗎?寫(xiě)了。單測(cè)是否需要 MOCK,是否進(jìn)行邊界值測(cè)試,是否用例覆蓋到業(yè)務(wù)場(chǎng)景,這都也是 CR 的一部分。單測(cè)寫(xiě)得好,BUG 肯定少。需要調(diào)試來(lái)查找錯(cuò)誤時(shí),往往是一種對(duì)異常處理機(jī)制的侮辱

良好的日志和異常機(jī)制,是不應(yīng)該出現(xiàn)調(diào)試的。打日志和拋異常,一定要把上下文給出來(lái),否則,等于在毀滅命案現(xiàn)場(chǎng),把后邊處理問(wèn)題的人,往歪路上帶。別人傳一個(gè)參數(shù)進(jìn)來(lái),發(fā)現(xiàn)是 null,立馬拋出來(lái)一個(gè)參數(shù)異常提示,然后也不返回哪一個(gè)參數(shù)是 null,這在調(diào)用參數(shù)很多的情況下,簡(jiǎn)直就是字謎游戲一樣。到底是拋異常,還是拋錯(cuò)誤碼?我不管拋什么,反正錯(cuò)了什么東西,都應(yīng)該透明出來(lái)。到底是拋受檢異常,還是非受檢異常,我只想說(shuō),沒(méi)有充足的理由,不要亂拋受檢異常。異常拋出時(shí),一定要自己消化干凈,告訴別人說(shuō)我的方法簽名拋的是 AbcException,實(shí)際運(yùn)行中,代碼某個(gè)地方直接拋出 EfgException,這也是不負(fù)責(zé)任的。

多個(gè) return 的語(yǔ)句,概率高的一定先進(jìn)行判定

if(condition1) return; if(condition2) return; if(condition3) return;

那么需要評(píng)估一下 condition 1/2/3 出現(xiàn)概率的大小,概念大的在最前邊,盡可能快地進(jìn)行 return,不需要進(jìn)行后續(xù)無(wú)謂的匹配。不要總覺(jué)得計(jì)算機(jī)跑得快,不差這點(diǎn)蠅頭小利的,這種思維,和《南轅北轍》里的寓義一樣的嗎?

吝嗇空行

感覺(jué)空行是廉價(jià)的,到處亂扔是一種;另一種是感覺(jué)空行是昂貴的,舍不得用,這種情況更多見(jiàn)。50 行代碼沒(méi)有一個(gè)空行,就像英語(yǔ) 50 句話,沒(méi)有任何標(biāo)點(diǎn)符號(hào)一樣。既然標(biāo)點(diǎn)符號(hào)起到隔斷和語(yǔ)義區(qū)分作用,我們的空行不是同一個(gè)道理嗎?在以下情形:

  • 在方法的 return、break、continue 這種斷開(kāi)性語(yǔ)句后必須是空行。
  • 在不同語(yǔ)義塊之間。
  • 循環(huán)之前和之后一般有空行。
  • 命名太隨意

    代碼有兩件事情比較頭疼:命名和循環(huán)。人如其名,如果不是它干的活,名字卻是一副道貌岸然,太容易把人帶偏了,一個(gè)中國(guó)人如果取名叫趙 C,一個(gè)女孩子如果取名叫石敢當(dāng),第一印象生生地給扭曲了。英語(yǔ)不好的同學(xué),要么用錯(cuò)英文單詞,要么翻詞典,整出一個(gè)專(zhuān)八的詞匯,任何人都不認(rèn)得這個(gè)單詞,在 CR 時(shí),還需要打開(kāi)在線翻譯時(shí)的命名,絕對(duì)不是好命名。當(dāng)然如果在線翻譯都翻不出來(lái)的時(shí)候,那更頭疼。如果表意錯(cuò)誤,那更要命。

    注釋是電影的旁白

    電影的旁白:1)信息量大。2)適時(shí)出現(xiàn)。就像 《Star Wars》 里開(kāi)始的一段一樣,如果不交代那些背景,可能進(jìn)入正片是一臉懵逼的。在代碼上不需要寫(xiě)正確的廢話,名字取得好,自然是自解釋的。在嵌套循環(huán)中,或者在復(fù)雜條件分支中,往往是需要講明白的。另外,添加業(yè)務(wù)背景信息,以及執(zhí)行頻率,執(zhí)行條件,甚至維護(hù)者注意點(diǎn),都是注釋的重要理由。識(shí)別到哪里要寫(xiě)注釋,也是一個(gè)對(duì)業(yè)務(wù)的閱讀能力,而不是代碼閱讀能力。

    滿天飛的函數(shù)式編程好嗎?

    不好。如果一個(gè) stream 后邊的調(diào)用超過(guò) 5 個(gè),我覺(jué)得你是為了炫耀,因?yàn)閯e人不敢改這段代碼,體現(xiàn)出來(lái)你的不可替代性。這種 10 行都是函數(shù)式編程的方式,就像讓人在水里憋氣超過(guò) 10 分鐘不能換氣一樣難受,有點(diǎn)缺氧的感覺(jué)。函數(shù)式編程調(diào)試?yán)щy,難于上青天,如果沒(méi)有辦法修改調(diào)試器的話,那只有委屈那些喜歡天馬行空寫(xiě)一串函數(shù)式語(yǔ)句的同學(xué)了。如下圖,個(gè)人反對(duì)這種直接 return 一個(gè)長(zhǎng)鏈路的處理結(jié)果:

    總結(jié)

    以上是生活随笔為你收集整理的Code Review 是苦涩但有意思的修行的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。