一名程序员思考编程工艺的衰落日子

chosen1cwp 2024年01月16日 40次浏览

本文翻译自:编程技术的日渐衰落

编程在我看来一直是一个无限深广且丰富的领域。而现在,我发现自己想为它写一篇悼文。

在编程方面,人工智能仍然无法击败人类。但这只是时间问题。

我一直认为,就像我的父母确保我能读和写一样,我会确保我的孩子能为计算机编程。它是较新的艺术之一,但也是最重要的艺术之一,而且日益重要,涵盖了从电影制作到物理学的方方面面。流利的代码将提高我孩子的识字能力,并让他们保持就业能力。但是在我写这篇文章的时候,我的妻子怀上了我们的第一个孩子,大约三周后就要出生了。我专业地编码,但是,当孩子会打字时,编码作为一种有价值的技能可能已经从世界上消失了。

我第一次开始相信这一点是在去年夏天的一个星期五早上,当时我正在做一个小型的爱好项目。几个月前,我和我的朋友 Ben 决定完全用电脑制作一个时代风格的填字游戏。2018 年,我们在软件的帮助下制作了一个周六拼图,并惊讶于我们贡献的如此之少——只是在这里和那里应用我们的品味。现在,我们将尝试构建一个不需要人情味的填字游戏制作程序。

当我们过去接手这样的项目时,他们既有硬件组件,也有软件组件,Ben 的优势在于前者。我们曾经做过一个霓虹灯招牌,当地铁接近我们公寓附近的车站时,霓虹灯会发光。Ben 弯曲了玻璃并连接了变压器的电路板。我编写了代码来处理传输数据。Ben 有一些自己的专业编码经验,但那是短暂的、肤浅的,现在已经过时了大约 20 年;严肃的编码留给了我。不过,对于新的填字游戏项目,Ben 引入了第三方。他注册了 ChatGPT Plus 订阅,并使用 GPT-4 作为编码助手。

奇怪的事情开始发生。Ben 和我会讨论我们想要用于该项目的一些软件。然后,令人震惊的是,不久之后,本将亲自交付它。有一次,我们想要一个命令,可以从字典文件中打印一百行随机行。我想了几分钟,当思考失败时,我尝试谷歌搜索。我用我能收集到的东西做了一些错误的开始,当我做我的事情——编程——时,Ben 告诉 GPT-4 他想要什么,并得到了完美运行的代码。

好吧:像这样的命令是出了名的挑剔,反正每个人都会查一下。这不是真正的编程。几天后,Ben 谈到了如果有一个 iPhone 应用程序来对字典中的单词进行评分,那该有多好。但他不知道制作iPhone应用程序是多么痛苦。我试过几次,但从来没有超越过一半有效的东西。我发现苹果的编程环境令人望而却步。您不仅要学习一门新语言,还要学习用于编辑和运行代码的新程序;你必须学习一个“U.I.组件”的动物园,以及将它们拼接在一起的所有复杂方法;最后,您必须弄清楚如何打包应用程序。要学习的大量新事物似乎从来都不值得。第二天早上,我醒来时发现收件箱里有一个应用程序,它完全符合 Ben 所说的他想要的功能。它工作得很好,甚至有一个可爱的设计。本说他在几个小时内就完成了。GPT-4 完成了大部分繁重的工作。

到目前为止,大多数人都有过人工智能的经验。不是每个人都印象深刻。Ben 最近说,“直到我开始让它为我编写代码,我才开始真正尊重它。我怀疑那些天生持怀疑态度的非程序员,以及那些看到 ChatGPT 写出木头散文或虚假事实的人,仍然低估了正在发生的事情。

传统上需要一生才能掌握的知识和技能体系正在被一口吞下。对我来说,编码一直是一个无穷无尽的深邃和丰富的领域。现在我发现自己想为它写一篇悼词。我一直在想李世石。世石是世界上最好的围棋选手之一,也是韩国的民族英雄,但现在最出名的是2016年输给了一个名为AlphaGo的计算机程序。Sedol 参加了比赛,相信他会轻松击败 A.I.。在长达几天的比赛结束时,他为只赢了一场比赛而感到自豪。当很明显他将要输掉比赛时,塞多尔在新闻发布会上说,“我想为如此无能为力而道歉。三年后,他退休了。Sedol似乎被一个开始感到熟悉和紧迫的问题压得喘不过气来:我为之付出了这么多生命的东西会变成什么样子?

