数学课程(线性代数、概率统计、离散数学、高等数学/数学分析)算法与数据结构可计算理论构成原理与架构操作系统
另外,这个问题其实意义不大,因为如果你想成为一名基础扎实的CSer,其他课程即使不在TOP5你还是要学的,比如数字电子/模拟电子、编译原理、数据库、计算机网络...
一个更有意义的问题是:学了这么多课后,如何把它们串联起来? 在我的脑海里,这些教训不再是离散的点,而是一个连成一体的图表,带着俯视的感觉,然后真正形成我自己的。 核心竞争力? 关键在于抽象能力。
第一次接触抽象是在大三学习数据结构的时候。 我清楚地记得,我正在学习一个概念,叫做抽象数据类型,大致意思是数据结构。 接口是一回事,实现又是另一回事。 比如栈,作为用户你只需要知道它有push、pop等方法,但不需要知道它的底层实现是数组还是列表。
通俗地说,抽象就是你做好自己的事,知道别人能为你做什么。 至于别人如何帮你完成,你不需要知道。 这种简单的想法极大地提高了开发人员的效率,让开发人员只关注要解决的问题,而不是琐碎的事情。
孟岩在文章中还提到了“抓住重点”的事情。 虽然他没有明确提到抽象这个词,但他的意思和抽象表达是一样的:
我主张,掌握了基础之后,学习任何新东西时,一定要抓住主线,突出重点。 对于关键理论的研究,必须集中精力快速解决问题。 而那些琐碎的、非必要的知识内容可以留给零碎的练习。
原因是这样的。 任何高深的知识内容中,只有一小部分是创新的、具有重大影响力的,而其他很多东西都是琐碎的、非本质的。 所以,当你专注学习的时候,一定要抓住真正重要的部分,其他的就交给练习吧。 对于关键知识,只有集中研究其理论,才能保证系统性、连贯性、正确性。 对于那些侧面的细节,只有边做边学,才能让你知道它们真正的价值是大还是小,你能不能保留它。 创造更生动的印象。 如果你把精力用在了错误的地方,比如把大量的时间集中在学习那些手册上查一下的小技巧上,而零碎地关注真正重要的思想性的东西,那么你一定会事半功倍。 甚至适得其反。
计算机专业课程可以通过抽象来连接:每一门课程要做的就是利用下层提供的接口来实现功能,然后向上层提供接口。 这样的抽象层几乎构成了所有的专业课程。
让我们首先看看顶层的问题。 当我第一次学习编程时,我会首先学习入门课程或编程入门课程。 我当时选修的入门课程叫《编程》。 课程内容是介绍一些问题,然后介绍一些编程语言的知识。 作业是一些编程问题。 ,比如八皇后、素性测试等比较常规的编程题。 本课程的目的一般是引入“问题”,引入计算机科学中具有挑战性的问题,让学生对计算机专业有一个感性的认识,而不是学习具体的编程语言或算法,所以这类课程 一般用于编程。
下一个层次是算法和数据结构。 该层的目的是学习/实现各种算法/数据结构并将其提供给上层功能。 比如对于排序,问题解决者只需要知道这里应该使用快速排序而不是选择排序,而快速排序的实现则留给本层的开发人员,这样各种优化就可以对上层透明层,例如小数组插入。 排序、中值枢轴、三路快速排序等等,这些优化的调用者根本不需要知道。 他只需要知道:哇,这个库提供的快速排序真快。
下一层是语言层。 毕竟,所有算法都必须用某种语言来实现。 这一层的存在使得算法的设计可以脱离特定的语言。 不同的语言提供不同的抽象。 例如,函数式语言比命令式语言具有更高的抽象级别。 更高的抽象级别意味着更多地关注问题本身(无需考虑内存布局、CPU 使用情况等)和更少的代码。 数量。
再往下一层,是编译器/解释器。 我们用高级语言编写代码,CPU上执行的是机器码,所以这个抽象层帮助我们做这个转换。 这个抽象层的优点是高级代码的编写者不需要知道程序运行的操作系统和硬件平台。 该程序可以在任何具有该语言的编译器/解释器的机器上运行(从而实现跨平台)。 应用层开发人员不需要知道高级语言到机器代码的转换是如何实现的。 毕竟编译器优化的编写和优化完全是一个团队的工作量。 开发人员专注于解决问题,编译器负责转换。 高效的机器代码,各自做自己的事情,就是抽象点。
下一个层次是操作系统。 操作系统将硬件(CPU、内存、磁盘、网卡等)抽象给开发者,并以...的形式向用户提供服务。 操作系统的设计是最抽象的。 虚拟内存和进程让程序认为自己拥有对内存和CPU的独占访问权,同时隔离不同的进程以防止恶意进程。 文件系统可以让用户轻松读取存储的数据,而无需直接操作底层硬盘; 文件描述符抽象了底层设备(管道/文件///...)。
下一层是 ISA(集),通常称为软件和硬件之间的接口。 这个俗名非常形象。 指令集架构,简单来说就是机器代码,也可以理解为协议。 ISA标准制定者指定了一组指令集(例如x86、SPARC),然后编译器开发人员需要根据这个标准/协议编写相应的编译器; CPU制造商需要根据这个标准/协议来创建支持该集合的产品。 ISA CPU(例如Intel CPU支持x86/)。 换句话说,如果软件/硬件是按照这个ISA设计的,那么它们是可以连接的。
下一个层次是组成原则和架构。 这一层要做的就是利用数字电路(组合电路和锁存器)提供的功能来设计一个可以实现某种ISA的CPU网校头条,让编译器生成的指令可以在这个CPU上运行。 在大学里,通常有一门叫做“计算机组成原理”的课程。 一开始,他们学习单周期CPU的实现(取指、解码、执行……)。 为了提高效率,他们还提出实行管道化。 为了探索更高的效率,后面我会选修一门叫做“计算机体系结构”的课程。 本课程的目的是探索更高的并行性并创建更快的 CPU。 那么这一层是如何使用数字电路提供的功能的呢? 举两个典型的例子:一是CPU有ALU模块进行计算,ALU模块是一个组合电路(输入确定,输出确定); 其次,输入值在时钟的每个上升沿保存在流水线寄存器中。 在这个时钟周期内,组合电路将根据这个新值计算结果,并将其传送到下一级流水线寄存器的输入,等待下一个时钟上升沿的到来。 这里的流水线寄存器就是某个锁存器的实现,CPU开发者不需要知道这个数字电路模块是如何实现的。
下一个层次是数字电路。 本课程的目的是教学生如何使用基本的门电路(NAND或门)来实现一些高级功能(解码器、多路复用器、锁存器、时序电路...),然后为上层提供功能。 上数字电路课就是一个搭砖砌房子的过程,从基本的门电路开始,慢慢搭建复杂的电路。 数字电路不需要关心基本门电路是如何实现的,因为这正是模拟电路向上层提供的功能。
下一层是模拟电路。 该层实现基本门电路,例如“与”或“非”。 例如,非门、与非门、或非门可以由多个p/n型MOS晶体管构成,与门可以由与非门和非门连接构成,或门可以由多个p/n型MOS晶体管构成。通过连接或非门和非门。 门组成。 很多同学认为模拟电子学不是计算机专业学生必须学习的计算机专业,但我认为恰恰相反,它是你构建整个计算机抽象层次的基石。
再往下一层,就不是计算机领域的研究问题了。
当然,还有很多专业课程我没有提到,比如网络,它是操作系统提供的抽象之一,以文件的形式提供给用户; 在网络协议栈实现的细节中,有几个抽象层。 就是著名的OSI七层网络模型(有时抽象为五层:、、、、)。 你可以自己回忆一下你在大学里学过哪些专业课程以及它们应该处于哪个抽象层次。
如果脱离计算机领域,看得更高一点,你会发现整个计算机领域似乎都在为其他领域提供功能计算机专业,而隐藏了细节。 技术应用广泛应用于医疗、交通、餐饮、娱乐、安防等领域。