2021.11:一口气更完吧~
2021.01:更新了部分出来给大家当新年礼物
2020.04:首发本人南大计科,方向人工智能+计算机视觉,简单谈谈我眼中大学本科计算机专业会学些什么。希望能让其它专业或者正在选择专业的朋友们有个大概的了解。
本人分享的内容会受到学校、方向和个人理解的影响从上图中我们能看到五个大块,分别是
① 数学
数学是计算机的理论基础。数学不仅对于将来准备科研的同学及其重要,对于准备就业的同学来说,数学没学好,一些工作中遇到的概念就会很难理解。
离散数学(研究离散量,如整数,的结构、相互关系)在计算机科学中十分重要。由于计算机平台本身是离散的(基于 01 二进制),离散数学在传统算法设计、分析和平台架构设计等方面都起到了重要作用。
分析(以广义的微积分等研究工具,对”比较连续“的函数等进行研究)和代数(先定义数学结构,再研究该数学结构)中的内容也是作为理科生必须知道的,无时无刻不在用到的知识。以上分法只是为了方便梳理课程,事实上相当不严谨。离散是数学中的一类对象,分析和代数是数学中的种方法论,相互之间都有很多重合② 算法
算法本质上也属于数学。高中里常见的数学题有计算和证明。为了计算,课堂上会学习到很多问题的解法。算法就是对问题提出解题方案。
③ 系统
想要运行程序/软件,需要一个平台/系统(计算机、服务器、手机、嵌入式系统
等)。每个系统从低向上构建,复杂而精美。
在系统的设计中,为了防止过于复杂,大牛们引入了抽象层,把功能较为独立的部分单独抽象出来设计,下层支持上层的实现,上层利用下层的接口(按规则即可使用的功能)。收益于此,我们在学习时也可以非常有层次地层层递进(图中从微电子到数据库、计算机网络等)All problems in computer science can be solved by another level of indirection.
计算机科学中的每个问题都可以用一间接/抽象层解决 ——Jay Black④ 语言
语言也算作系统的一部分(语言甚至可以看作是一个抽象层,下层由编译器支持,上层支持算法的实现)。将语言单独列出主要因为语言是因为,作为程序员,语言是我们最常用的工具。
此外,我把如何维护我们写出来的程序也放在这里。这是很工科的一个部分,就像造房子时如何维护整个工程。这样分类确实有问题,但语言和软件工程作为我们书写程序时的工具,可以一起学习。
⑤ 应用
在算法和系统的支持下,我们可以把计算机技术应用到各个邻域。计算机的应用自然有许多,这里只大概介绍了几个计算机的方向。
① 离散
集合论(大一)
- 内容:将高中学过的集合公理化,研究集合这个数学对象。由于我们是计算机专业,学习的集合论内容可谓皮毛,与数学系的没有可比性。
- 举例:罗素悖论- 应用:几乎其它数学的基础,微积分、抽象代数等等都要用到集合的概念。数理逻辑(大二)
- 本校:特色的专业核心课
- 内容:在简单的逻辑运算(与、或、非等)和集合论的基础上,用公理化的方法定义一阶逻辑、高阶逻辑和时序逻辑(这里逻辑可看作由字母表、公式组成的一个系统。每个逻辑/系统可以有自己的语言、语义和语法,当然同样是用数学方法定义的),并研究逻辑这个数学对象
- 举例:选择公理- 应用:在系统方向(程序形式化验证)、程序语言设计、人工智能(自动推理)等领域有广泛应用
- 研究前沿:证明论(研究语法),模型论(研究语义),公理集合论(研究与数学基础有关的一阶理论的模型),递归论(研究可计算性),非经典逻辑(对数理逻辑的扩展与修正),非形式逻辑(对形式化方法反叛的新道路)抽象代数(大二)
- 本校:又称近世代数。离散数学中有群论基础,数学系开设。
- 内容:主要是研究群、环、域等数学对象,高屋建瓴的提炼了数学中的诸多共性,学起来可谓赏心悦目。
- 举例:用群理解魔方,5 次以上方程无解- 应用:在密码学、组合数学、程序设计理论、计算机通信和分布式系统等方向上有广泛应用。课程上,线性代数中线性空间定义就要用域的概念。图论(大二)
- 内容:定义了图(由点和边构成,地图上的城市与道路就可以抽象成图)这个数学结构,研究图的性质和图上的算法。
- 应用:算法设计(比如高德地图的导航,就要用到图论的算法),在计算机课程和应用中无处不在。组合数学(选修)
- 本校:本校尹一通老师的组合数学课讲得很棒
- 内容:组合数学是理论计算机研究时强有力的工作。内容上主要分为计数和证明。计数在高中学习的排列组合基础上,进一步学习计数的方法;证明则是讲解如何利用概率证明存在性。
- 应用:作为研究工具,在科研时都有可能用到值得一提的是,南京大学计算机系拔尖班和匡院计算机方向特殊课程《问题求解》(Problem Solving) 这门课持续四个学期,将程序设计、算法分析与设计、数据结构、离散数学等打通,一起教学,使得效率提高,可以讲更多的内容。② 代数
(大二)
- 内容:定义了线性空间这个数学结构,研究线性空间中的对象、变换并用矩阵表示。
- 举例:线性空间- 应用:作为最基本的数学工具,几乎无孔不入。在编码、机器学习等方向更是重中之重。- 内容:在线性代数的基础上,进一步研究矩阵的性质,如果高效的进行矩阵的运算和分解。
- 应用:用到矩阵的地方都有用。③ 分析
微积分(大一)
- 内容:在高中导数的基础上,严格定义导数等概念,并学习积分(可看做导数的逆操作,Riemann 积分)和级数等内容。
- 应用:计算机中与微积分打交道并不多。但随着深度学习的兴起,微积分由变得常用了起来。- 内容:在微积分的基础上,为了弥补 Riemannn 积分的缺点,引入了测度和 Lebesgue 积分。
- 应用:现代概率论的基础(暂时感觉没什么用)概率论(大三)
- 本校:计算机系的概率论一般与数理统计合开
- 内容:定义概率,学习概率的计算和不加证明的大数定理、中心极限定理
- 举例:大数定理,中心极限定理- 应用:可谓现如今机器学习的基石数理统计(大三)
- 内容:概率论的一种应用,包括统计决断、估计、检验- 本校:南大计科好像没开这门课,可能在电子系有开。但是在很多课程中都有应用。
- 内容:学习使用傅里叶变换等工具处理信号
- 举例:通俗理解傅里叶变换- 应用:计算机通信、数字图像处理等信息论
- 内容:在概率的基础上,定义熵,用于衡量不确定度/信息量
- 举例:熵- 应用:计算机通信、密码学、机器学习等计算方法
- 内容:又名数值分析,也可以算是算法的内容。用计算机进行数学问题的计算,而不会出现过大的误差④ 物理
(大一、大二)
- 本校:计算机系的学生要上物理实验一学期,理论课一学期。拔尖班则理论课两学期,包括力、热、电、现代物理四个部分。与物理系相比,我们只是简单的科普。
- 内容
力:在高中力学基础上,进一步学习各种力的分析,以及相对论的基础理论
热:讲解三大热力学基本定律(包括第零)
电:在高中电磁知识的基础,用麦克斯韦方程组统一电与磁
现代:从黑体辐射等经典实验开始,讲解量子力学基础,了解基本粒子。
- 应用:很多人认为计算机系学物理没必要,我现在觉得不然。物理作为从实践走向理论的经典学科,一定程度上与现在的机器学习相似。此外,还可以提供跨学科研究的基础。
力:游戏引擎 热:熵、退火过程、玻尔兹曼分布等概念在计算机不同领域有很多推广和启发
电:电路基础,计算机通信上利用电磁传播信号,计算机视觉中对光的分析等
现代:量子计算基础电路分析(大一)
- 本校:电子系单独开课,计算机系与微电子合开
- 内容:在高中电路分析的基础上,进一步学习电路分析工具和技巧算法设计与分析(大一)
- 内容:如何设计算法解决问题,如何分析算法的性能(时间复杂度,空间复杂度);如何评估问题的难度(P, NP 等复杂度概念)
- 举例:如何学习算法设计与分析数据结构(大一)
- 内容:如何高效的将数据存放在计算机中(占用更小的空间,更快的存储)可以把数据结构看做是一个抽象层,现实中计算机文件系统/数据库提供实现的支持,向算法提供可调用的接口。我们将学习和分析常用数据结构(红黑树、哈希表等)高级算法(选修)
- 本校:尹一通老师的高级算法,原名随机算法- 内容:对比较难的问题,或是现有计算比较慢的问题,可以牺牲一定的精度获得近似解,牺牲一定的确定性利用随机构造算法。高级算法这门课教我们如何设计好的随机近似算法解决问题。人工智能(大四)
- 内容:计算机的人工智能,其实就是针对人才能处理的较难问题,设计高效的算法达到人的处理结果。其具体实现的方法多种多用。该课概览式地学习了人工智能的算法,包括搜索、推理、概率图模型和机器学习相关的算法。机器学习(选修)
- 内容:作为实现人工智能的方法之一,与利用规则逻辑的符号主义不同,机器学习用数据或以往的经验指导计算机解决问题。其中,具体的机器学习问题和方法也有很多,这门课概览式的学习了一些基本概念和常用的模型(如 SVM,决策树,神经网络等)深度学习
- 内容:作为机器学习目前最火热的方法,深度学习(往往是深度神经网络)在各个领域得到了应用。网络结构、优化算法、损失函数等是入门者需要学习的基本对象。(选修)
- 内容:有一说一,这节课我现在回想起来感觉都还给老师了,可能从中更多的是巩固了一些数学知识,了解了一些前沿方向。这门课不会关注物理层面的量子特性(薛定谔方程等),而是给定了一些量子的物理特性作为公理,在此基础上设计算法。
首先会复习线性代数,傅里叶变换和群论的基本知识,然后给出量子的性质和定理,接着会构建一些基本的量子算子和门。在这些基础上,会简单介绍一些经典的量子算法,量子密码学,量子纠错码和量子复杂度理论。其中精彩的一个是如何用量子计算机线性时间分解大素数。微电子(大一)
- 搭建整个计算机系统的基础。这门课包含两个部分,一方面是基础的电路分析技术(比较浅),另一方面是简单了解基础的电子部件,宏观上了解芯片如何从沙子一步步制作出来,并简单了解二极管,晶体管等的原理、特性和作用。(大一)
- 本校:本校数字逻辑电路分为了理论+实验两个课程,放在两个学期进行。理论课程也有实验,就是插面包板。实验则是在 FPGA 上进行的,用 Verilog 编写一些简单的程序,综合出一些电路。实验课最后的大实验完成了一个支持部分 MIPS 指令集的带终端的 CPU,可以说很有成就感。
- 内容:首先是一些基本的数制数码理论和逻辑电路理论,接着是介绍组合电路的设计和实例,最后是时序电路的基本原件和设计。(大一)
- 本校:本校的 ICS (Introduction to Computer Science,计算机基础)可谓是一个经典课程了,用的是本校袁春风老师教材《计算机基础》,可以说是从理论知识和代码功力两个方法对新生进行了”特训“。为了增加同学的代码能力,PA (Programming Assignment) 作业要求大家在提供的简易框架代码上实现支持 x86 指令的虚拟机,最终可以将仙剑奇侠传跑在其中,可以说是很奇妙了。
- 内容:计算机中数的表示,汇编语言,编译过程,总线、内存,控制流,内存管理,上下文管理,中断等知识。(大二)
- 内容:操作系统也是一个软件。围绕并发、持久化和虚拟化 (Concurrency, Persistence, Virtualization) 展开,讲解了并发的知识、并发编程,存储设备、文件系统和日志,任务调度、空间管理、进程空间等知识。同时还完成了一个玩具级别的操作系统。(大三)
- 内容:编译器可以让我们把高级语言程序翻译为机器语言让计算机执行。在计算机基础中我们已经了解了 C 代码变成可执行文件的过程。本科中将进一步学习编译器知识,同时完成一个 C-- 编译器(部分支持 C 语言)。认识编译器的处理流程,前端(词法分析,语法分析,语义分析)到后端(中间代码生成,机器无关代码优化,代码生成,机器相关代码优化)以及各阶段的产物。到这里,我们已经体验过书写自己的(玩具级别的)CPU,虚拟机,操作系统和编译器了。理论上,我们都可以编写一台给自己用的计算机了,我觉得这是很有成就感的事情。当然,实际上我们玩具级别的程序根本没法放到一起用,因为玩具级别的,没有优化,性能可以说是相当差了 Orz
数据库(大三)
- 内容:数据库的知识,包括理论层面的数据模型、关系的定义和演算,实际中数据集的安全性、完整性等。实验是学习了 SQL 语言。计算机网络(大三)
- 内容:层次性的介绍计算机网络结构,根据七层协议层次,从低向上分别为:物理层 - 数据链路层 - 网络层 - 运输层 - 对话层 - 表示层 - 应用层。每层涉及一点的基础上,主要集中在数据链路层的以太网 IEEE 802.3,网络层的 IP 协议和传输层的 TCP 协议(TCP-IP)。(大二选修)
- 内容:与计算机网络互为补充,主要集中在数据链路层及其以下的内容,包括物理层下物理上实际存在的媒介。主要讲解了数据传输理论、编码技术、差错校验和纠错,以及各种媒介的特性。(大三)
- 本校:感觉本校的计算机图形学内容比较过时,下面内容主要是本校课上的内容,主要集中在二维图形绘制的算法。像三维渲染,光线追踪(ray tracing)等内容都没涉及到。建议上 B 站大学补课哈哈哈
- 内容:如何绘制图形,包括生成直线、曲线的算法,几何变换、剪裁的算法。最终实验完成了一个类似 Windows 画图的小程序。由于笔者在拔尖计划,没有修专门的语言课。基本上基础的 C 语言教学时在问题求解这门课上完成的,在 ICS 的 PA 中提高的。此外,问题求解课上有一节专门谈论了函数式编程、数据流编程等不同编程语言的介绍和区别。
汇编(大一暑假)
- 计算机基础的前导课,学习汇编语言和基本的计算机内部表示。(大一)
- 似乎就是学 C 语言。笔者没上过。面向对象程序设计- 内容:面向对象设计(OOD)的基本内容,包括继承、接口等等。同时也会讲一些面向对象编程时可以用到的设计模式。
软件工程(选修)
- 内容:编写程序中、前、后应该注意的保证程序高质量的内容。理论上有软件过程的理论模型,编写程序前如何分析软件需求,如何进行软件设计;写代码时遵守设计模式;写完后要有软件测试、文档和验证。最后如何维护软件等。特定语言的学习
- 本校:开有 Java, Scala 等语言的课程,但语言只是工具,一般还是在语言基础上学习新的内容。感兴趣的可以学习。最后,想要了解更多学习内容的话,可以直接看教学计划。
都看到这里了,还不双击支持一下吗 (◡ ‿ ◡)
相关标签: