怎样才算一个计算机知识体系完整的毕业生

为什么突然想写这个话题呢?最近有不少新关注的读者,在后台问:大学学 Java 和 C++ 哪个好找工作,学前端好还是后端好,该学 Vue 还是 React。。。仿佛看到了自己当年的模样,所以觉得有必要单独写一篇文章,单纯以一个计算机应届毕业生的身份聊聊,我认为大学四年,计算机科班学生应该学些什么,哪些才是重点。同样大学四年,为什么有些同学毕业就能成为大厂 Offer 收割机,各种 SP、SSP 拿到手软,有的同学明明在学校写了好多网站,项目经历满满,经历春秋招,却找到一份工作都很难。不能说后者没认真学习,或许是用力的方向不对。话不多说,直接进正题吧。

人类的知识边界一直在不断的扩张,俗话说学无止境,这放在计算机领域也同样适用,计算机本身是一个人造科学,不属于自然科学。每年,甚至每个月都不断有新的编程框架推出,学到头秃你也学不完,也没有必要去挨个学。并且你会发现,很多一二线大厂内部用的东西基本都是自己搞一套的,比如服务发现、RPC、KV、DB、消息队列、日志、监控等等。所以一般这些大厂招聘的时候基本不会因没学过某种框架而挂你,反正很多东西都是要进来重新学的。他们会更加关注你的基础知识、解决问题的经验以及聪明度这种更加通用的能力上。反而是一些小公司,可能会要求你必须会 Spring、Vue、Redis... 这些框架或者组件。

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

基础知识

特定领域知识

框架和开发技能

