计算机科学与技术核心课程介绍与技术脉络¶
本文是对 CS 专业的课程的梳理,旨在帮助读者理解主要课程的作用以及学习建议。
- 核心专业课
- 计算机组成原理
- 操作系统
- 数据结构与算法
- 计算机网络
- 重要专业课
- 数据库
- 软件工程
- 离散数学
- 编译原理
- 计算机图形学
四年课程设置¶
大一主要是通识课,专业课比较少。
CS 专业的课程设置,大一先学一门编程语言入门(一般是 c/c++),然后是各种先修课,比如数电模电,汇编语言与接口技术,离散数学。
大二大三会开始学习核心专业课,计算机组成原理、操作系统、数据结构与算法、计算机网络这四门,同时也是考研 408 的考试科目。
大四没什么课,就准备考研,实习,毕设之类的毕业事项。
课程特点¶
核心这四门课程是计算机体系的基础,属于底层的理论,几十年也不会变。可以看看以前的老教材,你老师当年学的和你学的没什么区别。
其中数据结构属于规则单一,需要灵活计算的科目,学习技巧和数学类似。计算机组成原理,操作系统和计算机网络相对复杂,细节很多,算法也用得比较多,有点类似于物理化学。
这些课程偏重理论,不一定能直接提升你写代码的效率,但它们决定了你对技术的理解深度,影响着你长期发展的上限。
下面说到的这些重要课程则更加的实用。
离散数学就是计算机用的数学理论,对世界进行离散建模,和数据结构有相通的地方。
软件工程就是教你写出高质量的代码,增加软件开发速度,确保可维护和可扩展。
数据库,用处非常大的一门课,是计算机数据持久化的基础。
编译原理就是编程语言的原理,教你如何编写编译器,可以创造自己的编程语言,有助于理解计算机指令是如何不断进化的。
计算机图形学是 GUI 的基础,研究如何在屏幕上显示图像。可以用来研发 GUI 框架还有游戏引擎。
云计算,就是如何使用用服务器。计算机病毒,就是如何制作和防范病毒。
另外,一般课程设置中会学习多门语言,是直接产出代码的课程。笔者大一入门学的 C++,大二学的 Java 和汇编语言,大三又学了 C#。建议选择一门主语言深入学习,理解语法、运行机制、主流库和框架等。因为语言都是相通的,你精通一门,其它语言用不了几天就能入门。不同语言往往代表不同的编程范式与设计哲学,多了解可以拓宽思维。
上课时可能遇到的问题¶
首先,一些以前没接触过编程的同学,可能入门的时候会比较困难,尤其是语法比较复杂的语言,经常出小问题。学编程语言就和学外语一样,只要不断练习、调整思路、纠正错误,就能够逐渐掌握。编程语言的语法本身并不是一个技术门槛很高的内容,一般就算没有基础,每天高效学习三个月,也能和那些有信息学竞赛背景的同学比肩了。学好一门语言,再学下一门就会非常轻松。
另外,每个老师上课的水平参差不齐,假如你认真思考了,还是听不懂,那多半老师只是在读 PPT,他自己也不理解那个理论是什么意思。
笔者大二的时候上《软件工程》这门课,听老师在上面念什么“依赖倒置”,什么“实际依赖抽象”,想破脑袋也不明白什么叫抽象,什么叫依赖,怎么个倒置法。实在听不懂课,就自己学了。老师还很生气,觉得同学们不听他的课,全然没有自己讲的很烂的自觉。后来过了一年,笔者对 Java 生态和设计模式已经有了深入了解,才知道原来所谓的“依赖倒置”,就是先定义接口,具体类实现接口。调用接口,不直接调用具体类,方便修改和扩展。这么简单的东西,被老师念得像天书一样,大概他根本不懂这个吧。
简而言之,教学不清≠知识本身晦涩,即使是复杂的理论,也能有简单清晰的描述,也就是所谓的“高僧只说家常话”。遇到听不懂的课,不妨主动自学,反而效率更高。
另外,社会上总有卖课的,说什么学校教的东西都过时了,制造焦虑让你买课报班。其实各种技术都是相通的,新技术并不比老技术先进多少,而且那些所谓的过时技术,在当年也是先进技术,现在的先进技术,过几年也会变成老技术。学校教新技术固然好,但老技术也问题不大。既然学校教了,有这个学习环境,不妨认真学一学,就算这个框架或者软件可能不太流行了,底层的东西也是不会变的。