经常有大一的同学或者非科班转码的同学在后台问我,计算机都要学哪些课程,有什么先后顺序。
有类似疑问的小伙伴,可以参考Github上「清华大学计算机系课程攻略」
里面包含了清华CS专业,大一到大四的课程以及推荐书籍资源等,链接如下:
https://github.com/PKUanonym/REKCARC-TSC-UHTgithub.com
截取一些课程目录:
大一上:
大一下:
大二上:
大二下:
大三,专业课明显多起来了:
大四主要是实践、实习、毕设,课不多:
不过说实话,这份攻略对于我们大部分同学来说都只能参考,课程量有点大,时间不充足的话,很难完全跟下来。
但是我觉得这里面大三下的课程非常棒:
可以说大三下的这些课程铺垫非常不错,不管以后走分布式存储、搜索引擎等基础架构方向还是机器学习等算法方向,亦或是游戏引擎、图形处理等方向,都算是入门了。
但是说实话,清华这份攻略好是好,就是太多了,对于时间没有那么充裕的同学,想要一个更加精简的 List,可以参考网易云课堂上的计算机课程图:
我把几门我觉得基本必学的课程用红线框起来了,大家可以作为参考。
另外,学习这些课程的时候,一定要多写代码、做一些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
我们是怎么学习的?
记住 TCP 三次握手、四次挥手、记住 DNS 使用 UDP 协议....
我们大作业是什么?
有些是 Word 写作业。。。有些是让你用一下 socket api 写个网络程序。。。这是计算机网络原理吗?
操作系统比较典型的是 MIT 6.828,现在改名了。
直接让你基于一个 xv6 去实现一些模块,比如文件系统、多线程。
我们呢?
记住进程和线程区别、记住虚拟内存的各种组关联....
当然也有一些学校会有实验,比如清华 ucore、哈工大 linux0.11。
这就是为什么美国高校有很强的编码能力、造轮子的能力,因为他们的 CS 学生成长环境就是这样的。
CS 专业区别于其它专业一个很大特点就是:
比如你学了数据结构、编译原理、操作系统、计算机网络,如果你从事的是研发岗,那一定离不开这些知识。
不管是科班还是非科班,想要快速持续的提高技术水平,就得靠自己去钻,尤其离不开自学。
知乎上其实很多问科班和非科班的差别在哪,其实我一直想说,你给自己充足时间去把科班的内容学习一遍,到底还能差在哪呢?
可能唯一差别就是少了一个 计算机学士学位。
也有人把这种自学出家的叫做民科,当然没有任何的讽刺意思哈。
那么计算机专业同学该如何自学呢?
其实看着很多,概况起来就是(下面只涉及CS专业课):
学习的途径就是:
多看国内外 CS 名校的一些开放课程 + 看经典的书 + 多写代码!!!
毕竟现在MOOC、Udemy、B站上学习的资源都是很丰富的。
比如:[CS经典课程][https://mp.weixin.qq.com/s/bkLpjLxqQHaBTwCiz3VwBA]
简单列举几个学科:
首先建议从计算机导论课程开始,推荐下面这些课程:
随后建议学习一门语言,可以是 C、Java、或 Python,我推荐 C语言(当然,也可以是Python!这不是重点,重点是要多去写,入门时提高对编程的兴趣),提到C语言,我这里推荐国内浙大翁凯老师的课,看过的都说好~
分为两门,第一门是面向高考结束想提前自学一点编程的,叫大学先修课:
虽然叫先修课,但是覆盖了C语言的主要知识点,也适合大一新生~
第二门是
会带你用C语言完成一些有趣的项目,比如一些图形界面小游戏,先修课学习 C 语言语法基础,进阶课带你项目实操,搭配使用,你就是同学中的大神!
有了语言基础之后建议学数据结构与算法:
这两个都是有视频有lab的好课
还有一个非常经典的 MIT 6.828,附带一个xv6 lab
课程:6.828: Operating System Engineering
一个原则,来自翁凯老师:
学计算机一定要有一个非常强大的心理状态,计算机的所有东西都是人做出来的,别人能想的出来,我也一定能想得出来,在计算机的世界里没有任何的黑魔法,所有的东西只不过是我现在不知道而已,总有一天我会把所有的细节、所有的内部的东西全搞明白的
这里,也有一个问题,确实大部分的东西,只要你一直深挖下去,可能都能搞明白。
但是要注意时间成本,软件行业已经不是一般的复杂和巨大,任何一个领域的知识的复杂性都足够耗费掉我们一生的时间,所以一定要抓住主线,对于技术和知识,要学通用的、流行的,可以尝试面向面试学习。
“打破砂锅问到底”式的学习虽然精神可敬,但效率并不划算。
要在适当的层次上抽象出一层,并且认可这一层提供的接口,不去深究内部实现,了解原理即可,不必深究内部实现。
比如学习 HTTP,那么就先认可 TCP 提供的稳定可靠传输,而不继续深挖 TCP 的内容。
新手,一定不要一直看书,保持看书的时间不超过 50%。
反复的循环。
联系客服