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 输入到页面展现到底发生什么?「
这个问题换个表达就是「一个数据包是如何发送到另外一台电脑的」,如果你能完整的说出整个过程,那么计网你一定是学懂了!这就是为啥面试这么喜欢问这个问题的原因。
那么我们依葫芦画瓢提一个问题
「从代码被写下到程序运行起来到底发生了什么?」
这个问题回答得越详细越好,基本上能说清,你就理解了编译原理、操作系统、组成原理这三座大三。
如果觉得写得不错的话,记得帮我 @编程指北 点个赞哟