CodeReview雜談

豆皮範兒發表於2021-09-06

豆皮粉兒們,大家好,又見面啦,今天由位元組跳動的"躬馮"帶來一個 code review 的故事。

作者:躬馮

2020年元旦假期到來的時候,孫總攢了個局,又把當年一起創造過屎山的我們哥仨又聚到一起,名頭是慶祝老劉晉升。

當年bugfix一把梭的老劉,如今在某廠帶了個小十人的團隊,好不威風。藉著這個由頭,大夥們既是有福同享一把,為他道個喜,也是在疲頓的高腦力生活的罅隙中,尋找一次短暫的休憩,分享分享行業見聞和動態,找尋一些共鳴。

我是喜歡這種聚會的,朋友裡面,最不能喝的便是我的這些碼哥們兒,這樣的飯局,往往意味著我不用擔心擺在我面前量酒器裡頭的酒位線是不是又跟大部隊落下了,畢竟可樂還是非常美味的。與此同時,話題總是在是不是要把某個產品拿去祭天,某個線上工單又是什麼玄學因素導致,老婆的鑽石戒指到底是不是智商稅中間打轉,空氣中總是瀰漫著快活的氣息。

這一次,老劉走馬上任,面泛紅光,給大夥一人整了兩瓶啤的,大夥頭一遭見他如此興致,紛紛起鬨道果然人逢喜事精神爽,當年滴酒不沾的劉哥咋也會帶節奏了,沒想到他卻連聲嘆氣,感慨道:“哪有你們想的這麼美,我這是借酒消愁,最近沒一天睡得好的,當了老大才知道,團隊不好帶啊。”

我一邊倒酒,一邊倒是樂了:“幾年沒見,劉哥倒是成了資深凡學大師了。”老劉竟沒否認,嘆了口氣,感慨道:“老孟啊,我剛接手的時候,真的都驚了,你敢信不,這兒連CodeReview都沒有。”

我把酒瓶緩緩放下,神情半信半疑,下意識的回了一句“不會吧?”卻又被另一邊頗有槓精氣質的孫總搶了白,孫總哼笑一聲:“這有啥不敢信的,我之前待的兩個創業團隊可都沒有CodeReview,還不是穩的飛起。你真以為CodeReview有什麼用麼,哦,找個都不知道你程式碼是在幹嘛的同事,花上十分鐘走個過場,就能看出什麼問題?”

“得了吧你!”老劉反駁道:“你那兒多奇葩你不知道嗎?一天上線八次,前端就你一個,你想Review也沒人可以做啊,難不成拉後端那幫搞資料的幫你看你CSS哪邊盒兒模型沒寫對嗎?”

孫總接過我遞給他的啤酒,小抿了了一口:“別瞎說,哪兒有一天上線八次的?我們那邊的CEO是個全棧,強的很好伐?找他完全沒問題,是我自己感覺多此一舉。”頓了一頓,孫總又補充道:“我吧,個人更看重效率,而不是流程。你要說Github上的那些技術型開源專案,做特性和分支管理的時候,搞個CodeReview合情合理,但你說我們業務專案,有啥好Review的,你為了質量跑去搞Review,那測試是幹嘛的?”

我聽到這裡卻有些皺眉,忙打斷:“大哥,CodeReview可不僅僅是為了質量,也有出於安全方面的考量,當年沸沸揚揚的ANTD聖誕節雪花事件你忘了嗎?不推CodeReview短期看可能的確不會出什麼問題,但長期看肯定是有安全風險的。”

“安全風險,那是公司安全部門的事兒。各種安全掃描,Lint規則,不知道用麼?”老孫一邊說一邊拿起一根串兒,並不服氣。又不耐煩的發問:“不是,我就好奇你們Review都Review啥啊,還真一行行看程式碼麼?”

“怎麼就不能一行行看了?”老劉認真起來:“我說我們們專業點行不行?去年Google不是推了個CodeReview規範,該都看了吧?人家上面寫的清清楚楚——任何可以提升程式碼質量的內容,你都可以做出評論!是吧,老孟?你來說說,你們位元組那兒,這方面是不是很嚴格?”

“位元組嘛——”我故意拉長了聲音:“還是很優秀滴。”見兩人都是一副不耐煩的表情。我神祕一笑,忙不迭解釋:“相比其他我待過的團隊,位元組技術氛圍更濃厚一些。目前我們的確是嚴格執行Google的那套CR規範的。不過呢,位元組很扁平,並沒有誰來帶著我們做,你可以理解為,這種規範都是大家自發的。”見兩人一副果不其然的表情點點頭,我又小聲補充了一句:“但…其實我們也有過無CR的階段…”

“哈?”老劉完全沒想到竟然引來了敵軍。

“來來來,我們先走一個。”我拍拍老劉的肩膀,忽悠著大家幹了一杯,啤酒下肚,我才慢悠悠解釋道:“我們專案在beta測試之前都是不用CR的,那個時候產品不會觸達使用者,開發更加註重效率,公司有幾個口號嘛,其中就有:務實敢為、始終創業。那時無CR還是具有一定的合理性的,所以我們便大膽執行了。當然,這也是大夥一致認同的,這個狀態持續到專案上線才停止。”

老劉鬆了口氣,點點頭道:“產品都還沒上線,也算可以理解吧。”

“專案上線,常規的組內Review水到渠成的建立起來,除此之外,我們週會還有個分享性質的CodeReview,一週一次,倒是以提交者講讀為主,Review倒是次要了。”

