Skip to main content

转码经验

非cs专业如何转码三个月拿到大厂offer

|背景

首先说一下我的背景,本科是传统工科,有上C语言和数据结构算法,除此以外几乎没有碰过编程;硕士读的是数据分析,会学python和数据库基础。不能算完全编程零基础,但是离面试找工作还是差很远的。因为我是2020年7月硕士入学,一开始因为学业繁忙也没下定决心转码,直到后来11月秋招已经几乎结束了,才开始真正意义上转码准备面试。

|时间轴

  • 2020年11月开始自学Java和补充计算机基础
  • 2021年1月拿到字节跳动校招后端开发offer,中间经历三个月
  • 2021年3月春招继续投递进行面试,最后拿到了百度、美团、阿里、拼多多等大厂offer

本文主要给非科班想要转码做【后端开发】的同学一些建议和参考,虽然没有捷径,但是行动起来,转码并不难,主要分为3步骤:

1. 确定目标

2. 拆解要求,制定计划

3. 边执行边调整

1. 确定目标

这里的目标是指在哪个时间段拿到怎么样的offer,比如今年春招拿到大厂SSP的后端开发offer. 这会让你有一个很清晰的时间轴,知道你在4-5月要达到怎么样的能力水平。当你没达到这个目标,你就有足够动力持续学习,准备面试。

2. 拆解要求,制定计划

决定后端开发offer的因素有:学历,数据结构与算法(leetcode题),CS八股文计算机基础,JVM,框架中间件),实习/项目经历,面试能力,智力题(偶尔会考),市场环境,运气,...

因为时间有限,我们主要针对可以短期提升的部分进行重点学习。

|计算机语言

如果已经掌握了一门编程语言,比如C++/Java/Python,那么直接可以跳过。这里推荐Java,因为市场需求大,入门也不难。对于校招来说,编程语言的重点就是拿来写算法题的。

推荐目标:学会Java的语言基础,能用来写算法题即可。

推荐资料:B站很多视频,我当时看的是动力节点的,不需要看完,掌握基础和语法就可以。如果不喜欢看视频,也可以看《Head First Java》这本书。

|数据结构与算法

首先校招最重点考察的就是数据结构与算法,无论是哪一轮的技术面都至少有一道算法题,如果你面试的其他部分回答得一般,但是算法题做出来了,面试官可能会放你一马;但如果你计算机基础不错,算法题没做出来,那通过的几率就不到一半了。比如我在字节四面技术面的时候,前面计算机知识答的7-8成,没有特别好,面试官给我出了一道hard题,最后做出来了,也就顺利通过面试了。

推荐目标:建议Leetcode刷到200道以上,那么算法题不会成为你的软肋,刷到400道的时候基本上笔试题可以过80%-100%,面试国内大厂基本算法题全过了。同时基础的知识点也要掌握,比如不同树的区别,各种排序算法的区别和实现。

推荐资料:零基础而且时间充裕可以看一下伯克利的cs61b。或者可以直接B站搜索“左神”或者“左程云”,里面有他的全套课程,或者买他写的书《程序员代码面试指南》。左程云老师可以说是算法题的引路人了,我就是跟他学的二叉树解法,后来基本二叉树的题都做得很顺利。

|CS八股文

包括操作系统,计算机网络,数据库,以及Java和JVM考点。如果有相关经验,可能还会考察Redis,SpringBoot等框架组件

  • 操作系统和计算机网络这两门课,都是推荐B站看**王道考研**的视频,看一遍下来对基本概念都有所掌握了,但是对于一些考研的考点,比如计算题,不用太纠结,这些面试不会考。
  • 数据库,主要是MySQL关系型数据库。这部分因为硕士课程有学,我就没有额外看视频。也可以在B站找相关视频,或者直接网上找Mysql入门教程的文章看看。
  • Java和JVM考点,这部分首先在前面学Java的时候有掌握,其次推荐周志明老师的《深入理解Java虚拟机》这本书,应付JVM的考点完全足够了。
  • Redis、SpringBoot等其他组件推荐直接看网上的文章,主要因为时间有限,不建议看书和看视频,直接看对应知识点的文章效率更高。

学习的优先级是:计算机基础(操作系统+网络+数据库)> JVM > Redis, SpringBoot等。当过了一遍知识后,默认你已经理解大部分知识,这时候就要针对面经的题目来查漏补缺,通过回答面试问题的形式来学习对应的知识点。

|实习/项目经历

如果有这部分经历,一定是加分项。但对于非科班的同学一般都是没有的,可以把以往和编程有关的项目经历写到简历上。同时在学习好前面提到的计算机知识的前提下,在简历上补充一些项目,可以是学校/公司/网上开源的,保证面试官在问这个项目的专业知识你都可以回答得出来。

