先列一下我心目中的TOP5:数学课(线性代数,概率统计,离散数学,高等数学/数学分析)

算法和数据结构

可计算理论

组成原理和体系结构

操作系统

另外,这个问题其实意义不大,因为如果你想成为一个基础扎实的CSer,其它课就算不在TOP5里面你还得学,比如数电/模电、编译原理、数据库、计算机网络...

一个更有意义的问题是:学了那么多课,如何把它们串起来,在脑子里这些课程不再是离散的点,而是一副连通图,有一种俯瞰的感觉,然后真正形成自己的核心竞争力?关键在于抽象能力。

第一次接触抽象是大学低年级学数据结构的时候,记得很清楚当时学一个概念叫抽象数据类型(abstract data type),大概意思就是一个数据结构,接口是一回事,实现是另一回事,比如栈,作为使用者你只需要知道它有push、pop、isEmpty等方法,但它的底层实现到底是array还是linked list,你是不需要知道的。

用通俗一点的话说,抽象就是你好好做自己的事,以及知道别人能帮你干什么事,至于别人是如何帮你完成的,你没必要知道。这个简单的思想大大提高了开发者的效率,让开发者只专注于要解决的问题,而不是一些细枝末节的事。

孟岩在他的文章里也提到过"关注重点”这件事,虽然没有明显地提及抽象二字,但他的意思和抽象表达的意思是一样的:我主张,在具备基础之后,学习任何新东西,都要抓住主线,突出重点。对于关键理论的学习,要集中精力,速战速决。而旁枝末节和非本质性的知识内容,完全可以留给实践去零敲碎打。

原因是这样的,任何一个高级的知识内容,其中都只有一小部分是有思想创新、有重大影响的,而其它很多东西都是琐碎的、非本质的。因此,集中学习时必须把握住真正重要那部分,把其它东西留给实践。对于重点知识,只有集中学习其理论,才能确保体系性、连贯性、正确性,而对于那些旁枝末节,只有边干边学能够让你了解它们的真实价值是大是小,才能让你留下更生动的印象。如果你把精力用错了地方,比如用集中大块的时间来学习那些本来只需要查查手册就可以明白的小技巧,而对于真正重要的、思想性东西放在平时零敲碎打,那么肯定是事倍功半,甚至适得其反。

计算机专业课程之间完全可以用抽象来联系:每一门课想做的事就是利用下层提供的接口,实现功能,然后再给上层提供接口。这样一层一层的抽象就构成了几乎所有的专业课。

先来看最高层,问题。刚学编程的时候,会先学一门课导论课或者编程入门课,我当时的入门课叫做"程序设计”,课程内容是介绍一些问题,然后介绍一点编程语言的知识,作业是一些编程问题,比如八皇后、素性测试之类的比较常规的编程题。这门课的目的一般都是介绍"问题”的,介绍计算机科学有哪些有挑战的问题,让学生对计算机专业有一个感性的认识,而不是对特定编程语言或者算法的学习,所以这类课程一般用python来编程。

再往下一层,算法和数据结构。这一层的目的是学习/实现各种算法/数据结构,提供给上层功能。比如排序,问题解决者只要知道这里应该用快速排序,而不是选择排序,而把快速排序的实现留给这一层的开发者,从而使各种优化都可以对上层透明,比如小数组变插入排序、中位数取pivot、三向快速排序等,这些优化调用者完全不必要知道,他只需要知道:哇,这个库提供的快速排序还真快。

再往下一层,语言层,毕竟所有算法都要由某一门语言来实现。这一层的存在使得算法的设计可以脱离具体的语言。不同语言又提供了不同的抽象,像函数式语言就比命令式语言的抽象级高,更高的抽象级意味着更加专注问题本身(不需要考虑内存布局、CPU使用等)以及更少的代码量。

