关于双非本拿到字节offer的学习历程
本人通过秋招成功拿到了字节跳动后端开发岗的offer,在此总结下自己的学习历程,也算是对我整个大学学习生涯的一次复盘。
高考后的暑假 - 复盘期:
高考的失利让我崩溃,一度考虑复读。自闭了好一段时间才接受了这个事实,并开始认真反思自身存在的问题。
这次反思对我未来的大学生涯规划至关重要。我意识到一个重大问题,那就是我之前没有进行有效的规划。在高一和高二时,我一直凭借不错的成绩过着悠闲的日子,从未考虑过如何提升自己。直到高三,当我看到周围的同学都在全力备考,加之我并不算优越的模拟考总分时,我意识到自己落后了。我从那时起才开始认真学习,但这种临时抱佛脚的方式并没有挽救我。我最终也意识到了自己不是一个很自律的人,未能达到理想的成绩。
通过反思,我认识到了两个关键问题:
1.我需要一个清晰的规划。
2.我缺乏自律。要么强迫自己变得更加自律,要么尽早开始执行规划,拉长战线。
综合考虑下,我决定在大一阶段就确立自己的规划,并一直坚持执行下去。
大一 - 规划期:
我进入大一时还未确定自己的学习方向,主要在数学和计算机之间摇摆不定。通过与学长学姐交流,我意识到不能跟着大学的节奏走,而是要提前进行自学。因此,在大一上学期不允许免听的时候,我主动与高数老师协商,提出自学不上课的请求,老师同意了。这也标志着我正式摆脱高中思维,开始了翘课自学的旅程😋。我开始通过网课学习C语言(浙江大学翁恺老师)和高等数学(上海交通大学乐经良老师)。
随后,我参考了网络资料,认为数学这条道路想走出头门槛太高,果断放弃了数学,正式将目标确定为计算机领域。考虑到计算机领域408是通用知识,我同时开始学习数据结构与算法(浙江大学)、计算机网络(哈工大)和操作系统(哈工大)。其中操作系统课程给了我很大启发,我意识到操作系统中有大量的知识财富可以挖掘,因此后续还学习了南京大学和MIT的课程,都各有收获。
后来我受班助的推荐去了一个数据挖掘实验室旁听,这时我在就业和升学之间对计算机的道路进行权衡。旁听实验室之后,导师让我自行决定是否加入。如果加入,基本就要选择学术直博的路线。经过与实验室内部的学长交流,学长们告诉我这条道路需要付出大量的时间,那么长的战线会不会发生什么意外谁也说不准,你如果是想从零开始学习然后赚钱,那应该准备就业。我最终决定选择就业道路。
此时,我的规划大体已经明确,但具体的方向还未确定。在校期间我还参与了学校一个知名网安社团的培训,进一步熟练了C语言,并开始接触网络安全领域。于是,我在前端、后端、网安之间摇摆。考虑到该社团在寒假期间会组织在线网安竞赛,这也是进入社团的门槛之一,我决定在参加完竞赛后确定自己的具体方向。
寒假期间,我参加了网安竞赛,撑了四周后,还是未能达到名次要求,从而落榜。我在和同期高排名参与者交流后发现,他们普遍都在大学前就接触了计算机,这使我意识到网安是一个很吃经验的领域,而我在大学才开始接触计算机,加之网上的网安资料也不全,很难通过学习赶上他们,我放弃了网安这个方向。
综合考虑之后,我认为后端有更大的技术上限,放弃了前端(后面写项目还是学了Vue那一套技术栈,不过没有深入),接下来只需要选择相应的编程语言。
在这个过程中,我面临了一个重要的决策点,我的绩点有机会转专业到计算机学院,而家人也推荐我这样做。然而,和很多人的选择不一样,我决定不转了。当时的考虑是,既然我的学习道路是自学为主,转到计算机学院并不会有太大改变。而且,如果我转专业,还需要花时间学习计算机学院的硬件相关的课程,还需要补大一上的专业课程。
此外,我在网安竞赛认识的在计算机学院的同学告诉我,计算机学院并不是我想象中的白月光,那里事情很多,想学好也是基本依赖自学。而我需要大量的自学时间,目前所在的学院相对轻松,我最终决定留在当前学院自学。
不过请注意,如果你的专业和计算机完全不相关,那么还是有必要转的,否则你将学习大量与你就业方向无关的课程,这很浪费时间,并且在后续求职时也可能遇到专业不匹配的问题。我的运气比较好,我专业虽然不是计算机,但是是计算机相关,开发方向的课程都会教。
大一下学期,我的学院开设了Python课程。通过自学,我完成了许多有趣的项目,例如给近代史考试写的刷题软件,给自己看电影写的爬虫软件(都使用的PYQT)。顺便提一下,我一开始是通过 廖雪峰的网站 进行自学的,这个网站很适合小白入门。这时,我在Python、Java和C++之间摇摆不定。
大一暑假期间,我进一步查询了网络资料,了解到Python的后端开发就业机会不多,而Java的就业岗位较多,适合从零开始学习的人。而我学了一段时间C++后,对C++的编程风格并不喜欢。因此,我决定学习Java语言。在暑假期间,我通过廖雪峰的网站入门了Java编程。
大二 - 沉淀期:
进入大二,我已经明确了我要走Java后端开发的道路,并了解到要进入大厂需要综合 技术、实习经历、算法。因此,我决定在学习八股知识的同时刷算法题,并在学有所成后开始寻找实习机会。廖雪峰的网站八股并不全,我便使用了JavaGuide来学习八股知识,但后来在浏览知乎时意外发现了一个宝藏网站 Java全栈知识,我通过当时浅薄的基础确信了该网站的广度,有大量优质内容,可以涵盖面试所需的八股知识以及后续的提升。我围绕该网站进行学习,并在需要更详细资料时,搜索其他技术博客予以补充。
至于算法学习,我使用了LeetCode网站。在大一的时候,我已经用Python刷了一些题目,但更多是出于好奇,现在才正式开始学习。我为自己购买了一年的会员,主要专注于刷题单。具体刷了哪些题单我已经记不清楚了,只记得一开始刷了两个剑指Offer的题单,后来又刷了一些进阶题单,就是包含很多Hard题的那种,不过目前在网站上已经找不到当初的题单了😥。
大二上学期结束的时候,我基本上学完了那个宝藏网站的内容,也刷了相当数量的算法题。通过搜索面经,我发现已经能够回答相当数量的问题了,但仍然会在深入的问题上卡住。这一方面是因为我只是简单地理解了一遍知识,没有融会贯通,另一方面,我在广度上已经有所积累,但缺乏一定的深度。因此,我决定继续学习那个网站,这一次更加注重深度。例如,对于热门框架,我会阅读其源代码,理清逻辑,理解设计思想。同时,我还通过大量的博客搜索来丰富自己的知识深度。
这里可以分享下源码阅读,相信大多数人刚开始对于源码阅读都是很抵触的,读了也感觉没怎么懂,懂了也记不住大概。我一开始也是这种情况,而且我最早读的,是大名鼎鼎的Spring框架IOC容器的源码,可想而知,当时第一次阅读源码的我直接撞上了硬茬子,完全读不下来。
阅读失利后我决定从简单的开始,先阅读Java集合源码,再去阅读IO、JUC的源码,进一步再阅读各种小型框架源码、大型框架源码。我并未有意识地提升自己的源码阅读能力,但是我在大量阅读的过程中,自然而然地就能够阅读复杂源码了,这可能是习惯了、阅读能力提升了、耐心提高了,也可能皆有。
我在阅读的过程中也时不时思考源码之间设计层面的共性,举一反三帮助我理解源码。因此,如果你苦于自己难以阅读源码,那么我给的建议是很直接的,循序渐进地从低难度源码读到高难度,你的积累会自然而然地帮助你阅读下去。
与此同时,我也尝试着写一些项目,但我也提过,我个人的自律性不够强,学习进展并不是很快,而编写完整的业务项目需要大量的时间投入。因此,我降低了项目实践的比重,只是通过编写一些半成品来加深对知识的理解。在这个过程中,我写过一些尚硅谷(谷粒商城)和黑马的项目,但都没有写完,基本上只是写到自己理解了业务实现逻辑就结束了。因此我并没法给你推荐项目,我在实习简历上写的是我自己构思自己实现的一个在线刷题项目,而这个项目是我写着玩的。
到了大二下学期快结束时,我感觉自己的知识储备基本上够了,已经能够稳稳回答大厂面试中的八股问题。但由于之前在网上看到的有关字节面试算法难度较高的信息,我开始担心自己的算法能力,怕遇到Hard算法写不出来。对于找实习,我还没有下定决心,准备再给自己一些时间沉淀。
大二暑假期间,由于我在学习八股的时候,对分布式很感兴趣,因此我深入研究了分布式领域,并阅读了一些相关文献,为后续这方面的进一步提升埋下了伏笔。
经历了大二,我打下了坚实的基础,算法可以大概率做出冷门Hard以外的所有题,一年的沉淀效果显著,让我后期无需再花大量时间补习基础和算法。
当然你可能好奇,我作为一个不那么自律的人,是怎么做到大二一年沉淀那么多的。首先一年的时间并不短,如果充分利用,学到这种程度并不难,都不需要进入卷的状态。而我整个大二都尽可能避开课堂,自己回到宿舍自学,再加上我并没有社团活动,也并没有参与需要时间投入的竞赛,自学的时间是很充足的。
至于不自律的我如何充分利用的这些自学时间,我认为我并没有充分利用,我个人发现自己在长时间连续学习后(大概2个小时),知识吸收效率会降低,因此我通常学一会就刷一会视频,感觉无聊了就继续回去学习,这也"得益"于我在高中的滥玩,提高了娱乐阈值,使我很容易在放松时感到无聊,此时学习就成了我缓解无聊的方式(毕竟学习一定能学到新东西,而刷视频不一定)。在这套碎片化学习方式之下,我虽然是劳逸结合,并没有进入能被称之为卷的状态,也并没有充分利用时间,但效果还是可观的。
大三 - 实践期:
继续沉淀到了大三上学期的十月份,我感觉有些晚了,下定决心了要开始投递实习。投递了字节跳动后,一发入魂,顺利入职。实际的实习面试比我想象中要简单,算法题仅仅是Easy-Mid,并没有Hard。具体面经见我的博客 字节Java面经。
入职后,我开始熟悉生产环境的开发,以弥补自己缺失的业务开发经验。我的实习算是多灾多难。虽然学校没有卡实习,但却有强制规定的阳光长跑,大三两学期必须跑到一定次数,并且刷卡的方式改成了刷脸,无法找代跑,因此我每周不得不在公司和学校之间频繁奔波。此外,实习不久后遇到了疫情高峰期,整个项目的开发进展也没有那么顺利。唯一的好消息是期末考试延期到大三下学期开学,这给了我一些复习的时间。
大三下学期期末之前,我结束了在字节跳动的为期半年的实习经历。期末考试结束后,我计划弥补在实习期间丢失的学习进度,因此准备继续深入研究我感兴趣的分布式领域。我开始学习MIT6.824课程,独立实现并跑通了所有Lab的测试用例,熟悉了Go语言,并以该课程的论文为基础,进一步阅读我感兴趣的引用文献。
这段学习不仅丰富了我的分布式系统知识,还帮助我进一步系统化了自己的知识体系,后续面试有问到分布式领域的,我都可以展现自己的亮点。这段学习后,我在简历上写上了一个Lab魔改后的分布式键值数据库(支持分布式事务)的轮子项目。我的简历项目经历从此便成了一个轮子项目+实习期间的多个业务项目+凑数用的那个刷题项目。
大三暑假至今:秋招期
秋招便是老生常谈了,说实话我本以为我的秋招会很顺利,毕竟我已经满足了 技术、实习经历、算法 三个方面,然而我为自己的错误决策以及对秋招的不重视付出了代价。实际上我在7月份便看到了字节的提前批信息,当时我不以为然,觉得这不重要,就没有投递。
8月初我心心念念的《博德之门3》出了,我沉浸其中😋,短暂忘记了秋招,直到8月底才想起了这回事。还是挺感慨的,我整个学习历程中遇到过很多次决策,在之后看来我的决策都是挺合理的,反而是检验成果的秋招决策出了差错,差点前功尽弃(当然这个夸张了,还有春招)。具体的秋招情况可以看我上一篇文章。
总而言之,这就是我作为一个双非本,拿到字节后端开发offer的学习历程,既然我这个不自律的人,靠着劳逸结合的学习都能做到,那么如果你的时间充足,你也能做到,如果你的时间不充足,那么稍微卷一点,也可以做到。
还有一点需要提到,我在秋招之前一直都能克服信息差(反而是秋招没有去提前检索信息),无论是发现需要自学,还是了解就业需要哪些能力等等,皆是如此,克服信息差也是在校生迈向成功的一个重要条件,为此需要自己检索信息、咨询你的学长学姐或者尝试各种其他行之有效的方式。例如,关于校招和实习的信息,你就可以在牛客找,因此在牛客的大伙也是一定程度上打破了信息差。
在此我也可以分享一个信息差,还是有很大一部分人认为杭电算不上双非,就业很强势,实际上这个强势在21年及以前确实是存在的,单单是我学院就有很多进字节的,进阿里也不是特别困难,华为更是点击就送。然而,22年开始,计算机进入寒冬,杭电作为双非,学校的优势急速下滑。学校曾在教学区的路上展示过去年那届本科生的就业明细,整个学校进入BAT的人数,一只手都数得过来。大部分都是我听都没听说过的公司。那么你是否也被打了信息差呢🤔?
我的学习历程写得有一些长了,能看到这里的你也是挺有耐心的了,希望我的分享能对你有参考和帮助,也祝你求职顺利😆。
#晒一晒我的offer##秋招结束##字节##学习##双非本科求职如何逆袭#