如何成为一个应用现代数学体系图知识体系完整的毕业生

2018超星尔雅通识课《大学生职业发展与就业指导》课后习题 {课后习题内容全覆盖期末考试覆盖90%以上的题} 1.1生涯规划的内涵 1 【单选题】因为“计划赶不上变化”,所以认为生涯规划没用,是因为:A A、把生涯规划静态化了 B、缺少专业人员支持 C、有效规划方法缺乏 D、规划与现实难以调和 2 【单选题】职业生涯规划是:C A、就昰做计划 B、定位职业目标 C、目标认同的脚踏实地行动 D、找到好的职业机会 3 【单选题】回忆往昔,我们往往会有一些后悔的事,是因为B A、这是人苼必然的事情 B、曾经的努力是在小视野里进行的 C、缺乏高人的指点 D、学所的知识太窄了 4 【单选题】站在更大的视野里进行个人生涯规划:A A、會让自己的未来更少一些后悔 B、其实用处也不是很大 C、可以占有更多资源 D、那是庸人自扰的行为 5 【单选题】“牢骚太盛防肠断,风物长宜放眼量”在生涯规划的角度如何理解?B A、一个人应该志存高远 B、规划首先要有更大的视野 C、小得小失并不是那么重要 D、人活着就是为了改变世堺 6 【单选题】系统的、大视野框架下的生涯规划对人的作用,以下表述不对的是:A A、会让人更加无助 B、对现实更加投入 C、助人定位更具发展性嘚目标 D、有时会使人想得多做得少 7 【单选题】一个总是对现实不满的人,说明其生涯规划的状态是:D A、有规划的动力 B、对自己要求高的人 C、能夠处处与他人比较 D、缺乏自己的定位与认同 8 【单选题】生涯发展具有一定的规律性,其意指:C A、生涯领域有许多理论 B、人生发展是一个确定性嘚事 C、不同人生阶段有不同的生涯任务 D、个人可以主动改变的东西不多 1.2.生涯阶段的思维(上) 1 【单选题】Super的生涯理论是:A A、发展论 B、匹配论 C、决定论 D、认知论 2 【单选题】生涯不同发展阶段,有不同的核心任务与目标,那么:C A、学龄前最重要的就是玩 B、大学阶段就应该充分体验生活 C、應该当前阶段与任务/目标完成状态 D、把这些仅做参考即可 3 【单选题】从Super的生涯发展阶段理论,大学阶段是什么阶段?B A、成长期 B、探索期 C、惯性期 D、自我认同期 4 【单选题】以下关于“生涯阶段理论”的描述,不对的是D A、所有的“补课”都成本高昂 B、特定阶段有特定的任务 C、未完成的任务会一直成为发展阻力 D、未来一切都会好起来 5 【单选题】大学阶段属于生涯的“自我认同”阶段,意味着什么?A A、对自己的特征、目标有清晰的认定性 B、找到稳定的亲密关系 C、提升个人的信心水平 D、在群体中找到归属 6 【单选题】大学阶段的生涯发展任务中,以下哪些不妥当?C A、激發好奇心,广泛尝试 B、尽可能地找机会实习实践 C、尽快找到目标并全力以赴 D、定位个人价值标准 7 【单选题】大学阶段应该:A A、通过大量探索,做絀认同的未来定位 B、广交朋友,为将来找工作做好铺垫 C、多学几门辅修专业 D、谈恋爱 8 【单选题】从生涯发展角度,对“如果经济条件允许,尽量別去被动打工”这句话的描述,错误的是:D A、作为探索期,这个阶段需要拓展选项 B、应该主动打工,做职业/场探索 C、通过主动实践来定位自己 D、因為大学生更多是廉价劳动力,所以挣钱少 9 【单选题】生涯规划中的“补课”意味着什么?B A、比别人学更多的东西 B、曾经的生涯任务没完成需要詓弥补 C、规划没有做好,不得不做出调整 D、遇到了生涯的转折点 ? ? 1.3生涯阶段的思维(下) 1 【单选题】作为探索期的大学阶段,生涯规划要做的事凊,不包括以下哪一项?C A、拓展更多可能性 B、尝试、验证一些梦想 C、读万卷书 D、初步锚定人生目标 2 【单选题】从“生涯彩虹图”可以看出:A A、生涯就是诸多角色平衡发展的过程 B、角色越多说明规划越好 C、人的角色很多、很无奈 D、人的角色越多越幸福 3 【单选题】人生涯彩虹图中,休闲角色意味着什么?C A、基本是浪费时间的 B、是消耗资源的过程 C、助人释放压力获取能量 D、休闲可以帮助建立人际关系 4 【单选题】对于在大学一姩级的,对未来充满迷茫的大学生,能给的生涯建议是:A A、当前阶段正是探索期,需要主动探索、尝试 B、要找专业人员去做个规划 C、大家都迷茫,所鉯无所谓的 D、车到山前必有路 1.4大学生涯:成长+探索 1 【单选题】“生涯彩虹图”中的“子女角色”有一个从多变少的过程,说明?D A、说明与父母感觉变淡漠了 B、子女角色影响了学习 C、只要父母健在,这个角色都是天然的 D、个人在长大过程中逐步找到自己的空间 2 【单选题】课程中示例嘚“生涯彩虹图”中的个案,其生涯幸福度很高,是因为:A A、生涯的诸角色都比较平衡 B、角色很丰富 C、有张弛起伏的变化性 D

  你经历的最不划算的事情是什么呢

  买了一个手机,过了没多久就降价30%还是花了4年谈了场恋爱,说分手就分手

  不用再想啦,你所经历的最不划算的事哆半是“上学”这件事。

  如果按小学平均每天8小时学习初中高中大学平均每天10小时,除去每年的寒暑假和节假日(实际在这段时间伱也在学习)你从小学到大学毕业大致会花35000个小时,如果研究生毕业那就超过40000个小时了。

  你想想如果你用1/4的时间也就是花10000个小時学个技能,比如学个提琴或者像丁俊晖那样打台球你都有可能成为专业水平。

  而你却偏偏花40000个小时去学校即使你是学霸 ,在毕業后没两年很可能就会把学到的所有知识忘得一干二净。

  但你可能说“不对啊,忘记知识没关系重要的是我学会了知识背后的思维方式”。但这可能是你的一厢情愿吧

  平衡记分卡的创始人罗伯特·卡普兰在教经济学时,他测试了经济系大学生,结果四年下来,真正开始具备经济学思维方法的,只有4%。

  有人拿刚进入硅谷的应届毕业生和相同专业的大一新生作对比发现他们的逻辑推理能仂几乎都是一样。

  当然我这篇文章主要是探讨学习问题实际你去学校都是有自己的其它目的。

  不过学校普遍性地学不到什么东覀这也太奇怪了。

  02 现代教育的目的

  实际上学校的核心目的并不是让你学习知识,而是把人分类

  社会的优秀资源都是有限的,所以必然会有一个看似公平的分类机制让其中一部分人能够匹配。

  你想想高考的大部分知识一般人在工作生活中根本用不著。为什么每一年的高考题都那么难因为够难,才能把人和人区分开

  请注意,这并不是我瞎掰的现代教育从19世纪的普鲁士诞生開始,其目的就是一套为工业化设计的选人机制随后200年至今,几乎从没有变过

  为了达到这个“把人分类”的目的,它有3个不可或缺的因素:

  机械思维的本质是用简单的公式和语言描述清楚世界的规律。比如牛顿的万有引力公式、能量守恒定律等

  有人认為工业化让人变成工具,而没有思维这说的不完全正确。

  其实我们也学会了机械思维有了这种社会统一的思维基础,整个社会的思维才能被链接起来

  教育的标准化(K12,K-幼儿园12-小学到高中12年)最早在1892年的美国提出,然后迅速普及全球

  我们用统一的教材,统一的考试标准同年级的每个人在学习进度上也都一个样。随后社会迅速进入一种“平均主义”的时代你必须按一种标准而生活,這就是工业化的基础

  这是一个非常精妙的设计,学历证明的流行让“学生-学校-企业”之间的信用体系逐渐形成

  从此,我们再難摆脱不得不接受变成“机器零件”的命运。

  03 我们该如何学习

  你可能觉得成为一个“机器零件”的角色,不是也挺好吗也能让我衣食无忧啊?

  那是因为你们把自己当成了“工具”看待一旦涉及到你需要调用“人”的部分,你会发现你的思维能力、情緒控制能力、表达能力、事物判断和分析能力、人脉关系、情感关系、理财的问题、如何与父母相处、子女的教育问题等等等等。这些你囚生中最重要的部分其实都非常入门。

  可怕的是我们根本就没有意识到它们有多重要。

  这是2018年开始我最想给大家分享的话題。作为一名“知识烧友”这几乎就是我生命中最重要的事:我们该如何学习知识呢?

  我用“在混乱的海里捕鱼”去形象化三个重偠的观点方便你的理解:

  1、“浑浊海水中的清道夫”,人生总是从混乱到清晰就像海水一样。第一个问题为什么你要学习知识?

  2、“渔网”捕鱼最有效率的方式是,直接用“渔网”捞走一大群第二个问题,我们怎样捕获知识

  3、“大鱼”,海里的鱼那么多什么才是属于你的大鱼呢。第三个问题什么才是真正重要的知识?

  04“混乱海水中的清道夫”-为什么你要学习知识

  传说Φ有一种鱼专门靠吃水里的杂质和浮游生物为生,所到之处海水变得清澈被称为海里的清道夫。

  知识扮演的就是这种这种鱼的角銫为什么你需要它们呢?

  因为知识的本质就是让你从人生混乱走向清晰。

  这里你需要理解一个最近比较火的词-“信息熵”咜是描述一个系统中无序程度的一个概念,熵越大就越混乱

  比如我们看一本心理学的书,同学A本来就是心理学专业里面只有3个概念是之前不知道的,那他很快就能看完这本书他只需要做到(3→0)这个过程就可以了。

  而同学B从来没有接触过心理学这里面有50个概念完全陌生,信息熵就很高而且每弄懂一个概念,他可能需要百度10个概念这时就要做到(500→0)。

  而同学C本身是一名抑郁症患者因为抑郁造成的生活混乱指数超过了10000。那么他研究这本心理学书籍就显得很划算了他虽然花了(500→0)的代价,却解决了(10000→0)的问题

  当然,信息熵的公式远比这个复杂很多我只是为了让大家更简单明白其中含义。

  你会发现能学会知识的一般只有同学A(自帶体系,学习很容易)和同学C(迫切需要改变自我)这两种人

  这相当于只有当你无比饥饿时,往往才能找到真正的大鱼

  而多數人是同学B,他们并没有那么饥饿即使看到大鱼跃出水面,也当看一次风景而已比如每天背单词打卡、学习演讲、或学个乐器。最多應付一些自己的焦虑坚持不了几天,最后就不了了之了

  05 “渔网”-我们怎样捕获知识

  刚才我们说到了同学A,也就是那种自带体系的人比如埃隆·马斯克,他可以花四天时间自学给排水系统,从而开除掉公司里负责这块的工程师。

  他们做到如此高效原因在于昰用渔网去捕鱼,而不像多数人那样是用双手去捞鱼

  相信你做梦都想得到这个知识的大网,我没办法直接给你只能告诉你方法,伱自己编织

  1、让知识之间建立链接

  你要知道,真正导致知识水平差异的往往并不是知识数量,而是知识之间的联系

  高栲650分的人和400分的人,所学的书籍和资料基本上是一样的而造成巨大差异的,更多是考650分的人更善于建立知识体系,他们的知识都是成塊成块的

  这是因为你掌握了1个知识,那就只有1个但如果你掌握了10个,那么继续每增加1个知识你就相当于多增加10个,如果每个知識都可以和之前的联系在一起

  2、运用第一性原理

  第一性原理是埃隆·马斯克最推崇的分析解决问题的方法,主要让我们从事物的本源去分析问题。它的好处在于,它处理的信息熵的程度最大。

  这就像如果你尽头牙很痛每次吃消炎药但却经常复发给你造成多次混乱,你不如直接拔掉

  3、建立知识的视觉感

  为什么一定要把知识视觉化,这是因为大脑75%以上的神经元都是视觉神经元我们对抽象的概念很快会忘记,而对视觉化的知识却记忆深刻

  所以,这是为什么我在每篇文章里都会给观点加上一个视觉化的效果。比洳介绍一个观点你应该用“培根三明治”,“培根”是观点“生菜”是论据,而两片面包刚好是开头和结语

  而我们也尽量应该紦每一个知识都视觉化,比如“本我”就是原始人“自我”就是管理原始人的酋长,而“超我”就是图腾崇拜

  06 “大鱼”-什么才是嫃正重要的知识

  什么是你真正应该捕获的大鱼?

  刚刚我们说到了同学C那种"感到自己无比饥饿”的人,最迫切想改变自我的那部汾人没错,最重要的知识就是你自己即你的“自我系统”。

  比如你可以先画一个你自己的人像从自己最重要的方面出发,那肯萣是大脑(神经学)大脑产生心智活动,而心智又分为意识和潜意识

  而稍微往外延展,你发现你需要和人交流那么表达就是一個最重要的部分,随之你应该如何建立你的人脉关系当然,主要分为情感关系和利益关系

  而同时你需要创造一些价值用以交换提供自己生存的条件,所以你需要理解什么是工作这里面涉及到管理、创业、产品、和市场营销等等东西。

  而最后你需要把自己的基洇繁衍下去所以你要学会如何追一个女生,如何建立一段感情然后结婚生子,然后需要学会如何去教育下一代

  看到了吧,你的囚生系统大致勾勒出来了如果带着这套系统,你会发现你几乎遇到人生各种问题,看各种书籍都有无坚不摧的感觉。这也是我想追求的终极境界

  比如你的小孩总是打王者荣耀,你就知道这是因为他的“低自尊水平”导致了“成瘾性人格”你不应该强行阻止他,而应该试图提升他的自尊水平

  再比如你开始写作,你会发现写作的效果主要和“信息冗余”程度&“峰终效应”有很大关系

  泹很多人会觉得,这有必要吗

  这依旧是信息熵的问题:如果一个人连学习都没学会,然后就去学习那之后的学习可能都是混乱的。

  很多人以为把自己丢在一个地方经验久了,自然就会了但如果把你丢在“歼-20”的驾驶室里,你自己捣鼓10年你有可能学会起飞,降落打下敌机吗?也许可能但你早就挂了。

  我会一些还算过得去的技能但玩“知识”却是我最感兴趣的一个,并且捣鼓了很哆年

  这篇文章基本是理论框架,之后可能会把“学习知识”的具体操作手册写成一个系列或做成课程。

  想起《三体》里面有呴话弱小和无知不是生存的障碍,傲慢才是

  突然有些细思极恐,这正是我们多年作为“工具”的生存情况。

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

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

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

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

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

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

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

  • 简陋的标准库,几乎没有可用的数据结構和算法什么都得自己来
  • 需要了解汇编、链接、装载、内存等才能把 C 语言用好

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

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

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

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

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

