返回社群

靠解決問題一路成為技術主管

Gabriel Nelle 住在德國南部,靠近巴登-巴登。他和女朋友還有兩隻貓同住一間公寓。他曾在錫根的大學攻讀數學與德語教師,並在 2008 年完成學業。

在 Youtube 上觀看
長度 52分鐘

Jonathan: 嗨,大家好。我叫 Jonathan,很開心今晚能擔任你們的主持人。今天節目請到一位讓我深感榮幸的嘉賓,我想向大家介紹 Gabriel Nelle。Gabriel 是我們 Exercism 的核心貢獻者之一,他尤其深入參與 Go Track,不過稍後我會請他更詳細地自我介紹。

不過先說一句,Gabriel,非常歡迎你。謝謝你來參加,也希望你今天玩得跟所有聽眾一樣開心。那麼,Gabriel,就交給你啦。跟我聊聊你來自哪裡,以及你是怎麼走到現在這個位置的?

Gabriel: 嗯,嗨。我是 Gabriel,謝謝你邀請我。我來自德國南部,我在那裡長大,現在也還在那裡,不是同一個地方,但仍在德國南部。嗯,我在那長大,這麼說吧,我是 1980 年代初出生的人,生於 1981 年。我想我的故事要從 1980 年代末說起,那時我父親帶回了他的第一台電腦。

我想那就是故事的開端,至少是我這段文字敘述的開端。

Jonathan: 嗯。

Gabriel: 它裝的是 MS-DOS,我不確定確切是哪個版本。我想是比較舊的版本,因為如果我記得沒錯,我父親會把它帶回家,是因為那台電腦基本上是被公司淘汰的,他們換了新電腦,所以他就把那台帶回家了,嗯,那是我對電腦的第一印象。

MS-DOS,既有趣又奇特。

Jonathan: 那、那些線條,黑色螢幕上的彩色線條?那還挺酷的吧?

Gabriel: 對,就是黑底白字,基本上是這樣。基本上大多數時候就只有命令列,那是我最早接觸到的東西。後來,大概在 1991 年前後,我父親教了我們最早寫的 for迴圈,用的是 QBasic。我那時大概 10 歲。那時候還有一個學單字的程式,我父親買了一套背單字的軟體,我不太確定是不是 DOS 介面,我想你應該是用滑鼠點,不過我不是百分之百確定,也可能是更晚的事。總之,那絕對是我最早開始碰電腦的那些年,我把電腦弄壞過幾次,我父親得修過幾次。

所以我當時確實很有興趣了解這些,但不是那種我會坐下來告訴自己「我得學會這個」的方式。我真的很感興趣,想搞懂你能用它做什麼,這讓我著迷。

Jonathan: 那、那你父親呢?他是專門做電腦相關的工作,還是只是剛好在業界,碰巧把電腦帶回家?還是有什麼特別的原因讓他帶電腦回家?因為電腦的關係,還是技術上的原因?

Gabriel: 對,其實他學的是電工,那是他的本行。不過他當時在 Bosch 工作,在電子部門,負責開發新的晶片或車用的新東西。那裡當然有電腦,他很早就負責所有跟電腦相關的事務、網路印表機之類的,他基本上是這樣入門的。

他基本上就是那個包辦一切、讓東西能運作起來的人。因為他沒有博士學位,不像他部門裡大多數人那樣。所以他基本上就是負責這類事情,也因此學到了很多關於電腦的東西。

Jonathan: 嗯,好,讚。抱歉,我剛剛插話了。所以你是說,那時候你到處玩、弄壞過幾次,那就是你接觸電腦、硬體還有那一類東西的開端。然後呢?從那之後又發生了什麼?接下來是怎麼發展的?

Gabriel: 我想下一個階段是我有了自己的電腦,我想大概是我還年輕的時候,也許 5、6 年後吧。總之。我對電腦越來越有興趣,學校裡也有一些相關的課。我開始用電腦寫作業之類的。

那已經是用 Word、MS Word 的那個年代了。然後有一天開始,我父親一直在為我們教會做些文獻方面的工作。我們在一個很小的教會長大,我們會用到這些文獻,而我父親在把那批文獻數位化,或幫忙數位化。一開始只是個副業,就是處理那些資料。後來它竟然變成我的第一份全職工作,替⋯⋯讓我想想,你可以看一下嗎?替美國那家負責這批文獻的出版社工作。

Jonathan: 嗯。

