一区二区三区在线视频播放_亚洲欧美日韩三级_国内精品福利在线视频_国产高清一区二区三区免费视频




淘寶App出那么大bug,是怎么做Code Review的?

2020-03-28 09:15:37

淘寶App出那么大bug,是怎么做Code Review的?一位阿里技術(shù)專家,說出了真相!

技術(shù)領(lǐng)導(dǎo)力

作者簡介:孤盡,阿里技術(shù)專家,曾出版暢銷書《阿里巴巴Java開發(fā)手冊(cè)》、《碼出高效》,擅長JAVA編程、工程效能提升。

幾天前,淘寶App“內(nèi)測版本彈屏P0級(jí)事故”,把淘寶IOS團(tuán)隊(duì)推到了輿論的風(fēng)口浪尖,許多程序員朋友紛紛質(zhì)疑,你們不做CodeReview的嗎?

說實(shí)在話,小編也很好奇,阿里技術(shù)團(tuán)隊(duì)內(nèi)部究竟是如何做代碼審查的?是不是跟我們一樣流于形式?本文作者,孤盡,介紹了阿里巴巴技術(shù)團(tuán)隊(duì)的代碼審查實(shí)踐,一起來學(xué)習(xí)吧。

正文

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

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

業(yè)務(wù)跑得這么快,沒時(shí)間 Code Review

這是一個(gè)很大的謊言,不要為自己的丑代碼找華麗的借口,沒有時(shí)間好好 CR ,總有時(shí)間焦頭爛額地處理故障和投訴。

時(shí)間老人是公平的,我一直認(rèn)為某個(gè)同學(xué)在工位上噼里啪啦打字,就是說明他干活快,通過團(tuán)隊(duì)打字比賽,發(fā)現(xiàn)其中 20% 在按 BACKSPACE 鍵。業(yè)務(wù)跑得快,代碼寫得快,可能寫的是一堆沒有營養(yǎng)甚至是有毒的代碼。我們需要追求的是 CR 的效能,而不是逃避 CR 。CR 是一種修行,對(duì)于雙方都是一樣的收獲,因?yàn)槿绻胂蟪梢粋€(gè)攤派任務(wù),抵觸情緒總會(huì)油然而生。業(yè)務(wù)跑得快,也得兩腿是健康的, CR 就是保證業(yè)務(wù)持續(xù)跑的快的一個(gè)小醫(yī)生,不正常的業(yè)務(wù)節(jié)奏對(duì)公司的中長遠(yuǎn)發(fā)展肯定是弊大于利。

代碼是講道理的

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

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

更加嚴(yán)格地說,每一個(gè)字符的存在都應(yīng)該是有意義的。如果某行代碼的存在完全是可有可無的,這個(gè)時(shí)候,我們考慮過 JVM 的感受嗎?憑白無故地要編譯這些字節(jié)碼,然后棧進(jìn)棧出的忙活一陣子,然后告訴它,你的勞動(dòng)是沒有任何價(jià)值的。比如,Boolean assetFlag = Boolean.true ; 這里都已經(jīng)明確地給給出來顯示的初始值,可是在調(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ù)

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

用戶視角的成功與失敗

在交付時(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è)用戶有沒有數(shù)據(jù)。系統(tǒng)出錯(cuò)的信息給用戶看,合適嗎?不合適。前后端的用戶交界面上,往往飛著兩類信息:錯(cuò)誤碼、錯(cuò)誤信息。這樣夠了嗎?用戶提示需要額外地再給出來,往往根據(jù)不同的錯(cuò)誤碼,有不同的用戶提示,可能是一個(gè)多對(duì)多的關(guān)系。多個(gè)錯(cuò)誤碼,提示給用戶的信息:請(qǐng)輸入必填項(xiàng)。多個(gè)用戶信息,可能也對(duì)應(yīng)一個(gè)錯(cuò)誤碼。一般來說后臺(tái)承包這三者的聯(lián)動(dòng)關(guān)系, json 串推送給前端時(shí),前端拿來主義即可。

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

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

單測沒必要代碼 Code Review

單測有時(shí)候感覺像是闌尾,有或沒有感覺都是無關(guān)緊急,這是錯(cuò)誤的觀點(diǎn)。單測感覺就是一個(gè)任務(wù)。你寫單測了嗎?寫了。單測是否需要 MOCK ,是否進(jìn)行邊界值測試,是否用例覆蓋到業(yè)務(wù)場景,這都也是 CR 的一部分。單測寫得好, BUG 肯定少。

需要調(diào)試來查找錯(cuò)誤時(shí),往往是一種對(duì)異常處理機(jī)制的侮辱

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

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

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

吝嗇空行

