加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
    • 1 Unix哲學(xué)
    • 2 編碼原則
    • 3 應(yīng)用Unix哲學(xué)
    • 4 態(tài)度
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

Unix哲學(xué)之編程原則

01/18 11:30
3276
閱讀需 25 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

Unix 哲學(xué)(編程原則)不是一種正規(guī)設(shè)計(jì)方法,并不從計(jì)算機(jī)科學(xué)的理論高度來(lái)產(chǎn)生理論上完美的軟件,它更注重實(shí)效,立足于豐富的經(jīng)驗(yàn)。Unix哲學(xué)或編程原則適合各種系統(tǒng)的開(kāi)發(fā),對(duì)于初學(xué)者更像深海燈塔,指引努力提升的方向。

1 Unix哲學(xué)

Unix 哲學(xué)注重實(shí)效,立足于豐富的經(jīng)驗(yàn),并不會(huì)在正規(guī)方法學(xué)和標(biāo)準(zhǔn)中找到它,它更接近于隱性的半本能的知識(shí)。Unix程序員在探索開(kāi)發(fā)的過(guò)程中積累的經(jīng)驗(yàn),非Unix的程序員也能夠從這些經(jīng)驗(yàn)中獲益。

(1) ?讓每個(gè)程序就做好一件事。如果有新任務(wù),就重新開(kāi)始,不要往原程序中加入新功能而搞得復(fù)雜。
(2) ?假定每個(gè)程序的輸出都會(huì)成為另一個(gè)程序的輸入,哪怕那個(gè)程序還是未知的,輸出中不要有無(wú)關(guān)的信息干擾。
(3) ?盡可能早地將設(shè)計(jì)和編譯的軟件投入試用,對(duì)拙劣的代碼別猶豫,扔掉重寫。
(4) ?優(yōu)先使用工具而不是拙劣的幫助來(lái)減輕編程任務(wù)的負(fù)擔(dān),工欲善其事,必先利其器。

2 編碼原則

Unix 哲學(xué)中的內(nèi)容不是這些先哲們口頭表述出來(lái)的,而是由他們所做的一切和Unix 本身所作出的榜樣體現(xiàn)出來(lái)的。從整體上來(lái)說(shuō),可以概括為以下幾點(diǎn):

模塊原則:使用簡(jiǎn)潔的接口拼合簡(jiǎn)單的部件。清晰原則:清晰勝于機(jī)巧。組合原則:設(shè)計(jì)時(shí)考慮拼接組合。

分離原則:策略同機(jī)制分離,接口同引擎分離。簡(jiǎn)潔原則:設(shè)計(jì)要簡(jiǎn)潔,復(fù)雜度能低則低。

吝嗇原則:除非確無(wú)它法,不要編寫龐大的程序。透明性原則:設(shè)計(jì)要可見(jiàn),以便審查和調(diào)試。

健壯原則:健壯源于透明與簡(jiǎn)潔。表示原則:把知識(shí)疊入數(shù)據(jù)以求邏輯質(zhì)樸而健壯。

通俗原則:接口設(shè)計(jì)避免標(biāo)新立異。緘默原則:如果程序沒(méi)什么好說(shuō)的,就保持沉默。

補(bǔ)救原則:出現(xiàn)異常時(shí),馬上退出并給出足量錯(cuò)誤信息。經(jīng)濟(jì)原則:寧花機(jī)器一分,不花程序員一秒。

生成原則:避免手撕, ?盡量編寫程序去生成程序。優(yōu)化原則:雕琢前先要有原型,跑之前先學(xué)會(huì)走。

多樣原則:決不相信所謂“不二法門”的斷言。擴(kuò)展原則:設(shè)計(jì)著眼未來(lái),未來(lái)總比預(yù)想來(lái)得快。

如果剛開(kāi)始接觸,這些原則值得好好體味一番。談軟件工程的文章常常會(huì)推薦大部分的這些原則,但是大多數(shù)其它系統(tǒng)缺乏恰當(dāng)?shù)墓ぞ吆蛡鹘y(tǒng)將這些準(zhǔn)則付諸實(shí)踐,所以,多數(shù)的程序員還不能自始至終地貫徹這些原則。蹩腳的工具、糟糕的設(shè)計(jì)、過(guò)度的勞作和臃腫的代碼對(duì)他們已經(jīng)是家常便飯了。