Gabriel: 簡單說,我父親問我:「我有一堆巨集,是我用一套歐洲文字腳本寫的,那基本上可以說是以某個版本的 Word 為基礎,算是 Word 之前的產物。我現在想換到 Word,需要把所有巨集搬到 Word 上。」

我就說:「好喔。好。」這就是我開始用程式操作 Word 的起點。用的是 Visual Basic for Applications,一開始你可以錄製巨集,再去看程式碼、看它在做什麼,然後改進它,基本上把巨集改進到⋯⋯以前是你把游標放在這裡、按一個鍵,它就會像在接下來幾行做點事。到最後,它會把整份 Word 文件從頭到尾處理一遍,完全自動化。

這基本上就是我後來寫一大堆巨集的開端,為的是那個⋯⋯引起了不小的迴響。我父親那些找他利用空閒時間做這件事的人說:「哇,太棒了!我們再多做一些,把這個越來越自動化。」嗯,我就是這樣一頭栽進去的。

Jonathan: 你幫你爸省下很多時間。

Gabriel: 嗯。

Jonathan: 在那方面來說,而且你年紀還那麼小。

Gabriel: 可以這麼說。後來從在 Word 寫巨集,到後來在 Excel,我寫過一套以 Excel 為基礎的收銀系統,給一間小店用。那是一間賣有機食品之類的小店,基本上他們會把價格都記下來,然後用腦袋或用紙算錢。一開始就是這樣運作的。

我替他們寫了一套系統,有條碼掃描,還有電子秤,可以把東西放上去秤重,然後拿到收據,結帳時再掃那個條碼之類的。基本上整個流程都是以 Excel 為基礎。話說回來,我現在一定會用不同的方式來做。Excel 同時是資料庫,也是印表機。所以我會把東西都排版在 Excel、在 Excel 工作表裡,然後它就會印到收據印表機上,之類的。

當然,嗯,我認為那算是我職涯的起點,可以這麼說。

Jonathan: 你做這些的時候是幾歲,然後接下來又是怎麼走到那裡的?那是在上大學之前嗎,算是高中時期?然後那件事是不是在很大程度上影響了你的職涯方向,可以這麼說?

Gabriel: 對,那些都是上大學之前的事。那套店裡的系統大概是我 20、21 歲的時候寫的,我在那段時間服替代役。

Jonathan: 什麼?

Gabriel: 寫巨集大概是 16 歲左右的事。中間我也寫過一些以 Access 為基礎的系統,用來印信件標籤,好讓信可以寄出去,像是地址之類的。然後就是念書了,結果出乎意料,我念的不是資訊科學。

Jonathan: 好。

Gabriel: 我其實是去念數學和德文老師的,教某個年齡層。讓我算一下,大約是 10 到 19 歲。所以就是這些年齡層,從 5 年級⋯⋯

Jonathan: 所以你是說⋯⋯

Gabriel: 到 13 年級。

Jonathan: 你的職涯方向開始朝那邊走,那是、那個決定是基於什麼呢,比如說⋯⋯

Gabriel: 其實我本來很可能會走上程式設計這條路。不過在服替代役期間,我學到的遠不只是技術性的東西。可以說,我那時⋯⋯我所在的小隊負責一間養護機構,裡面大概有 5、6 個房間。

那裡住著不同的人,我主要負責照顧其中一位。她大概 55、60 歲,患有阿茲海默症。那件事給我很大的衝擊,因為如果你在那個年紀就面對這種事⋯⋯可以說,她 60 歲,對一個 20 歲的人來說聽起來很老,但我很清楚這可能發生在任何人身上,也可能發生在我身上。這讓我對生活中社會性的領域產生了更大的興趣,還有⋯⋯

Jonathan: 真有意思。

Gabriel: 社會性的職涯。其實這就是我當時選擇當老師的原因。我那時想寫程式,但我也很擅長教學,或幫助我的同學,尤其是在學校的時候。還有數學。數學是我最強的一科,我一直很喜歡。嗯,我一直很喜歡幫助別人精進技能,也很喜歡當他們突然搞懂的那一刻。當我看到他們眼中的神情,知道他們懂了。所以我,我真的當了老師。

Jonathan: 喔,真酷。跟我說一下,你剛提到那個,替代役什麼的。在德國,那是每個學生或孩子在讀大學之前都必須做的事嗎?這在德國文化裡是怎麼運作的?

Gabriel: 在當時,那是替代去當兵的方案。你若不是當 9 個月的兵,就是服 11 個月的替代役。那是當時的規定。

Jonathan: 好。

