編者按:本文來(lái)源創(chuàng)業(yè)邦專欄InfoQ,作者David Lloyd。
作為開(kāi)源項(xiàng)目的積極貢獻(xiàn)者,我發(fā)現(xiàn)處理代碼評(píng)審問(wèn)題是一件很浪費(fèi)時(shí)間的事情,特別是當(dāng)代碼評(píng)審帶有負(fù)面、主觀或爭(zhēng)論性的東西時(shí)。當(dāng)項(xiàng)目維護(hù)者不喜歡貢獻(xiàn)者提交的代碼,經(jīng)常會(huì)出現(xiàn)這種情況。在最好的情況下,這種代碼評(píng)審策略會(huì)導(dǎo)致無(wú)意義的爭(zhēng)論。在最壞的情況下,它會(huì)阻礙項(xiàng)目貢獻(xiàn),形成一個(gè)充滿敵意和精英主義的文化。
代碼評(píng)審應(yīng)該是客觀和簡(jiǎn)潔的,并盡可能面向確定性。代碼評(píng)審不是關(guān)于政治或情感上的爭(zhēng)論,而是一個(gè)技術(shù)問(wèn)題。代碼評(píng)審的目標(biāo)應(yīng)該是不斷進(jìn)取,提升項(xiàng)目及其參與者的水平。提交的代碼應(yīng)該根據(jù)代碼的優(yōu)點(diǎn)而不是對(duì)提交者的意見(jiàn)來(lái)評(píng)判。
代碼評(píng)審策略以下是一些代碼評(píng)審策略,作為項(xiàng)目維護(hù)者,如果你看到不喜歡的代碼,可以嘗試應(yīng)用這些評(píng)審策略。
1. 把拒絕變成問(wèn)問(wèn)題糟糕的評(píng)審:“如果你這樣改,就不可能……”。(這顯然有點(diǎn)夸張,真的不可能嗎?)好的評(píng)審:“如果你這樣改,那該怎么……?”
2. 避免夸大其詞簡(jiǎn)單一點(diǎn),把你的顧慮和問(wèn)題說(shuō)出來(lái),這樣有助于你獲得期望的結(jié)果。
糟糕的評(píng)審:“這個(gè)變更對(duì)性能影響很大。”好的評(píng)審:“這樣改的話性能會(huì)比之前低一些,你有做過(guò)測(cè)試嗎?”更好的評(píng)審:“我會(huì)準(zhǔn)備一些數(shù)據(jù)來(lái)驗(yàn)證一下這樣改之后速度不會(huì)比之前慢?!被蛘哌@樣:“這個(gè)變更把之前的 O(n) 變成了 O(n2),不會(huì)影響性能嗎?”
3. 把帶有諷刺意味的評(píng)語(yǔ)留給你自己有些想法最好把它爛在肚子里,如果你不想讓人覺(jué)得你粗魯,最好不要把這些想法說(shuō)出來(lái)。
“我覺(jué)得這個(gè)變更太糟糕了,它會(huì)毀了所有東西的?!薄澳阏娴挠X(jué)得軟件工程這個(gè)行業(yè)適合你呆下去嗎?”
4. 積極參與對(duì)于同一個(gè)問(wèn)題,或許你會(huì)有不同的想法。如果你能夠積極參與,可能會(huì)得到比之前更好的解決方案。
糟糕的評(píng)審:“這個(gè)想法太糟糕了,我有更好的解決方案?!焙玫脑u(píng)審:“對(duì)于這個(gè)問(wèn)題我也有一些類似的想法,或許我們可以比較或者組合一下我們的想法?!被蛘撸骸拔乙灿幸恍╊愃频南敕ǎ疫@樣做是因?yàn)椤隳敲醋鍪且驗(yàn)槭裁???/p>5. 不是每個(gè)人的經(jīng)歷都跟你一樣
有些東西對(duì)你來(lái)說(shuō)是常識(shí),但有些人可能并不知道,即使他們的能力并不差。你可以說(shuō)這些東西是常識(shí),但不要顯露出嘲笑或高人一等的姿態(tài)。
糟糕的評(píng)審:“你不知道這個(gè)明顯是錯(cuò)的嗎?”好的評(píng)審:“這樣是不對(duì)的,因?yàn)楫?dāng)……的時(shí)候它會(huì)拋出空指針異常?!?/p>6. 不要把復(fù)雜的東西簡(jiǎn)單化
有些事情對(duì)你來(lái)說(shuō)是顯而易見(jiàn)的,但對(duì)其他人并不一定也是這樣。為別人提供可選方案或有用的例子可以讓他們也變得跟你一樣好。
糟糕的評(píng)審:“為什么不直接這樣?”好的評(píng)審:“這樣做會(huì)更簡(jiǎn)單,比如……”
7. 尊重別人有時(shí)候,提交的代碼可能質(zhì)量很差,但表示一下對(duì)別人的尊重其實(shí)很容易。
糟糕的評(píng)審:“這些愚蠢的代碼人跟寫(xiě)代碼的人一樣愚蠢?!焙玫脑u(píng)審:“感謝你提交的代碼,但我們不能接受它們,因?yàn)橛幸恍﹩?wèn)題(已經(jīng)列出來(lái)了)?!被蛘撸骸按a有一些問(wèn)題,已經(jīng)列出來(lái)了?;蛟S我們可以回退一步,一起討論一下用例?這樣可以幫我們往前進(jìn)一步。”
8. 管理你的期望和時(shí)間如果一次提交的代碼太多,你沒(méi)有時(shí)間評(píng)審,可以讓提交者知道。
糟糕的評(píng)審:“代碼太多了,我不會(huì)合并它們的?!蓖瑯釉愀獾氖侵苯雍雎运鼈儭:玫脑u(píng)審:“可以把這些分成幾次提交嗎?我沒(méi)有這么多時(shí)間,而且一次也評(píng)審不了這么多代碼。”
9. 使用禮貌用語(yǔ)使用禮貌用語(yǔ)(比如“請(qǐng)”)表示對(duì)代碼提交者的尊重,特別是當(dāng)你要他們?cè)诩?xì)節(jié)上做出一些調(diào)整(比如格式化)時(shí)。
“請(qǐng)你把與空格相關(guān)的變更放在單獨(dú)的 PR 里,可以嗎?”“請(qǐng)你把變量對(duì)齊,這樣更容易閱讀,可以嗎?”
10. 開(kāi)啟對(duì)話你可能照著上面所說(shuō)的去做了,但對(duì)提交的代碼仍然不滿意。這個(gè)時(shí)候你可以這么說(shuō):“我不喜歡這段代碼,但我也不知道為什么,我們可以聊聊嗎?”盡管需要多花一點(diǎn)時(shí)間,但這樣是值得的,因?yàn)檫@樣你和對(duì)方都能學(xué)到東西(一個(gè)講一個(gè)聽(tīng)),而不是變成對(duì)立方。
即使是很有經(jīng)驗(yàn)的程序員也可以這么說(shuō):“我也不知道為什么不喜歡這段代碼”。這不是在創(chuàng)造攻擊代碼評(píng)審人員的機(jī)會(huì),而是打開(kāi)一條共同求知的道路。
總 結(jié)避免使用雙關(guān)語(yǔ)或夸大其詞,避免爭(zhēng)論,避免精英主義或貶低他人,避免諸如“顯而易見(jiàn)”和“你為什么不……”這樣的評(píng)語(yǔ)。使用清晰、真實(shí)的陳述和支持性的語(yǔ)言,提出問(wèn)題,推動(dòng)事情向前發(fā)展。記住,同事和代碼貢獻(xiàn)者都是人,他們的付出和你的付出一樣值得尊重。
本文為專欄作者授權(quán)創(chuàng)業(yè)邦發(fā)表,版權(quán)歸原作者所有。文章系作者個(gè)人觀點(diǎn),不代表創(chuàng)業(yè)邦立場(chǎng),轉(zhuǎn)載請(qǐng)聯(lián)系原作者。如有任何疑問(wèn),請(qǐng)聯(lián)系editor@cyzone.cn。