“至於剛剛孫總的問題嘛,Re啥呢?”我皺起眉頭稍作思索,才繼續解釋:“其實剛剛開始的時候我也挺困惑的,我看別人的程式碼總感覺一水的牛逼,尤其位元組跳動你知道吧,個個兒大神級別,我哪兒能看出人家的問題啊。不過跟著大神的好處就是,你能進步得特別快,我雖然一開始提出不了什麼問題,但是跟著眼瞅了一個月,也學了不少東西,比如大神Review程式碼的思路和重點,漸漸地,我也能抓幾個屎橛子出來了哈哈哈哈。”

老孫沒好氣:“你戲可是真多。”

我給說的有點不好意思,撓了撓頭道:“你也不能怪我,的確很多諸如最新的語法糖啦,效能優化些許的寫法啦,我每次評起來都挺猶豫的,一方面又想讓別人知道,一方面又覺得其實也沒引起bug,是不是挺沒必要的。”

老劉咂咂嘴:“嗨,至於麼,這事兒吧就別太多心理負擔,有好的寫法就上嘛,三人行必有我師沒聽過麼?也是互相學習嘛。”說到這兒,老劉似乎又有些羨慕,轉身對著孫總道:“我現在也不要求我們組的小弟弟們能這麼一板一眼,畢竟水平在那兒,還是有差距的,我拉了幾個老Coder放了Reviewer的許可權,團隊任何人上線就要找他們其中的一個,出問題了一起背鍋。”

我點點頭“也倒也是個挺常見的做法,挺好的。雖然放棄了整個團隊互相學習的機會,但是至少質量和安全有所保證了。也能幫助新人迅速成長,針對性更強。”

老劉也點點頭,似乎是感覺自己說服了孫總,舉起酒杯試探道:“怎麼樣孫總,回頭給你們專案搞個Review試試?”

孫總目光停在手裡的酒杯上,歪嘴笑了,緩緩道來:“我倒沒想這些,我的專案嘛,一個人,著實沒有必要,只是我聽著你們說著,便想到我們們仨剛工作那會,老黃是怎麼搞的CodeReview。你們還記得嗎?”

“嘿,老黃每週都會定週五下午的會議室,他到有理,說是我們到了週五就心不在焉,不如組織起來一起Review程式碼,那會可嚴肅了,當週提交的程式碼都打到投影上,他還單獨開了個Excel檔案,每個人提的問題,問題的檔名和行數,都一行行的記在裡頭。”

老劉激動起來:“對對對,我那時候還跑去單獨找過你,你還記得不。”老劉對著孫總詢問。

“你跑來找我,央求我提前Review你的程式碼,把錯提前挑出來,然後留兩行不改,等到會議的時候再提。以免你的錯誤太多,面子上掛不住。”

我聽的滿頭問號,“不是,我咋不知道呢?怪不得那時候你們錯都那麼少,一到我就十幾條十幾條的提。”

“噗嗤…”

“哈哈哈哈…不是,老孟,你那時候的程式碼寫的那是真的臭啊…….”

“哎我說你們至於嗎?”我有點哭笑不得。

孫總拉住我:“我說,孟哥,我們別在意這些細節,你聽我說,我就是感慨啥呢,我就是覺得吧,這麼多年了,我早就不記得你們都在老黃的評審會上給我提了什麼錯了,可我還是能記得我們坐在一起CodeReview的畫面,還能記得昏昏欲睡的下午,是吧,那個關了窗拉上簾以後臭氣熏天的會議室,嘿嘿,就感覺吧,感覺吧,其實挺有意思的。你想嘛,人家老師醫生公務員律師,誰知道什麼程式碼Review,就我們碼農,誒,搞得還挺像那麼一回事兒的,挺有儀式感的。”孫總感慨了半晌,又悠悠地說:“其實那時候老黃挺好的,我的程式碼他可是真的一行行的審啊。”

“老黃現在在哪兒混啊?”

“不知道,他也該三十五了,估計退休了吧。”孫總一邊回答老劉的提問一邊壞笑起來。

“這可是你說的。”老劉像抓住了什麼把柄。

“老劉你這人,有沒有意思啊,來來來,趕緊喝酒吧。我這瓶可就沒了。”

….

我又被兩個大哥忽悠到舉起杯,一飲而盡,咕嚕咕嚕嚥下冰啤的恍惚間,我的確有些閃回,想到這些年裡的一張張面孔,想到了許多人兒,想起他們跑到我的面前跟我說,老孟你幫我Review一下程式碼的樣子,我甚至想到2008年我剛剛開始寫HTML頁面的時候,中國網際網路生態正擺了怎樣的姿勢來為後來的一躍而起做好準備的。

那時候的我們就是這樣一期一會地從簡單的一行行div和span開始的CodeReview。一直到今天,CodeReview成為了一種講述,一種詮釋,一種呼喚,一種膜拜。他像一個安全帶一樣把我們和我們的業務、專案、團隊,公司,牢牢繫結,以保證我們不至於因為速度太快而被離心力丟擲去。這個頗為簡單卻異常堅定的行動,背後漸漸聚集起了龐大的能量。

如今,我們在自己時代的BGM中,已經走得很遠了,我們國家開發者的身影也時常出現在Github,在一次次的CR中與全球的開發者對話,盛世呈現出了令人動容的神態,這是所有提交者的偉績。

2020終於過去了,2021的開端,有些不幸—— 因為老劉似乎喝大了,孫總也不太樂觀。新一週的上線又風風火火的開始了,幾條CodeReview評論我還沒來得及閱讀,卻花了些許時間記錄這些。

一方面,是感懷這些酒量平平無奇的開發者們,他們維繫著我們的程式碼庫健康茁壯的生長;另一方面,也是感謝出現在我生命中的每個Reviewer,他每個人都曾帶給我的力量。CodeReview是簡單的,卻是精美的。

希望新年裡,我們每個人都能從像這樣的簡單事情中。

找到知識,找到生活,找到自己。