第一個(gè)問題
幾乎所有人類慌闭,在接觸到一個(gè)需要遵循的新行為準(zhǔn)則的時(shí)候,都會問一個(gè)問題:“為什么我們要遵守這個(gè)第献?”或者是其某種更具排斥性的變體:“這東西到底有什么用贡必?不遵守這個(gè)又會怎么樣?”
“為什么過馬路要走人行橫道庸毫?”
“為什么開車不能闖紅燈仔拟?”
“為什么醫(yī)生要勤洗手消毒?”
“為什么生熟菜板和刀具要分開使用飒赃?”
……
從心理學(xué)上講利花,任何新的制度限制,哪怕只是一點(diǎn)點(diǎn)小的操作方式改動载佳,都會在初期給你帶來很強(qiáng)大的排異心態(tài)(本寶寶就是不想把玩具收回箱子里……)炒事。其原因是新的規(guī)范將你拖離了自己熟悉的舒適區(qū),帶來了強(qiáng)烈的不安全感蔫慧。
簡單說就是不習(xí)慣挠乳,不舒服。(嗯姑躲,真正的公主睡扬,哪怕壓在這二十層床墊子和二十床鴨絨被下面的一粒豌豆,她都能感覺出來黍析。)
而在產(chǎn)品研發(fā)中,看起來更有水準(zhǔn)的質(zhì)問會來自于有經(jīng)驗(yàn)的工程師:
“創(chuàng)意源于自由阐枣,這東西會限制更靈活的程序?qū)崿F(xiàn)”
“我這樣做雖然不符合規(guī)范马靠,但絕對的高效和沒問題”
“我的經(jīng)驗(yàn)足以避免和處理這些問題,沒必要設(shè)立什么規(guī)范”
……
好吧蔼两,你是否已經(jīng)聽出了你身邊諸位大神們?nèi)缦碌臐撘庾R甩鳄?
“你們這些愚蠢的人類才需要遵守規(guī)范”
“編碼規(guī)范是新人的腳手架,對我這樣會飛的人沒什么用”
“我已經(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ī)范的最簡單的理據(jù)储笑。
編碼規(guī)范的簡單經(jīng)濟(jì)原理
最簡單的理據(jù)甜熔,往往來自于最樸素的經(jīng)濟(jì)追求:這里有利潤。
分析編碼規(guī)范的成本很直接突倍。編寫推廣學(xué)習(xí)腔稀、部署改進(jìn)工具,代碼走查關(guān)注是否違例羽历,所有這些花費(fèi)在編碼規(guī)范上的時(shí)間的綜合焊虏,就是編碼規(guī)范的成本。
而從編碼規(guī)范中獲得的收益相對間接和持久秕磷,是通過對你投入軟件活動中的時(shí)間的精簡诵闭,通過軟件活動中的一系列溝通活動和質(zhì)量成果逐漸展現(xiàn)出來。
很確定的是澎嚣,堅(jiān)持編碼規(guī)范所帶來的收益能夠遠(yuǎn)遠(yuǎn)高于它的成本疏尿。它為你節(jié)約的時(shí)間,能遠(yuǎn)遠(yuǎn)大于你花在它上面的時(shí)間易桃。
這絕對是一筆好生意。
能提高代碼可讀性晤郑。
遵守相同編碼規(guī)范的代碼敌呈,常常看起來就像是一個(gè)人寫出來的一樣造寝。具有相同的風(fēng)格是降低學(xué)習(xí)曲線的有效方式驱富。當(dāng)你新到一個(gè)具有編碼規(guī)范的公司,讀懂某幾個(gè)函數(shù)或模塊的寫作方式后匹舞,常常代表你可以快速讀懂相同規(guī)范的所有代碼了。
能減少人與人之間的溝通成本
理解并遵守相同編碼規(guī)范的人线脚,就像在講同一種語言赐稽,溝通會快速而準(zhǔn)確。而在發(fā)生編碼風(fēng)格沖突的時(shí)候(不用懷疑浑侥,程序員之間的風(fēng)格沖突是永恒的……)姊舵,編碼規(guī)范將會作為仲裁的最終依據(jù),減少溝通的無效消耗寓落。
能提高代碼質(zhì)量
合理的編碼規(guī)范幾乎每一條都會針對一個(gè)在編程世界里常見的技術(shù)問題括丁。在實(shí)踐中應(yīng)用編碼規(guī)范,就像是常備了一位高水準(zhǔn)的代碼審查者伶选,能幫助你規(guī)避很大比例的常見問題史飞。
簡單的來說尖昏,在一句If語句中錯(cuò)誤的使用了賦值(=)而不是判等(==),可能會帶來一個(gè)隱藏超過一年的bug构资,在特定的客戶機(jī)房抽诉,花費(fèi)你超過一個(gè)月的調(diào)試時(shí)間才能解決。釋放一塊內(nèi)存后指針沒有清零吐绵,可能會帶來內(nèi)存的第二次釋放導(dǎo)致系統(tǒng)崩潰迹淌。變量沒有初始化,可能會在函數(shù)棧的多次值傳遞后己单,將程序引入一個(gè)未知的隨機(jī)態(tài)……
這許許多多的常見錯(cuò)誤唉窃,都可以通過在頭腦中的強(qiáng)烈規(guī)范意識,以及嚴(yán)格的代碼規(guī)范審查所避免纹笼。(我不太喜歡用“低級錯(cuò)誤“這個(gè)詞纹份,因?yàn)閷?shí)際上幾乎所有的程序錯(cuò)誤都是”低級錯(cuò)誤“。)
能為團(tuán)隊(duì)工作建立腳手架
團(tuán)隊(duì)允乐,需要規(guī)范矮嫉。
在所有的團(tuán)隊(duì)中,不是每一個(gè)成員牍疏,都擁有相同的知識領(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)勢能力決定了團(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í)對每一行都遍歷一遍檢查表眷蚓,基本上快準(zhǔn)狠鼻种。自然而然的找你妹的題就變成了完全不花智商的按圖索驥送分題。
編碼規(guī)范就是這樣的一個(gè)檢查表沙热,它必然是程序世界和公司經(jīng)驗(yàn)的知識沉淀物叉钥,它能幫助你減少思考的密集程度,將最重要的智力資源投入到真正需要你去設(shè)計(jì)和關(guān)注的核心點(diǎn)上篙贸。
你不用再在多種程序風(fēng)格中進(jìn)行翻譯和映射投队,因?yàn)橹挥幸环N程序風(fēng)格。你看一眼函數(shù)名就知道它是做什么用的來自于什么模塊爵川,你看一眼變量名就知道它是什么內(nèi)容大概應(yīng)該是什么類型敷鸦。
你不用再去思考變量的初值,因?yàn)樽兞康某踔悼傇诙x的時(shí)候有說明寝贡,對整數(shù)來說大多是0扒披,對指針來說大多是NULL。
你不用再去思考來自于外部的一個(gè)buffer是否需要你去釋放圃泡,或者你定義的buffer應(yīng)該在什么地方去釋放碟案。
……
是的,我們希望在一切在程序世界里可能有爭議的地方颇蜡,或者完全沒有爭議的地方价说,都有我們自己的規(guī)定和習(xí)俗。
讓軟件工程師在最常見的程序過程中沿襲習(xí)俗风秤,在關(guān)鍵和艱難的創(chuàng)新點(diǎn)上靈活創(chuàng)新鳖目,繼而充分的用80%以上的智力來解決20%的核心問題。這才是對軟件工程師團(tuán)隊(duì)的最大效率提升缤弦。(請把你積攢的每一點(diǎn)怒氣都用在釋放大招上A炻酢)
巴比倫之塔
110V和220V的電壓哪一個(gè)更科學(xué)合理??不同的人有不同的理據(jù)碍沐,不同的國家有著不同的標(biāo)準(zhǔn)惦费。沒有誰能說服誰。
同樣抢韭,縮進(jìn)是4個(gè)空格還是2個(gè)空格?函數(shù)體左邊花括號應(yīng)該在行尾還是在行首恍箭?注釋應(yīng)該用“/**/”還是用“//”?
這些問題軟件行業(yè)中有著永恒的爭論刻恭。這些爭論是宗教狂熱信仰式的,也許直到人類滅絕或太陽熄滅也不會有結(jié)論。
可能采用這些爭論中的任何一個(gè)答案都是okay的鳍贾,或從成本收益的角度判斷鞍匾,其區(qū)別微乎其微。為了建設(shè)團(tuán)隊(duì)內(nèi)部溝通的巴比倫之塔骑科,為了代碼的可讀性橡淑,公司、項(xiàng)目咆爽、模塊梁棠,其內(nèi)部一定要有統(tǒng)一的答案。
略帶諷刺意味的是斗埂,常作為全人類之間無障礙溝通標(biāo)志的巴比倫之塔符糊,居然也有巴別塔,巴貝塔呛凶、巴比倫塔男娄、通天塔等多個(gè)中文名。但對于一條具體的編碼規(guī)范漾稀,我們不能留下任何爭論模闲,只能有確定的結(jié)論。即崭捍,我們需要選擇一個(gè)答案執(zhí)行尸折。
在執(zhí)行過程中,如果你對已經(jīng)制定的編碼規(guī)范還有任何疑惑缕贡,唯一的處理方式是:給出足夠強(qiáng)的理由翁授,說服所有人,修改或者拋棄晾咪。當(dāng)你找到的理據(jù)不夠強(qiáng)大還無法說服大家時(shí)收擦,請把那個(gè)撅著嘴的小孩放在心里,嚴(yán)格遵守團(tuán)隊(duì)現(xiàn)有的規(guī)范谍倦。
它一定能幫到你塞赂。