返回社群

成為多語言開發者

什麼是「多語言者」?我聽到你這麼問了……嗯,根據字典,就是懂得多種語言的能力!那要怎麼成為「多語言者」呢?跟 Erik Schierboom 聊聊,就能得到第一手內幕!

在 Youtube 上觀看
長度 57分鐘

Jonathan:大家好,歡迎收聽 Exercism 的 podcast 或直播。我是 Jonathan,很榮幸今天能擔任你們的主持人。今天和我一起的是 Eric,他是 Exercism 團隊的一員,參與已經有好幾年了。如果你在過去幾年裡曾經踏進 Exercism 生態圈,那你很可能在某個地方遇過 Eric。Eric,很高興今天能請你上節目。我很期待多了解一點你的故事,你是怎麼進入科技業的,以及你對科技圈一些事情的看法。不過在我們聊得太深之前,我想請你先自我介紹一下,談談你的背景,說說你是怎麼走到今天這一步的。

Erik:當然。好啊,很高興能來。我是 Eric,你剛剛應該已經提過了。我住在荷蘭,也在那裡出生,所以一輩子都住在這裡。我想想,我第一次真正用電腦做點事是什麼時候。我想應該是 NES 吧,玩《瑪利歐》。從那之後我就迷上了。沒錯,那真的很棒,不過也很讓人挫折,因為那時候的遊戲完全不手軟。

Jonathan:那時候沒有存檔點之類的,只能從頭再來一次。

Erik:嗯,那要看你住在美國還是世界其他地方,因為其實有兩個不同的版本。不過對,我想你是打開前面的插槽,然後把磁片還是什麼的,也就是卡匣放進去。我真的很喜歡那個。我們家沒有 NES,但我有幾個朋友有,所以我常去他們家玩,玩過好多很棒的遊戲,也有很多讓人抓狂的遊戲。但那真的是一件很棒很棒的事。後來我就這樣迷上了。我想很多程式設計師就是這樣一頭栽進去的:想當程式設計師,只是因為想自己做一款遊戲。我也這樣想過。不過先爆個雷,我從來沒做成,我不是遊戲開發者。對,沒有沒有。但那是我開始喜歡電腦的原因。然後我爸在我出生前出了一場意外,肩膀以下癱瘓,所以坐輪椅。不過他一直都在家,這點很好。所以我有一個 24 小時都在家的爸爸,回家總是讓我很開心。他也喜歡電腦。所以在我大概 10 歲的時候,他弄來一台很不怎麼樣的電腦。我想是 X286,黑白螢幕,裝的是 MS-DOS,可以玩遊戲。遊戲超多的,朋友的爸爸給了我一些遊戲,他們還得把密碼表全部列印出來才能啟動遊戲,因為有密碼保護,就像說明書一樣。現在可不能這樣搞了,但當時可以。我很愛玩那些遊戲,不過我也很想弄清楚它到底是怎麼運作的。結果我把電腦搞壞過好多次,我根本數不清。所以我有一個「客服專線」,是我朋友的爸爸,他對電腦很在行。每次我把系統搞壞,就打電話給他,他總是很親切地過來幫我修。我到現在還記得,當我發現自己真的走不出那個問題時,整個人陷入恐慌。不過,我從中學到很多。

Jonathan:這個問題。不過我從中學到很多。放在軟碟上,我記得我存了好幾年的錢才買到這東西,然後把它放進去,結果它就是永遠、永遠讀不到那些小小的軟碟。那真是我的一大挫折。我想我從來沒真正搞懂該怎麼修好它。不過那時候遊戲是放在軟碟上的嗎?你得把它們放進一個小卡匣裡,然後上傳之類的?

Erik:從來沒有。

Jonathan:對。

Erik:對,有時候要好幾張軟碟。所以說,那其實是一段很棒的時期。我很愛 MS-DOS,喜歡摸索自己能做什麼,然後再發現自己不能做什麼。對,那真的很酷。

Jonathan:對,那真的很酷。那後來她是全職工作嗎?而你爸爸待在家裡?

Erik:沒有,我媽媽全職照顧我爸爸。他需要很多照顧。一開始他還可以用手移動,後來手開始退化,控制力變差,就得用下巴。不過我媽是全職在照顧他。所以我爸媽總是在家。對我來說,去別人家時看到他們的父母在上班,感覺很怪。一天都過去了,他們的父母還沒回家,我覺得那才奇怪。不過,那只是不同的情況而已。

Jonathan:對我來說那真的很怪。就只有你一個?

Erik:我有,我有一個妹妹,小我三歲。沒人看得出來我們是兄妹,我們差太多了。我以前常跟她吵架,不過現在完全沒問題了,結果還不錯。她不喜歡電腦,所以不會來搶我用電腦的時間。

Jonathan:但我們常為了電腦吵架。她想玩《模擬市民》,我想玩《模擬城市》之類的。所以從這個角度來看,我們老是槓上。