智力题

参考:

https://www.nowcoder.com/discuss/526897?type=0&order=7&pos=26&page=3&source_id=discuss_center_0_nctrack&channel=1009

这部分就字节考了,准备一下常问的题就可以了。

|小结

首要准备:计算机语言基础+Leetcode+操作系统+网络+数据库。次要准备:JVM+Redis+项目经历+Spring全家桶+智力题。

3. 边执行边调整

基本策略:尽可能多投简历,多面试,并在这个过程中不断微调自己的学习重心。

|多投简历多面试

招聘信息来源:牛客网,各大招聘app(我主要用boss直聘),各大厂的招聘微信公众号。

只要有招聘信息,原则上都应该及时投递简历,除非是真的完全没准备。等你觉得自己准备好了,人家已经招够人了,往往是越晚投递的面试要求越高,所以对于校招,只要有招聘信息出来都应该及时投递。具体来说,如果是某个公司一次正式的秋招/春招,那可以在它开启招聘后的2-3周内投递;如果是一些个人比如HR/team leader发出来的校招补录,那应该在看到这个招聘信息那一刻就马上投递简历,因为这种不影响你的其他面试机会,而且headcount一般也很少,先到先得。

如果是担心本次面试失败可能会影响下一次面试,从我去年面试的经验来看,基本不影响。我一开始面字节是挂了,之后收到另一个部门的面试邀请,面试官后来跟我说他们也不看以前的面试记录,只关注当下你面试的表现。所以还是要大胆投。

|根据反馈调整计划

比如我一开始以为Java本身的知识很重要,深入学习了很多,但在面试的过程中发现计算机三大基础课和算法题才是最关键的,随后就把学习重心放到这里。而且每年招聘要求,招聘人数都有所不同。比如可能因为转码的同学太多,对简历的项目要求变高了呢;而且每个人的背景不同,重点还是自己在投简历面试的过程中不断根据得到的信息反馈及时调整计划

一个非计算机专业学生自学转码之路

前记

似乎又到了春招的时候了,看到了各种经验贴,回想了我这两年艰难的转码自学之路(因为走了很多弯路),觉得也有必要写出来,或许可以帮助到很多决心务码的同学。

首先我要介绍一下我的情况,博主是中部地区985机械专业的本科生,入学谈不上对专业的热爱,但还是不排斥的,大一时才接触C语言编程,那时候可能是由于教学方式不适应导致我并不喜欢编程,然后我就在机械建模、机械设计、单片机中度过了近乎前两年。然鹅让我选择走码只是一个偶然,那就是我对stm32(一种单片机)的恐惧,芯片代码量巨大,我看起来很困难,于是我被迫重新仔细学习编程,于是就一发不可收拾,让我有了走编程的念头。

初步学习

我还是建议广大同仁们从C语言和C++入手,毕竟相比于其他语言,他更古老一些,功能也能强大一些(这里不探讨那种语言更好,不然又会吵起来),说起学习C++,很多人都会推荐C++ primer plus入门,没错,这是一本极好的学习资料,但是在我这个几乎编程小白入门的过程中,我反而觉得这算是一本介于入门与进阶之间的书,并不适合刚接触编程的人,而且我发现有些面试宝典里对一些知识点讲的更加透彻,于是我推荐的学习路线是:

  1. 谭浩强的C语言程序设计(最基础的入门书)强烈建议将课后习题打一遍,因为刚入门的同学的逻辑水平和数学技能要远强于代码水平,很容易出现眼高手低的情况,练得少就会一下手就出bug
  2. C++ primer plus中文版,这就是C++最畅销的书籍了,建议认真阅读,以了解C++各部分与库的用法为主,有时间有毅力的可以把感兴趣的部分手敲一遍(全敲就强人所难了)
  3. 程序员面试笔记C/C++、算法、数据结构 这是本红皮书,我觉得这本书在C++11新特性上边解释的比较清楚,比C++ primer plus要生动一些,里边会解释很多经典算法与面试题,可以参考一下,最重要的是要理解概念

我也可以讲述一下我的错误经验,我是C语言才会了一点就去看C++ primer plus硬啃,花了很多时间,函数部分、模板类、智能指针好几部分知识还是迷迷糊糊,最后不得已放弃,当我又学完数据结构、刷了很多OJ题目之后再回来看的时候,才看懂了,所以建议大家初步学习以概念为主,真正的学习过程是理论与实践的反复迭代。

进阶学习