基础知识是指不管从事任何方向的软件工程师都应该掌握的,比如数据结构、算法、操作系统。特定领域知识就是你从事某个细分方向时需要掌握的知识,比如做游戏引擎的需要掌握图形学;做前端的需要掌握浏览器渲染原理、前端三大件;算法工程师需要更多的数学知识。毕竟计算机各种门类挺多的,需要选个细分方向专研下去,什么都学只会什么都不精(大佬除外啦。

现在大环境比较浮躁,很少有人愿意花心思在基础上,喜欢直接学 Python 搞机器学习、写秒杀、做商城。找工作的时候都是想看面经、总结速成。但是作为优秀的计算机系学生的你怎么能流于各种编程框架(造框架除外),纠结学 SpringBoot 还是 SSH 呢?把时间花在算法、基础学科上他不香吗?功利一点讲,回报反而会更大。况且在计算机领域,很多基础的理论并不十分高深,我们努努力就可以掌握其中的核心知识。

一、基础知识

1.1 数学

首先说明,这里把数学列出来不是为了显得高端,而是自己吃过数学的亏。如果你是自学转行当程序员,我当然不会推荐数学,因为转行的大概率是去学 Java、前端这类,对数学基本没啥要求。但是这篇文章主要面向的是还在大学的科班学生,这部分同学以后也许会去做算法(CV、NLP之类)、游戏引擎、信息安全编码等这些方向对数学要求就会偏高,在计算机领域,线代、概率论、统计学这些数学分支相对比较重要,计算机本质上还是离散的。比如在机器学习或数据挖掘中常常用线性代数来降低数据维度,很多问题最终都能化为求解线性方程组。所以为了避免以后想走这些方向却被数学卡住,在大一、大二上数学课的时候就好好的学一下。书到用时方恨少,不要现在以为没用处就不好好学,等你需要的时候,就知道后悔了。(默默流下了不学无术的眼泪┭┮﹏┭┮什么?你说以后肯定做开发方向?那的确可以把数学优先级放后面一点,用得确实不多,不过上数学课的时候总该认真听下吧,拿个高绩点也是百利无一害嘛。说不准哪天你又想加入算法内卷大军呢?

1.2 C语言

你也许会很疑惑,这里明明说基础知识,为什么要把一门编程语言单独列出来呢?因为在我看来,没有比 C 语言更适合用来理解计算机系统了。我们后面将会提到的操作系统、体系结构 这些东西非常适合用 C 语言去理解或者去实践。并且 C 语言本身的语言特性非常少,但是想学好又是不容易,很多人都觉得 C 语言难,难在哪里呢?回想了一下我大一时的感受:

简陋的标准库,几乎没有可用的数据结构和算法,什么都得自己来

指针很难理解和使用

需要了解汇编、链接、装载、内存等才能把 C 语言用好

不巧的是,这些东西正是计算机系统知识的一部分,所以用 C 语言作为学习计算机系统知识是最有效率的方式。真的很难想象用 Java 或是 Python 去给别人讲解内存,因为这些语言抽象程度都比 C 语言高,意味着离计算机系统也就越远。在 TIOBE 编程语言排行榜上,C语言几乎永远占据前三位,其地位自然毋庸置疑。

而且几乎你开发中用到的很多东西都是用C语言编写的,Linux、Nginx、Redis、MySQL、Git......或许你会想要探究下原理,阅读点这些开源软件的源码,那么 C 语言也是你必备的瑞士军刀。深入学习 C 语言,能够了解计算机底层的执行原理,是理解程序运行机制的绝佳语言,无出其右。

所以对于计算机科班来说,不管你是做前端还是后端,算法还是开发,C 语言都建议你好好学习。这是无关方向的一门语言,就是基础!

1.3 操作系统

我们编程的 IDE、写出来的程序全部都需要运行在操作系统上,说操作系统是计算机软件的基石也不为过。程序运行起来就需要创建进程,这涉及到操作系统的进程管理;写程序需要定义变量、存储数据吧,这又涉及到内存,对应内存管理;有时候我们还需要读写文件,这又离不开和文件系统打交道;你需要学习使用锁、条件变量、临界区来保证程序并发执行时不会错乱。而读写文件、分配内存这些又离不开系统调用(System call)。并且当你真正做起工程就会发现,很多问题是和操作系统紧密相关的,不理解操作系统,你连问题的原因都分析不出来。比如前段时间我们出现的在基于协程(libco)的框架下,使用多线程的锁去做同步互斥偶发死锁,后来分析才发现原因:由于协程是应用层实现的,一个线程内多个协程对于操作系统是感知不到的:

当一个协称 A 上锁后发起网络 IO 请求,这个时候会被切换到另外一个协程B,而协程 B 又去请求这个锁。那么这个时候操作系统会认为这个锁已经被上了,因此会将协程 B 对应的线程挂起到等待队列,这样的话就导致协程 A 永远无法运行,也就无法释放锁,导致死锁。解决的方法也很简单,就是将锁设置为可重入锁,可重入意味着同一个线程多次去请求同一个锁不会导致挂起。这样当协程 B 再去请求锁的时候,操作系统就会认为协程 B 所在的线程已经持有这个锁了,直接返回,继续执行。总之,我们写程序每时每刻都在和操作系统交互,没有理由不学好。

1.4 编译原理

编译原理可能是我们平时接触得最少的了,大家也许会觉得自己又不用去造新的编程语言,学编译原理干啥。学好编译原理有啥用?你会站在更高的角度去审视这些编程语言,看到的不再是表面的语法,更会想到语法背后的实现。这种感觉很透彻,就像搞懂了操作系统、体系结构你会明白一个程序从双击鼠标开始,到底是如何被运行起来的,这种掌握一切细节,透彻的感觉,真的很奇妙,不信你去试试。说人话!那学了编译原理你能干啥?当你学完有限状态机以后,你会发现以前觉得很牛逼正则表达式似乎自己也能用 DFA、NFA 实现一下了。状态机的思想在编程中很多地方都用得上。比如解析 HTTP 协议,如果没学过状态机思想,你可能会一行行的 if/else 去做解析,这里最麻烦的地方在于,if/else 需要提前将 HTTP 头部字段都接收到再来判断,而我们知道 HTTP 基于 TCP,而 TCP 是流式传输,所以你很有可能是几个字符一组组接收到的,这个时候用 if/else 写出来就很难看了。而用状态机编写起来代码就会非常优雅。状态的转移是由规则驱动的,接收到一个字符就判断一个,非常的方便。继续学完语法分析,你会掌握递归下降分析这样非常重要的思想,你可以使用递归下降快速的实现四则运算计算器。如果不用递归下降你可能需要先中缀表达式转后缀,然后求值,这是我们大一数据结构课写的,当时用栈写的,有点麻烦。后来学完编译原理,又用递归下降重写了一遍,区区几十行代码遍搞定。还有一类场景在实际开发中的用的很多,比如淘宝、京东这样的电商,它们的营销规则有很多,比如满减、直减、跨店等等,这样的规则是不可能写死在代码里的。那是怎么做的呢?一般会实现一个配置系统,并设计一个DSL(领域特定语言)来表达这些规则,将规则直接配置到系统中,这样可以非常方便的修改,那么如何在代码里去解析 DSL 定义的规则呢?这就需要为 DSL 写一个语法解析器,这里就会用到语法分析的方法。DSL(Domain Specific Language),是一种用于某个特定领域的程序设计语言。这种特定于某个领域是相对于 C、C++、Python 这种通用语言而言的,通用语言可以在各个领域使用,我们熟悉的大多数程序设计语言都是通用语言,它们都是图灵完备的。像我们平常经常使用的 JSON、SQL、HTML 这些都算是一种 DSL,你甚至可以尝试用递归下降去写一个 JSON、XML 解析器,这比写电商网站更有价值的。继续往下学你会了解到抽象语法树 AST 如何生成、如何转化为中间代码、如何对中间代码优化、最终又是怎么生成机器指令的。你会看到贪心算法在寄存器分配中的应用,也会看到图论中的可达性分析又是如何实现死代码消除。IDE上面那个绿色的编译按钮对你不再是黑魔法。为啥点一下就能生成可执行的程序?你写的英文字母又是如何变成一个个二进制指令的?学完编译原理,这些通通不是问题,妈妈再也不用担心你的学习~当然完成一个像 GCC、Clang 这样的编译器难度太高太高,我们学习编译原理的目的也不是去造这样的轮子,而是为了更好的理解和运用编程语言。

1.5 体系结构&组成原理

上面说的都是软件层面,体系结构则是关于计算机是如何工作的,你会了解到典型的存储程序计算机是怎样运转的。记得南大有个老师说过 “我们不是学习使用计算机的,而是学习如何造计算机”,虽然造计算机有点夸张,但是至少我们得了解下计算机的实现原理,了解下代码是怎么被 CPU 执行的吧?不然其实你会很困惑,明明一堆英文字母,怎么在 CPU 这种电路上跑起来的,我大一学 C 语言就百思不得其解,直到后来学了组成原理和数字逻辑。我们说计算机中一切都是 0、1,0、1 又是通过高低电平来表达的,通过与、或、非等逻辑门电路来表达二进制的数值运算,再将这些简单的电路集成在一起,就形成了 ALU 等具有运算能力的处理器。你会看到一条指令是如何被CPU执行的,CPU 从内存或 Cache 中取出指令,放入指令寄存器,并对指令译码。译码就是按照指令的编码规则,将指令拆分成一系列的微操作和操作数。然后发出各种设备控制指令,执行微操作。这样就完成一条指令的执行。我们说学完编译原理,能够明白写的英文代码是如何被变成二进制指令的,学完操作系统能搞懂二进制程序是如何被链接在一起,又是如何被操作系统加载、执行的。而组成原理则会告诉你二进制指令是如何控制 CPU 跑起来的,我们的操作系统本质上也是一个二进制的程序。当你理解了计算机存储层次结构,理解了多级 Cache,你就会通过优化数据访问方式来编写出速度更快的程序。你会学到底层体系结构对 C 这些语言的栈帧和参数传递的支持,参数是如何被传递给另外一个函数的?函数的返回值又是如何拿到。这是学习组成原理对于写代码的意义。学这些到底有什么意义?你会完整的看到写的代码如何变成二进制指令,又是如何去控制各种门电路,最后变成屏幕上花花绿绿的程序的(当然这里可能还需要学习显示器的原理),这就是我们常说的“基础”和“原理”。并且计算机体系结构中的很多思想,是能够广泛运用于现代软件开发的,比如 CPU 的多级 Cache 思想,就是我们现在服务器开发中提高并发度常用的缓存技术,包括缓存的替换策略等等。当计算机对你不再是黑盒,你了解写下的代码到执行的每一步,而这也将成为你以后的核心竞争力,作为科班毕业生不应该只会使用 Java、Redis、Mysql、Spring 来写各种网站。如果读者里有半路转行或者从培训班出来的,也希望你们能够抽出空余时间去补补这些基础课,这会让你在编程这条路上走的更远和更稳。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,888评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,677评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,386评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,726评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,729评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,337评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,902评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,807评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,349评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,439评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,567评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,242评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,933评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,420评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,531评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,995评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,585评论 2 359