為什么軟件團(tuán)隊(duì)要有編碼規(guī)則? Why coding standard?

第一個(gè)問題


幾乎所有人類,在接觸到一個(gè)需要遵循的新行為準(zhǔn)則的時(shí)候,都會(huì)問一個(gè)問題:“為什么我們要遵守這個(gè)?”或者是其某種更具排斥性的變體:“這東西到底有什么用?不遵守這個(gè)又會(huì)怎么樣?”

“為什么過馬路要走人行橫道?”

“為什么開車不能闖紅燈?”

“為什么醫(yī)生要勤洗手消毒?”

“為什么生熟菜板和刀具要分開使用?”

……

從心理學(xué)上講,任何新的制度限制,哪怕只是一點(diǎn)點(diǎn)小的操作方式改動(dòng),都會(huì)在初期給你帶來很強(qiáng)大的排異心態(tài)(本寶寶就是不想把玩具收回箱子里……)。其原因是新的規(guī)范將你拖離了自己熟悉的舒適區(qū),帶來了強(qiáng)烈的不安全感。

簡(jiǎn)單說就是不習(xí)慣,不舒服。(嗯,真正的公主,哪怕壓在這二十層床墊子和二十床鴨絨被下面的一粒豌豆,她都能感覺出來。)


寶寶就不想吃!

而在產(chǎn)品研發(fā)中,看起來更有水準(zhǔn)的質(zhì)問會(huì)來自于有經(jīng)驗(yàn)的工程師:

“創(chuàng)意源于自由,這東西會(huì)限制更靈活的程序?qū)崿F(xiàn)”

“我這樣做雖然不符合規(guī)范,但絕對(duì)的高效和沒問題”

“我的經(jīng)驗(yàn)足以避免和處理這些問題,沒必要設(shè)立什么規(guī)范”

……

好吧,你是否已經(jīng)聽出了你身邊諸位大神們?nèi)缦碌臐撘庾R(shí)?

“你們這些愚蠢的人類才需要遵守規(guī)范”

“編碼規(guī)范是新人的腳手架,對(duì)我這樣會(huì)飛的人沒什么用”

“我已經(jīng)這么忙了還搞這些雞毛蒜皮的【馬賽克】浪費(fèi)時(shí)間。你【馬賽克】是仇家派來折騰我的么?”

……

有一篇來自于谷歌前計(jì)算機(jī)科學(xué)家 Mark Chu-Carroll的短文能夠很好的回應(yīng)這些murmur。有興趣可以點(diǎn)擊去接受一次噴洗。

Stuff Everyone Should Do (part 2): Coding Standards(中文譯文在這里)。

好的,把頭發(fā)吹干,看看使用編碼規(guī)范的最簡(jiǎn)單的理?yè)?jù)。



編碼規(guī)范的簡(jiǎn)單經(jīng)濟(jì)原理


最簡(jiǎn)單的理?yè)?jù),往往來自于最樸素的經(jīng)濟(jì)追求:這里有利潤(rùn)。

分析編碼規(guī)范的成本很直接。編寫推廣學(xué)習(xí)、部署改進(jìn)工具,代碼走查關(guān)注是否違例,所有這些花費(fèi)在編碼規(guī)范上的時(shí)間的綜合,就是編碼規(guī)范的成本。

而從編碼規(guī)范中獲得的收益相對(duì)間接和持久,是通過對(duì)你投入軟件活動(dòng)中的時(shí)間的精簡(jiǎn),通過軟件活動(dòng)中的一系列溝通活動(dòng)和質(zhì)量成果逐漸展現(xiàn)出來。

很確定的是,堅(jiān)持編碼規(guī)范所帶來的收益能夠遠(yuǎn)遠(yuǎn)高于它的成本。它為你節(jié)約的時(shí)間,能遠(yuǎn)遠(yuǎn)大于你花在它上面的時(shí)間。

能賺錢的就是好生意!

這絕對(duì)是一筆好生意。

能提高代碼可讀性。

遵守相同編碼規(guī)范的代碼,常常看起來就像是一個(gè)人寫出來的一樣。具有相同的風(fēng)格是降低學(xué)習(xí)曲線的有效方式。當(dāng)你新到一個(gè)具有編碼規(guī)范的公司,讀懂某幾個(gè)函數(shù)或模塊的寫作方式后,常常代表你可以快速讀懂相同規(guī)范的所有代碼了。

