paragraph break 2019 年的盛夏,我從全端工程師訓練營 ASTRO Camp 畢業後,進入了一間外商公司,成為軟體工程師,主要使用 Ruby on Rails 開發一套頗具規模的電商系統,到今天也滿一年了。

先介紹一下我自己的背景,從冷凍空調與能源系畢業後,做過工地主任,參與醫院和電子廠興建、另外做過空調設備產品工程師,在轉職成為軟體工程師之前,任職於一個擔任政府能源政策顧問角色的基金會,算起來在空調和能源領域有八年相關經驗。

很多朋友問過我,上一份工作做得順風順水,穩穩地待到退休也沒問題吧,哪裡來的勇氣放棄相對有保障的未來?

而且轉換到完全不同的領域,幾年來經營的人脈和投入的資源都帶不走,這不是拿青春打水漂嗎?

簡單來說,我就是不甘心。

理論上工作應該是為了生活,但我出社會後有一段時間的生活似乎是為了工作。

曾經作為工地主任,除了進度和預算控制之外,依照不同情況我還要管理工地現場將近兩百人。要知道,工地現場龍蛇雜處,不是人人都有機會接受正常水準的教育,每天有數不清的狀況要處理,有時為了開會每週要往返兩、三個城市好幾趟,案子在趕的時候,一週工時可以超過 130 小時,經常還得喝酒應酬,而且沒有加班費,完全責任制,日復一日,暗無天日。

在這個體制下討生活的自己越是努力,磨損越嚴重,氣力放盡想要做出一番成績,同時也換到滿腹辛酸苦楚。我像是資本主義的一條狗,狗碗裡盛著對未來的幻想和憧憬,時間永遠不夠用,理想遙不可及,偶爾能出門散個步就很滿足了。

這樣看吧,每天二十四小時,除去睡眠,剩下清醒的時間裡面很大一部份都在工作,如果工作都不開心,這日子過得不是很悲慘嗎?從這個角度來看,就算收入還過得去,那一度被認為是穩定的生活,還是更像某種災難現場吧,隨著時間經過除了銀行存款和滿身病痛之外還能剩下什麼?

後來到了基金會上班,帶著先前累積的技術和經驗讓我做得還算得心應手,但總感覺做的就不是自己喜歡做的事情,怎麼會快樂呢?

到退休前還有幾十年,如果整個職涯充斥著麻木、缺乏熱情的日常,那簡直難以忍受,我不甘心躲在舒適圈裡重複著本來就會的東西,最後苟活成一個埋怨和懊悔的樣子。

選擇比努力更重要

身邊很多人和我一樣,可能沒有什麼資本去冒險,而且容易被旁人的價值觀挾持,想說工作嘛,至少得找個本科相關的好學以致用,別浪費了所學專長和寶貴青春如何云云⋯⋯

在決定轉換跑道之前,我也都有在思考怎樣的職涯路線才適合自己,但一直到接觸到程式之前,只是約略地知道自己不想要什麼而已。

回顧過去,距離 coding 最靠近的時候,或許是大學時漫不經心把玩 Visual Basic 的那會兒,雖然平常也喜歡打電動,卻始終無法將熱忱投射到程式設計這件事上。

當時的我想像,寫程式就是要每天釘在座位上十幾小時,從上千行難懂的文字和演算法中除錯,工時長壓力大⋯⋯不難理解為什麼傳說中工程師過勞死的比例這麼高。

直到某次和一位學經歷相近的前輩閒聊中,我聽說了 Ruby on Rails 這門基於 Ruby 的框架,讓寫網頁變得簡單,並且可以幫助你快速將一些想法實踐並上線投入市場。

這位前輩在很短的時間內自學有成並找到理想的工作。從他和我分享的經驗來看,對比眼下所見暮氣沉沉的工程界,那個領域的人們似乎對自己的工作充滿了熱情。

年近三十,機會稍縱即逝,掂量自己剩下的時間和精力,我也想試著抓住生命中不同的可能性

自學程式的盲點與困境:沒有目標,哪裡都到不了

從那之後我開始嘗試自己找資源學習,有鑒於我對於其他語言的認識甚少,所以 Ruby 可以算是我程式設計的初戀(而初戀一般都是美好的),相較於印象中外星文一樣的 C 語言等,Ruby 看起來更像人類的語言,沒有太多括號,設計優美、簡潔且容易理解,我至今還記得第一次宣告變數和呼叫方法當下的奇妙感受。

