---
url: https://ain.hmgf.hxcn.space/resource/academic-development/course-selection.md
---
# 课程选择建议

选课是个技术活。选对了课，学起来轻松，还能为以后打基础；选错了课，浪费时间不说，还可能影响 GPA。这篇文章帮你理清思路，把课选好。

## 必修课：必须学好

必修课没得选，但可以想办法学好。这些课是计算机专业的根基，学不好后面会越来越吃力。

### 数学类

**高等数学/微积分**

这是大学数学的基础，后面学机器学习、图形学、信号处理都得用。

* 重点：极限、导数、积分、级数
* 难点：多元函数、重积分
* 建议：课后题多做几遍，理解概念比背公式重要

**线性代数**

机器学习和图形学的数学基础，矩阵运算、特征值分解这些概念会反复出现。

* 重点：矩阵运算、线性方程组、特征值与特征向量
* 难点：抽象概念多，不容易理解
* 建议：配合 3Blue1Brown 的视频一起学，直观理解

**概率论与数理统计**

数据分析、机器学习的数学基础。

* 重点：概率分布、期望方差、假设检验、回归分析
* 难点：条件概率、贝叶斯公式
* 建议：多做题，理解概念的实际含义

**离散数学**

计算机的数学基础，集合论、图论、逻辑这些概念在算法和数据结构中经常用到。

* 重点：集合、关系、图论、逻辑
* 难点：证明题
* 建议：理解证明思路，不要死记硬背

### 专业基础课

**数据结构与算法**

计算机专业最核心的课，没有之一。不管是找工作还是考研，这门课都是重中之重。

* 重点：链表、栈、队列、树、图、排序、查找
* 难点：递归、动态规划、图算法
* 建议：光看懂不够，得手写代码实现。LeetCode 从简单题开始刷

**计算机组成原理**

了解计算机是怎么工作的，从晶体管到 CPU。

* 重点：数据表示、指令系统、存储系统、总线
* 难点：流水线、Cache、虚拟内存
* 建议：配合实验一起学，理解得更透彻

**操作系统**

管理计算机资源的核心软件，进程、线程、内存管理这些概念是面试必问的。

* 重点：进程管理、内存管理、文件系统、I/O
* 难点：进程同步、死锁、虚拟内存
* 建议：看看 Linux 内核的实现，动手写个简单的操作系统

**计算机网络**

互联网的基础，TCP/IP 协议栈是重点。

* 重点：TCP/UDP、IP、HTTP、DNS、路由
* 难点：TCP 的三次握手和四次挥手、拥塞控制
* 建议：用 Wireshark 抓包看看实际的网络通信

**数据库**

几乎所有软件系统都离不开数据库。

* 重点：SQL 语法、索引、事务、锁
* 难点：查询优化、并发控制
* 建议：自己搭个数据库，做点实际的项目

### 编程语言课

**C/C++**

底层开发、系统编程的首选语言。指针和内存管理是难点，但也是必学的。

* 重点：指针、内存管理、面向对象
* 建议：多写代码，理解内存模型

**Java**

企业级开发的主流语言，岗位多。

* 重点：面向对象、集合框架、多线程、JVM
* 建议：做个小项目，比如图书管理系统

**Python**

人工智能、数据分析的首选语言，语法简单，库多。

* 重点：基本语法、常用库（NumPy、Pandas、PyTorch）
* 建议：用来做数据分析或者机器学习的项目

## 选修课：根据方向选

选修课是拉开差距的地方。选对了选修课，能为以后的发展打下很好的基础。

### 算法/AI 方向

如果想做算法工程师、数据科学家，这些课很有用：

* **机器学习**：线性回归、决策树、SVM、聚类，这些经典算法得理解原理
* **深度学习**：神经网络、CNN、RNN、Transformer，现在 AI 的基础
* **计算机视觉**：图像分类、目标检测、图像分割
* **自然语言处理**：文本处理、语言模型、机器翻译
* **推荐系统**：协同过滤、深度推荐模型

### 系统方向

如果想做后端开发、系统开发，这些课很有用：

* **编译原理**：理解编译器是怎么工作的，对理解语言设计很有帮助
* **分布式系统**：分布式存储、分布式计算、一致性协议
* **并行计算**：多线程、GPU 编程、MapReduce
* **嵌入式系统**：单片机、实时操作系统、硬件接口

### 安全方向

如果对安全感兴趣：