Erik:掰。我當然覺得選《模擬城市》好多了。不過不,她從來沒對電腦有興趣。我唯一能讓她感興趣的方法,是我有一台 SNES,也就是 Super Nintendo,還有《瑪利歐賽車》。她真的喜歡《瑪利歐賽車》,所以我們一起玩了很多。當然,我總是贏,因為我練習得多太多了,但她還是很喜歡。

Jonathan:所以你還是喜歡東摸西摸?對,MS-DOS,如果我沒搞錯的話,算是相當低階的東西。所以那大概是很低階的。沒錯。那你玩那台系統的時候是幾歲?

Erik:好,確實很低階,對。絕對低階。那大概是我 10 歲的時候。後來我有個朋友,他跟我同一支足球隊,應該說同一支足球隊。他已經是很不錯的程式設計師,真的會寫遊戲,而且是用 Visual Basic 寫的。我完全看傻了。他會來我家用我的電腦,示範他打一些東西,我完全看不懂。但半小時之後,他就做出一個東西在畫面上走來走去,對我來說簡直是魔法。我只有目瞪口呆的份。不過那時候我從來沒真的試著寫程式。我還是覺得那對我來說太難了,連試都不敢試。所以我沒做,只是東玩西玩、打打遊戲。

Jonathan:所以我……我只是插一下話。

Erik:然後等我再大一點的時候。

Jonathan:你是怎麼把這兩件事連起來的?就是「喔,我可以寫遊戲,我可以把它當成正職來做」,如果你懂我的意思,或者說可以更認真地走這條路。

Erik:對,那是後來的事了。大概在我 17 歲的時候,我必須選擇要走哪條路。我心裡有兩個選項:一個是讀歷史,另一個是做 IT。最後這個選擇其實蠻簡單的,因為我覺得比起單純讀歷史,IT 是我會更喜歡做的事。歷史可能有很多很沉悶的部分,而我當時不覺得資訊科學會有沉悶的部分,但當然是有的。所以我錯了。對對。這些我們可以改天再聊。不過確實有無聊的部分。但我那時做了選擇。那正好是萬物蓬勃發展的時代,網路熱潮。所以當我們去參觀高中,也就是我後來讀的學校,那是一所應用科技大學。我可以選應用科技大學或一般大學。但我喜歡應用科技大學,因為我想動手做出東西。我不是很強的理論派,不知道該怎麼說,我理論不太行。所以我喜歡做東西,我很務實。我一開始走的是實作路線,而且我很喜歡。那段時期,所有公司都賺翻了,他們會說,等你畢業,你會有一台車、有這個那個。結果等我畢業,網路泡沫破了,一切亂七八糟,要找工作其實相當難。那時候我想,也許我該去讀一般大學,因為應用科技大學那段很好玩,我也是在那裡真正學會寫程式的。但我想,好吧,也許我先把職涯往後延一點,看看自己能不能讀一般大學。所以還不錯。

Jonathan:就我所理解,歐洲的教育體系很快就把人分流,分成實務技能取向和一般大學、比較偏學術的路線。荷蘭也是這樣嗎?他們很擅長判斷說「嘿,你很適合走這條」嗎?我知道在瑞士,那才是我真正的參照,如果你很擅長……荷蘭的話,你可以說,好,那就去當學徒,用這種方式學一技之長。而且這其實一樣好,不會被認為比讀大學差或更好,就只是更符合你的偏好。荷蘭也是這樣嗎?你成長過程中也有經歷過這種分流嗎?

Erik:我不會說它被視為一樣好。大家還是覺得讀一般大學、而不是應用科技大學比較好、比較難,至少比較有聲望。拿到的頭銜也不一樣。不過對我來說那沒什麼吸引力,實在太理論了。我想學怎麼寫程式,因為我當時還沒學會寫程式。我知道我應該會喜歡,我看過一些 HTML 的片段,但從沒真正寫過一行程式碼。不過我相當確定我會很喜歡。等我開始學,第一年我基本上連一行程式碼都沒寫。就是跟著幾個同學在一組裡混,因為其中一個同學是超厲害的程式設計師,什麼都會,全都他做,所以我根本沒什麼機會動手。到了第二年,我下定決心,這樣下去不行,我永遠學不會寫程式。於是我全力投入,拼命寫程式。那是一次深度鑽研。我從 C 開始,那真是個糟糕的入門語言。我不想談我對 C 這個語言本身的看法,但作為入門,它非常難。所以在大概第二、第三堂課就要做鏈結串列,如果你完全沒有背景,這絕對不是你會喜歡的東西。不過我還是寫出來了,而且我喜歡到開始在課餘時間大量寫程式。我幾乎是自學寫程式的,因為他們教的方式真的很糟。我的方法是:找一個我自己想用的東西,然後把它做出來,或者至少試著做出來,因為一開始你只是亂揮一通,沒什麼真正有用的成果。但到頭來,就是練習、練習、再練習。我發現寫程式是一種只能靠動手做才能獲得的技能。你可以學一堆理論,看個一千萬支影片。但如果你不真正投入時間,我覺得你永遠不會成為好的程式設計師。就是得動手做。那是一個很大的關卡。我還記得自己能讀懂程式碼的時候,覺得很滿意,但接著要自己寫程式碼,那是另一個很大的關卡。

