作为计算机专业学生最应该学习的课程前五位是什么?_第1页
作为计算机专业学生最应该学习的课程前五位是什么?_第2页
作为计算机专业学生最应该学习的课程前五位是什么?_第3页
作为计算机专业学生最应该学习的课程前五位是什么?_第4页
作为计算机专业学生最应该学习的课程前五位是什么?_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、作为计算机专业学生,最应该学习的课程前五位是什么?先列一下我心目中的 T0P5:数学课(线性代数,概率 统计,离散数学,高等数学 /数学分析)算法和数据结构可计 算理论组成原理和体系结构操作系统另外,这个问题其实意 义不大,因为如果你想成为一个基础扎实的CSer,其它课就算不在 TOP5 里面你还得学,比如数电 /模电、编译原理、数 据库、计算机网络 .一个更有意义的问题是: 学了那么多课, 如何把它们串起来,在脑子里这些课程不再是离散的点,而 是一副连通图,有一种俯瞰的感觉,然后真正形成自己的核 心竞争力?关键在于抽象能力。第一次接触抽象是大学低年 级学数据结构的时候,记得很清楚当时学一个概

2、念叫抽象数 据类型(abstract data type),大概意思就是一个数据结构, 接口是一回事,实现是另一回事,比如栈,作为使用者你只 需要知道它有 push、pop、isEmpty 等方法,但它的底层实现 到底是 array 还是 linked list ,你是不需要知道的。用通俗一 点的话说,抽象就是你好好做自己的事,以及知道别人能帮 你干什么事,至于别人是如何帮你完成的,你没必要知道。 这个简单的思想大大提高了开发者的效率,让开发者只专注 于要解决的问题,而不是一些细枝末节的事。孟岩在他的文 章里也提到过“关注重点”这件事,虽然没有明显地提及抽 象二字,但他的意思和抽象表达的意思是

3、一样的:我主张, 在具备基础之后,学习任何新东西,都要抓住主线,突出重 点。对于关键理论的学习,要集中精力,速战速决。而旁枝 末节和非本质性的知识内容,完全可以留给实践去零敲碎 打。原因是这样的,任何一个高级的知识内容,其中都只有一小 部分是有思想创新、有重大影响的,而其它很多东西都是琐 碎的、非本质的。因此,集中学习时必须把握住真正重要那 部分,把其它东西留给实践。对于重点知识,只有集中学习 其理论,才能确保体系性、连贯性、正确性,而对于那些旁 枝末节,只有边干边学能够让你了解它们的真实价值是大是 小,才能让你留下更生动的印象。 如果你把精力用错了地方, 比如用集中大块的时间来学习那些本来只

4、需要查查手册就 可以明白的小技巧,而对于真正重要的、思想性东西放在平 时零敲碎打,那么肯定是事倍功半,甚至适得其反。计算机 专业课程之间完全可以用抽象来联系:每一门课想做的事就 是利用下层提供的接口, 实现功能,然后再给上层提供接口。 这样一层一层的抽象就构成了几乎所有的专业课。先来看最 高层,问题。刚学编程的时候,会先学一门课导论课或者编 程入门课,我当时的入门课叫做“程序设计”,课程内容是介绍一些问题,然后介绍一点编程语言的知识,作业是一些 编程问题,比如八皇后、素性测试之类的比较常规的编程题。 这门课的目的一般都是介绍“问题”的,介绍计算机科学有哪些有挑战的问题,让学生对计算机专业有一个

5、感性的认 识,而不是对特定编程语言或者算法的学习,所以这类课程 一般用 python 来编程。再往下一层,算法和数据结构。这一 层的目的是学习 /实现各种算法 /数据结构,提供给上层功能。 比如排序,问题解决者只要知道这里应该用快速排序,而不 是选择排序,而把快速排序的实现留给这一层的开发者,从 而使各种优化都可以对上层透明,比如小数组变插入排序、 中位数取 pivot 、三向快速排序等, 这些优化调用者完全不必 要知道, 他只需要知道: 哇,这个库提供的快速排序还真快。 再往下一层,语言层,毕竟所有算法都要由某一门语言来实 现。这一层的存在使得算法的设计可以脱离具体的语言。不 同语言又提供了