2.1 ?模塊原則:使用簡(jiǎn)潔的接口拼合簡(jiǎn)單的部件

“計(jì)算機(jī)編程的本質(zhì)就是控制復(fù)雜度” 。排錯(cuò)占用了大部分的開(kāi)發(fā)時(shí)間,一個(gè)拿得出手的可用系統(tǒng),與其說(shuō)是出自才華橫溢的設(shè)計(jì)成果,不如說(shuō)是跌跌撞撞的結(jié)果。

匯編語(yǔ)言、編譯語(yǔ)言、流程圖、過(guò)程化編程、結(jié)構(gòu)化編程、面向?qū)ο?、以?a class="article-link" target="_blank" href="/tag/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/">軟件開(kāi)發(fā)的方法論,不計(jì)其數(shù)的解決之道被拋售者吹得神乎其神。實(shí)際上這些用處不大,原因恰恰在于它們“成功”地將程序的復(fù)雜度提升到了人腦幾乎不能處理的地步。

要編制復(fù)雜軟件而又不至于一敗涂地的唯一方法就是降低其整體復(fù)雜度,用清晰的接口把若干簡(jiǎn)單的模塊組合成一個(gè)復(fù)雜軟件。如此一來(lái),多數(shù)問(wèn)題只會(huì)局限于某個(gè)局部,那樣才有希望對(duì)局部進(jìn)行改進(jìn)而不至牽動(dòng)全身。

2.2 ?清晰原則:清晰勝于機(jī)巧

維護(hù)如此重要、而成本如此高昂。在寫程序時(shí),要想到不是寫給執(zhí)行代碼的計(jì)算機(jī)看,而是給人,將來(lái)閱讀維護(hù)源碼的人,包括自己。

在 Unix 傳統(tǒng)中,這個(gè)建議不僅意味著代碼注釋。良好的 Unix 實(shí)踐同樣信奉在選擇算法和實(shí)現(xiàn)時(shí),應(yīng)該考慮到將來(lái)的可擴(kuò)展性。為了取得程序一丁點(diǎn)的性能提升,就大幅增加技術(shù)的復(fù)雜性和晦澀性,這個(gè)買賣做不得,這不僅僅是因?yàn)閺?fù)雜的代碼容易滋生bug,也因?yàn)樗鼤?huì)使日后的閱讀和維護(hù)工作更加艱難。相反,優(yōu)雅而清晰的代碼不僅不容易崩潰,而且更易于讓后來(lái)的修改者立刻理解。這點(diǎn)非常重要,尤其是,說(shuō)不定若干年后回過(guò)頭來(lái)修改這些代碼的人可能恰恰就是自己。

永遠(yuǎn)不要去吃力地解讀一段晦澀的代碼三次。第一次也許僥幸成功,但如果發(fā)現(xiàn)必須重新解讀一遍——離第一次太久了,具體細(xì)節(jié)無(wú)從回想,那就該注釋代碼了,這樣第三次就相對(duì)不會(huì)那么痛苦了。

2.3 ?組合原則:設(shè)計(jì)時(shí)考慮拼接組合

如果程序彼此之間不能有效通信,那么軟件就難免會(huì)陷入復(fù)雜度的泥淖。

在輸入輸出方面, Unix 傳統(tǒng)極力提倡采用簡(jiǎn)單、文本化、面向流、設(shè)備無(wú)關(guān)的格式。在經(jīng)典的 Unix 下,多數(shù)程序都盡可能采用簡(jiǎn)單過(guò)濾器的形式,即將一個(gè)輸入的文本流處理為一個(gè)簡(jiǎn)單的文本流輸出。拋開(kāi)世俗眼光,Unix程序員偏愛(ài)這種做法并不是因?yàn)樗麄兂鹨晥D形用戶界面,而是因?yàn)槿绻绦虿徊捎煤?jiǎn)單的文本輸入輸出流,它們就極難銜接。

Unix 中文本流之于工具,就如同在面向?qū)ο蟓h(huán)境中的消息之于對(duì)象。文本流界面的簡(jiǎn)潔性加強(qiáng)了工具的封裝性。而許多精致的進(jìn)程間通訊方法,比如遠(yuǎn)程過(guò)程調(diào)用,都存在各程序牽扯過(guò)多的傾向。

