当前位置:   article > 正文

如何高质量走完 CS 的大学四年?

系统级编程 csapp 知乎 通信

最近不是高考季嘛,很多高考完的同学还有部分大一下分流的同学问:

计科,软工,大数据,物联网,网络工程这些该选什么?

一、专业如何选?

首先给出我的一个排序:

软工 ≈ 计科 > 网络工程 > 大数据 ≈ 物联网

计科和软件从就业、上的课程来说都是非常接近的。

非要说差别的话,大概是计科考公或者走选调选择会更多一些,软件工程的学费会贵一倍左右(我们学校软件接近1w,计科就和大部分专业一样的学费 4k-6k 的样子)

从上的课程来说,软件会多出一些软件设计、软件工程、软件建模这样的课程,计科则会多一些偏硬件设计的课程,比如 微机原理与系统。

但是无论计科还是软件、物联网这些专业,在课程设置上基本上跳不出这个框架(大同小异):

不管咋说,这些学科出来的归属大概率都是互联网公司码农,我学计科一样可以去做大数据、物联网,学物联网一样也可以去做 Java。

这里的 > 不是说网络工程就比大数据和物联网好,而是更适合大部分人,除非你有特别爱好,否则不要去选物联网、网络安全、大数据这类,虽然说上的课和计科、软甲都差不多,但是会学得更杂一点。

计算机科学与技术(Computer Science and Technology)是国家一级学科,下设信息安全、软件工程、计算机软件与理论、计算机系统结构、计算机应用技术、计算机技术等专业。

大家可能现在还会听到物联网、人工智能、大数据等专业,不管叫什么,这些专业要学的核心主干课程就是那些CS基础课,只是专业方向侧重不同而已!

而且这些专业出来大概率最终就业归属都是:互联网公司(BATTMD等)码农

而且这些细分的二级学科方向不会限制死你的方向,比如你学软件工程,你一样可以研究大数据、人工智能。

所以如果问大家常说的计算机到底选哪个专业,我的建议是:

  1. 计算机科学与技术

  2. 软件工程

基本上核心课程 90%都是一样的,大概是下面这些:

高级语言程序设计、数据结构与算法、电路与电子技术、集合论与图论、代数与逻辑、数字逻辑、计算机组成原理、操作系统原理、数据库原理、编译原理、软件工程、计算机网络。

学习计算机最核心的方法,也是我一路走来总结的,按照学长推荐的这个路线走,大学毕业成为offer收割机,去BAT TMD 这些都没啥问题:

入门看视频 + 不断编码 + 深入看源码和经典大黑书 + 做国外计算机硬核Lab

大黑书有哪些?

可以看看这篇高赞文章:计算机必读经典书籍

学习计算机一定不要想着速成,要下苦功夫,去啃那些经典书和源码,然后自己动手写代码。

看书方法可以参考这篇文章:

计算机看书小建议~

二、CS 如何学?

接下来,从我科班踩的坑出发,给还在上大学的学弟学妹们一点学习建议以及划重点。

这是我其中一个学期的成绩单,可以看到很多课程都是上面 这些课程:

img

在大学,首先树立一个观念,那就是学习靠自己,要培养自学能力。

虽然我是985 CS 科班出身,即便是所谓的科班,但任然认为自己是”自学编程“。

为什么这么说呢?

因为我想了下,很多东西、编程知识都是我自学的,而学校上的CS基础课也仅仅是满足考试而已。

大一上完C语言课,我的水平几乎停留在做课后习题,自己对于内存、指针都是看似懂了,实际没有领悟到精髓。

而后我依靠看大量C语言和系统底层方面的书籍,比如《CSAPP》、《汇编语言》《程序员自我修养》、《C和指针》、《深入理解C指针》等,才勉强说对于内存、指针这些彻底搞懂了。

所以我说认为自己是「自学编程的科班生」,相信这样的同学还不在少数。

过去几个月,我微信、知乎收到很多学弟学妹私信,问通信、电子、机械这些专业的同学转码要怎么学?

是不是很难追上科班?

如何才能减少和科班的差距?

我们可以看下网易云课堂这个计算机科班的课程体系,虽然不是每个学校都一样,但是大同小异:

比如计组、汇编、体系结构等课程会让我们明白计算机的构成、运行机制,以及典型的冯诺依曼结构,也会对于内存和指针这样两块在任何编程语言中都是极其重要的概念理解非常深入(不要扯Java这类语言没指针,你完全可以把引用当做受限指针)。

另外,像数字逻辑、模电这样的课程主要是让你明白数字:浮点数、整数都是如何在计算机内部表示和存储的,以及一些门电路的知识。

操作系统则让你明白「一个程序是如何跑起来的」,一个它是如何编译、链接、加载、运行的,在这一整个过程几乎会涉及到操作系统的所有环节,学了这个你就会明白 synchronized 关键字在OS层面到底是如何保证的。

而计算机网络则是让你明白「一个数据包是如何从一台主机发送到另外一台主机的」,这里面涉及到路由算法、差错检测、寻址、重试策略等等,包括 TCP/IP整个协议栈

编译原理则是让你明白高级语言都是如何被编译程序识别、转换为另外一种语言的,我认为编译器的本质就是做转换。很多人觉得平常用不到编译原理,其实不然。

