转行进腾讯了
就是在大学期间对于计算机基础准备的很充分,比如数据结构与算法、操作系统、计算机网络、数据库、Linux 这些。
然后期间就有很多读者问我,对于社招或者转行又应该怎么准备呢?今天来分享一位来自小林读者的转行经历文章。
前段时间,就有位在机械行业工作了 2 年的读者,成功转行了程序员,而且还进了腾讯:
我知道大家肯定会很好奇他的经历,所以小林已经邀请这位读者来分享他的转行的经历。
当时我看完后挺震撼的。
震撼在于他之前的机械工作,竟然晚上 10 点才下班,每天工作 14 个小时,这工作强度不比互联网大厂少,而薪资却不及互联网一半。
这个工作强度,使得他在上班期间根本没时间自学编程,都是利用周末的时间从早学到晚。
而且还是持续自学了 2 年,我开始以为他是自学了半年后转行的,没想到一直坚持那么久,点个赞~
而且这位读者说他自己挺幸运的,他最开始转行找工作的时候,目标并不是想去大厂,只是想去小厂,结果事与愿违,非常滴魔幻!
相信这位读者的转行经历,能鼓舞到那些也有此想法的朋友。
前言
大家好,很感谢林哥给我这次机会分享,介绍一下我自己。
我 19 年毕业于武汉理工大学,毕业后一直在做机械研发的工作,自学了两年 Linux C++ 编程。
如今在武汉找到了一份编程开发的工作,现在我将我的经历写出来,希望能给大家一些帮助。
为什么要转行?
转行的主要原因是因为毕业设计要做一个串口播放器。
当时做了播放器和串口通信的实现分别花了一个星期,怎么将二者打通折磨了我很久。
这期间我借了很多书,看了很多博客,看了很多视频,完全没有相关内容。最后论文指导老师都劝我放弃了,不然毕业论文就写不完了。
没法子,只能先放弃。
虽然口口声声说放弃了,但我的内心还是不想放弃,有好几晚都失眠了。直到一个周四的晚上,我依旧失眠到两点。
不过这一晚不同,我翻来覆去睡不着,脑海中突然闪过一个很好的 idea,害怕这个 idea 飞走,我悄咪咪的爬下床,打开我的电脑,顺着思路敲下代码,越写越兴奋,心里不断传来声音说「对的,这是对的,哈哈哈~」。
当我点击编译,一个一个功能进行测试,和预期功能完全一样,那一瞬间成就感填满了我的内心。
这时一道阳光透过窗照在我脸上(武汉夏天太阳出来早),原来已经天亮了,这是我第一次对一件事这么着迷,就想着以后做这方面的工作。
下面这张图就是我当时做的串口播放器。
可以通过右侧的按钮进行控制,也可以连接串口后,接收相应的串口信号,进行视频的播放、暂停、全屏之类的操作,同时还可以发送和显示接收到的串口数据。
虽然现在现在这个播放器看起来很简陋,但当时足足花了我一个月的时间,是我的第一个可以直接体会到的程序,我一直将它放在我的桌面上。
当学到厌倦的时候,都会打开它,提醒自己走到这一步的初心。
选择什么方向?
因为我是机械出身的,我最初的想法是转到与机械关联性大一点的岗位 -- 嵌入式。
心里想着悄悄的学习,然后司内转岗,惊艳所有人(很幼稚的想法)。说干就干,我先在网上找了学习路线,制定了学习计划。
需要学习 51 单片机,就在 B 站找到了郭天祥的 51 单片机教程,还淘宝买了个 51 单片机,照着教程一点一点的敲,有不懂的就看书。
很快就遇到了瓶颈,书上有个电路图我看不懂,出于「我不仅是想找一份工作,我还想把这份工做好」的想法,我又去网上找学习路线。
网上说嵌入式得学数电模电,学数电模电又得学电路分析、微机原理等等。
于是我做了一个错误示范,在 MOOC 上找了北理工的基础电路分析课,还淘宝买了对应教程。
一学学了两个月,堪堪对着视频学完,想着厚厚的数电模电,还有树莓派之类的要学,BOSS 直聘又查了一下单片机开发的工资,得出结论 -- 我不适合嵌入式(学东西直接一口气学完,不要老想着完美主义)。
接着我又开始了寻找学习路线的路途,因为限定语言是 C++,找到四个路线嵌入式、音视频、服务器、游戏,考虑未来准备发展城市的互联网环境和房价,最终决定做服务器开发。
接着就是在知乎上查找服务器开发的路线,看了很多,根据自己的情况,制定学习计划,再按计划实施就可以了。
学习方法
我一直坚信选择比努力重要,好的方法可以事半功倍。
我提供一下我自学期间的方法,或者说是基本原则,虽然不一定适合大家,但希望能给大家一个参考。
睡眠最重要,睡得好,才有精力同时应对工作和学习,每天晚上必须保证七个小时的睡眠,中午也要午休一个小时;
学习少便是多。听懂一个知识点,比略略看了三四个点更重要;
刚开始学的时候看视频,快速构建知识框架,后续看书补全知识框架;
做好笔记,以输出为目的进行学习,推介用 typora 做学习笔记,将自己每天所学的内容记用 typora 记录下来;
关注相关领域的博主,比如说@小林coding,加入他们的技术交流群,你最后会发现,你即使潜水,也能学到很多;
将所需要学的分为知识和技能,二者相辅相成,但知识偏理论,要记下来,技能偏实践,一定要亲自动手。
一边工作一边自学
背景
我的本专业是汽车类的,当时高考结束选择机械专业的原因就两个。
第一是认知有限,无人指导,只知道程序员秃头、教师要改作业、材料要做危险品实验等等,一众专业中唯独机械万金油,什么都会,什么都能干,而且越老越吃香,因为是农村的,一心求稳,害怕找不到工作,机械就成了首选专业。
其二就是这个专业是我们学校的王牌专业,本着宁为鸡头,不为凤尾的原则,就不考虑更好一点学校的普通专业。大四找工作时才知道,「什么都会」代表着「什么都不精」,「越老越吃香」代表着「年轻时不吃香」。
当时最大的愿望是能找到一份年薪十万的工作,能拿到年薪十万的基本上都是学院里的佼佼者,拿到十五万到二十万就是学院里的 top 同学,再往上我就没怎么听说了。
现实却是,大多是四五千月薪的工作,而且得经过层层选拔。印象最深刻的是一个知名汽车厂,面试了三轮,还要写小作文,最后一问工资四千五。
偶然间参加了一次互联网公司的宣讲会,听到 17 万只是他们公司的白菜价时,我整个人都惊呆了,我只能告诉自己「机械专业越老越吃香,他们三十五之后有淘汰危机,而我没有。」
现实往往是惨痛的,我在前一家机械公司呆了一年半。工作节奏是周一到周四早 8 晚 10,周五早 8 晚 5,迟到要罚款,周六可以晚点去,但一定要去上白班。
虽然中午可以休息两个小时,下午也有一个半小时吃饭,但每次下夜班都是十点了,回到寝室只能简单洗漱一下就睡了。
虽然每天的在工位上的时间只有「区区十小时」,但真正自己能支配的时间只有晚上十点半到第二天七点五十,每次周日的时候,只想睡觉,一觉醒来,发现明天又要上班了,感觉自己完全没休息好,马上又要上班了。
仅仅一年的时间,跟我一起进去的小伙伴体检都有了大大小小的问题,我也有了脂肪肝、甲状腺结节、糜烂性胃炎,有时候还会心悸、胸痛。
最开始的计划是一边上班、一边自学,转行成功了再辞职。
直到第去年六月份的时候,带我的同事去年绩效打得不好,公司要求末尾淘汰。
他是公司刚成立没多久就来了的,被公司优化了,本来没什么,拿个 N+1 走人也可以的,恶心人的却是,公司用了网上各种套路,诸如威胁、调岗、最低工资等等招式对付我的同事。
最后达成协议,工资降一半,继续留下来,我同事也同意了。
但不到一个月,又说上面政策变了,还是得走人,可以给N,但是是降薪后的N,我的同事彻底心凉了,不愿意在纠缠了。
这件事也让我彻底心凉了,即使董事长说「发动机不过是一坨铁」,我们研发人员也只是相视一笑,直到这件事发生,我们才明白----这公司没什么人情味,我们都可能是下一个「他」,谁知道明年会不会优化我们呢?
即使我们努力加班,年纪轻轻就一大堆毛病,也阻止不了被优化。但这已经是机械行业里的 top 企业了,集团还是世界五百强,从业人员都还是这种待遇。
若是出去,其它机械小厂是不是更糟糕,这更加坚定了我转行的决心。
后来了解到仅仅这个公司这样,广丰广本上汽这样的明星企业还是很好的,但进去的条件极其严苛。
小鹏、蔚来的互联网车企待遇也很好,但需求更大的是「软件人才」,不是机械。
如果大家有志于汽车行业,也不要因为我的经历而寒心,我的第一家公司代表不了所有的机械行业,只能给大家一个参考。
如果有志于发展中国的汽车行业,建议大家可以学计算机、通信、电气,然后进入车企当嵌入式工程师,结构岗我就不推介了,这个坑我已经踩了。
言归正传,说说学习节奏。
为了保证充足的精力应对学习和工作,我基本上都是晚上十点下班,回到宿舍洗漱一番,和女朋友聊聊天,十一点就赶紧睡觉了,然后第二天早上 6 点起床看书,看到七点四十就去吃早餐上班(住在厂区,离办公地点很近)。
这样的节奏一般保持六天,周日就睡半天,打打游戏,看看电影,放松自己,下周继续上一周的节奏。
周一到周六除了早上固定的学习时间,我也会在中午或下午下班看半小时书,不过效率没有早上高,故而早上一般学习最重要的内容,其他时间看博客理解早上学的内容。
在这一年半的时间里,我只学了 C++、操作系统、计算机网络、数据结构和算法,基本上都是在 MOOC、B 站上找视频自学的,看完视频再看书进行补充。
C++ 的学习
我在 B 站看黑马程序员的 C++ 课程入门的。我基本是先看完一个章节的内容,心中有了大概的理解,就在 VS 上复现出来。
我对自己的要求就是--一定要复现出来,因为有种错觉就是--我以为我会了,一写代码就卡壳了,争取每天学习都动手敲代码。
作为初学者,我学了三四个月,在此期间,一直秉承着「少便是多」的原则,甚至会刻意放慢速度,如果发现前面的忘了,就重新再学一遍,而且第二遍第三遍会快很多,而且还会发现之前忽略的细节。
得益于这阶段 C++ 学得很慢,对基础知识记住得比较多,后来面试看看面经,C++ 相关的问题基本能回答出来。
我学完后没看书,因为《C++ primer》太厚了,直至面试,我也只是略读了一次。
操作系统的学习
操作系统我是在 MOOC 上看北京大学陈向群老师的现代操作系统学的。
不过现在 B 站也有视频,操作系统还有其他很优秀的课,比如华科的、哈工大的、清华大学的,我选择北京大学老师的课是因为我买了《现代操作系统》这本书,课程刚好对应上。
学习过程中,操作系统给我的感觉就是非常的抽象,这一阶段学得非常慢,进程线程我都是看书才看懂的,不过这一阶段要学的基本可以分为四个部分:进程线程、内存、文件系统、I/O(面试问得很少,理解即可),其他的部分可以后续遇到再学。
学习节奏基本保持着每个星期只学一章,多了不学,也不能少。
计算机网络的学习
计网我是通过哈工大的计算机网络学的,配套书籍是《计算机网络自顶向下》,我只看了视频的应用层、传输层、网络层、链路层、物理层。
到传输层的时候我就感觉有些吃力了,还好当时我遇到了宝藏博主@小林coding,小林的图解让我有一种醍醐灌顶的感觉,原来课上理解不清的概念都被小林图解得明明白白,衷心推介大家关注。
数据结构的学习
我的数据结构是通过浙大陈越姥姥的课学的,B站有视频,大家可以去搜。
这一课程需要达到的目标是,知道什么是数组、链表、栈、队列、堆、树、哈希表、图这些数据结构。
最好能照着视频实现自己的数据结构。只要能将这些实现出来,基本就可以进入下一阶段了。
在家自学半年
在家这半年主要做了两件事:
第一是将之前学的操作系统、计算机网络、数据结构和算法、C++ 进行总结,用 xmind 将每一个内容的知识点脉络整理出来,用 typora 将比较难得知识点记录下来。
第二就是进行实战训练,学习编程技能,比如 linux 的基础 shell 命令、vim、gdb、gcc、make、git 的使用,学完这些后,开始跟着 acwing 刷题,刷完算法基础课后,学习 linux 系统编程和 linux 网络编程。
编程基础技能
刷题
我加入了很多博主的技术交流群,在里面一直潜水,但依旧学到了很多。
有一次就知道了 acwing 的算法基础课,B站试看了一下,发现正是自己所缺的刷题套路。淘宝买了正版码,就开始了学习刷题套路之旅。
最开始的时候,我想着把课程看完,再回来做练习题。实行了一个星期,发现自己还是什么都不知道。
复盘了一下,还是自己太急躁来了,就给自己定下了少就是多的原则,一定要把题目刷出来才进入下一 阶段。
我开始以写出来为目的进行学习,如果今天写不出来,就看题解,去理解,理解后自己写两三遍,直到能随手写出来。
不出意料,我的进度慢得出奇,一个下午只理解了一个题,不过我还是坚定这个方法是可行的。
皇天不负有心人,一星期后我发现自己慢慢地摸索到了刷题的节奏。渐渐的能跟上视频进度了,学了两个月,终于把 acwing 的算法基础课学完,虽然花的时间比较长,但还是值得的。
在我遇到的面试中,但凡是要求手撕算法的,都能在算法基础课里找到一个类型的题。
linux系统编程 & 网络编程
我将 linux 系统编程、网络编程看做是操作系统、计算机网络的技能体现,既然是技能,就一定要练。
这两门课我是看 B 站黑马程序员的视频学的,在 B 站输入关键词就能找到。这两门课一定要 学完操作系统和计算机网络之后再学习,不然很多东西都听不懂。
还有就是一定要做笔记,下面就是我做的 linux 系统编程、网络编程的笔记,可以在视频下方找到别人的笔记,进行增删改查,变成自己的笔记。
开始面试
八股文
如果说学习计网、OS、数据结构是让自己有理论基础,学习linux系统编程、网络编程是让自己有编码基础,那么八股文就是让自己有面试基础。
有些知识点你可能掌握了,但问的时候却回答不上来,终究还是不熟悉套路。
可以在 CSDN 输入「XXX八股文、XXX面试题」这些关键词,就能找到很多,收集到了就复制到 typora 中,达到一定量了,就按自己的知识地图分好类,面试前做看一看就可以了。
对了,小林的《图解系统》和《图解计网》,大家一定要在面试前看明白,看明白了,系统和计网就 不怕面试官问了。
关于八股文的收集,给大家推荐一个我关注的博主@拓跋阿秀 ,这位博主非常的优秀,本身拿了字节 offer,他在他的公众号上分享了他收集的八股文资料,我的大部分八股文都是来自于他分享的资料。
说一说我在面试中遇到印象比较深的面试题,希望能能给大家一个参考:
C++
说说const与指针?
定义常量有哪些方法?有什么区别?
声明和定义的区别?
static的作用?
指针和引用的区别?
vector和list的区别?
map和unordered_map的区别?
map和multimap的区别?
类的三大特性是什么?说说自己的理解
多态的实现原理(虚函数表指针方向)
操作系统:(看小林coding《图解系统》就没问题了)
进程与线程的区别?
什么是内核空间?
内存空间分配?
内存分配算法
内存页面为什么是4k大小最合适?
什么是外碎片、内碎片?
什么是硬连接
计算机网络:(看小林coding《图解网络》)
get和post区别?
三次握手?
四次挥手?
linux系统编程:
进程通信方式?
线程通信方式?
线程同步方式?
linux网络编程:
select、poll、epoll区别?
说说你理解的IO多路复用?
说说你做的web服务器?
算法题:(要求手撕)
两个有序set容器合并成一个有序序列(归并排序)
求一个字符串里有几个子字符串(kmp算法)
数字转换成罗马数字(考虑所有情况即可)
将一系列区间合并成几个闭区间(区间合并)
其它:
git的commit命令提交的是什么?idex是什么?
说说gdb的常用调试命令?
说说你常用的shell命令?
简历
简历里一定要有项目,我的项目就是 linux 网络编程课程后面的web服务器。下面就是我写在简历上的项目:
虽然很简单,只能实现网页看文字、图片、音视频,但我也会写上去。
面了这么多家,发现面试官在意的不是做了什么项目,而是在项目中得到了什么,更注重你的思想感悟。
关于技能栈,我会将我所有知道的技能都分类写上去,但一定确定自己会,而且有自己的理解,不熟的我都不放,不给自己挖坑。
面试官一般也只问我简历上的内容。好好准备一下八股文,面试前多看看小林的《图解网络》和《图解系统》,基本就没问题了。
面试
这么找到面试机会呢?
我给大家说说我的做法:
第一步,下载boss直聘,填写好自己的在线简历;
第二步,刷boss直聘,这个软件有个机制就是,你看了对方的岗位,hr会看到谁看了他的岗位,他有可能会看你的简历,如果hr感觉合适就会联系你。当时我晚上失眠,刷到两三点(不要学我),第二天醒来发现有一大堆hr发消息。而且上面会有很多大公司的员工兼职招聘,因为大厂的内退奖励很丰厚,有人靠下班刷 boss 赚了几万内推奖励。
第三步,多面试,提高自己的面试能力。我最开始面试的时候话都说不利索,到后面都可以侃侃而谈了。就是同样的话说多了,熟练度高了。
怎么进的腾讯的?
我的面试并不多,也就十几家。
发现小公司都不是很愿意给面试机会,反而大一点的公司面试机会更多一些,其中华为的 od 招聘最愿意给机会。
我最开始的目标是找个小公司,月薪六七千我就满足了,但在长沙还是很难实现。此时接二连三有一些大公司 boss 直聘上给我留言,我知道自己面不上,每次都是回答「对不起,我不太合适」。
后来收到多了,我也烦了,就直接答应了腾讯的 hr。想着简历也不会过,过了去体验一下大厂面试也好。
所以也没很重视,甚至面试前几分钟都还在睡午觉,还好有闹钟。
面试是在周六下午,一共两面,面试问题并没有想象中的难,基本上就是我上面罗列的八股文。
让我比较不适应的是手撕算法,我第一次面试手撕,还有点不习惯,还好当时学 AcWing 算法基础课时每一道题都写了好几遍,才不至于卡壳。
一面就是手撕归并排序,我写出来了。二面手撕 kmp,我没写出来,但说了 kmp 的算法思路。运气比较好,面试官让我通过了面试。
事后总结了一下,感觉能通过面试是因为:
简历上的我都会用;
基本问题都能回答上来;
平时刷题都是实打实的手敲(没怎么刷题,主要就是写了AcWing算法基础课的练习题)。
大家平时一定要多刷题,去大厂手撕算法是必不可少的。
怎么回答自己半年的空窗期?
我当时就将自己两年间的经历和心路历程都跟面试官说了一下。
期间聊到了自己为什么要转行?为什么要选择互联网?对自己而言最重要的是什么?
面试官基本都比较满意我的回答,后面复盘,认为面试官在意的应该是我是否是一个有规划的人,想通过这个问题看我是不是脑子一热就转行的人。
面试遇到的槽点
hr压价
hr 压价是普遍存在的,如果可以以更低的成本招聘到人,何乐而不为呢?
刚开始遇到压价我很慌,后面 offer 拿了几个,也就有了应对措施,给大家分享一下:
多面试,多拿offer,只要手里有一个offer,就可以和hr谈价;
确定好自己的目标薪资,如果offer达到薪资目标就考虑五险一金、工作时间、平台,做好横向对比,选取最合适自己的offer;
放宽心,工作是双向选择的结果,你在选择公司,公司也在选择候选人,如果公司不愿意开出满意的薪资,可以换一家。
外包
我自学之初就看了很多网上的文章,基本都说不要去外包。
我面试过程中也遇到了外包,是武汉的某某科技(国企),看了我的简历,boss上找到了我,要了简历。后面给我打了个电话,说看了我的简历,认为我是可造之才,愿意给我个机会,做他们的外包,月薪六千,不包吃住,没有五险一金,一年后看表现决定是否让我转正,最重要的是不用面试。
当时听到这条件,我的确心动了,但想到我学了两年,却连面试都都没有,我不甘心,至少得让我面试一下,最后就拒绝了。
后来才知道,这是这个公司在忽悠人,人员流失非常严重。说出来是希望给大家一个参考,至少得面试一下。
最新型的外包就是 boss 上铺天盖地的 od 岗位,签的是外企德科,我也面了。
先机试,要求 150 分,三道算法题,好好做都能过。然后是两轮技术面,面试过程中都要手撕算法题。最后是人事面,都过了。
最后谈工资的时候,只拿到 11.9k,其中 2k 还是绩效工资,换而言之就是,你表现不好,就少 2k。
而且 od 是没有奖金和股票的,hr们都说不分正式员工和 od,实际上是你干着和正式员工一样的活,他们有年终奖和股票,你没有。
不过大家没有路的话,也可是试试,毕竟是大厂。
面试不问技术
我遇到最奇怪一个面试,莫过于第一场面试,全程没问我技术问题,只问我会不会喝酒,有什么兴趣爱好,会不会打麻将,我回答得都不好,但面试官还是让我过了。
因为刚开始转行面试,我很珍惜这一次的机会。
到后面的时候越想越不对劲,写代码还要会搓麻将?感觉不靠谱,就拒绝了二面。
后来才了解到,那个行业技术人员混的一般,混得好的都是很会「来事」的。
如果大家遇到这种奇怪的面试,希望大家多考虑一番,不要因为转行而没有自信,感觉自己低人一等,对求职公司委曲求全。
公司这么多,总会找到一个愿意接受我们的。
后记
基本上就这些了,我的经历只能给大家一个参考,如果你已经工作了,并且想转行,希望能给你一些参考。
如果你是学生,我建议你去看@编程指北的学习路线,更加全面。
也可以关注@CodeSheep,羊哥的 B 视频在我转行初期给了我很大的指导。
若是想找 C++ 相关的技术群,我建议找@程序喵大人,喵哥的技术交流区是我见过 C++ 氛围最好的技术交流群。
也许分享的博主有些多了,不过我真的从这些博主那里学到了很多,所以推介给大家,如果大家不喜欢,也不要骂我,我没收他们钱。
还有一点就是,如果大家时间充足的话,我建议大家一定要学一学 Python 和 MySQL,我现在正在恶补。。。
谢谢大家,祝大家工作、生活、学习愉快!
人生没有白走的路,每一路都算数。
你好,我是公子龙,毕业于中科院,前大型计算机竞赛冠军,现算法工程师,拿过九家大厂的 offer 。
北漂七年,从小白到计算机竞赛冠军,读研时通过实习和比赛收入 50 万,点击蓝字查看我的编程之路。