要想讓程序具有組合性,就要使程序彼此獨(dú)立。在文本流這一端的程序應(yīng)該盡可能不要考慮文本流另一端的程序。將一端的程序替換為另一個(gè)截然不同的程序,而完全不驚擾另一端應(yīng)該很容易做到。GUI ?可以是個(gè)好東西,在做 GUI前,應(yīng)該想想可不可以把復(fù)雜的交互程序跟干粗活的算法程序分離開(kāi),每個(gè)部分單獨(dú)成為一塊,然后用一個(gè)簡(jiǎn)單的命令流或者是應(yīng)用協(xié)議將其組合在一起。

在構(gòu)思精巧的數(shù)據(jù)傳輸格式前,有必要實(shí)地考察一下,是否能利用簡(jiǎn)單的文本數(shù)據(jù)格式;以一點(diǎn)點(diǎn)格式解析的代價(jià),換得可以使用通用工具來(lái)構(gòu)造或解讀數(shù)據(jù)流的好處是值得的。

當(dāng)程序無(wú)法自然地使用序列化、協(xié)議形式的接口時(shí),正確的 Unix 設(shè)計(jì)至少是,把盡可能多的編程元素組織為一套定義良好的 API 。這樣至少可以通過(guò)鏈接調(diào)用應(yīng)用程序,或根據(jù)不同任務(wù)的需求粘合使用不同的接口。

2.4 ?分離原則:策略同機(jī)制分離,接口同引擎分離

策略和機(jī)制是按照不同的時(shí)間尺度變化的,策略的變化要遠(yuǎn)遠(yuǎn)快于機(jī)制。把策略同機(jī)制揉成一團(tuán)有兩個(gè)負(fù)面影響:一來(lái)會(huì)使策略變得死板,難以適應(yīng)用戶需求的改變,二來(lái)也意味著任何策略的改變都極有可能動(dòng)搖機(jī)制。相反,將兩者剝離,就有可能在探索新策略的時(shí)候不足以打破機(jī)制。另外,也更容易為機(jī)制寫出較好的測(cè)試。

實(shí)現(xiàn)剝離的一個(gè)方法,將應(yīng)用程序分成可以協(xié)作的前端和后端進(jìn)程,通過(guò)套接字上層的專用應(yīng)用協(xié)議進(jìn)行通訊。前端實(shí)現(xiàn)策略,后端實(shí)現(xiàn)機(jī)制。比起僅用單個(gè)進(jìn)程的整體實(shí)現(xiàn)方式來(lái)說(shuō),這種雙端設(shè)計(jì)方式大大降低了整體復(fù)雜度 ,bug 有望減少,從而降低程序的壽命周期成本。

2.5 ?簡(jiǎn)潔原則:設(shè)計(jì)要簡(jiǎn)潔,復(fù)雜度能低則低

來(lái)自多方面的壓力常常會(huì)讓程序變得復(fù)雜(由此代價(jià)更高, bug ?更多),其中 一種壓力就是來(lái)自技術(shù)上的虛榮心理。程序員們都很聰明,常常以能玩轉(zhuǎn)復(fù)雜東西和耍弄抽象概念的能力為傲,這一點(diǎn)也無(wú)可厚非。但正因如此常常會(huì)與同行們比試,看看 誰(shuí)能夠鼓搗出最錯(cuò)綜復(fù)雜的美妙事物,他們的設(shè)計(jì)能力大大超出他們的實(shí)現(xiàn)和排錯(cuò)能力,結(jié)果便是代價(jià)高昂的廢品。

”錯(cuò)綜復(fù)雜的美妙事物”聽(tīng)來(lái)自相矛盾。Unix ?程序員相互比的是誰(shuí)能做到 “簡(jiǎn)潔而漂亮”,這一點(diǎn)雖然只是隱含在這些規(guī)則之中,但還是很值得公開(kāi)提出來(lái)強(qiáng)調(diào)一下。