Jonathan:覺得很滿意,然後要自己寫程式碼,那又是很大的一步。前幾集節目我都在問,程式設計是什麼時候「開竅」的,有沒有一個瞬間讓你恍然大悟,心想「天啊,這全都通了」。你是先到處亂試、試著抓理論,還是有那麼一刻你覺得「好,這其實很直截了當」?

Erik:我不覺得自己有過單一的頓悟時刻,應該有好幾個。它是分階段來的。我想我寫的第一個真正的程式是猜單字的遊戲。有點像現在很紅的那個……嗯,像 Hangman,就說是 Hangman 吧。但那是用 C 寫的,我真的讓它跑起來了,可以玩自己做的遊戲。所以我大概稍微懂了在發生什麼事,然後你就一點一點進步。後來我做的東西跟 mutex 有關,就是火車不能相撞。當火車交會時可以用 mutex。mutex 基本上就像一塊「停」或「行」的牌子。那很好玩,我對成果很滿意,就拿去給教授看。他跟我說:那如果我想有四班火車呢?我心想:喔、喔、哇,我沒想到。那真是讓我大開眼界,而且他只說了一句話。我想,我應該要考慮到他可能會問這種問題。於是我花了整個週末把程式碼參數化,讓它可以支援多班火車,最後真的做到了。我是硬塞進去的,寫得不好看,但它能跑。那又是另一個讓我覺得「哇,這真的很酷,而且我做得出來」的時刻。

Jonathan:酷,我看得出來你能做這類事情。認識你之後我就知道。而且從學寫程式的過程來看,有一個階段就是先把東西丟出來、讓它能跑,然後再改好。你的經驗也是這樣嗎?就是先求有、讓它動起來,其他都不管,然後再慢慢改良?

Erik:對對,我想第一年左右就是只要它能跑,我就非常非常開心。那時候根本沒有什麼美感之類的概念,能跑就是好。而且我在程式碼裡加了誇張到不行的註解,因為教授說你一定要寫註解。程式碼和註解的比例大概是 1 比 10 之類的,非常誇張。還有,我最古老的專案現在還掛在線上,那是我第一個開源專案。你記得 MSN Messenger 嗎?可以傳訊息的那個。

Jonathan:好,有聽過,但沒什麼印象。

Erik:你記得 Winamp 嗎?

Jonathan:記得。

Erik:對,Winamp 是一款媒體播放器,那是 Napster 的年代。你下載 MP3,然後用 Winamp 播放。我想做的是:如果我在播歌,我希望歌名自動附加到我在 MSN Messenger 的名稱後面。那時候我很熱衷寫 Windows 程式,就是 Win32。那非常老派,不是現在這種東西,非常低階,但也非常酷。所以我用 C++ 寫了一個外掛,那是我當年最愛的語言,不過我當時也只懂三種語言,所以也說明不了什麼。我寫了這個外掛:如果 Winamp 在播歌,它就透過花俏的 Win32 API 取得歌名,然後更新你 MSN 視窗裡的名稱。這樣大家就都能看到我在聽哪一首。我後來把它放上線,因為我想也許別人會喜歡。我想是放在 SourceForge 上,現在已經沒有人在用了,因為他們好像有些隱私方面的問題。但真的有世界其他地方的人在用,我超驚訝。我看到下載次數,大概幾百次吧,有人在用我寫的軟體。那大概是有史以來最棒的感覺。那是我第一個開源程式。我從來沒有什麼冒牌者症候群。我覺得這就是我的程式碼,如果誰覺得它爛,那也沒關係。它能跑,我就滿意了。而且我可以從別人的評論中學習。我從來不是會冒牌者症候群的人,認識我的人應該不會意外。

Jonathan:我不會意外。回到你在大學遇到的教授和老師,有沒有哪位老師特別讓你印象深刻?他們教的方式有沒有加速你的學習,或對你理解程式設計有巨大影響?他們具體做了什麼,讓你從理論跨到實作?這問題有點大,你可以拆成幾塊來回答。

Erik:對對對。我得把應用科技大學和一般大學分開講。先說後者。在一般大學,我覺得能教人的師資水準普遍非常非常低,門檻很低。我的感覺是,很多在大學教課的人之所以教,是因為必須教,不是因為想教。大學裡你真正想做的是研究,但你必須花一定的時數教課,否則就不行,那是工作的一部分,但他們其實不太喜歡。所以,在我學會寫程式之後,我想更深入學程式設計,就選了那裡的程式設計專修。結果爛透了。我幾乎是生氣了:他們想傳授給我的程式設計知識水準竟然這麼差,於是我乾脆轉去資安。我其實對資安沒什麼興趣,但程式設計那邊實在太糟了。我常說,我大學時期唯一真正學到的,是怎麼寫正式的文章、怎麼做正確的資料來源研究,讓你知道你的來源是什麼,不會隨便接受任何來源。這些是我在那幾年學到的,但程式設計我什麼都沒學到。

