大概是五月下旬的时候,那段时间我仿佛体会到了自己能力的增长。

对我而言,大概体现在 “掌控代码的能力”、“设计能力”、“搬砖速度” 以及 “寻求解决问题思路的过程”。

但这些好像幻觉一般,让我无法判别真假。

大概是两年前

我第一次对 GitHub 的使用是在 ganler 学长的带领下进行的。在大一的那个暑假,学长为校内 Robomaster 招新开了一个仓库 SPTraning-VisionGroup

而我只做了 第一次作业,作业的内容我大概列一下:

1
2
3
4
5
6
7
1. 学习 Markdown
2. 完成科学上网
3. 学习 Git
4. 安装双系统
5. 用 CMake 和 gcc 编译程序
6. 学习使用 GitHub 的协作流程
7. 用 C++11 写一个快排

现在看来,只觉得这些都是很基础的工作。但是对于一个 “正常的大一计科学生” 来说(一个学了一年 C 还学不明白,绩点也低、没有成功项目经历、糊里糊涂过了两个学期的人),每一个任务都不算特别简单吧。

站在一个新手角度分析,学习 Markdown 不是用记事本,而是学习一门新的标记语言。没学过操作系统,十分害怕自己主系统也搞崩了。计网没学过,不会自己搭代理。CMake 是什么?难道写程序可以不用 Visual Studio 吗?

做完这第一次作业,我唯一的感受就是 “不真实”。我感觉我需要的应该是这些,而不是一些枯燥的课本内容。后面的 第二次作业 相对而言比较简单(现在看来),因为它不是那么杂,只有一个任务。

可我没有继续做下去了。因为这个作业超出了我当时的接受范围。想起来就觉得很可笑,我当时无法理解程序如何实现并发,也不知道线程是什么。这也使得我第一次发现,我变得 懈于追求超过目前个人水平的知识。明明以前不是这样的。

这段故事于 2019 年国庆假后结束。Robomaster 视觉组并没有选择我。原因我自己明白。我简要描述下面试过程:

1
2
3
4
5
6
7
8
- ganler: 来报名的很多都是大一双 sj,同时导论课大作业选的是 “计算机视觉”。
- 我:嗯。
- ganler: 你为什么大一下没有选呢?
- 我:Larry Shen 是我十分尊敬的老师,但是他的作业太多,我想自己看一些书。
- ganler:那你大一下都看了什么书呢?
- 我:我主要看的是数据库,扫过高性能 MySQL,着重看了一本有关 InnoDB 存储引擎的书。
编程方面看了 Effective C++,也看了些 C++-STL,看过软工也看过计网。
- ganler:(看向他的右边)数据库的知识并不是我们需要的……Effective C++ 里没有讲很多现代 C++ 的知识。
1
2
3
4
5
- ganler: 你现在绩点怎么样?
- 我:4.65
- ganler:那你是准备保研吗?
- 我:应该是的。
- ganler:可是我们会花掉你很多时间。
1
2
- ganler:如果现在出了一个问题,你这边可以改,硬件组也可以改,那你会怎么决定?
- 我:如果我出了问题,我会觉得我很垃圾;反过来也是一样。