至少在商業(yè)軟件領(lǐng)域里,過(guò)度的復(fù)雜性往往來(lái)自于項(xiàng)目的要求,而這些要求常常基于推銷熱點(diǎn),而不是基于顧客的需求和軟件實(shí)際能夠提供的功能。許多優(yōu)秀的設(shè)計(jì)被市場(chǎng)推銷所需要的大堆“特性清單”扼殺,實(shí)際上這些特性功能幾乎從未用過(guò)。然后,惡性循環(huán)開(kāi)始了,比別人花哨的方法就是把自己變得更花哨。很快,龐大臃腫變成了業(yè)界標(biāo)準(zhǔn),每個(gè)人都在使用臃腫不堪、bug 極多的軟件,連軟件開(kāi)發(fā)人員也不敢敝帚自珍。

避免這些陷阱,唯一的方法就是鼓勵(lì)另一種軟件文化,以簡(jiǎn)潔為美。這是一個(gè)非常看重簡(jiǎn)單解決方案的工程傳統(tǒng),總是設(shè)法將程序系統(tǒng)分解為幾個(gè)能夠協(xié)作的小部分,并本能地抵制任何用過(guò)多噱頭來(lái)粉飾程序的企圖。關(guān)注微信公眾號(hào)【嵌入式系統(tǒng)

2.6 ?吝嗇原則:除非確無(wú)它法,不要編寫龐大的程序

“大”有兩重含義:體積大,復(fù)雜程度高。程序大了,維護(hù)起來(lái)就困難。由于對(duì)花費(fèi)了大量精力才做出來(lái)的東西難以割舍,結(jié)果導(dǎo)致在龐大的程序中,把投資浪費(fèi)在注定要失敗,或并非最佳的方案上。避免不必要的代碼和邏輯,保持代碼精簡(jiǎn)。

2.7 ?透明性原則:設(shè)計(jì)要可見(jiàn),以便審查和調(diào)試

因?yàn)檎{(diào)試通常會(huì)占用四分之三甚至更多的開(kāi)發(fā)時(shí)間,所以一開(kāi)始就多做點(diǎn)工作以減少日后調(diào)試的工作量會(huì)很劃算。一個(gè)有效的減少調(diào)試工作量的方法,就是設(shè)計(jì)時(shí)充分考慮透明性和顯見(jiàn)性。

軟件系統(tǒng)的透明性是指一眼就能看出軟件在做什么以及怎樣做的。顯見(jiàn)性指程序帶有監(jiān)視和顯示內(nèi)部狀態(tài)的功能,這樣程序不僅能夠運(yùn)行良好,而且還可以看出它以何種方式運(yùn)行。

設(shè)計(jì)時(shí)如果充分考慮到這些要求會(huì)給整個(gè)項(xiàng)目全過(guò)程帶來(lái)好處。調(diào)試選項(xiàng)的設(shè)置盡量不要在事后,而應(yīng)該在設(shè)計(jì)之初便考慮進(jìn)去,程序不但應(yīng)該能展示其正確性,也應(yīng)該能把原開(kāi)發(fā)者解決問(wèn)題的思維模型告訴后來(lái)者。

程序如果要展示其正確性,應(yīng)該使用足夠簡(jiǎn)單的輸入輸出格式,這樣才能保證很容易地檢驗(yàn)有效輸入和正確輸出之間的關(guān)系是否正確。出于充分考慮透明性和顯見(jiàn)性的目的,還應(yīng)該提倡接口簡(jiǎn)潔,以方便其它程序?qū)ζ溥M(jìn)行操作,尤其是測(cè)試監(jiān)視工具和調(diào)試腳本。關(guān)注微信公眾號(hào)【嵌入式系統(tǒng)】

2.8 ?健壯原則:健壯源于透明與簡(jiǎn)潔

軟件的健壯性指軟件不僅能在正常情況下運(yùn)行良好,而且在超出設(shè)想的意外條件下也能夠運(yùn)行良好。

大多數(shù)軟件禁不起磕碰,毛病多,就是因?yàn)檫^(guò)于復(fù)雜,很難通盤考慮。如果不能正確理解一個(gè)程序的邏輯,就不能確信其是否正確,也就不能在出錯(cuò)的時(shí)候修復(fù)它。讓程序健壯的方法,就是讓程序的內(nèi)部邏輯更易于理解,要做到這一點(diǎn)主要有兩種方法:透明化和簡(jiǎn)潔化。

就健壯性而言,設(shè)計(jì)時(shí)要考慮到能承受極端輸入,這一點(diǎn)也很重要。在有異常輸入的情況下,保證軟件健壯性的一個(gè)相當(dāng)重要的策略就是避免在代碼中出現(xiàn)特例,bug ?通常隱藏在處理特例的代碼以及處理不同特殊情況的交互操作部分的代碼中。

