Ruby on Rails 實戰聖經作者 – ihower 專訪

本篇訪談節錄自 Bernard 鐵人賽與頂尖工程師談「追求卓越」 系列

Bernard:可以跟大家 say hello 嗎?做個簡單的自我介紹。

ihower:大家好我是 ihower ,目前有創辦自己的公司,「愛好資訊科技」。

Bernard: 老師你做軟體開發多久?

ihower:如果從透過寫程式賺錢開始算的話,是從大一就開始了,所以 2002 年。這樣算有 18 年了吧。如果從(大學畢業後)正式工作開始算的話,應該是 07 年開始,也是有十幾年了。

Bernard:然後你不是本科系對不對?你不是資工系畢業的。你是哪個系的?

Ihower:清大數學系,但是我大學時候就對資訊很有興趣,所以修資工的輔系,還去修了一個電子商務學程。

Bernard:所以主修是數學,輔系是資工,然後同時修了一個電子商務。

Ihower:清大它有一個電子商務學程,就是資工系加上一些管理的課程,最後有一個專題這樣子。

Bernard:那老師你最喜歡的 programming language 跟工具是什麼? Ruby on Rails?

Ihower:對對對。

Bernard:還有什麼?

ihower:沒有什麼其他的。最喜歡就是 Ruby on Rails 了。

Bernard:為什麼?乾淨漂亮?

ihower:就是寫起來開心,我還蠻喜歡 DHH – 也就是 Rails 發明人的哲學,基本上就是一個 total solution。你用 Rails 可以做到非常多的事情,前後端一起完。然後可以說是中小型專案 CP 值最高的選擇。

Bernard:我非常同意,但老實說,連 Shopify 都還是用 Rails 的,所以其實 Rails 連超大型的專案都可以做。

ihower:沒錯。它其實比你想像中還要 scalable。


Bernard:那另一個問題:你覺得最讓你驕傲的成就是什麼?

ihower:應該是啟動了 Ruby Taiwan 社群,辦了前三屆的 RubyConf Taiwan,最後順利交接出去。寫了一本公開的 Rails 的書,做了很多技術分享演講,所以算是對台灣 Ruby 與 Ruby-on-Rails 的推廣有些貢獻。

https://ithelp.ithome.com.tw/upload/images/20200915/20129249Jd1qlukHX5.png

Bernard:【Ruby-on-Rails 實戰聖經】 — 在台灣學過 Rails 的都該有讀過你的書吧。

Ihower:還有目前手上的專案,都還算不錯的成果。我喜歡目前的模式。覺得能跟客戶有比較緊密的合作關係,然後每個案子都是長期開發跟合作的,可以穩定的。

Bernard:我也認為能長期合作很重要。

Ihower:互相信任,覺得這樣比較開心,也比較健康。

學以致用,讓自己漸漸變強

Bernard:也是。那我們來談一下「工程師追求卓越」這個題目。很多人說,當工程師就要不斷學習。但我發現 AC 有不少校友、助教等,寫了兩年三年的 code 後,會覺得在職涯發展的路上,不知道該往什麼方向。可能對當管理者沒有很大興趣。技術上,使用的工具也差不多。有時候學習了新的技術,但因為在公司沒有用,所以學完後也沒有用。針對學習的部分,你是那種一有新工具就去學的工具控嗎?

ihower:其實有一段時間是。雖然基本上隨年紀會變化,但是我還是蠻喜歡學以致用的感覺。就是學了什麼東西後會變強這種感覺,所以在我職涯的前十年,學非常多的技術。除了一開始的 Ruby on Rails 之外,後來學了一大堆。那陣子什麼紅,就去學習相關的工具。對不同的程式語言也很有興趣,因為社群說學習新的程式語言,有助於擴展你的知識。

Bernard:例如是什麼?

ihower: 例如這些:

  • mongodb
  • hypermedia
  • Chef, Puppet
  • haskell
  • SOA
  • android
  • iOS & objective-C
  • Titanium
  • coffeescript
  • jruby
  • postgresql
  • Erlang
  • Scala
  • Apache Spark
  • AngularJS
  • Data Science
  • Machine Learning
  • Python
  • R
  • React
  • Blockchain
  • Ethereum
  • DDD (domain-driven design)

一直學了非常非常多東西。

我覺得跟你剛才提到的瓶頸其實一樣,但因為學了之後沒有用到,然後你就會忘記。

另外,我覺得現在年輕人的瓶頸也是我的瓶頸。可能跟我職涯的方向比較有關,就是我一直都在比較中小型的企業打拼,沒有待過很大的公司。有很多技術只有大公司會用到,但是對中小公司或是新創來說,它們還沒到那個階段。像是進階 DevOps 的技術,你要處理很大流量、要蓋數十台、甚至數百台 server 才會用到。

