这一年是成长的一年,记录一些感悟。这里没有吃吃喝喝与娱乐休闲,主要是对自己过去的总结、反思以及对未来的展望。
这一年经过了两个学期,分别是大一下以及大二上。
大一下,认真学习了学校开的《离散数学》、《线性代数》、《高等数学》,并且取得了不错的成绩。也杂七杂八地在课外学了一些其它的知识,比如 python 爬虫、Golang 爬虫、一些 web 基础知识、一点系统编程、多线程、协程、Java、 刷了一些常见的算法题(Leetcode)等等太多。这一学期学的东西可以用一个字来形容——杂,杂有杂的好处,它可以让你对很多东西都了解一点,起到一个扫盲的作用。当然,杂也有坏处,它会让你浮于表面,没有能拿得出手的见解和看法。这不是我想要的,所以我及时的调整了思路。
暑假时,我加入了学校 linux 兴趣小组的一个小项目——尝试着做一个即时聊天系统(IMS)。在做这个的过程中, 我收获了很多。我是用 Golang 做的,一边看视频,一边敲代码。在这个过程中我学到了很多东西,了解到这些业务是如何落地的,并且深入体会到了自上而下分层构建事物的强大之处。
在整个过程中,学习了 gin、gorm、mysql、redis、docker等,还有一些前端知识,比如 js、html、css 等。做业务是一件比较有成就感的事情,因为人会迅速上手,并且在机器上展现出来,这种成就感不是刷算法题目、啃书学习能带来的。然而这种成就感可能会改变一个人的技术价值观,会使人沉迷于应用层而放弃底层的细节。我不是在鼓励人都去研究底层,都练基本功而放弃所有技术实践,我只是在此处给自己一个警示罢了,至少大一的新生需要这个警示。
大二上,转眼就来到了 9 月份开学了,这一个月学得东西也比较杂。了解了 http 的无状态特征以及为了维持状态而发展起来的 cookie 等技术,顺便实现了 go Session,可以看看这里。然后还开始了德语学习之旅(那时候都快到 10 月了)。
10 月开始高强度学习。期间看完了 《OSTEP》、《高效服务器编程》(这本书真的是绝对的好书),做了数百篇笔记,将书上能实现的都实现了一边(我刚好有台云服务器,可以做很多服务器编程上的实践)。同时将 mit 6.s081这门课肝了一遍。不得不说,国外的课质量真高。到这里,就已经 12 月多了。两个多月的操作系统学习之旅,着实充实。虽然学的过程一边头皮发麻,但一边感叹于操作系统(xv6)的精巧设计。
12 月做课程设计,我实现了一个用哈夫曼编码压缩文件的命令行工具,详见 github。这个工具虽然不是特别复杂,但是利用位操作控制各个 bit 写进文件的过程令我感到很自豪——为数不多的将自己的想法变成现实的体验。
我认为刷算法题的过程,一方面是在学习一些算法思想,更重要的在于另一方面——训练一个人将想法表达成代码的能力,换句话说,就是在锻炼人的编程语言表达能力。
小孩子通常会听,但是你让他讲他就会支支吾吾,很难将自己的想法翻译成人类自然语言。就像刚接触编程时一样,人们只有经常训练想法到编程语言转换的模型,这一能力才能提高。
我在写课程设计的时候,很明显感受到了编程语言表达能力的提高所带来的好处,这也是 5 天的课程设计我会在短短两天迅速完成的重要原因。
暑假的时候,我外出做家教,每天都要做公交车,由于我晕车,因此我不会在车上看手机。所以我在近一个小时的车程中,发现了一个重要的东西——无聊才会产生创造能力。当人们无聊时,大脑的注意力开始内敛,这时候就会爆发出解决问题的思路。如果一个人从来不无聊,没事了就看手机,那么他的创造力极其有限。所以后来我一直在睡觉前不看手机,睡不着就思考自己今天做了什么,是否还能改进思路。而且根据我的经验,每天刷一两个小时的手机,一年下来并不能让你进步,甚至有害。
学习德语的经验告诉我,人一定要是长期主义者。我每天坚持学15 分钟左右的德语(Duolinguo),刚开始觉得这样学习太慢,后来才发现这样学习相当快。人们总是放大一天的学习成果而忽视日积月累带来的改变。学语言如此,学习编程、计算机知识也是如此!
甚至可以更极端点:如果一个人不是长期主义者,那么他将很难有什么成就。甚至,年轻人的思想都应该极端点,不然就没有看法,没有思想,没有灵魂。如果一个人在 20 岁左右,秉持中庸之道,对任何事情都没有自己的看法,那么他也很难有什么创造力。
总结以上:
学习是一个类似于指数增长的过程,刚开始什么都不懂,学什么都很慢。后面在打好基础之后,学习起来很快。因此在 2024 年,我将会学习更多的关于算法(CS61B)、计算机网络(CS114)、 数据库、编译原理、Java(面向实习学习)、分布式等知识,争取能在暑假拿到offer。
未来之路,就在脚下。