Jonathan:這聽起來也很像歷史系的訓練:怎麼檢視一則資料來源、怎麼確保你的論證站得住腳,諸如此類。那歷史的技能和你從中得到的樂趣……

Erik:大概是這樣。

Jonathan:它們在你寫程式和學寫程式的過程中怎麼體現,如果有的話?有哪些相通的地方?

Erik:這問題很難。嗯,兩者都涉及大量閱讀。歷史就是閱讀,而寫程式也是閱讀程式碼。你實際寫程式碼的次數,遠比讀程式碼的次數少。所以它也很像閱讀。有時候很像當考古學家:如果你換了新工作,接手一套古老的遺留系統,你得想辦法摸清它的門路。那感覺像是你在東翻西找,看看角落裡藏了什麼。有時衣櫃裡還會掉出屍體之類的。所以感覺有點像在探索。我是說,你喜歡這個的哪裡?我不知道還有沒有其他……樂趣到底在哪?

Jonathan:謝謝。那在這個產業裡,你的樂趣在哪裡?

Erik:大部分是……嗯,老師講的那些故事。比如海盜,他們會講被繩子拖到船底下之類的,講得很生動。我就愛那種東西,真的很喜歡。我也很愛羅馬人和他們的文化,他們怎麼擴張,還有那些政治鬥爭,背刺之類的,我超愛。我高中也學過拉丁文。我根本不在乎拉丁文,但我很愛那些故事。所以我不喜歡非得學拉丁文,但那些要我們翻譯的故事我很喜歡。不過兩年後我就放棄了。

Jonathan:那些我確實喜歡。不,我問這個關於歷史的問題,是因為……

Erik:對,我知道那個故事。

Jonathan:我看過不少人喜歡比較偏藝術或社會的領域,該怎麼說?在英國的分類裡,藝術和歷史大概會被歸在這一類。但我越來越常看到喜歡這類領域的人轉去學寫程式。我會感興趣,是因為這兩者之間明顯有重疊,試著把這個重疊描繪出來,是我和不同人聊天時非常有意思的一部分。感覺上,如果你能掌握全局,又有跨領域的方法,把你學過的各種東西帶進程式設計裡,那會非常有利,因為你能把不同的技能套用到程式設計的領域。我覺得,對,我就先講到這裡。所以很有趣,你愛歷史,而現在你有……大概超過 30 種程式語言的經驗,而且你在維護其中很多。嗯,不一定是維護,但你在 Exercism 上深度參與管理這些語言,這是你……對對對,請說。

Erik:有多少是你的?我可以稍微回應一下你剛剛說的嗎?你提到有很多不同類型、不同興趣的人都在寫程式。我認為其中一個原因是,程式設計同時吸引兩種人。它吸引非常技術導向的人,因為它有嚴格的規則,語言的規定很固定,有文法、有語法,這些都很吸引喜歡事情有固定樣貌的人。比如你是物理學家,你喜歡規則、定律之類的。程式設計裡也有這種東西。但它同時也像一門藝術。所以有人把它拿來跟寫書相比,我到現在還是覺得那大概是最好的比喻之一。我不喜歡蓋房子那種比喻,因為如果我們蓋軟體真的像蓋房子那樣,那根本沒有一棟房子蓋得起來。我真的覺得它既是科學也是藝術。Jeremy 最近在那些比較深入的內容裡提到,一個很簡單的練習,大家可以想出幾百種不同的解法,即使你覺得「嘿,這應該只有一種解法才對」。但方法永遠不只一種。這就是我愛程式設計的地方:你可以有一個能動的東西,然後再去探索,比如說 20 種其他選項,你可以寫出來,然後發現「嘿,這樣也能跑」。我真的很喜歡這種既是藝術又是科學的組合,因為我覺得這是我唯一真正能發揮創意的地方。我完全不是有創意的人。我有左手也有右手,但你如果看我在家裡做些雜事、木工之類的,你就會知道,我完全不行。這也跟我爸沒能教我這些有關。真的很有意思。

Jonathan:不過話說回來,我也真的對那些沒興趣。我自己在學校是學藝術的。我玩過音樂,彈過吉他之類的。所以對我來說,我對「創意」的框架一直是在繪畫或音樂這些東西上。我從來沒想過程式碼的創意面。既然你提到這個,那你自己的情況是怎樣?比如你會玩樂器嗎?我知道你喜歡音樂,我只是想把這兩件事連起來。

Erik:嗯……我會,我會。對,我試過學吉他。這對我太太來說很辛苦,因為我們當時住在她學生時期的公寓,大概 20 平方公尺。我在練吉他,我們兩個人住得那麼近。我到現在還很驚訝她居然忍得下去。但我沒有……

Jonathan:只是……

Erik:我對演奏樂器沒有任何天生的才能。我必須非常非常非常努力,才能達到某個水準,而且還是很低的水準。節奏之類的我還行。但有一次,我的吉他老師要我即興,然後彈獨奏,我完全迷失了。我怎麼都做不到。我身上就是沒有音樂的創造力。

