在 2019 年的盛夏,我從全端工程師訓練營 ASTRO Camp 畢業後,進入了一間外商公司,成為軟體工程師,主要使用 Ruby on Rails 開發一套頗具規模的電商系統,到今天也差不多滿一年了。應五倍紅寶石邀請撰寫此文分享心路歷程,讓想要轉職軟體工程師的朋友可以有一些參考。
先介紹一下我自己的背景,從冷凍空調與能源系畢業後,做過工地主任,參與醫院和電子廠興建、另外做過空調設備產品工程師,在轉職成為軟體工程師之前,任職於一個擔任政府能源政策顧問角色的基金會,算起來在空調和能源領域有八年相關經驗。
很多朋友問過我,上一份工作做得順風順水,穩穩地待到退休也沒問題吧,哪裡來的勇氣放棄相對有保障的未來?
而且轉換到完全不同的領域,幾年來經營的人脈和投入的資源都帶不走,這不是拿青春打水漂嗎?
簡單來說,我就是不甘心。
忙碌的工作後,「散步」竟成為我生命中僅剩的理想
理論上工作應該是為了生活,但我出社會後有一段時間的生活似乎是為了工作。
曾經作為工地主任,除了進度和預算控制之外,依照不同情況我還要管理工地現場將近兩百人。要知道,工地現場龍蛇雜處,不是人人都有機會接受正常水準的教育,每天有數不清的狀況要處理,有時為了開會每週要往返兩、三個城市好幾趟,案子在趕的時候,一週工時可以超過 130 小時,經常還得喝酒應酬,而且沒有加班費,完全責任制,日復一日,暗無天日。
在這個體制下討生活的自己越是努力,磨損越嚴重,氣力放盡想要做出一番成績,同時也換到滿腹辛酸苦楚。我像是資本主義的一條狗,狗碗裡盛著對未來的幻想和憧憬,時間永遠不夠用,理想遙不可及,偶爾能出門散個步就很滿足了。
這樣看吧,每天二十四小時,除去睡眠,剩下清醒的時間裡面很大一部份都在工作,如果工作都不開心,這日子過得不是很悲慘嗎?從這個角度來看,就算收入還過得去,那一度被認為是穩定的生活,還是更像某種災難現場吧,隨著時間經過除了銀行存款和滿身病痛之外還能剩下什麼?
後來到了基金會上班,雖然還算是得心應手,但總感覺做的就不是自己喜歡做的事情,怎麼會快樂呢?
到退休前還有幾十年,如果整個職涯充斥著麻木、缺乏熱情的日常,那簡直難以忍受,我不甘心躲在舒適圈裡重複著本來就會的東西,最後苟活成一個埋怨和懊悔的樣子。
職涯的探索:我想改變現狀,離開重複性質的工作
身邊很多人和我一樣,可能沒有什麼資本去冒險,而且容易被旁人的價值觀挾持,想說工作嘛,至少得找個本科相關的好學以致用,別浪費了所學專長和寶貴青春如何云云 ⋯⋯
在決定轉職成軟體工程師前,我也都有在思考怎樣的職涯路線才適合自己,但一直到接觸到程式之前,只是約略地知道自己不想要什麼而已。
回顧過去,距離 coding 最靠近的時候,或許是大學時漫不經心把玩 Visual Basic 的那會兒,雖然平常也喜歡打電動,卻始終無法將熱忱投射到程式設計這件事上。
當時的我想像,寫程式就是要每天釘在座位上十幾小時,從上千行難懂的文字和演算法中除錯,工時長壓力大 ⋯⋯ 不難理解為什麼傳說中工程師過勞死的比例這麼高。
直到某次和一位學經歷相近的前輩閒聊中,我聽說了 Ruby on Rails 這門基於 Ruby 程式語言的框架,讓寫網頁變得簡單,並且可以幫助你快速將一些想法實踐並上線投入市場。當然心裡還是有些懷疑「寫程式真的有這麼容易嗎?」
這位前輩在相對短的時間內自學有成,並找到理想的工作。從他和我分享的經驗來看,對比眼下所見暮氣沉沉的工程界,那個領域的人們似乎對自己的工作充滿了熱情。
年近三十,機會稍縱即逝,掂量自己剩下的時間和精力,我也想試著抓住生命中不同的可能性。
(Photo by Klaudia Ekert on Pexels)
自學程式的盲點與困境:沒有目標,哪裡都到不了
從那之後我開始嘗試自己找資源學習,有鑒於我對於其他語言的認識甚少,所以 Ruby 可以算是我程式設計的初戀(而初戀一般都是美好的),相較於印象中外星文一樣的 C 語言等,Ruby 看起來更像人類的語言,沒有太多括號,設計優美、簡潔且容易理解,我至今還記得第一次宣告變數和呼叫方法當下的奇妙感受。
然而即便對象是 Ruby 這樣友善的語言,非本科的我一開始自學還是相當挫折,初踏入一個全新的領域,從環境建置到語言特性,無知的大坑好像越填反而越深。
遇到問題搞不定,結果 Google 查到的答案裡面有更多看不懂的關鍵字和名詞,沒辦法分辨哪些是重要的問題,很容易偏離原本想解決的情境,一回神已經被更多的問題纏繞,非常沒有效率!
「很容易從原本的一個問題,衍生開展成更多問題,然後自然而然不停發散地查下去......」
我偶爾會需要加班,下班後時間非常有限,卻又不曉得如何過濾資訊找到重點,時不時出現的錯誤畫面更加劇心中的慌亂和煩躁,自學過程晴時多雲,偶有絕望。
雖然下班時間靠著興趣支撐,幾乎都留在辦公室看書,按照著網路上的教學漸漸能做出一些東西,自己能做出一些小功能,但沒有人協助檢查我的 code 是不是符合業界工程師的標準或設計原則?我所理解的觀念到底是否正確?
任何學習成長的過程都是辛苦的,更何況是正在踏足從未接觸過的領域,想起 高見龍(龍哥) 在課堂上也曾提過類似的觀念:
「就像電玩一樣,迷宮裡通往寶箱的那條路肯定充滿各種機關陷阱和怪物,如果你前進的過程沒有感覺到辛苦,很可能代表目前的方向錯了。」
現在回顧這段自學經歷,我犯下的一個大錯是對於自制力抱著荒謬的信心,沒給自己壓力訂定明確的學習目標,以至於被「好像有學到」的迷霧籠罩,看不清學這些技術的目的和背後的需求。
當初做第一個畫面,找了個單純的網頁參考自己摸索排版,前前後後花了快一週,效率極差,算是明白了沒有目標,哪裡都到不了。
到底是什麼協助我成功轉職軟體工程師?
我會說是:環境的力量。在自學找資料的過程中看到龍哥寫的《為你自己學 Ruby on Rails》。雖然有出版實體書,但整本書的內容也免費提供在網站上,而且內容有在更新,留下問題的話也能得到回覆,對於初探程式領域的新手來說,在學習上幫助很大,實在很佛心。
後來得知高見龍(龍哥)的公司五倍紅寶石為推廣 Ruby 程式語言做了不少事,除了經常有免費講座之外,每週另有舉辦實體默默會,讓大家有個場地可以討論交流程式相關資訊、認識不同企業的工程師們小酌幾杯或玩玩桌遊。
一開始因為在學習的時後卡關想找人請教,沒想到在這認識了很多專精程式領域的資深工程師們,不會嫌我提出的問題太弱太麻煩,聊起程式的話題全身熱烈的發光,言談間散發溫暖和親切,眼眸裡的世界澄清如洗。在這環境之下,不用害怕自己是新手而不敢發問。
也因此我終於體會到線下聚會的強大之處,就是說把自己投入到這樣一個環境裡面,去沾染大家的熱情,每個人程度或許不太一樣,但都有相似的目標,可以互相鼓勵並且分享所學,透過別人的角度看看這個世界,在相似之處得到共鳴,相異之處增廣見聞。
學習程式語言的高效率工具分享
除了參加 ASTRO Camp 外,我也慢慢掌握了一些學習程式語言的方法和工具:
- Markdown 筆記
- 心智圖
- 架設技術部落格
- 時間管理工具:Rescuetime
Markdown 筆記
隨著經驗的累積,我也慢慢掌握了一些學習的方法和工具,首先就是用 Markdown 標記語言整理程式碼和筆記,這非常易學好懂,上手很快,約莫花個十分鐘就能學會並開始使用了。
我比較常用 HackMD 這個國人開發神好用的服務寫 Markdown 筆記,支援 Sublime/Vim 編輯器熱鍵,還能直接貼圖相當方便,直到現在工作也是每天用得很兇。不過缺點是單篇筆記上限只有十萬字,內容量超過某個程度網頁速明顯會感到變慢,我不得不將一些筆記拆開再用 tag 整理,但目前又不支援跨筆記搜尋內文,覺得已經不太夠用,最近 Notion 正火,有各種方便的模板,也支援全域內文搜尋,將來會考慮搬過去。
心智圖
這個以前在設計簡報或者做 brainstorming 的時候會用到,從來沒想到居然也可以搭配空間記憶用來消化學到的東西,這是從 ASTRO Camp 課程中向 Amos 老師學到的方法,我自詡記性極差,差到偶爾會想不起自己今年幾歲的程度,靠這個方法整理每天上課所學,一些內容細節就算想不起來也記得在什麼位置,找起來很快,真滴神奇!推薦可以跨平台的 Xmind。
架設技術部落格
「這是我學到最有感的學習方式:產出屬於自己的心得。」
把被動吸收的學習心得爬梳整理轉為產出,能深化對那些概念的印象,我覺得是非常有效的學習方式。有時同事遇到的問題和我發表過的內容有關(很多是問編輯器怎樣弄這麼炫砲),自己也常常會點來複習。目前採用 Jekyll + GitHub Pages 同樣用 Markdown 語法高效、優雅地撰寫和發佈文章,基本上 commit & push 就完成發表了,此外還有以下優點:
- 個人部落格可以自訂網址,功能就像名片一樣能塑造專業形象
- 隨心所欲訂製自己喜歡的風格、顏色和字型等
- 可以自己搞 SEO,透過 Cloudflare, Google Analytics, Google Search Console 練習分析流量
- 設定 Travis CI 自動部署,更 geek 一層樓
時間管理
在時間管理方面,我參考了 ASTRO Camp 課程中工程師助教 Fred 的建議,使用 Rescue Time 拯救自己的時間,這程式能夠分析時間花在哪些地方,把生產力視覺化,督促自己專注。
實際上滿享受進入心流專注的時刻,能感受程式與我之間奔騰的電流,就連空氣都隱約嗡嗡作響,一天 coding 14 個小時也不覺得特別疲累。
結訓第七天拿到 offer,順利轉職成軟體工程師
就這樣,從線下默默會活動認識了五倍紅寶石,並參與了 ASTRO Camp 第一屆,下定決心要轉職的我,體認到規劃學習的重要性。
看過課綱才知道,原來入門工程師應該要會而我還不懂的技術實在有夠多,如果照原本自學的步調,估計兩年要具備轉職的實力也有困難 ⋯⋯
ASTRO Camp 訓練營的課程,讓我感受差異最大的就是五倍有充足的業界工程師助教,除了讓我提前掌握業界內幕外,更棒的是當我碰到問題時,他們能立刻幫我解答疑惑,再來我覺得參觀不同程式相關領域的企業 (EX: 電商類型、APP 軟體開發類型) 一窺軟體工程師環境,也讓自己更瞭解在此領域的工作環境,讓自己的職涯有更明確的方向,而不只是模糊的想像。
雖然訓練營的時間與金錢投入確實較高,但是一想到自己將來是要和市場上所有本科系畢業生甚至有經驗的前輩們競爭,相對來說我的時間也更加浪費不得,有必要破釜沈舟,全心投入準備,盡可能的把所有能得的這些優勢攥在手裡,代價還是相當划算的。
原本目標是設定結訓一個月內要找到工作,結果專題 Demo 的當天我就得到兩個面試邀請,結訓第七天順利拿到 offer,順利轉職成為軟體工程師。
第一天通勤的路上看著街景流轉,想像和過去的自己、家人以及朋友介紹自己的新名片,今後不但能做自己喜歡的事,還能把錢給掙了!想著想著,禁不住踩著雀躍的小跳步。
聊聊轉職成為軟體工程師一年後的自己
原本還擔心可能沒有經歷過面臨壓力的開發工作,會不會我對程式的熱情終究有一天會演變成職業倦怠?
只要是工作,當然都有困難的地方,不過這一年來,我仍然很享受整個過程。
偶遇颱風,隔壁施工甚至防疫期間還能在家上班,明明是習慣晚睡的人,卻每天都能帶著愉悅的心情起床,讓我從生理上確信進入這行是個正確的選擇!
目前工作上遇到最主要的問題主要有兩個,主因當然還是缺乏經驗,再來大致和設計模式或演算法的知識缺乏有關:
不知道怎樣更快速理解複雜的程式碼,有時候甚至還沒理解,光是閱讀就覺得已經花費太多時間。
不知道如何辨別一隻程式的好壞,或採用某種設計模式背後的原因,所以對自己寫的東西還不是那麼有自信。
關於第一點,最近嘗試使用 diagrams.net 把程式主要結構和流程畫出來,這個方法一樣能夠動用到空間記憶,收效不錯。後來知道這是 UML,用來做系統分析挺好的方法。
第二點就是接下來的課題了,要釐清程式碼的可讀性和生產效率之間的分寸,試著找出一些可依循的道理,期許自己不僅僅是完成工作,還要做得漂亮。
不過這個漂亮就有點難定義了,從事軟體開發這類工作的知識勞動者 (Knowledge Worker) 有個特點是,團隊裡面個人的貢獻難以估計,透過傳統的考核方式可能比較難正確評價一位工程師的表現,績效並不是看程式碼的產量,總不能說打字多績效就高,那我到處複製貼上肯定會發大財!
自己很喜歡一本書叫《禪與摩托車維修的藝術》,作者提出了 「質素」(Metaphysics of Quality) 的概念,例如一篇文章、高品質的程式碼和詩,藝術和程式,都是人的造物,於是在某種哲學程度上也有關聯吧?
那有沒有辦法把這種關聯性降解成基本的元素,或者說抽象化分離出來呢?
偶爾我也會上刷題網站練手,如果說上面的題目是金塊,那評論區大概可以比作礦山了。剛接觸程式語言的時候,特別喜歡看到那種一行解決的簡潔程式碼,裡面經常會出現各式各樣,只有某些語言專用的冷僻寫法,偶爾覺得學到了魔術語法,便能為此開心老半天,初學者的快樂,往往就是這麼樸實無華 ⋯⋯
直到踏入了軟工領域的前線,開始和其他人合作之後,才注意到某個顯而易見的事實一直都擺在我的眼前卻不自知:
程式畢竟是由人去維護的,我們打造的產品提供的服務和所有生產力的受眾從來都是「人」。
(Photo by Luis gomes on Pexels)
不論是開發前端頁面、後端邏輯或在更之前的規格分析,我所觀察到的實際情況是,寫程式更像是說故事,大家欣賞的是你能理出清晰的脈絡、有條理的邏輯,同時最好一路直搗問題的核心。
偶爾還會聽到其他人說起某段 code 寫得很美、很優雅或覺得寫很醜之類的話,但那個審美標準,並不是程式執行的必須,對於電腦來說語法檢查過了就好。
也許是清晰的結構和適合的命名?你的程式碼應該要好維護而不能太濕?
這些是隨著情境不斷推移的動態解嗎?是有更加客觀的通則抑或由客戶主觀意識凌駕於一切的浮動標準呢?
據說好的的程式能改變人看待事物的方法,前面提到的問題從不同角度來看可能也充滿爭議,很難得到令人心悅誠服的答案。即使如此,我仍想繼續拓展理性的邊界,探索程式的本質,進入心智的深山去收穫更美的風景,這也是部落格取名的由來。
種樹最好的時機是二十年前,其次是現在
轉職軟體工程師第一年,僅以此文記錄初心,期許自己能堅守這份新人情懷和自我省思的態度,謙卑的學習,溫柔的質疑。
最後,我相信只要努力,無論是誰都值得一個實現夢想的機會,分享一句諺語給所有正在人生的岔路口躊躇猶豫的讀者諸君:
「種樹最好的時機是二十年前,其次是現在。」
The best time to plant a tree is twenty years ago. The second-best time is now.
– African Proverb
感謝 ASTRO Camp 訓練營中的課程講師以及工程師助教團隊務實的幫助,讓我在轉職路上避開了不少遠路。五倍紅寶石的課程組也提供了許多資源,例如職涯規劃講座、履歷健檢、企業交流等,讓我在跨越轉職工程師這條路上的各種關卡時更具優勢和信心。