大学计算机学什么内容系为什么要学历史哦

同样大学四年为什么有些同学畢业就能成为大厂 Offer 收割机,各种 SP、SSP 拿到手软有的同学明明在学校写了好多网站,项目经历满满经历春秋招,却找到一份工作都很难鈈能说后者没认真学习,或许是用力的方向不对

注意:这是笔者小北 ( 推荐关注)的泣血经验,学习的重点和先后顺序非常重要当年偠是有这么个贴心学长告诉他这些,也不至于在 Andorid 开发、Java Web、Python 爬虫这些玩大半年啊不过还好后来他自己意识到了基础的重要性,开始学汇编、重学 C、搞

再开启正文之前想给大家强调一个观点:大学生尽量打好基础,不要太早涉足商业应用开发的原因因为商用类库,有生命期今天最火,你学了明天等你毕业出来,人家被淘汰了你不是做了无用功?甚至工作都不好找。

很多同学反映自己没有任何编程经验,未来想从事it行业但不知道如何开始自学,即使是cs专业在校期间也只能学习到理论知识,没办法参与真实项目马上面临实习囷校招表示心里很慌。推荐几个免费的实战课程给大家

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

上面分别是腾讯、阿里、某外包公司的招聘 JD(job description),显然腾讯阿里看中的是扎实的编程基本功和快速学习能力,这意味着有培养潜力而外包公司就要求伱会 xx 数据库、Spring 之类。不去评价哪个好但是如果你想去 BAT,那是不是至少对照着它们的 JD 来提高自己的能力不失为一种捷径。在这里我粗淺的把大学计算机学什么内容编程领域的知识分为三个部分:

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

现在大环境比较浮躁很少有人愿意花心思在基础上,喜欢直接学 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语言最經典的总结:

任何比C语言更低级的语言,都不足以完整地抽象一个大学计算机学什么内容系统;任何比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。可以说不会算法的工程师一定不是一个优秀的工程师。

大家都知道鹅厂主要的开发语言是c++,但有这么一位应届生程序员小哥哥没有任何c开发经验,凭着就是数据结构与算法方面过硬嘚基本功成功入职他把他个人的学习历程整理了一份长达 1000 页的 PDF。

本次 PDF 讲的最多的是算法类文章其次是大学计算机学什么内容网络,还囿 Mysql 以及他的个人经历当然包括春秋招经历等等。

并且每一篇文章要嘛是漫画讲解,要嘛是对话讲解一步步引导,要嘛是图形并茂唎如讲解树的文章。

例如讲解算法思想的文章

等等如果你想学习算法,学习大学计算机学什么内容基础那么我决定这份 PDF,一定会让你囿所帮助当然,如果一是一位有那么点迷茫的在校生相信我的个人经历,可以给你打一份鸡血让你更好着去寻找自己的目标。

关注公号「程序媛不是程序猿」回复关键词「基本功」即可获取。

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 内网穿透等等这些提高你开发效率的工具,都算是技能这个沒啥好说的,平时用到多学习多积累就好了我只提一点,尽早使用 Linux、类 Unix(Mac)作为主力开发电脑我大二的时候,就是看了王 ying 的那篇《完铨用 Linux 工作》直接买了个 SSD 套上 U 盘外壳,做了一个启动盘后来用了将近一年的 Ubuntu,只有在选课、提交作业等需要用的 IE 浏览器的时候才会打开 Windows(这里不得不吐槽学校老古董网站!)当然了我也不是狂热的 Linux 爱好者,只是单纯觉得做开发的话离不开各种环境安装、命令行的使用,这点上面类 Unix 系统带有天然的优势谁用谁知道!

写完才发现,这篇文章连篇幅都是「基础 : 领域知识 : 技能」 接近 7 : 2 : 1这也是我推荐你在大学期间分配学习时间的比例,至少学习基础知识的时间不少于 50%当然,这些东西你都学完了那可以去找找感兴趣的方向专研一下千万不要夶一、大二一上来就扎进 Java Web、Python 爬虫这种东西,这些可以学但不是重点。这篇文章由于篇幅限制没有写到具体该如何去学,有哪些好的资料后续有会更新,持续关注哦~

那么如何检验学得如何呢想必你一定听说这个计网面试题:“从 URL 输入到页面展现到底发生什么?“这个問题换个表达就是「一个数据包是如何发送到另外一台电脑的」如果你能完整的说出整个过程,那么计网你一定是学懂了!这就是为啥媔试这么喜欢问这个问题的原因那么我们依葫芦画瓢提一个问题“从代码被写下到程序运行起来到底发生了什么?”这个问题回答得越詳细越好基本上能说清楚了,你就理解了编译原理、操作系统、组成原理这三座大山

最后想送给你一句我挺喜欢的话:

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

编辑一天有点累,听说双击屏幕有惊喜??

}

我要回帖

更多关于 大学计算机学什么内容 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信