Jonathan:我身上就是沒有音樂的創造力。寫程式呢?你跟那就不一樣了。當你接到一個全新的東西,比如 Jeremy 給你一份簡報,或是 Exercism 上的一個功能需求,說我們要來做 X、Y 或 Z。這會讓你在精神上振奮起來嗎?你會不會覺得「哇,好,酷,我們來好好探索一下」,並且享受這個過程?這是不是某種意義上讓你活過來的事?

Erik:跟你不一樣。好。對對。寫程式就是:你有一個想法,然後把它變成真實存在的東西。你幾乎像個小小的神,對吧?你從什麼都沒有開始,有個想法,然後就出現了某個東西。這實在太神奇了。我到現在只要寫出一支腳本,還是會興奮得不得了。那些一行一行的文字,然後你看著它開始做事。看著電腦按照你說它該做的事替你工作,真的很好玩。我到現在還是喜歡。所以創造力這一面,也同樣表現在你要探索該用哪條路去做出一個東西。等你做出來之後,你大概聽過所謂的重構循環:你先有一個能動的東西,然後開始反覆調整,看看能不能讓它更好。我超愛重構。有一本書,就在那裡,喔,我看不到,因為它在鏡頭外。那是 Martin Fowler 的《重構》。那是我讀軟體相關書籍裡數一數二好的體驗。我超愛重構。那個過程就是:你有一個能動的東西,但你可以讓它更好、更漂亮、更快,看你用什麼標準。這也是我這麼喜歡 Exercism 的原因,因為它就是為此而生的:你解測試,然後你有測試框架,你可以對程式碼做任何事,只要測試還是綠的,它就還能動。

Jonathan:我很喜歡這點。那我要繼續把時間軸拉回來。現在你讀完大學了,學會寫程式了,你真的下定決心投入這個學習的過程,要深入鑽研。那接下來呢?從真正投入之後,你大概開始思考職涯,而這通常是大學生活的一大重點:我這輩子到底要做什麼?後來是怎麼發展的?你當時怎麼想?眼前出現了什麼機會?

Erik:好。我其實從來沒有規劃過我的職涯。我想我這輩子從來沒做過這種事。我唯一在乎的是做我喜歡做的事,而且離我近,這樣我就不用開很久的車。我不喜歡開長途車。不過沒有,我從來沒真正規劃過職涯。而且我也非常幸運。我基本上從來不用去應徵工作,頂多一兩次吧。總是有朋友或認識我的人介紹。Exercism 也是一樣。Jeremy 認識我,我不用去應徵、不用經歷我不知道四五個面試關卡,像你得經歷的那樣。順帶一提,你的可能還更多。不過,我沒有。我找工作的時候也是這樣。我一直在半工半讀,連高中時也是,因為我父母沒什麼錢,我得自己賺自己那份。不過我喜歡工作。我大學時期大概做過 20 小時的程式相關工作,因為我們在大學裡實際得上課的時間很少,所以我能賺不少錢,我還用那些錢買了超大的 DVD 收藏。

Jonathan:這個就別提了。

Erik:這個就別提了。對,抱歉,其實我大部分都送人了,只留下那些我記憶特別深刻的。我曾經有 400 到 500 張 DVD。

Jonathan:曾經有 400 到 500 張 DVD。喔,那真有趣。

Erik:差不多是那個數量,差不多。對。不過,我大學的時候,有個朋友,就是我 10 歲左右那個很會寫程式的朋友。他跟我一起讀大學,那時他在一家公司上班,問我要不要加入一起賺點外快。我去了。後來基本上就留下來了。等我大學畢業,他們問我要不要讀博士。但我把那解讀成:他們在我博士研究裡發現了什麼有趣的東西,那其實純屬運氣,我是有在做研究,但那是運氣。我把它解讀成「我們想把名字掛在你之後要寫的東西上,這樣我們就有發表」。所以我不想做那個。我不想花四年做理論的東西,整個學術圈也不太吸引我。我在公司裡做實務的東西自在多了。所以我留在我原本工作的地方。那是 PHP,我們團隊很棒。我想,除了現在這個團隊之外,我從來沒待過這麼多元又這麼有能力的團隊。但我們的管理階層糟透了。那裡的技術環境充滿不滿,真的很不好,但我還是玩得很開心。可是 PHP 不是我最喜歡的語言,我比較想寫 C#。從 C# 還是 1.0 的時代我就是它的粉絲了,那時候它還很粗糙。我從美國訂書,還得付額外的稅,最後花了不少錢,但我還是把那本書用得超兇。後來我說,我想找一份寫 C# 的正職,不只是兼著做。於是我去應徵。其實也是在大學,但不是做研究之類的,而是支援大學裡各個不同的單位。我就這樣寫了大概七年的 C#。

Jonathan:然後你寫了大約七年的 C#。跟我說說那段故事吧。因為你一開始是志工或貢獻者,對嗎?然後才慢慢累積起來。