我第一次对电脑产生魔力是在我六岁的时候,九十年代初在蒙特利尔,和我的大哥一起玩真人快打。他告诉我一些“死亡”——可怕、诙谐的杀死对手的方式。我们俩都不知道如何施加它们。他在MS-DOS终端中拨通了FTP服务器(存储文件的地方),并输入了晦涩难懂的命令。很快,他就打印出了一页代码——游戏中每一次死亡的指令。我们回到地下室,互相炸开了对方的头。

我以为我哥哥是个黑客。像许多程序员一样,我梦想着闯入并控制远程系统。重点不是要造成混乱,而是要找到隐藏的地方,学习隐藏的东西。“我的罪是好奇心,”洛伊德·布兰肯希普(Loyd Blankenship)在1986年写的《黑客宣言》(The Hacker’s Manifesto)中写道。1995年电影《黑客》中我最喜欢的场景是新人戴德·墨菲(Dade Murphy)在地下俱乐部证明自己。有人开始从背包里掏出一沓彩虹般的电脑书,戴德从封面上认出了每一本:关于国际Unix环境的绿皮书;NSA信任网络上的红色;戴德在学校打开自动喷水灭火系统时会运用他的专业知识,并帮助纠正油轮的压载物——所有这些都是通过敲击键盘来实现的。教训是知识就是力量。

但是你如何真正学习黑客呢?我五年级的时候,我的家人已经在新泽西州定居了,当我上高中时,我去了肖特希尔斯购物中心的边界书店,买了Ivor Horton的《Beginning Visual C++》。它长达一千二百页——这是我的第一本魔术。像许多教程一样,一开始很容易,然后突然间,它就不行了。中世纪的学生将临时学习者失败的时刻称为“驴桥”。该术语的灵感来自欧几里得的《元素I》的命题5,这是本书中第一个真正困难的想法。那些过桥的人将继续掌握几何学;那些不这样做的人将继续涉足。“Beginning Visual C++”的第 4.3 节“动态内存分配”是我的桥梁。我没有穿越。

但我也没有放弃这个话题。我记得事情开始转机的那一刻。我当时在长途飞行中,带了一台四四方方的黑色笔记本电脑和一张装有Borland C++编译器的CD-ROM。编译器将您编写的代码转换为计算机可以运行的代码;我一直在努力让这个工作。按照惯例,每个程序员的第一个程序除了生成“Hello, world”之外什么都不做。当我尝试运行我的版本时,我只是收到愤怒的错误消息。每当我解决一个问题时,另一个问题就会出现。我读过《哈利·波特》的书,感觉自己好像拥有一把扫帚,但还没有学会让它飞起来的咒语。知道如果我这样做可能会有什么可能,我一心一意地坚持下去。我学到的是,编程并不是真正的知识或技能,而只是关于耐心,或者也许是痴迷。程序员是能够忍受无休止的乏味障碍的人。想象一下,用一种你几乎不会说的语言,通过电话向一个傻瓜解释如何组装家具,没有图片。想象一下,你得到的唯一回应是你提出了一个荒谬的建议,而整个事情都出了问题。然后,当你设法组装一些东西时,一切都会更甜蜜。我清楚地记得,我趴在飞机过道上,然后最后一次按Enter键。我坐了起来。这一次,计算机完成了我告诉它做的事情。“Hello, world”这几个字出现在我的光标上方,现在是计算机自己的声音。似乎有一种智慧已经醒来,向我介绍了自己。

