985 CS 科班畢業,對於電腦類課程安排非常了解~
今天認真梳理了一個 電腦的學習路徑和學習計劃 ,強烈建議想夯實電腦基礎的、提高核心競爭力的同學點贊收藏一波~
看完本回答你將知道(建議收藏):
- 電腦科班最核心的課程,以及先後順序
- CS基礎課最優質的公開課
- 如何成為一個電腦基礎紮實的科班畢業生
(PS:本回答為 @編程指北 原創,禁止轉載、抄襲、魔改,謝謝~
首先上一個電腦課程體系圖,基本上國內大多數電腦類院系的課程安排都是基於這個圖做一些修訂,大同小異:
上面課程太多了,重點不突出,為此我選出了「專業基礎課」和「專業必修課」:
我們學校上課的順序基本和上面第二張圖一樣, 個人覺得大概這樣設定CS課程更為合理:
大一上:C/C++程式設計、高數1(初等微積分)、離散數學
大一下:數位邏輯、數據結構、組合語言、物件導向編程(Java/C++)、高數2 、線性代數
大二上:軟體工程、資料庫、Java/Python Web開發、組成原理
大二下:作業系統、電腦網路、系統級編程(CSAPP)
大三:軟體測試、軟體安全、課程設計、密碼學、圖形學等選修方向
大四:實踐、畢設、實習
那麽我推薦的自學方式就是:
那麽有哪些優質公開課推薦呢?
大學看過幾十門公開課,幾百小時的視訊,大學主要就是靠 MOOC、B站,網易雲公開課,這次我要把我看過的覺得非常好的課程推薦給大家。
如果你還在校大二大三,我真的墻裂建議你去做一些國外的電腦 lab,比如OS、Network。
等到畢業了,幾乎就不太可能從頭開始系統學習那些基礎知識了,除非你能自己閉關兩三年,啥也不做,待在一個地方專心修煉。
好好珍惜在學校大把的空閑時間,做一些讓在專業上讓自己受益一生的事情。
這裏我可以列舉幾個,國內不少喜歡 System 的同學都會去跟 MIT、CMU、UCB 這些電腦名校的課程。
比如 MIT 的 6.824 Distributed System 、 6.830 Database Systems 、 MIT 6.828 Operating System Engineering、CS 144 .....
話不多說,直接上幹貨:
(PS: 大家記得收藏的時候,雙擊螢幕幫學長 @編程指北 點個贊呀!!只收藏不點贊的都是耍流氓,╭(╯^╰)╮
一、作業系統:
Operating System:
- MIT6.828,現在改名了叫為6.S081,核心就是xv6實驗,帶你完成一個mini os:
- 學堂線上上清華的作業系統,配套實驗是UCore:
- 哈工大李治軍老師的作業系統,實驗是基於 Linux 0.11,非常有趣:
我大三的時候基本看完了,講得非常好,還會涉及到源碼
數據結構
- 首推浙大陳越姥姥和何應欽老師講的數據結構,我看完了,覆蓋了主流的演算法和數據結構:
- 還有清華鄧俊輝老師的,分為上下兩篇,要稍微難一點:
下:
電腦網路:
還是哈工大!在這裏我要點名表揚哈工大的老師們,公開課錄制的非常不錯,資料庫、作業系統、電腦網路、編譯原理都很nice
- 哈工大的電腦網路,我看完了,相當細致:
- 但是國內電腦網路公開課幾乎都沒有實驗,你想手寫tcp、拳打 udp的話,建議食用 CS 144:
參考:
資料庫:
還是哈工大!因為我看過,戰德程老師講的:
- 哈工大資料庫系統,推薦:
哈爾濱工業大學-資料庫系統
- 還是一樣,如果你想手寫B樹、操作磁盤等等,建議參考國外一些公開課,這裏推薦 MIRT 6.830
這是一門資料庫系統的一門核心課程。前半部份比較基礎的資料庫的知識,後半段主要在講Distributed Databases的東西
實驗是讓你寫個小型關系型資料庫,比如 lab1實作資料庫基本的儲存邏輯結構,具體包括:Tuple,TupleDesc,HeapPage,HeapFile,SeqScan,BufferPool等。
電腦組成原理:
還是哈工大!yyds!
分為上線兩篇:
上:
下:
另外,我在這裏推薦一門電腦導論課,哈佛的 CS 50,對於轉專業、非科班的同學我都建議先去看一下:
很多同學問如何追上電腦科班學生呢?
那當然是他們學什麽,你就去補齊什麽呀!你把作業系統、組成原理、系統編程這些學了,認認真真的把電腦基礎打紮實了,那你其實就是一個「電腦科班學生了」
接下來說下我認為對一個「電腦知識體系完整的畢業生」最重要的課程,你至少得把下面這些課 都學了:
1、 程式語言:C/C++ (學好了這兩門,基本其它程式語言一周就上手了)
2、【系統級編程】(我們教材是CSAPP,這是我本科上過最值的課!System Programing)
3、【數據結構與演算法】
4、【組成原理和體系結構】
5、【作業系統】
6、【編譯原理】
7、【電腦網路】
8、【數學課】:線代、離散、高數
電腦科班剛畢業一年,大學如果知道這些,我可能會少走很多彎路!
在我相簿翻到了一張曾經的成績單,這是其中一學期的:
可以看到除了一些【形式與政策】這種「水課」,其它都是CS基礎課。 送大家一句話吧:
萬丈高樓平地起,勿在浮沙築高台。所以一定要在大學期間把基礎打牢固,整紮實,這是科班的核心競爭力!
而且非科班同學學完這些課,也可以說是科班了!
那麽怎麽學?
看書 + 看視訊 + 實踐
接下來推薦一些我覺得特別好的資料,盡量保持精簡:
(PS: 哭了,大家只收藏不點贊,記得雙擊螢幕點個贊呀~~
一、程式語言:C/C++
沒有比C語言更適合用來理解電腦系統了, 科班學生一定要學好 C語言。
推薦:【C程式設計語言】、【C與指標】、【C++ Primer】、【C++物件模型】、【Effective C++ 】
具體參考:
二、系統級編程
不用說肯定推薦【深入理解電腦系統】
其實它的簡介和第一章【電腦系統漫遊】已經寫得非常清楚了:
從一個簡單的hello world程式在電腦上的執行過程:
預處理->編譯->組譯->連結->可執行檔->裝載->數據流->螢幕輸出顯示
匯總成一句:資訊 = 位+上下文。
另外還有一本就是【程式設計師自我修養】+ 【Unix環境編程】
(PS:雙擊螢幕可以點贊收藏,記得幫我點個贊喲~
具體參考:
三、數據結構與演算法
【演算法第四版】、【演算法導論】、【劍指offer】
刷完基本面試找工作筆試面試都不怕了。
找工作的話,還需要刷大量的題,至少200道leetcode吧, 在這裏也送大家一本幫助我拿到BAT 等一線大廠 offer 的演算法筆記,是一位阿裏大神寫的,對於演算法薄弱或者需要提高的同學都十分受用,演算法一定是電腦學習的重中之重:
BAT面試官編寫的leetcode刷題筆記,看完秒殺80%的題目
具體參考:如何學習數據結構?
四、組成原理與體系結構
【電腦組成與設計:軟硬體介面】、【編碼】、【CSAPP】
五、作業系統
作業系統我推薦 看書 + 做lab的方式,比如 MIT6.828 xv6
書可以看【現代作業系統】,如果你想學個os,可以看【作業系統真象還原】
我當時應該是看了不少網課,然後自己跟著教程」抄了「一個 mini os。
學習作業系統一定不要去死看書,最好跟著那種有配套實驗完成一個os的課程或者書。
就像這種:
具體參考:
六、電腦網路
推薦【電腦網路自頂向下】、【TCP/IP詳解】
七、編譯原理
直接看龍書就好了,想寫指令碼可以看看【自制手稿語言】
說實話,把上面這幾門課學好了,國內大廠offer幾乎隨便拿了。
但是很多人忽視了基礎,往往在大學最該打基礎的時候去追求所謂的新技術。
所以不如談談到底「 如何才能成為一個電腦知識體系完整的畢業生 」吧?
在這裏,我粗淺的把電腦編程領域的知識分為三個部份:
具體可以看下這個回答:
我推薦大家花在「基礎 : 領域知識 : 技能」 接近 7 : 2 : 1。
這也是我推薦你在大學期間分配學習時間的比例,至少學習基礎知識的時間不少於 50%,當然,這些東西你都學完了那可以去找找感興趣的方向專研一下。
不要大一、大二一上來就紮進 Java Web、Python 爬蟲這種東西,這些可以學,但不是重點。
這篇文章也沒寫到具體該如何去學,有哪些好的資料,由於篇幅限制,我準備把這個單獨再寫一個 【How 篇】,持續關註我喲~
那麽如何檢驗學得如何呢?
想必你一定聽說這個計網面試題:
「從 URL 輸入到頁面展現到底發生什麽?「
這個問題換個表達就是「一個封包是如何發送到另外一台電腦的」,如果你能完整的說出整個過程,那麽計網你一定是學懂了!這就是為啥面試這麽喜歡問這個問題的原因。
那麽我們依葫蘆畫瓢提一個問題
「從程式碼被寫下到程式執行起來到底發生了什麽?」
這個問題回答得越詳細越好,基本上能說清,你就理解了編譯原理、作業系統、組成原理這三座大三。
如果覺得寫得不錯的話,記得幫我 @編程指北 點個贊喲