然而即便對象是 Ruby 這樣友善的語言,非本科的我一開始自學還是相當挫折,初踏入一個全新的領域,從環境建置到語言特性,無知的大坑好像越填反而越深。

遇到問題搞不定,結果 Google 查到的答案裡面有更多看不懂的關鍵字和名詞,沒辦法分辨哪些是重要的問題,很容易偏離原本想解決的情境,一回神已經被更多的問題纏繞,非常沒有效率!

「很容易從原本的一個問題,衍生開展成更多問題,然後自然而然不停發散地查下去……」

我偶爾會需要加班,下班後時間非常有限,卻又不曉得如何過濾資訊找到重點,時不時出現的錯誤畫面更加劇心中的慌亂和煩躁,自學過程晴時多雲,偶有絕望。

雖然下班時間靠著興趣支撐,幾乎都留在辦公室看書,按照著網路上的教學漸漸能做出一些東西,自己能做出一些小功能,但沒有人協助檢查我的 code 是不是符合業界工程師的標準或設計原則?我所理解的觀念到底是否正確?

任何學習成長的過程都是辛苦的,困守舒適圈本來也是人類自然的行為,更何況是正在踏足從未接觸過的領域,龍哥 (高見龍) 在課堂上也曾提過類似的觀念:

「就像電玩一樣,迷宮裡通往寶箱的那條路肯定充滿各種機關陷阱和怪物,如果你前進的過程沒有感覺到辛苦,很可能代表目前的方向錯了。」

現在回顧這段自學經歷,我犯下的一個大錯是對於自制力抱著荒謬的信心,沒給自己壓力訂定明確的學習目標,以至於被「好像有學到」的迷霧籠罩,看不清學這些技術的目的和背後的需求。

當初做第一個畫面,找了個單純的網頁參考自己摸索排版,前前後後花了快一週,效率極差,算是明白了沒有目標,哪裡都到不了。

到底是什麼協助我成功轉職軟體工程師?

我會說是:環境的力量。

在自學找資料的過程中看到了龍哥寫的《為你自己學 Ruby on Rails》。雖然有出版實體書,但整本書的內容也免費提供在網站上,而且內容有在更新,留下問題的話也能得到回覆,對於初探程式領域的新手來說,在學習上幫助很大,實在很佛心。

後來得知龍哥的公司五倍紅寶石為推廣 Ruby 程式語言做了不少事,除了經常有免費講座之外,每週另有舉辦實體的默默會,讓大家有個場地可以討論交流程式相關資訊、認識不同企業的工程師們、小酌幾杯或玩玩桌遊。

一開始也是因為讀書卡關想來找人請教,沒想到在這認識了很多專精程式領域的資深大大,不會嫌我提出的問題太弱太麻煩,聊起程式的話題全身熱烈的發光,言談間散發一種工程師特有的溫暖和親切,眼眸裡世界澄清如洗。

在這樣的環境裡面不用害怕自己是新手而不敢發問,也因此我終於體會到線下聚會的強大之處,就是說把自己投入到這樣一個環境裡面去沾染大家的熱情,每個人程度或許不太一樣,但都有相似的目標,可以互相鼓勵並且分享所學,透過別人的角度看看這個世界,在相似之處得到共鳴,相異之處增廣見聞。

學習程式語言的高效率工具分享

隨著經驗的累積,我也慢慢掌握了一些學習的方法和工具:

  • Markdown 筆記
  • 心智圖
  • 架設技術部落格
  • 時間管理工具:Rescuetime

Markdown 筆記

首先就是使用 Markdown 標記語言整理程式碼和筆記,這非常易學好懂,上手很快,約莫花個十分鐘就能學會並開始使用了。

我比較常用 HackMD 這個國人開發神好用的服務寫 Markdown 筆記,支援 Sublime/Vim 編輯器熱鍵,還能直接貼圖相當方便,直到現在工作也是每天用得很兇。不過缺點是單篇筆記上限只有十萬字,內容量超過某個程度網頁速明顯會感到變慢,我不得不將一些筆記拆開再用 tag 整理,但目前又不支援跨筆記搜尋內文,覺得已經不太夠用,最近 Notion 正火,有各種方便的模板,也支援全域內文搜尋,將來會考慮搬過去。

