# 机械工作 2 年,自学转行进腾讯了!

大家好,我是小林哥。

之前分享过很多读者校招拿到大厂 offer 的经历,他们都有一个共同的特点。

就是在大学期间对于计算机基础准备的很充分,比如数据结构与算法、操作系统、计算机网络、数据库、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++

  1. 说说const与指针?
  2. 定义常量有哪些方法?有什么区别?
  3. 声明和定义的区别?
  4. static的作用?
  5. 指针和引用的区别?
  6. vector和list的区别?
  7. map和unordered_map的区别?
  8. map和multimap的区别?
  9. 类的三大特性是什么?说说自己的理解
  10. 多态的实现原理(虚函数表指针方向)

# 操作系统:(看小林coding《图解系统》就没问题了)

  1. 进程与线程的区别?
  2. 什么是内核空间?
  3. 内存空间分配?
  4. 内存分配算法
  5. 内存页面为什么是4k大小最合适?
  6. 什么是外碎片、内碎片?
  7. 什么是硬连接

# 计算机网络:(看小林coding《图解网络》)

  1. get和post区别?
  2. 三次握手?
  3. 四次挥手?

# linux系统编程:

  1. 进程通信方式?
  2. 线程通信方式?
  3. 线程同步方式?

# linux网络编程:

  1. select、poll、epoll区别?
  2. 说说你理解的IO多路复用?
  3. 说说你做的web服务器?

# 算法题:(要求手撕)

  1. 两个有序set容器合并成一个有序序列(归并排序)
  2. 求一个字符串里有几个子字符串(kmp算法)
  3. 数字转换成罗马数字(考虑所有情况即可)
  4. 将一系列区间合并成几个闭区间(区间合并)

# 其它:

  1. git的commit命令提交的是什么?idex是什么?
  2. 说说gdb的常用调试命令?
  3. 说说你常用的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,我现在正在恶补。。。

谢谢大家,祝大家工作、生活、学习愉快!

人生没有白走的路,每一路都算数。


最新的图解文章都在公众号首发,别忘记关注哦!!如果你想加入百人技术交流群,扫码下方二维码回复「加群」。

img

上次更新: 5/1/2022