40歲學編程,我最終選擇了Rust

每個程序員都有自己的“真命”編程語言。

本文經原作者授權,由InfoQ翻譯併發布。

儘管我早在小學的時候就電腦玩得如魚得水,似乎註定要進入 IT 行業,但後來卻經歷了屢次失敗。今年,當我步入四十不惑時,我終於學會了編程。也許我的經歷會讓你明白:只要你想開始,就永遠不會晚。有時候,你只需要找到適合自己的語言。

“不想成爲Logo 明星程序員後再被派去參加比賽”

我的編程生涯始於 20 世紀 80 年代時擁有的第一臺電腦。那是一臺叫做 ADAM 計算機的怪獸,就是下圖這樣的:

這是一種個人電腦、ColecoVision 遊戲系統和打字機的混合體:兩個磁帶機代替了磁盤驅動器/磁帶盒、一臺電視機代替了顯示器,還有一臺有趣的打印機,上面有個開關可以將它變成一臺完整的打字機。很多其他 ADAM 計算機用戶都有實際的磁盤驅動器,但這個沒有,磁帶要花很長時間才能加載出來。

我們剛得到它的時候,我父親在地下室裏錄了很多磁帶,但我不知道爲什麼會有這麼多的遊戲。我最喜歡的一款遊戲叫做《Gateway to Apshai》(一款戰鬥電子遊戲),這是一種類 Rogue 的遊戲(迷宮探索式電子遊戲)。後來他解釋說,他是用 Forth 實現的。下面是他的原話:

當我們有了 Coleco Adam 計算機時,它有一個 Zilog Z80 CPU,因此,我用過一點 Forth。不知道你是否還記得,我從美國訂購了一盤磁帶(用於磁帶機的),裏面有幾個黑客程序和一本名爲《Adam 黑客指南》(The Hackers Guide to the Adam)的書,它允許我們將 ColecoVision 的遊戲下載到空白磁帶上,這樣我們就得到了大量的遊戲。我自己並沒寫過任何程序,但是磁帶上的程序都附有源代碼,所以你可以按照邏輯來寫。在某些情況下,我需要調整參數並重新保存,以便優化任何需要破解的程序。這很有趣,也很好玩。

關鍵是他給我看了一種叫做 BASIC 的語言,當時的我以爲 BASIC 是世界上唯一的編程語言。我開始學習這門編程語言,並跟着讀了像《銀山之謎》(Mystery of Silver Mountain)和《捕獲獅頭象》(Hunt the Wumpus)這樣的書,很快就學會了如何編程。我開始根據 Steve Jackson 的《巫術!》(Sorcery!)這本書製作我自己的小型 RPG 遊戲。

它們最後就像下面這段從 Wikipedia 上抄來的代碼的一個較大版本,其中有很多RAND的擲骰子和GOTO調用。隨着時間的推移,我不得不添加越來越細的行號(比如,在 60 行和 70 行之間添加了一個 65 行,然後是 64 行,最後當我用完空間就得給整段代碼重新編號)。

10 INPUT "What is your name: "; U$
30 INPUT "How many stars do you want: "; N
40 S$ = ""
50 FOR I = 1 TO N
60 S$ = S$ + "*"
70 NEXT I
80 PRINT S$
90 INPUT "Do you want more stars? "; A$
100 IF LEN(A$) = 0 THEN GOTO 90
110 A$ = LEFT$(A$, 1)
120 IF A$ = "Y" OR A$ = "y" THEN GOTO 30
130 PRINT "Goodbye "; U$
140 END

所有這些代碼都是我自己完成的。那時候,人們還不能在網上搜索示例代碼,所以大家都認爲我註定要從事 IT 行業。
與此同時,我們在學校裏學了一種叫做Logo的東西。這就沒那麼有趣了,你需要做的只是讓一隻海龜在屏幕上畫出形狀就行了。你可以給它函數,比如FD 90RT 90,然後用REPEAT 4,它就會重複四次,畫出一個正方形。畫一個圓要花很長的時間,因爲你必須給出REPEAT 360,看着海龜重複 360 次才能畫出一個圓。所以有時候你可以作弊一下,執行REPEAR 180,讓海龜一次向右 2 度,這樣計算機最終會繪製出幾乎相同的東西,但只需進行 180 次計算即可。

爲了增加趣味性,你可以像下面這樣做一個形狀,告訴它做一個圓,然後告訴它向右轉一點,然後開始下一個圓。