心智圖

這個以前在設計簡報或者做 brainstorming 的時候會用到,從來沒想到居然也可以搭配空間記憶用來消化學到的東西,這是跟 Amos 老師學到的方法,我自詡記性極差,差到偶爾會想不起自己今年幾歲的程度,靠這個方法整理每天上課所學,一些內容細節就算想不起來也記得在什麼位置,找起來很快,真滴神奇!推薦可以跨平台的 Xmind

https://stevenchang.s3-ap-northeast-1.amazonaws.com/pics/after_a_year_xmind.jpg

架設技術部落格

「這是我學到最有感的學習方式:產出屬於自己的心得。」

把被動吸收的學習心得爬梳整理轉為輸出,能深化對那些概念的印象,我覺得是非常有效的學習方式。有時同事遇到的問題和我發表過的內容有關(很多是問編輯器怎樣弄這麼炫砲),自己也常常會點來複習。目前採用 Jekyll + GitHub Pages 同樣用 Markdown 語法高效、優雅地撰寫和發佈文章,基本上 commit & push 就完成發表了,此外還有以下優點:

  1. 個人部落格可以自訂網址,功能就像名片一樣能塑造專業形象
  2. 隨心所欲訂製自己喜歡的風格、顏色和字型等
  3. 可以自己搞 SEO,透過 Cloudflare, Google Analytics, Google Search Console, Hotjar 等工具練習分析流量
  4. 設定 Travis CI 自動部署,更 geek 一層樓

時間管理

在時間管理方面,我參考了助教 Fred 的建議,使用 Rescuetime 拯救自己的時間,這程式能夠分析時間花在哪些地方,把生產力視覺化,督促自己專注。

https://stevenchang.s3-ap-northeast-1.amazonaws.com/pics/after_a_year_rescuetime.jpg

實際上滿享受進入心流專注的時刻,能感受程式與我之間奔騰的電流,就連空氣都隱約嗡嗡作響,一天寫扣十四個小時也不覺得特別疲累。

結訓第七天拿到 offer,順利轉職成軟體工程師

看過課綱才知道,原來入門工程師應該要會而我還不懂的技術實在有夠多,如果照原本自學的步調,估計兩年要具備轉職的實力也有困難⋯⋯

就這樣,從線下默默會活動認識了五倍紅寶石,並參與了 ASTRO Camp 第一屆,下定決心要轉職的我,體認到規劃學習的重要性。

我重新審視了一下自己的目標,畢竟完全沒有程式相關經驗和背景,既然已確定要轉換跑道並且時日無多,那麼有更多業界第一線的從業人員和親切的前輩和同學可以討論,一定能夠更快進入狀況,掌握一些令人在意的業界內幕,例如工作上有什麼技術上的重點要把握,哪邊有雷應該要避開?再來就是業界用人的考量、面試經驗和準備方向,甚至可以透過 Camp 媒合面試,參觀企業的辦公室也讓自己更瞭解程式領域的工作環境,讓自己的職涯有更明確的方向,而不只是模糊的想像。

自己將來是要和市場上所有本科系畢業生甚至有經驗的前輩們競爭,相對來說我的時間也更加浪費不得,有必要破釜沈舟,全心投入準備,盡可能的把所有能得的這些優勢攥在手裡,代價還是相當划算的。

而開始投入課程後,每天的資訊量更是密集,能感覺自己以小時為單位飛速進步,幾乎每天都能看到前所未見,聽到前所未聞的事物,刺激的非常。

原本設定結訓一個月內要找到工作,結果專題 Demo 的當天我就得到兩個面試邀請,結訓第七天順利拿到 offer,成為軟體工程師。

第一天通勤的路上看著街景流轉,想像和過去的自己、家人以及朋友介紹自己的新名片,今後不但能做自己喜歡的事,還能把錢給掙了!想著想著,禁不住踩著雀躍的小跳步。

paragraph break

接下來的課題

原本還擔心可能沒有經歷過面臨壓力的開發工作,會不會我對程式的熱情終究有一天會演變成職業倦怠?

只要是工作,當然都有困難的地方,不過這一年來,我仍然很享受整個過程。