感覺空行是廉價(jià)的,到處亂扔是一種;另一種是感覺空行是昂貴的,舍不得用,這種情況更多見。50 行代碼沒有一個(gè)空行,就像英語 50 句話,沒有任何標(biāo)點(diǎn)符號(hào)一樣。既然標(biāo)點(diǎn)符號(hào)起到隔斷和語義區(qū)分作用,我們的空行不是同一個(gè)道理嗎?在以下情形:1、在方法的 return、break、continue、這樣斷開性語句后必須是空行。2、在不同語義塊之間。3、循環(huán)之前和之后一般有空行。另外,方法和類定義下方就不需要空行了吧。

命名太隨意

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

注釋是電影的旁白

電影的旁白:1)信息量大。2)適時(shí)出現(xiàn)。就像 star war 里,開始的一段一樣,如果不交代那些背景,可能進(jìn)入正片是一臉懵逼的。在代碼上不需要寫正確的廢話,名字取得好,自然是自解釋的。在嵌套循環(huán)中,或者在復(fù)雜條件分支中,往往是需要講明白的。

另外,添加業(yè)務(wù)背景信息,以及執(zhí)行頻率,執(zhí)行條件,甚至維護(hù)者注意點(diǎn),都是注釋的重要理由。識(shí)別到哪里要寫注釋,也是一個(gè)對(duì)業(yè)務(wù)的閱讀能力,而不是代碼閱讀能力。

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

答案是:不好。如果一個(gè) stream 后邊的調(diào)用超過 5 個(gè),我覺得你是為了炫耀,因?yàn)閯e人不敢改這段代碼,體現(xiàn)出來你的不可替代性。這種 10 行都是函數(shù)式編程的方式,就像讓人在水里憋氣超過 10 分鐘不能換氣一樣難受,有點(diǎn)缺氧的感覺。如下圖,反對(duì)這種直接 return 一個(gè)長鏈路的處理結(jié)果:

孤盡說:“親力親為寫代碼,寫穩(wěn)定和優(yōu)質(zhì)的代碼,才能激發(fā)強(qiáng)大生產(chǎn)力”。我們希望通過“文化月”的形式,傳播技術(shù)文化,向代碼致敬。

編程是一門藝術(shù),優(yōu)秀的代碼看起來是優(yōu)雅的,希望在傳承代碼文化的同時(shí)能讓更多開發(fā)者收益,共同用優(yōu)雅的代碼譜寫社會(huì)的未來。

以下文章來源于阿里巴巴中間件 ,作者孤盡