軟件的透明性就是指一眼就能夠看出來(lái)是怎么回事。如果“怎么回事”不算復(fù)雜,即不需要絞盡腦汁就能夠推斷出所有可能的情況,那么這個(gè)程序就是簡(jiǎn)潔的。程序越簡(jiǎn)潔,越透明,也就越健壯。

模塊化(代碼簡(jiǎn)樸,接口簡(jiǎn)潔)是組織程序以達(dá)到更簡(jiǎn)潔目的的一個(gè)方法。

2.9 ?表示原則:把知識(shí)疊入數(shù)據(jù)以求邏輯質(zhì)樸而健壯

數(shù)據(jù)要比編程邏輯更容易駕馭,在設(shè)計(jì)中,應(yīng)該主動(dòng)將代碼的復(fù)雜度轉(zhuǎn)移到數(shù)據(jù)之中去。

此種考量并非 Unix 的原創(chuàng),但是許多 Unix 代碼都顯示受其影響。特別是C 語(yǔ)言對(duì)指針使用控制的功能,促進(jìn)了在內(nèi)核以上各個(gè)編碼層面上對(duì)動(dòng)態(tài)修改引用結(jié)構(gòu)。在結(jié)構(gòu)中用非常簡(jiǎn)單的指針操作就能夠完成的任務(wù),在其它語(yǔ)言中,往往不得不用更復(fù)雜的過(guò)程才能完成。

進(jìn)行數(shù)據(jù)驅(qū)動(dòng)編程時(shí),需要把代碼和代碼作用的數(shù)據(jù)結(jié)構(gòu)劃分清楚,這樣,在改變程序的邏輯時(shí),只要編輯數(shù)據(jù)結(jié)構(gòu)而不是代碼。數(shù)據(jù)驅(qū)動(dòng)編程有時(shí)會(huì)跟面向?qū)ο蠡煜饋?lái),后者是另一種以數(shù)據(jù)組織為中心的風(fēng)格。它們之間至少有兩點(diǎn)不同。第一,在數(shù)據(jù)驅(qū)動(dòng)編程中,數(shù)據(jù)不僅僅是某個(gè)對(duì)象的狀態(tài),實(shí)際上還定義了程序的控制流;第二,面向?qū)ο笫紫瓤紤]的是封裝,而數(shù)據(jù)驅(qū)動(dòng)編程看重的是編寫盡可能少的固定代碼。

2.10 ?通俗原則:接口設(shè)計(jì)避免標(biāo)新立異

也就是眾所周知的“最少驚奇原則”。最易用的程序就是用戶需要學(xué)習(xí)新東西最少的程序,就是最切合用戶已有知識(shí)的程序。因此,接口設(shè)計(jì)應(yīng)該避免毫無(wú)來(lái)由的標(biāo)新立異和自作聰明。

如果你編制一個(gè)計(jì)算器 程序, ?‘+’應(yīng)該永遠(yuǎn)表示加法。設(shè)計(jì)接口的時(shí)候,盡量按照用戶最可能熟悉的同樣功能接口和相似應(yīng)用程序來(lái)進(jìn)行建模。

關(guān)注目標(biāo)受眾,他們也許是最終用戶,也許是其他程序員,也許是系統(tǒng)管理員。對(duì)于這些不同的人群,最少驚奇的意義也不同。關(guān)注傳統(tǒng)慣例,這些慣例的存在有個(gè)極好的理由:緩和學(xué)習(xí)曲線。

最小立異原則的另一面是避免表象相似而實(shí)際卻略有不同。這會(huì)極端危險(xiǎn), 因?yàn)楸硐笙嗨仆鶎?dǎo)致人們產(chǎn)生錯(cuò)誤的假定。所以最好讓不同事物有明顯區(qū)別,而不要看起來(lái)幾乎一模一樣。

2.11 ?緘默原則:如果程序沒(méi)什么好說(shuō)的,就保持沉默

