返回文章归档

毕业

现在已是毕业之时 回忆过去 思绪良多 写下一些内容吧

文章目录28 节

转眼之间,本科阶段已经结束了。

回头看这几年的学习经历,很多课程、项目、熬夜调试代码的瞬间,已经慢慢构成了自己对计算机这个领域最初的理解。从写第一行 printf(“Hello World”); 开始,到后来接触算法、系统、AI、工程化开发,再到毕业项目——很多东西不再只是「课程」,而是一个逐渐建立技术世界观的过程。

有些课学得很痛苦,赶 due 赶到崩溃,也会在某个深夜突然意识到:

软件系统是由无数细节堆积起来的。

这篇文章算是对本科阶段的一个简单总结,也记录一下这些年接触过的方向与内容。

写这些课程的时候其实很难完全客观。每门课背后都有一些很具体的画面:COMP1521 早八 Andrew 在 Lecture 总会说一些和课没关系的内容(很喜欢和我们吹水);COMP2521 一直编译 assignment,autotest 怎么都跑不过;COMP1531 和 COMP3900 组会里大家盯着同一个 bug 绷不住地笑;还有考前翻 notes 翻到怀疑人生的晚上。现在看来真的有点搞笑——它们不只是课程代码和成绩单上的几行字,更像是我一点点被计算机这门学科改变的过程。


编程与软件开发方向

这一部分是本科阶段最核心、接触时间最长的内容。

从最基础的编程入门,到软件工程、面向对象设计、代码架构、工程协作,其实一直在学同一件事:

  • 如何把想法真正变成软件
  • 如何让代码可维护
  • 如何和别人一起开发
  • 如何面对复杂系统而不失控

COMP1511 Programming Fundamentals

最开始接触编程的一门课。

主要学习了:

  • C 语言基础
  • 条件语句与循环
  • 函数
  • 指针
  • 数组
  • 链表
  • 基础数据结构
  • 测试与 Debug 思维

也是从这里开始第一次真正理解:

编程不仅仅是“写代码”,而是训练逻辑表达能力。

刚开始写 C 的时候很痛苦,一个分号、一个括号、一个数组越界都能让程序崩掉。后来慢慢习惯了,发现编程其实就是把问题拆成机器能懂的步骤——条件、循环、函数、数组、链表,都是基础但重要的东西。

那段时间还用 C 写了一些数据结构和算法的小练习,录成视频传到了 B 站:https://space.bilibili.com/252530235/upload/video


COMP1531 Software Engineering Fundamentals

第一次正式接触软件工程。

包括:

  • Git 协作
  • RESTful API
  • 团队开发
  • Agile / iterative development
  • Testing
  • CI / deployment 基础
  • 后端系统设计
  • 文档编写

这门课让人第一次意识到:

工程化开发和个人写小程序完全是两回事。

个人写代码的时候很多东西可以随便来,变量名乱一点、测试少一点也能跑。但团队开发不行——你的代码会被别人调用、修改,merge 的时候也可能出问题。Git、API 文档、测试、CI 这些东西,就是为了让一群人合作的时候不至于乱掉。

这门课主讲了前端 JavaScript 和 TypeScript,重点在测试和协作,初步养成了「前端是什么、后端是什么、它们如何配合」的意识。


COMP2041 Software Construction: Techniques and Tools

更偏向于工具链与工程实践。

包括:

  • Unix filters
  • Shell scripting
  • Python scripting
  • Linux 环境
  • Git
  • Docker / package managers 基础
  • 自动化处理
  • 正则表达式
  • 软件构建与部署思想

也是第一次开始真正习惯命令行开发环境。

COMP2041 教的是工具链:shell、管道、正则、Python 脚本、Linux、Git、Docker、package manager。都是很碎的东西,但组合起来能解决很多实际问题。这门课之后我开始习惯用命令行处理重复劳动,不用什么都手动点来点去。

内容很实用,但考试真的很抽象,要手写大量正则表达式。


COMP2511 Software Design and Architecture

面向对象设计与软件架构。

