对话高博(一)| 机器码、Pascal,以及计算机学习的分形
高博,1983年生,上海交通大學(xué)計算機科學(xué)與工程專業(yè)本科、軟件工程碩士?,F(xiàn)任博曉文化傳媒集團總裁,香港衛(wèi)視科教臺臺長。職場經(jīng)歷豐富,曾在數(shù)家世界500強IT和互聯(lián)網(wǎng)企業(yè)打造明星團隊。專業(yè)興趣包括軟件測試及大規(guī)模自動化、持續(xù)交付和基礎(chǔ)算法研究。業(yè)余愛好寫作和翻譯,2009年至今翻譯超過100萬字,包括圖靈獎作者高德納作品《研究之美》和布魯克斯作品《設(shè)計原本》、Jolt生產(chǎn)力大獎作品《元素模式》等,并以譯作《信息簡史》獲中國國家圖書館第九屆文津獎。
你小時候是怎么學(xué)習(xí)計算機的?
我從4歲時就開始學(xué)習(xí)使用計算機進行程序設(shè)計,我當(dāng)時學(xué)的語言叫Algo-60,這個語言就是現(xiàn)在的Pascal和C的前身,Algo-60的設(shè)計者N. Wirth也是Pascal的設(shè)計者。當(dāng)時的計算機和現(xiàn)在非常的不一樣,我們現(xiàn)在完全在使用軟件進行計算機的各種配置,這種配置程序在Windows操作系統(tǒng)里被叫作控制面板(control panel)。但是對于當(dāng)時的計算機(我見過的型號叫709)而言,控制面板是真正的硬件操作臺,上面有各種扳手和旋鈕?,F(xiàn)在很少有人見過、甚至聽說過什么是穿紙帶。紙帶其實就相當(dāng)于現(xiàn)在的機器碼,而機器碼就是010101。這些早年的經(jīng)歷,特別是從高級語言編譯成低級指令,并且實實在在地變成紙帶上的物理小孔的經(jīng)歷,對我今后的計算機學(xué)習(xí)在原理認(rèn)識的幫助是很大的。4歲的這一年我還接觸到了一個極其重要的東西,就是Internet,當(dāng)時當(dāng)然沒有萬維網(wǎng),一切都是Telnet(FTP不知道當(dāng)時有沒有,反正我是沒有用過的),我當(dāng)時對于遠程控制這件事簡直覺得神奇極了,但是上機時間前后加起來也就是半小時不到,大概是怕我這個小孩子把昂貴的設(shè)備弄壞了吧。所以,這些印象真的是寶貴極了,我也因此感覺自己是非常幸運的,能夠這么早地接觸到真正的計算機和Internet。
我在上小學(xué)的時候,計算機已經(jīng)進入了大規(guī)模集成電路時代。這個時候絕大多數(shù)的家庭還負(fù)擔(dān)不起購置一臺計算機的費用,更不用說我所在的那個小縣城了。我卻幸運地得到了一臺當(dāng)時廣告做得鋪天蓋地的小霸王學(xué)習(xí)機,使用硬卡提供了最簡單的一些軟件,并帶有10K不到的內(nèi)存。但是學(xué)習(xí)機很快就完全無法滿足我的要求了,尤其是我當(dāng)時就早已見過真正的計算機是什么樣子。1995年,我在上初一的時候第一次接觸了PC,我在宿州市輕工業(yè)學(xué)校見到了PC和DOS,還有西山DOS中文系統(tǒng)。我已經(jīng)提前看到了一些書,但上機以后才能體會到書上講的東西是多么有意思。當(dāng)時我還一點DOS命令都不會,只能請機房工作人員幫我運行起西山DOS進入中文界面,然后啟動WPS來編輯文檔。我記得很清楚,當(dāng)時的輸入法已經(jīng)有了強大的聯(lián)想功能。安徽省宿城第一中學(xué)是我系統(tǒng)地學(xué)習(xí)程序設(shè)計的發(fā)端,我在那里比較系統(tǒng)和深入地學(xué)習(xí)了Pascal語言。
從你的角度上說,你建議別人如何系統(tǒng)地學(xué)習(xí)計算機?
從我個人的學(xué)習(xí)經(jīng)歷來講,我感覺一個人在學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法之前,真的應(yīng)該先掌握至少一門程序設(shè)計語言。通過程序設(shè)計語言,就可以知道怎么樣地和計算機的細部打交道。在學(xué)習(xí)程序設(shè)計語言的時候,有好幾項基礎(chǔ)內(nèi)容是需要很多練習(xí)才能掌握的,就拿循環(huán)來說,很多人實際上就卡在這個環(huán)節(jié)上,想象不出來循環(huán)變量應(yīng)該怎么樣寫成一個循環(huán)體中的不變式。而跨不過這道坎,不能熟練地寫出循環(huán)結(jié)構(gòu),簡直就不可能寫出任何有意義的程序來了。所以現(xiàn)在的計算機教育中的一個很大的問題在于,教育者們已經(jīng)忘記了當(dāng)年自己是怎么樣從不懂到懂的一個經(jīng)歷,在一些他們自以為重要的問題上花了大量的問題,而在最簡單最基礎(chǔ)的內(nèi)容上,卻存在著極其重大的缺失,這讓學(xué)生痛苦萬分——正如IT教育家侯捷所說,勿在浮砂筑高臺。你連while循環(huán)都不會寫,怎么可能寫出二叉查找樹的遍歷程序呢?而考試中如果這樣的一個學(xué)生真的寫出了正確答案,除了死記硬背還有什么可能呢?
我在初中三年學(xué)習(xí)中,下了狠功夫來了解Pascal和C程序設(shè)計語言,還有DOS操作系統(tǒng)。我在為了信息學(xué)競賽的專項訓(xùn)練中,準(zhǔn)備是不足的。所以在初中時代表宿州市參加了幾次省級信息學(xué)競賽,卻一次獎項也沒有拿到。但是只要做出一道題并驗證通過,我就感覺到有一種實實在在的欣喜,因為我感覺我寫出來的程序可讀性會比較好一點,結(jié)構(gòu)也比較合理,可惜這些可能都不是信息學(xué)競賽要的,后者主要需要的是程序能夠在規(guī)定的時間內(nèi)給出符合格式的結(jié)果,所以無疑地對于算法的優(yōu)化才是重點和核心。
在我上初中的那個年代,鋪天蓋地地分發(fā)和使用的,都是DOS操作系統(tǒng),后面出了Windows 3.0以后又全都是16位的Windows了(還專門出了個簡體中文版的Windows 3.2)。這個時期Linux可以說是完全沒有任何滲透率的,我肯定是在2000年上了大學(xué)以后才第一次聽說了Linux操作系統(tǒng)。如果是現(xiàn)在開始學(xué)習(xí)程序設(shè)計,尤其是小孩子想要開始學(xué)習(xí)的話,我是非常非常推薦使用Raspberry Pi和上面運行的Debian Linux發(fā)行版本的。原因在于,Linux天生是個現(xiàn)代操作系統(tǒng),再少的系統(tǒng)資源上它也天然地具有現(xiàn)代內(nèi)存管理機制和多任務(wù)等,不像DOS,它上面的限制實在是太多了。分配超過640KB內(nèi)存就要采用很復(fù)雜的層機制,多任務(wù)更是只能采用迂回的辦法做出非常蹩腳的實現(xiàn)。操作系統(tǒng)所在的層次是包括硬件抽象的,它的設(shè)計直接決定了上層應(yīng)用的諸多限制條件。我在想,如果我當(dāng)年第一次接觸的就是Linux操作系統(tǒng),我建立起來的計算機基本觀念會有多么大的不同!
你的第一臺計算機是什么樣的?
我的父母在1995年就為我買了人生第一臺真正的計算機,是一臺486DX。這臺計算機配置了1M內(nèi)存(單位真的是M),504MB硬盤。這個配置當(dāng)然是非常低了,在當(dāng)時卻是相當(dāng)先進的??扇牲c之處在于,它配置了一臺當(dāng)時非常少見的彩色CRT顯示器。這是很舍得的投資。另一方面,它在計算和存儲上簡直是最小化的配置,也無意之間讓我不可能把大量的精力花在當(dāng)時對計算和存儲資源要求較高的電腦游戲上,而只能是潛心研究程序設(shè)計,到了2000年我上大學(xué)前夕我還在用這臺計算機,不過內(nèi)存被加到了4M,運行Turbo Pascal和Turbo C是綽綽有余了。可是這臺計算機在計算和存儲方面給我?guī)淼男睦黻幱耙彩蔷薮蟮?#xff0c;現(xiàn)在我在購置計算機的時候總是拼命選CPU最快的、存儲最大的,而且總是會不斷地購買大容量存儲,可以看作是這段生活的一個對潛意識的影響。
你高中轉(zhuǎn)學(xué)到了上海吧?這段經(jīng)歷對你學(xué)習(xí)計算機有什么幫助?
我上高中以后是作為一個比較活躍的計算機興趣小組的發(fā)起人和組織者來推進計算機學(xué)習(xí)和研究的。而我的高中生活的大背景則切換到了國際大都市上海,在這里可以更容易地找到一起學(xué)習(xí)和討論的同學(xué),而不像在小城市那邊始終都是那么幾個人。1996年底我接觸到了萬維網(wǎng),也隨即接觸到了HTML和JavaScript,我可能是國內(nèi)最早接觸到JavaScript的一批人。但我還在上高中,如果當(dāng)時就創(chuàng)業(yè)真的難以想象會怎么樣吧。這個時候Windows操作系統(tǒng)已經(jīng)開始爆發(fā)流行了,所以幾乎一夜之間我學(xué)的關(guān)于DOS程序設(shè)計的東西完全落伍了。時代的發(fā)展是非常殘酷的,但是在上大學(xué)之前,我對這個就有很深的感觸了。所以在此后的學(xué)習(xí)中,我極力去避免和任何軟件平臺和框架綁定,因為這些東西都是歷史的產(chǎn)物,也會隨著歷史的發(fā)展而消失。此前為信息學(xué)競賽而準(zhǔn)備的程序設(shè)計功底,可能唯一能看得到的回報就是得了一個市級競賽的獎項,在高考材料里面算得一個亮點,讓我被上海交通大學(xué)錄取到了計算機科學(xué)與技術(shù)專業(yè)。
大學(xué)期間你是如何學(xué)習(xí)計算機的?
我在上大學(xué)之前,就已經(jīng)感覺到自己應(yīng)該投入更多的精力在一些研究“軟件生產(chǎn)”上面,而不是在研究“編程技法”上面。上大學(xué)以后,我也確實更多地在投身入這個方面的研究。我可能是小時候?qū)懥颂啻a了,所以我非常明白,想把代碼寫正確,和期望一致是一件多么困難的事情。而任何一種要交付給客戶甚至大眾使用的軟件,它們背后要下的功夫都是非常可觀的。
從代碼到能夠交付的軟件,背后要付出的努力都有哪些?
軟件不僅僅包括“代碼”,代碼是一種靜態(tài)的、一旦寫完就不再改變的事物。而代碼運行起來才是真正的考驗開始之時。而這個“運行”,學(xué)問就大了。任何代碼都要經(jīng)過編譯、鏈接以后才能夠加載和運行,這個過程就涉及到庫代碼、他人撰寫的代碼,軟件的編譯器和鏈接器、軟件的軟運行環(huán)境(主要是操作系統(tǒng),但有些系統(tǒng)軟件或?qū)S铆h(huán)境軟件需要考慮更多)、硬件驅(qū)動和硬件設(shè)備。所有的這一切,都必須在適切的版本、正確的配置以及抽象層次之間緊嚙的配合之下,才能夠達到“運行起來”這個最簡單的目的。而運行起來以后,是否能達成和期望相符的運行結(jié)果、交互體驗和性能指標(biāo),則是每一個細節(jié)議題都可以寫成厚厚的一大本書的了。
在這其中,有無數(shù)的思想和方法論在碰撞,而且會催生很多完整的所謂軟件過程、表示、工具的成套設(shè)施,從任何一個方面研究下去,都會發(fā)現(xiàn)有很多有價值的內(nèi)容。所有軟件工程的基本思想都無外乎“提供一個封裝好的抽象層”,把一些細節(jié)隱藏起來,作為一個美好的抽象概念暴露出來,讓下游的軟件工程師能夠按照一個預(yù)先設(shè)定的概念集以事先規(guī)定的方式使用自己習(xí)慣的軟件工具來撰寫代碼,而把這些隱藏好的細節(jié)照顧起來,以適當(dāng)?shù)姆绞浇o下游的程序員以他所在的語境的抽象語言描寫的反饋。其實任何軟件說到底都是機器代碼的執(zhí)行,在這個最底層的層次上,沒有任何秘密可言,容不得任何錯誤。一切脫離機器碼層次的概念都是更高層的概念,對機器而言都是毫無意義的,都是為了人類方便理解機器運行機制而設(shè)置的抽象層。但是絕大多數(shù)的程序員,對于機器運行機制的理解,也最多只能達到從最頂層的抽象向下探究的兩到三個層次而已。
計算機運行機制的不同層次之間是否有哪些共通的東西?
計算機科學(xué)的研究和學(xué)習(xí)有著分形(fractal)的特性。無論在哪個層次上做研究,使用的理論和數(shù)學(xué)工具都是相似的,其中極有意思的是基本算法和基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)在各個層次上都發(fā)揮著作用,并且上一個層次和下一個層次之間還有差異性,有的時候這種差異性會給人以上一層次之一沙會是下一層次之一世界的奇妙層次感,更讓身處其境的研究者感覺到選擇之無止境。當(dāng)然,每一個層次又有每一個層次的獨特技巧,研究底層技術(shù)的研究者會更注意效率和簡潔性,而研究上層技術(shù)的研究者則更會注意概念完整性和一致性。研究中間層技術(shù)的研究性則會產(chǎn)生大量的工具類方法和產(chǎn)品,可是它卻又是變化最活躍的層次,并且要對上下游的技術(shù)都有完整成熟的理解才能被學(xué)術(shù)和工業(yè)界接受,而高級程序設(shè)計語言就恰恰處于這個層次,所以在這個領(lǐng)域里起的紛爭也就最多。但我反過來要講的是,往往我們要搞好這個層次,就非要往上下游的層次去多學(xué)一些東西才好,上游是科學(xué)理論和方法論,比如數(shù)理邏輯、離散數(shù)學(xué)、設(shè)計模式等,下游就是程序設(shè)計的機器細節(jié)。不過,任何層次上,都不能離于算法與數(shù)據(jù)結(jié)構(gòu),尤其是基本算法和基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),這方面的訓(xùn)練真的是千變?nèi)f化而又樂趣無窮的,生活中到處都是能夠拿來做算法和數(shù)據(jù)結(jié)構(gòu)訓(xùn)練的實際問題。
人在軟件開發(fā)中的作用是什么?
任何問題到最后都會落實為人的問題,計算機的問題也會落實到研究者和程序員的身上。這兩者的關(guān)系是難分難解的,哪怕是一個簡單到10行以內(nèi)的代碼可以解決的問題,它也一定有設(shè)計、有實現(xiàn)、有驗證,也一定有理論價值和工程價值。計算機就是這樣的一個領(lǐng)域,如果止步于第一步,也一樣可以產(chǎn)生一定的結(jié)果,但是深究下去就會發(fā)現(xiàn)無處不可拓展、無處不可優(yōu)化,這也是為什么同樣功能的軟件,它的成本可以是成百上千倍的差距。大量的功夫是花在人們不能一眼看到的地方的,人們的觀感和體驗好一分,后面需要付出的研究和工程代價可能是難以想像地大。這些觀念,都必須在程序員的最開始階段的培養(yǎng)和訓(xùn)練上,就要施加影響,讓所有的程序員都明白,做事最快的方法是什么,但什么是值得繼續(xù)深入下去分解成更細的工作,然后在這些方面追求卓越表現(xiàn)。
所有和IT相關(guān)的職業(yè),都毫無疑義地需要了解一線生產(chǎn)者,也就是做代碼撰寫、代碼測試、持續(xù)集成的工程師們的工作細節(jié)的人來擔(dān)當(dāng),而這樣的人可以成長到各個方向去,成為產(chǎn)品、運維、甚至市場銷售的人才,而只學(xué)了工業(yè)設(shè)計、營銷理論或是其他專業(yè)知識的人,如果沒有通過自學(xué)對于IT專業(yè)領(lǐng)域的理解達到一定的深度,則至多只能做配合的工作,如果一家以IT產(chǎn)品和服務(wù)為核心的企業(yè)不是按這個原則來招聘,那末必然會發(fā)生嚴(yán)重的問題。
更多精彩,加入圖靈訪談微信!
總結(jié)
以上是生活随笔為你收集整理的对话高博(一)| 机器码、Pascal,以及计算机学习的分形的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 经验分享——工具类
- 下一篇: 如何让 Drupal 使用 Wordpr