Erik:對。我在大學工作時,他們非常開放,允許你去學東西、去參加研討會之類的。有一次我聽到一個叫函式程式設計的東西。我想,嘿,我不太懂這個。我知道大學裡有一堂選修課在教,但我沒真正碰過。我想也許我該學學函式程式設計,也許會很好玩。我找了一個也想學的同事一起。我們上了 Coursera 上一門免費的 Scala 課程,現在要付費,但當時不用。授課的是 Martin Odersky,Scala 的作者,Scala 也是 Exercism 上有的一種函式語言。我學得很開心,學函式程式設計有時在腦力上也很辛苦,因為那真是一種完全不同的思考方式。但我撐過來了,而且我很喜歡。當時有個論壇,可以和別的學生討論,比如你解不出來的練習。但有人問,如果我想更深入學 Scala,可以用什麼資源?有人提到,嘿,試試 Exercism,他們有個很棒的東西,你可以在裡面做很多不同的練習,像小謎題一樣。我心想,嘿,這聽起來不錯。於是我加入了,做了 Scala 的學習路徑。我真的學到很多,那是我第一次探進函式程式設計的世界。所以我想,也許該深入一點。我去了 Haskell,那對我當時來說真是深度的鑽研。不過那時候 Exercism 還是 V1,人們只是在你的程式碼上留言,沒有正式的導師制度之類的。但 Haskell 圈子的人真的超棒。我基本上是跟著他們學會 Haskell 的。我查了很多 Google,找到一些很奇怪的解法,我自己也寫了一些奇怪的解法,但他們總是試著引導我走向符合 Haskell 慣例、漂亮的寫法。那是一次很棒的經驗,讓我覺得,嘿,我應該也來為別人做這件事,也許我也能幫忙。我一直喜歡幫助人。所以我想,那我就來做 C#,在別人的 C# 程式碼上留言。我很喜歡那樣。然後我發現,嘿,C# 的學習路徑裡有,我不知道,40 個練習,Haskell 更多。為什麼會這樣?於是我試著弄清楚原因。結果發現,嘿,你可以向 Exercism 提交 pull request,新增練習。就是這件事讓我整個栽進去。接下來我每個週末都在加練習。等我把 C# 弄完,我想,嘿,F#,來做 F# 吧,F# 是函式語言,又在微軟生態系裡,我兩個都喜歡,那就把我最愛的兩樣東西結合起來。我做了 F#,做的是同樣的事。我成了 F# 的維護者,建立練習,我超級超級喜歡。

Jonathan:超級超級喜歡。你接觸一個語言,比如說好,我來試試 Scala,然後稍微上手了,接著又深入鑽研。那學會每個語言所花的時間,有沒有隨著時間減少?因為現在你懂不少語言了。這過程是怎麼發展的?

Erik:對對。這跟自然語言是一樣的道理。如果你學了法文,而且法文很好,那接著學西班牙文就會輕鬆很多,因為有大量共通的知識,比如共通的詞彙,幾乎像方言一樣。寫程式也一樣。如果你會 C,要轉到 C++,會有很多新概念,但也有很多東西完全一樣。所以整個 C 家族就是這樣。這也是我喜歡程式設計的一點:語言有家族樹。有 Lisp 這一支,有 ML 這一支,有 C 這一支。這幾乎就像歷史,有族譜、有家族樹之類的。我說得太大聲了。對,那是 Haskell 或 Prolog。不過我也很愛那些異類,因為它們有獨特的想法。那通常就是我想試的:找一個做事方式不一樣的語言,即使所有程式語言都共享很多相同的知識。它們都有布林邏輯,而布林邏輯是固定的、是既定的,在哪裡都一樣運作。你可能要用兩個 & 符號,或者用 and 這個字,但基本原則還是一樣。所以一旦你掌握了這些基礎,而且很熟,就能更輕鬆地套用到其他語言。

Jonathan:這幾乎就像歷史,有族譜、有家族樹之類的。更輕鬆地套用到其他語言。你自己學寫程式,也把自己的經驗考慮進去。人們為了學寫程式,會做哪些行為、哪些事?我相信很多不同領域都有相通之處。你提到你就是全心投入、深入鑽研,跟那個東西搏鬥到搞懂為止。還有其他你見過的行為或做法,是你會覺得「對,他們讓自己處在能學習的位置」的嗎?很好。

Erik:嗯,我一直試著鼓勵大家去做一個自己真的想做的東西。我學 PHP 的時候,做了一個記錄我看過哪些 IMDB 前 250 名電影的東西。我當時看很多電影,所以想把它們每一部都勾選起來,我就這樣學了很多 PHP 和 MySQL,只因為我在做自己想做的東西。因為這樣當你卡住時,你會想要繼續、想要修好它、想要讓它能動,而不是停下來。我把這個建議給過好幾個剛開始學寫程式的人,對他們都很有用。現在跟我當年學寫程式時完全不同了,有 Stack Overflow 之類的,網路上能找到的知識太多了。但要找到對的資源也很難。所以我覺得 Exercism 在這裡真的能發揮作用,因為我們幾乎可以當守門人,我們社群裡有人知道哪些才是對的資源。我看到新手常在這一塊掙扎。還有就是……你幾乎找不到真的從零開始的資源。Exercism 的受眾通常是至少已經會一種語言的人。然後你再學更多語言,或更深鑽研那個語言。但它不是給完全沒有程式設計背景的人。所以你不知道for迴圈是什麼,不知道變數是什麼,字串在你腦中完全是別的東西。對,如果我太太看到我在講字串,她總是用奇怪的眼神看我,在荷蘭這是另一種意思。

