前段时间最忙的事情是换工作,而在今年的年度计划其实已经提到了,只是作为了隐藏任务,不能让太多人知道。而今工作逐渐入轨,尘埃落定,可以说些闲话了。
尴尬的求职经历
在2019年度总结讲述了我从毕业开始到选择城市、选择公司的经过。读书的时候忙着混学生社团和商学院的双学位,在本专业技术方面的布局不深,大三的时候才开始找同学参加比赛积累代码经验。庆幸的是,两个熟悉的小伙伴拉了我一把,使得我有了第一技术竞赛的经历。大四的时候又有一个相熟的老师带我做一些学校以外的项目,还给我发工资。算是既解决了钱的问题,又解决了经验的问题,使我毕业之后不至于沦落到找不到技术岗位工作的尴尬情况。要不是一路有这么一些贵人相助,我估计现在在从事技术以外的其他工作糊口饭吃了。
由于上面讲到的原因,技术入门比较晚,对当时的求职环境也没有相关的了解,毕业之后基本上是一张白纸。当时我的简历上只有:
- 一个双非高校的本科文凭
- 一段学生社团的经历
- 一个小比赛的二等奖
- 一个老师带的小公司项目
当时不知道背什么八股文,刷什么算法题,找工作也基本处于糊里糊涂的状态。回忆起当初找工作的场景,没有海投简历,也没有经过太正规的面试。第一份正式的全职实习是辅导员在群里发了一家智能家居公司的JD,我看着自己蹩脚的技术实力,随便选上了。
后来是通过一个同学的介绍,在实习期没结束的情况下来到了另一家创业公司。介绍的同学跟我说,这家公司还算是新兴行业,前景不错,又舍得带人,目前还在招创始团队,可以带上我一起搞事情,还让我去公司看一下。我真以为是看一下,连简历都没有带上。到公司楼下我同学才说要带简历,我才急急忙忙去附近的打印店打了几份。于是我依稀记得把简历拿给当时CEO看的时候,打印的油墨还没彻底干透。现在回想起来场景还算十分尴尬了。
后面就是一个摸爬滚打的过程,我本来是用JAVA做安卓开发的,之前还做过一些STM32的嵌入式开发;在第一家实习公司的时候又被安排到用Object-C写IOS,后来同学介绍的这份工作是写C++的,技术栈可以说是十分凌乱了。刚入职的前面一个月连C++的代码和ROS框架都是现学现卖。菜狗没有话语权,做什么做什么吧。
当时老板对我的印象也很直接,就是个菜狗,问啥啥不会。一个月之后接了一个解析电池协议并且做数据上报的程序,正好我当年写STM32的时候有一些解析协议的代码经验,完成了任务,老板才对我有了改观,也就有了转正的希望。
创业公司摸爬滚打
创业公司也算是有一点好处,可以接触到整个产品的各个方面。我自认为是一个学习能力很强的人,通过当时的一些有经验的同事的教导,也对大项目的软件设计有了初步的理解。当时老板问我在公司的职业规划,我大言不惭,说是要当公司的系统工程师,负责切分项目的子系统,并且可以指导实现。
后来公司有一个自动化车间的项目,公司一行五个人——导航、视觉、机构、电气、软件集成,开始实现这个项目。后来这个项目维护了整整三年,一直到我离职的时候都没有完成交付。不过话说回来,这么几个人能够把一个能稍微稳定运行的自动化车间做出来,也是不容易了。
当时自己没有什么拿得出手的技能,就没有太严格的分工,说白了就是个打杂了。机械臂的程序没人会,于是就自己学机械臂编程;然后又自己写出一套机械臂跟主架构适配的软件;中间件没人会,于是就自己通过中间件做子系统的功能切分,并且自己实现;任务调度的程序没人管,于是自己设计了一个任务调度软件,控制整个机器人运作。
这个项目给了我对系统整体把控的经验,我开始通过一些中间件,进行子系统的拆分。后来的工作,确实在我当初定下的SE(系统工程师)的方向走。后来接触的中间件多了,开始给公司设计一些复杂一点的系统架构。后来公司立项的时候,也确实做了不少系统架构设计的工作。达到这个程度的时候是两年半,可以说我比当初设立的目标进步快了——或者换个角度——公司发展的速度比我想象中的慢了。
后来我开始嗅到了一些不太好的味道(参见文章:探病)开始做一些换工作的打算。
第一次睁眼看世界
上面提到,曾经找工作的时候没有经历过十分正规的技术面试,也不知道面试官的套路,对面试一直都是比较惧怕的。庆幸我在创业公司的时候也承担了一些面试官的工作,这种惧怕减轻了几分。我本科的时候修过人力资源课,知道简历要怎么写,于是这种惧怕又少了几分。
凭借着自认为掌握了某些“架构设计”的能力,开始向外投简历。接到第一个面试电话的时候,我清晰的感觉到面试官过了10分钟已经想要挂电话了,问的问题十问九不知,后来只好让我自己介绍自己的项目经历,以填充剩余的面试时间。
在这电话打通之前我就想到会挨对面打了,毕竟公司小,没有牛人,很多技术的方面不太重视,外加上并没有很多项目经验,也自然会吃亏。
战场上,子弹是躲不过的。
自己水平菜,挨打是必然的了,反而挨打一下可以让自己知道小公司跟外界的水平差距,算是第一次睁眼看世界的过程,这就是我明知道第一个面试会被暴打而并不拖延着的不去面试的原因。
当时面试官无非是问了点很简单的问题:
- 进程间是怎么通信的
- 多线程如何进行通信如何进行同步
- ROS框架是如何工作的
别的其他问题我也记得不太清了,虽然现在看来这些问题再简单不过了,但是当时做开发真的只停留在应用的层面,只算是懂点皮毛,自己也没去深究原理。
这次挨打的收获还不少,起码我开始知道市场上的技术实力跟来我公司被我面试的那些人比,天壤之别。也知道了其他公司注意面试者哪些方面的硬实力。更重要的是,开头提到我比较惧怕面试的情况,在清晰对方的需求之后,就有所克服了,于是我进入了下个快速迭代的过程。
快速迭代升级过程
这次又是快速的学习能力帮助了我。
所谓面试,其实不过就是问答。项目经验我是有的,只是没有把技术点提炼出来,在开发的过程中也没有关注具体的技术点。下载个招聘软件,招人的公司一大堆,在我眼里就是一个庞大的面试题库,只要脸皮够厚,不怕被打,面试能力很快就能提升上来。
我开始刷题,学习上次面试失败的关键技术点,这个阶段开始发布很多技术博客,包括leetcode周赛的、多线程通信的、多进程通信的、TCP的、刷源码的。光看没用,还要输出(博客),还要自己实现一遍,还要自己想一遍套进项目里面。其实学习的过程很欢乐的,像是打开了之前一直使用的一些黑盒,看到里面的原理,这才开始感叹开源世界的伟大,好东西并不难获得。
这个跟外界接轨的过程持续了将近两个月,基本上就是面试-被打-学习-下一次面试-再被打-再学习的循环,像极了一个软件产品从缺陷到逐渐完善的过程。两个月之后出现了一些关键变化,我已经可以拿下一些普通的offer了,这就代表我可以开始投一些自己真正想去的企业了。说到这里,对那些不怎么想去但是为了刷面试经历还被投了简历的公司说声抱歉了。
后来我已经可以跟不同的面试官谈笑风生了,一边回答他们的面试题,一边还能跟他们讨论具体的业务实现,还能说出不同实现方式的利弊。选择多了以后,开始可以分辨什么是好东西,什么是不好的东西,不再像刚毕业时候的样子了。
总结出了几个经验:
- 不要怕面试失败,子弹是躲不过的
- 用到的工具、软件,有源码要多读读源码,用而不知道原理,并不高明
- 刷算法题有用,可以增加对代码逻辑的理解
- 多看点东西,然后才能分辨出好东西
- 沉淀、迭代、不断跟外界接轨
具体的面试技巧介绍参照另一篇文章(那篇文章还没写出来)。
尾声
将每一个五年当作一辈子来过。
那些毕业后去创业公司,摸爬滚打,然后辛苦跟市场的水平接轨的日子,仿佛都是上辈子的事情了。
上个五年完成的事情:
- 完成了本科双学位的学业
- 找到了稳定生活的城市
- 真正成长成一个初级工程师,有技术能力,有骨气,有耐心
- 培养了阅读的兴趣
下个五年的要完成的事情:
- 谈一段没分手的恋爱
- 成为能带团队,能带产品的技术骨干
- 保持阅读,保持观点输出
- 找到一份除工作以外的事业
之前一直都没怎么发过稍微深入的技术文章,借着到处面试的契机才开始把博客当成技术博客在做。如今入职完了,之前留下的很多坑都处于更新中的状态,等闲下来会把他们一一更新完的。