再往下一层,编译器/解释器。我们编写代码是用高级语言,而cpu上执行的是机器码,所以这个抽象层帮我们做了这个转化。这个抽象层的好处是,高级代码的编写者完全不需要知道这个程序所运行的操作系统和硬件平台,任何有该语言编译器/解释器的机器,程序都可以跑(从而实现了跨平台)。应用层开发者可以不用知道这个由高级语言到机器码的转化具体是怎么实现的,毕竟编译器优化的编写和优化完全是一个团队的工作量,开发者关注问题的解决,编译器负责转化出高效的机器码,各干各的,这正是抽象的重点。

再往下一层,操作系统。OS向开发者抽象了硬件(CPU、内存、Disk、NIC等),并且以syscall的形式向用户提供服务。OS的设计是最能体现抽象的,虚拟内存和进程让程序以为自己独占着内存和CPU,同时隔离了不同进程以防恶意进程;文件系统让用户可以方便地读取存储数据,而不需要直接操作底层的硬盘;文件描述符抽象了底层的设备(pipe/file/device/socket/…)。

再往下一层,ISA(Instruction set architecture),俗称软件与硬件的接口。这个俗称是非常形象的。指令集架构,说得简单点就是机器码,也可以理解为一个协议。ISA标准制定者指定一套指令集(比如x86、PowerPC、SPARC),然后编译器开发者需要根据这个标准/协议来编写对应的编译器;CPU制造商需要根据这个标准/协议来制造出支持这套ISA的CPU(比如intel的CPU支持x86/x86_64)。也就是说,软件/硬件都依照这个ISA来设计,那么就可以对接了。

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

再往下一层,数字电路。这门课的目的是教学生如何利用基本的门电路(与非或门)来实现一些高级的功能(译码器、多路复用器、锁存器、时序电路……),然后给上层提供功能。上数字电路课是一个用砖搭房子的过程,由基本的门电路开始,慢慢构造出复杂的电路。数字电路不需要关心基本的门电路是如何实现的,因为这正是模拟电路向上层提供的功能。

再往下一层,模拟电路。这一层实现了与或非等基本门电路。比如非门、与非门、或非门都可以通过若干个p/n型MOS晶体管构成,而与门可以通过连接一个与非门和非门构成,或门可以通过连接一个或非门和非门构成。很多同学都觉得模电对于计算机的同学不必要学,而我认为相反,它是你构建整个计算机抽象层级的基石。

再往下一层,就不是计算机领域研究的事了。

当然,还有很多专业课我并没有提及,比如网络,它是OS提供的抽象之一,以文件的形式提供给用户使用;在网络协议栈实现的细节里,又分了好几层抽象,这就是我们熟知的OSI七层网络模型(有时候被抽象为五层:Application、Transport、Network、DataLink、Physical)。各位可以自己回忆一下大学里上过哪些专业课,以及它应该放在抽象的哪一层上。

脱离计算机领域,再往高一点看,会发现整个计算机领域好像就是在为别的领域提供功能、并隐藏了细节,如医疗、交通、餐饮、娱乐、安防等等领域都可以看到技术应用的例子。