在看到 Bryan Cantrill 的這段視頻之前,我幾乎完全忘記了我用過 Logo 這件事。Cantrill 年紀跟我差不多,小時候也學過 Logo。我們經歷也很相似:對讓海龜畫圓這件事完全心不在焉,但他幸運地遇到了 C 語言並真正投入到編程中,而我沒有。這是我自身的原因。

在 20 世紀 80 年代的計算機課上,我們都坐在 Calgary Ranchlands 社區學校的一間沒有窗戶的房間裏,對着電腦讓海龜畫圓。由於 Logo 超級容易上手,以至於我和其他幾個人都覺得,它根本就不像是一門編程語言。老師們注意到了這一點,就說馬上要舉行 Logo 競賽了,我們應該去參加。那應該是一場全市範圍的比賽,也有可能是一次省級範圍的比賽。

比賽持續了兩三天,我們終於在最後一天鼓搗出了一個產品,得到了評委們的認可並有望獲獎。我的隊友比我更投入,而我卻開始表現出對比賽的興趣缺乏。我覺得我們拿到第四或第五名就可以了,但隊友並不滿意。所以當比賽結束時,我如釋重負。我知道我不想編程,不想贏了比賽後作爲 Logo 明星程序員再被派去參加其他比賽。

我當時的人生目標就是讓那個我小學時一直暗戀的女孩喜歡上我。還有就是在當時,人們認爲會電腦的人都是書呆子。所以那時候,我在公共場合都會和電腦保持一定的距離,來保持這樣的形象:是的,我是很擅長電腦,但我並不是一個電腦愛好者或其他什麼。

在看了兩三天的 Logo-Proficient 比賽和他們所做的東西后,我們得到了一件 T 恤和一個瓶子作爲參與獎勵,這是我最後一次使用 Logo 。與此同時,我又持續用了一段時間的 BASIC ,直到 90 年代初,我們把 ADAM 計算機換成了386,BASIC 就被我忘得一乾二淨,而我也不打算花錢買一本關於編程的書。

Bryan Cantrill 第一次接觸 Logo 的經歷是這樣的:

我想我用過的第一種語言是 Logo,現在回憶起來,這是一種虐童的行爲,Logo 太可怕了!如果現在你去看 Wikipedia 上的 Logo 詞條,你會說:“嗯,這很好,就像一種受到影響的 Lisp 方言……”但是這些都是錯的。“Logo 是一隻什麼都不會做的海龜,我說的海龜就是指大腦袋顯示器上的一個三角形,它什麼都不會做。它的魔力就像你告訴它“box”(繪製正方形),它會告訴你“I don’t know how to box”。

我記得三年級的時候,計算機是必修課。我還記得當時那種機械、冷漠的感覺,因爲這個東西不知道如何繪製正方形,而我也不在乎你知不知道怎麼繪製正方形。我第一次接觸計算機就是“我對這件事一點兒也不關心”。

Python、Ruby還是 Lua?

從 90 年代到 2000 年代這段時間,我沒有做過任何編程。然而,在這段時間裏發生了兩件至關重要的事:我成了《星際迷航:下一代》(Star Trek: The Next Generation)和《創世紀 VII》(Ultima 7)的超級粉絲。

Data 是我最喜歡的角色,因此我經常思考 Soong 博士是如何做出來 Data 的,我們需要多長時間才能達到這樣的階段。當我玩《創世紀 VII》時,我曾有過並且現在仍然有同樣的感受:這個世界充滿了細節,我會繼續玩這個遊戲甚至只是爲了和人們聊聊天、逛酒吧、看人們讀書。

所以,這段時間是讓我對編程再次感興趣的重要時期。編程不再是關於海龜和令人沮喪的比賽,而是科幻小說、電影、奇幻遊戲、音樂以及其他一切我認爲很酷、很有價值的一切。

那時候,我知道有一種叫做 C++ 的編程語言是用來開發遊戲的,也許有一天我可以用它做出一個長得像 Android 機器人那樣的 Data 和《創世紀 VII》那樣的遊戲。這讓我對 C++ 產生了一定的崇拜,但我已經和編程無緣了。

我從加拿大搬到了日本,然後移居韓國。有一天,我遇到了一位來自多倫多的韓裔加拿大人,他在韓國當程序員。作爲一名韓裔,他可以在沒有嚴格的僱主允許讓他保持簽證的情況下從事自由職業,只需整天坐在星巴克用兩種語言進行編程:PHP 和 Python。我知道 PHP 這個名字,一直以爲它只是一個電子公告板的名字。他跟我說應該試一試,因爲可以很快學到新技能,也會對我的職業生涯有幫助。

