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