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