他向我推薦了 Python,說應該先從這門語言開始。初次使用 Python 非常迷茫,只有一些小小的成功。我記得我讀過關於 Python 2 和 Python 3 的帖子,這些帖子都是說 Python 2 如何更好,Python 3 如何強迫每個人接受的。不管這意味着什麼,我注意到一些熟悉的東西,比如print,但熟悉的$卻不見了,也沒有任何行號或GOTO。在沒有主函數的情況下,我設法將一些東西放在一起,但我真的不知道,一個程序沒有行號和其他類似有用的東西該如何從頭到尾運行。

那時候的互聯網開始普及,人們在網上會對一種語言與另一種語言進行比較和討論。我注意到一種叫做 Ruby 的語言更像我的風格,所以我嘗試了一下。然後我又看到一種叫做 Lua 的語言,感覺它好像就是爲我做的。我不知道如何使用,但我就相信 Lua 是我想要的。我認爲 Lua 是最容易學習的編程語言,如果我能學好這門語言,就能學會所有其他編程語言。

幾個月後,我在星巴克又遇到了那個韓裔加拿大人,他問我 Python 學得怎麼樣了。我告訴他,我覺得 Lua 應該是適合我的編程語言,但我說不出理由,顯然我還沒有掌握如何寫代碼。他最後評論說:“嗯,也許你沒有編程基因。”

不知爲何,我卻固執己見地認爲自己有這方面的基因。我小學的時候就自學了 BASIC,我知道我有這個天賦。我只是需要真正喜歡上 Lua 並學好它……或者我應該學習 JavaScript?但大家都說你應該先學Python,雖然我確實更喜歡 Ruby……結果我一直沒完沒了地糾結着,直到我再一次失去了興趣。

最後,我又回到加拿大生活了幾年,編程根本不在我的考慮範圍內。2011 年到 2015 年期間,唯一與編程有關的事情只有一次,就是聽說隔壁辦公樓裏都是寫C++ 的人,他們爲管道和其他能源項目定製 SAP,賺錢很多。

40歲,第一次學會編程

2015 年,油價崩盤,Calagary 經濟也隨之崩盤,我們整個團隊也解散了。拿到了豐厚的裁員補償後,我決定開始真正學習編寫代碼。

我學會了如何編寫函數,如何創建對象等等,但是self關鍵字仍然讓人困惑,使用對象也是如此。再努力點就足以解決這些問題了,但我的老毛病又犯了:

  • “Python 在製作遊戲方面很糟糕——它不會讓你做出任何像《創世紀 VII》這樣的東西。
  • “爲什麼不去試試 C++?不,那太難了!C# 怎麼樣?讓我們試試吧。”
  • “哇,這真是太複雜了。儘管如此,C# 看起來是個不錯的選擇!等等,這是什麼?F#?這門語言真的很酷。爲什麼所有的語言都不是這樣的呢?”
  • “F# 太棒了!爲什麼就沒有更多的人使用它呢?也許我應該好好學完 Python……”
  • “那就 Python 吧,又簡單又好用!除非是 JavaScript。這樣我就可以在瀏覽器上做任何事情了。也許我可以從一些基於瀏覽器的遊戲開始?是時候試一試了……”

後來,裁員補償的錢快用光了,必須重新找工作了。找到工作後,我去市區和以前的同事們聚餐。那時遇到了我的一個90 年代中期後就沒見過的老朋友,他在財務部門工作,問我在做什麼工作,我告訴他我找到了一份新工作,下週開始上班。“哦,我敢打賭是編程工作對不對!你一直都很擅長編程。”他說。我回答說:“哦,不是編程……我已經很久沒有真正做過這些事了。是做項目控制方面的。”

我對這次談話記憶猶新,因爲這讓我思考爲什麼我從來沒有學過編程,而且無論從哪個角度來看,我年輕的時候似乎就註定要學編程。不過我當時忙於其他事情,沒有再去嘗試編程。

我在2018 年回到韓國。第二年八月,我給當時工作的公司提出了辭呈,那時候我是一名文案。離正式辭職還有一個月的時間,我開始考慮學門技術,也許這次真的要好好學習 Python 了。我可以每天花上幾個小時,到最後一天就會掌握得很好,然後再花上一個月左右的時間去找工作。這樣做了幾天後,我的老毛病又犯了。“好吧,你可以稍微看一下其他語言,”我自言自語地說,“但你必須把 Python 作爲重點。”