计算机专业有python课程吗-作为计算机专业学生,最应该学习的课程前五位是什么?...相关推荐

  1. 计算机专硕_2021年北京科技大学计算机专硕考研初复试考研经验分享、择校备考分析指导...

    在众多的考研学生,我只是普普通通的一员,起初考研也是随着家里的要求和同学们都要考的氛围鼓动,才做出了这一决定.在一开始我也经历了许多迷茫,一天不知道该怎么学习,甚至有时候深深的怀疑自己,这样的努力付出 ...

  2. 全国计算机等级考试python教材.pdf_全国计算机等级考试python二级教程,视频资源下载...

    课程名称 全国计算机等级考试python二级教程,视频资源下载 课程目录 1.第01讲考试介绍和程序设计基本方法 2.第02讲基本语法元素 3.第03讲函数input和eval和print 4.第04 ...

  3. 云南计算机专升本数据结构_云南计算机专升本分数大全(公布分数线431分)

    允许上述69所试点高校在校内开展网本科分数络远程教学全日制工作的基础上,而不是能干什么,期间放弃的人数大约有20之多,易斯顿学院那么你们之间的相互录取分数影响还费用是很明显的,目标586分数.的考生的 ...

  4. 计算机信息管理是学什么课程设计,毕业论文计算机专业学生信息管理系统(数据库课程设计)...

    毕业论文计算机专业学生信息管理系统(数据库课程设计) (70页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.90 积分 兰州石化职业技术学院毕业设计( ...

  5. 「大学必读」计算机专业学生一定要学好哪些课程?

    作为一名学计算机的同学,你觉得最应该学好哪些课程呢? 就当年的我来说,感觉在大学的时候,各种课程学了很多,样样有所触及,但样样都不精. 所谓师傅领进门,修行靠个人,如果还想要掌握的更多更精的话,还需要 ...

  6. 初二上册计算机编程入门先学什么,8年级以上学生必读,这项AP课程带你零基础入门编程!...

    原标题:8年级以上学生必读,这项AP课程带你零基础入门编程! 导读 作为全北美通行的预科课程,AP考试的分数不仅能够换取大学学分,还能对申请有超级重要的加分作用.对于中国学生而言,AP计算机科学(以下 ...

  7. 【必读】计算机专业学生一定要学好哪些课程?

    作为一名学计算机的同学,你觉得最应该学好哪些课程呢? 就小编来说,感觉在大学的时候,各种课程学了很多,样样有所触及,但样样都不精. 所谓师傅领进门,修行靠个人,如果还想要掌握的更多更精的话,还需要自己 ...

  8. 生物c语言 课程总结,生物医学工程专业《C语言程序设计》课程的融合教学研究...

    就当前我国IT产业与医疗行业紧密结合过程中,医学教育中医学专业基础知识与计算机知识严重分离的现状,根据目前生物医学工程专业"C语言程序设计"课程开设情况,从教学.管理和实践等方面入 ...

  9. mysql找出课程相同的两个学生_day41 mysql 学习 练习题重要

    1.查询课程编号"001"比课程编号"002" 成绩高的所有学生的学号**** #把两个表同时放过来(并且都命名一个新的名字)一起查, #1先找出所有包含学科为 ...

最新文章

  1. binlog二进制文件解析
  2. 将ArXiv中的Reference导入EndNote
  3. centos mysql下载64位_CentOS7 64位安装mysql教程
  4. odciexttableopen 调用出错 error open log_如何在 Spring 异步调用中传递上下文
  5. Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验
  6. react中使用构建缓存_通过在React中构建Tic Tac Toe来学习ReasonML
  7. 神经网络与深度学习——TensorFlow2.0实战(笔记)(四)(Python面向对象的编程)
  8. 团队任务2:冲刺前的准备
  9. 【SAS NOTES】在一个data中生成多个数据集
  10. 文言的理解 —— 古时的称谓、别称、别名
  11. php下使用phpmailer发送邮件
  12. EF Ccore 主从配置 最简化
  13. 米家扫地机器人按键没反应_小米扫地机系统重置键在哪?
  14. matlab求方差、均方值和功率
  15. PCQQ - 发送自定义的XML卡片消息
  16. 程序猿段子_程序员的那些段子
  17. 群晖java安装失败_群晖NAS安装Jenkins
  18. 在Unity中实现简单的动画转场
  19. 人脸识别、二维码电子签到,让会议会展入场更加智能!
  20. MFC基本图形的绘制(一)设备环境类CDC、画笔和画刷

热门文章

  1. java如何使显示字符下标_Java如何在 Word 中设置上、下标
  2. js字符串怎么转python对象_js 对象转换为字符串
  3. python中figsize什么意思_matplotlib 设置图形大小时 figsize 与 dpi 的关系
  4. Android系统所有版本源码Kernel源码
  5. 机器学习 LR中的参数迭代公式推导——极大似然和梯度下降
  6. go语言笔记——切片底层本质是共享数组内存!!!绝对不要用指针指向 slice切片本身已经是一个引用类型就是指针...
  7. mongodb 压缩——3.0+支持zlib和snappy
  8. 奶粉运营,跑数据三个模板。
  9. Docker学习笔记之在开发环境中使用服务发现
  10. C++编程基础一 01-我的第一个项目