计算机科班学生大学四年该学啥?为何有人成大厂Offer收割机?

语言作为学习计算机系统知识是最有效率的方式。很多人喜欢把计算机网络、数据库原理这些也归为计算机基础来,我当然也认同,因为一个知识结构完整的计算机科班学生,应该了解这些知识。如果你能完整的说出整个过程,那么计网你一定是学懂了!

前言

您为什么突然想写这个话题?

最近,许多一直在关注背景的读者:哪一个最好通过在大学学习Java或C ++找到工作?学习前端还是后端更好?我应该学习vue还是反应? 。 。

看来我当时看到了自己的样子,所以我觉得有必要写一篇单独的文章,而只是作为新的计算机毕业生说话。我认为计算机学生在大学四年中应该学到什么,什么是关键点。

在大学的四年中,为什么有些学生能在毕业后成为主要工厂提供收割机?各种SP和SSP纤细。一些学生在学校写了许多网站,有很多项目经验,并且经历了春季和秋季的招聘,但是很难找到工作。

不能说后者并没有努力学习,也许是因为部队的方向是错误的。

事不宜迟,只要说明这一点。

文本

人类知识的界限一直在不断扩大。俗话说,学习是无穷无尽的,这也适用于计算机领域。计算机本身就是人工科学,不属于自然科学。

每年,即使每月,都会不断启动新的编程框架。在秃头之前,您无法完成学习,并且无需一个一个学习。

您会发现,第一和第二层工厂使用的许多内部产品基本上都是由自己完成的,例如服务发现,RPC,KV,DB,消息队列,日志,监视等。

因此,当这些大公司招募时,他们基本上不会让您知道,因为他们没有学会某个框架。无论如何,许多事情必须再次学习。

他们将更多地关注您的基本知识,解决问题的经验和更一般的能力。

相反,一些小公司可能要求您知道春季,VUE,REDIS等。这些框架或组件。

计算机科班学生大学四年该学啥?为何有人成大厂Offer收割机?

腾讯JD

计算机科班学生大学四年该学啥?为何有人成大厂Offer收割机?

阿里巴巴JD

计算机科班学生大学四年该学啥?为何有人成大厂Offer收割机?

一些外包JD

以上是腾讯,阿里巴巴和外包公司的招聘JD(职位描述)。显然,腾讯和阿里巴巴对扎实的编程技能和快速学习能力感兴趣,这意味着有可能进行培养。

外包公司要求您知道XX数据库,春季等。不要评估哪个更好,但是如果您想参加BAT,是否可以通过将它们与JD进行比较来提高您的能力?

在这里,我将计算机编程领域的知识大致分为三个部分:

基本知识是指朝哪个方向掌握的软件工程师,例如数据结构,算法和操作系统。

特定字段中的知识是当您涉及一定的细分方向时需要掌握的知识,例如,如果您是游戏引擎,则需要掌握图形。如果您是前端,则需要掌握浏览器渲染的原理和前端的三个主要项目;算法工程师需要更多的数学知识。