偶遇颱風,隔壁施工甚至防疫期間還能在家上班,明明是習慣晚睡的人,卻每天都能帶著愉悅的心情起床,讓我從生理上確信進入這行是個正確的決定!

目前工作上遇到最主要的問題主要有兩個,主因當然還是缺乏經驗,再來大致和設計模式或演算法的知識缺乏有關:

  1. 不知道怎樣更快速理解複雜的程式碼,有時候甚至還沒理解,光是閱讀就覺得已經花費太多時間。

  2. 不知道如何辨別一隻程式的好壞,或採用某種設計模式背後的原因,所以對自己寫的東西還不是那麼有自信。

關於第一點,最近嘗試使用 diagrams.net 把程式主要結構和流程畫出來,這個方法一樣能夠動用到空間記憶,收效不錯。後來知道這是 UML,用來做系統分析挺好的方法。

https://stevenchang.s3-ap-northeast-1.amazonaws.com/pics/after_a_year_uml.png

第二點就是接下來的課題了,要釐清程式碼的可讀性和生產效率之間的分寸,試著找出一些可依循的道理,期許自己不僅僅是完成工作,還要做得漂亮

不過這個漂亮就有點難定義了,從事軟體開發這類工作的知識勞動者 (Knowledge worker) 有個特點是,團隊裡面個人的貢獻難以估計,透過傳統的考核方式可能比較難正確評價一位工程師的表現,績效並不是看程式碼的產量,總不能說打字多績效就高,那我到處複製貼上肯定會發大財!

很喜歡一本書叫《禪與摩托車維修的藝術》,作者提出了 「質素」(Metaphysics of Quality)的概念,例如一篇文章、高品質的程式碼和詩——藝術和程式,都是人的造物,於是在某種哲學程度上也有關聯吧?

那有沒有辦法把這種關聯性降解成基本的元素,或者說抽象化分離出來呢?

偶爾我也會上刷題網站練手,如果說上面的題目是金塊,那評論區大概可以比作礦山了。剛接觸程式語言的時候,特別喜歡看到那種一行解決的簡潔程式碼,裡面經常會出現各式各樣,只有某些語言專用的冷僻寫法,偶爾覺得學到了魔術語法,便能為此開心老半天,初學者的快樂,往往就是這麼樸實無華⋯⋯

直到踏入了軟工領域的前線,開始和其他人合作之後,才注意到某個顯而易見的事實一直都擺在我的眼前卻不自知:

程式畢竟是由人去維護的,我們打造的產品提供的服務和所有生產力的受眾從來都是「人」。

理性的邊界

不論是開發前端頁面、後端邏輯或在更之前的規格分析,我所觀察到的實際情況是,寫程式更像是說故事,大家欣賞的是你能理出清晰的脈絡、有條理的邏輯,同時最好一路直搗問題的核心。

有時候還會聽到其他人說起某段 code 寫得很美、很優雅或覺得寫很醜之類的話,但那個審美標準,並不是程式執行的必須,對於電腦來說語法檢查過了就好它不管這麼多。

那麼怎樣才能寫出更美的程式碼?也許是清晰的結構和適合的命名?你的程式碼應該要好維護而且不能太濕

這些是隨著情境不斷推移的動態解嗎?是有更加客觀的通則抑或由客戶主觀意識凌駕於一切的浮動標準呢?

據說好的的程式能改變人看待事物的方法,前面提到的問題從不同角度來看可能也充滿爭議,很難得到令人心悅誠服的答案。即使如此,我仍想繼續拓展理性的邊界,探索程式的本質,進入心智的深山去收穫更美的風景,這也是部落格取名的由來。

paragraph break

轉職軟體工程師第一年,僅以此文記錄初心,期許自己能堅守這份新人情懷和自我省思的態度,謙卑的學習,溫柔的質疑。

最後,我相信只要努力,無論是誰都值得一個實現夢想的機會,分享一句諺語給所有正在人生的岔路口躊躇猶豫的讀者諸君:

「種樹最好的時機是二十年前,其次是現在。」

“The best time to plant a tree is twenty years ago, the second-best time is now.”
– African Proverb

⤧  Previous post 世界末日那一天,你的程式靜靜躺在北極圈 - GitHub Archive Program ⤧  Next post How to install Ruby on Rails on Ubuntu 20.04 LTS