#每周讀書#黑客與畫家

提問:《黑客與畫家》中,作者曾在書中提到,“效率低下的軟件并不等于很爛的軟件" 這句話如何理解?作者的編程思維是?

答:理解這句話的關(guān)鍵是理解“效率低下”和“爛”,這是兩個(gè)有著相當(dāng)廣闊含義外延的中文詞匯。如果脫離文本語(yǔ)境去闡述,就像單獨(dú)去解讀《論語(yǔ)》中的某個(gè)字某句話,可能和作者表達(dá)的本意有較大出入。

“效率低下”:這里的效率低下不是貶義詞。作者說的效率低下不是指代碼運(yùn)行效率低下,比如一些沒有優(yōu)化過的,時(shí)間復(fù)雜度和空間復(fù)雜度很高的算法。效率低下是指為了架構(gòu)的優(yōu)美,可擴(kuò)展而犧牲了一定代碼效率。比如用C++寫一個(gè)計(jì)算圓形面積的程序,如果用用結(jié)構(gòu)化編程的方法把圓形面積計(jì)算公式直接寫到程序里肯定比用面向?qū)ο蟮姆椒▌?chuàng)造一個(gè)Class AreaCalc并且寫一個(gè)AreaCircleCalc的function的代碼效率要高,但是結(jié)構(gòu)化的代碼有局限性,只能計(jì)算圓形的面積,后期代碼維護(hù)起來(lái)很麻煩,所以作者認(rèn)為有更好架構(gòu)但是效率沒那么高的代碼更好。作者舉了Lisp語(yǔ)言里string和list的例子,引入string類型是一種“效率很高”的方式,而用list生成字符串是一種“效率很低”的方式。作者認(rèn)為不引入string類型能保持基本運(yùn)算符的簡(jiǎn)潔性,他并不認(rèn)可string這種“效率很高”的方式。更進(jìn)一步說,所謂的“效率低下”只是體現(xiàn)在某一個(gè)小規(guī)模的具體問題計(jì)算上,如果考慮到程序的擴(kuò)展及維護(hù),那些針對(duì)具體問題優(yōu)化到極致的程序反而會(huì)花掉程序員更多的時(shí)間(第一版開發(fā)+優(yōu)化的時(shí)間以及后續(xù)痛苦的維護(hù)時(shí)間)。隨著計(jì)算機(jī)計(jì)算能力的大幅提升,犧牲一部分計(jì)算效率換取優(yōu)良的代碼架構(gòu)是值得的。在4k內(nèi)存的年代,可以把代碼的優(yōu)化精確到寄存器,但是后續(xù)任何改動(dòng)都需要重寫代碼,這樣的“效率高”反而是“效率低”。

“爛”“爛”是一個(gè)意思豐富的中文詞,翻譯的時(shí)候存在一定的信息壓縮(并不是說阮一峰翻譯的不準(zhǔn)確,因?yàn)檎Z(yǔ)言表達(dá)習(xí)慣差異,這種信息壓縮難免的)?!逗诳团c畫家》是作者博文的摘編,作者的博客是免費(fèi)的,可以很容易找到原文(原文鏈接http://www.paulgraham.com/hundred.html),附上這一整段:

Inefficient software isn't gross. What's gross is a language that makes programmers do needless work. Wasting programmer time is the true inefficiency, not wasting machine time. This will become ever more clear as computers get faster.

這里“壞”用的是gross,同義詞是unpleasant,disgusting,讓人惡心,不舒服的意思。當(dāng)你打開一份沒有注釋,基本沒有命名習(xí)慣,類封裝隨意的代碼時(shí),一定可以體會(huì)到gross。可見這里的“壞”并不是說軟件的運(yùn)行效率很低或者bug很多,無(wú)法滿足目標(biāo)需求,而是指代碼的編寫習(xí)慣很差,讓人讀不下去。具體到這個(gè)語(yǔ)境下就是為了極限優(yōu)化計(jì)算效率而犧牲可讀性,擴(kuò)展性,可維護(hù)性的代碼。goto語(yǔ)句是一個(gè)想當(dāng)?shù)湫偷睦樱芏郈/C++的科班學(xué)子可能在教材的第一頁(yè)上就看到了對(duì)goto的批判。程序員手動(dòng)的使用goto可以一定程度上優(yōu)化代碼的效率(尤其是針對(duì)早期的編譯器以及早期捉襟見肘的硬件資源),但是大量的goto嚴(yán)重犧牲了程序的可讀性,大型程序幾乎無(wú)維護(hù)的可能,這樣的軟件看似efficient,但是gross。