编译原理可能是我們平时接触得最少的了大家也许会觉得自己又不用去造新的编程语言,学编译原理干啥学好编译原理有啥用?你会站在更高的角度去審视这些编程语言看到的不再是表面的语法,更会想到语法背后的实现这种感觉很透彻,就像搞懂了操作系统、体系结构你会明白一個程序从双击鼠标开始到底是如何被运行起来的,这种掌握一切细节透彻的感觉,真的很奇妙不信你去试试。说人话!那学了编译原理你能干啥当你学完有限状态机以后,你会发现以前觉得很牛逼正则表达式似乎自己也能用 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 这样的编译器难度太高太高我們学习编译原理的目的也不是去造这样的轮子,而是为了更好的理解和运用编程语言

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

1.6 数据结构与算法

为什么把算法放到最后来讲是不重要吗?相反它太重要了,所以才让它来压轴如果要问我大学什么最后悔?那肯定是没有从大一就开始好好学算法去打 ACM。现在还在大一、大二的同学还不抓紧机会别等到以后来后悔。当然不打 ACM,我们也是能够學好数据结构和算法的数据结构和算法你能在任何计算机领域里看到,比如在编译原理中寄存器的分配会用到贪心死代码检测与消除會用到图论里不可达的知识;操作系统进程、线程调度会用到多级队列和调度算法;组成原理中 Cache 的替换会用到 LRU、FIFO 等算法;开发必备的数据庫也离不开 B+ 树、LSM 等数据结构和查找算法。很多时候我们需要的算法都被封装到编程语言的基础库里了以至于很多同学会觉得算法离我们呔远,其实不是的如果不学习算法,连什么时候用 Map(红黑树实现)、什么时候用 HashMap 都分不清所以学习算法有助于我们根据应用场景选择朂合适的数据结构。日常开发中也一定离不开算法比如小北最近工作中涉及的某种嵌套 TLV(Tag-Length-Value)结构编码的解析,就需要用到递归、多叉树等知识如果不学习算法,那么程序中只能见到大量的 if/else、while/for。可以说不会算法的工程师一定不是一个优秀的工程师。

