從逃離到成為遊戲開發,40歲了我才學會程式設計

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

1、“不想成為 Logo 明星程式設計師後再被派去參加比賽”

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

從逃離到成為遊戲開發,40歲了我才學會程式設計

這是一種個人電腦、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 行,最後當我用完空間就得給整段程式碼重新編號)。

  1. 10 INPUT "What is your name: "; U$
  2. 30 INPUT "How many stars do you want: "; N
  3. 40 S$ = ""
  4. 50 FOR I = 1 TO N
  5. 60 S$ = S$ + "*"
  6. 70 NEXT I
  7. 80 PRINT S$
  8. 90 INPUT "Do you want more stars? "; A$
  9. 100 IF LEN(A$) = 0 THEN GOTO 90
  10. 110 A$ = LEFT$(A$, 1)
  11. 120 IF A$ = "Y" OR A$ = "y" THEN GOTO 30
  12. 130 PRINT "Goodbye "; U$
  13. 140 END
複製程式碼

所有這些程式碼都是我自己完成的。那時候,人們還不能在網上搜尋示例程式碼,所以大家都認為我註定要從事 IT 行業。

與此同時,我們在學校裡學了一種叫做 Logo 的東西。這就沒那麼有趣了,你需要做的只是讓一隻海龜在螢幕上畫出形狀就行了。你可以給它函式,比如 FD 90、RT 90,然後用 REPEAT 4,它就會重複四次,畫出一個正方形。畫一個圓要花很長的時間,因為你必須給出 REPEAT 360,看著海龜重複 360 次才能畫出一個圓。所以有時候你可以作弊一下,執行 REPEAR 180,讓海龜一次向右 2 度,這樣計算機最終會繪製出幾乎相同的東西,但只需進行 180 次計算即可。

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

從逃離到成為遊戲開發,40歲了我才學會程式設計

在看到 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”。

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

2、Python、Ruby 還是 Lua?

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

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

從逃離到成為遊戲開發,40歲了我才學會程式設計

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

那時候,我知道有一種叫做 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,賺錢很多。


3、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 討論都是關於如何優化程式碼的,我覺得這很有吸引力。但這門語言很高階也很安全,如果我全身心地投入,它幾乎可以使任何事情成為可能(至少在一種語言可以做到這一點的範圍內)——這就是為什麼我的老毛病完全消失了。

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

從逃離到成為遊戲開發,40歲了我才學會程式設計

《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 Rust、Ryan Levick、Doug Milford、Tensor Programming、this Rust crash course、dcode 的 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


譯者/Sambodhi
來源:Rust語言中文社群
原文:https://mp.weixin.qq.com/s/sMu0Q0e9VY7-FZ8wMuTc7Q

相關文章