作者:Dave MacLeod
翻译 | Sambodhi
规划 | 蔡芳芳
每个程序员都有自己的“真正”编程语言。
虽然我小学时是个电脑迷,似乎注定要进入 IT 行业,但我失败了很多次。今年,当我步入四十岁时,我终于学会了编程。也许我的经历会告诉你,只要你想,什么时候开始都不晚。有时,你只需要找到适合你的语言。
“我不想成为 Logo 的明星程序员,然后被派去参加比赛”
我的编程生涯始于 1980 年代,当时我拥有了第一台计算机。那是一台叫做 ADAM 的怪兽计算机,它长这样:
它是个人电脑、ColecoVision 游戏系统和打字机的混合体:两个磁带机取代了磁盘驱动器/磁带盒,电视取代了显示器,还有一台有趣的打印机,带有一个开关,可以将其变成一台完整的打字机。许多其他 ADAM 计算机用户都有实际的磁盘驱动器,但这个没有,磁带需要很长时间才能加载。
我们刚拿到它的时候,我父亲在地下室放了很多磁带,但我不知道为什么里面有这么多游戏。我最喜欢的一款游戏叫做《Gateway to Apshai》,是一款 roguelike 游戏。后来他解释说,他是用 Forth 写的。以下是他的话:
当我们拿到 Coleco Adam 计算机时,它有一个 Zilog Z80 CPU,所以我使用了 Forth。如果你还记得的话,我从美国订购了一盘磁带(用于磁带驱动器),里面有一些黑客程序和一本名为《黑客指南:亚当》的书,这让我们可以将 ColecoVision 游戏下载到空白磁带上,所以我们有很多游戏。我自己没有编写任何程序,但磁带上的程序附带源代码,因此你可以理解其中的逻辑。在某些情况下,我必须调整参数并重新保存,以优化需要破解的任何程序。这很有趣,非常有趣。
重点是他向我展示了一种名为 BASIC 的语言,而我认为 BASIC 是世界上唯一的编程语言。我开始学习这种编程语言,然后读了《银山之谜》和《猎杀乌姆普斯》等书,很快学会了编程。我开始根据史蒂夫·杰克逊的书《巫术!》制作自己的小型 RPG!
它们最终看起来像下面代码的放大版,抄袭自 Wikipedia,包含大量 RAND 掷骰子和 GOTO 调用。随着时间的推移,我不得不添加越来越精细的行号(例如在 60 和 70 之间添加 65,然后添加 64,然后当我没有空间时,我不得不重新编号整个代码)。
所有这些代码都是我自己写的。当时,你无法在网上搜索示例代码,所以每个人都认为我注定要从事 IT 行业。
同时,我们在学校里有一个叫 Logo 的东西。它并不那么有趣,因为你所要做的就是让一只乌龟在屏幕上画出形状。你可以给它一些函数,比如 FD 90、RT 90,然后是 REPEAT 4,它会重复四次并画出一个正方形。画一个圆需要很长时间,因为你必须给出 REPEAT 360 并看着乌龟重复 360 次才能画出一个圆。所以有时你可以稍微作弊,做 REPEAR 180,让乌龟一次向右移动 2 度,计算机最终会画出几乎相同的东西游戏开发,但它只需要进行 180 次计算。
为了使它更有趣,你可以制作一个像下面这样的形状,告诉它画一个圆圈,然后告诉它向右转一点并开始下一个圆圈。
直到我看到 Bryan Cantrill 的这段视频,我几乎完全忘记了自己使用过 Logo。Cantrill 和我差不多大,小时候也学过 Logo。我们有过类似的经历:我们完全忘了如何让乌龟画圆,但他很幸运地遇到了 C 语言并真正开始编程,而我没有。这是我自己的错。
在 20 世纪 80 年代的计算机科学课上,我们都坐在卡尔加里 Ranchlands 社区学校的一间没有窗户的房间里,让乌龟画圆圈。Logo 太容易学习了,我和其他几个人觉得它甚至不像是一种编程语言。老师们注意到了这一点,说即将举行一次 Logo 比赛,我们应该参加。这应该是一场全市性的比赛,也许是省级比赛。
比赛持续了两三天,最后一天我们终于做出了一个产品,得到了评委的认可,有机会获奖。队友们比我投入得多,我开始对比赛缺乏兴趣。我以为我们能拿到第四名或第五名就好了,但队友们并不满意。所以比赛结束后,我松了一口气。我知道我不想编程了,也不想赢得比赛后被派去以 Logo 明星程序员的身份参加其他比赛。
我当时的人生目标是让小学时暗恋的女孩喜欢我。而且,当时人们认为懂电脑的人都是书呆子。所以那时我会在公共场合与电脑保持一定的距离,以保持这种形象:是的,我擅长电脑,但我不是电脑极客之类的。
在观看了两三天的 Logo-Proficient 比赛和他们的表演后,我们获得了一件 T 恤和一个瓶子作为参赛奖品,那是我最后一次使用 Logo。与此同时,我继续使用 BASIC 一段时间,直到 90 年代初,当我们用 386 替换 ADAM 计算机时,BASIC 被我完全忘记了,我不想花钱买一本关于编程的书。
Bryan Cantrill 第一次使用 Logo 的经历是这样的:
我想我使用的第一门语言是 Logo,现在回想起来,那是一种虐待儿童的行为,Logo 太糟糕了!如果你现在看看 Wikipedia 中 Logo 的条目,你会说,“嗯,它很好,就像 Lisp 的一种矫揉造作的方言......”但那完全是错的。“Logo 是一只什么都不做的乌龟,我说的乌龟是指大头显示器上的三角形,它什么都不做。它的魔力就像如果你告诉它“装箱”(画一个正方形),它会告诉你“我不知道如何装箱”。
我记得在三年级时,计算机是必修课。我记得当时感觉很机械、很冷漠,因为这个东西不知道怎么画正方形,而我不在乎你是否知道如何画正方形。我对计算机的第一次体验是“我根本不在乎这个”。
Python、Ruby 还是 Lua?
在 90 年代和 21 世纪我没有做过任何编程工作,但那段时间发生了两件重要的事情:我成为了《星际迷航:下一代》和《创世纪 7》的忠实粉丝。
Data 是我最喜欢的角色,所以我经常会想宋博士是怎么创造 Data 的,我们要花多长时间才能走到这一步。当我玩 Ultima VII 时,我曾经有过并且仍然有同样的感觉:这个世界充满了细节,我会继续玩这个游戏,即使只是为了和人们交谈、去酒吧、看人们读书。
所以,这段时间对我来说是再次对编程产生兴趣的重要时刻。编程不再是关于乌龟和令人沮丧的比赛,而是关于科幻小说、电影、奇幻游戏、音乐,以及我认为很酷、很有价值的一切。
那时我知道有一种编程语言叫 C++,是用来开发游戏的。也许有一天我能用它做一个像安卓机器人一样的 Data,做一个像 Ultima 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 年,油价暴跌,卡拉加里经济也随之崩盘,我们整个团队解散了。在收到一笔丰厚的裁员补偿金后,我决定开始真正学习编程。
我学会了如何编写函数、如何创建对象等,但 self 关键字仍然令人困惑,使用对象也是如此。再多花点功夫就足以解决这些问题,但后来我又陷入了旧习惯:
后来,裁员补偿金快用完了,我不得不找一份新工作。找到工作后,我到城里和以前的同事们一起吃饭。那时,我遇到了一个 90 年代中期没见过的老朋友。他在财务部工作,问我在做什么。我告诉他我找到了一份新工作,下周就去上班。“哦,我敢打赌是编程,对吧!你一直很擅长编程。”他说。我回答说:“哦,不是编程……我真的很久没做过这些了。我做项目控制。”
我清楚地记得这次谈话,因为它让我思考为什么我从来没有学过编程,当我年轻的时候,从各方面来看,我似乎注定要学习编程,但当时我忙于其他事情,从未再次尝试编程。
2018 年我回到了韩国。第二年 8 月,我从当时就职的公司辞职,当时我是一名文案。在正式辞职前还有一个月的时间,我开始考虑学习一门技术,也许这次我真的应该学习 Python。我可以每天花几个小时,到最后一天我就掌握得很好了,然后花大约一个月的时间找工作。这样过了几天,我的老习惯又回来了。“好吧,你可以稍微看看其他语言,”我对自己说,“但你必须专注于 Python。”
那是我第一次尝试 Rust。我听说它非常精确和高效,但很难学,喜欢它的人会对它赞不绝口。我开始用“在 Y 分钟内学习 X”和 Rust 操场学习 Rust。
当我开始学习 Rust 时,我查了一下这门语言的用途,答案无一例外,那就是它几乎可以做任何事情。所以我可以制作像 Ultima VII 这样的游戏,或者任何我想要的东西。更有趣的是,这门语言的细节和底层的东西并没有让我感到无聊:我发现自己被它吸引了。随着我对这门语言的深入了解,我有很多怀旧之情。
我编写的所有内容都直接转换为二进制,我可以再次看到计算机的内部结构。Rust 的很多讨论都是关于如何优化代码,我觉得这很有趣。但这种语言是高级且安全的,如果我专心致志,它几乎可以让任何事情成为可能(至少就语言所能做到的而言)——这就是为什么我的旧问题完全消失的原因。
谁知道这样的代码会成功!
一开始,我觉得《Rust 编程》太难读了(首先,它引用了太多 C++ 和 C 的内容),所以在阅读了其他书之后,我又回过头来读这本书,并最终喜欢上了它。
不过,对我帮助最大的还是流媒体视频。第一个是 Javascript 开发人员 Brooks Builds 制作的 70 多个视频合集,他一步步记录了自己学习 Rust Book 的过程。看着别人努力学习你也在学习的语言,会让你有一种其他类型的流媒体所没有的精神参与感。“这是 mit einer deutschen Familie,而不是 mit einem deutsche Familie!”或“只需使用 into_iter() 就可以编译!”这样的时刻让你感觉你真的在和别人一起学习(事实上,你确实在学习)。
从那时起,我开始关注 Brian Myers,他也主要通过 Bing 搜索学习 Rust。Jon Gjengset 我留到最后(在 Crust of Rust 教授更简单的东西之前),但也观看了 Hello Rust、Ryan Levick、Doug Milford、Tensor Programming、这个 Rust 速成课程、dcode 的 Rust 视频,以及所有这些视频(不是按顺序全部观看)。我喜欢的另一个流是 rhymu8354,他是一位 25 岁的 C++ 爱好者,制作了一款类似于 Ultima V 的游戏,最近开始学习 Rust。
六个月后,我意识到自己有生以来第一次学会了编程。不过,这没什么秘诀:这其实是专心致志和频繁使用 Bing 搜索的结果。
由于我只有一台 Surface Go 笔记本电脑,所以我确保远离带有太多插件的东西。但我做了一些东西,比如 Hanja 转换器(Hanja 是韩国使用的中文字符),效果很好,最后我整理了一本名为《用简单的英语学习 Rust》的书,旨在让英语水平为二级的人更容易学习这门语言,而不必使用翻译成他们语言的 Rust 书籍。
我想这个故事的寓意是经典的“找到你喜欢的事情并坚持做下去”。这对我来说并不新鲜,只是我花了很长时间才找到适合我的语言。它使其他语言变得如此易读和易懂,包括 C 和 C++。
我想说两点:第一,善变和注意力不集中并不一定是永久的;第二,每个人的性格都不一样,最简单的语言也未必是你最喜欢的语言。
在 Reddit 论坛(如 /r/LanguageLearning)上经常会有这样的讨论:“我真的很想学习(著名的语言 X),但我是否应该继续学习更简单的西班牙语/法语/等,尽管我讨厌它?”答案当然是否定的——只学习你想学的语言。这个建议更容易给出,因为自然语言与职业发展的关系不像编程语言那样紧密。但由于编程语言也有很多后继者,同样的建议可能适用。
Rust 绝对不是你为了成为大型团队的初级程序员而学习的语言,更不用说在 40 岁时了。但是,如果你是那种拿起编程又一次放下的人,也许找到合适的编程语言会让你继续前进。
关于作者:
Dave MacLeod 是居住在韩国首尔的加拿大人。他是一名专业翻译,精通韩语、日语、德语、法语和英语。他也是一名业余 Rust 开发者。
原文链接:
关注我并转发本文,私信我“获取资讯”,即可免费领取InfoQ价值4999元的迷你书。点击文末“了解更多”,即可跳转至InfoQ官网获取最新资讯~