文组转职前端工程师三年回顾
2023年1月1日
2023 新年快乐! 2022 年真的是一转眼就过了,但仔细回想起来,其实过去一年来有些时候觉得日子特别漫长难熬,大概因为 2022 年对全球程序员而言,是个非常动荡的一年。 2021 软件业景气好公司大举招募,到了 2022 总体经济下滑又大举裁员,让大家像是坐云霄飞车一般。特别是到了 2022 年末,各家大厂纷纷裁员,每周都有让人窒息的坏消息。
在踏入新的一年的同时,意识到自己也转程序员满第三年了。在 2020 年一月决定转职时,对未来充满着盼望,却也有满满的不确定。现在回头看,真的觉得那时的自己很大胆,同时感激过去几年来的幸运,让三年后的现在,有个充满挑战的职涯。
趁着转行满三周年之际,决定来写一篇回顾文,纪录一下转行前端的心路历程。因为过去写的几篇部落格文,时不时会收到读者询问转程序员的事。但其实很多问题我难以回答,毕竟每个人的背景、个性、偏好都不同,我有的只有自己的经验。
因此对于这篇回顾文章,我没有特别的预设,纯粹是分享我自己的经验,所以在读的时候,可以当成一个参考点就好。可能读完你会打消想转职的念头(因为我会分享我转职的历程多崎岖),但也可能会更有动力转职(毕竟看到这么踉跄的人都能转职,甚至拿到 FAANG 的 offer,自己没道理不能)。
在看完上面这段预防针后,假如你还有兴趣读这段转职的故事,那就让我们一起开始吧。
2020:在最糟的大环境下转职
我是在大学毕业后工作了约三年后才决定转职。在决定转职前也看了非常多网路上的文章,特别是看到《半路出家程序员在矽谷》的部落格。那时看到该为部落格主,透过 coding bootcamp,非本科转职进到矽谷一线 FAANG 软件大厂 。
那时看完后不知哪来的自信,觉得自己也可以做到,于是也报名了 bootcamp 决定转职。但现实完全不如我预料,我在 2020 年 1 月开始 coding bootcamp 的冲刺,到了 2020 年 3 月底投入软件业求职市场。假如你对于 2020 年初的世界还有一点印象的话,大概知道那时是全球景气最差的一个时间点。
没错,正当我要开始我的软件业求职时,COVID-19 席卷全球。在那个当下,整个世界都充满着不确定性,因此企业为了确保有足够的资本度过不知会延烧多久的疫情,开始想办法降低支出。所以新闻上陆续看到公司开始冻结招募,接着开始裁员。
我不记得当时自己到底投了多少简历,但几乎都是石沈大海,拿到的面试机会了了无几。大概因为在网路上看过不少转职案例,在转职前我天真地以为,只要学会写程式,就等同于能顺利转职。但在真正开始求职后,深刻感受到不是那么回事。
仔细想想,网路上的案例分享,多半是幸存者偏差;实际上一定存在很大一部分没有成功转职的案例,只是多半没成功的都不太会写成分享。看到别人成功就以为只要做了一定能成功,那将忽略那些没成功但没有被分享出来的例子。这也是为什么我在写自己的经历时,会很强调我自己很幸运,因为我体验过那种明明很努力,但未来却仍旧没着落的片刻。
当时我是辞职全心找工作。现在回头看,除非本来已经存不少钱,不然不太建议这样。当没有收入,未来又还没着落时,很容易陷入胡思乱想的恐慌中。起码我是这样,所以过得特别煎熬,每天都活在自我怀疑中,每天都在想要不要干脆放弃。
不过很幸运地,我最终还是找到了一份软件业的工作。上面提到,我是工作三年后转职,所以事实上我找到的那份工作,是会让我降薪转职的。所以即使有了 offer,我仍然有一点犹豫。不过那时我有参加 bootcamp 筹办的求职小组,在小组线上聚会时提了我的状况,那时 bootcamp 的校长说,在大环境动荡、未来局势不明确的状况下,有机会就赶快把握。在听了这个建议后,我就接下了我的第一份软件业工作。
学习没有速成
虽说我算是成功透过三个月的 bootbamp 转职到软件业,但在实际成为前端工程师后,我深刻体悟到「学习没有速成」这个道理。虽然成功转职,但在实际上工后,每天都过得战战兢兢。特别是最开始几个月,时常会怀疑人生,想说自己到底为什么没事找苦吃。
我还记得自己写的第一个小功能时,因为不是太复杂的东西,经过两天多的努力总算写出来,自己测试后都有如预期运作没有 bugs。那时还为自己能写出实际要被使用者用的功能而暗自窃喜,殊不知那个喜悦只延续了不到一个早上,因为那个没有多少行的 PR (pull request) 竟然收到将近二十处的评论。
其中不乏「这边为什么需要这个?」、「为什么这里这样写?」、「这边这样会不会造成 XXX 问题?」、「这写法之后要怎么拓展?」。在收到这些反馈后我重新思考,发现的确我提交的第一个版本,充满了冗余的程式,或是可以被精简的逻辑,甚至有着我自己没有意识到,但却会影响到其他程式的地方。
公司里严谨的资深前辈在 PR 上的提问完全是当头棒喝,我深刻体会到,能写出某个功能,跟能写好某个功能,完全是两件事。现在回头看,我很感谢第一间公司遇到的前辈,对于我程式写不好的地方,他不会直接说这样写很糟糕,而是透过提问的方式,循循善诱协助我修改代码。也因为遇到足够耐心的前辈,我才能坚持下去,没有半途放弃。
然而,因为体认到自己离「写好程式」还有很长一段距离,我开始努力恶补自己的不足。针对每次 code review 收到的反馈,我都记在自己的笔记当中。同时花了很多时间读软件工程的书、文章,也看了非常多国外的讲座会议(当时的自我提升心得可以看这篇部落格文)。
就这样慢慢磨了一年半,到了后期每次的 code review 不再那么惨烈。与此同时,市场从景气低迷重新复苏,特别是在软件行业,因为 2021 年的世界仍是以居家为主,所以软件需求变得特别大,程序员全世界都很缺,这促成了我第一次的前端工作海外求职。
2021:认清自己的不足
我是在 2021 年的中下旬开始找海外工作,当时的求职心得可以在这边看到。
2021 年的景气之好,真的是现在难以想像的。几乎各间大厂、新创公司都在大举招募,不论海内外都是。当时我打开 LinkedIn,每周会有十来个猎头分享职缺资讯。因为当时的市场景气好,全球各地都在缺程序员,所以 2021 年中时,仅有一年半前端工作经验,同时又是文组转职的我,才有机会找到转行后的第一份海外工作。
那时的市场有多缺人呢? 我是 2021 年十月加入前公司,因为那是一间德国的新创公司,只有在德国有办公室,原本我是人要搬去德国。他们有请一个专门协助办理跨国搬移 (relocation) 的机构,协助我办理欧盟蓝卡等事项。然而办到一半时,整个欧洲的疫情重新大爆发,那时因为我家人不太放心去疫情重灾区,所以我本来询问公司能不能晚点再就职。但因为他们有拿到新一轮融资,大举扩张下太缺人了,就直接说可以让我远端做,然后会改签一份让我以外包的身份跟他们合作的约,让他们能够跨国付我薪水,同时该享有的公司福利都会跟在德国的正职员工一样。
就这样我就以远端的方式,开始了我的第二份前端开发工作,以及第一份海外工作 (虽然人仍在台湾就是了)。以文组转职一年半的身份找到海外工作,而且是一份能够远端、自由度极高,且底薪部分就超过年薪 170 万台币的工作,看起来是件让人开心的事,但对我来说其实并不是。
假如你有点进上面那篇求职心得,你大概会读到,我在 2021 年的海外面试,其实有拿到像是 Amazon 这类 FAANG 等级的大厂面试,但我最后却去了间德国的新创公司。这不是因为我比较喜欢新创公司,而是因为我大厂的面试被惨电,是那种被电到我在面试时怀疑自己是不是不会写程式的程度。
在各家大厂中,最让我崩溃的一场面试,是一题 LRU Cache 的白板题,并且限定要在 O(1) 时间复杂度来处理 get 与 put。现在的我看这题目,觉得并不是太困难,但在转职一年半时的我,由于资料结构的基础不够熟,在面试时虽然能想到可以用 hash table 搭配 doubly linked list,但要实际实作时却写不出来,我边写边卡的同时,面试官问了一句「你是不是不熟 JavaScript 呀?」,那个不经意的问题,完全成了我极大的创伤。
我那时都已经成功转职,也全职做前端开发了一年半,慢慢开始对写程式有点自信,结果在面试的时候被说「你是不是不熟」,这几乎摧毁了我过去一年半建立起的。那场面试不仅 LRU Cache 写不出来,后面被问到 Redux 的实作,一路被追问到底核心,以及被问到如果要我来改写 Redux 来提升其效能,我会如何改写。我也是完全被问倒。不用面试官多说,我在面试完后的唯一心得是「我的技术深度真是有够浅」。
现在回头用比较客观的角度看当时,可以看到在景气好的时候,其实就算是文组转职,国际一线大厂如 Amazon 也会发面试给你,所以可以不用妄自菲薄,不要因为自己是转职的人就自我限缩。上面有提到的半路出家程序员在矽谷,他也是转职到 FAANG 当中的大厂。但同时也可以看到,假如你的底不够扎实,就算拿到面试机会也没有用,因为最终还是会被刷掉,而且很可能像我一样,面试时被狠狠打脸。
2022: 潜心练功
开始远端做德国的工作后,我先让自己好好放松了一阵子。在欧洲公司工作的好处之一,就是工作与生活平衡非常好。德国虽然年假遇到周末不会补,但因为公司特休假给了 28 天,我一年总共有 36 天的假。此外,德国对加班有很严格的规定,劳动法规让雇主要求员工加班的代价会很大,所以基本上不太会有加班的状况。
然而,在工作生活平衡好的反面,就是职涯的前进速度会相对缓慢。在远端高自由度的反面,是时常会觉得自己工作的很抽离,没有那种「我是跟团队一起在打造一个很棒的产品」的感觉,而是比较多「我就只是在开发一个功能」之感。虽然产品经理偶尔会分享使用者实际给的正面反馈,但多半是贴文字,所以并没有那种「我正在做一件对使用者很重要的事」的感觉。
所以在欧洲惬意的工作步调下放松了半年后,我还是决定要再次挑战大厂。也因为有半年的缓冲,我得以慢慢从先前大厂面试的创伤中恢复。然而我也深知,假如我不好好提升,不管我再面几次,都一样会被电得很惨。所以我花了很多时间,把资料结构与演算法好好学扎实,经典的 LeetCode 问题一题都不放过;同时加强前端的知识深度,去了解一些平常有在用的开源套件,背后是如何实践的。
幸运的是,因为在工作生活平衡很好的欧洲公司,所以我下班跟周末有很大量的时间可以潜心练功。这让我在 2022 年再度挑战大厂面试时,能够有好的结果,包含拿到人生第一个 FAANG 的 offer、第一个换算成台币超过 400 万的年薪。
对我来说,潜心提升自我这段时期最大的收获,是我更加理解写程式是怎么回事。在深度钻研的过程中,因着理解背后原理而获得喜悦。拿到大厂 offer 与翻倍的薪水固然让人兴奋,但让我更有感的是在大厂面试中,我可以跟面试官深聊 React Query 如何实作,甚至要我当场写一个 cache 机制我也写得出来。
对比起 2021 年写 LRU Cache 白板题被问是不是不熟程式语言,在 2022 年跟 Amazon 面试的某一轮,我在用 BFS 解完某个题目后,面试官进一步追问,被追问时,我能辨识出那个追问题要用 topological sort 来解。那时解完这题,面试官有当场说觉得解得很不错;对于文组转职工程师的我来说,这微不足道的称赞,却带给我比提高薪水还要多好几倍的成就感。
(备注:关于 2022 年的面试心得,可以 参考这篇)
2023: 重新理解软件工程
2022 年末我来到了新加坡,开始转职后首次的海外大厂工作,也是转职后第一次搬到海外来生活。在进到大厂后,我对于软件工程这件事有了重新的理解。然而重新理解的过程伴随着不少阵痛。
去年我有读到 vgod 大大写过《程序员的修炼与成长(1) — 程序设计→ 软件工程》一文,里面谈到了程序设计与软件工程的不同之处。我个人非常推荐那篇文章,但我是直到自己真的进了大厂后,才对于这两个概念的区别有更深刻的体悟。
我自己前两份前端开发的工作,都是在整个公司的工程团队不到三十人的小公司。然而现在待的大厂,光是我在的大组的工程师就上百人,更不用说全公司的工程师有上万个。在这样的大型团队中当程序员后,完全能理解为什么 vgod 大大会说「写程式这件事,其实只是软件工程中的一小部分」。
我的前两份开发工作在上班时间绝大部分都是写程式,第一份基本上都是做资深工程师切出来的功能,而第二份工作虽然有自己负责的产品线,但因为那个产品线相对独立,没有跟其他产品线的业务重叠,所以开发起来也很独立,所以多半时间也都是花在写程式上面。
直到来大厂后,才见识到什么是大型合作。我们组做的东西影响范围不只有自己的组,还会跟其他的业务与产品线有关联,所以当要加一个新功能时,会需要跟许多其他组有合作。在这个过程中沟通与校准占了很大比例的时间。
除了要花大量时间沟通与校准外,每个功能都需要有很完善的技术设计 (technical design)。我在进到大厂前,从没写过技术设计文件 (design doc),但到了大厂后,技术设计审查没有过,是进不了开发的。而我有点像回到刚转职时 code review 被给了很多评论与提问;进大厂后技术设计文件审查,一开始也是收到很多的评论与提问,主要是我许多的考量不够全面跟深远。
这个过程让我更深刻体会到,即使功能都一样,当一个产品有上千万甚至上亿用户,会跟只有小量用户是完全不同的事。从前端的角度,每当上了一个新功能,除了要考量国际化(翻译)、AB Testing、以地区为单位的监控外,还要考量如果某个用户本来在有开放某功能的地区,但可能旅游到没开该功能的地区,这时要如何处理等各类议题。
由于进到大厂的时间还不长,我到目前为止仍觉得自己还在适应中,每天仍感觉自己快被各方资讯淹没、写设计文件时还是会担心是不是有什么没考虑到、轮到 oncall 的那周则时时刻刻提心吊胆。这些都是我在新的一年需要克服的修炼。
结语
以上总结了转职三年以来的心路历程。过去三年有许多难熬的片刻让人感到漫长,但在新的一年回头看,又觉得时间过得好快,总觉得自己才刚转职,没想到一转眼已经过了三年。如同最开头提到的,在写这篇文章时没有特别的预设,仅是把自己过去使尽全力往前走的经历分享出来。
感谢阅读至此的你,2023 新年快乐 🙂