avatar
發佈

回顧我成為軟體工程師的第一個三年

Table of Contents

這篇文前前後後加加減減寫了一個月左右,其實到後來就是想到什麼就補一點,有點長,大部分也都是寫給自己看的,對於一個非本科系文科生轉職軟體工程師三年的感想有興趣的話可以隨便看看。

(希望之後可以規律起來,一年回顧一篇就不會寫這麼長哈哈)

為什麼要回顧?其實就是總結自己這三年到底在幹嘛。 身為一個軟體工程師(或是現代人),知識焦慮是一件很常見的事情,但定期回顧自己做過的事,知道自己走了多遠,有哪些地方不滿意,下一步是什麼以及可以怎麼調整,就會大幅減輕對當下的焦慮感。 總結的重要性 | by Denny

當軟體工程師之前在幹嘛

我大學是讀政大哲學,大一到大四都修遍了商管、心理、社會和資管的課,大三時去富邦當過一年半保險業務,在當業務讓我知道我喜歡跟人接觸,但我在工作時不想跟人接觸。

離開保險業後,積極投入社會學的研究,在大四下投稿科技部的大專生研究計畫,大五上計畫通過後寫了一篇頗析 IG 的文化研究論文,在此期間理解了走學術之困難,也決定了不會走學術。

軟體職涯回顧

TL;DR

  • 大學時,第一個貴人:我寫程式的契機
  • 工作時,第二個貴人:我開始懂「寫程式」是怎麼一回事
  • 離職前,第三個貴人:溫和地 mentor 我,漸進式地帶領我開發一些酷東西,也幫助我建立自信心。
  • 現況:下面會再談到。

2018.10 加入朋友組的讀書會,成為我軟體職涯的起點

  • 在當業務時,被身為軟體工程師客戶激發了對軟體業的好奇心,然後就這麼剛好看到我跳舞結識的朋友想開辦網頁前端的讀書會,當時沒想太多就加入了,而我朋友原本覺得我如果學不來就會自己退出,然而——我的軟體職涯就這樣誤打誤撞地開始了。
  • 遙想這時候的程度大概是 HTML, CSS, JS 這三個連聽都沒聽過,光是要知道「HTML 是網站的骨架、CSS 是網站的樣式,而 JS 撰寫互動邏輯」這麼基本的概念就花了我好久。

2019.04 開始實習

  • 其實這份實習也是來得很突然。
  • 當時我認為自己還沒辦法靠程式吃飯(事實上也是),於是我先去面了 Dcard 社群行銷的實習生,沒上之後再想要不要去咖啡廳打工。
  • 但同樣是籌辦讀書會的那位朋友的公司剛好在招募沒經驗的實習生,然後我就在連 JS 都不會寫的情況下成為了網頁開發的實習生。
  • 在實習期間其實非常痛苦。我朋友認為我應該在打穩一點基本功再進來,而我進來後非常認同,但同時我也是非常感謝這份磨練讓我更快踏入軟體業。
  • 總結來說,我覺得這時候就像是「還不會走,就想著飛」的時期,在 JS 都不會寫的時候,就要開始寫 React,而且寫的東西會直接進入產品。

2020.02 轉正

  • 轉正前我去環島一週半,去日本一週,然後就準備正式開始我的軟體職涯。
  • 轉正後除了正式成為上班族、薪水多了一點之後,整體感覺剛上個階段差不多。
  • 我依然在掙扎中,連自己 Debug 的能力都很不足,很常就是寫個幾行網頁就 crash,打開 console 發現滿江紅,然後我就望向旁邊的同事求助。
  • 大約 7 月時,有一位很資深的前端工程師進來我們公司,他非常強也樂於分享,在當時公司內部的讀書會聽他分享都受益良多,於是我開始巴著他問問題,後來也開始跟著他寫專案 —— 以此為一個分界點,我開始懂「寫程式」是怎麼一回事了。
  • 他是我職涯中的第二個大貴人。(第一個是開辦讀書會那位朋友)

2020.09 當兵

2021.09 離職

  • 實習加正職兩年半,我離開了我工作的第一間公司,因為「薪水、成長性和想做產品」。
  • 首先,上面提到的那位資深工程師離職了,帶我進來的那位貴人朋友也離職了,中間雖有另一個資深工程師進來,他是職涯中的第三個貴人,他用很溫和的方式 mentor 我(離職的那位教得很棒,但常常會讓我覺得自己是智障),但是他也不到一年內就離職了,於是我判斷在這裡繼續待下去的成長性會很受限。
  • 再來,這間公司是接案公司,因此很多東西開發完就整包丟出去了,其實很難碰到後續的持續維護與整合,而且在開發時也很常因為客戶的奇葩需求和時程而開發得很卡,Scrum 之類的開發流程也跑不太起來,我想更實際知道一個 SaaS(Software as a Service)在市場上跑起來會是怎樣,而不是開發完一個能動起來的東西就打包賣給客戶。
  • 最後,就是薪水。數字一翻兩瞪眼,所以也沒什麼好說的。

