大一技术成长复盘:课程、竞赛与开源之旅

50 阅读9分钟

本文首发于:我的个人博客

大一学年即将结束,坐在图书馆回顾这一年,从对计算机科学的懵懂好奇到如今能独立完成开源贡献,这段旅程充满了挑战与惊喜。今天,我想分享这一年在技术领域的探索与成长,希望能给同路人一些启发。

我将会从课程学习、课外参加的活动以及其他技术细节几个方面分别聊聊我的思考。

课程学习

大一暑假通过学校考试,我选择直接跳过了基础课程,所以我大学的计算机课程是从计算机组成原理开始的。这门课程知识跨度很大,既有对于 C/C++ 这种高级语言内存管理思路的讲解,也有对于汇编语言乃至 CPU 电路等更底层原理的分析,总体上还是很有挑战性也很有趣的。这门课让我第一次真正理解了从高级语言到硬件执行的完整链条,那种“原来计算机是这样工作的!”的顿悟感令人难忘。

这门课程一项令我印象比较深刻的实验是在模拟软件中设计一个电路,可以使 CPU 能够额外支持一种双精度加法命令,单周期完成双精度加法运算。这个任务本身其实难度不大,选取合适的逻辑门组合,处理好 flags 就可以比较轻松地完成,但关键难点在于拓展指令集后需要对寄存器、ALSU 等多个不同位置进行同步修改,需要十分细心才能将整个系统逻辑梳理畅通。

此外,上学期我在选取的一门物理课中锻炼了一下写 Mathematica 的能力,见到了不少之前从未用过的命令和技巧。

下学期,我选了门数据科学入门课程。由于高中的时候做了很多相关工作,这门课程介绍的许多概念之前就接触过,总得来说我感觉难度不算太大。这门课程的主要特色在于介绍了很多数据科学领域算法的数学原理,做了些比较复杂的数学推导,这让我对于线性代数等数学工具有了新的认识。这门课程的实验主要任务就是把课上讲的数学原理转化成程序语言,但同时也能看到教授在引导大家思考如何用更科学合理的方式去组织架构自己的代码,如何将复杂功能拆分成易读易维护的函数和类的组合,如何在实现算法时尽可能降低时间复杂度,总之收获还是很大的。

这门课程的期末大作业其实只是要求选取课程中讲到的两三种算法应用在一个学生选取的数据集上,但我和同组的同学商量了一下主动加了点难度,决定探索一下业界结构化数据监督学习常用的 XGBoost 和 LightGBM 算法。我们也尝试参与了 Kaggle 上的一个 Playground 级别的比赛,尽管首次参赛成绩很一般,但也通过社区学习了不少他人的特征工程思路,开阔了视野。

课程以外的活动

除了上课,这一学年中我也利用课余时间参与了一些相关活动,收获了不少新知识、新技能、新感悟。

组队参加了周边几所学校联合举办的 Hackathon,并获得了不错的成绩。从上学期了解到这一比赛后我就开始着手组建队伍,同时开始储备项目想法和相关技术,这些准备工作对于获得最终的结果是有很大帮助的。

产品想法其实很常规,就是设计一个校园活动信息聚合网站,算不得什么惊世骇俗的点子;但是我们在产品内整合了一个通过 Ollama (一个本地运行大模型的工具) 部署的 DeepSeek-7B 模型,并借助大预言模型实现了活动信息获取的自动化。尽管这个 AI 功能虽然只是最低限度的整合,但这一项亮点还是获得了评委的高度评价。此外,我主要使用的技术栈其实就是 Django 全栈,主要原因是我对 Python 最熟悉且整合 AI 比较方便。这个技术虽然在业界基本被淘汰了,但对于 Hackathon 这种需要极快速度完成原型设计、展示核心功能的场景下还是很好用的。

这个活动给我的最大启发,就是平时还是要多动手实践。通过 Ollama 在本地部署模型这个技术之前纯粹是出于兴趣探索了一下,也是出于好奇研究了 Ollama API 的调用文档,没想到这些平时无心的积累在这种极短时间周期的 Hackathon 中起到很大的帮助,给我在短时间内实现自己想要的功能提供了信心和技术基础。

