聲明:本文來自于微信公眾號 InfoQ(ID:infoqchina),作者:Dave MacLeod,譯者:Sambodhi,授權(quán)站長之家轉(zhuǎn)載發(fā)布。
盡管我早在小學的時候就電腦玩得如魚得水,似乎注定要進入 IT 行業(yè),但后來卻經(jīng)歷了屢次失敗。今年,當我步入四十不惑時,我終于學會了編程。也許我的經(jīng)歷會讓你明白:只要你想開始,就永遠不會晚。有時候,你只需要找到適合自己的語言。
1、“不想成為 Logo 明星程序員后再被派去參加比賽”
我的編程生涯始于 20 世紀 80 年代時擁有的第一臺電腦。那是一臺叫做 ADAM 計算機的怪獸,就是下圖這樣的:
這是一種個人電腦、ColecoVision 游戲系統(tǒng)和打字機的混合體:兩個磁帶機代替了磁盤驅(qū)動器 / 磁帶盒、一臺電視機代替了顯示器,還有一臺有趣的打印機,上面有個開關(guān)可以將它變成一臺完整的打字機。很多其他 ADAM 計算機用戶都有實際的磁盤驅(qū)動器,但這個沒有,磁帶要花很長時間才能加載出來。
我們剛得到它的時候,我父親在地下室里錄了很多磁帶,但我不知道為什么會有這么多的游戲。我最喜歡的一款游戲叫做《Gateway to Apshai》(一款戰(zhàn)斗電子游戲),這是一種類 Rogue 的游戲(迷宮探索式電子游戲)。后來他解釋說,他是用 Forth 實現(xiàn)的。下面是他的原話:
當我們有了 Coleco Adam 計算機時,它有一個 Zilog Z80 CPU,因此,我用過一點 Forth。不知道你是否還記得,我從美國訂購了一盤磁帶(用于磁帶機的),里面有幾個黑客程序和一本名為《Adam 黑客指南》(The Hackers Guide to the Adam)的書,它允許我們將 ColecoVision 的游戲下載到空白磁帶上,這樣我們就得到了大量的游戲。我自己并沒寫過任何程序,但是磁帶上的程序都附有源代碼,所以你可以按照邏輯來寫。在某些情況下,我需要調(diào)整參數(shù)并重新保存,以便優(yōu)化任何需要破解的程序。這很有趣,也很好玩。
關(guān)鍵是他給我看了一種叫做 BASIC 的語言,當時的我以為 BASIC 是世界上唯一的編程語言。我開始學習這門編程語言,并跟著讀了像《銀山之謎》(Mystery of Silver Mountain)和《捕獲獅頭象》(Hunt the Wumpus)這樣的書,很快就學會了如何編程。我開始根據(jù) Steve Jackson 的《巫術(shù)!》(Sorcery!)這本書制作我自己的小型 RPG 游戲。
它們最后就像下面這段從 Wikipedia 上抄來的代碼的一個較大版本,其中有很多 RAND 的擲骰子和 GOTO 調(diào)用。隨著時間的推移,我不得不添加越來越細的行號(比如,在 60 行和 70 行之間添加了一個 65 行,然后是 64 行,最后當我用完空間就得給整段代碼重新編號)。
所有這些代碼都是我自己完成的。那時候,人們還不能在網(wǎng)上搜索示例代碼,所以大家都認為我注定要從事 IT 行業(yè)。
與此同時,我們在學校里學了一種叫做 Logo 的東西。這就沒那么有趣了,你需要做的只是讓一只海龜在屏幕上畫出形狀就行了。你可以給它函數(shù),比如 FD 90、RT 90,然后用 REPEAT 4,它就會重復四次,畫出一個正方形。畫一個圓要花很長的時間,因為你必須給出 REPEAT 360,看著海龜重復 360 次才能畫出一個圓。所以有時候你可以作弊一下,執(zhí)行 REPEAR 180,讓海龜一次向右 2 度,這樣計算機最終會繪制出幾乎相同的東西,但只需進行 180 次計算即可。
為了增加趣味性,你可以像下面這樣做一個形狀,告訴它做一個圓,然后告訴它向右轉(zhuǎn)一點,然后開始下一個圓。
在看到 Bryan Cantrill 的這段視頻之前,我?guī)缀跬耆浟宋矣眠^ Logo 這件事。Cantrill 年紀跟我差不多,小時候也學過 Logo。我們經(jīng)歷也很相似:對讓海龜畫圓這件事完全心不在焉,但他幸運地遇到了 C 語言并真正投入到編程中,而我沒有。這是我自身的原因。
在 20 世紀 80 年代的計算機課上,我們都坐在 Calgary Ranchlands 社區(qū)學校的一間沒有窗戶的房間里,對著電腦讓海龜畫圓。由于 Logo 超級容易上手,以至于我和其他幾個人都覺得,它根本就不像是一門編程語言。老師們注意到了這一點,就說馬上要舉行 Logo 競賽了,我們應該去參加。那應該是一場全市范圍的比賽,也有可能是一次省級范圍的比賽。
比賽持續(xù)了兩三天,我們終于在最后一天鼓搗出了一個產(chǎn)品,得到了評委們的認可并有望獲獎。我的隊友比我更投入,而我卻開始表現(xiàn)出對比賽的興趣缺乏。我覺得我們拿到第四或第五名就可以了,但隊友并不滿意。所以當比賽結(jié)束時,我如釋重負。我知道我不想編程,不想贏了比賽后作為 Logo 明星程序員再被派去參加其他比賽。
我當時的人生目標就是讓那個我小學時一直暗戀的女孩喜歡上我。還有就是在當時,人們認為會電腦的人都是書呆子。所以那時候,我在公共場合都會和電腦保持一定的距離,來保持這樣的形象:是的,我是很擅長電腦,但我并不是一個電腦愛好者或其他什么。
在看了兩三天的 Logo-Proficient 比賽和他們所做的東西后,我們得到了一件 T 恤和一個瓶子作為參與獎勵,這是我最后一次使用 Logo 。與此同時,我又持續(xù)用了一段時間的 BASIC ,直到 90 年代初,我們把 ADAM 計算機換成了 386,BASIC 就被我忘得一干二凈,而我也不打算花錢買一本關(guān)于編程的書。
Bryan Cantrill 第一次接觸 Logo 的經(jīng)歷是這樣的:
我想我用過的第一種語言是 Logo,現(xiàn)在回憶起來,這是一種虐童的行為,Logo 太可怕了!如果現(xiàn)在你去看 Wikipedia 上的 Logo 詞條,你會說:“嗯,這很好,就像一種受到影響的 Lisp 方言……”但是這些都是錯的?!癓ogo 是一只什么都不會做的海龜,我說的海龜就是指大腦袋顯示器上的一個三角形,它什么都不會做。它的魔力就像你告訴它“box”(繪制正方形),它會告訴你“I don't know how to box”。
我記得三年級的時候,計算機是必修課。我還記得當時那種機械、冷漠的感覺,因為這個東西不知道如何繪制正方形,而我也不在乎你知不知道怎么繪制正方形。我第一次接觸計算機就是“我對這件事一點兒也不關(guān)心”。
2、Python、Ruby 還是 Lua?
從 90 年代到 2000 年代這段時間,我沒有做過任何編程。然而,在這段時間里發(fā)生了兩件至關(guān)重要的事:我成了《星際迷航:下一代》(Star Trek: The Next Generation)和《創(chuàng)世紀 VII》(Ultima 7)的超級粉絲。
Data 是我最喜歡的角色,因此我經(jīng)常思考 Soong 博士是如何做出來 Data 的,我們需要多長時間才能達到這樣的階段。當我玩《創(chuàng)世紀 VII》時,我曾有過并且現(xiàn)在仍然有同樣的感受:這個世界充滿了細節(jié),我會繼續(xù)玩這個游戲甚至只是為了和人們聊聊天、逛酒吧、看人們讀書。
所以,這段時間是讓我對編程再次感興趣的重要時期。編程不再是關(guān)于海龜和令人沮喪的比賽,而是科幻小說、電影、奇幻游戲、音樂以及其他一切我認為很酷、很有價值的一切。
那時候,我知道有一種叫做 C++ 的編程語言是用來開發(fā)游戲的,也許有一天我可以用它做出一個長得像 Android 機器人那樣的 Data 和《創(chuàng)世紀 VII》那樣的游戲。這讓我對 C++ 產(chǎn)生了一定的崇拜,但我已經(jīng)和編程無緣了。
我從加拿大搬到了日本,然后移居韓國。有一天,我遇到了一位來自多倫多的韓裔加拿大人,他在韓國當程序員。作為一名韓裔,他可以在沒有嚴格的雇主允許讓他保持簽證的情況下從事自由職業(yè),只需整天坐在星巴克用兩種語言進行編程:PHP 和 Python。我知道 PHP 這個名字,一直以為它只是一個電子公告板的名字。他跟我說應該試一試,因為可以很快學到新技能,也會對我的職業(yè)生涯有幫助。
他向我推薦了 Python,說應該先從這門語言開始。初次使用 Python 非常迷茫,只有一些小小的成功。我記得我讀過關(guān)于 Python 2 和 Python 3 的帖子,這些帖子都是說 Python 2 如何更好,Python 3 如何強迫每個人接受的。不管這意味著什么,我注意到一些熟悉的東西,比如 print,但熟悉的 $ 卻不見了,也沒有任何行號或 GOTO。在沒有主函數(shù)的情況下,我設(shè)法將一些東西放在一起,但我真的不知道,一個程序沒有行號和其他類似有用的東西該如何從頭到尾運行。
那時候的互聯(lián)網(wǎng)開始普及,人們在網(wǎng)上會對一種語言與另一種語言進行比較和討論。我注意到一種叫做 Ruby 的語言更像我的風格,所以我嘗試了一下。然后我又看到一種叫做 Lua 的語言,感覺它好像就是為我做的。我不知道如何使用,但我就相信 Lua 是我想要的。我認為 Lua 是最容易學習的編程語言,如果我能學好這門語言,就能學會所有其他編程語言。
幾個月后,我在星巴克又遇到了那個韓裔加拿大人,他問我 Python 學得怎么樣了。我告訴他,我覺得 Lua 應該是適合我的編程語言,但我說不出理由,顯然我還沒有掌握如何寫代碼。他最后評論說:“嗯,也許你沒有編程基因?!?/p>
不知為何,我卻固執(zhí)己見地認為自己有這方面的基因。我小學的時候就自學了 BASIC,我知道我有這個天賦。我只是需要真正喜歡上 Lua 并學好它……或者我應該學習 JavaScript?但大家都說你應該先學 Python,雖然我確實更喜歡 Ruby……結(jié)果我一直沒完沒了地糾結(jié)著,直到我再一次失去了興趣。
最后,我又回到加拿大生活了幾年,編程根本不在我的考慮范圍內(nèi)。2011 年到 2015 年期間,唯一與編程有關(guān)的事情只有一次,就是聽說隔壁辦公樓里都是寫 C++ 的人,他們?yōu)楣艿篮推渌茉错椖慷ㄖ?SAP,賺錢很多。
3、40 歲,第一次學會編程
2015 年,油價崩盤,Calagary 經(jīng)濟也隨之崩盤,我們整個團隊也解散了。拿到了豐厚的裁員補償后,我決定開始真正學習編寫代碼。
我學會了如何編寫函數(shù),如何創(chuàng)建對象等等,但是 self 關(guān)鍵字仍然讓人困惑,使用對象也是如此。再努力點就足以解決這些問題了,但我的老毛病又犯了:
“Python 在制作游戲方面很糟糕——它不會讓你做出任何像《創(chuàng)世紀 VII》這樣的東西。
“為什么不去試試 C++?不,那太難了!C# 怎么樣?讓我們試試吧?!?/p>
“哇,這真是太復雜了。盡管如此,C# 看起來是個不錯的選擇!等等,這是什么?F#?這門語言真的很酷。為什么所有的語言都不是這樣的呢?”
“F# 太棒了!為什么就沒有更多的人使用它呢?也許我應該好好學完 Python……”
“那就 Python 吧,又簡單又好用!除非是 JavaScript。這樣我就可以在瀏覽器上做任何事情了。也許我可以從一些基于瀏覽器的游戲開始?是時候試一試了……”
后來,裁員補償?shù)腻X快用光了,必須重新找工作了。找到工作后,我去市區(qū)和以前的同事們聚餐。那時遇到了我的一個 90 年代中期后就沒見過的老朋友,他在財務部門工作,問我在做什么工作,我告訴他我找到了一份新工作,下周開始上班?!芭?,我敢打賭是編程工作對不對!你一直都很擅長編程?!彼f。我回答說:“哦,不是編程……我已經(jīng)很久沒有真正做過這些事了。是做項目控制方面的?!?/p>
我對這次談話記憶猶新,因為這讓我思考為什么我從來沒有學過編程,而且無論從哪個角度來看,我年輕的時候似乎就注定要學編程。不過我當時忙于其他事情,沒有再去嘗試編程。
我在 2018 年回到韓國。第二年八月,我給當時工作的公司提出了辭呈,那時候我是一名文案。離正式辭職還有一個月的時間,我開始考慮學門技術(shù),也許這次真的要好好學習 Python 了。我可以每天花上幾個小時,到最后一天就會掌握得很好,然后再花上一個月左右的時間去找工作。這樣做了幾天后,我的老毛病又犯了?!昂冒?,你可以稍微看一下其他語言,”我自言自語地說,“但你必須把 Python 作為重點。”
那是我第一次嘗試 Rust 。我聽說它確實很精確和高效,但很難學,喜歡它的人會贊不絕口。我是在《X 分鐘速成 Y》(Learn X in Y Minutes)(譯者注:GitHub 上的一個項目,包括了很多的簡短的入門教程,比如算法、編程語言、開發(fā)工具等)和《Rust 語言游樂場》(the Rust playground)開始學習 Rust 的。
我開始學習 Rust 的時候,查了一下這門語言的用途,答案無一例外是,它幾乎什么都能做。所以我可以做出《創(chuàng)世紀 VII》這樣的東西,或者任何我想要的東西。更有趣的是,語言的細節(jié)和語言的底層東西并沒有讓我感到厭煩:我發(fā)現(xiàn)自己被吸引得更多了。隨著我對這門語言的深入了解,我有了很多懷舊之情。
我寫的所有東西都被直接轉(zhuǎn)換成二進制文件,我又可以看到計算機的內(nèi)部結(jié)構(gòu)了。大量的 Rust 討論都是關(guān)于如何優(yōu)化代碼的,我覺得這很有吸引力。但這門語言很高級也很安全,如果我全身心地投入,它幾乎可以使任何事情成為可能(至少在一種語言可以做到這一點的范圍內(nèi))——這就是為什么我的老毛病完全消失了。
誰知道這種代碼會獲得成功呢!
《Rust 編程》(Programming Rust)這本書對我來說,剛開始讀的時候太難了(一方面對 C++ 和 C 的內(nèi)容引用太多了),所以我是看了其他書后才回到這本書上,并最后喜歡上了它。
不過,對我?guī)椭畲蟮氖橇髅襟w視頻。第一個是 Javascript 開發(fā)者 Brooks Builds 制作的 70 多個視頻,他把自己看 Rust Book 的每一步都錄了下來??粗鴦e人努力學習一門你也在學習的語言,會讓你有種在精神上參與的感覺,這是其他類型的流媒體做不到的。“是 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++ 愛好者,自己做了一個類似《創(chuàng)世紀 V》的游戲,最近開始學 Rust。
半年后,我發(fā)現(xiàn)我有生以來第一次正確地學會了編程。然而并沒有什么秘訣:真的是單一的專注和勤用必應搜索的結(jié)果。
由于只有一個 Surface Go 筆記本,我一定要避開任何有太多外掛的東西。但我做了一些東西,比如朝鮮漢字轉(zhuǎn)換器(朝鮮漢字就是韓國使用的漢字),效果很好,最后我還整理了一本名為《用簡單的英語學習 Rust》(Learn Rust with easy English)的教材,目的是為了讓那些英語二級水平的使用者更容易學習這門語言,而不必用翻譯成他們國家語言的 Rust 相關(guān)書籍。
這個故事的寓意我想就是經(jīng)典的“找到自己喜歡的事情,然后一直做下去”。這對我來說并不新鮮,只是我花了那么長時間才找到適合自己的語言。它讓其他語言變得如此易讀易懂,包括 C 和 C++。
我想說明兩點:一、見異思遷和缺乏專注不一定是永遠的;二、每個人性格不同,最簡單的語言不一定是你最喜歡的語言。
Reddit 網(wǎng)站上的 /R/LanguageLearning 等版塊上經(jīng)常有這樣的討論:“我真的很想學(著名的 X 語言),但我是否應該繼續(xù)學更簡單的西班牙語 / 法語等,盡管我討厭它?”答案當然是否定的——只需學習你想學的語言就行了。這種建議更容易給出,因為自然語言并不像編程語言那樣與職業(yè)發(fā)展緊密相連。但是由于編程語言也有很多后繼的東西,同樣的建議也許是可以適用的。
Rust 肯定不是那種為了成為大團隊中的初級程序員而學習的語言,更不用是在 40 歲年紀的時候。但是,如果你是那種對編程屢次三番撿起后放下的人,也許找到合適的編程語言會讓你堅持下去。
作者介紹:
Dave MacLeod,加拿大人,居住韓國首爾。職業(yè)翻譯,精通韓文、日文、德文、法文、英文。業(yè)余 Rust 開發(fā)人員。
文章來源:InfoQ公眾號
相關(guān)新聞