然後有些技術是不同職種或工種才會使用到的。例如 data science 跟軟體開發是不同的工種。Data Scientist 更像是分析師,而不是工程師。我在學習資料科學時,學到後面發現他們的思維是不一樣的。我個人更喜歡以工程師的角度,希望能具體去解決一個問題,而不是從分析資料把問題找出來。所以在學習時,雖然學習的過程很開心,但到後來還是會迷惘,在想學了可以幹嘛。

新手軟體工程師初期應專注一種技術,建立一技之長

Bernard:所以要選擇學什麼,最好是學一些你短期會用到的技術與工具,可以是直接跟工作有關,例如公司需要開啟新的 project,同時來實驗一個新的程式語言,我覺得這是一個好的理由。是這樣子嗎?還有什麼考量點?

ihower:應該說作為軟體工程師,我覺得前幾年當然還是以專注在一種技術比較重要。你總要先有一技之長。至於前幾年你要學哪種不同的技術,有一個前輩曾經有提到,

就是你要學廣跟深,但不要學重複的。

什麼是重複?譬如說你學了 Rails ,就不需要再學其他類似的 web 框架,像 PHP 的 Laravel、或是 Python 的 Django。除非工作需要,例如你的新公司是使用 Node.js 與 Express,那就沒辦法。

Bernard:為什麼?

ihower:其實花時間去學習重複的工具或技術,是一種浪費。因為最後都是 web 框架,做的事情都是一樣的,而最後成果都是一個 web application 。所以我不建議重複學。資料庫也是一樣,如果學了 MySQL ,就用 MySQL 進攻到底,不需要再學 Postgres,因為都是 SQL 資料庫。

當然我覺得稍微了解一下、增廣見聞可以。但是不需要特別深入。同時是前端框架,你要選 Vue、React 或是 Angular?其實使用不同工具最後成果都是一樣的,你不需要變成三種不同的大師。

頂尖軟體工程師最重要的人格特質:當責

Bernard:剛剛我們討論的都是工具。現在我們把層次拉高一點點。作為一個軟體工程師,有什麼技能是一定必須的?我想應該不是程式語言或是工具,而是更底層的東西。或是說,在你面試求職者,或是管理你的團隊時,甚至在管理自己時,你最在意的特質或是能力是什麼?

ihower:我很在乎一個人格特質,就是「擔當責任」。具體來說會有幾個重點:

第一個是對自己犯的錯負責。例如,軟體工程師所犯的錯就是 bug ,所以當你寫的程式碼在 production 上有錯的時候你該怎麼辦?你就是要去負責修好它,然後誠心誠意的跟你的主管與客戶道歉。也不一定是客戶,可能是同部門工程師,也可能是客服部門。

我有碰過比較 junior 的工程師,他會跟我說「程式碼裡有 bug 是很正常的」。這是一句很不負責的話。它也許是事實,但是站在「負責任」的角度上面,我覺得這是不是很好的態度。

第二個是你對你的產出要有信心,你寫出來的程式碼是 OK 的、正常的。

謹記 “do no harm” 的道理

Bernard:什麼意思?

ihower:就是要確認你寫出來的東西上 production 後不會讓產品爛掉。怎樣確認不會爛掉?就是要去測試、去 QA。這裡不說的不一定是指自動化測試。作為一個工程師,你也可以要手動去測試,自己程式碼放進去後,產品是能一樣正常運作。

有些 junior 會覺得他這次修改的程式碼非常間單,所以就認為不需要做任何手動測試,而直接 deploy 出去,然後就爛掉。

Bernard:所以是對自己的產出要抱有一定的嚴謹度,對不對?

ihower:可以這麼說。但我覺得也是「擔當責任」的一部分。因為這段程式碼就是你的責任。我認為工程師需要注意去判斷 regression 的風險。其實跟醫生常講 “do no harm” 的道理一樣。就是你要去確保你新加的程式碼是不會對 regression test 有傷害的。當收到團隊的 pull request 時,我會特別看重會有 regression 風險的。在 code review 時我會看得比較認真、比較仔細。

注意能注意的細節  讓風險變得可控

Bernard:那如何判斷這個風險到底有多高?

ihower:這件事可能比較吃經驗值。可以說,新加的程式碼通常比較不會有 regression 的風險。但如果在這個 pull request 你改了一大堆本來有的程式碼,regression 風險就相對高很多。

Bernard:瞭解。的確,很多 junior 的工程師不會去注意 regression 的風險。

ihower:對,還有一個比較容易漏掉的,就是現有資料的問題。蠻多 regression 是 data dependent 的。就是你的專案已經跑一陣子,是一個已經上了 production 的案子,所以在 production 資料庫裡有真實的資料。而你改的程式碼跟那些資料,會不會產生一些錯誤的互動,造成 bug。你在本機端做開發的時候,用的是一套完美的 data。但 production 上面 data 不一定是。所以你要確認的新加或是修改的程式碼,能正確處理 production 上的資料。

