记跳槽

新公司入职一个多星期。简述一下这一次求职的经历。

萌生跳槽的想法是因为和不同的朋友吃饭的时候谈到工作,没有比较就没有伤害,越聊越觉得应该换。

原单位的弱点在于:

  1. 薪水低。
  2. 公司福利有限。
  3. 是外包公司,实际工作主要在客户公司。

原单位的优势在于:

  1. 公司的人际环境不错,大家相处比较融洽。
  2. 有一些接受内部培训的机会。
  3. 公司有的项目接触到嵌入式各个方面。

但是,一旦我进入一个项目,去到客户公司工作的时候,我自己公司能够给我提供的东西就变得非常有限。随着自己之前的同事不断离职,又没有太多机会认识新的同事,久而久之,就会觉得自己的归属感变得很弱。

而同时,在客户的公司虽然也能受到比较好的对待,但终究感觉不是他们中的一员,自知随时可能离开,所以也没有很强的归属感。

这样两边不着的时间长了,就会感到一种悬浮的状态。

总的来说,推动我跳槽有三个深层因素:

首先是待遇。起薪不高也就罢了,涨薪也实在是非常有限,经济上没有任何促使我留下来的动力。

其次是外包本身。除了我刚刚说的悬浮状态以外,外包的工作往往不会涉及一个公司的核心竞争力,这就注定这个岗位不太可能受到客户公司最大的重视,因为作为客户公司,它也做好了准备这个人随时可能走。

第三,是我之前做的项目本身在我看来不但重复性非常大,而且我只有一个人做,没有更厉害的人带我。虽然这样看起来拥有更大的自由度,但是我在这个状态也很难进步,很难学到什么是更好更正确的实现方法。时间长了不但自己做起来没有动力,更是会有一种危机感,如果不回到一些核心的开发岗位上,自己的能力很快就会退化。

这些因素最终促使我萌生跳槽的想法。

接下来就是怎么找工作以及找什么工作。

早在我萌生跳槽想法的一年前(2020年夏天),在和一个前同事聊天的时候他就向我提过他们公司。鉴于我当时的项目开始四个月,还没有走上正轨,我觉得如果我现在离职,那这半年可能基本啥也没干成,所以就没有考虑。

于是在我21年底决定跳槽的时候,首先就找了这个同事和他再聊聊他现在的公司的情况。他表示对公司环境和工作情况还是比较满意的。但是法国人说话一般比较注意,不会用特别安利的口吻来表达,而是处处透露出那种:这只是我个人的看法,完全不代表你可能面对的情况,你一定要谨慎选择。

随后,我发现我公司的一个manager,也是我这位前同事的manager被他挖角去了这家新公司。这为我提供了另一层保障——一位经验丰富的manager认可了这家公司。

再然后,我发现我在客户公司有一个同事,他就是从这家公司跳出来的。和他交流之后,他表示这家公司的C语言水平非常高,虽然他做的测试岗位可能不那么尽如人意。而我想要面试的职位正好是C语言的开发,所以这又是一层背书。

至此,我已经把这家公司作为我的首要目标。

圣诞元旦双节假期期间我开始复习C语言和其他的基础知识。复习大概有三个角度:

  1. 在电子书平台上找到C语言面试相关的书籍(程序员面试宝典之类)看基础知识
  2. 在网上找C语言的测试题(选择题)
  3. 在Codinggame和Codewar上写一些编程题

由于我之前没有系统学过算法,还恶补了一下基本的数据结构(在B站上买了一个期末考试临时抱佛脚的视频……发现其实帮助不大,大学期末考不太注重实际的东西,倒是概念的边边角角要搞清楚)。最终我数据结构的学习方式是看动图和Youtube上的短讲解。

经过这些准备之后,我在2022年初收假之后就向我前同时递交了简历。

内推或许是找工作最好的方式。入职培训的时候,HR说,内推最后入职的概率是40%,但是海投入职的概率是0.2%……

内推的好处是可以通过熟人充分了解公司的一些内情,比如工作环境,大家的工作状态等等,这些东西往往在面试上不太容易表现出来。从公司的方面,也可以通过私下的途径,了解应聘者是个什么样的人——只是一个熟人的熟人?或者一起共事过等等。

我和我的前同事之前一起做过一年的项目,他对我非常了解,我相信他是替我说了好话的。

面试一共三轮。

第一轮面试是和HR面试。主要的内容是互相介绍,他向我介绍他们公司,我向他介绍我自己的经历。

我事先做了功课,看了他们的网站,所以对于他说的东西,我基本都已经有了了解。而在自我介绍的时候,我也着重从我之前做C开发的经历出发,坦然说了自己为什么不喜欢现在的工作,以及我通过自己前同事的途径了解到这家公司等等。

