世界上最难的事情是,长大以后的你还在坚持着实现小时候的梦想;而更难的事情则是,你真的实现了小时候的梦想。10 年前的那个孩子怎么也不会想到,10 年后的他自己竟然真的成为了他梦想中的那个样子......
不知道为什么,从小就对计算机这么一个冰冷的东西情有独钟:我热衷于探索 Windows XP 控制面板中的每一个选项,与 Windows 搜索的吉祥物 Rover 做朋友,研究光驱和 3.5 软盘驱动器(是的,3.5 软盘!)的使用方式 —— 即使在那个计算机还没有普遍连上网的时代,我依然愿意探索计算机中的每一个角落。
当然,这可能和我喜欢玩计算机游戏有关,在那个网络并不发达,移动通信技术仍停留在 2G 的年代,我很有幸玩到了一些“最新最热”的 3A 大作:从帝国时代到命令与征服,从幽灵行动到 CS 1.6 ,从植物大战僵尸到大鱼吃小鱼...... 他们来自于我父亲的 U 盘,我至今也不知道,一个并不怎么玩游戏的男人,是从哪里整出来的这些“宝藏”(我唯一见过他玩过的游戏,是一款运行于远古三星手机中的类似于“雷电”的闯关游戏),这些游戏构成了我的童年,也间接构筑了我对计算机的启蒙。
小学六年级的时候,认识一位同学,是一位 C 语言大佬(至少在当时的我看来,是这样的),即使小学毕业后就不再联系,但我至今还记得他的名字,作为一个没有任何计算机程序语言基础的小学生,我自然试图向他请教如何学习这样一门伟大的语言,于是,借得一本《啊哈 C 语言》,囫囵吞枣一通,虽从未上手(因为家里人很少让我玩电脑),但好似懂了(?),这也便成为了我的计算机程序语言启蒙。其实说看懂了那完全是搞笑,一个小学六年级学生怎么可能通过不到一个月且毫无实践的理论学习就上手 C 语言,实际上根本没懂。
后来不知道咋回事,染上了 CMD ,这个是真有实践,@echo off
起手,ping 127.0.0.1 -t 10
一把梭,很显然脚本语言本身的简单性给这个试图深入计算机内部的外行小子了一点小小的安慰:你看,我会用 shutdown -s -t 1
关闭电脑,厉害吧!
但是毛头小子对脚本语言的了解也就止步于此了,他甚至看不懂任何流程控制的语句,连最基本的选择都不会做,可谓是浅尝辄止。在这期间,我还买了一些适合小屁孩的 C 语言的入门书籍,也了解了一些 C 语言的基本概念(比如指针,数组什么的),但总体来讲,还是不会写,理论上是个矮子,行动上还不如侏儒。
后来我很快就失去了对前二者的兴趣,来不及为他们悲伤,因为接下来闪亮登场的是:Java 。我跟 Java 的孽缘全部来自于一款风靡全球的视频游戏:《當個創世神》,如果你从未听过这款游戏,那么它还有另一个更加通俗易懂的名字:《我的世界》。
Minecraft 几乎贯穿了我人生的前 10 年,这款游戏几乎成为了我的命根子(你甚至可以看到我的网站域名以它命名),陪伴着我度过一个又一个的寒冬。很显然 Minecraft 在 PC/Mac 上是一款 Java 开发的游戏(如果你是游戏行业的从业者且不知道这款游戏,请千万不要震惊,即使很颠覆三观,但确实如此),因此,Java 成为了我想要学习的首选语言:因为我想开发一款属于自己的 Minecraft 模组。
于是开始接着买书学习,刚开始买了 Boardview 的《 Java 7 基础教程》,现在想来依然震惊,这本书区区二百多页,却从 Java 基本语法,Eclipse 的使用讲到了使用 Swing 开发一款使用精灵动画的简单电子游戏。想都不用想,这么激进的学习路线对于一个初中生自然是不可能的(即使这本书信誓旦旦的告诉读者,它适合任何一个没有接触过计算机程序语言的初学者),只能一脸懵逼的进去,一脸懵逼的出来。
我觉得我学不明白这些东西的一个核心原因可能是,我的英语成绩很差,我根本看不懂这本书没有本地化的 Eclipse 截图上写的是什么东西,再加之这本书本身就老,我当时使用的 Eclipse 版本的某些操作已经和书上的完全不一致(甚至是下载页面),因此让我很摸不着头脑。当然,现在的我可能都会对以前的我嗤之以鼻,这不完全是按图索骥,照猫画虎的行为吗,可是,对于一个初中生来说,确实不应该过度要求这些就是了。
讲真,虽然我接触 C 语言比较早,但是我从来不会说我学习的第一门语言是 C 语言,同理,我也不会说我在初中就学会了 Java 。真正让我开了窍的,是清华大学出版社出版的那本名为《 Java 从入门到精通》的书。
这是我买的第一本页数超过 800 页的计算机程序语言教程书,不得不说贵的东西就是好,不知道为啥,这本书直接给我看懂了(也许是因为高中英语水平好了一些?),从那之后,我开始能够写一些简单的玩具程序,也试图在 Minecraft 中编写服务端插件。再往后,又阅读了鼎鼎大名的《 Java 核心技术》上下两卷,当时还是面向 Java 8 修订的版本(很幸运赶上了 Java 8 ,不然我可能要错过 lambda 表达式、Stream 等一大堆解放生产力的东西了),这个时候,我对 Java 可以说算是比较了解了。
但说实话有一个瓶颈一直困扰着我,我当初学习 Java 是为了开发 Minecraft 服务端插件(我一直在开 Minecraft 服务器,开发这些插件一方面是为了拓展我服务器的玩法,一方面,我也可以籍此挣点外快),事实上我确实这么做了,而且做的比较成功,但是...
这导致我只会开发 Minecraft 服务端插件。
听起来好像挺奇怪,我会写某个领域的特定程序,但却不会写通用程序,但这就是我当时面临的窘境。另外一个窘境则是,我只会 Java 这一门语言,但 Java 这门语言在图形界面程序这一方面又完全残废(我当然试过 Swing 和 JavaFX ,我相信用过的人都深有体会他们相比现代的解决方案有多么的难用),我无法使用 Java 来开发任意一款图形程序,甚至是网页程序(因为我根本不懂 Web 开发)。
于是,我决定...
学习 Kotlin (准确来讲,是 Kotlin/JVM )。
好吧,人其实还是很难逃离自己的舒适圈的,我有尝试学习 C# WPF 之类的技术,但是对当时的我来讲还是太难,太云里雾里,但是 Kotlin 就对我比较亲近 —— 毕竟它和 Java 同宗同源,都有一个名为 JVM 的妈。
很幸运,我学得很快,Kotlin 也成为了我用得不错的一门程序语言,甚至在一段时间内,我使用 Kotlin 的机会远大于使用 Java 的。
然而我还是只会写 MC 插件。
所以,我开始自学 Spring Boot ,并在大一的时候取得了一些成效,至少我弄懂了 MVC 到底是个什么东西,后来,我又慢慢明白了什么是“控制反转”,什么又是“约定大于配置”。
我觉得一个优秀的软件工程师不可能只会后端和前端的其中之一,相反,只有了解另外一个,才能更好的了解自己的这个,对我来说更是如此,因为你无法创建一个可以给用户使用的,不包含前端的纯后端应用程序 —— 除非你的客户喜欢对着 telnet 客户端人力输入 HTTP 请求头和载荷。因此,我学习了 HTML ,后来又学习了 Vue ,但至今也只能说会用,并不能说懂了。
嘿,但至少我们不再是一个只会开发 MC 插件的小朋友了,不是吗?
上了大学以后,其实学习这些东西的时间就多起来了,我一直期待着这一天,但很遗憾命运似乎并不想让我过的一帆风顺,因为我大学学的根本不是计算机专业,而是和计算机半毛钱关系不搭的金融专业。
说句公道话,其实金融专业也是需要计算机的,我们甚至有一门 Python 数据分析的课程,用 pandas
和 matplotlib
生成一些花花绿绿的图表,那门课我拿了 90 多分,可能是我大学期间拿过最高的课程成绩(当然这门课只需要交大作业,不需要进行期末考试,不然得有一大票人挂科)。
你可能会问,你怎么又会 Python 了,上面也没说啊?其实当你学会了一门程序语言以后,学习其他程序语言就不再是问题,再往后,我基本是有需求就学,学完了就直接用,PHP 如此,Go 如此,Rust 更是如此。
然而瓶颈和焦虑又来了,我看起来会这么多程序语言,但是,横向发展对于需要深度单一技能的用人单位来讲,根本没有用啊。我对于 Java 的理解仅限于语言的使用层面,我不了解反射,不了解 Unsafe ,不了解类加载器,更不了解 JVM ,光会用某一门语言,这大家都会,甚至很好学,你能有什么核心竞争力?
想到这里,痛定思痛,遂在京东斥巨资买下《深入理解 JVM 字节码》和《深入理解 Java 虚拟机》,打算一年内读完,成为 Java 领域大神。
然后,第一本书我其实是大二寒假才读完的,第二本书更是拖到了今年年初,在北京实习的时候实在闲着没事儿才看完的。
Dunning - Kruger Effect 告诉我们,一个人的自信程度和其掌握知识的关系大概率会遵循如下的曲线:
很遗憾,大二的我成功陷入了“愚昧之峰”,以为自己的能力十分不错(尤其是在一个根本没有人跟你交流的环境中),甚至可以轻松进互联网大厂了,于是,大二下学期至暑假期间,我开始用我自己可笑的简历和经验投递大厂实习,幻想能够成为大厂的一员。对于一个四非+非科班的学生来说,他最喜欢的后端岗位肯定是跟他无缘的,因此他识趣的选择了测开岗位进行投递,而可能是因为九月份暑期实习结束,大厂缺少实习生干 dirty work ,在大三上学期刚开学没几天,这位自信过头的哥们收到了自己人生中第一份大厂面试邀约,而这家大厂,叫字节跳动。
也不知道我当时哪里来的勇气,一年后的我才发现一年前那个混小子竟然投的是“测试开发实习生 - 系统架构”,也难怪问的全是各种底层问题。
你可能会以为后来的剧情是我因为啥也不会导致一面挂,然后意识到自己能力的薄弱。
然而事情恰恰相反,我竟然通过了第一轮面试和第二轮面试,成功进入了主管的业务三面。
正常情况下三面应该都不怎么挂人,主管也不会问太叼难的问题,毕竟前两面已经把你摸得八九不离十了,主管也就是走个过场罢了,所以那时的我已经开始在想怎么逃课去实习了,结果,三面狠狠的扇了我一巴掌。
问的问题倒也不是多难,但是最后一道编程题是这样的:编程题:我有一个包含 N 个 bytes 的 Byte Buffer ,请输出该 buffer 中全部 bit 0 的个数。
这不很简单嘛,循环+位运算就可以得出答案,我只需要... 等会儿,位运算???
你可能无法想象,一个字节面试进入三面的人,竟然完全不会位运算,接下来的半个小时,我只能面对主管失望的眼神,不断地写一些奇奇怪怪的代码,期间不断狡辩是我太紧张了导致不会写,最后结束了这场面试。
不出意外的,一周后,收到了感谢信。
讲真,或许是自我催眠,直到这个时候,我依然不觉得我的能力有系统性的问题,只觉得是三面某些地方没答好,导致面试没通过。
然后两个月后的快手测开面试把我打醒了。
直到现在我依然认为字节的面试很有意思,八股问的不是很多,都是一些很开放的问题,我也时时刻刻能通过我自己的经验之谈给予面试官一个似乎满意的回答。
但是快手面试,纯纯是八股拷打,而那时候的我,从来就没有接触过一点八股。
从 JVM 内存区域到线程的生命周期,现在看起来很经典的一些问题对于当时的我来说完全不会,半个小时的面试中 20 分钟是面试官的劝退,建议我菜就多练。
这个时候我才知道我的基础是有多薄弱。
我意识到,我根本不懂计算机,我不懂八股,不懂算法,不懂计算机体系结构,不懂操作系统,不懂计算机网络,什么都不懂。
我只是一个有一些应用层经验的可怜人罢了。
而了解到我差的有多远以后,我确实是有一些绝望了,因为我似乎没法在有限的时间内学明白这些东西,时间似乎已经太晚了,而如果拿不到大厂实习,就意味着秋招完蛋了,秋招完蛋了,就意味着我完蛋了。
在绝望中,我不得不拾起这些我之前完全没接触过的东西,开始假装是一个普通的计算机专业学生,从零开始学起。
先是计网,然后是计组,再是操作系统... 直到我学会 Java 的 5 年后,我才意识到计算机其实是这样一个东西,而操作系统又扮演者那样的角色,这些知识也间接地解决了我过去遇到的一些疑惑,并让我对另外一些事物产生了新的思考。
说起来我的学习路径挺奇怪的,别人是自下而上,我是自上而下,我总是先对某一个东西有一些经验之谈,然后才是深入的学习。但从另一个角度来讲,这些经验无疑也是宝贵,它们比流水线式的标注答案更加深入,也更容易产生自己的理解;同时,这些经验还是需要长期实践才可以得出的,不可以被单纯复制的(还记得初中的时候,英语老师突然指着我们英语书上的一张插图,问这张插图上的计算机存储介质叫什么,在所有人面面相觑的时候,只有我在旁边小声的说了一句:3.5 软盘)。
也许是我的努力感动了上天,在字节二战无果的一个月后,今年 2 月,我收到了蔚来测试岗的面试邀约。
讲真,我是 1 月在 Boss 投的简历,2 月电话打过来的时候我还有点懵逼,我甚至不知道是哪家公司发的邀约,而接到电话的我当时还正在外面和高中同学瞎逛,二话没说就把面试推到了两天以后。
并不是不重视这场面试,而是当时处于“绝望之谷”的我,根本就不觉得我能通过面试。也许是一个月的特训有了结果,也许是老天爷似乎确实是喜欢捉弄我,我竟然顺利的通过了所有面试,并拿到了蔚来的实习 offer 。
这是我第一份来自大厂的 offer ,也将是我第一次孤身前往另一个陌生的城市居住生活的修行。
说实话,我对“进大厂”这件事情有一种宗教式的狂热,就像基督教徒对于前往耶路撒冷的狂热一样,我时常幻想着“四非非科班秋招拿下大厂 offer”这样一件换了谁都得树个大拇指说声牛逼的事情在我身上发生。对于进蔚来之前的我是不敢想象的,但是现在,我似乎可以想一想了,而对于之后又“跳槽”去百度的我来讲,进大厂更是好像“唾手可得”的事情。
但苦难是永远不可能结束的,给你一颗糖的下一步永远是接着打你一巴掌。在 2024 年暑期实习中,我全部的 5 个岗位全部没能走到最后,最多也不过走到二面,而字节跳动更是一面挂,而后来的秋招证明这个一面挂对我影响深远,导致在字节疯狂约面的秋招中,我喜提面评太差无法进入流程的待遇。
于是经过几个月的磨练,付出了一些成本以后,我终于有足够的资本面对秋招,这样一个足以改变你下半辈子的地方。
然而众所周知,四非=坐牢,四非+非科班=坐死牢,我的秋招和我预想的一样,并不是那样的一帆风顺。
秋招虽然是金九银十,但其实七月很多公司就开了提前批了,也许又犯了“臆想自信症”,我以为我提前批有足够的优势得到一些面试机会,于是对于一些提前批和正式批只能选择一个批次报名的公司,我依然毅然决然的挤进了由双 9✌和海归✌组成的提前批队列中。
想都不用想,整个提前批流程中我没有得到一场面试机会(虽然只投了 20 家公司)。
随后便是正式批了,从八月开始到九月底,陆陆续续投了 130 多个岗位,其中大部分都死在简历挂,28 家进了笔试,9 家进了面试。
刚开始约面的是两家自研独角兽小厂,微派网络和元戎启行,微派问了一个小时,以为很稳,结果一面挂掉;
然后是快手和老东家蔚来,快手二面算法没做出来,泡了一周给了感谢信,蔚来不知道咋回事,两面都没咋问啥,然后给我挂了,鉴定为 KPI ;
再接下来是灵犀互娱和深信服,灵犀互娱聊的挺好,结果 HR 面完了以后泡池子,泡了一个月还是没出来(中间已经泡出来了一批,估计是没戏了),深信服比较抽象,线下面试走到了终面,结果给我转岗到测开了,直通终面,聊的还行,结果前几天挂了;
最后是滴滴和腾讯云智,在经过不断的拷打和折磨,三年的焦虑和努力...
我终于能够为自己的努力画上一个休止符。
其实有一个点有点意思,云智是我面试聊的比较好的一家,但意向出的反而比滴滴晚;滴滴三面面试官把我整破防了,结果却是第一家给我发意向的公司。
到这里,我的故事差不多就告一段落了,两家 offer 中我大概率会选择云智,因为云智是后端岗,而滴滴是测开岗,实在不想干测开,比起凤尾我可能更愿意做鸡头。其实人总是贪婪的,以前的我想着只要有计算机相关的工作就好了,后来我又说只要给我大厂实习我就满意了,再后来又变成了秋招有大厂要我我就满足了...
写到这里,其实是有一些感慨的,我一直是不被周围人理解和支持的那一个,即使到现在,也会被父母认为是“不务正业”,加之周围没有人能跟我谈论这些技术内容,这么多年来,大多数时间我都是自己走过来的,说真的,这非常需要勇气。真的很像感谢陪伴我走过来的网友,是你们给予了我无限的动力,才让我有了现在不错的结果。
之前特别喜欢发一张表情包,表情包内容是:“我这一生如履薄冰,你说,我能走到对岸吗”。
现在我至少可以自豪地说,在人生的冰面上,我至少成功的迈出了属于我自己的第一步。
仍记得 23 年的生日总结,在每年例行的“下一年展望”环节,我只写了一句“让我有大厂的班上吧”,一年后的今天,也许我真的即将实现这个愿望,而明年的此时,我或许已经在我理想的公司工作,并朝着属于我人生的下一个目标前进...
这就是我的故事,一个属于 21 岁本科大学生的故事,一个“勇气”的故事。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.