文組轉職前端工程師三年回顧
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 新年快樂 🙂