能減少人與人之間的溝通成本

理解并遵守相同編碼規(guī)范的人,就像在講同一種語(yǔ)言,溝通會(huì)快速而準(zhǔn)確。而在發(fā)生編碼風(fēng)格沖突的時(shí)候(不用懷疑,程序員之間的風(fēng)格沖突是永恒的……),編碼規(guī)范將會(huì)作為仲裁的最終依據(jù),減少溝通的無效消耗。

能提高代碼質(zhì)量

合理的編碼規(guī)范幾乎每一條都會(huì)針對(duì)一個(gè)在編程世界里常見的技術(shù)問題。在實(shí)踐中應(yīng)用編碼規(guī)范,就像是常備了一位高水準(zhǔn)的代碼審查者,能幫助你規(guī)避很大比例的常見問題。

簡(jiǎn)單的來說,在一句If語(yǔ)句中錯(cuò)誤的使用了賦值(=)而不是判等(==),可能會(huì)帶來一個(gè)隱藏超過一年的bug,在特定的客戶機(jī)房,花費(fèi)你超過一個(gè)月的調(diào)試時(shí)間才能解決。釋放一塊內(nèi)存后指針沒有清零,可能會(huì)帶來內(nèi)存的第二次釋放導(dǎo)致系統(tǒng)崩潰。變量沒有初始化,可能會(huì)在函數(shù)棧的多次值傳遞后,將程序引入一個(gè)未知的隨機(jī)態(tài)……

這許許多多的常見錯(cuò)誤,都可以通過在頭腦中的強(qiáng)烈規(guī)范意識(shí),以及嚴(yán)格的代碼規(guī)范審查所避免。(我不太喜歡用“低級(jí)錯(cuò)誤“這個(gè)詞,因?yàn)閷?shí)際上幾乎所有的程序錯(cuò)誤都是”低級(jí)錯(cuò)誤“。)

能為團(tuán)隊(duì)工作建立腳手架

團(tuán)隊(duì),需要規(guī)范。

在所有的團(tuán)隊(duì)中,不是每一個(gè)成員,都擁有相同的知識(shí)領(lǐng)域、教育程度、行業(yè)背景、項(xiàng)目經(jīng)驗(yàn),從而不是每一個(gè)成員,有著相同的思維深度、隱喻哲學(xué)和學(xué)習(xí)能力。

建立合理的規(guī)范,可以建立團(tuán)隊(duì)在技術(shù)上溝通的模式,前文已提及,更重要的是,還可從團(tuán)隊(duì)內(nèi)部,重(chóng)用已有的程序智慧,為成員提供了有高度的腳手架,避免成員個(gè)體在程序設(shè)計(jì)上特定弱點(diǎn)所帶來的質(zhì)量短板。

團(tuán)隊(duì)中個(gè)人的優(yōu)勢(shì)能力決定了團(tuán)隊(duì)的質(zhì)量能力的上限,而編碼規(guī)范的執(zhí)行,則決定了團(tuán)隊(duì)代碼質(zhì)量的下限。

能節(jié)約智力投入

還記得在你在遙遠(yuǎn)的中學(xué)時(shí)期嗎?英文考試的倒數(shù)第二題永遠(yuǎn)是找茬題:給十多行英文讓你找錯(cuò)。

很快你就自己總結(jié)了一個(gè)檢查表,包括在試卷上出現(xiàn)過的所有錯(cuò)誤類型(單復(fù)數(shù)錯(cuò)誤、時(shí)態(tài)錯(cuò)誤、介詞錯(cuò)誤……),此后考試時(shí)對(duì)每一行都遍歷一遍檢查表,基本上快準(zhǔn)狠。自然而然的找你妹的題就變成了完全不花智商的按圖索驥送分題。

編碼規(guī)范就是這樣的一個(gè)檢查表,它必然是程序世界和公司經(jīng)驗(yàn)的知識(shí)沉淀物,它能幫助你減少思考的密集程度,將最重要的智力資源投入到真正需要你去設(shè)計(jì)和關(guān)注的核心點(diǎn)上。