毕竟,有许多类型的计算机,因此您需要选择一个细分方向进行研究。如果您学到任何东西,您只能擅长擅长(除了大个子之外。

1。基本知识

当前的环境相对浮躁,很少有人愿意花时间基于它,并且喜欢直接学习Python来进行机器学习,写闪光销售和建造购物中心。

寻找工作时,我总是想阅读文章并迅速总结它们。

但是,作为一名出色的计算机学生,您如何才能更多地参与各种编程框架(创建框架除外),并与Springboot或SSH纠缠在一起?

将他的时间花在算法和基本主题上不是很好吗?为了更具功利主义,奖励会更大。

此外,在计算机领域,许多基本理论不是很先进,我们可以通过努力工作来掌握核心知识。

1.1数学

首先,让我解释说,这里的数学不是出现高端,而是遭受数学的损失。

如果您是研究自己的职业并转向职业的程序员,我当然不会推荐数学,因为职业变化很可能会学习Java,前端,并且基本上没有数学要求。

但是,本文主要针对仍在上大学的专业学生。这些学生可能会从事算法(简历,NLP等),游戏引擎,信息安全编码等。

这些方向将对数学有很高的要求。在计算机领域,数学分支(例如生成线,概率理论和统计)相对重要,计算机本质上是离散的。

例如,线性代数通常用于减少机器学习或数据挖掘中的数据维度,并且许多问题最终可能会变成线性方程的求解系统。

因此,为了避免在将来遇到这些方向,当您在新生和大二时参加数学课时,应该很好地学习数学。

当您使用这本书时,您会后悔的。不要以为它没有用,也不要努力学习。当您需要时,您会知道您后悔。 (默默地流下了无知的眼泪┭┮﹏┭┮

什么?您认为您肯定会在未来发展发展方向吗?

您确实可以稍后将数学优先级放置,并且使用不多,但是在上数学课时,您应该始终仔细聆听。获得高年级也是有益且无害的。也许有一天,您想加入算法体内军队?

1.2 C语言

您可能会感到困惑。在这里,我们清楚地谈论了基础知识,为什么我们需要单独列出编程语言?

因为我认为,没有比C了解计算机系统更好的方法。

我们稍后将提及的操作系统和体系结构非常适合使用C语言理解或练习。

此外,C语言本身的语言特征很少,但是学习良好并不容易。许多人认为C语言很困难。什么困难?回忆我的新生经历:

不幸的是,这些内容是计算机系统知识的一部分,因此使用C语言作为学习计算机系统知识的最有效方法。

真的很难想象使用Java或Python向他人解释记忆,因为这些语言比C更抽象,这意味着它们离计算机系统更远。

在TIOBE编程语言排名中,C语言几乎总是占据前三名,并且其状态自然是毫无疑问的。

计算机科班学生大学四年该学啥?为何有人成大厂Offer收割机?

TIOBE-2020排名列表

而且,您在开发中使用的几乎许多内容都是用C语言编写的,例如Linux,nginx,redis,mysql,git …也许您将需要探索原理并阅读这些开源软件的源代码,因此C语言也是您必要的瑞士军刀。

深入学习C语言可以理解计算机的基本执行原理,并且是理解程序运行机制的出色语言,而无需任何例外。

在这里,我们必须引用最经典的C语言摘要:

任何低于C的语言都不足以完全抽象计算机系统。任何比C更高的语言都可以在C中实现。

这是一项非常高且相关的评估!

因此,对于计算机科学专业的学生,​​无论您是从事前端还是后端,算法还是开发,建议使用C语言来努力学习。这是一种与方向无关的语言,这是基础知识!

1.3操作系统

我们编程的所有ID和我们编写的程序需要在操作系统上运行。说操作系统是计算机软件的基石并不夸张。

当程序运行时,它需要创建一个过程,该过程涉及操作系统的流程管理;编写程序时,您需要定义变量和存储数据,该数据涉及内存,相应的内存管理;有时,我们还需要读取和写文件,这与处理文件系统是密不可分的。您需要学习使用锁,条件变量和关键区域,以确保同时执行时该程序不会混淆。

读写文件和分配内存与系统调用密不可分。

当您真正启动该项目时,您会发现许多问题与操作系统密切相关。如果您不了解操作系统,甚至无法分析问题的原因。

例如,我们以前出现在基于Coroutines(Libco)的框架下,使用多线程锁来同步互斥偶尔的僵局。后来,我们发现了原因:

由于Coroutines由应用程序层实现,因此线程中的多个Coroutines不知道操作系统:

计算机科班学生大学四年该学啥?为何有人成大厂Offer收割机?

Coroutine模型

然后,当协作A锁定并启动网络IO请求时,它将切换到另一个Coroutine B,Coroutine B会请求此锁定。

目前,操作系统将认为锁已上传,因此它将暂停与Coroutine B相对应的线程到等待队列。这将导致Coroutine A永远不会运行,并且无法释放锁,从而导致僵局。

解决方案也非常简单,即将锁定为重新进入。重新进入意味着相同的线程请求多次锁定,不会导致挂起。这样,当Coroutine B再次请求锁定时,操作系统将认为Coroutine B所在的线程已经持有锁,并将直接返回并继续执行。

简而言之,我们每时每刻都在编写程序时与操作系统进行互动,没有理由不太学习它们。

1.4汇编原则

汇编原则可能是我们通常与接触最少的汇编原则。人们可能会觉得自己不必创建新的编程语言,那么在学习编译原则时该怎么办?

很好地学习汇编原则有什么用?

您将从更高的角度看待这些编程语言,并且您将不再看到表面语法,但是您还会想到语法背后的实现。

这种感觉非常彻底。就像您了解操作系统和体系结构一样。您将通过双击鼠标来了解程序如何运行。掌握所有细节和彻底的感觉真的很棒。如果您不相信,请尝试。

说人类的话!

那么,在学习汇编原则后,您该怎么办?

了解有限状态机后,您会发现您以前认为的正则表达式很棒,并且似乎能够使用DFA和NFA实现它们。国家机器的想法可以在编程中的许多地方使用。

例如,解析HTTP协议时,如果您尚未学会状态机器的想法,则可以按行逐行解析。这里最麻烦的事情是,如果/其他需要在做出判断之前先提前收到所有HTTP标头字段。我们知道HTTP基于TCP,而TCP正在流式传输,因此您可能会以几个字符的组收到它。目前,用if/else写出它将很难看。

并且用状态机器编写的代码非常优雅。国家的过渡是由规则驱动的,当您收到一个角色时,判断一个角色非常方便。

在继续学习语法分析之后,您将掌握递归下降分析的非常重要的思想。您可以使用递归下降来快速实现四步操作计算器。

如果您不需要递归下降,则可能需要先将表达式添加到后缀,然后对其进行评估。这就是我们在大一新生中在数据结构类中写的。当时是在堆栈上写的,这有点麻烦。后来,在了解了汇编原则之后,我再次以递归下降的速度重写它,而我只用几十条代码就完成了。

在实际开发中,还有另一种类型的方案,例如淘宝和等电子商务。他们有许多营销规则,例如完全减少,直接减少,跨店等。这些规则不能写在代码中。

这是怎么做到的?

通常,将实现配置系统,并将设计DSL(特定于领域的语言)来表达这些规则,并且该规则将直接配置到系统中,可以非常方便地修改该规则。那么如何解析代码中DSL定义的规则?这需要为DSL编写语法解析器,并在此处使用语法分析方法。

DSL(特定域语言)是一种在特定字段中使用的编程语言。这种特定领域是相对于C,C ++和Python等通用语言的。通用语言可用于各个领域。我们熟悉的大多数编程语言都是通用语言,它们都是图灵完整的。

就像我们经常使用的JSON,SQL,HTML和HTML一样,这些都是DSL。您甚至可以尝试用递归下降来编写JSON,XML解析器,这比编写电子商务网站更有价值。

继续学习,您将学习如何生成抽象语法树AST,如何将其转换为中间代码,如何优化中间代码以及最终如何生成机器指令。

您将在寄存器分配中看到贪婪算法的应用,还将看到图理论中的可访问性分析如何实现死亡代码消除。

IDE上的绿色汇编按钮对您来说不再是黑魔法。

为什么可以通过单击它来生成可执行程序?

您写的英文字母如何成为二进制说明?

在学习了汇编原则之后,这些不是问题。妈妈不再需要担心您的学习〜

当然,很难完成GCC和Clang等编译器。我们的学习汇编原则的目的不是建立这样的轮子,而是更好地理解和使用编程语言。

1.5建筑与构图原理

以上所有内容均为软件级别,并且该体系结构涉及计算机的工作原理,您将了解典型的存储程序计算机的工作方式。

我记得南洋大学的一位老师说:“我们不是在学习使用计算机,而是学习如何构建计算机。”尽管构建计算机有些夸张,但至少我们必须了解计算机的实现原理以及CPU如何执行代码,对吗?否则,您会非常困惑。您如何在CPU电路上奔跑一堆英文字母?当我在大一新生中首次学习C语言时,我感到困惑,直到稍后才了解构图原理和数字逻辑。

我们说,计算机中的所有内容均为0、1、0和1。它通过和或或非等效的逻辑门电路表达二进制数值操作,然后集成这些简单的电路,以使用ALU等计算能力形成处理器。

您将看到CPU如何执行指令,该指令将指令从内存或缓存中获取指令,将其放入指令寄存器中,并解码指令。解码是根据指令的编码规则将指令分为一系列微型操作和操作数。然后发布各种设备控制指令以执行微功能。这完成了指令的执行。

我们说,在学习了汇编原则后,我们可以了解写作的英语代码如何转化为二进制说明,并且在学习操作系统后,我们可以了解如何将二进制程序链接在一起,以及如何由操作系统加载和执行它们。组成原则将告诉您二进制指令如何控制CPU运行。我们的操作系统本质上是二进制程序。

当您了解计算机存储层次结构和多级高速缓存时,您将通过优化数据访问的方式编写更快的程序。

您将学习基础体系结构对堆栈帧和以这些语言C的参数的支持,以及参数如何传递给另一个函数?如何获取功能的返回值。

这是学习编写代码的学习组成原理的含义。

学习这些的意义是什么?

您将完整地看到您编写的代码如何变成二进制说明,如何控制各种门电路,最后在屏幕上变成彩色程序(当然,您可能还需要在此处学习监视器的原理)。这就是我们经常称之为“基础”和“原则”。

而且,计算机架构中的许多想法都可以广泛用于现代软件开发中,例如CPU的多级缓存想法,这是一种在服务器开发中通常用于改善并发性的缓存技术,包括缓存替换策略等。

当计算机不再适合您时,您会理解为执行的每个步骤所写的代码,这也将成为您将来的核心竞争力。作为专业毕业生,您不仅应该使用Java,Redis,MySQL和Spring来编写各种网站。

如果读者中途改变职业或培训课程,我希望您可以花时间弥补这些基本课程,这将使您在编程之路上更加稳定地走得更远。

1.6数据结构和算法

将算法放在最后不是重要吗?相反,它是如此重要,以至于结局。

如果您想问我什么后悔我在大学里后悔?那一定是因为我大一以来我就再也没有开始学习算法了,并进入了ACM。

仍在大一和大二的学生并没有试图抓住机会,所以不要等到他们后来后悔。当然,在不使用ACM的情况下,我们还可以很好地学习数据结构和算法。

您可以在任何计算机字段中看到数据结构和算法。例如,在汇编原则中,寄存器的分配将是贪婪的,并且将死亡代码的检测和消除将用于图理论中的无法到达知识。操作系统过程和线程调度将用于使用多级队列和调度算法;在组成原则中,缓存的替换将用于使用LRU和FIFO等算法。与B+树和LSM以及搜索算法相关的必要数据库也不可分割。

很多时候,我们需要的算法被封装在编程语言的基本库中,因此许多学生认为算法离我们太远,但事实并非如此。

如果您不学习算法,甚至无法分辨何时使用地图(红树实现)以及何时使用hashmap。

因此,学习算法可以帮助我们根据应用程序方案选择最合适的数据结构。

算法在日常开发中也必不可少。例如,对小米最近工作中涉及的一些嵌套TLV(标签长度值)结构的分析需要递归和多福克斯特人等知识。如果您不学习该算法,则只能在程序中看到大量的IF/if/elter/while/for。 。 。

可以说,知道如何使用算法的工程师一定不能成为出色的工程师。

1.7为什么我不谈论网站,数据库等。

许多人喜欢将计算机网络和数据库原理分类为计算机基础。当然,我同意这一点,因为具有完整知识结构的计算机学生应该理解这一知识。

但是我个人认为,计算机网络和数据库不过是建立在操作系统,编译原理和组成原理上的应用程序级软件。

什么是数据库?在没有数据库之前,您将使用文件存储数据,但是查找,修改等。数据库仅提高此过程的效率。

互联网做什么?该网络是让不在同一计算机上的程序相互通信的网络,这本质上是过程间通信的一种手段。

如果您只是开发独立的工业软件,甚至无法学习互联网。只是大多数程序员现在都在互联网公司工作,无论前端和后端如何,他们都不明显地处理HTTP等网络协议。

再次:不是因为网络和数据库并不重要,而是我认为它们是在操作系统上构建的软件,并且不包括在基础上。

2。领域知识

我不敢对此说太多,因为我不太了解所有领域。只是简单地提到它,扔砖并吸引玉。

如果您想去腾讯和NetEase进行游戏引擎开发,那么图形必须是您无法避免的知识。此外,您必须学习渲染管道,着色器,物理,照明等。

如果您想在PingCap等公司中进行分布式存储,则分布式理论知识必须是无法避免的障碍,包括CAP定理,Paxos算法,RAFT算法,ZAB协议等。

如果您想编写数据库,那么您需要了解许多诸如磁盘,索引实现,SQL解析(编译原理),交易,交易,如何解决与MVCC等的冲突,并且您还需要在编程语言层面上了解很多事情,例如locks,Semks,Semks,Semps,Sempers和Consentsments的编程。必须说,构建数据库是一项肮脏的工作,也是一项累人的工作。

如果您想执行分布式数据库,则可能必须学习数据碎片的知识,如何执行查询任务,是以集中式的方式进行,还是将逻辑推向每个节点,如何实现分布式交易等。

您说您只想去大型工厂泥巴吗?没问题,对不起!

然后,您必须熟悉编译语言(C/C ++,Java,Go),并了解该语言的一些基本原则。例如,C ++,您必须查看STL和对象模型。您是否不知道哪些虚拟功能表和智能指针是什么,您仍然想在腾讯中写C ++?对于Java,您必须背诵JVM和垃圾收集算法。如果您不看Concurrenthashmap,您会很尴尬地说自己是Java吗?

我们的CRUD对象是数据库?然后,您必须学习如何很好地使用数据库。我们需要通过HTTP向用户提供服务,我们必须了解HTTP,对吗?顺便说一句,不要看TCP。您是否有胆量说您是计算机学生?

如果用户将金钱和信息放在这里,他们必须确保用户数据的安全性,对吗?因此,您必须了解常见的Web攻击方法,例如XSS,SQL注入和CSRF?您必须知道安全方法,例如HTTPS,RSA,签名和数字证书。

双重十一的交通太大,老板要求您承受它。然后,您必须了解缓存,异步,消息队列和NOSQL,它们是数千万QP的必不可少的杀手,对吗?

看看!做得很好,这并不容易。

(上面的段落只是写下在后端工作的学生会学习的知识的另一种方式。这不是投诉或笑话,而是纯粹的娱乐。

技能

这很多,包括诸如VSCODE,JetBrains Family Bucket以及文档写作,Markdown,Git和其他版本管理工具之类的IDE。提高您的开发效率的工具,例如SSH远程登录,端口转发,NGROK Intranet渗透等,都是技能。对此无话可说。只需在日常使用中学习和积累更多。

我只提到一件事:尽快使用Linux和Unix状(MAC)作为主要开发计算机。当我大二的时候,我读了Wang Ying的文章“ Finishing Linux”,并购买了SSD并将其放在USB Flash Drive上。我制作了一个启动盘。后来,我使用了Ubuntu将近一年。我只有在选择课程,提交作业等课程时才打开窗户(我必须在这里抱怨学校的旧古董网站!)

当然,我不是一个狂热的Linux爱好者。我只是认为,如果您进行开发,它与安装各种环境和使用命令行是密不可分的。这个类似于Unix的系统具有自然的优势,无论谁使用它!

总结

写完之后,我发现本文的长度是“基础:域知识:技能”,它接近7:2:1。

这也是您上大学学习时间的比例,至少在学习基础知识的时候不少于50%。当然,在学习这些东西之后,您可以找到对研究它们感兴趣的方向。

在新生或大二的一年开始时,切勿潜入Java Web和Python Crawlers。这些可以学习,但它们不是关键点。

由于空间的限制,本文没有写有关如何学习以及那里有什么优质材料的文章。我计划写一个单独的“如何”,并继续关注我〜

那么您如何测试如何学习?

我相信您必须在Jiwang上听说过这个采访问题:“从URL到页面显示时,到底会发生什么?”

这个问题以另一种方式表达,“如何将数据包发送到另一台计算机”。

如果您可以完整地分辨整个过程,那么您一定已经学会了它!这就是为什么我喜欢在访谈中如此多地问这个问题的原因。

然后让我们根据副本问一个问题

“从编写代码到程序运行的时间,到底发生了什么?”

这个问题的答案越详细,越好。如果您基本上可以清楚地解释它,您将了解三个大三的三个:汇编原则,操作系统和组成原理。

此问题也包括在这里。请继续关注编程指南。

las,如果那时候这样的有爱心的大四学生告诉我,我不会在Andorid Development,Java Web,Python Crawlers玩了半年以上。 。 。

幸运的是,我意识到了基础知识的重要性,并开始学习编译,专注于C,在迷你操作系统上工作,并阅读Linux内核实施的原理,并最终成功丢掉了我的头发。 。 。

最后,我想给你一个我喜欢的话:

高耸的建筑物从地面升起,不要在浮动的沙子上建造高平台。

单片机

第10章单片机应用系统设计与开发:过程、工具及举例

2025-5-4 10:01:11

单片机

第10章单片机应用系统设计与开发:过程、工具及举例

2025-5-4 10:02:11

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索