出乎我意外的是他直接问了我当时的薪水,我也就如实相告了,他告诉了我一个他心目中我应该拿到的“市场价”。最后我实际拿到的就是他报的这个区间的最左边……

第一轮面试比较顺利,和HR一对一沟通我一向不怵。在我看来面试的过程是一个互相考核的过程,不存在谁在上谁在下。我会像对待一个未来的同事一样和他交流,他也应该用这样的态度和我交流,如此我们彼此都能感到比较舒适。如果HR是来给我出难题的,那我不去这家公司也罢。

第一轮面试结束之后,HR发来了一道编程题。具体内容我不能说,但是算是写一个工具类的程序。里面涉及了数据结构算法,文件的操作,当然还有指针、数组、字符串处理等等C语言最核心的内容。

这个考核没有严格的时间限制,题干里写了大约是4个小时的工作量,意思是如果你花了太长的时间,要么是你能力实在不足,要么是你把题目理解错了。我实际花了一个晚上一个白天,大概8个小时。

这种考核方式的好处是非常接近实际的工作。它不限制你使用Stackoverflow,不限制你时间,你可以按照自己的节奏来编程。

更重要的是,它除了考察最基本的C语言基础以外,还考验你会不会使用Git来管理自己的代码?会不会用如Python这样的工具来写简单的测试代码?会不会使用Makefile等编译的工具?如何组织程序结构?代码是否可读性强?等等一些在实际工作中非常重要,但在普通面试考核中很难考察到的方面。

对于这个笔试的形式,我感到非常满意。在做的过程中,我先用一种算法写出了一个版本,但是我迅速发现这个算法的效率低下,所以我又换了个算法重写了一个版本,所以多花了一些时间。我用了Makefile,用Git管理了我两个版本的代码,用Python写了测试程序,基本上做到了自己能做到的最好。最后在Readme里我还写了我代码可以改进的空间,以及其他的可能更好的实现方法。

事实上,最后我写下的这些东西可能是最重要的。

来到了技术面阶段。技术面我的是两个拥有15年经验以上的架构师,算是公司最资深的技术大牛。

他们和我讨论了我的笔试代码,首先当然是考察我是不是自己写的,是不是了解自己的代码(这方面当然没有任何问题),其次就是最优的解决方案。多亏我之前临时报了算法的佛脚,我在Readme里写的两句话都派上了用场。第一个是我代码的改进方案,他们是认可的,认为我确实需要这样改;第二个是更好的解决方案,我的想法是正确的(虽然我完全不会实现),但是显然这已经足够让他们流露出满意的态度。

面试的第二个环节是没有人告知过我的——现场做Code Review。面试官当场给我发了一个PDF,里面有12段代码,每一段代码里都有不止一个错。我需要在25分钟里尽量看这些代码(他们给出的标准是看六七个就算差不多),一方面要理解程序想要做什么,另一方面是程序做错了什么,最后是作为Reviewer我会给出怎样的修改意见。

我还是惊讶于自己的临场发挥能力以及自己两年前积累的经验……我25分钟做完了7个题(他们流露出惊讶的情绪),然后基本上90%的问题都被我发现了。

最有趣的环节是其中有一个充满了++的表达式,我坦诚地说我不知道它最后的结果是什么。他们回答:

“我们也不知道!事实上,这样的代码就不应该出现在任何程序里,考点就在这,看不懂就对了!”

于是技术面在欢乐的气氛中结束,他们几乎直接表达了对我的满意,并且给我介绍了接下来的面试流程。

第三轮面试就更多的是一个交流,技术部门的头头和我未来的领导一起面试我,向我介绍了公司的具体情况,做什么项目,人员的构成之类的。比较轻松就过去了。

最后HR给我带来了录用的结果,和薪酬。

我讲价失败了,接受了他提出的薪水。虽然有点遗憾,但是还是比原公司强得多。

如果总结一个教训,那就是一定要同时多找几家,然后互相比价,这样才能谈薪,否则是不会有人理的……

我从上周入职,新同事都非常友好,大家在公司看起来也都很开心。目前工作的内容还属于入职培训的阶段,他们入职培训做的非常不错,也是有一个入职项目,里面有从易到难的不同编程题,但是这一次是在它的指引下,用公司自己写好的模块,逐步地实现,倒数第二个题就是在这个新环境重做那道面试题。通过这个方式逐步熟悉公司的基本代码库和工作方式。

这个入职的过程也让我感到非常享受。总之,我很期待接下来的工作,也希望能在新的工作里重拾对编程的一点点热情。

写在后面

不期给大家带来什么帮助,毕竟每个人能力不一样,每个人的目标不一样,所处的环境也不一样。

写下来权作一种记录。