核心内容包括:

  • OOP 思想
  • Java
  • 设计模式
  • SOLID Principles
  • UML
  • Refactoring
  • 软件设计与架构
  • Testing

这门课最大的收获并不是 Java 本身,而是:

如何组织一个大型代码库。

COMP2511 教的是怎么组织代码。代码能跑是一回事,代码能维护是另一回事。OOP、SOLID、设计模式、refactoring——刚开始觉得这些很抽象,后来项目大了才发现,没有这些东西代码真的会乱到没人想碰。

重构是真的费时费力。这门课让我们从头设计一个火车站记录程序,然后直接上手重构一个两千行的小项目。

大学期间也试着用 TypeScript 做过一些前端项目,比如这个只有六十多分的作业:H16A_TeamWork。分数不高,代码也很乱,但踩着坑走一遍之后,对类型系统和工程协作的理解确实深了一些。


COMP6991 Solving Modern Programming Problems with Rust

非常有特色的一门课。

通过 Rust 学习:

  • Ownership
  • Borrow Checker
  • Memory Safety
  • 类型系统
  • 并发与并行
  • Testing / documentation
  • Cargo 工具链
  • 函数式编程风格

虽然过程很折磨,但也第一次真正开始理解:

底层内存管理与高级语言抽象之间的关系。

Rust 很难,borrow checker 折磨人。但它逼你认真想清楚:数据属于谁、谁在用、什么时候释放。以前写 C 的时候这些问题也存在,只是语言不帮你检查。写 Rust 会慢,但慢下来之后确实写出来的东西更稳。


数据结构与算法方向

这是整个 CS 基础中最“硬核”的部分。

很多时候会觉得抽象、困难,但后来会慢慢发现:

算法训练其实是在训练分析问题的能力。


COMP2521 Data Structures and Algorithms

经典核心课程。刚学这门课的时候 Lecturer 和我们说:「之前的课,你只是一个初级的程序员,但是现在你需要像一个计算机科学家一样思考。」

学习了:

  • Recursion
  • Algorithm analysis
  • Abstract Data Types
  • Sorting
  • Tree
  • Balanced Search Tree
  • Graph
  • BFS / DFS / Dijkstra 及衍生算法
  • Hash
  • Heap
  • Queue
  • Priority Queue
  • Trie

也是第一次真正理解数据结构和简单的算法。

COMP2521 是一道分界线。之前的课主要问「能不能写出来」,这门课开始问「为什么这样写」。数组、链表、树、哈希表、图——选哪个不是随便决定的,要看数据怎么存、怎么查、时间和空间怎么换。学了之后,程序为什么会慢不再是模糊的感觉,可以用复杂度来解释。

这门课真的很难,理论理解和代码编写都不轻松。


COMP3121 Algorithm Design and Analysis

相比于数据结构,这门课更加偏向:

  • 算法证明 / 数学分析
  • Correctness
  • Time Complexity
  • DP
  • Greedy
  • Divide and Conquer
  • Graph algorithms
  • Strings
  • NP 问题
  • 流问题 Max Flow Min Cut
  • LaTeX 技术写作

很多题目都非常抽象,但训练了严谨思维。

COMP3121 和写代码不太一样。写代码错了至少能 debug,算法设计错了你可能根本不知道。DP、greedy、divide and conquer、graph algorithms、NP、flow——每一个都要写证明,而写证明的时候脑子经常一片空白。但熬过来之后,确实学会了更严谨地思考问题。


数学课程

MATH1131 Mathematics 1A / MATH1231 Mathematics 1B

主要包括:

  • 微积分
  • 多变量微积分
  • 线性代数
  • 向量
  • 矩阵
  • 线性方程组
  • Vector spaces
  • Linear transformations
  • Eigenvalues / Eigenvectors
  • ODE
  • Series
  • Probability distributions

虽然当时经常会想:

“这玩意以后真的有用吗?”

但后来在 AI、图形学、优化问题里都会重新遇到。

数学课在当时显得很遥远——矩阵、积分、级数、特征值、ODE,做的时候不觉得有什么用。但后来学 AI、computer vision、optimisation 的时候,线性代数和微积分反复出现。当时觉得没用,其实是还没学到需要它们的地方。


