把這篇文章送給計算機專業(yè)的同學(xué),大學(xué)四年看起來很長,其實很短, 希望大家努力向上,有更高的雄心壯志,預(yù)祝大學(xué)旅途順利。
前些天有個計算機系的同學(xué)和我聊天,想在暑假做個人網(wǎng)站,博客之類的系統(tǒng),我勸他說計算機系的學(xué)生(其實不止是計算機系,可以擴展到所有熱愛編程的在校同學(xué))應(yīng)該有更高的雄心壯志,去挑戰(zhàn)更有難度的東西。
為什么這么說呢?因為我大學(xué)時吃過虧??!
我也是讀計算機系,上學(xué)的時候迷迷糊糊的,把計算機系的基礎(chǔ)課程學(xué)得一塌糊涂。
計算機基礎(chǔ)課被灌輸了一大堆的術(shù)語和概念:進(jìn)程、線程、信號量、分段、分頁,關(guān)系代數(shù),關(guān)系演算,范式,E-R模型,事務(wù),分層模型,TCP/IP,CSMA/CD,路由協(xié)議。 考試完就忘了,就還給老師了,反正和實際也聯(lián)系不起來。
還有C語言,我老是抱怨它沒有辦法實現(xiàn)漂亮的界面,運行結(jié)果在一個黑糊糊的窗口中,做不了有用的東西。
我那個時候在忙乎啥呢?主要學(xué)習(xí)怎么樣用VB做桌面系統(tǒng),怎么樣用HTML, JS去做網(wǎng)站,主要就這兩件事,小項目確實折騰了好幾個,但是技術(shù)水平一直停留在應(yīng)用層的最表面。
工作多年以后回頭看,基礎(chǔ)太重要了,大學(xué)期間有大塊的學(xué)習(xí)時間,沒有把這些計算機基礎(chǔ)知識學(xué)好實在是太可惜了。
所以如果你是在校的同學(xué),不要去折騰博客系統(tǒng),在線商城這些簡單的東西了,你應(yīng)該有更高的雄心壯志:要努力地去造輪子,造這些計算機基礎(chǔ)的輪子。
為什么要造輪子?因為基礎(chǔ)課有點枯燥,概念太多,和實踐聯(lián)系太少,教材也不怎么樣,如果老師再照本宣科,那基本上就完了。
通過造輪子的方式驅(qū)動、可以引領(lǐng)對這些基礎(chǔ)知識的學(xué)習(xí)。
現(xiàn)在至少有這些輪子可以供你選擇:
關(guān)系數(shù)據(jù)庫是軟件開發(fā)中最常見的一個組件,它的工作原理是必然要掌握的,造一個輪子涉及到這么多知識:
1. 實現(xiàn)對SQL的解析,你需要實現(xiàn)一個語法分析器, 《編譯原理》的基礎(chǔ)知識就用上了。
2. 數(shù)據(jù)需要保存到硬盤上,你需要考慮存儲引擎,涉及到《操作系統(tǒng)知識》需要對外提供接口,設(shè)計數(shù)據(jù)結(jié)構(gòu),《數(shù)據(jù)結(jié)構(gòu)》的知識就會用上
3. 需要實現(xiàn)索引,B+樹是必須的,又是數(shù)據(jù)結(jié)構(gòu)
4. 需要做表的Join,事務(wù)的ACID, 又有各種算法
5. 如果需要提供網(wǎng)絡(luò)訪問,還要涉及到socket等計算機網(wǎng)絡(luò)的知識。
可能會覺得有點難, 但是現(xiàn)在有一個開源的例子:SQLite, 核心代碼只有幾萬行左右,網(wǎng)上相關(guān)的小書,文章多如牛毛,官方的文檔寫得也很棒,例如這個講 SQLite Architecutre 的文章:
https://www.sqlite.org/arch.html
GitHub上還有人在教你一步一步地實現(xiàn)SQLite, 比如這一個:https://cstack.github.io/db_tutorial/, 你也可以參與進(jìn)去,成為一個貢獻(xiàn)者,這要比整一些面經(jīng)、盜版PDF來賺star不知道好多少倍。
關(guān)鍵是看你有沒有定力,愿意深入進(jìn)去學(xué)習(xí)了。你要是把它搞定了,會學(xué)到很多知識,在大廠面試中也是極大的兩點。
不是讓你寫一個像Windows、Linux那樣完整的操作系統(tǒng),那是成千上萬的人經(jīng)年累月的勞動完成的。
我這里說的操作系統(tǒng)是操作系統(tǒng)的內(nèi)核,或者更簡單一點,操作系統(tǒng)課程的大實驗,就是能把一個小系統(tǒng)跑起來,能夠把進(jìn)程、線程、分頁、調(diào)度這些概念能夠真真切切地體現(xiàn)到代碼中,有個直觀的認(rèn)識。
中國的知名大學(xué),世界知名大學(xué)的操作系統(tǒng)課都有大實驗,有一個現(xiàn)成的小系統(tǒng)讓你去學(xué)習(xí),分析。比如MIT有xv6,哈佛有OS/161,伯克利有Nachos,斯坦福有PrintOS, 清華有ucore等等。這些代碼全是開源的,也都在1兩萬行上下,完全可以在大學(xué)期間啃下來。
有些還有配套的視頻,比如清華在線的慕課:https://next.xuetangx.com/course/THU08091000267/1516699
現(xiàn)在市面上的編程語言太多了,你可能會選擇一個作為自己吃飯的語言,比如Java, 但是在工作以后,你會受到各種新語言,尤其是熱門語言的誘惑,忍不住就想去碰一下。
實際上語言雖多,但是語言特性卻沒多大的發(fā)展,無非是面向過程,面向?qū)ο?,函?shù)式,元編程,錯誤處理,泛型,靜態(tài)類型,動態(tài)類型,字節(jié)碼等等。
(參見文章《兩年,我學(xué)會了所有的編程語言》)
如果自己能實現(xiàn)一個語言,把這些特性包含進(jìn)去,豈不是很爽?這樣你以后無論看到任何語言,你都能理解它為什么那么設(shè)計,有什么優(yōu)缺點,對語言的認(rèn)識會非常深刻。
不用擔(dān)心從哪里下手,市面上有很多的資料,叫《自制編程語言》的書都有兩本, 還有《兩周自制腳本語言》,編譯器相關(guān)的書也非常多。
很多現(xiàn)代的語言都是基于虛擬機和字節(jié)碼的,例如Java, Python, Ruby , 連JavaScript都要編譯成字節(jié)碼被瀏覽器執(zhí)行了。
(參見文章《字節(jié)碼萬歲》)
所以寫一個高級語言虛擬機也是一個非常有用的實踐,你需要理解字節(jié)碼指令,實現(xiàn)順序、分支、循環(huán),函數(shù)調(diào)用,多態(tài)等功能,非常有趣。
這個范圍很廣,可以是:
像Ngnix 那樣的HTTP服務(wù)器:實現(xiàn)HTTP協(xié)議,學(xué)習(xí)epoll,反向代理,模塊化設(shè)計等等
或者像Tomcat這樣Web應(yīng)用服務(wù)器,既支持HTTP協(xié)議,又可以運行Servlet和JSP。
或者是Redis這樣的高性能的緩存服務(wù),學(xué)習(xí)它和客戶端的協(xié)議設(shè)計,如何快速地存取數(shù)據(jù),對外提供的API,持久化等。
有人說它們屬于中間件,也有道理,因為不是OS和數(shù)據(jù)庫這樣的基礎(chǔ)軟件,又不是單純的應(yīng)用軟件,將來工作以后,日常打交道非常多,造一個輪子,發(fā)到GitHub上, 寫到簡歷中,非常吸睛。
在大學(xué)期間能搞定其中的一個就行, 我個人更推薦數(shù)據(jù)庫和操作系統(tǒng)。
這些輪子非??简炄说膶W⒘湍托?,你的同學(xué)都在寫漂亮的網(wǎng)頁,而你呢,孤獨地面對著C語言和指針, 有點結(jié)果也只會輸出到黑乎乎的命令行窗口中,很容易放棄。
但是你知道,這才是技術(shù)這顆大樹的根,把根栽好了,剩下的枝和葉都是非常容易得到的東西。
越是厲害的公司,越是厲害的崗位,對根基的要求就越高,因為招式容易練習(xí),但是基礎(chǔ)卻需要長時間的艱苦積累。
和大家一起共勉。