学习了 rust 语言并初步参与了 Apache Datafusion 开源项目。如果说最开始学习 rust 纯粹是赛博追时髦 (总不能是因为面包蟹 logo 太可爱吧),那么后来我这个 C++ 小白犯了各种内存管理错误被 Valgrind 反复军训,这之后再学 Rust 就开始逐步理解这个语言为什么被设计成这么特殊的样子了。

在学了一段时间 rust 感觉自己掌握了基本语法和概念后,我当即打算尝试看一些开源项目,也通过这个机会开始学习如何参与到开源贡献中。当时也是初生牛犊不怕虎,我直接选择了 Apache Datafusion 这个比较热门的 rust 数据库项目,挑了个带有 "good-first-issue" 标签的问题就开始研究。研究了一段时间后发现虽然说整个项目代码有几十万行,但是如果定位清楚问题根源后其实相关代码不过几百行,解决起来其实没有想象中那么难。我花了点时间研究清楚了社区合作的规则,提交了 PR 并最终合入代码主分支。当我看到自己提交的代码被合并进主分支时,那种为全球开发者使用的项目做出贡献的成就感,是任何课程作业都无法比拟的。

其实我觉得 Fust 是一门非常适合开源协作的语言。一方面,Cargo 作为一种极其优秀的包管理工具,极大程度简化了代码环境配置的复杂度,新的开发者往往只需要几步命令就可以让项目跑起来,提交 pr 前为确保代码质量跑的 nextest、fmt、clippy 等检查工具链也非常好理解和操作;由于语言本身具备很强的类型系统和严格的生命周期检查机制,只要写的代码能够编译、能通过各种测试,大概率就不容易出现一些隐藏错误,社区内的其他开发者往往只要审阅代码逻辑准确后就非常乐意接受新手贡献的代码。这两点基本可以确保我们在开始时不会卡在某个难点过不去,能帮助大家比较快速地开始做实际的贡献并建立起信心。

参与了一个数据科学比赛,跟着大佬拿了个奖。今年三月参加了一个地区级的数据科学比赛,主要分析了一个房地产行业企业提供的海量数据中的趋势。这个其实我自己的贡献会相对小一些,主要还是跟着上学期计组课认识的一个大三学长见见世面。我负责的工作除了做了些 EDA 和数据清洗,还有就是写了个脚本调用 API 将数据中的街道信息转换成经纬度,使得数据更好进行分析和可视化。

其实这场比赛主要是大三学长完成的统计学模型对于最终获奖起到了关键性作用。这场比赛给我的最大启发,就是想要做好数据分析和数据解释,必须学好数学,具备坚实的统计学基础。我打算在未来几年里多选点统计学课程。

其他

上述这些算是完成的比较重要的工作,但除了这些还有一些零星的事务和感悟:

  • 梳理通顺了自己的环境管理工具链。我在自己的 Windows 笔记本上通过 Scoop + WSL 这个组合实现了比较丝滑的各种代码环境管理。此外,引入了 uv 这个工具管理 Python 项目(uv 是真的香);
  • 进一步优化了笔记系统。进入大学以后自学的时间更多,自学内容更广更深,这时候就需要通过更系统化的笔记系统把信息沉淀下来,最终转化成知识体系化为己用。这一年里,我进一步优化了自己的笔记系统,将 Obsidian 电子笔记和手写纸质笔记相结合,比起前一年信息向系统化知识转化率大大提升;
  • 读书,特别是读毛选。除了学习研究技术问题,我还读了不少政治、经济、哲学方面的书。其中毛选虽已不是首次阅读,这次读来许多以前不太理解的问题茅塞顿开,并开始能够逐步将实践论、矛盾论等文章中描绘的马克思主义基本原理应用在生活中;
  • 近期报名参与了腾讯组织的远程支教,给一群三年级的小朋友们聊聊人工智能。这是一段很有意思的体验,把一个比较复杂的问题将给没有任何前置知识的小朋友们这件事的难度,不见得比学习复杂技术本身更简单。看到他们中不少同学眼睛发亮的样子,我意识到技术传播的乐趣。

我想比较值得一提的事情恐怕就是上面列举的这一些了。一年过去,虽然说我的能力提升道路仍然任重道远,但我想无论如何还是取得了一些成果和进步的。

这仅仅是我的起点,前方的技术海洋更加广阔。欢迎关注我,愿与诸君共勉!