后悔大學(xué)沒(méi)看到這個(gè) Github 倉(cāng)庫(kù)!

經(jīng)常有大一的學(xué)妹或者非科班轉(zhuǎn)碼的學(xué)妹在后臺(tái)問(wèn)我,計(jì)算機(jī)都要學(xué)哪些課程,有什么先后順序。
有類似疑問(wèn)的小伙伴,可以參考Github上「清華大學(xué)計(jì)算機(jī)系課程攻略」

里面包含了清華CS專業(yè),大一到大四的課程以及推薦書籍資源等,鏈接如下:
https://github.com/PKUanonym/REKCARC-TSC-UHTgithub.com
截取一些課程目錄:
大一上:

大一下:

大二上:

大二下:

大三,專業(yè)課明顯多起來(lái)了:


大四主要是實(shí)踐、實(shí)習(xí)、畢設(shè),課不多:

不過(guò)說(shuō)實(shí)話,這份攻略對(duì)于我們大部分同學(xué)來(lái)說(shuō)都只能參考,課程量有點(diǎn)大,時(shí)間不充足的話,很難完全跟下來(lái)。
但是我覺(jué)得這里面大三下的課程非常棒:
操作系統(tǒng) 計(jì)算機(jī)系統(tǒng) 數(shù)值分析 數(shù)字圖像 存儲(chǔ)技術(shù) 搜索引擎技術(shù) 模式識(shí)別 機(jī)器學(xué)習(xí)
可以說(shuō)大三下的這些課程鋪墊非常不錯(cuò),不管以后走分布式存儲(chǔ)、搜索引擎等基礎(chǔ)架構(gòu)方向還是機(jī)器學(xué)習(xí)等算法方向,亦或是游戲引擎、圖形處理等方向,都算是入門了。
但是說(shuō)實(shí)話,清華這份攻略好是好,就是太多了,對(duì)于時(shí)間沒(méi)有那么充裕的同學(xué),想要一個(gè)更加精簡(jiǎn)的 List,可以參考網(wǎng)易云課堂上的計(jì)算機(jī)課程圖:

我把幾門我覺(jué)得基本必學(xué)的課程用紅線框起來(lái)了,大家可以作為參考。
另外,學(xué)習(xí)這些課程的時(shí)候,一定要多寫代碼、做一些Lab,建議把操作系統(tǒng)、計(jì)網(wǎng)、csapp這些課程 lab做完(國(guó)內(nèi)有些學(xué)??赡軟](méi)有),可以去國(guó)外找計(jì)算機(jī)四大名校的Lab。
部分學(xué)校最大的問(wèn)題就是 OS、網(wǎng)絡(luò)、數(shù)據(jù)庫(kù)等 CS 核心課程上成了文科!
缺乏一些動(dòng)手實(shí)踐 Lab,大部分都是寫實(shí)驗(yàn)報(bào)告,就是不寫代碼。
為什么美帝在數(shù)據(jù)庫(kù)、操作系統(tǒng)、各種工業(yè)軟件工程能力如此強(qiáng)悍?
**我覺(jué)得和他們 CS 強(qiáng)校的教育模式有關(guān),**國(guó)外,尤其是美國(guó),很多高校 CS 教育極其注重實(shí)踐,國(guó)內(nèi)也就少數(shù)不錯(cuò)的高校有實(shí)踐教學(xué),其它都是念 PPT,課后作業(yè)就是做 Word 項(xiàng)目。。。。
就拿 MIT 來(lái)說(shuō),6.830 Database Systems: 這是一門數(shù)據(jù)庫(kù)系統(tǒng)的一門核心課程。前半部分比較基礎(chǔ)的數(shù)據(jù)庫(kù)的知識(shí),后半段主要在講Distributed Databases 的東西
它們的實(shí)驗(yàn)是什么?
是寫個(gè)小型關(guān)系型數(shù)據(jù)庫(kù),比如 lab1實(shí)現(xiàn)數(shù)據(jù)庫(kù)基本的存儲(chǔ)邏輯結(jié)構(gòu),具體包括:Tuple,TupleDesc,HeapPage,HeapFile,SeqScan,BufferPool等。
我們數(shù)據(jù)庫(kù)教什么?
教 SQL 怎么寫,教數(shù)據(jù)庫(kù)原理(這個(gè)還算好的)
大多數(shù)高校實(shí)驗(yàn)是什么?
用 Java 使用 JDBC 連接 MySQL 寫個(gè)應(yīng)用。。。
國(guó)外是如何教計(jì)算機(jī)網(wǎng)絡(luò)的?
實(shí)現(xiàn) ?TCP 協(xié)議棧~
比如斯坦福 CS 144,CS144 Lab Assignments - 手寫TCP - LAB4