Jonathan:對。我這裡要做一些概括性的說法。過去幾年,越來越多人知道寫程式、程式設計這回事,這大概是真的。以前懂這塊、知道怎麼在其中前進的人,數量可能比較少。顯然這個產業正以相當快的速度成長,所以自然有很多意見,也還有很多人正在努力摸索自己在某些事情、某些議題上站在哪裡。所謂「你會誓死捍衛的那座山頭」,基本上就是:你抱持什麼意見,是你會真正去爭取、去(當然是以健康的方式)捍衛的?有哪一件事是你會捍衛、會想把它釘住,說「這點我不會退讓」,而且你得為它辯護的?那會是什麼?好。

Erik:我有很多這種意見,不過我在這裡想談的是:你應該去學比你已經會的更多的語言。試試你還不會的新語言,試試跟你已經會的差很多的語言。這很容易,比如你會 C#,就繼續待在自己熟悉的 C# 也可以,那沒問題。但如果你能挪出時間和意願去試別的,比如 F#,或我不知道,試試 Kotlin,做些不一樣的事,看看差別在哪,你會成為好得多的程式設計師。我百分之百確信,學 F# 讓我成為更好的 C# 程式設計師,即使它們是不同語言、有不同哲學。但現在語言之間的重疊太多了。語言還很年輕的時候,比如 Lisp 看起來完全不像 C,函式語言和命令式語言差很多。但像 C#、Java、Kotlin,還有 Rust 這些現代語言,它們也從其他語言、包括函式語言汲取靈感。所以我大學的時候有個老笑話:函式程式設計很棒,但沒有人在用。現在這句話已經不成立了。即使你工作的語言不是函式語言,函式語言的概念也無所不在。JavaScript 有很多函式概念。C# 有進階的模式比對、有 LINQ,函式性的東西很多。你會看到語言把各種概念混來混去。所以現在很難清楚界定哪個語言是函式語言、哪個只是命令式語言,現在更像是混在一起。但我還是認為,開始學一個新語言能帶來很多收穫。有人說每年學一個新語言,我試著這麼做。我可以想像這對某些人來說很煩、會讓人吃不消。但至少試一個不同的語言,而且試一個稍微離開你舒適圈的語言。我保證你會學到東西,會學到很多,整體上會變成更好的程式設計師,對你原本在用的語言也有幫助。

Jonathan:對你原本在用的語言也有幫助。顯然人們會為了滿足特定需求而創造新語言。你剛說命令式和函式在某種程度上開始融合。你有沒有看過一種情況,就是語言最後會消失,只剩下幾種核心語言?還是這種想法太天真了?

Erik:不,不,我覺得大家太有主見了,不會發生這種事。新語言永遠會有,每天都有新語言出現,那沒關係。但樹會搖一搖,最後受歡迎的語言大概會存活下來。我不覺得 Java 或 C# 短期內會消失。而比如 C 或 C++ 一直以來都是超大型的語言,但現在我們看到 Rust,它試著用新方法處理同樣的問題,但更安全,內建的安全性。那是一個很棒的語言,我其實應該多學一點。看到 Rust 慢慢進入同樣的領域很有意思,人們開始用它取代 C 或 C++,我個人認為這是好事。比如在 Linux 裡,你現在可以用 Rust 寫驅動程式。嗯,永遠會有 C++,但他們現在支援用 Rust 寫驅動程式,這是一大步。所以我認為語言還是會繼續存在,因為你沒辦法做出一種適合所有用途的語言。這也是我認為你應該學多種語言的原因之一,因為不同的情境需要不同的語言。這就像拿……那個怎麼說?拿鐵鎚當鋸子用。我不知道那句俗語怎麼說。

Jonathan:那句俗語?就像,好,你需要一把鋸子,但你只有鐵鎚。你要怎麼辦?

Erik:對對,差不多就是那個意思。我想是跟釘子和鐵鎚有關的那句,我不太擅長英文俗語,就不拿荷蘭文版來煩你了。基本上就是,如果你只會 C#,可能就會忍不住什麼都用 C# 來做,但要做系統程式設計,或我不知道,AI,可能有比 C# 更適合的語言。即使你用 C# 也能做,也不代表你就該那麼做。所以如果你會更多語言,你就更能做出好選擇,選出更適合你所在領域的語言。

Jonathan:好,所以這既好玩又美妙。說到 Exercism 社群,你這週想給 Exercism 社群什麼推薦?是你會強力建議大家試試看的,什麼都可以,比如去散個步、試試倒立,我也不知道。好,你想要的話可以推薦不只一個,你可以……我已經知道我要說什麼了,所以你可以有三個推薦。

