不知不覺間,代碼也寫了二十余載,我已成精了。借著過來人的身份和語氣,有一件事情我一直都特別喜歡吐槽:無論過去多少年,中國的嵌入式軟件開發(fā)者群體似乎一直對一個(gè)叫做“編碼規(guī)范”的東西趨之若鶩,仿佛是什么了不得的武林秘籍,學(xué)會(huì)了就可以叱咤武林讓讓人不敢小覷;又亦或是什么內(nèi)功心法,需要每日研讀或與它人細(xì)細(xì)品讀交流,以求它日可以參透其中奧秘,從此內(nèi)力大增,用心跳就可以虐死對手。
君不見,曾幾何時(shí)《某為編程規(guī)范》在網(wǎng)上被廣泛傳抄,互聯(lián)網(wǎng)時(shí)代雖然無法“洛陽紙貴”,卻曾經(jīng)引得某公司的公關(guān)部門到處發(fā)函讓站長們刪帖;時(shí)過境遷,雖然某為的編程規(guī)范也不至于熱度全無,但對冠名于國外大廠大公司的編碼規(guī)范的追捧卻已悄然成為當(dāng)下的熱門——仿佛如果說不出自己使用的規(guī)范來自哪個(gè)大門派,都不好意思跟人家打招呼。
可拉倒吧!
在兄弟們浪費(fèi)太多時(shí)間之前,可曾了解過自己苦苦追尋和模仿的究竟是個(gè)什么東西?
【編碼規(guī)范的本質(zhì)是什么?】
要理解編碼規(guī)范的本質(zhì),其實(shí)并不復(fù)雜:
編碼規(guī)范是在一定范圍內(nèi)強(qiáng)制推行的編碼習(xí)慣;這里的編碼習(xí)慣通常來自于對團(tuán)隊(duì)有控制力的一個(gè)或者少數(shù)幾個(gè)人。
這里,你會(huì)很容易注意到三個(gè)關(guān)鍵字:“一定范圍”、“強(qiáng)制推行”和“編碼習(xí)慣”。抓住這三點(diǎn),編碼規(guī)范的本質(zhì)就像“任意不在同一直線上的三點(diǎn)確定一個(gè)平面”一樣——沒得跑了。
首先來說說這個(gè)“編碼習(xí)慣”,其實(shí)很好理解,它就是字面意思——一個(gè)人寫代碼時(shí)候的某種習(xí)慣,高情商叫風(fēng)格,低情商叫“我就愛這么干,別問我為啥,我要么不知道,要么等我編個(gè)理由告訴你”??傊兀幋a習(xí)慣帶有強(qiáng)烈的主觀性、基本上可以認(rèn)為缺乏強(qiáng)有力的客觀依據(jù),在穩(wěn)定性和一致性方面其實(shí)就是水中花鏡中月——不能說完全沒有,只能說毫無可信度。
不信么?今天你看了一個(gè)大牛的代碼,覺得:
“哇!好牛逼”,
“大牛這么做一定有什么深意”
然后不自覺的就學(xué)著人家的編碼規(guī)范來了。過了幾天,你可能又碰到了另外的大牛,或者是什么明星開源項(xiàng)目……咋說呢……如果用男女關(guān)系來形容兄弟們的行為,那就是妥妥的渣男/渣女——沒得洗。
你跟我說說,哪兒來的穩(wěn)定性和一致性?還不如先問問“你是誰的粉”比較靠譜。
很多時(shí)候,一個(gè)程序員自己的編碼習(xí)慣可能一輩子都沒有鯉魚躍龍門——成為編碼規(guī)范的機(jī)會(huì);但如果有朝一日,你滿足了以下兩個(gè)條件,你的編碼習(xí)慣就是妥妥的編碼規(guī)范了:
擁有了一個(gè)完全由自己掌控的團(tuán)隊(duì)或者項(xiàng)目;
擁有了執(zhí)行決定的強(qiáng)制力;(比如KPI審核,扣工資之類)
此時(shí),只要你樂意,完全可以在“你控制的范圍內(nèi)”“強(qiáng)制”推行你自己的編碼習(xí)慣——恭喜你,一個(gè)只屬于你的編碼規(guī)范就誕生了。
【編碼規(guī)范的“原罪”】
搞懂了編碼規(guī)范誕生的原因,接下來很自然的,就要聊一聊伴隨編碼規(guī)范一起誕生的“原罪”了。
要理解什么是編碼規(guī)范的原罪,首先必須要講清楚“編碼規(guī)范”(或者說“遵守編碼規(guī)范”)的意義。然而,有些東西你非要向字典一樣去從正面解釋往往非常抽象,但稍微打個(gè)比方,就簡單明朗了——實(shí)際上:
編碼規(guī)范的作用幾乎完全等效于人類自然語言文字中的書法。
簡單說,編碼習(xí)慣就是關(guān)于“你如何寫字的”,而編碼規(guī)范就是“一群人所遵守的書法風(fēng)格”。這么一比方,也許你立馬注意到了:
無論是編碼規(guī)范還是編碼習(xí)慣,都只跟描述“你寫字丑不丑”、“漂不漂亮”的一個(gè)“主觀性非常強(qiáng)的”、甚至還帶有“藝術(shù)性玄學(xué)”的評價(jià)標(biāo)準(zhǔn)有關(guān);
我們?nèi)粘懘a其實(shí)可以類比為寫文章,這意味著:
你可以用非常漂亮的手寫體寫出狗屁不通的文章;
你也可以在趕時(shí)間的情況下,用一種只有自己看得懂的方式,快速而高效的寫出優(yōu)秀的作品;
書法除了草書,往往暗示著——費(fèi)時(shí)間;何況草書往往暗示著,除了那幾個(gè)評論家,普通人基本看不懂。
書法好壞和寫文章所需的遣詞造句的技法,以及文章整體的修辭、結(jié)構(gòu)安排完全無關(guān)。
說的再直白一點(diǎn):當(dāng)你在追求“如何寫出精修文章時(shí)”,追求“書法”,是淺薄的,而且毫無意義的。當(dāng)你在追求如何寫出好的程序時(shí),你需要的是數(shù)據(jù)結(jié)構(gòu)、算法、操作系統(tǒng)、軟件工程、設(shè)計(jì)模式、開發(fā)思維之類的知識,而不是關(guān)于如何把代碼寫的多么漂亮,多么“規(guī)范”的書法——或者說表面功夫。認(rèn)真說起來,連這里“怎樣算作代碼寫的規(guī)范”,從一開始就只是某幾個(gè)人的主觀概念罷了。
正如景秀文章往往也是用賞心悅目的書法寫出來的;注重表面的編碼規(guī)范也并非是什么大罪大惡需要我們棄之如糞土。要知道這其中區(qū)別,就必須要談一談編碼規(guī)范的原罪。
原罪1:膚淺引戰(zhàn)的導(dǎo)火索
正如我在之前一篇文章《真刀真槍模塊化(1)——一本糊涂賬》所提到的那樣:
……讀懂一段程序,實(shí)際上就是要通過死的代碼邏輯去反推模塊構(gòu)作者的思維,這是一個(gè)逆向過程,這是一個(gè)人與人之間用代碼進(jìn)行間接交流的過程,當(dāng)邏輯本身較為復(fù)雜時(shí),顯然比將自己的思維直接翻譯成程序(重新開發(fā)一個(gè))更為困難。
傻孩子,公眾號:裸機(jī)思維真刀真槍模塊化(1)——一本糊涂賬
這里,我提到了一個(gè)關(guān)鍵的事實(shí)——閱讀他人代碼是非常耗時(shí)和困難的。這樣的事情無時(shí)無刻不在發(fā)生:當(dāng)我們拿到一段代碼時(shí),想通過了解它的內(nèi)容來判斷好壞幾乎是不可能的——這不光意味著你要花費(fèi)時(shí)間去閱讀它,可能你根本不想去閱讀,或者根本沒有這樣的時(shí)間去閱讀。此時(shí),要想判斷一段代碼的好壞就只能通過非常表面的東西來進(jìn)行了——是的,就是看你寫的字漂不漂亮。
如果明確知道這是“名人大家”的作品,或是出自某個(gè)大廠的作品,事情就變得非常簡單:只要學(xué)習(xí)歷來文人是如何在同行面前顯示自己學(xué)識淵博的方式——花式吹就行了。
如果要評價(jià)的對象是同輩的作品,或是某個(gè)來源不明的作品,大家就一下開始“審慎起來”,仿佛瞬間化身為嚴(yán)肅的藝術(shù)評論家——在嚴(yán)肅而充滿理性的批判聲中,自己“高超水平”和“恨鐵不成鋼的惋惜”躍然紙上。
嗚呼哀哉,文人相輕,這味兒太沖了。
原罪2:似是而非
前面我們說過,編碼規(guī)范的本質(zhì)是編碼習(xí)慣,編碼習(xí)慣擁有非常強(qiáng)的主觀性,因而缺乏客觀標(biāo)準(zhǔn)。然而,這話只說了一半,事實(shí)上,并不矛盾的一點(diǎn)是,如果某個(gè)編碼習(xí)慣出自于“較為嚴(yán)謹(jǐn)認(rèn)真”的人之手,這樣的編碼習(xí)慣也便“主觀的”擁有了一定的客觀性——這完全是由提出的人的特性而決定的——因此依然是主觀的。這可就頭疼了。因?yàn)檫@些“嚴(yán)謹(jǐn)認(rèn)真”的人,他們在養(yǎng)成編碼習(xí)慣時(shí),往往的確會(huì)有理性的思考,不光能說出所以然,而且似乎可以說服很多人,讓大家覺得
“這樣做很有道理”甚至“不這么做就是錯(cuò)的”
的判斷。問題是:
這些“嚴(yán)謹(jǐn)大佬”們做出思考的背景是不同,而人們討論和傳播編碼規(guī)范的時(shí)候往往會(huì)丟棄這些背景信息而將其“泛化”——或者說無限制的擴(kuò)大適用范圍;
很多作為某一編碼規(guī)范規(guī)則在背后的支撐邏輯,我們可以說它是“正確的”,但遺憾的是,它的正確“并不意味著其它做法是錯(cuò)的”——事實(shí)上,有很多規(guī)則所服務(wù)的邏輯實(shí)際上存在很多“同樣正確、且平等的正確的競爭者”。
關(guān)于這點(diǎn),其實(shí)并不難理解,比如,假設(shè)我們想解決一個(gè)問題A,那么可能有1,2,3,……很多個(gè)解決方案,這些方案中可能會(huì)存在一些“同樣正確且各有優(yōu)缺點(diǎn)的”。從另外一個(gè)角度來看,對于一個(gè)已知的“規(guī)則或者行為”,你往往可以找到不止一種原因和動(dòng)機(jī)去解釋它。所以,結(jié)合以上兩個(gè)方向的例子,我們要明白,很多事情都不是“非黑即白”的,尤其是編碼規(guī)則的好壞、成因、收益這種極端主觀的事情。
編碼規(guī)范的信徒們,往往視其它規(guī)范(甚至是某一個(gè)規(guī)范的變種)為異端,定要除之而后快,表現(xiàn)為與他人進(jìn)行無意義的論戰(zhàn)、不說服他人加入自己的陣營就決不罷休,甚至上升到人身攻擊等等……
原罪3:遮羞布
正因?yàn)樵u價(jià)它人代碼的閱讀代價(jià)太高,而憑借“眼緣”去評價(jià)它人“字太丑”簡單且可行,因此,對很多人來說,追求“書法”而不是具體的“寫作文能力”就成了“快速提高代碼質(zhì)量”的捷徑——這里的代碼質(zhì)量,很多時(shí)候也僅僅只是“是否好看”了……
【C語言編碼規(guī)范的“甜”和“咸”】
如果書法大家云集流派眾多,C語言的編碼規(guī)范也是有“門派”的,比如大家熟悉的Linux派、微軟派……(此處省略1W字)。然而,無論門派多寡,其實(shí)都可以在一個(gè)“編碼規(guī)范光譜”中為其找到一席之地。
在光譜的最左邊是名為“純粹追求美觀”的極點(diǎn)、在光譜的最右邊是名為“純粹追求功能性”的另一極。實(shí)際上如今你所熟悉的編碼規(guī)范,基本都位于兩級中的某一位置。
“純粹追求美觀”,顧名思義,代碼寫出來要眼睛看著舒服。需要特別強(qiáng)調(diào)的是,這里的看著舒服與“代碼的可讀性”完全是兩回事。
純粹追求美觀的杰出代表是Linux編碼規(guī)范——它所追求的是純粹小寫所帶來的那種和諧而統(tǒng)一的美;它基本不對函數(shù)、變量名、類型名做任何的區(qū)別(甚至是非常數(shù)的宏);為了解決小寫單詞缺乏“節(jié)奏”的問題,而在單詞與單詞之間簡單的引入“_”完事。
這種美學(xué)就好比最優(yōu)質(zhì)的牛排,只需要輔以簡單的海鹽,進(jìn)行簡單的烹飪就能發(fā)揮牛排最原始的美味;這就好比,新鮮的生蠔,只需要擠上幾瓣檸檬就可以釋放出最大的鮮甜……
正是由于Linux這種純粹追求視覺上的和諧而不“詭辯”自己有如何功能上的便利,受到眾多“返璞歸真”老鳥的狂熱追捧——我要的就是簡潔的美,其它都在我心間。
“純粹追求功能性”,顧名思義,就是以犧牲一定程度的“美感”而換取某種功能上的便利。實(shí)際上,完全犧牲美感的編碼規(guī)范幾乎沒有,但很多商用協(xié)議棧的編碼規(guī)范或多或少都有著明確的功能追求。
典型的是匈牙利變量命名法,它的特點(diǎn)是為每一個(gè)變量追加必要的類型信息,從而提高變量名的信息攜帶量——最終嘗試提高代碼的可讀性。在Linux玩家的眼里,匈牙利是真的丑;同時(shí)作為一個(gè)如入鮑魚之膚久而不聞其臭的匈牙利變量命名法玩家,我也只是“習(xí)慣了”這種用法,你要說我覺得它有多美,那也絕對是扯淡。有意思的是,匈牙利變量命名法往往會(huì)與駝峰命名法攪和在一起,這讓純粹的駝峰信徒頗為不爽——因?yàn)轳劮蹇梢哉f是“美的”,但你非要粘上一些類型標(biāo)簽——就好比在布丁的蜂蜜澆頭上發(fā)現(xiàn)了蒼蠅一樣惡心。
公平的說,匈牙利所附加的信息的確有助于提升代碼的可讀性。至于美不美,可以完全拋在腦后。
另外一類“追求功能性”的編碼規(guī)范就是各類DSP、視頻、音頻、數(shù)學(xué)相關(guān)的協(xié)議棧,它們純粹為了方便API的使用,嘗試在變量、函數(shù)以及類型名稱上附加大量的信息,以描述API的參數(shù)類型、函數(shù)所代表的的運(yùn)算功能、以及其它相關(guān)專業(yè)方向才會(huì)理解的特性屬性等等——這樣的信息追加,造就了猶如喀斯特地貌一樣的奇觀——用是好用,美不美,就不好說了。這類協(xié)議棧的典型是鼎鼎大名的Dolby的音頻庫。
對普通人來說,一般我們使用的編碼習(xí)慣都處于這兩級的中間地帶,這不光因?yàn)楹芏鄷r(shí)候我們同時(shí)會(huì)有“看著順眼”和“提供額外信息”這兩種追求,更主要的原因是:編碼規(guī)范的本質(zhì)是書法,對我們所使用的書法起決定作用的是“審美”,而每個(gè)人不同階段的審美很難保持一成不變。當(dāng)我們因?yàn)楣ぷ麝P(guān)系游走于不同的團(tuán)隊(duì)而被迫服從的編碼規(guī)范時(shí),久而久之……如邯鄲學(xué)步,自己的“初心”可能早就被染成了“別人的顏色”……
【編碼規(guī)范,怎么做才對?】
知道了編碼規(guī)范的本質(zhì)和原罪、討論了編碼規(guī)范的兩個(gè)極端風(fēng)格,那么我們普通人應(yīng)該如何對待它呢?
字寫的好看,是一種展示“認(rèn)真態(tài)度”的方式;努力寫出漂亮的代碼無可厚非;
切記不可喧賓奪主,在本意是追求“如何寫出優(yōu)秀作文”的時(shí)候,注意力過多的被“如何寫出漂亮字”的編碼規(guī)范所抓住,浪費(fèi)不必要的時(shí)間;
不要把編碼規(guī)范上升成宗教信仰——哪怕你是無意識中這樣做的;
記?。簝?yōu)秀的程序員可以在任何編碼規(guī)范上隨意切換——這是你游刃有余的一種表現(xiàn)。
如果想討好一個(gè)人,贊揚(yáng)他的書法;
如果一個(gè)群里的人讓你討厭,可以在退群之前,可以故意挑起關(guān)于編碼規(guī)范孰優(yōu)孰劣的宗教戰(zhàn)爭——如果碰巧他們都是同一個(gè)宗教的信徒,則嘗試發(fā)起關(guān)于“怎樣才是正統(tǒng)”的討論。如果你喜歡一個(gè)群,就切記不要這么做。
在自己可控的范圍內(nèi)——比如自己的開源項(xiàng)目里,隨意的使用自己的編碼規(guī)范。如果要跟他人合作,最好寫清楚自己的習(xí)慣,并且保持包容的心態(tài)——因?yàn)?,請記住?/p>
編碼規(guī)范的制定者往往會(huì)被所有人盯著,等著你的永遠(yuǎn)是“你自己的規(guī)范你自己都沒遵守”,而不是“你的規(guī)范真好”的贊賞;
對任何你訂立的規(guī)則,你寫下來的只是你心目中的“默認(rèn)情況”,而沒寫來的是大量你自己覺得合理的“特殊情況”——在你心中,除了“少數(shù)”特殊情況外,我們都應(yīng)該按照“默認(rèn)情況”來處理——可惜,這里的“少數(shù)”往往超出你的想像;
不要認(rèn)為別人質(zhì)疑你的編碼規(guī)范就是在罵你、質(zhì)疑你或者找茬——哪怕大部分情況都是這樣;
同理,盡可能遵守它人的編碼規(guī)范,來展示自己對它人的尊重??吹健疤乩辈环烈恍α酥?。
干點(diǎn)正事吧!
【說在后面的話】
編碼規(guī)范展現(xiàn)的是一種“認(rèn)真的態(tài)度”,但它不是“能力和質(zhì)量”本身。區(qū)別你要追求的是“書法的”編碼規(guī)范,還是“思維的”編碼原則。尊重他人從不貶低他人的編碼習(xí)慣開始;團(tuán)隊(duì)合作從嚴(yán)格遵守編碼規(guī)范開始。不要浪費(fèi)太多時(shí)間,舒服就好。
責(zé)任編輯:haq
-
編碼器
+關(guān)注
關(guān)注
45文章
3808瀏覽量
138102 -
編程
+關(guān)注
關(guān)注
88文章
3689瀏覽量
95277
原文標(biāo)題:編碼規(guī)范可能只是一塊遮羞的破布。。。
文章出處:【微信號:A1411464185,微信公眾號:multisim】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
為什么你拿著《規(guī)范》,卻不會(huì)“設(shè)計(jì)”?
優(yōu)先編碼器:高效數(shù)據(jù)選擇與編碼的解決方案
本質(zhì)安全設(shè)備標(biāo)準(zhǔn)(IEC60079-11)的理解(四)
伺服電機(jī)編碼器怎么選型

信道編碼和信源編碼的區(qū)別
bcd編碼的優(yōu)缺點(diǎn) bcd編碼的常見錯(cuò)誤
ADS1281 PCM編碼規(guī)范應(yīng)該在哪里找?
Java代碼之美,從遵循樣式規(guī)范開始

編碼器類型詳解:探索不同編碼技術(shù)的奧秘

增量編碼器與絕對值編碼器的區(qū)別

評論