MATH1081 Discrete Mathematics

离散数学几乎是整个 CS 理论的基础。

包括:

  • Logic
  • Set Theory
  • Number Theory
  • Proof
  • Recurrence
  • Graph Theory
  • Combinatorics

也让自己第一次正式接触数学证明。

MATH1081 和计算机很近。Logic、set、proof、graph、combinatorics——这些东西表面上不写代码,但条件判断是逻辑,状态转移是图,递归和 recurrence 是同一个东西,算法正确性要靠证明。这门课让我开始习惯「证明」这件事,虽然烦,但有用。


人工智能与计算机视觉方向

这是后来逐渐开始感兴趣的方向。

相比传统开发,这部分内容更加偏向:

  • “让机器理解”
  • “让系统具有推理能力”

COMP3411 Artificial Intelligence

AI 基础课程。

涉及:

  • Search
  • Autonomous Agents
  • Knowledge Representation
  • Problem Solving
  • Machine Learning 基础
  • Neural Networks
  • Reinforcement Learning
  • Optimisation
  • Reasoning under uncertainty
  • Logic
  • Planning
  • Vision / Language Processing 基础

第一次真正理解 AI 并不只是“调用模型”。

COMP3411 讲的是 AI 的底层:搜索、知识表示、推理、机器学习基础。不是直接学怎么调用模型,而是学模型背后在做什么。学完之后意识到,定义问题、表示数据、设计目标、评估结果——这些比模型本身更重要。


COMP9517 Computer Vision

计算机视觉相关课程。

包括:

  • Image Processing
  • Feature Extraction
  • Object Detection
  • Scientific / statistical / engineering approaches to vision
  • Computer vision algorithms
  • CNN 基础
  • OpenCV
  • Group project / larger vision application

也是第一次真正处理图像数据。

COMP9517 处理的是图像,和文本、数字很不一样。人对图像太熟悉了,很容易忘记机器看到的只是像素和噪声。边缘检测、特征提取、目标识别——光照变一点、角度偏一点,结果就完全不一样。OpenCV 和 CNN 上手快,但真想做好还是要理解图像本身的结构。


系统与底层方向

这一部分课程让人意识到:

高级语言背后,其实隐藏着大量底层机制。


COMP1521 Computer Systems Fundamentals

主要包括:

  • Assembly
  • Memory
  • CPU
  • Binary Representation
  • C 与 Assembly 的关系
  • Operating System 基础
  • Concurrency 基础

第一次真正开始理解:

  • 程序到底是怎么运行的
  • 指针为什么危险
  • 内存为什么会出问题

COMP1521 学的是计算机底层:汇编、内存、CPU、二进制、系统调用。以前写 C 崩了就是崩了,学完这门课能大概知道崩在哪里。指针也不那么玄了——它就是直接操作内存地址,危险但透明。


数据库与信息系统方向

除了纯技术之外,也接触了一些偏商业与信息系统管理的内容。


INFS1603 Introduction to Business Databases

学习了:

  • SQL
  • Relational Database
  • Conceptual / relational database modelling
  • Schema Design
  • Normalisation
  • Database implementation
  • 数据库相关的 professional / ethical issues

也是第一次真正接触数据库设计。

INFS1603 教的是数据库设计。SQL、关系模型、schema、normalisation——把现实业务里的东西抽象成表、字段和关系。模型设计得好,后面查询和维护都顺;模型一开始就别扭,业务逻辑会跟着乱。


INFS2602 Managing Information Systems

更偏向企业与组织中的信息系统管理。

包括:

  • 企业系统
  • IT 管理
  • 信息流
  • 系统规划
  • 组织中的信息系统
  • 信息系统带来的业务、管理和伦理问题

这类课不关心代码怎么写,而是把系统放回组织里看:谁在用、谁付钱、谁维护、改变了什么流程。内容没有代码课那么「硬」,但软件落地之后确实要面对这些问题。技术方案再好,和实际业务流程脱节也没用。