行為良好的程序應(yīng)該默默工作,決不嘮嘮叨叨。沉默是金,這個(gè)原則的起始是源于Unix 誕生時(shí)還沒(méi)有視頻顯示器,每一行多余的輸出都會(huì)嚴(yán)重消耗用戶的寶貴時(shí)間。現(xiàn)在這種情況已不復(fù)存在, 但一切從簡(jiǎn)的這個(gè)優(yōu)良傳統(tǒng)流傳至今。

簡(jiǎn)潔是 Unix 程序的核心風(fēng)格。一旦程序的輸出成為另一個(gè)程序的輸 入,就很容易把需要的數(shù)據(jù)挑出來(lái)。站在人的角度上來(lái)說(shuō),重要信息不應(yīng)該混雜在冗長(zhǎng)的程序內(nèi)部行為信息中。如果顯示的信息都是重要的,那就不用找了。設(shè)計(jì)良好的程序?qū)⒂脩舻淖⒁饬σ暈橛邢薜膶氋F資源,只有在必要時(shí)才要求使用,避免不必要的信息對(duì)用戶的打擾。

2.12 ?補(bǔ)救原則:出現(xiàn)異常時(shí),馬上退出并給出足量錯(cuò)誤信息

軟件在發(fā)生錯(cuò)誤的時(shí)候也應(yīng)該與在正常操作的情況下一樣,有透明的邏輯。最理想的情況當(dāng)然是軟件能夠適應(yīng)和應(yīng)付非正常操作;而如果補(bǔ)救措施明明沒(méi)有成功,卻悄無(wú)聲息地埋下崩潰的隱患,直到很久以后才顯現(xiàn)出來(lái),這就是最壞的一種情況。

因此,軟件要盡可能從容地應(yīng)付各種錯(cuò)誤輸入和自身的運(yùn)行錯(cuò)誤,如果做不到這一點(diǎn),就讓程序盡可能以一種容易診斷錯(cuò)誤的方式終止。

“寬容地收,謹(jǐn)慎地發(fā)”。就算輸入的數(shù)據(jù)不規(guī)范,設(shè)計(jì)良好的程序也會(huì)盡量領(lǐng)會(huì)其中的意義,盡量與別的程序協(xié)作;然后,要么響亮地倒塌,要么為工作鏈下一環(huán)的程序輸出一個(gè)嚴(yán)謹(jǐn)干凈正確的數(shù)據(jù)。

設(shè)計(jì)時(shí)要考慮寬容性,不是用過(guò)分縱容的實(shí)現(xiàn)來(lái)補(bǔ)救標(biāo)準(zhǔn)的不足,否則一不留神你會(huì)死得很難看。

2.13 經(jīng)濟(jì)原則:寧花機(jī)器一分,不花程序員一秒

在 Unix.早期的小型機(jī)時(shí)代,這一條觀點(diǎn)還是相當(dāng)激進(jìn)的;隨著技術(shù)的發(fā)展,開(kāi)發(fā)公司和大多數(shù)用戶都能夠得到廉價(jià)的機(jī)器,所以這一準(zhǔn)則的合理性就不用多說(shuō)。

在保證質(zhì)量的前提下,盡量使用計(jì)算機(jī)資源完成任務(wù),減輕程序員負(fù)擔(dān),另一個(gè)可以顯著節(jié)約程序員時(shí)間的方法是,教會(huì)機(jī)器如何做更多低層次的編程工作。關(guān)注微信公眾號(hào)【嵌入式系統(tǒng)】

2.14 ?生成原則:避免手撕, 盡量編寫程序去生成程序

眾所周知,人類很不善于干辛苦的細(xì)節(jié)工作。程序中的任何手工操作都是滋生錯(cuò)誤和延誤的溫床,由程序生成代碼幾乎總是比手寫代碼廉價(jià)并且更值得信賴。

對(duì)于代碼生成器來(lái)說(shuō),需要手寫的重復(fù)而麻木的高級(jí)語(yǔ)言代碼,與機(jī)器碼一樣是可以批量生產(chǎn)的。當(dāng)代碼生成器能夠提升抽象度時(shí),即當(dāng)生成器的說(shuō)明性語(yǔ)句要比生成碼簡(jiǎn)單時(shí),使用代碼生成器會(huì)很合算,而生成代碼后就根本無(wú)需再費(fèi)力地去手工處理。在 Unix 中大量使用代碼生成器使易于出錯(cuò)的細(xì)節(jié)工作自動(dòng)化。