總結(jié)一個(gè)程序的效率不光是指運(yùn)行的機(jī)器時(shí)間,還要考慮到程序員編寫以及維護(hù)這個(gè)程序需要的時(shí)間。隨著計(jì)算機(jī)運(yùn)算能力的大幅提高,程序員的時(shí)間會(huì)更加的寶貴。

作者的編程思維:好的編程語(yǔ)言以及好的代碼應(yīng)該是能夠幫助程序員節(jié)省時(shí)間的(包括開發(fā)和維護(hù)的時(shí)間),而不是為機(jī)器節(jié)省時(shí)間。編程的起點(diǎn)是一個(gè)高可靠性,可維護(hù)性,可復(fù)用的架構(gòu),具體填充代碼實(shí)現(xiàn)反而是下一步的工作。


拓展練習(xí)試著畫出編程語(yǔ)言的進(jìn)化脈絡(luò)

首先要討論一下“進(jìn)化”這個(gè)詞。作者在The Hundred-year Language里梳理了編程語(yǔ)言發(fā)展的歷史,談了自己的一些展望。中文里“進(jìn)化”是一個(gè)顯性的褒意詞,比以前變得更好了叫“進(jìn)化”。作者用的詞是evolve,確切地說是“演化”,演化是一個(gè)中性詞,單純表示發(fā)生了變化。馬哲里講世界是運(yùn)動(dòng)的,但是只有向上,向前的運(yùn)動(dòng)才是發(fā)展。evolve是運(yùn)動(dòng),但不一定是發(fā)展。進(jìn)化論是evolution,現(xiàn)在學(xué)界更傾向叫演化論。嚴(yán)復(fù)翻譯赫胥黎Evolution and Ethics時(shí)翻的特別好,叫《天演論》,他說演化不說進(jìn)化。

編程語(yǔ)言的演化脈絡(luò)是降低編寫程序的難度,或者說降低程序員操作計(jì)算資源的難度,讓寫代碼變得越來(lái)越輕松。這也符合人類社會(huì)的運(yùn)行規(guī)律。80年代的汽車駕駛員需要具備很強(qiáng)的修車能力,考駕照還要考機(jī)械結(jié)構(gòu),但是這些科目都從現(xiàn)在的駕考中消失了。如果要求開汽車的人必須了解汽車的結(jié)構(gòu),這對(duì)于汽車普及是相當(dāng)不利的。2012年360能夠完成珍珠港偷襲,主要得益于把軟件變得前臺(tái)妹子都能輕松使用(現(xiàn)在更進(jìn)一步,連安裝都不需要你動(dòng)手)。Ubuntu應(yīng)當(dāng)說為L(zhǎng)inux推廣做了巨大貢獻(xiàn),因?yàn)樗孡inux不再是專家級(jí)程序員的玩具。編程語(yǔ)言的發(fā)展也是類似,如果現(xiàn)在的程序開發(fā)還需要打紙帶,兒童編程基本沒有可能。

  • 第一代

第一代編程語(yǔ)言是機(jī)器語(yǔ)言,程序員直接和電子管,寄存器打交道。這樣的程序顯然書寫難度大,基本沒有維護(hù)的可能。

  • 第二代

第二代編程語(yǔ)言是匯編語(yǔ)言,一些寄存器操作被封裝成MOV,ADD這種指令,用一個(gè)指令代替多條機(jī)器指令。

  • 第三代

