曾经沧海,又到沙漠,四千里外关河
骨相空谈,肠轮自转,回头二十年过
前言
临近放假,心猿意马。坐在空荡的教室,无心敲代码。过去的两年在我脑海中浮现,突想记录一下这两年的经历,也算是给将来的自己留下回忆。
正文
开端
告别水乡,飘向西北。
我是2019年入学,普通双非的计科专业。大一上给我的记忆并不多,想来原因在于一是初来大学,懵懵懂懂,每天似乎匆匆忙忙,但其实什么也没干。二是自己性格使然,不喜热闹,所以没有参加任何部门社团什么的,大一上是在没有社交,沉迷游戏的情况下度过的。
第一学期的课还是很轻松的,和编程相关的只有一门C语言,其实早在初中时就自己接触过C语言,但控制台的黑底白字打消了我深入学习的兴趣,学习也仅停留在了printf。
最早接触到编程可以从小学说起,那时候因为游戏外挂而了解到“易语言”和“按键精灵”,许多人都没听过,后者作为脚本语言印象不深,前者在当年那是大名鼎鼎的中文编程语言。可视化的拖动组件并用中文编程,简单快速的上手,照着教程可以马上做一个计算器,对小学生的我来说是一件很酷的事情。
成也萧何败也萧何,或许是极低的入门门槛和“中文的限制”也导致了大型开发的难以维护,从始至终都没有企业采用它开发软件。对语言本身不作评价,我也没有资格评价一门语言,但易语言的创始人吴涛的经历,绝对值得在中国软件发展史上留下印记。
以现在来看,当时对编程的接触都只是蜻蜓点水。视角转回大一,C语言学起来还是很轻松的,当时的我甚至对C语言有一丝轻蔑,认为它太简单了,现在看来还是太年轻。
一段时间后我才明白,任何语言都是极易上手的,都逃不开变量、赋值、选择、循环和函数五大核心,现在我可以半小时内上手大多数语言,但那只是语法层面而已,仅此而已。
正所谓一通百通,小时候常觉得那些会几国语言的人很厉害,现在想来其实也没什么。编程语言也是语言范畴,只不过语言的对象是计算机,在精通了一门语言后,其他语言只要你想学,可以说是手到擒来。如果你觉得并非如此,那可能是你认为的精通就是语言里的函数用的滚瓜烂熟,那就大错特错了。无知者无畏,我想我当时对于C语言的轻蔑也来源于此。
使我观点改变的事件是我偶然接触到一本书《C陷阱与缺陷》。虽然仅草草阅读了一小部分,但对当时的我来说极为震撼,原来那个我看不起的C语言里面还有这么多门道。
不知不觉到了期末,C语言的考题还算简单,查分时看到90+的成绩,短暂的开心后竟是不可名状的失落,一场无趣的大学考试,那似乎并不是我想要的。黑底白字的控制台好像囚禁了我,我想逃出这束缚,思想悄然发生了转变。
迷茫
大一下因为疫情原因,是与网课度过的。看着课表中竟没有一门与编程直接相关的课,顿时失去了兴趣。不过其中的离散数学在期末紧张刺激的预习中我get到了一些趣味,在此后学习的数据结构和数据库等等课程中都有它的影子,不过那是后话了。
闲散的居家生活,随之而来的就是网课基本没听,后面干脆睡懒觉用电脑挂网课。醒了就和高中同学一起开黑打游戏,作息直接颠倒,熬夜是那时的常态。那两个月在steam接触了众多游戏,游戏时长从几十飙升到七八百小时。
如果让我重来那段时光,我还是会选择打游戏,没有什么后悔的,因为那是我找不回的快乐。最终的考试也是匆匆应付,大一也就不知不觉画上了句号,好像什么也没干。
那个暑假依旧过着天天打游戏的日子,慢慢的我发现我似乎不是沉迷游戏,而是喜欢和同学开黑的同时聊聊过去,怀念的是高中时光,和渐行渐远的青春。
大一下是和游戏度过的,转眼间大二。
坎坷
大二来临。
记得当时还发了个朋友圈,一个人坐着高铁来到离家2000公里外的地方读书,难免心生孤独感。
看着新课表里的数据结构和Java,还是有点小期待的,数据结构在大一的那个寒假在b站看过郝斌的视频,当时为了准备下学期的算法竞赛,不过由于疫情竞赛推迟到了这学期。
在听过学校老师的数据结构,看过韩顺平和左程云的数据结构和算法后,我心目中印象最深的老师还是郝斌,虽然他的视频是十多年前的,古老的xp系统界面充满了年代感,但他的讲解放到现在也不过时。
更重要的是,虽然他仅是个培训班老师,没有高学历,但他就是我的数据结构启蒙老师,一个朴实的如同二进制的人。在看他的视频时也了解了一些他的故事,有理想却不得不为生活奔波的普通程序员。想去了解他却仅有一篇短小的百度百科。
他是那个年代的程序员的缩影,中国的第一代程序员是悲壮的,没有光鲜亮丽,没有高楼大厦,就像刘慈欣在小说《2018》中描述的那样。
比起在当时的我看来单调的数据结构,我更喜欢新来的Java,早就听闻Java大名,小时候的翻盖手机里面有许多游戏一打开的启动界面就是一杯咖啡,现在才知道那是Java的标志。
面向对象的概念使我回忆起高中技术课学vb的时候,vb也是面向对象语言之一,但未对vb作过多了解,只给我留下了神似易语言的印象,不过准确的说是易语言有浓厚的vb风格。
当时对Java的理解现在看来都是粗浅的,Java似乎有用不完的类库,封装似乎就是函数外套了一层壳,似乎干什么之前都要先创建对象,那段时间new了不少对象。
学过C语音再过渡到Java是比较容易的,但随之而来的异常机制、线程并发、集合框架和泛型等等,一大堆语言特性轰炸了那个思想还停留在C语言的我。
如果把C语言比作是初恋,单纯而又刻骨铭心,那Java一定是成熟稳重却又复杂的虐恋对象。现在我才渐渐明白,Java不单单是一门语言,从业的程序员谈到Java时,其实指的是整个Java生态体系,它的广度和深度只有深入学习过才能体会到。
期间有一场算法竞赛拿到了省一,那是我第一次参加的比赛,尽管它远比不上ACM的知名和含金量,但我会一直记得它给我带来的喜悦,因为那是枯燥无味的coding中的一股激励。后续国赛虽然弥补了第一次国赛败北的遗憾,但早已没了那种最初的欣喜。
后来跟着老师做项目,可惜是.net平台,遂又开始学习C#。一个人的精力终究是有限的,当时在拿C++打算法比赛,Java也正处于学习阶段,半路又杀出了个C#,身心俱疲。
尽管语法都大同小异,但每门语言庞大的类库和各有特色的语言特性注定我是不可能通通吃下的。通过一段时间了解,明白各个语言的优劣和应用场景,再结合自身未来就业的考量,最终选择了Java。有舍才有得,主攻Java之旅开始了。
过了半个学期,数据结构在有之前自学的基础上学起来更像是复习巩固,很喜欢那种感觉,上课可以很轻松而自信。与之相反的是Java,虽然学了一堆语言特性,但总有种说不出的不安,那种像是学会了但又做不出自己想要的东西的感觉。我意识到仅通过上课学的知识是远不够的,遂开始了自学生涯。
先是看了浙大翁恺的Java视频,可仅是基础语法方面,后又去看了北航宋红康的147小时视频,打开了新世界大门,明白了很多细枝末节的东西。封装,继承,多态贯穿始末,面向对象思想是朴实而又自然的,恍然大悟的我像是武侠小说中说的打通了任督二脉。
这三大特性生活中随处可见,就拿汽车来解释封装,汽车的转向系统由方向盘,转向轴各种齿轮组成,把它们“封装”起来组成转向系统,转向系统对外只暴露方向盘,所以司机只能操纵方向盘而不能对底层的各种零件直接操作,这里的方向盘就是程序中所说的接口,零件就是被封装的底层源代码。司机只能操纵方向盘而不能直接控制底层零件保证了便捷和安全,同样的,封装的一段程序对外只暴露接口也是为了调用接口时的便捷和安全。
从最初的面向过程思想到面向对象,再从面向接口思想到框架的面向切面,往往越精妙的思想都是越朴素的。
Java中每一个模块独立出来都能出一本书,泛型思想的精髓只有在经历过web开发后才会真正明白,线程并发和锁的妙用到现在还半懵半懂,反射机制是框架的底层核心等等。
从此便一发不可收拾,没课就去自学新技术,周末一个人待一天空教室写一天代码,三点一线的生活后来演变成两点一线,食堂不想去就啃面包。印象最深的是有一次周末晚上,楼管阿姨推开门说小伙子要关楼了,一看时间竟晚上十点了,不知不觉敲了一天代码。
现在常怀念那种状态,那种不受任何影响可以一心学习新技术的狂热状态。也不曾想到一个网瘾少年也可以变成“码瘾少年”。
常常为一个许久解决不了的bug而忧郁失眠,也常常为瞬间学会新技术做出东西而兴奋,虽然过程坎坷起起伏伏,但自己能感受到不断上升的快乐,羽翼渐满的快乐。
在攻完了JavaSE之后,像是磨了一把锋利的剑,想马上试试成果,可打脸的是似乎还是只能停留在控制台。于是我开始在网上了解如何做一个项目,回答的都是一些我闻所未闻的技术,挫败感油然而生。
看了大牛的学习路线,我了解到我要先去学jdbc,jdbc学到一半又用到了sql,又跑去学数据库。等我都学完了之后,又了解到web项目需要前端知识,又跑去学HTML、CSS、JavaScript前端基础,后端服务器要用tomcat,前后端调用又用到计网里的cookie、session等知识,等等等等一大堆新技术,就这样折腾来折腾去。最终做出了一个书城网站,虽然用着现在看来“原始”的servlet,且核心仅是后台管理的crud,但那种成就感只有经历过的人才明白。
这段时期是我成长最快的时候,学习的动力也源源不断,原因在于学完新技术后的反馈是极快和显而易见的。坦白的说,那时候才是我真正体会到编程的快乐的开端。
期间又了解到牛客网,里面各路大神的面经让我意识到自己还是那么菜,那时才知道大厂的面试居然有三四轮,我看着闻所未闻的面试题不知所措。
原来我所学习的才只是冰山一角,计网和操作系统还没完整学过,我以为我熟悉的Java,它的底层源码一概不知。JVM还是第一次听说,还有什么缓存什么消息队列。我的脑袋炸了锅,这么多技术体系,环环相扣,好像永远也学不完。那时候搜罗了不少学习路线图,庞大的技术体系让我焦虑不已。
看着大佬晒offer十分羡慕,我鬼使神差的下载了招聘软件,花半个小时写了自己的第一份简历,投了一家小公司并约了面试。第一次面试是紧张又期待。Java层面问的却不多,只记得问了数据库的事务,ACID特性,接下来就是简历项目介绍,模块划分和具体用到的技术栈,权限管理。
最终也拿下了,虽然工资不高,但作为一个大二学生那是我难得的体验实际开发环境的机会。不过遗憾最终还是没去,看着每天满课的课表,无奈选择放弃。
大厂面试前一般要进行算法笔试,看到牛客大佬的简历上常有leetcode的字眼。不多说,开始刷题,刚开始是痛苦的,唯一的动力是Accept后短暂的兴奋。
从没思路需要看别人的题解到慢慢能有思路并用代码实现。印象最深的是一道动态规划,看完题意后瞬间有思路,一口气敲完代码并通过,那种前所未有的快感,能开心一整天。
我保持着平均每天六七题的速度,过了一个月题量到了200,激动不已的我发了一个朋友圈,像一个孩子炫耀自己的小小战果。
刷题是非常耗时的,一个没有思路的题常常需要一两个小时解决。我决定暂时放下leetcode,继续点一点自己开发方面的技能树。与此同时我开始写一些技术博客,原来把一个看起来简单的技术复述出来也是不容易的。
见效最快的框架阶段开始了,先从ORM框架入手,学完Mybatis后不禁感叹框架的便捷。然后是Spring全家桶,其实很早以前就学过一些,但当时难以理解“面向切面”,“控制反转”这些Spring概念,抽象晦涩的技术不知怎样运用到开发中。
但当我再次接触时,我惊讶的发现这些概念不点自通,经历过web开发后让我意识到解耦的重要性,“高内聚,低耦合”思想潜移默化的扎根心里。所以再次接触框架时才能理解框架设计者的良苦用心,框架的目的就是为了解耦和方便开发以及维护项目。
到SpringBoot阶段时,可以用一个字形容,爽!接着做了一个前后端分离的微服务项目,第一次接触Vue框架,第一次整合Redis,第一次运用Nginx反向代理等等,新的尝试一个接一个,最终完成了一个前后端共计约5万行代码的项目(前端多是cv大法)。
之后买了自己的服务器,装上了Linux,在熟悉了常用命令后我体会到了命令行的魅力,相比于图形操作系统,命令行更像是把计算机牢牢掌握在自己手里,听从自己的调遣。
后来偶然接触到微信小程序竞赛,在有了之前的技术积累后,小程序更像是一种玩具,上手是十分快的。
沉与浮
漫漫长路,唯代码作伴。
在极致的孤独笼罩着我的时候,她出现了,情不知所起,我的生活开始变了。波澜不惊的外在下是内心深处的惊涛骇浪。从欲言又止到飞蛾扑火,从你开始,到你结束。我用极端的理智压抑最深的执念,遗憾悲伤痛苦绝望不甘,让所有情绪来的更猛烈些吧。过往的点滴将永远封存在心里,随时间流逝,依然是永恒的白月光。
少年与爱永不老去,即便披荆斩棘,丢失鲜衣怒马。
精神世界由内而外的崩塌,一记重锤把自尊心压的粉碎,给我的心态来了一场大清洗。触底反击,丢掉所有束缚,我的脚步轻了许多。不是什么都不想要了,而是更加坚定自己的目标。
放弃幻想,重拾野心。
重新上路
至此,尽管仍然有很多没学过的技术,看着庞大的技术体系图,此刻我却不会像以前那样手足无措了。因为我清楚,上手一门新技术无非就是看视频看书看文档,更多的是一个学习工具使用的过程。
看着浩如烟海的技术栈,我恍惚间明白了。技术是永远学不完的,一个人的学习速度是跟不上技术的更新速度的。而我所依赖的语言以及它的技术生态不过是一个工具,至于我,只是一个工具的熟练使用者。
上层技术不断迭代更新变化,而底层思想永存!整个IT帝国的基础就是大学里的几门专业课,计算机组成原理、计算机网络、操作系统、数据结构、编译原理等等。
学生时代总是有一些偏执的,曾经我对这些长篇大论表示不屑,那是一个实践派对理论派的轻蔑,我能编写万行的web程序却不知背后的七层协议,我能写简单的并发却不知OS背后的线程调度,我熟练使用集合框架却不知底层源码对数据结构的封装,我……我不过是工具的熟练使用者。
猛一惊,原来在写代码时总感觉差点意思,而差的那点“意思”来源于基础领域理论的薄弱和对底层未知的限制。走走停停,一年前那个想挣脱控制台束缚的我,逐渐走向上层技术后,终究又回归底层。
这种感觉难以言说,像一个旅行者环游了世界最终又回到起点。一路风风雨雨,走过弯路踩过坑,突破一个个小瓶颈。从遥不可及到触手可及,浮光掠影的描写,背后经历的洗礼只有自己深知。
尾
合上电脑,告别一段回忆。
教室窗外的细雨慢慢停了,没有伞的我终于可以从容的走回去,脚步不快不慢,没有停下就是了。
写在最后
白驹过隙。仅凭有限的记忆写下此文,有天马行空,有轻描淡写,好在没有什么遗憾。以此纪念我过半的大学生涯。欢迎关注我的同名公众号【码农小奎】
分享编程经历与经验
和你一样一直在路上,一起野蛮生长吧!