那是我第一次嘗試 Rust 。我聽說它確實很精確和高效,但很難學,喜歡它的人會讚不絕口。我是在《X 分鐘速成 Y》(Learn X in Y Minutes)(譯者注: GitHub 上的一個項目,包括了很多的簡短的入門教程,比如算法、編程語言、開發工具等)和《Rust 語言遊樂場》(the Rust playground)開始學習 Rust 的。

我開始學習 Rust 的時候,查了一下這門語言的用途,答案無一例外是,它幾乎什麼都能做。所以我可以做出《創世紀 VII》這樣的東西,或者任何我想要的東西。更有趣的是,語言的細節和語言的底層東西並沒有讓我感到厭煩:我發現自己被吸引得更多了。隨着我對這門語言的深入瞭解,我有了很多懷舊之情。

我寫的所有東西都被直接轉換成二進制文件,我又可以看到計算機的內部結構了。大量的 Rust 討論都是關於如何優化代碼的,我覺得這很有吸引力。但這門語言很高級也很安全,如果我全身心地投入,它幾乎可以使任何事情成爲可能(至少在一種語言可以做到這一點的範圍內)——這就是爲什麼我的老毛病完全消失了。

誰知道這種代碼會獲得成功呢!

Rust 編程》(Programming Rust)這本書對我來說,剛開始讀的時候太難了(一方面對 C++和 C 的內容引用太多了),所以我是看了其他書後纔回到這本書上,並最後喜歡上了它。

不過,對我幫助最大的是流媒體視頻。第一個是Javascript 開發者Brooks Builds製作的 70 多個視頻,他把自己看 Rust Book 的每一步都錄了下來。看着別人努力學習一門你也在學習的語言,會讓你有種在精神上參與的感覺,這是其他類型的流媒體做不到的。“是 mit einer deutschen Familie,不是 mit einem deutsche Familie!”或者“只要用into_iter()就可以編譯了!”等等這些時刻,你會覺得自己真的是在和別人一起學習(事實上你確實是在學習)。

從那以後我開始看Brian Myers,他基本也是靠必應(bing.com)搜索學習 Rust 。Jon Gjengset我留到了最後看的(這是在 《Crust of Rust》教更簡單的東西之前),同時也看了Hello RustRyan LevickDoug MilfordTensor Programmingthis Rust crash coursedcode 的 Rust 視頻等所有的視頻(不是全部按順序排列的)。還有一個我喜歡的視頻流就是rhymu8354,他是一個 25 歲的 C++ 愛好者,自己做了一個類似《創世紀 V》的遊戲,最近開始學 Rust。

半年後,我發現我有生以來第一次正確地學會了編程。然而並沒有什麼祕訣:真的是單一的專注和勤用必應搜索的結果。

由於只有一個 Surface Go 筆記本,我一定要避開任何有太多外掛的東西。但我做了一些東西,比如朝鮮漢字轉換器(朝鮮漢字就是韓國使用的漢字),效果很好,最後我還整理了一本名爲《用簡單的英語學習 Rust》(Learn Rust with easy English)的教材,目的是爲了讓那些英語二級水平的使用者更容易學習這門語言,而不必用翻譯成他們國家語言的 Rust 相關書籍。

這個故事的寓意我想就是經典的“找到自己喜歡的事情,然後一直做下去”。這對我來說並不新鮮,只是我花了那麼長時間才找到適合自己的語言。它讓其他語言變得如此易讀易懂,包括 C 和 C++。

我想說明兩點:一、見異思遷和缺乏專注不一定是永遠的;二、每個人性格不同,最簡單的語言不一定是你最喜歡的語言。

Reddit 網站上的 /R/LanguageLearning 等版塊上經常有這樣的討論:“我真的很想學(著名的 X 語言),但我是否應該繼續學更簡單的西班牙語/法語等,儘管我討厭它?”答案當然是否定的——只需學習你想學的語言就行了。這種建議更容易給出,因爲自然語言並不像編程語言那樣與職業發展緊密相連。但是由於編程語言也有很多後繼的東西,同樣的建議也許是可以適用的。

Rust 肯定不是那種爲了成爲大團隊中的初級程序員而學習的語言,更不用是在 40 歲年紀的時候。但是,如果你是那種對編程屢次三番撿起後放下的人,也許找到合適的編程語言會讓你堅持下去。

作者介紹:

Dave MacLeod,加拿大人,居住韓國首爾。職業翻譯,精通韓文、日文、德文、法文、英文。業餘 Rust 開發人員。

原文鏈接:

https://github.com/Dhghomon/programming_at_40/blob/master/README.md

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章