偶爾我們會遇到一些人,一頭栽進學習程式設計的世界!Carl,在網路上也叫「Meatball」,他透過 Exercism 上的 Python 開始學寫程式……這真是了不起的成就,但誰不愛挑戰呢!
Jonathan: 嗯,你好,歡迎收聽 Exercism 的 Podcast。我是 Jonathan。很榮幸能再次回來,無論你在哪裡,都和你分享生活與故事。今天我們的來賓名叫 Karl,我就直接切入,請 Karl 簡單自我介紹一下。Karl,說說你來自哪裡?最近在忙些什麼?又是怎麼接觸到 Exercism 的?
Carl: 我住在瑞典的哥德堡,目前是全職學生。當初我踏入科技與程式設計領域時,用的就是 Exercism。我一開始從 Python 軌道入門,我覺得對大多數初學者來說,Python 軌道是最好的選擇,因為 Python 的語法相當直白,而且在我看來也很符合人的直覺。就程式語言的型別來說,Python 對你也很友善,它的型別、資料型態沒那麼多,不過……對。所以我開始做概念練習,照著課程大綱走。我大概每隔一個週末做一、兩題練習。過了一陣子之後,當我真正……因為一開始我犯了很多錯,現在回頭看才發現。現在我年紀比較大了,或者說……現在程式寫得比較久了,就看得出那些錯誤。所以你的程式碼在一開始不必完美。我很喜歡的一點是,當我在 Python 軌道上做了很多練習之後,我後來轉到了 Ruby 軌道。好。從 Python 轉到 Ruby 之所以很不錯,是因為兩者有很多相似之處。而且呃,Ruby 的語法也滿像的,但有些差異。比如說 Ruby 更偏 OOP、物件導向。所以我覺得對初學者來說,先從 Python 開始、再轉到 Ruby,會是段滿不錯的旅程。我們下次見。
Jonathan: 你是從 Python 開始的。我的意思是,很多人來到 Exercism 時,多少都有些開發經驗。如果你本來就有一些開發和寫程式的知識與經驗,大家用 Exercism 通常是為了精進某個特定的語言。不過我的理解是,你當初完全沒有寫程式或程式設計的經驗,就直接從 Exercism 開始,對嗎?
Carl: 我以前接觸過一些像是 Scratch 那樣的視覺化程式設計,但從來沒真正寫過程式。從零開始真的很辛苦。我想這是每位程式設計師的共通點。起步就像一座山,等你爬上山頂之後,一切就變得容易多了。就像你說的。
Jonathan: 我還以為你要說,你爬上了一座山,結果那座山又變得更大了,然後你再往上爬一點,山就一直越來越大、越來越大。你有過那種感覺嗎?有沒有某個時刻,一切突然變得說得通了?有沒有那麼一刻,你心想:好,我懂了。
Carl: 我是說,要真正完全理解一件事,其實要花很多時間。而大多數人一開始常做的是……大量使用 while 迴圈,因為它們很有彈性,你能控制的地方比 for 迴圈多得多,因為 for 迴圈在開始之前,你就得先告訴它迴圈要跑多久。我覺得……當我真正學會怎麼適當地使用 for 迴圈,而不是過度依賴 while 迴圈時,我想我對程式設計就開竅了,或者說,對迴圈怎麼運作開竅了許多。
Jonathan: 好,所以那算是你的一個時刻,你覺得:這個概念我懂了。那麼你對迴圈的理解,後來有延伸到其他概念上,讓它們也開始一點一點變得說得通嗎?我用自己的經驗來說好了。我也在 Go 軌道上學 Go。迴圈對我來說一直毫無意義,直到我花了大概 3 天,把練習和文件從頭到尾走一遍,一點一點拆解開來。而那段鑽研迴圈、試著理解迴圈的經歷,其實對我整體理解程式碼,還有理解函式和這類東西怎麼運作,有很大的影響。你的經驗也類似嗎?
Carl: Python 特別的是,你常常要解決不同的問題,常常要疊代東西。這差不多就是你在 Python 裡唯一在做的事。在 Python 裡,你就是透過疊代來解決問題。這代表迴圈非常重要,必須徹底理解。當你真正完全搞懂 Python 的迴圈,你就能做很多事,因為一切都是以疊代物件為基礎。
Jonathan: 很不錯。你目前在念書,錄音前你稍微提到過,像是數學、物理。你現在在讀哪些主題?你目前正在學哪些主題或科目?
Carl: 我在學程式設計、數學和物理。
Jonathan: 好,這些你覺得怎麼樣?
Carl: 其實,我當初做 Exercism 就是為了替那些程式設計課程做準備。結果我發現,我現在懂的比那些課程涵蓋的多得多。
Jonathan: 太棒了。
Carl: 我從那些課學到的其實不多,因為我反而都在學馬克思主義。
Jonathan: 所以 Carl,你的意思是,大家其實應該做 Exercism,而不是去念大學學位嗎?
Carl: 我是說,念資訊科學的話,你大概會多學到一點電腦怎麼運作、位元之類的東西。而 Exercism 只教你程式設計、解決問題,還有其中所有邏輯的部分。我覺得上大學還是有它的意義。
Jonathan: 我剛才有點在跟你開玩笑,因為如果你跟一堆有大學學位的人說你什麼都不懂,大概會得罪不少人。所以這個話題我們就先避開。Carl,接下來我想問你一些關於成長過程的事。你……我想一下該怎麼說。你小時候喜歡解決問題嗎?你對樂高那類的東西有興趣嗎?我會這樣問,是因為很多寫程式的人,天生就挺享受解決問題這件事。所以你在成長過程中,有很多比較偏技術性的嗜好或興趣嗎?跟我聊聊吧。
Carl: 我是說,我喜歡樂高。我沒有……我是說,我……我小時候數學不錯。那也算是一種解決問題,試著解各種數學題。我覺得,真正讓我踏入程式設計的,其實就是……我對科技整體的興趣,我很喜歡電腦。而且我很喜歡……謝謝你。每次有人電腦出問題,他們就會說:喔,你可以幫我看看嗎?這有時候有點煩,但其實通常很有趣。所以我對電腦越來越有興趣,就這樣讓我踏進了有趣的程式設計領域。
Jonathan: 好,就我所知,你目前在 Exercism 上已經完成了 4、5 個軌道,或者說,你透過 Exercism 實際學了 4、5 種語言,對嗎?
Carl: 是嗎?對,我已經……我開始過大概 6 個軌道。好。不過我只敢說自己對其中幾個還算熟,大概 4 個吧。
Jonathan: 好,那其中是哪幾個?應該是 Python、Ruby。
Carl: Python、Ruby、JavaScript 和 TypeScript,不過我 Elixir 也還算可以。
Jonathan: 好,那在這些語言裡,學習起來你最享受的是哪一個?
Carl: 我很愛 Elixir。我很喜歡那個語言寫起來的感覺。我覺得它是個……寫起來非常有趣的語言,但它和我習慣的其他語言很不一樣。某種程度上,就像從頭開始一樣。對。不過我覺得,如果有人真想學一門非常、非常強大的語言,JavaScript 就在那裡。在我看來,它是你能學到最強大的語言之一。
Jonathan: 好,所以 JavaScript 算是比較偏直譯式的語言,如果我說錯請糾正我。這樣說合理嗎?而 Elixir 大概更偏函式式,是嗎?
Carl: 對。
Jonathan: 好,所以這兩者在本質上差滿多的。讓我覺得有趣的是,你似乎同時享受這兩種語言構成的整個光譜。Elixir 到底哪裡讓你覺得好玩、有意思?你能說得具體一點嗎?
Carl: 我是說,就是它的函式式程式設計。你會有這些……你會有這些函式,而你要把它們全部組合起來。用這些函式去解決問題。對我來說至少是這樣,我會很依賴……呃,Elixir 的文件非常重要,呃,要真的做出點東西就得靠它。呃,而且在我看來,Elixir 的文件寫得很棒。嗯,所以你得靠搜尋找到正確的方法,我覺得這非常有趣。
Jonathan: 所以這幾乎像是在拼拼圖,可以這麼說吧,你得把所有東西拼在一起,才能看清整個問題。
Carl: 把所有東西拼在一起,讓你看到一整幅拼圖。就像我說的,我也很喜歡這個語言書寫的方式。所以它會是很好玩的一幅拼圖。
Jonathan: 好,很不錯。那你現在在那個軌道上進度如何?你已經做完練習題了嗎,還是還在做概念練習?
Carl: 那個語言有很多概念練習。我想大概有 20 個,或許更多。我想我還在做概念練習,我已經完成大概 90% 了,所以快做完了。
Jonathan: 太棒了,真的很酷。真的、真的很酷。Karl,我想多了解一些生活層面的事,不只是寫程式和開發。你平常閒暇時間喜歡做些什麼,或者有什麼嗜好?有沒有什麼事是你真的很想做的,如果寫程式之外的時間可以全部花在某件事上,那會是什麼?
Carl: 嗯,如果不准我說程式設計的話,我閒暇時喜歡打打電動,也喜歡騎腳踏車。那也很有趣。
Jonathan: 登山車還是公路車?
Carl: 公路車。
Jonathan: 所以你會騎車嗎?跟我說一點吧,你在瑞典對吧?對。你住的地方是平的嗎?還是有丘陵?你們那邊有美麗的海洋嗎?因為我對瑞典的印象就是你們有海。
Carl: 對,你們有海。對,我住的地方滿平的。但如果你往北走,就比較多丘陵。
Jonathan: 瑞典現在在下雪嗎?感覺現在要開始變冷了。
Carl: 上個星期好像有下雪,但現在沒什麼雪了。
Jonathan: 好,那你會在雪地裡騎車嗎?
Carl: 會。
Jonathan: 你真的會。我們還有另一位,你可能認識 Brian。Brian 是 Elixir 的導師之一。Brian Underwood,他也住在瑞典,我想是在斯德哥爾摩,他會在隆冬時節去跑步,在瑞典的黑夜裡跑來跑去。我覺得那挺……我覺得那挺酷的。那你騎車頻繁嗎,比如一週一次、兩次?還是說你算滿規律地在騎?或者只是……
Carl: 我、我、我,當我、我出門時,我、我騎車到公車站,然後從公車站搭公車。
Jonathan: 好,然後你就找個好地方,然後……所以你是搭公車移動。
Carl: 我騎車到公車站,然後搭公車。
Jonathan: 了解。好,不錯。Carl,你覺得……你住的地方離大學多遠?你現在住家裡,還是自己租房子?你的生活安排是怎樣?
Carl: 我的安排是怎樣?我住家裡。距離 30 公里。那個,那個我們,大概要花,我也不確定。喔,等等。對,30 公里,應該是這樣沒錯。大概要花個 40 分鐘左右吧。
Jonathan: 好,所以還不算太糟,但那還是滿長的一段路。那麼,在進入所謂的「真實世界」之前,你還有多久要念?你還有 4 年要讀,對吧?你現在是大一嗎?
Carl: 對。
Jonathan: 好,哇。所以你唸完第一年了,這是 4 年的學位。好。那,你有想過自己未來的夢想是什麼,或者想做什麼樣的工作,還是對這方面有什麼想法嗎?
Carl: 我是說,我一直很想從事跟太空有關的工作,因為我覺得那很酷。不是像天體物理那種,而是或許做一些跟太空相關的程式設計。而且我們有歐洲太空總署,那會是個方向,不過……如果沒有那個,我覺得就像,我也不曉得,一份普通的後端工作也不錯。
Jonathan: 就一句「普通的後端」,我喜歡你這樣說。在我聽起來,這好像很簡單、很輕鬆。那你覺得自己會想搬到瑞典以外的地方嗎?還是你喜歡瑞典?對這方面有什麼想法?我的意思是,我問你的這些問題,你可能根本還沒想過,因為你還有幾年才需要做這些選擇。不過太空聽起來真的很迷人。你打算怎麼做?要怎麼開始往那個方向走?
Carl: 我其實完全沒頭緒。我從沒真正想過實際該怎麼做,不過……我是說,之後再看吧。這比較像是一個夢想,而不是真的計畫。不過回答你剛才的問題,我其實想過或許可以住在加拿大之類的地方,但我想我還是會住在世界的北半邊吧。
Jonathan: 好,所以就是寒冷、冰和雪。你這樣可以嗎?可以。Carl,你有兄弟姊妹嗎?
Carl: 我有一個弟弟。
Jonathan: 好,所以你們兩個。他喜歡程式設計嗎?你會把你學到的、知道的教他嗎?
Carl: 喔,他其實不喜歡程式設計。我不曉得耶。
Jonathan: 喔,真的嗎?所以你們沒有共同興趣。那你也會跟他一起打電動嗎?
Carl: 我偶爾會跟他一起打電動,會啊。
Jonathan: 他比你小很多嗎?還是說他現在應該還在念書?
Carl: 他大概比我小 5 歲。
Jonathan: 好,所以年齡差距滿大的。喔,很不錯。太棒了。那回到 Exercism 和你的參與,如果我沒記錯,你現在在 Python 軌道上擔任維護者?對,或者是貢獻者。貢獻者,好,不錯。總有一天會變成維護者。那你覺得怎麼樣?透過這段經歷,你學到了哪些東西?
Carl: 我是說,Python 軌道上的人都很棒,和他們一起工作真的很好玩。因為我目前在寫很多文件,你會真的學到怎麼寫文件,而且常常也得做很多研究。對,所以你要寫很多文件,也會學到很多,因為你必須把很多其他人的文件全部讀過。所以你會非常深入地鑽研這些概念。
Jonathan: 所以把它當成一門學問來做,你特別享受這種貢獻方式嗎?
Carl: 是啊,而且我是說,讀那些文件的時候我學到很多。
Jonathan: 不,這真的很酷。那以目前貢獻 Python 來說,你有在想之後要開始貢獻 Elixir 和 Ruby 嗎?你怎麼看這件事?
Carl: 我是說,會啊,我可以想像自己貢獻 Ruby 軌道,但 Elixir 我應該不會。我有個長期計畫,之後要貢獻 TypeScript 軌道,不過再看看。我想接下來半年我其實還是會待在 Python 軌道上。
Jonathan: 好,不錯。那跟我說,你能稍微解釋一下 TypeScript 嗎?讓我大概知道它是在做什麼的。我會這樣問是因為我聽過它。但我聽說它有點……讓 JavaScript 變得更穩固?如果我完全說錯,你可以告訴我。它好像能幫 JavaScript 做點安全檢查,但我也可能說錯。它到底是什麼?
Carl: 它是什麼?我是說,你形容得滿好的。我修過一門前端的課,老師用的是 JavaScript,他在 HTML 裡寫了一些基本的 JavaScript。因為我把那段程式碼複製貼上到 TypeScript 裡,結果 TypeScript 就說:喔不行,你不該這樣做,這不安全。所以它很大一部分就是在做這件事,讓你的程式碼安全。像是避免程式崩潰之類的。它引入了型別,所以你不會有型別衝突。對,基本上它就是叫你做安全的事,不要寫不安全的程式碼。對,它是一門不同的語言,但和 JavaScript 非常像。你常可以把 TypeScript 想成 JavaScript,只是幫它穿上了盔甲,受到保護。
Jonathan: 好,所以它是一門獨立的語言。我原本的印象是,它幾乎像是 JavaScript 的外掛,但你是說,它其實完全是一門自己的語言。
Carl: 我覺得是。我是說,兩者非常相似,所以也許可以說它們是同一種、算是外掛,但我喜歡把它當成一門獨立的語言,因為它有一些關鍵的差異。
Jonathan: 我剛才說它是 JavaScript 的外掛,大概得罪了所有 TypeScript 的粉絲。我相信這會引來一些很有意思的意見。不過對你來說,TypeScript 的安全部分,正是讓它值得多探索的一項功能,是這樣嗎?
Carl: 我是說,其實讓我用起 TypeScript 的原因,是我用的 React 函式庫不支援一般的 JavaScript,只支援 TypeScript。後來我就習慣了 TypeScript,覺得它真的很不錯。而且當你使用型別時,程式碼也會更清楚,因為你真的能看出來:好,這裡輸入的是數字,輸出的是字串。讀起來更容易。
Jonathan: 好,你剛才提到 React Native。你比較喜歡前端開發還是後端?從我理解,你應該是偏好後端。不過你也會稍微碰一下前端嗎?
Carl: 我碰過一點前端,但我的 CSS 實在太差了。所以我通常會去找個好用的 UI 函式庫來用。
Jonathan: 你說 CSS 很差,是什麼意思?是你就是不懂它,還是它很讓人困惑,還是有太多……到底是哪個部分讓你覺得吃力?
Carl: 讓我覺得吃力的地方。它就像,你可以指定給一個物件的屬性太多了,非常花俏。喔,比如說當你在 CSS 或 HTML 裡建立一個連結,文字底下會出現一條線。要移除那條線,你得加上 text decoration,然後寫 none。這樣就真的能把線去掉。這種要記的東西實在太多了。而 CSS 最煩人的是,如果你在程式碼或 CSS 裡改了一個地方,常常會弄壞別的什麼。所以你實際上得這樣:好,我解決了這個問題。現在又冒出另一個問題,我得再解決那個,然後一直下去。它就是一直這樣。
Jonathan: 所以它就是一直把問題踢到別的地方去。那一定很讓人挫折。我想我唯一接觸 CSS 的經驗,是在學、也是想學 React 的時候。就像你說的,變數、選項多得不得了。你是要把它展開,還是限制住?而一旦你這麼做,這個按鈕就變了。等回過神來,如果不小心的話,你的每個元件都在做不一樣的事。Exercism 的 Jeremy,他 CSS 非常強,不過我想他只是對 CSS 各方面的東西懂太多了。所以對你來說,前端不像後端那樣讓你享受。
Carl: 前端的程式設計部分我沒什麼問題,但實際的畫面我就不是很喜歡。而後端,至少對我來說,它比較像是「跑得動就別去破壞它」。
Jonathan: 對,別碰它,讓它去。我覺得很有趣,大家往往會偏好……其中一邊。你知道後端到底是哪一點吸引你嗎?你說你喜歡它「能跑就好」這點。後端那種把邏輯想清楚、處理各種事情的過程,是你最享受的部分嗎?
Carl: 對,我喜歡它的地方是因為它大部分是邏輯,還有建立各種資料庫結構。差不多就是這樣,雖然我對資料庫也不是很在行。
Jonathan: 很不錯。太棒了。Karl,我還有一、兩個問題想問你。我很享受了解你來自哪裡、喜歡做什麼。你能不能點出幾個關鍵建議,或者你會推薦給剛開始學寫程式的人什麼?你可以針對背景比較偏科學的人講,也許給這類樂在其中的人一些建議。但如果完全從另一個角度來看,你會說什麼是……值得一直做下去的好事?
Carl: 一直做下去?我是說,我覺得你應該……先從簡單的語言開始。不要一開始就選 Rust、C++ 或 C。然後真的去做。就是說,當……我知道 Jun 好像也講過類似的話,不過……當你看到一個問題,就把題目讀過一遍,休息一下,想清楚你要怎麼解,然後再回來實際解它,因為……讓你的腦袋去消化你打算怎麼解決這個問題,是件好事。另一件事我覺得是……盡量不要進展太快。現在做一點,之後再做一點,因為比如說你在做很多概念練習時,比起同一天把所有概念做完,讓那些資訊真正沉澱下來會更好,不然到那個時候你大概只會一頭霧水。
Jonathan: 以及一切是怎麼套用上去的。好,不錯。所以就是慢慢來。給自己一點空間把事情想清楚。你會說,慢慢來、讓事情真正深植在心裡,比快速掠過表面更好嗎?聽起來你就是這個意思。
Carl: 有些語言,你或許只需要學語法和……和基本的東西,然後就能進入比較貼近真實世界的場景,再往更深的地方鑽。以 JavaScript 來說,我學了基礎,然後做了 React 專案,在那裡我……學到了一些新東西,也更深入這門語言。
Jonathan: 喔,很不錯。好,很好。太棒了。好,Carl,這週我還有一個問題要問你。你這週想給社群什麼推薦?你的特別推薦,什麼都可以。可以是,你知道的,去雪地裡騎一趟車。可以是跳進冰冷的湖裡,或者如果你在瑞典,去泡個桑拿。你會給社群什麼推薦?
Carl: 對,我是說,我不,我覺得它,它,它,在雪地裡騎車非常難。所以我不,我不建議大家這麼做。
Jonathan: 對。
Carl: 不過我想我還是會說我剛才說的。就是,如果你卡在某個問題上,就休息一下。不要在那裡再坐好幾個小時,硬是想把它解決。短暫休息一下,再回來面對這個問題,會更好。
Jonathan: 好,不錯。所以你這週的推薦是,如果你需要學什麼,放慢腳步,休息一下,去喝杯咖啡。你喝咖啡嗎?
Carl: 還沒。
Jonathan: 還沒。好。永遠不喝。
Carl: 我其實只喝水。這大概就是我比較特別的地方。
Jonathan: 好,太棒了。我跟你說,這在你往後的人生會替你省下不少錢。太棒了。好,Carl,今天能跟你聊天真的是我的榮幸。謝謝你撥出時間,也謝謝你對各個軌道的貢獻,以及投入 Exercism,我們真的很感激。過去幾個月能認識你,我真的很開心,尤其是透過我們經營的 Discord 伺服器。我想應該是 Ex-Orts 吧,你當時在 Elixir 的 Discord 上嗎?
Carl: 就是那個同期群組,或是專家群吧。
Jonathan: 對,我相信我在那些地方很常看到你,真的很棒。然後,對,謝謝你的貢獻。一切都很美好。期待很快再聊,非常謝謝你撥出時間。你就先別掛斷,我們把後面收個尾。也謝謝大家收聽。你剛才聽到的是我 Jonathan,以及 Carl,期待很快再見。掰掰。
Carl: 掰掰。
聆聽、學習,並從我們的社群成員身上獲得啟發。