你不用再在多種程序風(fēng)格中進(jìn)行翻譯和映射,因?yàn)橹挥幸环N程序風(fēng)格。你看一眼函數(shù)名就知道它是做什么用的來自于什么模塊,你看一眼變量名就知道它是什么內(nèi)容大概應(yīng)該是什么類型。

你不用再去思考變量的初值,因?yàn)樽兞康某踔悼傇诙x的時(shí)候有說明,對(duì)整數(shù)來說大多是0,對(duì)指針來說大多是NULL。

你不用再去思考來自于外部的一個(gè)buffer是否需要你去釋放,或者你定義的buffer應(yīng)該在什么地方去釋放。

……

是的,我們希望在一切在程序世界里可能有爭(zhēng)議的地方,或者完全沒有爭(zhēng)議的地方,都有我們自己的規(guī)定和習(xí)俗。

讓軟件工程師在最常見的程序過程中沿襲習(xí)俗,在關(guān)鍵和艱難的創(chuàng)新點(diǎn)上靈活創(chuàng)新,繼而充分的用80%以上的智力來解決20%的核心問題。這才是對(duì)軟件工程師團(tuán)隊(duì)的最大效率提升。(請(qǐng)把你積攢的每一點(diǎn)怒氣都用在釋放大招上?。?/p>



巴比倫之塔


110V和220V的電壓哪一個(gè)更科學(xué)合理??不同的人有不同的理?yè)?jù),不同的國(guó)家有著不同的標(biāo)準(zhǔn)。沒有誰能說服誰。

同樣,縮進(jìn)是4個(gè)空格還是2個(gè)空格?函數(shù)體左邊花括號(hào)應(yīng)該在行尾還是在行首?注釋應(yīng)該用“/**/”還是用“//”?

這些問題軟件行業(yè)中有著永恒的爭(zhēng)論。這些爭(zhēng)論是宗教狂熱信仰式的,也許直到人類滅絕或太陽(yáng)熄滅也不會(huì)有結(jié)論。

可能采用這些爭(zhēng)論中的任何一個(gè)答案都是okay的,或從成本收益的角度判斷,其區(qū)別微乎其微。為了建設(shè)團(tuán)隊(duì)內(nèi)部溝通的巴比倫之塔,為了代碼的可讀性,公司、項(xiàng)目、模塊,其內(nèi)部一定要有統(tǒng)一的答案。

略帶諷刺意味的是,常作為全人類之間無障礙溝通標(biāo)志的巴比倫之塔,居然也有巴別塔,巴貝塔、巴比倫塔、通天塔等多個(gè)中文名。但對(duì)于一條具體的編碼規(guī)范,我們不能留下任何爭(zhēng)論,只能有確定的結(jié)論。即,我們需要選擇一個(gè)答案執(zhí)行。

在執(zhí)行過程中,如果你對(duì)已經(jīng)制定的編碼規(guī)范還有任何疑惑,唯一的處理方式是:給出足夠強(qiáng)的理由,說服所有人,修改或者拋棄。當(dāng)你找到的理?yè)?jù)不夠強(qiáng)大還無法說服大家時(shí),請(qǐng)把那個(gè)撅著嘴的小孩放在心里,嚴(yán)格遵守團(tuán)隊(duì)現(xiàn)有的規(guī)范。

它一定能幫到你。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,749評(píng)論 25 709
  • 1月25日,我的一天之2017年的第1次寫計(jì)劃。 (啦啦啦,啦啦啦,我又回來了?。?今天我就來講講,在2017年,...
    Sernedipity閱讀 395評(píng)論 0 3
  • 分享一篇不錯(cuò)的文章。
    梅梅吖閱讀 330評(píng)論 0 0
  • 劉伶醉 文/米修 朝廷問策,劉伶上書建議無為而治,晉武帝嗤之。...
    一休知米閱讀 1,820評(píng)論 1 5
  • 這篇文章主要包括iOS藍(lán)牙開發(fā)的簡(jiǎn)介以及如果進(jìn)行藍(lán)牙開發(fā), 具體的藍(lán)牙知識(shí)不再詳細(xì)介紹了. iOS藍(lán)牙開發(fā)的實(shí)現(xiàn)基...
    superLee閱讀 739評(píng)論 3 11

友情鏈接更多精彩內(nèi)容