2.15 ?優(yōu)化原則:雕琢前先得有原型,跑之前先學(xué)會(huì)走

原型設(shè)計(jì)最基本的原則,“90%的功能現(xiàn)在能實(shí)現(xiàn),比100%的功能永遠(yuǎn)實(shí)現(xiàn)不了強(qiáng)”。做好原型設(shè)計(jì)可以避免為蠅頭小利而投入過(guò)多的時(shí)間。

“ 不應(yīng)考慮蠅頭小利的效率提升,過(guò)早優(yōu)化是萬(wàn)惡之源”,不知道瓶頸所在就匆忙進(jìn)行優(yōu)化,這可能是唯一一個(gè)比亂加功能更損害設(shè)計(jì)的錯(cuò)誤。從畸形的代碼到雜亂無(wú)章的數(shù)據(jù)布局,犧牲透明性和簡(jiǎn)潔性而片面追求速度,滋生無(wú)數(shù) bug, ? 耗費(fèi)以百萬(wàn)計(jì)的人時(shí),這點(diǎn)芝麻大的好處,遠(yuǎn)不能抵消后續(xù)排錯(cuò)所付出的代價(jià)。

過(guò)早的局部?jī)?yōu)化實(shí)際上會(huì)妨礙全局優(yōu)化,從而降低整體性能。在整體設(shè)計(jì)中可以帶來(lái)更多效益的修改常常會(huì)受到一個(gè)過(guò)早局部?jī)?yōu)化的干擾,導(dǎo)致出來(lái)的產(chǎn)品既性能低劣又代碼過(guò)于復(fù)雜。

在 Unix 世界里,有一個(gè)非常明確的悠久傳統(tǒng):先制作原型,再精雕細(xì)琢。優(yōu)化之前先確保能用,先能走,再學(xué)跑。從另一種不同的文化將這一點(diǎn)有效地?cái)U(kuò)展為:先求運(yùn)行,再求正確,最后求快。

所有這些話的實(shí)質(zhì)其實(shí)是一個(gè)意思:先設(shè)計(jì)做個(gè)未優(yōu)化的、運(yùn)行緩慢、很耗內(nèi)存但是正確的實(shí)現(xiàn),然后進(jìn)行系統(tǒng)地調(diào)整,尋找那些可以通過(guò)犧牲最小的局部簡(jiǎn)潔性而獲得較大性能提升的地方。

2.16 多樣原則:決不相信所謂“不二法門”的斷言

即使最出色的軟件也常常會(huì)受限于設(shè)計(jì)者的想象力。沒(méi)有人能聰明到把所有東西都最優(yōu)化,也不可能預(yù)想到軟件所有可能的用途。

對(duì)于軟件設(shè)計(jì)和實(shí)現(xiàn)來(lái)說(shuō),Unix 傳統(tǒng)有一點(diǎn)很好,即從不相信任何所謂的“不二法門”。Unix 奉行的是廣泛采用多種語(yǔ)言、開(kāi)放的可擴(kuò)展系統(tǒng)和用戶定制機(jī)制;吸收并借鑒各種優(yōu)秀的設(shè)計(jì)思想,不斷完善自己的設(shè)計(jì)方法和風(fēng)格。

2.17 擴(kuò)展原則:設(shè)計(jì)著眼未來(lái),未來(lái)總比預(yù)想快

為數(shù)據(jù)格式和代碼留下擴(kuò)展的空間,否則,就會(huì)發(fā)現(xiàn)常常被原先的不明智選擇捆住了手腳,因?yàn)闊o(wú)法既要改變它們又要維持對(duì)原來(lái)的兼容性。

設(shè)計(jì)協(xié)議或文件格式時(shí),應(yīng)使其具有充分的自描述性以便可擴(kuò)展。要么包含版本號(hào),要么采用獨(dú)立、自描述的語(yǔ)句,按照可以隨時(shí)插入新的、換掉舊的,而不會(huì)破壞格式讀取代碼的方法組織格式。Unix 經(jīng)驗(yàn)表示:稍微增加一點(diǎn)讓數(shù)據(jù)部署具有自描述性的開(kāi)銷,就可以在無(wú)需破壞整體的情況下進(jìn)行擴(kuò)展,小的付出也可得到成千倍的回報(bào)。