Gabriel: 只針對男性,不適用於女性。

Jonathan: 在德國現在還是這樣嗎?

Gabriel: 不,現在已經不是這樣了。不是了。

Jonathan: 好。我知道瑞士還是這樣,我太太就是從那裡來的。所以只是⋯⋯那套制度在當地還是很普遍。好。所以現在你念了數學,也讀了師培要當老師,而程式設計顯然在你人生中扮演了相當重要的角色。那是什麼時候⋯⋯你有沒有過一個時刻,讓你覺得「其實我在教書,我很享受,但我並沒有⋯⋯不過程式設計這一塊還是很活躍、還是很投入」?教學和寫程式這兩件事,你是怎麼取得平衡的?

Gabriel: 我是怎麼回到程式設計的?嗯。

Jonathan: 嗯。

Gabriel: 對。在我念書的那段時間,我基本上會做兩份打工。一個是教學,我在補習班教過,也在大學教過比較年輕的學生,教數學,大多是第 1、第 2 學期的課。

同時我在一家科技公司上班。他們⋯⋯主要是 Access 為主的。

Jonathan: 嗯。

Gabriel: 那是一間做共享汽車軟硬體的公司,也服務那些有很多車、要把車租給員工的公司。我在那裡一開始是當文件撰寫人員,後來他們發現我也會寫程式,所以我很快就轉到程式開發的領域。嗯,然後我覺得事情主要是在⋯⋯在學業的最後階段有了變化,那時你得去學校實習,規定要待 6 週、有一次 4 週之類的。我想,透過跟一些非常有經驗、非常投入的老師聊天,有一件事對我來說變得越來越清楚,也越來越重要,那就是時代變了很多,學生也變了很多。有一位老師跟我說,她一直教 5、6 年級,她跟我說,5 年前她班上大概只有一個學生算是問題兒童,意思是家庭不完整、父母離婚、家裡有問題之類的,而現在她班上超過 50%⋯⋯

Jonathan: 是啊。

Gabriel: 而那已經是 10 到 15 年前的事了,大概是 2006 或 2007 年,所以是 15 年前。這也顯示出事情變化有多大。而且我很清楚,現在很多學生就是不想再學習了。而老師永遠是最⋯⋯基本上老師永遠排在最後,是整個體系的最末端。嗯。家長、校長還有學生,基本上全都是老師的主人。對,老師永遠是⋯⋯可以說是最墊底的那一個,我不太確定英文該怎麼表達。他永遠是那個必須承擔所有責任、但基本上沒有權利的人。

Jonathan: 有權威,對,去行動。對。

Gabriel: 嗯。

Jonathan: 那你的決定呢?喔,抱歉,我打斷你了。你繼續、繼續。

Gabriel: 那類的事情至少讓我思考了很多。大學畢業之後,我就又滑回了程式設計這條路,因為我一個朋友,他就是當初把那批文獻工作交給我父親的人。他問我能不能幫他做一個專案。

而那個專案,一開始只被當成 4 到 6 週的專案,最後卻變成了 2 年半、或 3 年半。或 3 年半的專案。

Jonathan: 就是範圍蔓延。範圍蔓延是真的。

Gabriel: 對。最初他請我幫他做點東西,然後他一直在跟那家出版社的某個人聯絡。出版社那邊老是說:「我要一個公開的網站,把這些文獻放上去,我要大家能在線上讀完整的書。」

Jonathan: 哇。

Gabriel: 有一次我剛好跟我朋友說,他當時正在跟對方講電話,我說:「我可以想像自己來做這個,我現在其實也沒什麼事做。」然後他就說:「喔,Gabriel 會做。」事情就是這樣開始的。所以⋯⋯

Jonathan: 哇。

Gabriel: 我接到了一個專案,然後我為那個專案做了 3 年半,把成千上萬本書搬上線,整個內容資料庫⋯⋯

Jonathan: 哇。

Gabriel: 索引。不同的語言彼此連結。對,那個網站現在還在,是 egwwritings.org。如果有人有興趣去看看的話。它現在有了新的設計。我去年 12 月左右看到,他們換了新的設計,但底下的程式碼還是⋯⋯

Jonathan: 都還是一樣的。

Gabriel: 大部分是我的,我看得出來,因為它主要是用 JavaScript 寫的。

Jonathan: 嗯。

Gabriel: 程式碼看起來還是很像,它被重新拆分成不同的檔案,但各種風格還是一樣。