这里主要写算法的学习,我花了最多的时间在这上边,一个原因是我喜欢追求最好的解决方式吧。我是最开始在课程里了解到了一点点数据结构(仅限于知道名字),于是我就找了本最经典的 数据结构C语言实现 这本书开始看,但是由于我缺少对数据结构的系统认识,很快就被劝退......我以为是我数学功底不够,于是去学习了离散数学,mooc课程+课本,搞了几个星期,最后卡在了图论上,我又以为是对拓扑学认识不足,又买了本拓扑学(黄皮那本)硬啃...最后灰心丧气,好在是我想到了刚入学用的校acm队开发的答题系统,于是考虑了通过刷题提高自己,于是我就在POJ、杭电OJ上写些最容易的题目,后来有好友给我推荐了leetcode,于是在刷leetcode的过程中,我才慢慢找到了学习节奏。所以这里给大家推荐的学习过程是:

  1. 数据结构了解概念与功能,有一定代码功底的可以选择把所有数据结构复现一遍,刚入门的同学也不要怕,刷题的过程中会了解的更加深刻。
  2. 去一些OJ网站,比如计蒜客、牛客网等等,这些可以在线提交,要好于很多学校的OJ,里边可以选择难度,从基础的开始,也可以去一些为高中生竞赛准备的网站例如:洛谷,我也不嫌丢人和一群高中生一起讨论,毕竟技不如人,就得虚心请教。当你可以应付基础题目后就可以看第三条了,因为很多网站都是为ACM和NOIP准备的,毕竟我们学习不是为了竞赛,而是为了进公司做项目。
  3. 在leetcode上边刷题,建议选择easy难度,从第一题就开始刷,刷50道左右的题目来适应,leetcode的特点不是难AC,而是每一道题都有最优的解决方法,就我目前来说,见过的easy题目绝大多数都可以在线性时间下完成的。接下来就可以分类型刷题了,算法的主要几块一定要熟练,比如暴力、分治、DFS、BFS、动态规划、贪心,还有很数据结构相关的题目:链表、栈、堆、各种树还有图,leetcode的图论题目可能出的相对简单一些,如果觉得自己图论还薄弱的可以去acm的网站上再刷些题目。
  4. 当你在leetcode上边达到了中等题目可以思考一会或者调试一下能够解出来的话,那是就可以考虑笔试了。

我是在大二下和大三上开始刷题的,那个时候可以专业课和课设最多的时候,于是我花了接近两个学期来写题目,leetcode上边写了400道左右,周练解出3道问题不大了,偶尔可以全解出来,如果坚持每天都刷,最多三个月应该就可以了,然后我就满怀信心去面试了,投了CVTE,拼多多的内退提前批,结果面试一塌糊涂,我仔细反思之后才发现是概念不扎实,这也是我为什么我把程序员面试笔记C/C++、算法、数据结构放到前边,概念和基础一定要打牢!

面试准备

首先要有一份简历,然后去投公司,然后等着被pass

硬件准备我就不说了,很多博客说的很清楚了,我先说一下我的准备经历,我一直觉得算法岗位是一个很有逼格的岗位,于是开始积极准备机器学习方面的知识,这大概在我大三上的时候开始准备,没错,就是马上要投简历的时候才开始的,我一直以为算法就是数据结构,但是我错了,当我意识到的时候,时间已经不多了,我去网上找了门课程,是小象学院的机器学习算法精讲(我不是做广告的),然后将典型的算法比如:LR,SVM,决策树、随机森林、adaboosting手推了一遍,那段时间我真是连课都不上了,天天学算法,最后我投了华为的算法岗,果然功夫不负有心人,我被录取了,做的是机器学习的工作,而且得到了主管和导师的赞扬,只是我最后选择继续深造,没有留在公司。时隔一年,正好今年华为的软件精英挑战赛用的华为云,我当时做的项目也是关于华为云的,虽然我知道我写的代码绝对不可能被使用,但还是有那么一种自豪感。我现在还在做算法和软件的工作,而且我现在还是热爱它的,还是很庆幸当年毅然决然的转码。

给大家的建议是:

  1. 我面试了好几家公司:cvte、拼多多、京东、华为等等,我发现公司对学生的期待还是可培养性,即使做的不是代码工作,只要经历丰富都会加分的
  2. 注意:经历不要乱编,问了答不出来就等死吧
  3. 计算机原理、网络技术、数据库这几部分大家还是需要准备的,只是这些与语言和算法无关,我没有列举在上边 笔试一定要好好写,尽全力,因为笔试好,面试也会加分的,面试官看的到成绩

最后,建议大家将每天刷题变成习惯,可以让自己对常规算法保持熟练,做更难的题目也可以不断提高自己的逻辑水平