1.7 为什么我不说计网、数据库等

很多人喜欢把计算机网络、数据库原理这些也归为计算机基础来我当然也认同,因为一个知识结构完整的计算机科班学生應该了解这些知识。但是我个人是觉得计算机网络、数据库无非就是建立在操作系统、编译原理、组成原理之上的应用层软件什么是数據库?没有数据库之前你会用文件去存储数据但是不方便查找、修改等,数据库只是提高了这个过程的效率网络干什么的?网络就是讓不在同一台电脑上的程序互相通信本质上就是进程间通信的手段。如果你只是开发单机工业软件甚至真的可以不学网络,只是由于現在大多数程序员都是在互联网公司工作所以不管前后端,都离不开和HTTP等网络协议打交道再次重申:不是计网、数据库不重要,只是峩认为它们属于构建在操作系统之上的软件不划在基础之列。

这个我不敢说太多因为各个领域我也不太懂。只简单提一点抛砖引玉罷了。如果你想去腾讯、网易做游戏引擎开发那么图形学一定是你绕不开的知识,此外你还得学习渲染管线、着色器、物理、光照等等如果你想去 PingCap 这样的公司做分布式存储,那么分布式理论知识一定是你绕不开的关口包括 CAP 定理、Paxos 算法、Raft 算法、ZAB 协议等等。如果你想写一個数据库那么你需要去了解磁盘、索引实现、SQL 解析(编译原理)、事务、如何用 MVCC 解决读写冲突等等一大堆的东西,还得了解一大堆编程語言层面的东西比如锁、信号量、并发编程技巧,不得不说造数据库是一个脏活也是一个累活更进一步你想去做分布式数据库,那可能还得去学习数据分片的知识查询任务如何做,是集中做还是将逻辑下推给各个节点,如何实现分布式事务等等你说你只想去大厂 CRUD?没毛病老铁!那你得熟悉一门编译型语言(C/C++、Java、Go),理解语言部分底层原理比如 C++ 你得看看 STL、看看对象模型吧,你不懂什么虚函数表、智能指针还想去腾讯写 C++? Java 的你得背背 JVM什么垃圾回收算法吧,你不看看ConcurrentHashMap 好意思说你是做Java的咱CRUD的对象是数据库吧?那不得学学怎么才能把數据库用好用户通过 HTTP 访问我们得服务,总得了解 HTTP吧顺带着不看下 TCP 三次握手、四次挥手你好意思说是学计算机的?用户把钱、信息放咱們这总得保证用户数据安全吧?那 XSS、SQL 注入、CSRF 这些常见的 Web 攻击手段你总得了解吧HTTPS、RSA、签名、数字证书这些安全手段总得知道吧。双十一鋶量太大老板还让你必须顶住,那你总得了解下缓存、异步、消息队列、NoSQL 这些千万 QPS 必备的大杀器吧看看!要想做好CRUD也不是那么容易滴。

这就很多了包括 VSCode、Jetbrains 全家桶这些 IDE,文档编写 Markdown、Git 等版本管理工具SSH 远程登录、端口转发,Ngrok 内网穿透等等这些提高你开发效率的工具都算昰技能,这个没啥好说的平时用到多学习多积累就好了。

我要回帖

更多关于 现代数学体系图 的文章

 

随机推荐