* **网络安全**：渗透测试、漏洞分析、安全防护
* **密码学**：加密算法、数字签名、密钥管理
* **逆向工程**：反编译、调试分析、恶意代码分析

### Web 方向

如果想做前端或后端开发：

* **Web 开发**：HTML/CSS/JavaScript、前后端分离
* **前端框架**：React、Vue、Angular
* **后端架构**：Spring Boot、微服务、消息队列
* **云计算**：Docker、Kubernetes、云服务

### 其他值得选的课

* **软件工程**：团队协作、项目管理、代码规范
* **人工智能导论**：了解 AI 的基本概念和方法
* **大数据技术**：Hadoop、Spark、数据处理

## 选课策略

### 怎么判断一门课值不值得选

**看老师：**

好老师能让枯燥的课变得有趣，也能让你学到更多东西。问问学长学姐，哪些老师讲得好。

**看内容：**

这门课教的东西和你的方向相关吗？如果相关，就值得选；如果不相关，可以考虑其他课。

**看评价：**

看看评教系统上的分数，问问上过这门课的同学。

**看实用性：**

这门课的知识在工作或科研中用得到吗？如果用得到，就值得学。

### 选课渠道

* **学长学姐**：最有价值的信息来源，他们亲身经历过
* **评教系统**：看看其他同学对老师和课程的评价
* **课程大纲**：了解这门课具体教什么
* **网上评价**：知乎、V2EX 上经常有人讨论课程

### 选课注意事项

* **先修课程**：有些课有先修要求，得先学完基础课才能选
* **时间冲突**：别选了两门时间冲突的课
* **难度平衡**：一学期别选太多难课，留点喘息的空间
* **学分要求**：保证毕业所需的学分

## 课程学习方法

### 怎么学好一门课

**上课认真听：**

听起来像废话，但真的很重要。上课认真听 1 小时，比课后自学 3 小时效率高。老师会划重点、讲思路，这些都是课本上没有的。

**做作业：**

作业是巩固知识的最好方式。不要抄作业，自己做。抄作业看着省事，考试的时候就傻眼了。

**做实验：**

很多课都有实验环节，认真做。实验能帮你理解理论知识，也能锻炼动手能力。

**看参考书：**

课本往往讲得不够深入，找几本经典教材看看。比如：

* 数据结构：《算法导论》
* 操作系统：《操作系统导论》（OSTEP）
* 计算机网络：《计算机网络：自顶向下方法》
* 数据库：《数据库系统概念》

**找人讨论：**

和同学讨论能帮你发现自己的盲点。有些概念自己以为懂了，一讨论才发现其实没搞明白。

### 怎么应对考试

**平时：**

* 上课记笔记，重点内容标出来
* 作业认真做，不懂的及时问
* 实验报告好好写，别应付

**考前：**

* 复习 PPT 和笔记，重点内容多看几遍
* 做往年真题，了解题型和难度
* 和同学讨论，互相答疑
* 老师划的重点一定要看

**考试中：**

* 先做会的题，不会的先跳过
* 时间分配合理，别在一道题上卡太久
* 不会的题写相关公式，能拿几分是几分
* 最后检查一遍，看看有没有漏做的题

### 哪些课可以"水"一下

不是所有课都值得投入同样的精力。有些课可以适当减少投入：

* 和自己方向完全无关的选修课
* 老师讲得很烂、学不到东西的课
* 纯理论、不实用的课

**但注意：** 水课不等于不学，至少得保证不挂科。挂科的代价很大，影响保研、找工作、甚至毕业。

## 一些实用建议

### 别只盯着绩点

绩点重要，但不是唯一重要的事。有些课虽然难拿高分，但学到的东西很有价值。有些课虽然容易拿高分，但学不到什么真本事。

平衡一下：必修课尽量拿高分，选修课可以适当选择对自己发展更有帮助的课。

### 动手实践很重要

计算机是实践性很强的专业。光学理论不够，得多写代码、多做项目。

建议：

* 每门课至少做一个小项目
* 把课程项目放在 GitHub 上
* 参加编程竞赛或黑客马拉松

### 善用网络资源

课本讲得不清楚的地方，网上有大量优质资源：

* **B站**：很多老师的讲课视频
* **Coursera/edX**：国外名校的公开课
* **GitHub**：开源项目和代码示例
* **Stack Overflow**：编程问题的解答

## 相关链接

* [大学四年规划](./college-planning.md)
* [保研准备](./graduate-recommendation.md)
* [考研准备](./graduate-exam.md)