Erik:所以這既好玩又有用。我已經知道我要說什麼了。好。喔,第一個想到的是去看看我們現在有的「Dig Deeper」分頁。我們新增了 Dig Deeper 這個功能:當你解完一個練習,或至少在它上面反覆調整過之後,你可以看到各種解法思路,也就是同一個練習不同的解法。這基本上就是 Exercism V1 時代大家學習的方式,再加上留言:看別人的程式碼,看他們怎麼解。我也是這樣學了不少 Haskell,除了我自己收到的留言之外,就是看著,「喔,原來可以這樣做」。然後你會自己試試看,說「嘿,這真的很優雅,我還能用它做更多事」,再把這些套用到其他練習上。所以能看到這些不同的做法,幾乎就回到程式設計的藝術面:你可以用不同的方式解決問題。所以就會有這些不同的解法思路。我寫過反轉字串的解法思路文章。那是 IT 面試很基本的題目之一:你要怎麼反轉一個字串?在 C# 裡有幾種不同的慣用做法,它們不一樣,效能特性也不同,其中一種非常講究效能,但可讀性比較低。我喜歡的是,在這個網站上,當你用某種方式解完之後,你可以說,嘿,還有其他做法,這樣做的好處是什麼,取捨又是什麼。不只是能看到不同的解法思路,我們還試著寫一份導讀文件,幫你在它們之間做選擇。IT 裡永遠有取捨,幾乎從來沒有一個「就是最好」的解法,你總是可以換個方式寫。所以,最易讀的解法不見得是效能最好的。幫你做出取捨、理解取捨,並在不同的解法思路之間做選擇,這也是我們想透過 Dig Deeper 分頁做到的事。我現在都利用空閒時間寫這些,光是整理這些資訊、分享給大家,我就覺得超好玩。所以我真的很鼓勵大家試著寫寫看,或至少讀讀這些解法思路。我知道不是每個練習都有,這個功能我們一週前才剛開始做,所以目前大概只有幾個 C# 練習有,但我們會大幅擴充。我們也接受社群提交這類 PR。我很樂意幫你寫、幫你把它送出去,讓你能分享你對自己語言的知識。我覺得這是大家總會喜歡的一件事:如果你喜歡一個語言,你也會希望別人喜歡它。解法思路就是展示你的語言能做些什麼的好方法。去看看就對了。

Jonathan:去看看就對了。你這週還有其他推薦嗎?

Erik:嗯,有可能聽起來很像是個滿腦子都是 Exercism 的人,但我真的很喜歡 Exercism 的論壇。我職涯裡發現一件事:要找到一個有科技思維的社群,而且幾乎算是一個安全的空間,讓你可以討論事情,不用怕別人讓你覺得自己很笨、或變成爭論、變得劍拔弩張,這真的很難。所以我真的很喜歡我們試著透過論壇,把它變成一個安全又愉快的地方,同時也是一個能遇到非常優秀程式設計師的地方。那些人技術很好,對自己的語言或程式設計領域有很棒的見解。我很享受單純讀別人寫的東西。有一個討論串在聊你最喜歡的程式設計書,我已經把好幾本書放進我的待讀清單了,因為……對,你不會剛好每一本書都碰到,但別人讀過。基本上就是借用群眾的智慧。

Jonathan:借用群眾的智慧,基本上就是那個討論串,我相信裡面一定有真正的黃金可以挖。你知道嗎,那真的很酷,Eric。我想如果你想再給一個推薦也很歡迎,不然我們就開始慢慢收尾了。你還有什麼想法或想說的嗎?對,我們繼續分享。

Erik:嗯……對,這個會收進影片裡。沒有,其實沒有。我剛剛在找第三個。

Jonathan:我其實……我也總是在找第三個。這樣講太多了。不過 Eric,非常謝謝你撥出這段時間。聽你的故事真的很棒,聽你怎麼一路走到科技業也很有意思。我特別喜歡聽到關於歷史的那一小段,也許這是你之後可以再想一想、多分享一點的題材,談談歷史、寫程式,還有這些東西怎麼在某個地方交會。但真的很謝謝你。很高興有你加入團隊,我一直從你身上學到很多,而且一定會繼續學到很多。要大聲恭喜你,你在 Exercism 網站上突破了 10 萬聲望點數。我知道你會說那是因為你作弊,不過我們還是當作一項了不起的成就吧。非常謝謝你。如果你正在聽這段,而且還沒接觸過 Exercism,去看看 Exercism,我相信你一定會在某個地方遇到 Eric。Eric,謝謝你,我真的很感激。我會先把這段錄音暫停,我們之後可以再聊,謝謝你的時間。希望你跟我一樣享受這次對談。這次真的很棒。

Erik:那我就不客氣了。太棒了。我玩得很開心,真的。非常謝謝。

更多來自我們社群的故事

聆聽、學習,並從我們的社群成員身上獲得啟發。