1“不想成为 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 行,最初当我用完空间就得给整段代码从新编号)。
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 次计算即可。
为了减少趣味性,你能够像上面这样做一个形态,通知它做一个圆,而后通知它向右转一点,而后开始下一个圆。
在看到 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》时,我曾有过并且当初依然有同样的感触:这个世界充斥了细节,我会持续玩这个游戏甚至只是为了和人们聊聊天、逛酒吧、看人们读书。
所以,这段时间是让我对编程再次感兴趣的重要期间。编程不再是对于海龟和令人丧气的较量,而是科幻小说、电影、奇幻游戏、音乐以及其余所有我认为很酷、很有价值的所有。
那时候,我晓得有一种叫做 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 探讨都是对于如何优化代码的,我感觉这很有吸引力。但这门语言很高级也很平安,如果我全身心地投入,它简直能够使任何事件成为可能(至多在一种语言能够做到这一点的范畴内)——这就是为什么我的老毛病齐全隐没了。
谁晓得这种代码会获得成功呢!
《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 岁年纪的时候。然而,如果你是那种对编程屡次三番捡起后放下的人,兴许找到适合的编程语言会让你坚持下去。
图片起源:http://www.laoshoucun.com/ 神途