“代碼是寫給人看的,而機器碼才是給機器看的。”
在給新生進行的培訓課程上面,我又一次給尚未對編碼世界有任何瞭解的同學做了如上的闡述,字字鏗鏘有力,不帶半點鐘猶豫。
想想看來,作為一個現在很多書上都會提到的觀點,上面那句話已經成為了像我一樣剛入編碼世界不久,但是認識不深,卻又渴望找尋公理的後生們公認的不二法門了。
於是,我們在平時編寫代碼的過程中便不斷提醒自己,”代碼是寫給人看的“,所以我們的代碼會很服服貼貼地遵循一些大家公認的,會讓代碼變得更易讓人看懂的”規矩“——代碼風格、編程範式甚至架構約束等等。
可這幾天轉念一想,這句話裡面偏偏很可能存在著某種謬論吧。
暫時先不提這個謬論,我們先來舉舉現實生活中的例子——這樣待會提出這個我覺得有些謬誤的謬論的時候,你才不會在思維慣性之下,立馬認為我這是一紙胡謅。
人類可以超脫於其他生物而成為這個星球的最大、最強的宿主,很大的一個原因就是因為我們會利用各種工具。
古老的牛車、現代的車床等等,都是很經典的工具。但是我們有沒有在這些工具上面聽到過這類言論呢——為了保證駕駛牛車的農夫的舒適度,我們可以把給牛車配備的裝備的品質降低一些,再把這些節約下來的開支用來給農夫買一個更舒適的牛車坐墊;為了保證車床車工工作的效率,我們可以讓車床本身執行一些不必要的操作——例如讓它啟動並執行轉速比標準的更慢一些,好讓車工能夠更精細地操作他的儀器。
據我所知,在這些比較成熟的工具中(至少存在的曆史長於電腦),類似於上述的說法往往是比較荒謬的——因為如果按照上面的說法去進行所謂的提高人工作效率的改變,那往往我們的活兒就沒法按時幹完了。
而在軟體開發這個行業中,我們一直在走上面所述的在其他領域看來比較荒謬的路——我們一路過來都在把軟體開發變成一種對人而言的更為舒適,更為高效的工作,但是卻一直都沒有把機器工作的效率的提高作為我們的主要發展目標之一。
這便是我剛才提到的讓我有些疑惑的”謬論“。
讓我們看看程式設計語言的發展路線,便能夠更進一步瞭解這種趨勢了。首先我們早期的程式員在紙帶上打下一行行代表機器碼的孔洞,然後交給機器處理;接著我們發明了機器碼的對應符號語言——組合語言,讓我們走出了”用硬體編寫軟體“的時代——但是我們終於和原原本本的機器之間有了彙編器這個隔閡;然後我們還是不滿足,發明了抽象層次更高的c語言、pascal語言等中低級語言,而且後來為了迎合object oriented programing的範式,發明了c++——這些工作讓我們的代碼和機器之間有了編譯器和彙編器兩層隔閡;接著我們又發明了java、c#這些平台化的語言,於是這些隔閡裡面又多了一層解譯器;更為近期的動態是,我們發明了完全解釋執行的語言——例如perl、ruby、python等,而這時我們的代碼和機器之間加上了最為笨重的解釋執行器;最為極端的是DSL,領域專屬語言,例如sql——我們甚至都不再告訴機器該怎麼做了,而僅僅告訴機器做什麼即可(Don't
tell the machine how, just tell the machine what.)——而此時,我們和機器之間的距離就如同在摩天大廈水泥樓頂的人和地面沃土之間的距離了。
是的,我們一直都在努力,讓人的效率變的更高——這麼做的代價是讓機器的工作效率變的更低。
不知道大家聽說過安迪-比爾定律沒有。
這個定律是目前IT業界發展遵循的三大定律的之一——其他兩個定律分別是大名鼎鼎的摩爾定律和它的反定律,反摩爾定律。
安迪-比爾定律中的安迪指的是Intel公司的總裁安迪格羅夫,而比爾就指的是大家都認識的比爾蓋茨。定律最簡明的闡述是:安迪提供了什麼,比爾就拿走了什麼。
什麼意思呢?
一句話概括來說,安迪的Intel公司遵循摩爾定律給IT業界帶來的18個月翻番的計算能力,都被比爾蓋茨的新版Windows佔有、拿走了。
更通俗點講,為什麼我們需要不停的更新電腦來為微軟的最新作業系統鋪路呢?為什麼和我們兩年之前的電腦相比有兩倍多的計算能力的新電腦,在今天卻還是僅僅只能剛好配的上最新的Windows——甚至是很勉強的那種呢?
答案很簡單——比爾拿走了安迪費了好大力氣整過來的計算能力,而且是以一種很魯莽的方式——和以前相比越來越低效的、越來越不機器友好的代碼。
比爾本人也對他的員工發過類似的牢騷——”我早年用彙編搞的Basic,整個環境也就三百多k,而你們現在搞的.NET,大約三百多兆。但是.NET真的相對於Basic強了一千多倍嗎?顯然不是。“
跟著我的敘述,你也應該開始在心目中形成了一種觀點——確實,我們軟體開發的發展道路過於有些傾向於人的工作效率了——人在這個領域中被溺愛了,而同樣很重要的工具本身被我們打入冷宮,成為了第二個考慮的因素。這個觀點的正確與否我們姑且不予置評,但我們應該瞭解的是它必然存在一定的說服力。
那現在就引出了一個問題——究竟是人的效率,還是機器的效率更重要?
關於這個問題,或許會像一些本身就無法下定論的問題一樣,大家分成兩派,然後進行激烈的討論甚至辯駁——然而終究是得不出一個一鎚子釘死的結論的。
如果這個問題本身就有它的爭執性的話,那我就姑且不班門弄斧說自己是哪個門派的了,我就僅僅闡述自己的幾個比較原則性的觀點吧。
第一個是中庸,抑或可以被稱之為平衡。如果一個事物有兩個都不能割捨的而且相互對立的方面的話,那這個事物發展下去,最終只有一個結果——它們找到平衡,從而讓這個事物穩定下來,找到最終的形態。
第二個來自敏捷宣言,人和互動重於過程和工具。
第三個是我的c語言老師的名言——年輕人要有恒心,敢於深入底層,並知道機器在做什麼。你機器在做什麼都不知道,那你何來機器跑起來很舒服的代碼?
呵呵,雖然說我不表達我的支援的論點,但是我想你也應該對我不言自明的想法有一定的瞭解了吧?
那,人的效率和機器的效率各自的重要性,你是怎麼看的呢?