这篇文章记录了我去年年末找工作的经历。最大的感想是,程序员找工作不一定需要刷题,很多公司是不考算法题的(除非目标就是那些字母组合公司);其次是要有一些公开作品,比如开源项目,这样可以避免被使用某些单一维度评价;最后是不要提前对职位建立太多期待和想象。
2017 年我从扬州大学对面的大专毕业,在家待业五年后,终于没有钱再支撑下去。于是去年十一月开始正式找工作,十二月底拿到第一个 offer。今年年初来到上海,开始了第一份全职工作。
我一直把去某个公司上班看作是一个备选项。这几年经常幻想能写出一本畅销书,或是做出某个创业项目,然后就可以发财一直自由下去。但是基于钱出发的事情都不太有趣,基于兴趣出发做的事情又做得太多,所以钱越来越少,关于收入的焦虑感越来越强,最终只好投降。
个人背景
对于 IT 相关职位来说,我的优劣势大致如下:
劣势
- 专科学历
- 土木相关专业
- 待业五年
- 零工作经验
- 技术栈单一(Python/Flask)
优势
- 技术栈专一(Python/Flask)
- 参与开源项目的经验(从 2019 年开始做 Flask 的维护者)
- 一本书(《Flask Web 开发实战》)
- 一些技术演讲
- 创建和维护技术社区的经验(HelloFlask)
- 组织技术会议的经验(PyCon China 2019,FlaskCon 2020)
- 连续三年的微软 MVP 奖项(Python 方向)
从 2016 年实习即回家开始算起的话,我的简历上大概有五年零三个月那么大的空白。不过虽然没工作,这五年也尝试了各种有意思的事情,同时为了获得收入打了一些零工——做了七八个外包项目。
这些外包项目不算优势也不算劣势,但是可以用来填充简历——简历上放了两个开源项目(Flask 和 APIFlask)和两个外包项目。而有些劣势也不完全算劣势,比如非科班自学编程,有些 HR/经理会认为不专业,有些则认为这佐证了学习能力和执行力。
求职方向
我对目标职位的三个需求是:
- 不加班
- 面试不考算法题
- 现场(on-site)工作
「不加班」是基本要求,我需要一份正常工时的工作,一来是为身心健康着想,二来是因为我需要有业余时间来写书和做开源项目。
「面试不考算法题」是因为不想浪费时间去刷无聊的算法题。算法题对我来说没有任何乐趣,相比之下,我更喜欢开发 Web 程序和设计 API。
想要一个「现场(on-site)工作」是因为很想去体验办公室生活,顺便体验在不同的城市生活。在家呆了五年后,我也有些厌倦在家工作。太容易过度娱乐和过度工作,模糊生活工作的边界。我想要有一个办公空间来把工作和生活在时间和空间上分隔起来。
国内公司普遍加班,互联网公司普遍考算法题,因此能够满足这三点的只有「非互联网 + 外企」职位。结合我擅长且感兴趣的技术栈(Python Web)和想要去的城市(上海),最终的求职方向是「上海 | 外企 | Python 后端工程师」。
职位搜寻
我在下面这两个地方搜集了 14 个和 Python Web(尤其是 Flask)相关且位于上海的外企职位:
- LinkedIn 搜索关键词「Flask」
- 一个偶然发现的职位采集站点
Python 和 Flask 相关的工作还是挺多的,我只收集了上海 on-site 的外企职位,如果扩大范围还可以找到更多。后来我把一些没有来得及投递或已经收到拒信的 Flask 相关职位放到了 GitHub 上。
这两个网站的职位都提供公司网站的招聘链接。我倾向于在公司网站投递简历。虽然没有证据,但我认为这会比在招聘网站上投递更容易被看到。如果招聘网站上直接展示你的资料,比如学历和工作经验,这会降低 HR 打开简历的概率。不过招聘网站可以用来参考薪资范围。
职位投递和面试
我的职位投递策略是只投递自己想去的职位,按照优先级投递,能够拿到一个 offer 就可以。为了把最多的时间投入在优先级更高的职位,我按照意向程度和技术栈匹配程度把这 14 个职位分成了三批。
第一批两个职位在 11 月 20 号左右投递:
第二批四个职位在 12 月 7 号投递:
- 戴尔 EMC:offer
- Autodesk:二面挂
- 万事达:电面通过,后续没有继续面
- 特斯拉:简历无回复
我统计了每一个职位的时间花销,包括准备面试和面试本身花费的时间。因为不用花时间刷算法题,所以这里的准备主要是:
- 看出现在职位描述上或是简历技能列表里的相关技术知识,也就是俗称的八股文
- 练习英语口语,主要是在口语网站上和一些外国人模拟面试对话
- 了解对应职位和公司,收集相关面经
- 准备常见非技术问题的回答
- 准备项目经历介绍
- 针对每个职位更新简历
育碧
时间花销:22h 21m
- 11/19 上午官网投递简历
- 11/19 下午收到约电面时间的邮件
- 11/25 电面二十分钟,主要聊经历、技术栈和面试安排
- 11/25 下午收到跳过笔试的邮件
- 11/26 收到技术面安排邮件
- 11/30 技术面,一个半小时
- 12/6 拒信
育碧是一家游戏公司,这可能不应该作为申请职位的主要考量因素,但这的确是最吸引我的一点。哪个喜欢玩游戏的程序员不想去一个游戏公司上班呢?而且入职后还可以免费玩所有的育碧游戏。我把它放到了职位申请列表的最上面。
电面时 HR 告诉我职位对应团队的同事看了我的 GitHub 资料,觉得很惊艳。后续还帮我跳过了笔试环节。不过技术面发挥得一般,有一些算法和 Python 元编程相关的问题没有回答上来。两位面试官在会议室里,声音不是很清晰。
这是我自大学毕业以来的第一次技术面试。在之前的几年里,我有过五六次找工作的经历,大多是朋友推荐,最后因为各种原因不了了之。唯一进入面试的是一个德国的远程工作,因为我的英语水平一般,加上对方有一些口音,所以还没来得及探讨技术话题就匆匆结束了。
博世
时间花销:24h 13m
- 11/22 中午官网投递简历
- 11/22 下午接到经理电话,算是电面,聊了经历、技术栈、目标职位的职责,最后约了技术面时间
- 11/24 技术面
- 11/25 技术面反馈,布置小作业
- 12/1 基于小作业的跟进面试
- 12/2 谈薪资
- 12/3 口头 offer,协商薪资
- 中间来回几轮薪资谈判
- 12/25 HR 回复职位因为疫情推迟招聘到明年二月
博世的职位描述和我的技术栈非常匹配,而且要求看起来很简单。简历处理效率很高,上午投递申请,下午就接到电话。
整个面试过程很顺利。技术面和育碧类似,主要是问 Python/数据库/HTTP/Linux 相关的一些东西。技术面后布置了一个小作业,是实现一个包含特定功能的 Teams bot,给了一周时间。提交作业后的第二天 HR 来谈薪资,再隔一天给了口头 offer。不过 offer 薪资和意向差得很远,我就请 HR 再帮忙协商协商,后来 HR 不知道为什么理解成我拒了 offer。经过几次艰难的谈判后我开始妥协,然而一个月后 HR 回复因为疫情暂停招聘了……
Autodesk
时间花销:13h 25m
- 12/7 官网投递简历
- 12/9 下午接到 HR 电话,聊了经历、期望薪资、简单英语对话考察,电话刚挂没多久就收到拒信
- 12/10 接到另一位 HR 电话,直接约了一面时间
- 12/13 一面
- 12/14 HR 约二面
- 12/15 二面
- 12/23 拒信
这个职位一开始发生了一些乌龙,后来才明白是因为简历被投递的部门拒了,然后又被另一个部门的经理打捞回来。一面就是经理面,主要聊了我的经历、公司业务和技术栈等等。这位经理很赏识我,整场面试一半时间都在挥动橄榄枝,这给我屡屡失败的面试重新建立了很大的信心。
可惜最终止步于二面,因为有一位面试官对我的稳定性表示担心。二面是技术面,除了一个关于排序算法的问题卡顿了好久才勉强回答,大体表现还不错。
戴尔 EMC
时间花销:10h 2m
- 12/7 官网投递简历
- 12/16 接到 HR 电话,介绍面试安排
- 12/17 连续两场技术面,各一小时
- 12/22 早上 HR 电话安排终面
- 12/22 中午终面
- 12/22 下午 HR 电话谈薪资
- 12/29 确认薪资和 offer
接到 HR 电话就直接介绍了面试安排,没有聊其他东西。技术面第一场问了很多涉及各个方面的技术问题,还有一段英文对话考察;第二场出了一道简单的算法题,二分查找,不过基于矩阵的变式没做出来。职位描述里除了 Python 和 Flask 还列出了很多我不太熟悉的东西,后来发现这些都没有问。终面是经理面,主要聊一些技术方向、职业规划之类的话题。终面结束后下午就接到 HR 电话谈薪资,29 号确认了 offer。
收到 offer 后非常开心,毕竟是人生第一个 offer,第一时间就开了薯片庆祝:
最终拿到 offer 的职位反而是这几个面试里花费时间最少的一个(大部分技术问题相关的准备都已经在前面的面试做得差不多了),也是唯一考了算法题的一个。
万事达
- 12/7 官网投递简历
- 12/28 HR 电面,聊经历、期望薪资、简单英语对话考察
- 1/4 因为已经确认了戴尔 offer,所以取消了后续面试
因为安排太晚,所以没有继续面。后续 HR 说经理对我的简历很感兴趣,问我要不要再聊聊,但我实在不想再折腾面试了。
除了上面这六个主动申请的职位,这段时间还有三个被推荐和邀请的职位,完整参与面试的是下面两个。
Dropbase
时间花销:6h 6m
- 11/20 收到面试邀请邮件
- 11/27 一面
- 12/1 拒信
一个湾区创业公司,技术栈主要是 Python 和 Flask,远程工作。通过 APIFlask 项目找到我。这个职位看起来很不错,不过我当时更偏向找一个 on-site 工作,所以没有花太多时间准备。面试是和两个公司创始人聊天,没有考算法题,一周后收到了拒信。这个职位现在仍在开放,感兴趣的朋友可以试试看。
AWS
时间花销:29h 40m
- 11/16 内推提交简历
- 11/17 HR 电面,聊经历、期望薪资
- 11/23 一面
- 11/25 拒信
在 AWS 工作的朋友推荐,职位是解决方案架构师,这是我第一次了解到这个职位。30 个小时时间花销大部分是用来准备 Amazon Leadership 和 BQ 问题。一面挂,38 分钟。
备选职位方向:开发者布道师
在十一月底搜集和投递 Python 后端方向的职位之前,我先在开发者布道师(Developer Advocate)方向做了一些零星尝试。这个方向可以申请的职位并不多,而且大多和 Python 没有关系。最终只面了两个职位,均止步于一面。
这个职位的日常工作基本都是我擅长和喜欢做的事情:写作、演讲、分享、教学。如果目标职位的产品和我的技术背景接近的话,我就可以继续在喜欢的主题(Python)产出内容。
一开始是朋友推荐的职位:
面试后我继续申请了几个职位。下面这几个职位除了最后一个都是通过 Google 搜索关键词「Developer Advocate China」找到:
- TigerGraph:简历无回复
- JetBrains:一面挂
- AWS:简历无回复
- Jina AI:一面后转到后端工程师方向,所以没有继续面
微软
时间花销:22h 30m
第一次了解到开发者布道师这个职位是在四月份,当时微软第一次在国内招聘开发者布道师,朋友推荐我去试试。
我一开始认为自己是非常合适的人选,后来发现这个职位更希望候选人有 Azure、AI 相关的背景(职位名称是 Cloud Advocate 而不是 Developer Advocate)。折腾了很久,最后并没有拿到面试机会。后来微软有一个面向 GitHub & VS Code & Open Source 的开发者布道师职位,看起来更适合我,不过没有在国内开放。
因为我在捕蛇者说的一期播客聊到了这件事,所以有朋友推荐了 Nebula Graph 的职位。
Nebula Graph
时间花销:35h 29m
这是一个面向开源数据库项目 Nebula Graph 的「社区布道师」职位,对我来说是完全陌生的领域,所以有很多准备工作可以做。初次接触后我就迅速下单了两本图数据库相关的书(不过一本看了开头,一本还没拆封)。花了一些时间快速熟悉 Nebula Graph,在这个过程里发现了很多网站、文档、项目上的问题,所以就把这些问题整理了下来(见这篇《Nebula 网站和项目捉虫》)。然后陆续给他们的几个项目提交了一些 PR(代码贡献)。
一面后,我继续提交了一些 PR,作为「如果入职的话会帮忙做哪些改进」的提前展示。不过后面就再也没有收到关于下一轮面试的回复。直到一个月后的某天,HR 提起我上个月的 PR,按照社区规则要给我寄纪念品。微信对话的最后,我问 HR 对上个月的面试有没有什么反馈和建议,但是对方似乎没有看到这条消息。为了打捞学习图数据库沉没的成本,之后我继续投递了 TigerGraph 的布道师职位,结果一沉再沉。
不过没关系,我很快发现了更喜欢的开发者布道师职位——PyCharm Developer Advocate。
JetBrains
时间花销:23h 49m
- 10/14 官网投递简历
- 12/3 收到 HR 邮件
- 12/6 一面
- 12/22 收到拒信
JetBrains 的 PyCharm Developer Advocate 是这一批开发者布道师方向里最喜欢的职位,因为这和我目前擅长的技术领域一致,我可以继续做和 Flask/Python 相关的事情,不用盖新房子。
十月用 Google 搜索到这个职位,顺手就投递了。中间几次找在 JetBrains 工作的朋友打听,但是一直都没消息。十二月初终于收到 HR 的邮件,约了三天后面试。
收到邮件后,我开始幻想入职这份工作要做些什么,兴奋到很晚才睡着。其实早在申请职位的时候我就已经做了一番规划并注册了 hellopycharm.com。收到回复的第二天,我写了一封表白信放在 hellopycharm.com 上(然后在回复邮件时不经意地提起这个网址):
当时 JetBrains 刚刚在上海成立了分公司,取名捷并思,但我更喜欢「喷气脑」这个名字,所以之后还注册了 penqinao.com,放了一个 logo 在上面:
面试的前几天刚结束另一场英语面试,所以语言问题不大。而且我还在某个英语口语网站上找到同样来自捷克的另一位 Monika 来模拟面试(JetBrains 的 HR 也叫 Monika)。
月底收到拒信说她们希望找到一位有数据科学背景的候选人,不过我在面试时就问过这个问题,她们回答说没关系……
不过还是没关系,对我安慰作用最好的一种说法是,开发者布道师的工作对现在的我来说不是最佳选择。
我在过去几年做演讲和写文章都是跟随自己的兴趣和关注点,如果变成为某个公司的产品/项目——尤其是一个新的领域——做大量的输出,一定没法再像之前那样轻松愉快。另一方面,这类职位的公司也许更想找一位有很多年工作经验、技术栈丰富的人,而我正在找第一份工作,我还只会 Python。
PyCharm 这个职位收到拒信后,我就决定放弃这个职位方向。先做一个后端开发职位会是更好的选择,这样我就可以继续按照自己的喜好演讲和写作,没有任何拘束,而且也有时间踏实学东西,多做积累。
总结
在网络上经常看到有人每天都刷算法题(LeetCode),在无形中制造了一种不刷题找不到工作的紧张气氛。这次找工作才发现不一定需要刷题。有一些公司是不考算法题的,比如大部分非互联网行业的外企和某些创业公司。还有一个 GitHub 仓库记录了所有不需要白板测试(算法题)的公司名单,对应的网站可以用来检索所有不考算法题的开放职位。如果实际工作只是 CRUD,那么实现一个小项目,或是抽象一个公司产品的小功能出来远比考算法题有意义得多。
即使不用刷题,找工作也是一件很累的事情。要承受别人的否定,会认识到自己的局限和不足,然后还有无穷无尽的等待,等待充满随机性的结果。
更糟糕的是,我对每一个投递了申请的公司和职位都建立了太多的期待。除了面经,我还会收集每一个公司的各种信息:公司位置、公司评价、工作环境、周边环境,甚至附近有哪些合适的房子可以租。对于拿到面试机会的两个布道师职位,我都规划了入职后会做什么,具体到可以做的演讲主题、示例程序和教程,并且还提前注册了一些域名。当这些职位收到拒信后,这些期待和规划就全部落空。
经常会觉得自己是某个职位的最佳人选,然后就煞有其事地在晚饭时告诉家人接下来我即将会去哪个城市哪个公司上班……
12 月 22 号到 12 月 28 号是最黑暗的一周。22 号收到 JetBrains 拒信——最喜欢的布道师职位;23 号收到 Autodesk 拒信——最受赏识的职位;25 号博世回复暂停招聘——离 offer 最近的职位。如果没有拿到戴尔的 offer,那就要继续投递第三批职位,经历更多的面试和拒信,想想就后怕。
最后要感谢很多在这段时间提供帮助的朋友们。感谢辛庆老师、思为、清蒸、Aleck、伊洪、Tzu-ping Chung、Joshua Bronson、大妈、琚致远还有其他在 Twitter 和微信上给我推荐工作机会的朋友们;感谢开发者布道师前辈们——Anthony Shaw、思为、朱兴亮和范圣佑提供了很多面试建议;感谢职场前辈张晋涛老师在入职前给我科普了很多职场经验。
同时感谢每一个给我面试机会的 HR 和经理(尤其是戴尔 EMC 的 Fiona 和 Kui),不管我是千里马还是百里马,你们都是我的伯乐。