大二这一年:课程、项目与自我复盘

约 5 分钟

大二学年的完整复盘:哪些课程真的有用、哪些后来靠项目才补上,两个项目带来的不同收获,数学建模的思维改变,以及做得不好和大三的计划。

大二结束了。这一年的课程表里有几门硬课,课外做了两个项目、参加了一次数学建模竞赛,也考了两张证。趁记忆还清楚,把这一年的得失写下来。

课程侧:哪些真的有用

我把这一年的课分成三类。

第一类是当时就听懂了、后来一直在用的。 面向对象程序设计算一门。学类、继承、封装时觉得抽象,直到写聊天应用,我把“会话”和“消息”设计成两个类,把 API 请求层的重试逻辑封在方法里,才明白封装的意义——调用方不需要知道里面重试了几次,只需要知道成功还是失败。数据库原理也很实在,讲范式、索引、事务,我在图书管理系统里一一用上了,第一次意识到表结构错了,后面写多少代码都是在补窟窿。

第二类是打基础但短期看不出用的。 数据结构与算法、计算机网络、操作系统。手写链表、栈、树的时候我没感觉到它们和项目的关系,直到看 EXPLAIN 输出、理解 B+ 树为什么适合范围查询,才发现“树”是真的活的知识点。计算机网络也是,学 TCP 握手时觉得纯理论,做流式聊天应用处理黏包时,才理解“字节流没有消息边界”在说什么。

第三类是当时没听懂、后来在项目里补上的。 软件工程就在这一档。课上讲需求分析、模块划分、版本管理,我当时的反应是“这些不都是常识吗”。但真正三个人改一个仓库时,我才知道“常识”和“做到”之间差着多少个被强推覆盖的提交。Web 应用开发也一样,课上的例子规模太小,我在聊天应用里才补上“异步顺序”这部分——比如流式输出时该怎么处理滚动位置。

两个项目的收获完全不同

图书管理系统让我第一次接触“数据和界面要对得上”。之前写代码是“功能实现就行”,但这个项目里界面显示的库存数必须和数据库严格一致,少一本多一本都会让借阅流程出错。我为此学会用事务把“写记录”和“改库存”绑在一起,也第一次因为“两个人同时借最后一本书”去查了行锁。

智能聊天应用的收获完全不同:第一次接触“外部服务不可靠”。这是我独立开发的,没有队友商量,所有问题都得自己扛。流式黏包、网络超时、API Key 管理、会话持久化结构,这些都不在功能需求里,但不处理应用就是不能用。写对请求只是开始,处理它出错的那部分才是工作量的大头。

一个教会我“内部数据要一致”,一个教会我“外部依赖会失败”。这两件事恰好是后端最核心的两个关注点,我是靠做项目才建立起来的直觉。

数学建模带来的思维变化

2025 年参加东北三省数学建模联赛拿了个三等奖,名次一般,但那次经历改变了我验证工作的方式。

作为编程手,我养成了两个习惯:换一组参数再跑一遍,看结论会不会翻转;把输入推到边界,看会不会崩。 如果参数稍微动一动结论就变了,说明这个结论本来就不稳,必须如实写出来,而不是挑一组最好看的数字交上去。

这个习惯直接影响了我写代码的方式。做图书管理系统时,我会主动去测“库存只有一本时并发借阅”,因为我知道边界情况才最容易出问题。不要相信一次跑通的结果——这是我这一年学到的最有价值的一句话。

关于两张证

CET-4 和 Python 四级,我的备考策略完全不同。CET-4 投入比较集中,主要是词汇和听力,每天固定时间做真题,它是个硬门槛,简历筛选会看。Python 四级基本靠项目底子,只在考前过了遍语法和标准库。

这张证的含金量我自己的判断是有限的,它证明不了工程能力——不考你怎么处理流式黏包,也不考你怎么设计一张表。但它至少是个可量化的凭证,能和简历上“熟悉 Python”互相印证。如果重来一次,我在计算机等级考试上的时间会压缩,省下来的投到实际项目里。对后端方向来说,一个能跑起来的项目,比一张证更有说服力。

做得不好的地方

学得散。 这一年 Python、Java、C++、MySQL、MongoDB、Linux 都碰过,但每门都停在“会用”。我能在 Python 里写事务,却说不清 InnoDB 的 MVCC 怎么实现。广度是先发优势,光有广度会很虚。

缺少系统性阅读源码。 遇到问题基本靠搜索,解决完很少再往下追一层。处理完 SSE 黏包,我没去看那个 HTTP 库怎么切分数据块;修完并发借阅,也没读 MySQL 关于锁的文档。结果是同类问题换个形式出现,我还得重新搜一遍。搜索解决的是当下,读源码解决的是以后。

动手太晚。 大一和大二上我花了大量时间听课、看教程,真正动手写完整项目是从大二下才开始的。回头看,很多课如果在听的同时就配一个小项目,理解会深得多。这个教训直接决定了我大三的计划。

大三的计划

三件事,按重要性排序。

第一,把后端基础打扎实。 数据库要能讲清索引原理、事务隔离级别和锁;网络要能讲清一次 HTTP 请求从连接到返回的完整链路;操作系统要能讲清进程、线程和 IO 多路复用。这些不是背概念,而是被追问“为什么”时答得上来。配套做法是读完一两本经典教材,而不是继续看零散文章。

第二,做完一个有真实用户的小项目。 现在两个项目的用户就是我和队友。“真实用户”意味着需求不是我定的、bug 会被真实反馈上来、部署后要考虑可用性。它的价值不在技术多新,而在于逼我处理预想不到的问题。

第三,坚持写博客。 写博客首先是逼自己把话说清楚——一个概念写不明白,通常说明我没真懂。其次是留痕,一年后回头看,能清楚看到自己当时在想什么、错在哪。

大二这一年最大的收获不是学会了某个技术,而是知道自己缺什么了。大一的时候我不知道自己不知道什么,现在至少有了一个清单。