Jonathan: 你得把連結傳給我,我們會在適當的時候把它放進節目筆記裡。所以現在你做了 3 年半,大概 3 年吧,這個專案。你把這些東西都放上去、都建立索引了。那時候 JavaScript 是你主要的語言嗎?你的技術配置大概長怎樣?可以說,你當時專注在什麼上?

Gabriel: 那基本上是很大的一步,從 Windows 為主的軟體轉換過來。之前是 Visual Basic 和 Visual Basic .NET,而這次只有 jQuery、JavaScript,後端是 PHP。

Jonathan: 好。

Gabriel: 我們還有一個協議,就是我只要是在做研究,時薪就比較低⋯⋯

Jonathan: 嗯哼。

Gabriel: 只有我真正在寫程式的時候的三分之一。這給了我自由,可以邊做邊學。嗯。

Jonathan: 酷。那接下來⋯⋯Exercism。現在你做好多事。我說 Go 算是你工作的主要內容之一,對嗎?你引導過很多人,也一直⋯⋯你一直參與 Exercism 的 Go 部分,在那邊幫忙。那是什麼時候開始進入你的世界,又為什麼吸引你?請說。

Gabriel: 嗯,2016 年,那是我在那個大專案之後的第一份工作。其實在那個專案接近尾聲時,我就開始轉向 Go 了。那份工作我大多寫 PHP 和 Python,但 Go 很快就變成我最喜歡的語言,因為它很簡潔。它基本上是在試圖從那個瘋狂的世界裡⋯⋯那個功能越加越多、語言越來越複雜、對開發者造成越來越多額外負擔的世界,因為他得選擇要用哪種方式。而且他還得搞懂別人用的其他所有方式。所以這些額外負擔,Go 突然就帶來了這種安靜,還有這種⋯⋯重新簡化。這很快就變成我的第一選擇,我那時在那家公司做了個原型,大概是我離職前半年吧,因為他們想轉到 Go。當然,一開始總會有些地方讓你卡住,發現某件事在這個語言裡做不到,然後你會理解為什麼那樣做不合理,或者為什麼換個方式做更好。我真的很想學這些事情怎麼做。我也是這樣開始聽 Go Time 這個 podcast 的,它是 Changelog 出的。

Jonathan: 好。

Gabriel: Katrina Owen 上過那個 podcast,我想是兩次。至少我聽過她兩次,我想。嗯,我就是這樣開始關注它的。我想我是在 2017 年註冊 Exercism 的。我蠻確定的,不過還是得查一下⋯⋯

Jonathan: 我想也是。這樣說對嗎?

Gabriel: 對,我想那甚至可能還是第一版的時候,因為一開始並沒有⋯⋯我其實沒有收到任何回饋。我做了幾道練習,但從沒收到回饋,而我可以給別人回饋,我也給了。可是我從沒收到回饋。所以當時並沒有、沒有什麼機制能真正拿到回饋。基本上就是你想做就做,不想做就算了,可以這麼說。嗯。我想那應該是第一版吧?

Jonathan: 我想也是。我是說,我覺得從第一版到第三版經歷了不少轉變。

Gabriel: 對。對。

Jonathan: 第一版的回饋很少。第二版要求極大量的回饋,然後第三版有點落在中間,也許稍微偏少的那一端,不過也還好啦。那你當初有參與打造第三版嗎?是怎麼⋯⋯嗯,你在裡面的參與程度如何?我是說,我對這塊不太清楚,但很想了解一下。

Gabriel: 可以的話,我稍微往回退一步。基本上,我是聽了 Katrina 在 Exercism 上的第二次訪談之後回來的⋯⋯

Jonathan: 好。

Gabriel: 那時已經是第二版了。那時工作很多,需要大量的回饋。我就投入進去,而且我真的很喜歡給回饋。

還有⋯⋯

Jonathan: 嗯哼。

Gabriel: 我基本上開始思考要怎麼讓這件事更快。嗯,因為我很快發現,尤其是在最初的幾道練習上,很明顯我會一次又一次給出同樣的回覆。

Jonathan: 對。