我们大多数人从未成为《黑客》中描述的那种黑客。用程序员的话来说,“破解”只是修补——通过代码表达独创性。我从未正式学习过编程;我只是不停地胡闹,让电脑做一些有用或令人愉快的小事。在我大学一年级的时候,我知道我会在2006年大师赛第三轮比赛中上路,当时老虎伍兹在球场上移动,我想知道实时发生了什么。因此,我制作了一个程序,在 pgatour.com 上刮擦排行榜,并在他抓到小鸟或柏忌时给我发短信。后来,在英语课上读完《尤利西斯》后,我写了一个程序,从书中随机抽取句子,数出它们的音节,并组合出俳句——这是一种比现在从聊天机器人那里得到的更原始的语言反刍,但我认为,它仍然能够写出真正的诗歌:

I’ll flay him alive 我会把他活活剥皮
Uncertainly he waited 他不确定地等待着
Heavy of the past 沉重的过去

我开始认真对待编码。我主动提出为一个朋友的创业公司做编程。我开始了解到,计算机的世界是广阔的,但几乎是地质组织的,就好像沉积在层中一样。从Web浏览器到晶体管,每个子区域或系统都建立在其他一些较旧的子区域或系统之上,这些层密集但清晰可辨。一个人挖掘得越多,就越能发展出赛车手杰基·斯图尔特(Jackie Stewart)所说的“机械同情”,即对机器的优势和局限性的感觉,以及人们可以做什么。

在我朋友的陪伴下,我感到我的机械同情心在发展。在我大二的时候,我和一个朋友一起看《危险边缘》,当时他建议我制作一个可玩的节目版本。我想了几个小时,然后非常失望地决定,这超出了我的范围。但是当我大三的时候,这个想法再次出现时,我看到了解决它的方法。我现在对这台机器能做什么有了更好的了解。接下来的 14 个小时里,我花了 14 个小时来构建这款游戏。几周之内,玩“Jimbo Jeopardy!”就成了我朋友的常规活动。这次经历是深刻的。我能理解为什么人们把自己的生命倾注在手工艺上:没有什么比看着别人喜欢你制作的东西更棒的了。

