本文最近一次更新于 4 年 8 个月前,其中的内容很可能已经有所发展或是发生改变。
最近忽然有些念旧,想着距离写完我的学生时代(高中篇)也有大半年时间了,趁着前几天的创作欲还未散去,本文就好好聊聊我的大学时光吧(再不聊我都怕忘记了)。
温馨提示:本文会有些长,会尽量按照发生时间的先后叙述,不过我无法保证本文的叙述具有 100% 的准确性,毕竟人的的记忆本来就不甚可靠。
专业
现在回想起来,应该是从高二开始吧,便对计算机(的某一分支)有兴趣了,当时沉迷于安卓系统的优化,比如:刷各种 XDA 的魔改内核、ROM 等,不过受限于条件,只是停留在使用别人修改好的软件包层次,并没有机会自己手动修改。
应该还是在高二吧,上微机课的时候,老师会控制全班同学的电脑,不让我们自己玩,但唯独只有一个同学不会被控制。有一堂课(好像是在讲顺序分支循环那些,记不太清了),老师向我们解释到为什么不控制那个同学:「因为我上课讲的内容他都懂了,所以我让他自己玩」。当时就觉得这个同学好厉害啊,可能这时开始,一颗种子便埋在心底了。
填志愿时,这颗种子经过了一年多的萌芽,已经慢慢开始生长了。于是乎,即使所有的亲戚朋友都反对,我仍是选择了计算机专业。
大一
九月入学,校园各大社团(包括学生会)都开启了招新活动,不过我一个都没参加,大概是因为性格散漫惯了吧,不想受到什么约束。
大一上学期学了第一门与计算机相关的课:HTML 与 CSS3 基础,由于刚入学,课听得都很认真,在期末时交的静态网页作业拿到了全班最高分(直到之后很长一段时间,我都在因为这个事纠结我是从事前端还是后端),高等数学也考了满分,一时间有些膨胀了。
这人嘛,膨胀了之后,会有一段时间觉得自己很牛逼,我在这段时间里(大概从大一下学期开始吧),开始上课不听讲了,甚至还伙同两三个同学逃了高数课跑去看校园十佳歌手,晚自习也不怎么去上了,学习态度的散漫,导致我这学期的成绩比上学期退步了许多(当然这是后话了)。
也是在这段时间里,学院开设了第二门与计算机有关的课——C 语言,同时学院的 ACS 协会(别问我全称,我也不记得了~是一个与 ACM 竞赛相关的组织)开始招新了,招新的学长在台上说了一大堆加入协会的好处:找工作时各种大公司的内推、参加 ACM 竞赛可以获得加分(保研时有用)等等,虽然这些好处没怎么打动我,不过仍是稀里糊涂的就加入了协会(可能看着身边的人都加入了吧),开始了短暂的刷题生涯。在杭电上刷了五六十道题之后,我发现我对算法没什么兴趣,期间也曾尝试转到安卓组,发现还是没什么兴趣,于是便退了协会。
在五月份,某大牛同学(初中开始编程)组了个队参加「互联网 +」创业创新大赛,我也加入了。目标是做一个考研的交友平台,可以根据个人信息推荐相似的研友,他负责推荐算法,我负责用爬虫采集数据,并清洗。当时第一次接触网络爬虫,也没有经验,只能在网上随便找个爬虫改改凑活着用,虽然最后这个项目只拿了校级的奖项,但是在这个过程中我发现我喜欢上爬虫了,于是我开始觉得要自学编程了。
所谓「工欲善其事,必先利其器」,在学习之前,首先得要把环境搭好,上网看了一圈之后,决定装一个 Linux 系统(与 Windows 共存)专门用于编程,当时我对操作系统完全是一窍不通,导致在装完 Linux 系统之后重启直接回到了 Windows,百度后尝试了许多方法(比如:把 UEFI 模式改成 Legacy啊、用什么 Boot 编辑器啊),但都没什么卵用,逼得我甚至冒出了将 Windows 整个格式化掉的想法。
最后还是在暑假期间解决了,还在简书写了一篇教程(一年之后居然有两万多浏览量),成功安装好双系统之后,我又开始像高中折腾安卓一样开始折腾 Linux 发行版的各种美化(真是死性不改😅):Terminal 的美化,状态栏、主题图标的美化等等,原定好的学习编程计划也搁置了。如果时光可以倒流的话我一定会告诉当时的自己:「不要再花时间在这些没卵用的美化上了!快点学习吧!」,不过当时的我也肯定听不进去,毕竟颜值才是第一生产力~
大二
对大二上学期这段时间的记忆比较模糊,应该也并没有发生什么值得记录的大事吧:唯独对数据结构这门课印象很深,老师是我们院的副院长,可以看出他很懂数据结构,但是讲课不是特别好,不是很能吸引人,这门课我们全班的战绩都挺惨的,好像没有人超过 80 分。
在大二的寒假期间,似乎终于想起了自己半年前好像就说要学习编程了,于是开始比较系统地学习 Python 了(大概是因为之前接触过爬虫,我对 Python 印象很好),在知乎上听说 MIT 6.0001 这门课用于入门 Python 不错,于是便开始看跟着视频一起学习,授课老师(MIT 计算机学院院长)讲得非常好,而我遇到理解不了的就用谷歌查,花了一个多月时间才差不多把这门课的内容学完。
不过这一切都是值得的:本课程在我对计算机的理解还是一张白纸的时候并没有急着在上面写写画画,而是耐心地教了我怎么才画才算是正确的,换句话来说,本课会花很多的时间来培养你的计算思维,而一旦养成了计算思维,编程便不再是什么难事了。
即使是现在,我依然会向所有想学习计算机的人推荐此课入门。
到了大二下,印象比较深的课就是操作系统了,先前提到过,我在大一暑假时便开始接触 Linux,老师在得知了这个消息之后,某堂课上走到我身边悄悄对我说:给你两周时间,两周后的这节课,有半节课时间给你表演👿,题材不限,风格不限,和 Linux 相关就行。我花了两天时间好好准备了一下,还抄了一个 PPT,至于结果嘛,emmmm 反正挺尴尬了,因为下面的学生似乎都没在听,从这一点看,当老师还是考验人的~
四月份(也有可能是五月份),学院组织了一个院级的算法比赛,闲着没事就参加了一下,看看许久没写算法是不是退化了许多(题目我是一道都不记得了),最后拿了一个二等奖,奖品是一个 32G 的 U 盘,感觉还不错~(只是我也并没有因此对算法提起多大兴趣。。
五月初,一朋友说她(好吧,其实是当时的女朋友)正在尝试用 Hexo 搭博客,我搜了一下,之后,便有了这个博客~
提问:搭好博客后最重要的一件事是什么呢?
回答:当然还是美化啊~
当时基本上把所有好看的 Hexo 主题都尝试了一遍(NexT、Yilia),最终还是决定了使用 NexT,选定好博客主题后的那两个月内非常高产地写了差不多十篇文章,应该是新鲜感作祟吧,很多文章都没什么营养,没多久便把大部分都删掉了。
得益于博客的搭建,我的知识面被扩充了不少,也了解到了 SICP(Structure and Interpretation of Computer Programs)这本神作,在暑假前,我在图书馆借阅了这本书,花了一整个暑假的时间,却仍只读完了半本(读完了前两章,做完了习题),该怎么形容我那两个月的感受呢,感觉自己的编程世界观受到了冲击(也是在阅读第一章后,我彻底明白了递归与迭代的区别),感觉自己的脑回路好像都被重构了一样。
一般来说,当我们在编写软件的时候(尤其是大型的软件),核心便是控制复杂度,而本书的核心——抽象,便是控制复杂度重要的手段。我在工作后接手了祖传的项目代码,才理解控制复杂度的重要性(当然这也是后话了)。
在看完了 MIT 6.0001 后,如果你想成为一名更好的程序员,并打算继续深入,那么看看 SICP 这本书吧,不会错的。
大三
大三时,逃课开始变成了家常便饭(尤其是离散数学,但是我一学期没怎么去上过,期末反而还考了满分),不过数据库这门课我倒是每次都去上了(只是差不多每堂课都会迟到😅),因为授课老师就是上学期的操作系统的老师,对她印象还蛮好的(不过我现在还很奇怪的一点是为什么老师要教 SQL Server 而不是 MySQL 或者 PostgreSQL)。数据库课程分为理论课和上机课,由于上机课和理论课不在同一所教学楼,于是在理论课下课时便会和几个同学绕一大圈,逛逛校园,再慢慢地抵达上机课的教室,好在老师也不会说些什么。
当时还有一门课是软件工程,遗憾的是软件工程的重要性是我在工作之后才明白,因此当时这门课我并没有去几次,而且老师一开始就说了这门课的考核标准:交一个系统上来就行了。于是断断续续花了两个月时间,读完了狗书(Flask Web开发:基于 Python 的 Web 应用开发实战),照着书上面的代码自己敲了一遍,也算清楚了 Python 的开发流程。
除了了解 Python 开发之外,当时还针对 NexT 主题做了很多定制化操作,也借此学习了一下 JavaScript 中是如何使用 Template 的。
大三的寒假正巧碰到搬瓦工上架了 19.9 刀的 CN2 套餐,于是毫不犹豫就下手了,从此我拥有了人生第一台服务器~有了服务器之后,最先做的事就是把博客挪到了服务器上,顺便折腾了一下 CI/CD;其次 Flask + SQLite 写的一言 API 也总是崩溃,于是就花了两天时间用 Golang 重写了一遍,数据库也换成了 MySQL,也部署到了服务器上(虽然服务器只有区区 512M 的内存,但是Go 这货还是真的省内存,满载时也不过 10M 的占用。
到了大三下学期,更加的放飞自我了,专业课程只剩下编译原理了,不过真的好难啊(而且我当时还是已经通过 Lisp 了解了 AST),为了学好编译原理我还兴冲冲的去图书馆借了虎书准备好好研究一下,结果拿回寝室就吃灰了。。
四月份,和高中那个微机课不被监控的同学交流时,得知他拿到了腾讯的暑期实习 Offer,给我羡慕得不要不要的。谈到职业生涯时,我也挺慌的,因为我甚至还没有想好是从事前端开发还是后端开发(因为当时正在学习 React,写了个项目练手,反响还挺好),更别说是具体的岗位了。
大一的暑假是玩过去的,没必要担心,毕竟才第一年;大二的暑假是学过去的,一直在学 Lisp,感受着 Lisp 给我脑子带来的冲击。而大三暑假,则是最迷茫的一个暑假,一方面是在纠结自己的职业规划:前端还是后端?后端的话,我比较熟悉的语言只有 Python,但 Python 的岗位实在太少(且我不想转 Java);前端的话我又没什么能拿得出手的项目。另一方面则是有些陷入了自我怀疑中:两年来,我将学习的重心放在自己感兴趣的方面这一决定是否正确,又或者我是不是应该好好完成学校的课程。
大四
大四上发生了一件特别有意思的事,一同学也在找工作,他说他暑假学了两个月 Spring,但现在对 Spring 基本还是一无所知,于是乎我和另一朋友「苦口婆心」劝了他一个晚上,终于劝他转 PHP 了,然后过了两个星期,他就找到了 PHP 的工作(没有任何黑 PHP 的意思😆)。
随后,便是去杭州实习了,去杭的两个月可以看看杭州见闻这篇文章,这里不赘述了。从杭州回来之后,在学校呆了一个月,那一个月是我大学四年过得最放松的一个月:逃课也不用战战兢兢地担心被老师发现(当时还有一门 Python 的选修课,因为学分还没修满)、实习证明也顺利弄到手,更重要的是,这几个月的实习,驱散了我几个月前的自我怀疑,也明确了自己未来的职业规划。
还有一个小插曲就是这门 Python 课了,由于我提前和老师打过招呼说我要去杭州实习,所以平时课去不了,老师说没关系,最后用 Python 写个东西交上来就行了。于是在最后一堂课,我把大三暑假复习计算机网络时写的一个静态 HTTP 服务器交了上去,并阐述了分别使用 Asyncio 和 Thread 实现的并发,结果老师说这个程序太复杂了,不相信这个程序是我写的(大概是觉得他一个教 Python 的都写不出来吧),费了好大力气甚至把 Github 页面都亮了出来他才相信。。
大四寒假,主要是搞论文的事,选题时恰巧写业务写得有点烦(现在的工作对比来看,能安稳写业务真的很难得了),于是选了个文本情感分类方面的课题,当时还在 Coursera 上学习机器学习的课程,上到第五周的时候,往后翻了翻课表,发现并没有介绍文本分类之类的算法😒。
于是便弃了这门课,改为自己找论文看着谷歌学,顺便学习了一下 Latex~顺便说一句,Latex 太适合我这种强迫症了~
毕业前夕还发生了一件事:我发现学校的校园网络不登录居然也是有 IPv6 的地址的,且具有互联网的访问权限。嘿嘿,略加思考,便想到了一个可以薅学校羊毛的方法,原理很简单:需要保证有一台支持 IPv6 和 IPv4 的服务器就可以了,用这台服务器在本机和互联网之间中转一下,那么即使即使只有 IPv6 的互联网权限,也可访问 IPv4 的网站了。
结尾
毕业时,我罕见地有些不舍:不知是不舍这所学校、还是不舍同过窗的同学、抑或是不舍可能是最后一段学生时光。但应该还是不后悔的吧,虽然投入开源项目我付出了很多时间,但的确也扩充了我的知识和眼界,不过也不是说程序员就都要做开源,只是我个人确实通过做开源获得了很多提升:如果你能坚持在两年内,每天平均编程四个小时,我想你也会获得很多提升,而开源只是我坚持的动力罢了。
大学四年里,我放弃了一些欲望,只想活得轻松一点。
这欲望是指对保研的渴望(努力上课,好好听讲,参加各种竞赛)、对组织能力的锻炼(加入各种学生会、班委)等等,转而将精力投向了我所感兴趣的方面。当然我意思也不是说我现在多么成功,只是想说明,当你决定要跟从内心做自己喜欢的事时,接下来只需要坚持下去就好了。
本系列正式完结(不排除有续作的可能,嘿嘿)~