Gabriel: 另一方面,當然有時候⋯⋯這兩種問題,有時候是這個問題,有時候是另一個。所以我基本上開始優化這件事。我開始寫一個小小的 Go 程式,用靜態分析,因為我想踏入分析這一塊。我以前沒做過,想認識它。總之我本來就有興趣試試看,而那看起來是個好主意。因為那時的程式碼還是很常見、一直都很相似。一道練習的解法,尤其最初的幾道,都非常像。我就是這樣踏入靜態分析的,我去找出程式碼裡不同的模式,然後自動把回覆區塊或預先定義好的區塊加進回覆裡。我基本上是從本機開始做的,這樣一來我一週大概能處理 100 到 102 道。而且我根本不是全職在做,是工作之餘。嗯。然後這件事開始⋯⋯我想 Pitfield 是第一個。Jon Arun,我想那是他的本名。他是第一個說「哇,這太棒了,這太厲害了」的人。我就是這樣,靠著靜態分析,讓我的工作開始為人所知。

Jonathan: 對。

Gabriel: 而我想那是第三版很重要的一部分。我們開始思考,怎麼靠這些工具、這種自動化、這種靜態分析,或靠那些能自動檢查程式碼、自動給回饋的工具,來減少導師的工作量,甚至完全自動化,連導師都不需要參與。因為導師⋯⋯很明顯,我們有導師,但他們不足以應付這些工作量。我們有 Inversion 工具,我們也看到很多導師心力交瘁、一個個消失。嗯,對很多導師來說,負擔實在太重了。那時的情況是,有些導師手上有 500 個以上等著被引導的解法,有時等待時間長達 1 個月甚至更久。當然,那樣的狀況下,學生到某個時間點也就直接離開了。嗯。

Jonathan: 嗯。有意思的是,我記得 Jeremy 前幾天說,在所有提交的解法裡,大概有 75% 是完全獨特的,我也覺得這很耐人尋味。我是說,你去看像 Hello World 這種練習,顯然非常簡單,按理說那一定會有個大家都會採用的標準寫法。結果他說,大家就是會嘗試各種不同的做法。有趣的是你知道那種交界,因為當寫程式越來越流行、越來越多人投入開發和程式設計,你就會想,那種自動化會從哪裡開始?會不會取代開發者的角色。我是在想⋯⋯我不知道會不會。我覺得需要的東西還是太多了。不過就⋯⋯我不知道你對這方面有什麼想法,但最近 Exercism 似乎很推廣引導,這真的很吸引人,因為就像你說的,它把那些你必須一再給出的、重複的教學,變成對大家來說比較能掌握的形式。與此同時,它會不會也變成一種情況,就是你其實需要人與人的互動、需要一個真人才能真正投入這些內容。所以我不知道你對這方面有沒有什麼想法,但我覺得這是個很有意思的領域。

Gabriel: 嗯,我不覺得開發者很快就會被取代,那還要很長一段時間。在開發上、在應用程式上,一般來說,還有在引導上,我想⋯⋯我想靜態分析,還有自動化引導,以及 Exercism 上一般來說的自動化引導,可以幫上很大的忙。但真正的引導還是需要導師,我會這麼說。

舉例來說,我在引導一個人,大概每 2、3 個月我們會通一次電話,有時更頻繁。可以說,我是在引導他的職涯。嗯,也包括技術上、非常深入的技術面,但那是一種完全不同的引導方式,不只是看看你的解法、告訴你哪裡可以改進。我想那正是現有的導師仍然被需要的地方,我也肯定會一直被需要,而我覺得那是我們可以著力的地方。

另一方面,我想我們無法在解法上完全取代導師,我也不覺得應該這麼做。我們可以自動化很多事,但導師仍然是能指引方向的人。他們看得出你正卡在什麼問題上,可以告訴你:「去搞懂這個和這個」,而不只是「你的程式碼該這樣改」。

Jonathan: 對。對。

Gabriel: 老實說,我希望 Exercism 上能有更多引導。所以我在想我們是不是應該⋯⋯

Jonathan: 你是說面對面的互動嗎?

Gabriel: 對。我在想我們是不是應該⋯⋯以前有個機制,前 10 道練習,至少是前 10 道,你得全部走完,而且要有人引導過才能繼續前進。

Jonathan: 對。

Gabriel: 我覺得以我們現在有的自動化,其實可以把它重新開啟。或者也許不是現在,而是未來。我想我會喜歡那樣。

Jonathan: 我們絕對可以、我們應該在社群通話裡提出來,因為我覺得把那件事重新拉回焦點會很酷。Gabriel,我們常問的問題之一⋯⋯這不是我先前跟你聊的那個問題,不過我⋯⋯我很喜歡問的其中一個問題,因為答案總是非常有趣又各不相同,那就是:程式設計對你來說,有那種「開竅」的時刻嗎?有人會說,有那麼一個經驗,突然間一切都說得通了。我自己經常講一個故事。我舉個學校裡的例子,那時我在學化學,我在英國讀書。