2021.10.18 進入現職的公司

  • 離職後休息了 18 天,我進入了現在這間公司,下面現況區會再提到。

為什麼是選在這個時間點回顧?為什麼是三年?

三年,是我擺脫冒牌者,成為正牌的時間。

我寫程式一年左右才開始懂什麼叫寫程式,到了最近才真正認同自己身為一個軟體工程師,我終於覺得自己夠格了,自稱為「軟體工程師」時不再會有一點心虛的感覺。所以,我也才敢發這篇文。

我終於走出了「冒牌者症候群」。

為什麼花了三年才肯定自己?

除了我本身就比較缺乏自信心的人之外,還有兩點原因。

  1. 可能性 這三年我始終在探索可能性,不論是其他職業發展的可能性,或是自己在軟體工程的可能性。 簡言之,我一直不確定自己有沒有那個能力,也不知道自己想不想當一個軟體工程師。

  2. 逃避並不可恥,但我一直選擇逃避 我的心態不夠強大,在面對到寫不出來的焦慮與不舒服,我常常選擇逃避,而不是解決問題,但其實這也可以說是我不夠相信自己,以及太急著要自己寫出來。 最後發現我太習慣逃避之後,就是逼自己去面對,後來發現在軟體開發上,只要肯花時間、積極找方法一定能解決問題。因為,你想做的事情幾乎都有人做過了,Google 一定找得到答案, 而有時候只是你被指派了超出自身能力太多或是奇葩到很難處理的問題。

下面會再闡述一下自己怎麼肯定自己的一些方法論。

怎麼肯定自己的?

這會從我菜鳥時遇到的問題來出發

  1. 不知道自己是不是在問蠢問題
  2. 不知道如何衡量自己的進步、自己努力的方向對不對
  3. 不知道自己夠不夠格

不知道自己是不是在問蠢問題

  • 只要你正確地問問題,就沒有蠢問題
  • 如何正確地問:「至少先查過資料、梳理過邏輯後,盡量仔細地描述問題,並跟對方確認自己是不是有哪邊理解有問題才會出 Bug。」
  • 簡言之,不要伸手牌
  • 推薦閱讀: 第一天上班就該學會的精準提問術

不知道如何衡量自己的進步、自己努力的方向對不對

  • 最簡單暴力的方式就是「去面試」。畢竟學那麼多就是要拿來應用,在工作上實戰,所以如果不確定自己現在的程度或學得好不好,面試時對方的 Senior 就會讓你知道了。
  • 不然就是從以下方式去判斷:
    1. 目標公司的 JD ,看看有沒有哪些 Technology Stack 還不會。
    2. 如果 Stack 都會,那就直接搜尋「XXX 面試 / Interview」 ,你就會看到不少題目,當然會有些濫竽充數的題目,但我覺得大方向一樣可以這樣去抓。
      • ex: React Interview
    3. 扎實一點的話,就是跟著 Developers Roadmap 上學,不過有些工具的選擇也還是建議看想去的公司在用什麼。

不知道自己夠不夠格

當初只待在第一間公司的時候,一直擔心自己離開那裡就找不到工作了。

我們恐懼,是因為未知。

我開始面試之後,就慢慢不擔心這件事了,因為我開始懂面試流程是怎麼跑,一開始一定會槓龜個幾間,但從這些錯誤經驗檢討,會知道面試的問題都大同小異(至少就 Junior Level 來說就是那些經典題),之後就是不斷在 「面試、檢討、補足知識」 這個循環。

而我在進入現在的公司後發現自己其實上手的速度不慢(據同事所說啦),在使用不同框架(Vue)的專案裡可以很快地就幫忙 Debug 、貢獻產值,這點大大地提升了自信心。

接下來就是稍微 cliché 的部分,會講講在面試之前,也就是我自己內心深深地覺得還沒準備好時,我是怎麼覺得自己準備好的。

首先,要很努力。 程式學習是非常符合「高原現象」的,請直接看圖。

高原現象

接下來就是 Learn, Practice, Balance

Learn

  • 學習,不論是從前輩、朋友、影片還是文章中吸收知識。
  • 並且要不斷地在學習過程中迭代自己的學習方法,自己比較習慣做中學、學完作?看影片?看文章?要不要記筆記?怎麼記筆記?要不要順便把筆記產出成部落格訓練表達?等等。