在这一切之中,我完全“追纸”,开始无视我的成绩。我贪婪地工作,只是没有在我的课程作业上。一天晚上,我在地下室的计算机实验室里拿了六台机器来并行运行一个程序。我把打印出来的满是数字的打印件铺在地板上,思考着一种寻路算法。代价是我真正经历了那个反复出现的噩梦,你出现在期末考试中,对材料一无所知。(我的是数学系的实分析。2009年,在几十年来最严重的金融危机期间,我以2.9的GPA毕业。

然而,我很容易就得到了我的第一份全职工作。我有程序员的工作经验;没有人问我的成绩。对于年轻的程序员来说,这是繁荣时期。公司正在卷入争夺顶级程序员的竞标战。对有经验的程序员的征集是如此激进,以至于他们抱怨“招聘人员垃圾邮件”。大学计算机科学课程的受欢迎程度开始爆炸式增长。(我的学位是经济学。编码“新兵训练营”如雨后春笋般涌现,可以令人信服地声称在不到一年的时间内将初学者变成高薪程序员。在我二十出头的第一次面试中,首席执行官问我认为我应该得到多少报酬。我敢说出一个让我略感尴尬的数字。他当场起草了一份合同,报价高出10%。“软件工程师”的技能被吹嘘。在我工作的一家公司,有人因为使用 Slack 的前身 HipChat 向我的一位同事提问而惹上了麻烦。“永远不要直接和工程师聊天,”他被告知。我们太重要了。

这是一个利率接近零、科技行业异常增长的时代。建立了某些规范。像谷歌这样的公司告诉业界,程序员应该有免费的浓缩咖啡和热食,世界一流的医疗保健和育儿假,现场健身房和自行车室,休闲着装要求,以及“百分之二十的时间”,这意味着他们可以每周花一天时间做任何他们喜欢的事情。他们的技能被认为是如此重要和微妙,以至于围绕这项工作产生了一种迷信。例如,估计编码任务可能需要多长时间被认为是愚蠢的,因为程序员随时都可能翻过一块石头并发现一堆错误。最后期限是诅咒。如果交付的压力变得太大,程序员只需要说出“倦怠”这个词就可以购买几个月的时间。

从一开始,我就感觉到这一切有些不对劲。我们所做的真的如此珍贵吗?这种繁荣能持续多久?在我十几岁的时候,我做过一点网页设计,当时,这项工作很受欢迎,也很受推崇。你可以为一个需要一个周末的项目赚取数千美元。但随之而来的是像Squarespace这样的工具,它允许比萨店老板和自由艺术家只需点击一下就可以制作自己的网站。对于专业程序员来说,一批高薪、相对低工作量的工作消失了。

程序员社区对这些发展的反应是,是的,你必须不断提高你的技能。学习困难、晦涩难懂的东西。软件工程师作为一个物种,喜欢自动化。不可避免地,他们中的佼佼者构建的工具使其他类型的工作过时。正是这种直觉解释了为什么我们得到了如此良好的照顾:代码具有巨大的影响力。一个软件可能会影响数百万人的工作。当然,这有时会使程序员自己流离失所。我们把这些进步看作是一股潮水,正在侵蚀我们的赤脚。只要我们不断学习,我们就会保持干涸。合理的建议——直到海啸来临。

当我们第一次被允许在工作中使用人工智能聊天机器人来获得编程帮助时,我刻意避免使用它们。我希望我的同事们也会这样做。但很快,当我走到办公桌前时,我开始在程序员的屏幕上看到人工智能聊天会话的明显颜色——呼叫和响应的斑马图案。一个常见的克制是,这些工具使你的工作效率更高;在某些情况下,它们可以帮助您解决问题的速度提高十倍。

我不确定我是否想要那个。我喜欢编程的行为,我喜欢感觉自己有用。我熟悉的工具,比如我用来格式化和浏览代码的文本编辑器,服务于两端。它们增强了我的手艺实践——尽管它们让我能够更快地交付工作,但我仍然觉得我应该得到这个荣誉。但正如人们所描述的那样,人工智能似乎有所不同。它提供了很多帮助。我担心这会剥夺我做谜题的乐趣和成为解决谜题的人的满足感。我可以无限地工作,而我所要展示的就是产品本身。

大多数程序员的实际工作成果很少令人兴奋。事实上,它往往几乎是滑稽的单调乏味。几个月前,我从办公室回到家,告诉我的妻子,我度过了多么美好的一天,与一个特别有趣的问题摔跤。我正在开发一个生成表格的程序,有人想添加一个跨越多列的标题——这是我们编写的自定义布局引擎不支持的。这项工作很紧急:这些表格被用于重要文件,被重要人物想要。于是,我把自己关在一个房间里,度过了下午的大部分时间。有很多可爱的子问题:我应该如何让布局引擎的用户传达他们想要一个跨列标题?他们的代码应该是什么样子的?还有一些繁琐的细节,如果被忽略,会导致错误。例如,如果标题应该跨越的一列因为没有任何数据而被删除怎么办?我知道这是美好的一天,因为我必须拿出笔和本子——我正在绘制可能的场景,检查并仔细检查我的逻辑。

但是鸟瞰那天发生的事情?表有一个新标题。很难想象还有什么比这更平凡的了。对我来说,乐趣完全在于过程,而不是产品。如果只需要三分钟的 ChatGPT 会话,这个过程会变成什么样子?是的,作为程序员,我们的工作除了字面上写代码之外还涉及很多事情,例如指导初级员工和在高层次上设计系统。但编码一直是它的根源。在我的整个职业生涯中,我被采访并被选中,正是因为我有能力解决繁琐的编程难题。突然间,这种能力变得不那么重要了。

我从 Ben 那里收集了很多东西,他一直告诉我他在 GPT-4 上取得的巨大成功。事实证明,它不仅擅长繁琐的事情,而且还具有高级工程师的素质:从深厚的知识渊博中,它可以提出解决问题的方法。在一个项目中,Ben 将一个小扬声器和一个红色的 L.E.D. 灯泡连接到查尔斯国王肖像的框架中,这盏灯代表着他王冠上的宝石;这个想法是,当您在随附的网站上输入消息时,扬声器会播放一首曲子,并且灯光会以摩尔斯电码闪烁消息。(这是送给一位古怪的英国侨民的礼物。对设备进行编程以获取新消息是 Ben 的功劳;它似乎不仅需要他所使用的微控制器的专业知识,还需要 Firebase(存储消息的后端服务器技术)的专业知识。Ben 向我征求意见,我嘟囔了几种可能性;事实上,我不确定他想要的是否可能。然后他问GPT-4。它告诉 Ben,Firebase 具有使项目变得更加简单的功能。它就是这样,这里有一些与微控制器兼容的代码。

我自己害怕使用 GPT-4——并且对每月向 OpenAI 支付 20 美元的前景感到有些不干净——尽管如此,我还是开始通过 Ben 探索它的功能。我们会坐下来做我们的填字游戏项目,我会说,“你为什么不试着用这种方式提示它呢?他会把键盘给我。“不,你开车,”我会说。我们一起对人工智能能做什么产生了一种感觉。Ben 在这方面的经验比我多,他似乎能够一举从中获得更多。正如他后来所说,他自己的神经网络已经开始与 GPT-4 保持一致。我会说他已经获得了机械的同情。有一次,我发现一项特别令人惊讶的壮举,他让人工智能为他制作了一款贪吃蛇游戏,就像诺基亚旧手机上的游戏一样。但后来,在与 GPT-4 进行了简短的交流后,他让它修改了游戏,这样当你输了时,它会告诉你你偏离了最有效的路线有多远。机器人花了大约十秒钟才实现这一点。坦率地说,我不确定自己能不能完成这项任务。

在几十年来一直由人工智能主导的国际象棋中,玩家唯一的希望就是与机器人配对。这样的半人半人工智能。被称为半人马的团队可能仍然能够击败最好的人类和最好的人工智能引擎。编程还没有走上国际象棋的道路。但是半人马已经到了。就目前而言,GPT-4 本身就是一个比我更糟糕的程序员。本的情况要糟糕得多。但是 Ben 加 GPT-4 是一件危险的事情。

没过多久,我就屈服了。我在工作中制作了一个小搜索工具,并想突出显示用户查询中与结果匹配的部分。但是我用单词来拆分查询,使事情变得更加复杂。我发现自己缺乏耐心。我开始考虑 GPT-4。也许与其花一个下午的时间编程,不如花一些时间“提示”,或者与人工智能进行对话。

在1978年一篇题为“论’自然语言编程’的愚蠢性”的文章中,计算机科学家Edsger W. Dijkstra认为,如果你不是用C++或Python这样的专业语言,而是用你的母语来指导计算机,你就会拒绝使计算机有用的精确性。他写道,正式的编程语言是“一种非常有效的工具,可以排除各种废话,当我们使用母语时,这些废话几乎是不可能避免的。Dijkstra 的论点在编程界成为不言而喻的道理。2014年,当这篇文章在Reddit上流传时,一位顶级评论者写道:“我不确定以下哪一项最可怕。这个想法是多么微不足道“,或者”许多人仍然不知道“这一事实。

当我第一次使用 GPT-4 时,我可以看到 Dijkstra 在说什么。你不能只是对人工智能说,“解决我的问题。那一天可能会到来,但就目前而言,它更像是一种你必须学会演奏的乐器。你必须仔细指定你想要什么,就像和初学者交谈一样。在搜索突出显示问题中,我发现自己要求 GPT-4 一次做太多事情,看着它失败,然后重新开始。每一次,我的提示都变得不那么雄心勃勃了。在谈话结束时,我不是在谈论搜索或突出显示;我把问题分解成具体的、抽象的、明确的子问题,这些子问题加在一起,会给我想要的东西。

找到人工智能的水平后,我几乎立刻觉得我的工作生活已经发生了变化。我所到之处都可以看到 GPT-4 大小的洞;我终于明白了,为什么办公室周围的屏幕上总是充斥着聊天会话,以及 Ben 是如何变得如此高效的。我敞开心扉,更频繁地尝试。

我回到了填字游戏项目。我们的拼图生成器以丑陋的文本格式打印其输出,并带有类似 “s”“c”“a”“r”“““k”“u”“n”“i”“s””” “a”“r”“e”“a” .我想把这样的输出变成一个漂亮的网页,让我可以浏览网格中的单词,一目了然地显示评分信息。但我知道这项任务会很棘手:每个字母都必须标上它所属的单词,包括横字和字样。这是一个详细的问题,很容易消耗掉一个晚上的大部分时间。随着宝宝的到来,我几乎没有空闲的夜晚。于是我开始与 GPT-4 对话。需要一些来回;有一次,我不得不自己阅读几行代码才能理解它在做什么。但我几乎没有做过我曾经认为是编码构成的那种想法。我没有考虑数字、模式或循环;我没有用我的头脑来模拟计算机的活动。正如另一位程序员杰弗里·利特(Geoffrey Litt)在经历过类似经历后所写的那样,“我从来没有动用过我详细的程序员大脑。那我做了什么?

也许促使李世石退出围棋比赛的原因是,这种感觉已经永远被贬低了。当我开始编程时,这是因为计算机感觉像是一种魔术。这台机器赋予了你力量,但需要你研究它神秘的秘密——学习一种咒语。这需要一种特殊的思维方式。我觉得自己被选中了。我全身心地投入到乏味中,投入到仔细思考和晦涩知识的积累中。然后,有一天,有可能在没有思考和知识的情况下实现许多相同的目标。从某种角度来看,这会使一个人的很多工作生活看起来像是在浪费时间。

但每当我想到Sedol时,我都会想到国际象棋。大约三十年前,当机器征服了这个游戏之后,人们担心没有理由再玩它了。然而,国际象棋从未像现在这样流行——人工智能让比赛变得生动起来。我的一个朋友最近捡到了它。在任何时候,他都可以接触到一位人工智能教练,这位教练可以在他能力的边缘为他提供国际象棋问题,并且可以在他输掉一场比赛后告诉他他到底哪里出了问题。同时,在最高层次上,大师们研究移动计算机建议,就好像阅读神灵的平板电脑一样。学习国际象棋从未如此简单;研究其最深的秘密从未如此令人兴奋。

计算尚未被克服。GPT-4 令人印象深刻,但外行人无法像程序员那样使用它。我仍然对我的职业感到安全。事实上,我感到比以前更有安全感了。随着软件的制作变得更容易,它会激增;程序员将负责其设计、配置和维护。虽然我一直觉得编程中繁琐的部分最能让人平静,也是最重要的,但我并不特别擅长它们。我失败了许多经典的编码面试测试,就像你在大型科技公司找到的那种。我比较擅长的事情是知道什么是值得构建的,用户喜欢什么,如何在技术和人性化方面进行沟通。我的一个朋友把这个人工智能时刻称为“马马虎虎的程序员的复仇”。随着编码本身开始变得不那么重要,也许更软的技能会大放异彩。

这仍然留下了教我未出生的孩子什么的问题。我猜想,当我的孩子长大成人时,我们会想到“程序员”,就像我们现在回顾“计算机”一样,当时这句话指的是一个手工计算的人。通过自己输入C++或Python进行编程最终可能看起来就像在打孔卡上发出二进制指令一样荒谬。Dijkstra 会感到震惊,但让计算机准确地做你想做的事可能会变成一个礼貌地询问的问题。

因此,也许要教的东西不是一种技能,而是一种精神。我有时会想,如果我出生在不同的时代,我可能会做什么。农业时代的编码员可能对水车和农作物品种感到困惑;在牛顿时代,他们可能痴迷于玻璃、染料和计时。我最近在读一本关于神经网络的口述历史,令我震惊的是,在接受采访的人中,有多少人——出生于十九世纪三十年代左右的人——在他们很小的时候就玩过收音机。也许下一批人会在他们父母曾经视为黑匣子的人工智能的内脏中度过深夜。我不应该担心编码的时代正在结束。黑客攻击是永恒的。