在英國,你們有那種考試,所以考前 3 年一切都在為那些考試鋪路,你有 3 年的學習,最後導向期末考,而且那是所有科目都一樣。其中一個科目顯然就是化學。我大概有 3 年對化學完全沒概念,我就是沒辦法、就是搞不懂。可是就在考試前 1 週,感覺就像忽然開竅一樣,就是那種「啊,通了」的感覺。我心想:「我的天,我可以從元素週期表推出一切。只要我知道週期表上的數字,我就能懂這個、那個。」然後事情就變得非常簡單。所以我在想,程式設計對你有沒有過那樣的時刻?還是說它就這樣⋯⋯你覺得它天生就對你有意義?如果這問題相關的話,那個時刻是什麼時候?

Gabriel: 我不確定自己有沒有那麼明確的一刻。我覺得能那麼早就有巨集錄製這個功能,用 Visual Basic for Applications 去看看程式碼,幫了我很大的忙。我不確定現在還有沒有類似的東西。我想你還是可以在 Word 裡做這件事,但很少有這種能錄製、然後看程式碼、用那種方式學習的機會。我覺得那讓我輕鬆很多,因為我起步時掙扎得很厲害。我想有一個算是那種時刻,不是說我懂了某件事,而是我意識到,基本上,我到底做對還是做錯⋯⋯那是我加入那家公司、還在做學生的時候,基本上那是我第一次和別的開發者一起工作。

在那之前,我一直都是單打獨鬥,基本上什麼都得自己來。而我總是有個大疑問:「大家通常都是這樣做的嗎?感覺很奇怪。感覺很複雜。感覺行得通,但這樣對嗎?」這些問題大概在我加入那家公司、開始在那裡工作時得到了解答。當然,有很多東西我需要學,我也確實學了很多。比如 Access 的資料錄集,我以前從來沒有真正搞懂過。我用過它們,但那時還行得通⋯⋯

Jonathan: 嗯。

Gabriel: 對,就是能用。

Jonathan: 對。某個⋯⋯

Gabriel: 後來我才真正理解、開始理解它們。所以那也許算是對我來說開竅的其中一件事,因為我有個同事,她跟我解釋,然後真的就通了。有一天我懂了它們是怎麼運作的⋯⋯

Jonathan: 嗯哼。

Gabriel: 它們原本該怎麼運作、該怎麼正確使用之類的。嗯,所以也許那也是那種時刻之一。但我覺得,那些時刻在我們的工作裡其實常常出現。我不覺得有那麼一個唯一的時刻,也許有那麼一個最初的時刻。但就拿 Go 來說,也有很多很多地方會讓我開竅,讓我理解某件事為什麼是那樣、該怎麼使用。

比如說 context。嗯,比如 context。

Jonathan: 對。

Gabriel: 嗯。比如說 context,我不確定它是在哪個版本加入的,可能是 1.6 還是 1.7 吧。那時候我沒去研究它們。老實說,我起初並不太需要它們。後來有一次一對一,像是一場 meetup,有人做了關於 context 的分享,講怎麼用它之類的。那讓我心想⋯⋯

Jonathan: 嗯。

Gabriel: 我應該去看看。不過又過了好幾個月,我才真正去研究它們、理解它們為什麼存在。比如關閉 channel 這件事,我不確定你知不知道,網路上還是有很多人建議用關閉 channel 的方式來結束一個 goroutine,而你不該這麼做。

context 就是為了這個而存在的。嗯,你用一個 context,取消那個 context,然後就能用它來結束 goroutine。如果你用關閉 channel,基本上你是在手動做 context 內部就在做的事,而且有太多陷阱要避開、太多問題要避免,通常大家就是會做錯。

Jonathan: 我相信你⋯⋯你有做過一場直播,你提過一些關於這方面的事。我、我想我記得你提到過,就是「用 context 就好」,因為⋯⋯

Gabriel: 嗯。

Jonathan: 很有道理。

Gabriel: 記得我提過那點。

Jonathan: 嗯。不過,就你過去引導人的經驗來說,你能不能看出一些⋯⋯行為或習慣,是那些學得快的人會做的?你能不能看出他們做了什麼,讓他們能讓自己處於快速或更有效學習的位置?還是說,你引導過的很多人,他們本來就自然而然地那樣投入?或者有沒有一些人讓你覺得「哇,他們做的事、他們做的事情讓他們能加速⋯⋯」

