像學外語學程式

我從來不覺得學習程式語言開心過。

小時候帶我入行的師父,在教程式這件事情上跟其他人有這麼一丁點不同。「程式語言」這四個字,一般人在意前兩個字,但外文系出身的他則相反——「程式語言不也是一種語言嗎」,他是這麼說的。

因此,一直到開始學程式語言的三個月後,我才知道把一個程式跑起來是長什麼樣子。

在這之前,我是從背單字開始的。師父跟我說程式語言比英文好學多了,用到的單字量比較少,每天只要背三個就好,大概背個三個月左右就能把常用單字都記完了。於是我每天背三個,我還記得第一天背的是 public、private 與 protected 這三個單字(我是在過了幾年以後,才知道這些詞在英文裡是什麼意思)。

除了背單字以外,文法的學習也很重要。

師父跟我說,就像英文基本句型 I like you 是主詞 S + 動詞 V + 受詞 O 一樣,程式語言也類似,如 int a = 42,主詞是 a,動詞是 =,受詞是 42,就跟 I like you 是相同的句式,而那個 int 則是修飾語,用來修飾 a,類似於 I like you very much 的 very much。

而條件控制如 if (score >= 60),文法就跟英文更像了,if 是條件連接詞,score >= 60 是條件子句,而後面 {} 接的內容則是主句,只是把英文多加一些符號而已。

還有,在學習 JavaScript 的 Promise 時,我卡關了很久都搞不懂它的語法,而師父給的指導簡潔有力:「Promise 是對未來的承諾,就是一種未來式。現在式要用 return 跟 throw,未來式動詞要變化,變成 resolve 跟 reject,就這樣而已」,聽完以後茅塞頓開,瞬間搞懂怎麼使用。

這樣的訓練苦歸苦,畢竟身為一個小孩連英文都學不好了,何況是程式語言?但長大後才發現幫助很大。

例如說有些公司面試時會手寫程式碼,不給用電腦也沒有 IDE,直接筆試用手寫。不只公司面試,甚至我大學修程式語言時,有些課程考試時也是這樣的。儘管一堆同學叫苦連天,沒有 IDE 的幫助根本寫不出來,但對我來說則是得心應手,因為我從小就是這樣練的。

開頭我有提到,我學三個月以後才真正在電腦上寫 code,在這之前都是像學英文那樣學程式的,因此本來就是用手寫程式碼的。

那時師父每週都會出一份作業,內容大概有幾種類型:

  1. 選擇題
  2. 照樣造句
  3. 句子重組

選擇題比較簡單就不多講了,照樣造句大概就是給 int a = 42,然後我要照這個寫出 char c = ‘a’ 或是 float d = 3.14 之類的,照著同樣的句型去寫。

句子重組的話也滿有意思的,比方說會是 if print score “pass” >= 60,要重新排列成 if score >= 60 print “pass”,才是正確的語法。不過師父有提醒我,在某些程式語言中會用倒裝句,變成 print “pass” if score >= 60,果然跟英文文法很像。

在學習時,每週大概就教一兩個文法,到了第三個月的時候,該學的文法都學完了,單字也背完了,才真的開始用電腦打字,並且把程式碼編譯後跑起來。由於小時候這些紮實的文法練習,導致後來在寫前端時,我不太需要用到 formatter 或是 linter,例如說 prettier 跟 ESLint 我從來沒用過,因為我不需要。

之前有同事不相信,我就當場寫給他看,寫完 commit 以後他打開 auto format 的功能按下存檔,再用 git diff 看了一下發現是空的,才終於相信我根本不需要這些。就像很多人寫中文也不需要自動排版或是文法檢查一樣,順順地寫完後就已經是最完美的結果,程式語言已經是我的母語了。

隨著接觸的人更多,我才知道像我這樣學程式的人少之又少,再加上我是師父唯一的嫡傳弟子,門派就我一個人,不確定有沒有其他類似的宗派。

在我正式開始工作以後,師父就被大公司找去做程式語言規格編撰的工作,在那裡盡情發揮他的長才。幾年前我跟師父吃飯時,就有問了他這個問題,還有哪些人是用同樣的方法學程式的。

他說在 200 年前我們宗派才是顯學,是武林第一大門派,但後來天魔帶領魔教大舉入侵,正魔大戰後門派迅速衰弱,新武學趁機崛起,秉持著實用的口號,成為了新的流行。

而我們門派只能歸隱深山,靜靜等待預言中的救世主前來復興門派。他說他第一眼看到我,就知道是我了,因此對我的教導特別嚴格,希望我能重新復興門派。

因此我開始寫部落格,開始分享文章,開設臉書粉絲專頁,就是為了等待這一天的到來。當追蹤的人數越來越多,我必定復興門派,讓其重返榮耀。

評論