6、不同的抽象,像函数式语言就比命令式语言 的抽象级高,更高的抽象级意味着更加专注问题本身(不需 要考虑内存布局、 CPU 使用等)以及更少的代码量。再往下 一层,编译器 /解释器。我们编写代码是用高级语言,而cpu上执行的是机器码,所以这个抽象层帮我们做了这个转化。 这个抽象层的好处是,高级代码的编写者完全不需要知道这 个程序所运行的操作系统和硬件平台,任何有该语言编译器 /解释器的机器,程序都可以跑(从而实现了跨平台)。应用层开发者可以不用知道这个由高级语言到机器码的转化具 体是怎么实现的,毕竟编译器优化的编写和优化完全是一个 团队的工作量,开发者关注问题的解决,编译器负责转化出高效的机器码,

7、 各干各的, 这正是抽象的重点。 再往下一层, 操作系统。OS向开发者抽象了硬件(CPU、内存、Disk、 NIC等),并且以syscall的形式向用户提供服务。OS的设计是最能体现抽象的,虚拟内存和进程让程序以为自己独占着 内存和CPU,同时隔离了不同进程以防恶意进程;文件系统让用户可以方便地读取存储数据,而不需要直接操作底层的 硬盘;文件描述符抽象了底层的设备(pipe/file/device/socket/ )。再往下一层,ISA (Instruction set architecture),俗称软件与硬件的接口。这个俗称是非常形象的。指令集架构,说得简单点就是机器码,也可以理解为一 个

8、协议。 ISA 标准制定者指定一套指令集(比如x86、PowerPC、SPARC),然后编译器开发者需要根据这个标准/协议来编写对应的编译器; CPU 制造商需要根据这个标准 / 协议来制造出支持这套 ISA的CPU (比如intel的CPU支持 x86/x86_64 )。也就是说,软件/硬件都依照这个ISA来设计, 那么就可以对接了。再往下一层,组成原理和体系结构。这 一层要做的事情是借助数字电路给它提供的功能(组合电路 和锁存器),来设计一个能实现某种ISA的CPU,让编译器生成的指令可以在此 CPU 上运行。大学里一般会开一门叫 “计算机组成原理” 的课, 一开始学单周期 CPU 的实现

9、(取 指、译码、执行),为了提高效率又提出了流水线的实 现。为了发掘更高的效率,之后又会学一门叫“计算机体系 结构”的课,这门课的目的是为了发掘更高的并行,从而制 造出更快的 CPU 。那这一层是如何用数字电路提供的功能? 举两个典型例子:一、 CPU 为了做计算会有 ALU 模块,而 ALU 模块正是一个组合电路 (输入确定那么输出确定) ;二 在流水线寄存器中每一个时钟上升沿都会保存输入的值,在 这个时钟周期内组合电路会根据这个新值计算出结果传输 到下一级流水线寄存器的输入,等待下一个时钟上升沿的到 来,这里的流水线寄存器正是某种锁存器的实现,而 CPU 开发者并不需要这个数字电路模块是怎

10、么实现。再往下一 层,数字电路。这门课的目的是教学生如何利用基本的门电 路(与非或门)来实现一些高级的功能(译码器、多路复用 器、锁存器、时序电路),然后给上层提供功能。上数 字电路课是一个用砖搭房子的过程,由基本的门电路开始, 慢慢构造出复杂的电路。数字电路不需要关心基本的门电路 是如何实现的,因为这正是模拟电路向上层提供的功能。再 往下一层,模拟电路。这一层实现了与或非等基本门电路。 比如非门、与非门、或非门都可以通过若干个 p/n 型 MOS 晶体管构成,而与门可以通过连接一个与非门和非门构成, 或门可以通过连接一个或非门和非门构成。很多同学都觉得 模电对于计算机的同学不必要学,而我认为相反,它是你构 建整个计算机抽象层级的基石。再往下一层,就不是计算机 领域研究的事了。当然,还有很多专业课我并没有提及,比 如网络,它是 OS 提供的抽象之一,以文件的形式提供给用 户使用;在网络协议栈实现的细节里,又分了好几层抽象, 这就是我们熟知的 OSI 七层网络模型(有时候被抽象为五层:Appl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论