Practice

  • 「學而不思則罔,思而不學則殆」(雖然我討厭儒家,但不得不說這句話真的講得不錯)
  • 學習了之後,下一步就是要「動手做」,一直在紙上談兵其實會很沒有踏實感
  • 而且在網頁開發這條路上,有千百種出問題的方式,像是本機設定、程式碼版本、套件版本、瀏覽器等等,甚至是少打標點符號或是打錯字都會出錯。
  • 所以學過的東西,有非常非常非常高的可能性沒辦法應用在你當前的專案。
  • 這時候如果之前有動手做過一次,至少會踏實許多,知道這個方法確實可行,只是要跟現行專案的環境配合的話,還需要多做一些設定,至此能初步縮減問題的範圍,不至於完全沒有頭緒。
  • 而完全沒有頭緒是初學時非常容易發生的,一個 Error 你完全沒辦法下手。
  • 軟體工程最棒的就是可以敲敲鍵盤就在 0 跟 1 之間建造屬於自己的世界

Balance

  • 生活中不能只有寫程式。

Burnout 101 source

  • 軟體工程師普遍都有嚴重的知識焦慮,而當代其實許多產業都有類似的問題
  • 讓我意識到需要平衡是在我開始健身跟學日文之後。
    • 健身讓我感受到自己的體能、體態都有在往好的方向,而運動產生的多巴胺也讓我比較不容易焦慮,體力變好跟健康飲食之後,我也不太會在白天就昏昏沈沈的,也睡得比較好。
    • 日文是因為我很喜歡日本,能更接近喜歡的文化讓我感到很幸福,而語言相較於程式單純很多,就是有背有練就有,這種簡單粗暴的反饋也讓我對自己更有自信,而這份自信也可以擴及到寫程式的自己身上。

健身 讓我感受到自己的體能、體態都有在往好的方向,而運動產生的多巴胺也讓我比較不容易焦慮,體力變好跟健康飲食之後,我也不太會在白天就昏昏沈沈的,也睡得比較好。

日文 是因為我很喜歡日本,能更接近喜歡的文化讓我感到很幸福,而語言相較於程式單純很多,就是有背有練就有,這種簡單粗暴的反饋也讓我對自己更有自信,而這份自信也可以擴及到寫程式的自己身上。

最後,多跟人聊聊 & 滑 Twitter & 刷 Leetcode 心得

這三件事讓我理解了我沒有問題,我在寫程式所面對的挫折,是一種普世的經驗。 就像 [Leetcode - Coin Change] 的某解答留言區這樣

leetcode comment

  • 原來不是只有我會在電腦前因為解不出來,然後看了解答還是看不懂而崩潰呀!

  • 不會寫不是自己的問題,而只是跟一般人一樣,需要經歷從不會到會的過程。

  • 有些難的東西就是難,學個好幾天、好幾週甚至半年一年都是有可能,而且大家也都是這樣一步步走過來,然後看到我資工系的朋友在刷 Leetcode 時並沒有比我輕鬆多少,讓我意識到原來大家也都經歷過跟我一樣的階段呀!

  • 崩潰完了、情緒過,就該開始學習了。

  • 流程:「直接看 Code -> Google 找文章、解答 -> Youtube 看影片逐格詳解 -> 直接問人。」

  • Code 看不懂就看字,直接把題目 google 看有沒有人解釋,解釋也看不懂就看影片,yt 其實一堆人在拍詳解,逐行解釋還會附流程圖,邊暫停邊看花久一點一定會懂。

  • 我自認為不是很聰明的人,但照著這流程,肯花時間我幾乎沒遇到真的學不會的東西,只是可能需要花很多時間、補很多邊角知識,但一定學得起來。

我的現況

職涯

我現在在一間新創公司,工程師只有我跟我主管兩個人,會處理到兩個前台(正要整合成一個),一個後台,一個統一的後端,還有一個幫合作公司開發的廣告投放後台。 第三年的薪資已經是第一年的一倍左右,但相較於許多身邊的人還是算普普通通而已。

當初來這邊原本的預期是全端,但後端因為還沒什麼概念,只有偶爾可以幫忙開開 API,主要還是負責前端的部分。 又由於公司太小又經歷了一些變革,其實挺多時候沒辦法專心寫 Code,進來快一年了,原地踏步的感覺居多,最近趨穩才開始比較充實,準備要自己一個人寫全部的前端,然後會有兩個資深全端幫忙 Code Review,希望能有所成長!

Technical Stack

目前自己的不算多,有一定程度但也不算太紮實,不過對於該學什麼、想學什麼以及該怎麼把東西學得紮實比較有方法了。

基本上前端相關的基本需求我都做得出來,但做出來只是第一步,持續整合優化、系統設計等等都還有許我ㄉ需要加強。