Bernard:感謝老師的分享。非常受用。我們來聊些更個人的。在你的職涯中,你的動力來源是什麼?當然現在可能是家裡有小孩要養,而在不同階段不一樣。但是否有一個共通的動力來源?

ihower:就是剛剛提的,喜歡學了會變強的感覺。

Bernard:那你可以分享一些你個人曾碰過的職涯瓶頸嗎?以及你是怎麼去突破這些 bottleneck 的?有沒有一些案例可以跟後輩分享?

ihower:我個人的瓶頸是當時我在外商當 CTO 的時候。那一份工作對我來說是很大的挑戰:第一次去外商,第一次帶數十人的工程團隊,需要跨部門的聯繫。而團隊又是跨國的。所以在溝通上有語言與文化上的挑戰。技術上也有挑戰,那時候要建立一個分散式 (distributed system) 的應用。在這之前自己在這方面經驗也比較不足,所以是一份壓力非常大的工作。

Bernard:那你後來如果克服這些挑戰?

ihower:我其實並沒有克服這個環境,而是了解到自己的個性可能並不是這麼適合辦公室,所以後來我決定轉換不同的工作模式嘗試看看。

Bernard:後來你就來了 ALPHA Camp,為培育人才做貢獻。

Ihower:…… 算是吧 🙂


Bernard:最後一個有關「產業環境」的問題。你跟我都算是在 2000 年初開始進入職場。過了十多年後,你看到現在的工程師,不管是你親自帶的團隊,或者是外面跟你請教的後輩,他們現在碰到的職涯的挑戰或是瓶頸,跟你當年有什麼差別嗎?然後你會給他們什麼建議?

ihower:我覺得相較於早期,就是 2000 年出頭的時候,你如果要開發 web app ,你學一個 PHP 就差不多可以了。那時候 JavaScript 根本不成氣候,前端也沒有現在這麼講究。所以你會寫 PHP,你就可以做個「無名小站」了(Bernard 註:年輕人,你有聽過【無名小站】嗎?)

我覺得現在這年頭技術變的又多又變雜。不是說做一樣的事情會變難。其實工具變得非常強大。例如如果是 web app,你只要去學 Ruby-on-Rails 就可以做到比以前多很多的事情。問題是各個新的領域的內容都變深很多。像是前端框架、DevOps、甚至是 AI 人工智慧等等,令人非常眼花撩亂。

對現在的工程師,挑戰會變成是如何找到自己喜歡的。

你也搞不清楚每個技術自己喜不喜歡,或者是是不是值得去投入時間去研究。而研究後是否能找到工作。

Bernard:所以該如何面對?是建議去多嘗試?還是要更專注一點?

ihower:去嘗試吧。應該是說,每個技術要學個皮毛,應該不是很難的事情。不論是前端或是 DevOps。其實學個幾天、幾星期,都不算是很難的事情。現在線上課程與其他學習資源這麼多。學完一遍皮毛,大概就可以了解你自己真的比較喜歡什麼,然後再挑選自己喜歡的深入去學。

Bernard 校長的訪談後記

我認識 ihower 是在創立 ALPHA Camp 的時候。當時我主動跟他聯絡,邀請他對我們的課綱作回饋。他人非常友善、也很熱心。轉眼之間就六年了。他跟我認識的「頂尖」工程師有很多共通點:頭腦清楚、注重細節,對自己與團隊都很有要求。

但就算是有過人的能力,ihower 也碰過自己無法突破的瓶頸。但後來也因為這樣,才更瞭解什麼環境適合自己。這幾年 ihower 相對低調,專注在不同的領域挑戰自己。先是接了北京的專案,去打造大流量的產品,同時去瞭解中國市場的遊戲規則。後來更往電商、創業、管理等領域發展,繼續追求他喜歡的那種「學了什麼東西後會變強這種感覺」。

有關選擇什麼技能學習 — ihower 的建議也讓我反思。曾有校友問:「我做了幾個 Vue 的專案,那我是否該學一下 React 呢?」

我會認為,如果你在工作上需要使用 React,能馬上學以致用,我覺得可以。又或是你有嚮往的企業,但他們指定的框架是 React,那樣也可以。我觀察到國外的企業越來越多是使用 React 了,而工具的經驗的確會影響到你能選擇的職缺。

但重點是你要深化手上的工具技能,也不要隨便「為了學習而學習」。

這篇是 ihower 推薦的參考文章:Learning deep and wide, not duplicate

那你的成長動力又是什麼呢?

三分鐘小測驗,找到你學習網頁開發的入口