INFS2603 Business Analysis and Agile Product Management

偏向需求分析、业务建模与产品管理。

包括:

  • Requirement Analysis
  • Stakeholder Communication
  • Process Modeling
  • Agile / Scrum
  • Product roadmap
  • Prototyping
  • Customer needs
  • Group work

也让自己意识到:

软件开发很多时候并不只是技术问题。

INFS2603 教的是需求分析和产品管理。之前写代码习惯把需求当成一句描述,但这门课让你追问:谁提的、解决什么、不同人的期待是否冲突。Agile、Scrum、roadmap、prototype——听起来管理,本质是在处理不确定性。很多项目失败不是因为写不出代码,而是没搞清楚到底要做什么。


人机交互与职业素养方向


COMP3511 Human Computer Interaction

学习了:

  • UI/UX
  • Visual Design Principles
  • User-centered Design
  • 用户研究
  • Requirement Analysis
  • Prototyping
  • 可用性设计
  • Usability Evaluation
  • Accessibility
  • 用户行为分析

第一次开始从“用户”的角度思考软件。

COMP3511 让我意识到不能只从开发者视角看软件。你知道按钮在哪、知道流程为什么这样设计,但用户不知道。UI/UX、accessibility、usability evaluation 就是在解决这个问题——让用户不需要解释就能用。


COMP4920 Professional Issues and Ethics in Information Technology

偏向行业与职业伦理相关内容。

包括:

  • 软件工程伦理
  • Normative ethics
  • Research ethics
  • 职业责任
  • Privacy
  • Trust / accountability
  • AI ethics
  • Bias / fairness
  • Transparency / explainability
  • 行业案例分析

COMP4920 不教技术,讨论的是伦理:privacy、bias、fairness、accountability、AI ethics。技术不是中立的——你怎么收集数据、怎么排序内容、怎么做自动化决策,都会影响真实的人。写代码的人不能永远说「我只是实现需求」。


毕业设计 / 实战项目

COMP3900 Computer Science Project

本科阶段最接近真实开发的一门课。

需要:

  • 团队协作
  • Requirement analysis
  • 项目规划
  • 前后端开发
  • 沟通
  • 演示
  • 文档
  • 迭代开发
  • Progress checkpoints
  • Final demo / report
  • Peer assessment

很多时候比起“技术”本身,更考验:

  • 如何推进项目
  • 如何协调团队
  • 如何在有限时间里完成目标

COMP3900 是本科最后一次团队项目。需求会变、时间会不够、队友节奏不同、demo 前总会出问题。以前学的工程协作、系统设计、文档、展示全用上了。最后做的是一个网页应用,功能不算多,但前后端都跑通了。peer assessment 的时候队友给我打了还不错的分,挺开心的。

最后做出来的东西不一定完美,但确实是大家一起一点点推出来的。


一些感想

本科阶段其实很难说自己真正精通了什么。

更多的是:接触了很多方向,建立了一些基础,知道了计算机世界大概长什么样。

后来慢慢会发现,CS 真正困难的地方不是某一门语言,也不是某一个框架,而是抽象能力、学习能力、以及面对复杂问题时的耐心。

很多课程结束后,知识可能会忘记。但那些训练思维的过程,最终还是会留下来。

毕业之后打算先休息一段时间,然后把博客继续做下去。这个网站从大三开始陆陆续续改到现在,已经不只是个作业或者项目了——它有点像我在互联网上的一个小房间,想放什么就放什么。

之后可能会找一份前端或者全栈的工作,也可能先自己做一些小东西。没想好,但不急。


结束

至此,本科阶段正式结束。

有遗憾,也有收获。很多事情当时觉得痛苦,但现在回头看,似乎也都成了经历的一部分。

感谢这几年里一起做过 project 的队友、讲过课的老师、还有考试前互相借 notes 的朋友。

未来会继续学习,也会继续写代码。

希望很多年以后再回来看这篇文章的时候,仍然会记得自己最开始为什么会喜欢计算机。

继续阅读

随笔 1Notes小记Notes

Comments

留下一句想说的话,评论会由 Artalk 托管。