我們是怎么學(xué)習(xí)的?
記住 TCP 三次握手、四次揮手、記住 DNS 使用 UDP 協(xié)議....
我們大作業(yè)是什么?
有些是 Word 寫作業(yè)。。。有些是讓你用一下 socket api 寫個(gè)網(wǎng)絡(luò)程序。。。這是計(jì)算機(jī)網(wǎng)絡(luò)原理嗎?
操作系統(tǒng)比較典型的是 MIT 6.828,現(xiàn)在改名了。
直接讓你基于一個(gè) xv6 去實(shí)現(xiàn)一些模塊,比如文件系統(tǒng)、多線程。
我們呢?
記住進(jìn)程和線程區(qū)別、記住虛擬內(nèi)存的各種組關(guān)聯(lián)....
當(dāng)然也有一些學(xué)校會(huì)有實(shí)驗(yàn),比如清華 ucore、哈工大 linux0.11。
這就是為什么美國(guó)高校有很強(qiáng)的編碼能力、造輪子的能力,因?yàn)樗麄兊?CS 學(xué)生成長(zhǎng)環(huán)境就是這樣的。
CS 專業(yè)區(qū)別于其它專業(yè)一個(gè)很大特點(diǎn)就是:
工作后的內(nèi)容是和專業(yè)所學(xué)的內(nèi)容強(qiáng)相關(guān)的。
比如你學(xué)了數(shù)據(jù)結(jié)構(gòu)、編譯原理、操作系統(tǒng)、計(jì)算機(jī)網(wǎng)絡(luò),如果你從事的是研發(fā)崗,那一定離不開(kāi)這些知識(shí)。
主要靠自學(xué)
不管是科班還是非科班,想要快速持續(xù)的提高技術(shù)水平,就得靠自己去鉆,尤其離不開(kāi)自學(xué)。
知乎上其實(shí)很多問(wèn)科班和非科班的差別在哪,其實(shí)我一直想說(shuō),你給自己充足時(shí)間去把科班的內(nèi)容學(xué)習(xí)一遍,到底還能差在哪呢?
可能唯一差別就是少了一個(gè) 計(jì)算機(jī)學(xué)士學(xué)位。
也有人把這種自學(xué)出家的叫做民科,當(dāng)然沒(méi)有任何的諷刺意思哈。
那么計(jì)算機(jī)專業(yè)同學(xué)該如何自學(xué)呢?
其實(shí)看著很多,概況起來(lái)就是(下面只涉及CS專業(yè)課):
計(jì)算機(jī)導(dǎo)論 + 一門編程入門語(yǔ)言 算法與數(shù)據(jù)結(jié)構(gòu) 操作系統(tǒng) 計(jì)算機(jī)網(wǎng)絡(luò) 數(shù)據(jù)庫(kù)系統(tǒng) 特定領(lǐng)域知識(shí),如:計(jì)算機(jī)圖形學(xué)、信息安全、System方向、分布式
學(xué)習(xí)的途徑就是:
多看國(guó)內(nèi)外 CS 名校的一些開(kāi)放課程 + 看經(jīng)典的書 + 多寫代碼!??!
畢竟現(xiàn)在MOOC、Udemy、B站上學(xué)習(xí)的資源都是很豐富的。
比如:[CS經(jīng)典課程][https://mp.weixin.qq.com/s/bkLpjLxqQHaBTwCiz3VwBA]
簡(jiǎn)單列舉幾個(gè)學(xué)科:
一、計(jì)算機(jī)導(dǎo)論
首先建議從計(jì)算機(jī)導(dǎo)論課程開(kāi)始,推薦下面這些課程:
Harvard的CS50 ?CS50: Introduction to Computer Science Berkeley的CS61A ?CS 61A: Structure and Interpretation of Computer Programs MIT的6.001 ?mit-6.001
二、C 語(yǔ)言
隨后建議學(xué)習(xí)一門語(yǔ)言,可以是 C、Java、或 Python,我推薦 C語(yǔ)言(當(dāng)然,也可以是Python!這不是重點(diǎn),重點(diǎn)是要多去寫,入門時(shí)提高對(duì)編程的興趣),提到C語(yǔ)言,我這里推薦國(guó)內(nèi)浙大翁凱老師的課,看過(guò)的都說(shuō)好~
分為兩門,第一門是面向高考結(jié)束想提前自學(xué)一點(diǎn)編程的,叫大學(xué)先修課:
C語(yǔ)言程序設(shè)計(jì)CAP-大學(xué)先修課
雖然叫先修課,但是覆蓋了C語(yǔ)言的主要知識(shí)點(diǎn),也適合大一新生~
第二門是
C語(yǔ)言程序設(shè)計(jì)進(jìn)階
會(huì)帶你用C語(yǔ)言完成一些有趣的項(xiàng)目,比如一些圖形界面小游戲,先修課學(xué)習(xí) C 語(yǔ)言語(yǔ)法基礎(chǔ),進(jìn)階課帶你項(xiàng)目實(shí)操,搭配使用,你就是同學(xué)中的大神!
有了語(yǔ)言基礎(chǔ)之后建議學(xué)數(shù)據(jù)結(jié)構(gòu)與算法:
三、數(shù)據(jù)結(jié)構(gòu)推薦:
Stanford CS106系列 CS106A: Programming Methodologies
四、算法推薦:
6.046(進(jìn)階) ?Design and Analysis of Algorithms - MIT MIT的6.006 ?Introduction to Algorithms Coursera上的Princeton課程 Berkeley的CS61A 和 CS61B
五、操作系統(tǒng)推薦:
CMU的15-213 Berkeley的CS162,
這兩個(gè)都是有視頻有l(wèi)ab的好課
還有一個(gè)非常經(jīng)典的 MIT 6.828,附帶一個(gè)xv6 lab
課程:6.828: Operating System Engineering
六、 組成原理、體系結(jié)構(gòu):
MIT的6.004, CMU的15-213 Berkeley的CS61C
七、計(jì)算機(jī)網(wǎng)絡(luò):
Stanford的CS144,lab 很有意思
新手快速自學(xué)的方法
一個(gè)原則,來(lái)自翁凱老師:
學(xué)計(jì)算機(jī)一定要有一個(gè)非常強(qiáng)大的心理狀態(tài),計(jì)算機(jī)的所有東西都是人做出來(lái)的,別人能想的出來(lái),我也一定能想得出來(lái),在計(jì)算機(jī)的世界里沒(méi)有任何的黑魔法,所有的東西只不過(guò)是我現(xiàn)在不知道而已,總有一天我會(huì)把所有的細(xì)節(jié)、所有的內(nèi)部的東西全搞明白的
這里,也有一個(gè)問(wèn)題,確實(shí)大部分的東西,只要你一直深挖下去,可能都能搞明白。
但是要注意時(shí)間成本,軟件行業(yè)已經(jīng)不是一般的復(fù)雜和巨大,任何一個(gè)領(lǐng)域的知識(shí)的復(fù)雜性都足夠耗費(fèi)掉我們一生的時(shí)間,所以一定要抓住主線,對(duì)于技術(shù)和知識(shí),要學(xué)通用的、流行的,可以嘗試面向面試學(xué)習(xí)。
“打破砂鍋問(wèn)到底”式的學(xué)習(xí)雖然精神可敬,但效率并不劃算。
要在適當(dāng)?shù)膶哟紊铣橄蟪鲆粚樱⑶艺J(rèn)可這一層提供的接口,不去深究?jī)?nèi)部實(shí)現(xiàn),了解原理即可,不必深究?jī)?nèi)部實(shí)現(xiàn)。
比如學(xué)習(xí) HTTP,那么就先認(rèn)可 TCP 提供的穩(wěn)定可靠傳輸,而不繼續(xù)深挖 TCP 的內(nèi)容。
新手,一定不要一直看書,保持看書的時(shí)間不超過(guò) 50%。
看書學(xué)習(xí)基本的理論 編程練習(xí) 有了新領(lǐng)悟,繼續(xù)看書
反復(fù)的循環(huán)。