關(guān)閉
精彩放送
一区二区三区在线视频播放_亚洲欧美日韩三级_国内精品福利在线视频_国产高清一区二区三区免费视频
国产精品福利影院| 亚洲高清视频中文字幕| 久久久.com| 国产精品丝袜在线| 亚洲欧美日韩国产综合| 亚洲综合男人的天堂| 午夜精品爽啪视频| 久久er99热精品一区二区| 国产麻豆午夜三级精品| 99视频精品全部免费在线| 91黄色免费观看| 日韩欧美国产一区在线观看| 久久九九久精品国产免费直播| 中文一区二区在线观看| 一卡二卡三卡日韩欧美| 麻豆成人av在线| 91丨九色丨尤物| 欧美精品久久天天躁| 久久久久97国产精华液好用吗| 亚洲人成精品久久久久久 | 丁香婷婷综合网| 97成人超碰视| 日韩视频一区在线观看| 国产人妖乱国产精品人妖| 亚洲精品成人悠悠色影视| 蜜桃久久av一区| 91啪亚洲精品| 久久久不卡网国产精品一区| 亚洲宅男天堂在线观看无病毒| 国产资源在线一区| 欧美视频精品在线| 国产精品狼人久久影院观看方式| 亚洲午夜精品17c| 成人国产亚洲欧美成人综合网 | 日韩av电影天堂| 波多野结衣在线一区| 日韩一级片网址| 亚洲成人你懂的| 99re这里只有精品首页| 久久久综合九色合综国产精品| 亚洲地区一二三色| 91美女片黄在线| 欧美国产亚洲另类动漫| 国内精品视频一区二区三区八戒 | 欧美经典一区二区| 黑人巨大精品欧美黑白配亚洲| 欧美亚洲综合色| 最新热久久免费视频| 国产98色在线|日韩| 欧美r级在线观看| 免费精品视频最新在线| 欧美二区三区的天堂| 亚洲午夜久久久久久久久电影院| av一区二区三区四区| 国产欧美精品一区二区色综合| 另类小说视频一区二区| 欧美理论在线播放| 日日骚欧美日韩| 欧美三区在线观看| 午夜视频在线观看一区二区| 色成年激情久久综合| 国产精品成人在线观看| av日韩在线网站| 亚洲欧美激情一区二区| 一本一道综合狠狠老| 一区二区三区在线影院| 欧美自拍丝袜亚洲| 性做久久久久久免费观看欧美| 欧美日韩在线播放| 青青草原综合久久大伊人精品优势| 欧美日韩激情一区二区三区| 婷婷综合久久一区二区三区| 5858s免费视频成人| 日韩av在线发布| 久久亚洲捆绑美女| 成人久久久精品乱码一区二区三区| 国产欧美日韩另类一区| av不卡一区二区三区| 亚洲影视资源网| 91精品午夜视频| 国产福利一区二区三区视频在线 | 91浏览器在线视频| 视频一区中文字幕| 精品国产一区二区精华| www.亚洲人| 五月激情综合色| 日本一区二区免费在线| 色94色欧美sute亚洲线路一久| 亚洲国产cao| 亚洲精品一区二区三区影院 | 91麻豆精品国产91久久久使用方法| 久久99精品国产.久久久久久 | 国产亚洲人成网站| 欧美最新大片在线看| 久久精品免费观看| 亚洲乱码国产乱码精品精98午夜| 欧美日韩综合不卡| 成人黄页毛片网站| 欧美aaaaa成人免费观看视频| 国产欧美综合在线观看第十页| 91美女蜜桃在线| 国内精品视频一区二区三区八戒| 亚洲人快播电影网| 久久午夜色播影院免费高清| 在线免费不卡视频| 丰满亚洲少妇av| 免费在线看成人av| 夜夜嗨av一区二区三区中文字幕| 精品国精品自拍自在线| 欧美极品xxx| 欧美一区二区三区白人| 91女人视频在线观看| 国产乱子轮精品视频| 日韩国产欧美一区二区三区| 中文字幕一区二区三区在线播放| 日韩午夜激情av| 欧美日本国产一区| 色综合色综合色综合色综合色综合| 久久综合综合久久综合| 视频一区中文字幕国产| 亚洲视频一二区| 国产精品美女久久久久久| 精品国产3级a| 日韩久久精品一区| 666欧美在线视频| 欧美日韩国产经典色站一区二区三区| 成人黄色免费短视频| 国产伦精品一区二区三区免费迷| 免费人成网站在线观看欧美高清| 亚洲综合激情另类小说区| 国产精品福利电影一区二区三区四区| 精品久久一区二区| 亚洲精品一线二线三线| 日韩一级免费观看| 欧美大片国产精品| 欧美xingq一区二区| 欧美电影免费观看高清完整版在线观看 | 国产一区在线观看视频| 免费欧美在线视频| 久久成人免费日本黄色| 美女视频第一区二区三区免费观看网站| 亚洲国产视频一区二区| 亚洲国产美女搞黄色| 午夜久久久久久电影| 日本成人在线电影网| 久久精品99久久久| 久久99久久精品| 国产曰批免费观看久久久| 国产在线精品一区二区三区不卡 | 精品少妇一区二区三区免费观看 | 久久久久国产精品麻豆ai换脸 | 午夜精品福利一区二区蜜股av| 性久久久久久久| 看电视剧不卡顿的网站| 国产在线精品免费av| 成人毛片老司机大片| 欧美亚洲一区二区在线| 欧美麻豆精品久久久久久| 欧美裸体一区二区三区| 日韩精品一区二区三区四区| 国产色婷婷亚洲99精品小说| 18涩涩午夜精品.www| 亚洲另类一区二区| 日韩—二三区免费观看av| 精品在线观看免费| 91在线看国产| 制服丝袜中文字幕一区| 亚洲国产精品天堂| 老鸭窝一区二区久久精品| 国产91丝袜在线播放0| 欧美中文字幕一区| 精品av久久707| 亚洲免费资源在线播放| 日本麻豆一区二区三区视频| 国产电影一区二区三区| 欧美性高清videossexo| 精品久久五月天| 亚洲一卡二卡三卡四卡五卡| 国产在线日韩欧美| 欧美在线|欧美| 国产欧美日韩麻豆91| 亚洲大片精品永久免费| 国产99久久久国产精品潘金网站| 欧美三区在线观看| 国产精品久久久久久久岛一牛影视 | 99视频在线精品| 久久男人中文字幕资源站| 亚洲综合网站在线观看| 国产成人精品三级麻豆| 91精品国产一区二区| 中文字幕综合网| 精品亚洲成a人在线观看 | 久久蜜桃av一区精品变态类天堂 | 久久精品72免费观看| 在线观看亚洲一区| 国产精品美女视频| 国产乱子轮精品视频| 91精选在线观看| 亚洲最新视频在线观看| 大美女一区二区三区|