后悔大学没看到这个 Github 仓库!
共 3247字,需浏览 7分钟
· 2021-12-18
经常有大一的同学或者非科班转码的同学在后台问我,计算机都要学哪些课程,有什么先后顺序。
有类似疑问的小伙伴,可以参考Github上「清华大学计算机系课程攻略」
![c74912e5264ecbf4fc8c444a2cf6e6b0.webp](https://filescdn.proginn.com/bebcb546d074a66ff8517a136b3183ac/c74912e5264ecbf4fc8c444a2cf6e6b0.webp)
里面包含了清华CS专业,大一到大四的课程以及推荐书籍资源等,链接如下:
https://github.com/PKUanonym/REKCARC-TSC-UHTgithub.com
截取一些课程目录:
大一上:
![269cd02a0d031d6c1dc212226afda209.webp](https://filescdn.proginn.com/14203edb53fd84aef6ff9d9bd2e31507/269cd02a0d031d6c1dc212226afda209.webp)
大一下:
![84ce5942a72f9482b1bc7ce7798584a0.webp](https://filescdn.proginn.com/4d6612cbb0d06dc2a76ca4c8426f3499/84ce5942a72f9482b1bc7ce7798584a0.webp)
大二上:
![ee7b30e90523af5841bd9ef828ce98ca.webp](https://filescdn.proginn.com/6e83b66a8344043f44d605e570d94cce/ee7b30e90523af5841bd9ef828ce98ca.webp)
大二下:
![b032744c4e560effad4f9bdcb4e29ef2.webp](https://filescdn.proginn.com/6fd97c6219c281db700696e8a658c359/b032744c4e560effad4f9bdcb4e29ef2.webp)
大三,专业课明显多起来了:
![66c70a77aa0a1226dce0921818fff16c.webp](https://filescdn.proginn.com/a639c1308e3474abfaf458ea541bfd4a/66c70a77aa0a1226dce0921818fff16c.webp)
![9ae9b5dbb8a74ba82e7c3031fe0f24f6.webp](https://filescdn.proginn.com/6744af6d9c55120746bf45abeaf4cbe3/9ae9b5dbb8a74ba82e7c3031fe0f24f6.webp)
大四主要是实践、实习、毕设,课不多:
![56cba071d633478167b5f54dc2973b4f.webp](https://filescdn.proginn.com/86333f7f139efec67d89cfe626bf6452/56cba071d633478167b5f54dc2973b4f.webp)
不过说实话,这份攻略对于我们大部分同学来说都只能参考,课程量有点大,时间不充足的话,很难完全跟下来。
但是我觉得这里面大三下的课程非常棒:
- 操作系统
- 计算机系统
- 数值分析
- 数字图像
- 存储技术
- 搜索引擎技术
- 模式识别
- 机器学习
可以说大三下的这些课程铺垫非常不错,不管以后走分布式存储、搜索引擎等基础架构方向还是机器学习等算法方向,亦或是游戏引擎、图形处理等方向,都算是入门了。
但是说实话,清华这份攻略好是好,就是太多了,对于时间没有那么充裕的同学,想要一个更加精简的 List,可以参考网易云课堂上的计算机课程图:
![a639c1308e3474abfaf458ea541bfd4a.webp](https://filescdn.proginn.com/19e25905bed87acf494ea54fd31be123/a639c1308e3474abfaf458ea541bfd4a.webp)
我把几门我觉得基本必学的课程用红线框起来了,大家可以作为参考。
另外,学习这些课程的时候,一定要多写代码、做一些Lab,建议把操作系统、计网、csapp这些课程 lab做完(国内有些学校可能没有),可以去国外找计算机四大名校的Lab。
部分学校最大的问题就是 OS、网络、数据库等 CS 核心课程上成了文科!
缺乏一些动手实践 Lab,大部分都是写实验报告,就是不写代码。
为什么美帝在数据库、操作系统、各种工业软件工程能力如此强悍?
**我觉得和他们 CS 强校的教育模式有关,**国外,尤其是美国,很多高校 CS 教育极其注重实践,国内也就少数不错的高校有实践教学,其它都是念 PPT,课后作业就是做 Word 项目。。。。
就拿 MIT 来说,6.830 Database Systems: 这是一门数据库系统的一门核心课程。前半部分比较基础的数据库的知识,后半段主要在讲Distributed Databases 的东西
它们的实验是什么?
是写个小型关系型数据库,比如 lab1实现数据库基本的存储逻辑结构,具体包括:Tuple,TupleDesc,HeapPage,HeapFile,SeqScan,BufferPool等。
我们数据库教什么?
教 SQL 怎么写,教数据库原理(这个还算好的)
大多数高校实验是什么?
用 Java 使用 JDBC 连接 MySQL 写个应用。。。
国外是如何教计算机网络的?
实现 TCP 协议栈~
比如斯坦福 CS 144,CS144 Lab Assignments - 手写TCP - LAB4
![cb397a4b2ab91794b70eaec3e40c503a.webp](https://filescdn.proginn.com/314f3d9b55f3ef2cc2c3b8596abe25dd/cb397a4b2ab91794b70eaec3e40c503a.webp)
我们是怎么学习的?
记住 TCP 三次握手、四次挥手、记住 DNS 使用 UDP 协议....
我们大作业是什么?
有些是 Word 写作业。。。有些是让你用一下 socket api 写个网络程序。。。这是计算机网络原理吗?
操作系统比较典型的是 MIT 6.828,现在改名了。
直接让你基于一个 xv6 去实现一些模块,比如文件系统、多线程。
我们呢?
记住进程和线程区别、记住虚拟内存的各种组关联....
当然也有一些学校会有实验,比如清华 ucore、哈工大 linux0.11。
这就是为什么美国高校有很强的编码能力、造轮子的能力,因为他们的 CS 学生成长环境就是这样的。
CS 专业区别于其它专业一个很大特点就是:
- 工作后的内容是和专业所学的内容强相关的。
比如你学了数据结构、编译原理、操作系统、计算机网络,如果你从事的是研发岗,那一定离不开这些知识。
- 主要靠自学
不管是科班还是非科班,想要快速持续的提高技术水平,就得靠自己去钻,尤其离不开自学。
知乎上其实很多问科班和非科班的差别在哪,其实我一直想说,你给自己充足时间去把科班的内容学习一遍,到底还能差在哪呢?
可能唯一差别就是少了一个 计算机学士学位。
也有人把这种自学出家的叫做民科,当然没有任何的讽刺意思哈。
那么计算机专业同学该如何自学呢?
其实看着很多,概况起来就是(下面只涉及CS专业课):
- 计算机导论 + 一门编程入门语言
- 算法与数据结构
- 操作系统
- 计算机网络
- 数据库系统
- 特定领域知识,如:计算机图形学、信息安全、System方向、分布式
学习的途径就是:
多看国内外 CS 名校的一些开放课程 + 看经典的书 + 多写代码!!!
毕竟现在MOOC、Udemy、B站上学习的资源都是很丰富的。
比如:[CS经典课程][https://mp.weixin.qq.com/s/bkLpjLxqQHaBTwCiz3VwBA]
简单列举几个学科:
一、计算机导论
首先建议从计算机导论课程开始,推荐下面这些课程:
- Harvard的CS50 CS50: Introduction to Computer Science
- Berkeley的CS61A CS 61A: Structure and Interpretation of Computer Programs
- MIT的6.001 mit-6.001
二、C 语言
随后建议学习一门语言,可以是 C、Java、或 Python,我推荐 C语言(当然,也可以是Python!这不是重点,重点是要多去写,入门时提高对编程的兴趣),提到C语言,我这里推荐国内浙大翁凯老师的课,看过的都说好~
分为两门,第一门是面向高考结束想提前自学一点编程的,叫大学先修课:
- C语言程序设计CAP-大学先修课
虽然叫先修课,但是覆盖了C语言的主要知识点,也适合大一新生~
第二门是
- C语言程序设计进阶
会带你用C语言完成一些有趣的项目,比如一些图形界面小游戏,先修课学习 C 语言语法基础,进阶课带你项目实操,搭配使用,你就是同学中的大神!
有了语言基础之后建议学数据结构与算法:
三、数据结构推荐:
- Stanford CS106系列
- CS106A: Programming Methodologies
四、算法推荐:
- 6.046(进阶) Design and Analysis of Algorithms - MIT
- MIT的6.006 Introduction to Algorithms
- Coursera上的Princeton课程
- Berkeley的CS61A 和 CS61B
五、操作系统推荐:
- CMU的15-213
- Berkeley的CS162,
这两个都是有视频有lab的好课
还有一个非常经典的 MIT 6.828,附带一个xv6 lab
课程:6.828: Operating System Engineering
六、 组成原理、体系结构:
- MIT的6.004,
- CMU的15-213
- Berkeley的CS61C
七、计算机网络:
- Stanford的CS144,lab 很有意思
新手快速自学的方法
一个原则,来自翁凯老师:
学计算机一定要有一个非常强大的心理状态,计算机的所有东西都是人做出来的,别人能想的出来,我也一定能想得出来,在计算机的世界里没有任何的黑魔法,所有的东西只不过是我现在不知道而已,总有一天我会把所有的细节、所有的内部的东西全搞明白的
这里,也有一个问题,确实大部分的东西,只要你一直深挖下去,可能都能搞明白。
但是要注意时间成本,软件行业已经不是一般的复杂和巨大,任何一个领域的知识的复杂性都足够耗费掉我们一生的时间,所以一定要抓住主线,对于技术和知识,要学通用的、流行的,可以尝试面向面试学习。
“打破砂锅问到底”式的学习虽然精神可敬,但效率并不划算。
要在适当的层次上抽象出一层,并且认可这一层提供的接口,不去深究内部实现,了解原理即可,不必深究内部实现。
比如学习 HTTP,那么就先认可 TCP 提供的稳定可靠传输,而不继续深挖 TCP 的内容。
新手,一定不要一直看书,保持看书的时间不超过 50%。
- 看书学习基本的理论
- 编程练习
- 有了新领悟,继续看书
反复的循环。