我參與過的專案

  1. 劇院場管 ERP(原有紙本流程全面線上化)
  2. 劇院場管官網
  3. 健身房 ERP(含員工、排課、合約、商品等管理畫面)
  4. Custom React UI Library (Open Source)
  5. 某產品的 Landing Page
  6. 企業與網紅洽談業配的 ERP
  7. 部落格廣告投放平台 (Side Project 喊很久都沒動工)

裡面比較有挑戰性的應該就是 React UI Library,其他 ERP 的經驗都大同小異,主要也都是由一個資深開好架構,我只是進去實作而已。

下一步?

職涯

工程師的職涯發展有分 Engineer Manager 跟 Individual Contributor。 未來會想往 Engineer Manager 發展,但這也要先跳到有那種制度跟規模的公司呢! 推薦閱讀:軟體工程師的修煉與成長Podcast

Technical Stack

補技術債,整理一下經手過專案的技術,處理過的問題,以及當初在寫時沒搞懂的東西,在面試時要確保跟專案相關的不會被問倒。 再來就是「走深」跟「走廣」。

走深

  • 主要就是 JS, TS 跟 React / Vue 都要更熟悉,React 畢竟還是大宗,而 Vue 則是現在公司的主要開發框架。

走廣

  • 在 Web 生命週期的各個角色(FE、BE、SRE、DevOps、DBA)的基本職能至少都要會,畢竟走到後面多少都會碰一點,其實就像是 Google 的 SRE 一定都比我會寫 Frontend 的概念。但說起來也只是基本的啦,大概就是自己作一些 Side Project 把東西都走過一輪吧。
  • Internet
  • Security
  • 可以的話,多摸摸看其他語言,Rust, Golang, Java / Kotlin 之類的。

除了深度跟廣度之外,還有 Leetcode 、資料結構和各種演算法也是持續累積,現在就是每天至少寫一題,有空多寫一點,然後先把基本題型 [Blind 75] 刷完。

雖然這些東西是都列出來了,但不管哪個都不是個小主題。 就按照一個不會壓垮自己的步調慢慢學,看看明年回顧時我能學會多少吧!

結語

回顧一下我當軟體工程師的初衷:

對「匠人精神」的嚮往 、 自由的工作模式和軟體業蘊含的可能性。 自己一直都在心中崇拜十年磨一劍的那種匠人,而寫軟體正可以打造各種酷炫的網頁或系統。(但寫了三年發現自己都沒做什麼 Side Projects,真的是要莫忘初衷嘿)

如果能跟三年前的我聊聊天,我會跟他說:

  1. 關於轉職初期,打好基礎跟選對公司很重要。 最好的情況下是能找制度相對完整,有 mentor 或至少有人可以輔導你。 我覺得我的職涯選擇目前走得跌跌撞撞,再一次的話我一定會先進有點規模的公司,但其實當初也有許多現實因素的取捨就是了。
  2. 軟體工程師是一份不太能沒有愛的職業。 沒有愛,你將會非常痛苦。 因為我們要學的東西太多了,如果你不喜歡軟體,我很難想像你有辦法對此投入這麼多時間跟精力。
  3. 工程師確實是個挺舒服的職業。 沒有太多規矩、上下班自由可遠端、只要有電腦在哪裡都可以工作 薪水普遍也有中上水準,雖然軟體在台灣的天花板比較低,但出國或在外商還是能有很不錯的發展。(一樣是選擇比努力重要,慎選公司。)
  4. 非本科系轉職真的不輕鬆,你看到的成功案例背後是更多中途跳船的。(倖存者偏差) 跳船不一定是能力不足,可能只單純是沒興趣。 轉職需要努力跟機遇(一般人的話),很聰明的那種做什麼都會成功,像我就不是,一路上運氣成份真的太多了。 但是我非常感謝當年願意嘗試看看的自己,以及一路上遇到的貴人們。
  5. 可能性並不會因為你認真在軟體業耕耘被收縮 我其實挺確定我最想做的事不是寫軟體,但是以「工作」來說,我現在最好的選擇就是寫軟體,行有餘力再去自己有興趣的領域多加耕耘,盡量兼顧夢想與現實囉。 (我最想做的是創作或是分享吧,可能的方向有作家、部落客或講師之類的,但不管哪一個我都還無法拿來維生,因此就在顧好本業的同時抓時間充實自己啦!)

通篇其實好像也沒什麼重點,就是紀錄一點心路歷程,大部分都在跟自己對話,感謝也辛苦讀到這邊的讀者了!

最後,感謝一下這三年間遇到的貴人們:小白、Steven、Bob、Jay Chen、Jay Chou、Boogie Yan、Kyle Mo。

你們每一個都給予了我繼續往前進的動力跟方向,讓我不至於寫到一半中途跳船。 現在,我已經航向偉大的航道,準備繼續在新世界闖盪一波了。