或许由于我面试表现得一点求生欲没有,导致我被挂了。我也因此自我怀疑了一段时间。但现在回想起来,除了怀念 ganler 学长带我们学习 GitHub 的时光之外,没有其他多余的思想感情(

在后面的生活中,我时常能听到一些对 ganler 学长的流言和评论。但在我眼里,他无疑是一个强者,更是一个好人。

  • 大二下选了 40 多个学分,最后还能在没怎么认真的前提下稳到 4.6 左右,这专业有几个人有这种学习能力?
  • 千星项目 HyperposeMaintainer,怎么要去怀疑代码能力呢?
  • 43 多个 Closed Pull Request,怎么能说没有贡献和尝试呢?

从一般学生的视角看过去,或许很难想象,也很难理解。并且只要难以想象和理解,那便开始妄自揣测,开始用谎言麻痹自己、掩耳盗铃。

大概是一年半以前

我参与了一个外包项目。要写一个前端,但具体内容不方便细说了。那应该是我停滞生长的一年。

前端这个事情,说简单它很简单,但说难也很难。如果不对前端的历史有一个充足的了解,那完全写不好代码……甚至不知道一些工具是用来做什么的。

我的工作很简单,就是套套模板,写写接口。如果出现问题,就百度一下。我也就是这样,混了 200 多个 commits,听起来就离谱。

但要说这件事对我有没有积极正面的影响,那我想也还算是有的。我在这个过程中,遇到了很多匪夷所思的问题,我开始学习 “搜索”。
同时,我们是前后端分离开发,一开始的后端连 HTTPGET / POST 的区别都不清楚,也不知道如何修改后端代码(Spring Boot 写的),我就是在这种情况下接受了后端一个又一个现在想来挺无理的要求(比如说前端处理 CORS 问题)。由此,我逐渐领悟到了 “软件工程” / “高效合作” 的重要性。

我在重述一遍,我的工作就是套模板。但是这个 “套” 啊,也是讲究方式方法的。有些代码,还真的就是得理解了才能调用,更别说修改了。在这段时间里,我读别人代码的能力应该也多少提升了一些。

在我校培养方案里,自力更生的学生没有什么机会阅读他人的代码——什么作业都是个人作业,都是自己做了,而且大多都是从头开始,读什么代码啊?哪怕有几个作业,那也是调库就完事儿,根本不需要读。而无法自力更生的学生,则更不会去读代码——直接 c-vc-v 不行就换一个 c-v

到头来,自己写得代码还是那种垃圾的风格,只有自己看得懂。自以为自己的代码如诗词歌赋般优美动人,实际上连 Mount.Shit 都不如。

很可惜的是,我花了很长的时间才意识到这件事。

大概是半年以前

我突然体会到自己可掌控代码的范围,大概是在 1400 LoC 左右,再多便不能如臂使指。

哈哈哈,那一刻我觉得天塌了。

我还算是写了一小段时间的代码,竟然只能掌控如此可怜的规模吗?我想做些什么来提高当时的上限。办法我尝试过一些,但都没有什么作用,于是我换了个路子。我认为,这可能和我的智力有关,或者说和我的大脑有关。有的人就是能够一口气敲完 200 行代码直接跑通,虽然这肯定离不开训练的帮助,但不知道有多少人,即使加班加点地训练,也无法做到这种地步。

我认为我肯定是后者,我只能通过一些辅助手段才能提高对代码的掌握程度。那这就需要了解许许多多的知识,阅读其他人写的代码——只有开拓了知识面,才能将原本只能用大脑强行建立联系的代码块整合成有意义的集群。

这个时候我开始后悔,后悔 “数据结构”、“算法设计”、“操作系统” 等一系列课程我为什么没有好好自学。

时间过去了就是过去了,不可能如时钟般回拨。

我曾经以为我的水平一直在增长,而且以一种极高的速度增长。但夜里躺在床上,反思自己的过去,仔细比较就会发现,自己根本没什么长进。我还记得大学的第一个寒假——飞机落地之后,我跟着我爸爸、爷爷直接去了饭店。在饭店里面,我迫不及待地拿出电脑,向我爸演示我 “高级程序设计语言” 那门课做的大作业。我爸只用了一句话,就让我开始怀疑人生,那句话是:

1
还有吗?

是啊,还有吗?

我一个学期在大学里面学得累死累活,产出就这么一点吗?

  • 我是在图书馆走了很久的神吗?不是的,我那个学期,每周六肯定是早起到图书馆,一坐就是一个白天,腰都坐出问题了。
  • 我是在学校浪费了很多时间吗?不是的,我一直在做作业,从来都没有停过。作业做完了就刷高数题,一本刷完了就找另外一本,我吃早饭的时候都在看吉米多维奇。
  • 我是在寝室一躺就是一天吗?不是的,或者说那个学期我不是这样的,我应该只有做完了作业才会休息一段时间,之后又投入到下一次作业的准备当中。

那我在干什么?我不清楚。

我曾经以为,我上了大学之后就会像坐火箭一样,前十二年的积累都会转化成我在大学里面发展的动力。但我错了,大学不会给我一个方向,然后告诉我向那个方向努力,而是需要我自己寻找方向。

我错了一次又一次,错了一次又一次。一直以来我跌跌撞撞、磕磕绊绊像个没头苍蝇,只知道离目标越来越远、越来越难。我从没觉得自己特殊过,我是个普通人,因此我相信其他普通人应该也和我又一样的烦恼吧?

大概是现在

我看不清。

这个 Markdown 文件是 6 月 28 号创建的,但是写到这里的时候已经是 7 月 28 号了。我只能寄希望于两个月以后,可能只有那个时候的我才会对现在的我有一个比较公正的评价。

希望我没事吧。