設(shè)計(jì)代碼時(shí),要有很好的組織,讓將來(lái)的開(kāi)發(fā)者增加新功能時(shí)無(wú)需拆毀或重建整個(gè)架構(gòu)。這個(gè)原則并不是說(shuō)隨意增加根本用不上的功能,而是建議在編寫代碼時(shí)要考慮到將來(lái)的需要,使以后增加功能比較容易。程序接合部要靈活,在代碼中加入“如果擴(kuò)展...需要…”的注釋,有義務(wù)給之后使用和維護(hù)自己編寫的代碼的人做點(diǎn)好事,也許將來(lái)就是自己來(lái)維護(hù)代碼,設(shè)計(jì)為將來(lái)著眼,節(jié)省的有可能就是自己的精力。

2.18 關(guān)注微信公眾號(hào):嵌入式系統(tǒng)

嵌入式軟件開(kāi)發(fā),原廠掌握著底層,寄存器細(xì)節(jié)已經(jīng)被封裝,大部分程序員都是上層開(kāi)發(fā),上層應(yīng)用更多的考慮設(shè)計(jì)模式和開(kāi)發(fā)原則,也即本文所述類似。關(guān)于這類文章可以關(guān)注微信公眾號(hào)【嵌入式系統(tǒng)】,提高嵌入式軟件開(kāi)發(fā)的思路和境界。

3 應(yīng)用Unix哲學(xué)

這些富有哲理的原則決不是模糊籠統(tǒng)的泛泛之談。在Unix 世界中,這些原則都直接來(lái)自于實(shí)踐,并形成了具體的規(guī)定。

運(yùn)用Unix 哲學(xué),就應(yīng)該不斷追求卓越。軟件設(shè)計(jì)是一門技藝,值得付出智慧、創(chuàng)造力和激情。否則就不會(huì)超越那些簡(jiǎn)單、老套的設(shè)計(jì)和實(shí)現(xiàn);就會(huì)在應(yīng)該思考的時(shí)候急急忙忙去編程,就會(huì)在該無(wú)情刪繁就簡(jiǎn)的時(shí)候反而把問(wèn)題復(fù)雜化,就會(huì)反過(guò)來(lái)抱怨代碼怎么那么臃腫、難以調(diào)試。

要良好地運(yùn)用 Unix 哲學(xué),永遠(yuǎn)不要蠻干;要多用巧勁,省下力氣到需要的時(shí)候再用,好鋼用在刀刃上。善用工具,盡可能將一切都自動(dòng)化。

4 態(tài)度

軟件設(shè)計(jì)和實(shí)現(xiàn)是一門充滿快樂(lè)的藝術(shù), 一種高水平的游戲。為什么要從事軟件設(shè)計(jì)而不是別的呢?可能現(xiàn)在只是為了賺錢或打發(fā)時(shí)間,也可能曾經(jīng)也認(rèn)為軟件設(shè)計(jì)改變世界,值得付出激情。

更多編碼原則或思想的文章,可關(guān)注微信公眾號(hào)【嵌入式系統(tǒng)】,閱讀《嵌入式軟件的設(shè)計(jì)模式(上)》、《嵌入式軟件的設(shè)計(jì)模式(下)》、《嵌入式軟件設(shè)計(jì)原則隨想》、《嵌入式C編碼規(guī)范》、《嵌入式軟件的問(wèn)題分析》、《基于RTOS的軟件開(kāi)發(fā)理論》、《嵌入式軟件分層隔離的典范》等。

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
AT45DB321E-SHF-T 1 Adesto Technologies Corporation Flash, 32MX1, PDSO8, 0.208 INCH, GREEN, PLASTIC, SOIC-8

ECAD模型

下載ECAD模型
$4.19 查看
MCT62S 1 Fairchild Semiconductor Corporation Transistor Output Optocoupler, 2-Element, 5000V Isolation, SURFACE MOUNT, DIP-16
$1.1 查看
PS2701-1-A 1 NEC Compound Semiconductor Devices Ltd Transistor Output Optocoupler, 1-Element, 3750V Isolation, LEAD FREE, PLASTIC, SOP-4
$1.05 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

嵌入式系統(tǒng)開(kāi)發(fā)技術(shù)交流,軟件開(kāi)發(fā)的思路與方案共享,行業(yè)資訊的分享。