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