在大学的第一年——也是正式开始CS自学旅途的第一年(周年)随着暑假的临近也就快要结束了,是时候乘着 期末复习 休闲的时间写一下这个学年的学年总结与复盘了。
事实上,对于这个学年的成果我个人并不满意,但也正因如此,才需要通过客观、辨证的总结来修正错误的方法与方向。
做了什么
似乎做了很多,又似乎什么都没做…🙃至于为什么,后面再分析。
暑假
-
第一台个人计算机💻
拿到第一台个人💻(家里的电脑基本不让我动,而且其本身基本也成为赛博养蛊的载体了)的第一件事就是下
steamvscode,之前在高中的时候在班级的多媒体设备上不知道为什么“下不了”,好不容易下好了发现不会配环境😅;同时因为某些不明原因,班级里有些人似乎对我使用“公共设施”学习抱有意见——明明特地挑了不会影响他们的时间与方式,而且我个人也是管理多媒体设备的班干部。也不知道是不是他们觉得我在装X…
现在想想,当时的脸皮还是太薄了不小心说了点废话,总的来说,我在拿到这台电脑前几乎是没有任何渠道可以自学CS的,因此当时的心情是十分激动的,这台电脑几乎就是我最初的学习CS的工具。至于“为什么不看书”、“不会手写代码吗”这类言辞相信应该不会从能看到这篇文章的人嘴里说出;而且我真的去看了,举一个最典型的例子:我永远也不会忘记当时作为一个毫无CS基础的白痴,翻开这本书后我的反应😅。
-
自学了C语言的基础
这几乎占据了我暑假里80%的个人时间,所以我暑假期间直到8月底快要入学了都没有离开我从小生活的县城。
虽然但是,我是花钱看的网上所谓的培训班学的,这里就不展开了。
-
在一位福大信息安全的朋友的帮助下初步了解了科学上网🪜的方法
这个虽然不起眼,但是十分重要,可以说是改变我获取资源的途径的基础,只不过当时没意识到
上学期
这是在大学的第一个学期,主要以信息收集为主,同时兼顾学业以争取转专业名额。
-
了解在大学中计算机“破局”主要的三个方向:项目、竞赛、科研
-
结识了许多校内计算机方向的大佬与老师,主要是技术/安全协会的学长学姐与安全方向的同届同学
-
在大佬与老师的引导与帮助下彻底放弃了“跟班”式的学习方式
说起来也有点意思,暑假报的那个培训班我在入学后不久就退款了,原因有二:一是与我当时感兴趣的方向(安全)不太一致;二是我发现里面所谓的指导老师似乎对于计算机行业的认知还不如我,负责技术指导的老师更是
人机连工具都不会用。举个最难绷的例子,我用vscode(众所周知,vscode本身是文本编辑器而不是IED)时碰到了一个最简单的配置问题,甚至都不需要修改配置文件,他上来就让我把编辑器换成他们教学指定的IDE,而我在搜索了资料后发现就是环境变量的问题…更搞笑的是我是在他们课程的宣传广告或着叫公开课上的某个视频还是评论找到解决方案的🤣。不过好在人家最起码不是诈骗,退款还是可以退的,但还是赔了亿点点(因为看了一点课)。后面我在参与学校与某个企业联合举办的竞赛时又双叒叕被推送了他们自己的培训方案,这一次我是差点就交了近3万的培训费去学所谓的“网络工程”,当初对网络安全很感兴趣,头脑发热就去问了,好在最后被某个大佬和老师拦下了。这次也不是没有收获,除了彻底抛弃了“跟班”思维,决定自己独立定制我个人的培养方案,也认识了
Cyber Security
与Network Security
的区别(虽然不敢讲全部,但他在所谓的竞赛培训上讲的内容,除了思科模拟器的使用,其他内容我基本有一定的了解)总而言之,从这里开始,我的CS自学之路或许才真正意义上称得上是入门与起步。乐观的讲,至少没有中道崩殂吧…🙃
-
与网安同届的同学组队打了几次CTF线上赛
虽然都是一些小比赛,外加压根就没什么水平,所以挺水的,不过也结识了网安的朋友,同时由于我们学校对这方面不太重视,CTF鲜为人知(甚至连前面提到的安全协会都是基本只有网安专业的同学知道),为后续转专业提升了个人竞争力。
社会工程学魅力时刻了属于是😁
-
翻出了在网页收藏夹中积灰已久的csdiy
在整理网站资源的时候发现了早在高中时朋友就推荐的CS自学指南,当时因为没有科学上网工具打不开,但多少知道这是个宝藏,然而这时已经临近上学期期末了(你猜我前面为什么说我没意识到科学上网是改变我获取资源的途径的基础),也就是说我“浪费”了近一个学期的时间走了CS自学的“第一条弯路”,是的,这只是第一条🙃。
还有一点忘了说,在再次发掘出这个宝藏前、放弃“跟班”式学习后,我的自学几乎依靠形如菜鸟教程的文档式教程。至于我对文档式教程的看法,我个人认为其更适合用于快速参考或某些技术栈的入门速通,不建议在深入学习时依赖——文档之所以被称之文档就是因为其“仅供参考”
-
使用积蓄购买了第二台💻
这是一个艰难但在我看来正确的一个决定。冒着被扣上“乱花钱”帽子的风险,主要还是为了一劳永逸地解决我一直以来头痛的续航问题,但出乎意料的,这台轻薄本(我给其编号为
PC1
,第一台自然就是PC0
)对于生产环境的兼容性似乎远超PC0
,这解决了另一个使我头痛的问题——PC0
上一些困扰了我很久的兼容性问题;日常的使用体验也是如此,也不知道是不是因为PC0
是我的第一台个人电脑,我没正确维护导致的兼容性问题。
寒假
-
对于里面大部分内容的基础操作在上学期的“弯路”中多少有点了解,如Git、Shell等。可惜的是我并没有静下心来完善进阶部分,这个问题实际贯穿了整个学年的学习,后面会做分析。
-
开始使用Linux操作系统
这也可以算得上是一个重要的节点。起因是我在学习MIT Missing Semester时,本意是使用VM来学习Shell,然后就碰到了该死的 “没有正确卸载VM” 导致的一系列问题(历史遗留问题.jpg)。在给
PC0
几次重置重装系统无果后,一怒之下,我就看着网上的教程和资料给PC1
(PC1
的Win11对VM的兼容性也不好)装了双系统(Ubuntu22.04 + Win11) -
自学CS61A
这可以称得上是“斯大林格勒”了(好吧其实没那么夸张),看这门课时我和csdiy第一贡献者的感想是一致的。
下学期
-
在导师的邀请下开始试图参考网上大佬的项目使用FPGA来“手搓GPU”
可惜我对硬件方面确实没有太大的兴趣,加上缺少这方面的基础与我对自身学习进度的认知偏差,导致我在一些不必要的地方“浪费”了很多时间。因此这个项目在现阶段而言对我的帮助我个人认为十分有限。
5月份
-
构建了自己的第一个个人站点(这个才是真正的“斯大林格勒”)
站点背景图片来源:为生而战,向死而生 | 何春秋-宙道分身(图片作了分辨率处理),已获得作者授权:
在正式踏上自学之路后不久,我一直在探索能够高效整合信息/资源(人话:记笔记)的方式,特别是在五月份受导师邀请开始“手搓GPU”后,单位时间里需要接收的信息量越来越多,脑子里能留住的有效信息却越来越少。最后思来想去还是发现使用CI/CD
工具链构建的个人站点最合适。
这里要特别感谢学校技术协会的大佬,对站点建设提供了一系列相对现代化的构建建议。
建站后在协调大量信息的存储与分类时我也遇到了不少麻烦,包括但不限于如何选取合适的主题/文档构建工具来使博客更加美观且实用;哪些构建工具/框架适合用于笔记以使其能够被高效地回顾、查阅等,这些我们后面再谈
-
自学CS106L
这是建设了个人站点后的第一个具有相对完善笔记的自学课程,我快速过了一下,其中大部分的Assignments还没来得及做。
-
开始使用Arch Linux作为主操作系统
因为我是南梁使用了近半年的Ubuntu,终于还是对Arch动心了。这篇文章记录了一些我在安装过程遇到的一些要点与问题。
-
创建项目3BodySimulator
这是我个人为学习C++项目构建与管理而创建的案例式项目,学习的知识主要聚焦于cpp项目的构建流程与CMake等工具的使用,代码逻辑的所有内容以及项目架构的部分内容由AI代为完成。
按照惯例(自从有个人站点后,我有随手为自己的项目写文档的习惯,特别是用于学习的项目),我也为此写了一篇解构文档
-
转专业拟接收名单公示,不出意外的话就是成功转入网络空间安全了
转入网安主要还是因为我们学校这个专业后期课程量相对较少,算是为未来的自己争取到了一点时间吧
6月份
-
进一步完善了Git的学习
说的难听一点,对于Git在此之前我可能只会“三板斧(
add
、commit
、push
)” -
基本明确自己的努力方向——围绕自动化与云原生;目标岗位基本明确为后端开发、服务器开发、自动化类岗位(构建开发、测试开发等)三者或类似岗位
这也是一个看起来并不起眼但却十分重要的一个节点,它标志着我一年以来“内耗式”学习的终结,其中问题与经验我们后面再谈
问题所在
是时候进入最为重要的问题总结与纠错环节了,错误本身并不可怕——可怕的是缺乏面对错误的勇气与意识
学习方面
一系列“左倾”错误导致的连锁反应
这是一个系列问题
由于是系列问题导致的连锁反应,以一种自顶向下的方式来分析问题就会稍微方便且清晰。下面的流程图将问题之间以及问题与其导致的后果以图的形式从实际问题中抽象出来,以便后续的分析与解决(本来想用mermaid的,但写了半天发现渲染不出来,最后用的文档扫描转图片):
图中的分析虽然不尽完美,但已经把一年以来最为主要与急需解决的问题以一种抽象的方式总结出来了(毕竟这是我第一次采用这种分析法分析问题)
外因的情况较为特殊,同时其对自学的影响已经不再是实质上的影响了,这里简要说明
-
外因(环境因素)
在暑假和上学期,我的独立自主学习意识十分薄弱——这里的“独立自主”不单指学习积极性,还包括对信息收集能力、自主规划能力、信息整合分析能力的重视度。如果单单只有满腔热血,在当今互联网信息良莠不齐的时代这一点反倒更有可能成为自学时致命的缺点,在网络广告的诱导下差点陷入“跟班”式学习(那就不叫自学了)的陷阱就是一个再好不过的例子。然而这种能力似乎真的看个人——或者说需要时间沉淀;同时,国内的计算机教育与网络环境懂的都懂,下面两张截图的对比(前后分别是同一搜索对象,未使用科学上网工具、国内版edge的搜索结果与开启了科学上网工具、chrome的搜索结果)就是一个例子:
或许是因为在高考结束前压根就没有自学计算机的环境,导致我刚开始时一直在试错与走弯路;虽说在高考前我在朋友的帮助下对计算机的行业信息与国内的本科教育现状(特别是计算机方向)已经有了初步的了解,但说实话,真的只是冰山一角,一方面缺少科学上网工具,另一方面没有那种明确目标的意识,二者在CS的学习中都是十分致命的问题,特别是自学。
将问题归结到环境上并不是推卸责任,计算机这个行业本身就是一种高度依赖环境且需要持续浸淫的的东西,没有日积月累的沉淀与深耕是不可能有真正意义上技术成果的(实际上大部分领域都是这个道理,但是计算机领域介于其学习资源获取方式的特殊性,相较其他领域或许两极分化更加明显),这是基于我一年以来对身边技术朋友的观察得出的结论。
针对外因,只要学习积极性不变且有一台(可联网的)计算机可以操作,其影响会随着经验的积累而逐渐减弱。自高考结束后,“中式教育”的高压约束不复存在——相反,这时我的父母反而会十分支持我,哪怕我没有成为他们希望的模样。已经流逝的时间无法挽回,与成为真正大佬的差距现在只能靠在日常多花数倍的时间沉淀来弥补
简单来说,高考结束后,外因也就转化为内因了,即条件/环境与学习需求的矛盾转化为了自身学习能力与期望效率之间的矛盾,但前提是校内学业压力的可控,否则学业问题会消耗很多时间。
事实上,这幅图主要还是聚焦于“内因”的分析,同时还有一个类似递归的节点关系——这点我没有处理好,导致其有点难以理解:
注意图中有一个名为“内因”的节点G
,与我们所言的内因实际上是一个东西,可以简单将其视为除外因(F
)节点外,对图中其他所有节点的封装——它的位置与关系或许不恰当,但它想要说明的问题是:内因综合在一起本身就会加剧学习/信息整合能力低下的问题,而且由于学习积极性高涨,学习需求强烈,后者又会加剧前者中“内耗式学习”与“急于求成”的问题,从而陷入一个巨大的恶性循环。
现在注意力来到这幅图抽象出的“最本质”的问题,即分属于两个核心问题的四大矛盾:
-
学习规划上具体方向不明确
-
学习需求与个人认知之间的矛盾(因果)
-
信息过载与有效筛选之间的矛盾(因果)
-
-
学习进程上急于求成
-
个人实际能力与期望能力之间的矛盾(因果)
-
学习行为与学习规律之间的矛盾(原理)
-
现在就不难发现,所谓的“左倾”,指的是在学习进程上急于求成,而忽略了个人的实际能力;另外,缺少高效的信息整合方法也是这一年以来学习方法问题上巨大的痛点,但这也需要在漫长的学习过程中总结转化,与“急于求成”的学习行为也是矛盾的。
至于学习规划上的问题,两个矛盾甚至是问题本身的指向就已经十分明确了,一是缺乏认知;二是未能高效、合理地筛选信息——这就回到刚刚说的个人能力的问题了,也需要时间进行学习转化。
值得庆幸的是,经过一年以来的摸爬滚打,对于学习规划上的问题,我已经积累了足够的经验,以至于我在写这篇复盘前的一周便彻底明确了自己的努力方向,这在做了什么中也有所提及。
至于“急于求成”的问题,抛弃不切实际的幻想,脚踏实地走好每一步是最核心的解决方式,同时还需要与后面的提到的几个问题相结合——静心学习、“玩”与“学”的边界。
时间实际利用率低
这个问题除了上面所说的“效率问题”,还有一部分是作息安排上的问题
作息不规律导致的时间浪费也是一年以来学习规划上的痛点,同时我的身体健康也因此受到了不小的影响
学习过程中难以静心
这个问题除了上面图中所说的“急于求成”以外,还有一个原因就是我玩心本来就挺重的(“玩心”这种东西懂的都懂😋),对于自己感兴趣的领域,我总是喜欢“超前”地了解些新东西。
对于这个问题,辨证地看待它不难发现,它在我刚开始自学的那段时间客观上促进了我摆脱“跟班式”学习的陷阱;然而随着学习进程的推进与日益增长的信息量,这个问题对我的影响开始由利转弊了——它开始成为我高效学习与整合信息的障碍(黄金替罪羊.jpg)。有意思的是,这个问题在我高考前的应试教育学习阶段也是一个十分突出的问题,只不过当年的我还是太年轻,没有及时系统分析自己在学习方法上存在的问题。
对于现阶段如何解决这个阻碍,除了下文提到的学与玩的边界外,还可以专门腾出一部分时间“顺其自然”,把它当作是一种“预习”——将这个行为利用起来,而不是尝试去克制、抹杀它。对于源于本性的问题,想要在短期内快速解决,“大禹治水”式的方式是最合适的。但仍需注意时间安排的问题,或是说是一种“划分”问题——这就与下文联系起来了。
实践方面
“闭门造车”
主要问题是在开发实践中脱离实际,过度“独立”,团队协作意识薄弱,团队协作开发技能(如Git分支相关操作、代码审计等)能力低下
一部分的原因大概就是因为我在转专业前不是计算机专业的学生,离我最近的那些人都没有技术意识吧。总而言之就是缺少那种氛围,周围几乎没有人能和我协同学习或搞开发。
未能清晰划分“学”与“玩”的界限
这个虽然是前面分析一系列“左倾”错误时那副关系图中提到的一个节点问题,但我认为有必要就学习规划的角度将其拿出来讲一讲。
“玩”与“学”的关系其实是很微妙的:在技术领域(其他领域我不知道),二者可以相得益彰,但也可以“相克相制”,取决于规划的方式与规划者的自制力。倘若玩的东西的实际意义不大或是与“学”的关联性较低,那么这种“玩”就与学无益——最多提供些情绪价值。
对于我过去一年以来的经历,前者的占比似乎不大,这是效率上的问题;而后者就有“好高骛远”的嫌疑,这也和前面的分析一致。
解决方法有两个:一是在学某个模块的内容时专注于“玩”这个模块的内容;二是彻底分割二者的关系。两种方法各有利弊,前者专注而略显枯燥、后者灵活而略显低效。对于后者,还有一个“改良版”——结合两者的特征,同时存在两个“玩”的内容。因为仍需划分“学”与“玩”,故本质上还是后者,且对规划能力与自制力的要求高。
经验总结
其实前文都总结得差不多了,不过这里还有两个经验需要补充:
一个在明确自己努力方向时的发现
在分析部分互联网大厂的JD时,我发现校招的任职要求更多指向计算机基础知识,而社招才更加注重工程或业务能力。那么我们不妨大胆推测——对于像我这样高考结束后才开始接触技术而缺乏技术沉淀的人,扎实的计算机基础或许才是更加稳妥的大厂敲门砖。
同时,二者的侧重点的差异在学习规划(对症下药)上也是一个互补的参考:对于同类岗位,校招JD天然地适合用于基础学习的参考;而社招JD就适合工程/业务能力的学习规划以及相关项目的参考。
另外,校招过程中HR似乎对学历的重视程度较高,对于我们这种 建专 水平较为一般的院校,在初筛就被投入“人(la)才(ji)库(tong)”的风险显然要比双一流与92高;又因为缺少技术沉淀的时间,想靠优秀项目破局的希望也很渺茫。这时就需要考虑是通过考研提升自己在学历上的竞争力、同时 多走三五年的弯路 为自己争取到多那么三五年的沉淀时间;还是通过竞赛奖项来破局。但想要在竞赛上获得比较明显的优势,往往需要花费大量的时间备战。这是一个值得思考与权衡的问题。
站点构建工具与主题的选择
这是在通过搭建个人站点来整合信息时总结得出的经验,对于我这样的初学者也是一个容易走弯路的地方,我在这个地方至少“浪费”了近一个月的时间。
长话短说,首先来看一些工具——我目前调研过的构建工具有四个:Hugo、Hexo、Material for MkDocs和VuePress,其中前面三个我都用过,第四个简单看了一下。
我个人的建议是,针对博客等非信息密集型且注重美观的文档或站点,可以使用前两个构建;同时,Hexo会比Hugo更加成熟一些,大部分第三方主题对前者的支持会更好,但是容易出现依赖问题,且可能需要手动解决。因此建议小白用Hugo,有一定经验了再迁移到Hexo。
而对于类似学习笔记这样结构复杂的信息密集型文档,建议使用Material for Mkdocs(一个基于Mkdocs的主题,后面所提到的支持PyPI集成是指可利用其进行插件开发)。其社区支持十分完善,且支持PyPI集成,可通过自行编写Python插件自定义样式。csdiy就是使用其构建的一个站点。
VuePress我倒是没使用过,不过通过观察使用其构建的文档,我个人认为它适合用于构建结构相对没那么复杂的单主题的信息密集型文档,如某个中大型项目的使用文档。
新的开始
新的学年,不出意外的话,我就是网安专业的学生了。芜湖~水课水课逃逃逃!😋
在大二,计算机的基础学习与竞赛或许会成为我的主旋律。在《葬送的芙莉莲》中,魔法使兰托在一级魔法使选拔考试上曾对自己的对手说过这样一句话:大部分自学成才的人基础都不够扎实——希望能够成为剩下的那小部分人。
对于基础学习,重点放在操作系统与计算机网络及二者的延伸内容(如分布式系统、并发等)上,最好能手搓一个内核和TCP/IP协议栈。我总有一种感觉,就是我目前的实际开发能力极其低下的一个很重要的原因就是对操作系统的原理几乎完全不了解。
最好能把“程序员的三大浪漫”(操作系统、编译原理、计算机图形学)也过一遍。
另外,在新的学年快要结束之际——明年的这个时候,需要根据基础学习的进度与状态决定是否需要备战考研,但要尽量避开这个方向——我是真的不太擅长考试且极度厌恶死记硬背。
当然,工程/业务能力也要尽可能不落下,特别是这学期分外重视的项目标准化——当然,我这里想表达的东西或许还有一个更专业的术语——软件工程。
END
说些什么吧!