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