我一直觉得有件事是很美妙的,就是:

你清楚的知道你写下的每一行代码都会做什么,会调用到哪些系统资源,它会占用、依赖哪些系统资源。

比如一条SQL,哪里会慢、会遇到锁会有并发问题。

虽然不了解原理,也不妨碍使用,但是往往在设计和排查问题的时候,原理非常重要,因为原理就是理论,理论可以帮助我们排查掉各种明显错误的分支,而留下少数理论验证通过的分支,会大大降低我们的工作量。

也就是剪枝。

否则我们排查系统错误或者设计方案可能只能一个个去试。

三、科班很神秘?

那么计算机科班学生该如何学习呢?

把操作系统、组成原理、系统编程这些学了,认认真真的把计算机基础打扎实了,那你其实就是一个「计算机科班学生了」

接下来说下我认为对一个「计算机知识体系完整的毕业生」最重要的课程,你至少得把下面这些课 都学了:

1、 编程语言:C/C++ (学好了这两门,基本其它编程语言一周就上手了)

2、《系统级编程》(我们教材是CSAPP,这是我本科上过最值的课!System Programing)

3、《数据结构与算法》

4、《组成原理和体系结构》

5、《操作系统》

6、《编译原理》

7、《计算机网络》

8、《数学课》:线代、离散、高数

计算机科班刚毕业一年,我觉得大学如果知道这些,可能会少走很多弯路!

首先,送大家一句话~:

万丈高楼平地起,勿在浮沙筑高台。

所以一定要在大学期间把基础打牢固,整扎实,这是科班的核心竞争力!

而且非科班同学学完这些课,也可以说是科班了!

那么怎么学?

看书 + 看视频 + 实践

接下来推荐一些我觉得特别好的资料,尽量保持精简:

一、编程语言:C/C++

没有比C语言更适合用来理解计算机系统了, 科班学生一定要学好 C语言。

推荐:《C程序设计语言》、《C与指针》、《C++ Primer》、《C++对象模型》、《Effective C++ 》

具体参考:

二、系统级编程

不用说肯定推荐《深入理解计算机系统》

其实它的简介和第一章《计算机系统漫游》已经写得非常清楚了:

从一个简单的hello world程序在计算机上的执行过程:

预处理->编译->汇编->链接->可执行文件->装载->数据流->屏幕输出显示

汇总成一句:信息 = 位+上下文。

另外还有一本就是《程序员自我修养》+ 《Unix环境编程》。

三、数据结构与算法

《算法第四版》、《算法导论》、《剑指offer》

具体参考:

四、组成原理与体系结构

《计算机组成与设计:软硬件接口》、《编码》、《CSAPP》

五、操作系统

操作系统我推荐 看书 + 做lab的方式,比如 MIT6.828 xv6

书可以看《现代操作系统》,如果你想学个os,可以看《操作系统真象还原》

我当时应该是看了不少网课,然后自己跟着教程”抄了“一个 mini os。

学习操作系统一定不要去死看书,最好跟着那种有配套实验完成一个os的课程或者书。

就像这种:

img

具体参考:

  • [如何系统学习操作系统?][https://mp.weixin.qq.com/s/sfAsq2wXpRfXwc6XJIr5Ww]

六、计算机网络

推荐《计算机网络自顶向下》、《TCP/IP详解》

具体参考:

  • [如何系统学习计算机网络?][https://mp.weixin.qq.com/s/bc_PoBGfdcCbtaHMo0Jezg]

七、编译原理

直接看龙书就好了,想写脚本可以看看《自制脚本语言》

说实话,把上面这几门课学好了,国内大厂offer几乎随便拿了。

但是很多人忽视了基础,往往在大学最该打基础的时候去追求所谓的新技术。

所以不如谈谈到底「如何才能成为一个计算机知识体系完整的毕业生」吧?

在这里,我粗浅的把计算机编程领域的知识分为三个部分:

  • 基础知识

  • 特定领域知识

  • 框架和开发技能

具体可以看下这个文章:

如何成为一个计算机知识体系完整的毕业生?

我推荐大家花在「基础 : 领域知识 : 技能」 接近 7 : 2 : 1。

这也是我推荐你在大学期间分配学习时间的比例,至少学习基础知识的时间不少于 50%,当然,这些东西你都学完了那可以去找找感兴趣的方向专研一下。

不要大一、大二一上来就扎进 Java Web、Python 爬虫这种东西,这些可以学,但不是重点。

这篇文章也没写到具体该如何去学,有哪些好的资料,由于篇幅限制,我准备把这个单独再写一个 《How 篇》,持续关注我哟~

那么如何检验学得如何呢?

想必你一定听说这个计网面试题:

“从 URL 输入到页面展现到底发生什么?“

这个问题换个表达就是「一个数据包是如何发送到另外一台电脑的」,如果你能完整的说出整个过程,那么计网你一定是学懂了!这就是为啥面试这么喜欢问这个问题的原因。

那么我们依葫芦画瓢提一个问题

“从代码被写下到程序运行起来到底发生了什么?”

这个问题回答得越详细越好,基本上能说清,你就理解了编译原理、操作系统、组成原理这三座大三。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/1014965
推荐阅读
相关标签
  

闽ICP备14008679号