Gabriel: 我不確定我能這樣評論別人。但講我自己,我絕對可以這麼說。我想我是從我父母身上學到的。他們自己學了很多東西,我也從他們身上學到要自己教自己。所以我的程式設計完全是自學的。一開始有我父親,學校裡也學過一些東西。大多時候,在學校比較後面的班級裡,其實我,或者說我們,幾乎所有人都比老師還行,所以其實沒學到什麼,更多是彼此之間的互相學習。不過⋯⋯

Jonathan: 對。

Gabriel: 整體來說,我什麼都是自學的。我覺得這是寫程式必須具備的東西,因為你必須不斷鑽研以前沒見過的東西,你對它們一無所知,得去查資料。那個詞怎麼說?就是這種⋯⋯能力。對,就是這種能自己鑽研一件事、自己學會它的能力,我覺得那是程式設計學習的關鍵。

當然,如果你能找到一個人來告訴你這些,你可以學得快很多。所以我不是要說你不該找導師、不該去 Exercism 之類的,那些能幫你成長得快很多。但儘管如此,那就是⋯⋯我會這麼說。

Jonathan: 這讓我覺得,你的學習是透過實際試著解決問題而來的。不管是寫巨集讓某件事更有效率,還是其他什麼,我感覺那像是你人生中反覆出現的一個核心主題,就是學習。我覺得這在某種程度上很契合 Exercism 想做的事,就是幫大家實際動手做東西。

Gabriel: 對,就是這樣。

Jonathan: 所以,嗯,真的很酷。Gabriel,我們時間不太多了,不過我有兩個最後的⋯⋯嗯,不是問題。一個是問題,我會請你分享一個你的觀點,另一個則是⋯⋯嗯,也算是你可以⋯⋯我會請你給社群一個建議,關於他們這週該試試什麼。但首先,我們訪談過很多之前來過的人,如果你聽這個 podcast 或直播有一段時間了,你就會知道我們通常在直播接近尾聲時會問一個大問題。那個問題是:在科技領域,你會死守的那座山頭是什麼?也就是你非常堅定、願意站出來捍衛的那一個觀點。記住,你得給出好理由,不能只是說「這是我的觀點,就這樣」,你得有能力替自己辯護。不過那個觀點會是什麼?它可以隨你喜歡,要多強烈、多激烈,或多無所謂都行。所以那會是什麼?

Gabriel: 我會說那是一句諺語。在 Go 社群裡,我們有一句話,或者有人說過:「無聊的程式碼勝過聰明的程式碼。」

Jonathan: 我喜歡這句。那是什麼意思?

Gabriel: 那是什麼意思?嗯,基本上它總結了 Go 哲學很大一部分,關於簡潔、可讀性。所以如果你寫 Go 的程式碼,心裡想「哇,這招真聰明」,那其實是爛程式碼。就算寫出那段程式的人非常聰明、用的方法非常巧妙也一樣。

有時候我覺得,如果你真的遵循 Go 的簡潔和慣用法,你的整個程式庫裡其實不會有什麼你會想指出來、或能指出來的程式碼,說「你看這段多棒」。因為你所有的程式碼其實都很無聊、非常簡單,任何看你的程式碼的人都會說:「這有什麼特別的?」嗯,但重點是,你是因為是個好程式設計師才達到那種簡潔,而那是個反覆疊代的過程。寫複雜的程式碼很容易,寫簡單的程式碼則⋯⋯因為你首先得在腦中把問題變簡單,然後你得正確地寫出程式碼,接著還得反覆疊代、讓它變簡單。那是個長得多的過程,需要好得多的開發者,而不是隨手寫複雜的程式碼。複雜的程式碼,你看起來難以理解、難以閱讀、難以維護,也難以修改。

Jonathan: 這就是那種持續不斷的取捨,對吧?我在科技圈還很菜,才 3 年,而且我不是從開發的角度進來的,我是從產品、比較偏產品那邊、比較偏商業的角度來的。可以說⋯⋯有一件事讓我覺得很有意思,就是越來越明顯感受到,一切都在於取捨。所以說,那個取捨就像是簡單的程式碼對上複雜的程式碼,而複雜的程式碼也許只是日後更麻煩、更棘手。簡單的程式碼則可能前期要花更久、需要更多精力和心力。這就是那個不斷在做的取捨。