第三代編程欲言是高級(jí)語(yǔ)言,進(jìn)一步把MOV,ADD這種匯編指令封裝,程序員可以用接近自然語(yǔ)言的邏輯表達(dá)式書寫代碼,由編譯器負(fù)責(zé)把高級(jí)語(yǔ)言的代碼轉(zhuǎn)化成機(jī)器指令。高級(jí)語(yǔ)言也分很多流派,比如按照程序設(shè)計(jì)思想可以分為面向?qū)ο蠛兔嫦蜻^程。由于面向?qū)ο蟮拈_發(fā)是目前軟件開發(fā)中的主流,所以大部分語(yǔ)言都有面向?qū)ο蟮奶匦?。今?月份TIOBE的top10里只有C語(yǔ)言不是面向?qū)ο蟮?,以往也基本如此。按照編譯方法分為解釋型和編譯型語(yǔ)言:解釋型的又叫腳本語(yǔ)言,比如Python,Ruby,Perl;編譯型的比如C++,C#,Java等。一般地認(rèn)為編譯型語(yǔ)言更底層,能操作更底層的硬件資源,運(yùn)行效率高;而腳本語(yǔ)言往往是為了解決一些具體的問題,所以有著豐富的特定場(chǎng)景解決方案,但是運(yùn)行效率并不高。最典型的是python,由于有大量的科學(xué)計(jì)算,人工智能,模式識(shí)別的庫(kù),python幾乎是人工智能的首選語(yǔ)言。當(dāng)你使用一個(gè)更聰明的解釋器時(shí),解釋型語(yǔ)言的效率劣勢(shì)能得到很大彌補(bǔ),而且python相當(dāng)多的底層函數(shù)庫(kù)也是用c/c++開發(fā)的,實(shí)現(xiàn)了使用效率和運(yùn)行效率的平衡。可以預(yù)見在相當(dāng)長(zhǎng)的時(shí)間里,編程語(yǔ)言的舞臺(tái)還是高級(jí)語(yǔ)言的天下,而且是百花齊放,各有所長(zhǎng)。

  • 第四代
    下一代編程語(yǔ)言是值得展望的事情。如果以100年為時(shí)間尺度,下一代編程語(yǔ)言很可能超出我們的想象,一如讓1920年代的人類想象智能手機(jī)。下一代編程語(yǔ)言一定是打破馮諾伊曼計(jì)算架構(gòu)的,它可能工作在量子計(jì)算機(jī)或者DNA 計(jì)算機(jī)平臺(tái)上。下一代便成語(yǔ)言的編寫門檻更低,我們可以用自然語(yǔ)言描述需求,由人工智能負(fù)責(zé)代碼的實(shí)現(xiàn)??梢钥隙ǖ氖?,下一代編程語(yǔ)言可以讓大部分人變得更懶,大部分普通程序員(或者人人皆可為程序員)用著極少部分精英程序員開發(fā)的工具(或者底層代碼庫(kù),由中級(jí)程序員編寫工具)書寫著大量代碼。
?著作權(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)容

  • 《黑客與畫家》讀書筆記作者:【美】格雷厄姆 保羅·格雷厄姆其人其事 Y Combinator (Y運(yùn)算子,簡(jiǎn)稱YC...
    Cytosine閱讀 1,455評(píng)論 0 3
  • №.19 編程語(yǔ)言解析——編程語(yǔ)言怎么就火了? 所有的機(jī)器都有一張操作命令清單,讓我們控制它們。例如mp3上的打開...
    余鹿閱讀 839評(píng)論 0 0
  • 所有想做的事情就勇敢的去做,所有擁有的夢(mèng)都將成就自我。夜空中屬于你的那顆最亮的星,那就去點(diǎn)亮。 從升入初中的時(shí)候開...
    月夕成袂閱讀 349評(píng)論 2 2
  • 今天晚上和候選人dinner,回來(lái)9點(diǎn)多,洗完澡就幫媽媽開始看雙11的東西,然后這回才開始寫,就謝謝家里越來(lái)越懂事...
    職場(chǎng)小能手Sara閱讀 251評(píng)論 0 0
  • 接觸寫作有兩年多的時(shí)間了,接觸過不少的類型的文章,也遇到過各種各樣的編輯,剛接觸遇到過不給錢的,但是,大部分好像還...
    姜知曉閱讀 138評(píng)論 0 1

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