所以這是其中一個⋯⋯我不知道你對這有什麼想法,但我確實覺得,就是那個簡潔的一面。因為我記得我大學時有個朋友,他寫作業永遠只寫 2 頁的論文,因為他能把所有東西濃縮成 2 頁,而且還拿到最高分。所以我覺得這跟簡潔這個整體概念是吻合的。而簡潔的程式碼我覺得真的很難寫,因為它需要非常清晰的思考,不只是寫程式而已。所以我覺得那是個值得死守的山頭,而且我覺得你把這點闡述得很好。酷。

那麼 Gabriel,這週的最後一個問題。現在輪到你給 Exercism 社群一點建議了,什麼都可以,可以是健康方面的建議、飲食方面的建議。這是你分享一個你想給社群的建議的機會,什麼都行。所以你這週想給 Exercism 社群什麼建議?從你的角度來看,他們最需要去嘗試或去做的一件事是什麼?

Gabriel: 喔,這題很難。好,既然你說什麼都可以,那我可以給兩個嗎?

Jonathan: 好,就讓你給兩個。

Gabriel: 好。第一個建議。其實我是素食者,我從小就吃素,從沒吃過肉,而且在我童年和青少年時期大多時候其實是吃全素。所以,試著 1 週不吃任何乳製品。這是第一個。

另一個建議是⋯⋯我不確定你能不能在一週內做到,但如果你是個好開發者,你可以。試著建立共享記憶體,在多個服務之間共用,或在同一個服務裡共用記憶體,這非常有趣也非常值得一試。試著用 Raft 協定來實作共享記憶體。你可以用現成的函式庫,不需要自己實作 Raft,不過⋯⋯

Jonathan: Raft。你得把、你得把連結傳給我,我才能把它貼上去。所以這是 Gabriel 的挑⋯⋯嗯,也許我們該把它叫做「Gabriel 本週挑戰」。也許不太算建議,也許我們需要⋯⋯

Gabriel: 對,更像是「試試看」的東西。

Jonathan: 你發出、你發出了一個挑戰。那應該會很好玩,不過,酷。所以是 1 週完全不吃肉製品,看看結果如何,然後打造一個共享記憶體伺服器。你會怎麼說?服務、共享⋯⋯

Gabriel: 對,你可以把它叫做記憶體內的鍵值⋯⋯

Gabriel: 就是多個服務共用一個資料庫,或一個服務。嗯。

Jonathan: 好。

Gabriel: 因為它會教你很多關於資料庫底層如何運作的知識。嗯,底層的運作。尤其是那些共享式的⋯⋯嗯,我不太確定。嗯,像是 Cassandra 或 Scylla,我不知道你們有沒有聽過 Scylla。它有點像 Cassandra,但用 C++ 寫成,而且它們現在正改用 Raft 協定。它是一種鍵值資料庫。共享式的⋯⋯嗯,等等,它不是資料庫,它是⋯⋯管理層。

Gabriel: 對,Dgraph,來自 Dgraph。那個我想它底層也是用 Raft 來分散資料。我不能百分之百確定,得再查一下。但我們用的很多資料庫都是這樣。分散式系統。我想分散式系統基本上是我們這個時代的一大挑戰。我們正在設法解決它,但仍有許多挑戰要克服。嗯,能夠在那方面思考總是好事,因為如果你能,就會開啟很多可能性。

Jonathan: 嗯。

Gabriel: 如果你有需要的話。我上一家公司其實就在往那個方向走,讓多個服務同時共用記憶體。嗯。

Jonathan: 也許,也許我們該把這安排成一場大師課。我們給大家幾週時間試試看。那麼 Gabriel⋯⋯

Gabriel: 那就是、那就是大師⋯⋯

Jonathan: 對。

Gabriel: 等你把 Exercism 都玩完、所有練習都做完了⋯⋯

Jonathan: 那就是集大成的那個。集大成的那個。它把所有東西都串在一起了。Gabriel,非常感謝你撥空。今晚能跟你聊真的很開心。如果你想在我們錄完之後再稍微留一下,一下子就好,不過我只是想大大謝謝你,也真的很感謝你為 Exercism 付出的一切,不只是為我們,還有你在更遠的地方做的那些引導,幫大家寫出更好的程式碼。我相信到處都有人非常感激。謝謝你撥出時間。也請大家去找 Gabriel。如果你在 Exercism 上,傳個訊息給他、請他引導你一下,我相信你會和 Gabriel 相處得很愉快。酷。

Gabriel: 非常感謝你。

Jonathan: 錄完這段。嗯,不,謝謝、謝謝你來參加,我們很快就會在某個平台、某個地方再見。

Gabriel: 謝謝。

更多來自我們社群的故事

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