就像我的父母坚信我能读书写字一样,我理所当然地认为,我的孩子也一定能像我一样编程。编程是一门新兴艺术,也是一门基本技艺,而且正日益变得重要。熟练掌握编程是对孩子读写能力有益的补充,还能让他们保持就业竞争力。在我写下这些文字时,我的妻子怀着我们的第一个孩子,离预产期大约还有三周。我是一名专业的程序员,但等到孩子能够打字的时候,编程作为一项有价值的技能可能已经从这个世界上淡出了。
我第一次冒出这种想法是在今年夏天的一个星期五的早晨,当时我正在开发一个小型的业余项目。几个月前,我和朋友 Ben 决定尝试完全让计算机自己制作一款类似“纽约时报”风格的填字游戏。2018 年,我们曾借助软件制作过一款字谜游戏,我们做的事情很少——只是在某些地方根据需求做了少量改动。现在,我们尝试开发一个不需要人工干预的填字游戏生成程序。
在过去,开发类似的项目既涉及硬件部分,也涉及软件部分,Ben 更擅长硬件。我们曾经做过一款霓虹灯牌,当地铁接近我们公寓附近的站点时会发光。Ben 负责制作玻璃灯管,并连接了变压器的电路板,我则编写了处理交通数据的代码。Ben 也有过一些编程经历,但很短暂,而且已经过去了二十多年,所以主要的编程工作留给了我。不过,对于新的填字游戏项目,Ben 引入了第三个“参与者”。他订阅了 ChatGPT Plus,并使用 GPT-4 作为编程助手。
然后,一些奇怪的事情发生了。我和 Ben 讨论了项目需要用到的一些程序。然后,很快地,Ben 就弄好了。有一次,我们需要一个能够根据字典文件打印一百行随机内容的命令。我思考了一会儿没有思路,于是尝试使用谷歌搜索。我尝试了一些我能够找到的方法,而正当我开始写代码时,Ben 把我们的想法告诉了 GPT-4,并得到了完美可运行的代码。
像这样的命令是出了名的繁琐,应该所有人都会去查,所以算不上是真正的编程。几天后,Ben 说想要开发一款 可以对字典中的单词进行评分的 iPhone 应用,但他不知道开发 iPhone 应用有多痛苦。我曾经尝试过几次,都半途而废。我觉得苹果的开发环境很难入门,不仅需要学习一门新的编程语言,还需要熟悉新的编辑和运行代码的程序。你还要学习各种“用户界面组件”和将它们组合在一起的方法,最后,你还需要弄清楚如何打包应用程序。要学习的东西堆积如山,似乎不值得这么去做。但是,第二天早上,我的收件箱里出现了一个完全符合 Ben 要求的应用程序。它可以完美地运行,还采用了非常可爱的设计。Ben 说这是他花几个小时做出来的,GPT-4 承担了大部分繁琐的工作。
如今,大多数人都有过使用 AI 的经历,但并非所有人都对它感到印象深刻。Ben 最近才说:“直到我开始让它帮我写代码,我才真正对它肃然起敬。”我怀疑那些本来就生性多疑的人,那些看着 ChatGPT 输出生硬文字或虚假事实的人,他们仍然会低估正在发生的一切。
原本需要费劲一生才能掌握的知识和技能,现在一口就能被吞下。对于我来说,编程一直是一个无穷无尽、丰富多彩的领域。现在,我发现自己想要为它写一篇挽歌。
我想起了李世石。李世石曾是世界顶级围棋选手,也是韩国的民族英雄,但现在最出名的是他在 2016 年输给了一个叫作 AlphaGo 的计算机程序。当初,在开始比赛时李世石相信自己能够轻松击败人工智能。然而,在经过了长达数天的比赛之后,他输了。李世石在新闻发布会上说:“我为自己的无能感到抱歉。”三年后,他退役了。似乎有一个问题在困扰着李世石:这个让他费劲了大半生的东西会变成什么?
我对计算机的痴迷始于六岁那一年。那是在九十年代早期的蒙特利尔,当时我和哥哥在玩《真人快打》游戏。他告诉了我一些“必杀技”——一些可怕而机智地击败对手的方法,但我们都不知道如何施展这些技能。他在 MS-DOS 终端拨号连接了一台 FTP 服务器,然后输入了一些晦涩的命令。很快,他打印出了一页代码——在游戏中使用的必杀技指令。我们回到地下室,开始互相爆头痛击。
我曾经以为我的哥哥是一名黑客。和许多程序员一样,我也曾经梦想着入侵和控制远程系统,重点不是制造混乱,而是找到隐蔽的东西。1986 年,Loyd Blankenship 在《黑客宣言》一文中写道:“我的罪过就是太过好奇了。”1995 年的电影《骇客天团》中有一个场景,Dade Murphy 在地下俱乐部证明自己的实力:有人从背包里掏出一本本五颜六色的电脑书,Dade 从封面上认出了每一本:绿色的关于国际 Unix 环境的书,红色的关于 N.S.A.可信网络的书,还有一本封面上画着身着粉红衬衫的家伙在玩 IBM 个人电脑。Dade 把他的专业知识用在了学校的喷水灭火系统上,还帮着清理油轮的压舱物——所有这些都是通过敲击键盘来完成的。这个故事告诉我们知识就是力量。
但到底要怎样才能学会黑客技术呢?在我上五年级时,我们家在新泽西定居。在上高中时,我去了肖特山购物中心的 Borders 书店,买了 Ivor Horton 写的《Visual C++入门》(Beginning Visual C++)。它长达 1200 页——我的第一本魔法书。就像许多其他教程一样,它一开始很简单,然后,突然,它就不那么简单了。中世纪的学生把初学者遭遇学习失败的时刻称为“驴桥”(Bridge of Asses,或理解为“笨人难过的桥”)时刻。这个术语源于《欧几里得几何原本》第一卷的第五个命题,这是书中第一个难以理解的概念。那些成功跨过驴桥的人将继续掌握几何学,过不去的人只能望洋兴叹。《Visual C++入门》的第 4.3 节,关于“动态内存分配”,就是我的驴桥。可惜,我没有跨过去。
但我并没有放弃这个课题,我还记得事情发生转变的那一刻。那是一次长途飞行,我带了一台笨重的笔记本电脑和一张装有 Borland C++编译器的 CD-ROM。编译器将你写的代码转换成机器可执行的机器码,我已经花了好几天时间才让这个编译器跑起来。按照惯例,每个编程初学者的第一个程序是“Hello, world.”。当我尝试运行我的版本时,只看到了无穷无尽的错误消息。解决了一个问题,又冒出了另一个。我读过《哈利·波特》系列,我感觉自己拥有了一把扫帚,只是还没有学会让它飞起来的咒语。我知道如果我能做到的话可能会发生什么,所以我努力坚持着。我从中悟到了一个道理,编程实际上并不是关于知识或技能,而是耐心,或者说是对这件事的痴迷。程序员是能够忍受无尽乏味的人。想象一下,在没有图片的情况下,用一种你很少说的语言,在电话里向一个傻瓜解释如何组装家具。再想象一下,你得到的唯一回应是,你提了一个荒谬的建议,而家具组装得越来越不像样。所以,当你终于完成了这件事,你会感到如释重负。我清楚地记得自己趴在飞机过道上,最后一次按下了回车键。然后,我坐了起来,这一次程序竟然做了我要它要做的事情。“Hello, world”出现在光标上方,仿佛一个智者醒来并向我介绍它自己。
我们大多数人都不会成为《黑客》中所描述的那种黑客。所谓的“hack”,用程序员的话来说,就是修修补补——通过代码来表达创造力。我从未正式学习过编程,我只是在瞎折腾,让电脑做一些有用的或令人愉快的小事情。在我上大一时,也就是 2006 年,为了不错过 Tiger Woods 在大师赛中的排名情况,我写了一个程序,在 pgatour.com 上搜索排行榜信息,并在他打出小鸟球或柏忌球时给我发短信。后来,在英语课上读了《尤利西斯》之后,我写了一个程序,从书中随机抽取句子,计算它们的音节,并汇编俳句——这是一种比现在的聊天机器人更原始的语言反刍,但我认为,它已经能够写出真正的诗歌:
I’ll flay him alive Uncertainly he waited Heavy of the past
我开始认真对待编程。我主动提出为朋友的创业公司开发程序。我逐渐了解到,计算机世界是庞大的,就像是地质学中的沉积物层一样有序。从 Web 浏览器到晶体管,每个子领域或系统都是建立在其他更古老的子领域或系统之上,层层叠加但有条理。你挖得越深,就越是会感受到赛车手 Jackie Stewart 所说的那种“机械同理心”,即对机器优势和局限性的一种感知,知道如何让它发挥作用。
在朋友的公司里,我感到我的机械同理心在变强。大二时,我和朋友一起看《危险边缘》,他建议我根据它制作一款游戏。我想了几个小时,然后非常失望地告诉他,这超出了我的能力范围。但是,这个想法在我上大三时再次出现,而此时我终于找到了解决办法。我现在对这台机器能做什么有了更好的认识。我花了接下来的 14 个小时去开发游戏。几周之后,玩这款游戏已经成为我朋友之间的常规活动。这段经历意义深远。我可以理解为什么人们愿意把他们的生命时光花到手工艺术上:没有什么比看着别人享受你做的东西更有趣的了。
在这期间,我完全沉浸在一中“纸牌屋”式的状态中,并把学习放在了一边。我努力,但并不是在学习上。有一个晚上,我在地下室里用 6 台机器来并行运行一个程序。我把满是数字的打印件放在地板上,思考着一种路径规划算法。代价是,我经历了一场噩梦——参加期末考试却一无所知。2009 年,在数十年来最严重的金融危机期间,我以 2.9 的 G.P.A.(平均绩点)毕业了。
但我还是很轻松地得到了我的第一份全职工作。我有程序员工作经验,也没有人问我的成绩如何。对于年轻的程序员来说,这是他们的繁荣时期。各家公司都在争夺顶尖的程序员。对有经验的程序员的抢夺如此激烈,以至于他们抱怨“招聘邮件满天飞”。大学计算机科学专业的热度开始爆炸性增长。(我的学位是经济学。)声称能在不到一年时间内将初学者变成高薪程序员的编程“训练营”开始出现。
在我二十多岁时的一次面试中,公司的首席执行官问我觉得自己值得拿多少薪水。我说了一个让自己都感到尴尬的数字。他当场起草了一份合同,给出的薪水比我要求的高出百分之十。“软件工程师”的技能备受推崇。在我工作过的一家公司,有人因为使用 HipChat(Slack 的前身)直接问我的一位同事问题而惹上了麻烦。他被告知“永远不要直接使用 HipChat 联系工程师”。我们太重要了,你们不能那样!
这是一个利率接近于零、科技行业增长惊人的时代。一些规范已经成形,像谷歌这样的公司在告诉这个行业,程序员可以享受免费的浓缩咖啡和热食,世界一流的医疗保健和育儿假,现场健身房和自行车室,随意的着装,以及“20%的时间”,这意味着他们每周可以花一天时间做任何他们喜欢的事情。人们认为他们的技能是如此的重要,以至于产生了一种迷信。例如,估计编码任务可能需要多长时间被认为是愚蠢的,因为程序员可能随时翻开石头挖出一堆 Bug。交付期限是一种诅咒,如果交付的压力太大,程序员只需要说出“精疲力竭”这个词就能额外获得几个月的时间。
我从一开始我就感觉这一切并不太对劲。我们所做的事情真的那么珍贵吗?这种繁荣能持续多久?在我十几岁的时候,我做过一些网页设计。在当时,这项工作曾经很受欢迎,也很受人尊重。你可以用一个周末完成一个项目,并赚到数千美元。但随之而来的是 Squarespace 这样的工具,它可以让披萨店老板和自由艺术家只需点击几下鼠标就创建好自己的网站。对于专业程序员来说,一部分高薪、相对不费力的工作消失了。
程序员社区对这些变化做出的反应是——你必须不断提升技能,去学习更难、更晦涩的东西。软件工程师,作为一个物种,喜欢自动化。不可避免地,他们当中最优秀的那部分人所构建的工具会使其他类型的工作过时。这种本能解释了为什么我们会得到这么好的照顾:代码有着巨大的杠杆作用。一款软件可能会影响数百万人的工作,甚至会取代程序员自己。我们应该把这些进步看作是涨潮,潮水会逐渐淹没我们的裸露的双脚,但只要我们持续地学习,就不会被潮水淹没。这是个明智的建议,除非遇上了海啸。
当我们被允许在工作中使用人工智能聊天机器人来帮助编程时,我故意避免使用它们。我原以为我的同事们也会这样。但很快,我从他们的屏幕上看到人工智能聊天会话的颜色——那种问答风格的斑马条纹。一种常见的说法是,这些工具会让你更加高效,在某些情况下,它们可以帮你以快十倍的速度解决问题。
我不确定我是否想要那样。我喜欢编程过程本身,也喜欢“自己是个有用的人”的感觉。我熟练使用的工具,比如我用来格式化和浏览代码的文本编辑器,可以同时满足这两个需求。它们加强了我对这门手艺的实践——虽然它们能让我更快地完成工作,但我仍然觉得自己功不可没。但人工智能,就像人们对它所描述的那样,似乎有所不同。它提供了很多帮助,我担心它会剥夺我既享受解决难题的乐趣又满足于成为解决问题的人的满足感。我可以无限提高生产力,但我所能展示的可能只有结果而已。
大多数程序员的实际工作成果很少是令人感到兴奋的。事实上,它们往往平淡无奇。几个月前,我下班回家告诉妻子,我度过了一个非常愉快的一天,解决了一个特别有趣的问题。我正在开发一个生成表格的程序,有人想要添加一个跨多个列的标题——而我们的自定义布局引擎并不支持这个功能。这项工作很紧急:这些表格被用在重要的文件中。因此,我把自己关在房间里大半个下午。这里有许多需要解决的子问题:应该如何让布局引擎用户表达他们想要一个跨列的标题?它们的代码应该是什么样子的?还有一些琐碎的细节,如果忽略了就会出现 Bug。例如,如果跨列标题其中的一列因为没有数据被删除了该怎么办?我知道这是美好的一天,因为我必须拿出笔和纸——我在绘制可能的场景并反复检查我的逻辑。
然而,如果以鸟瞰的角度看那天发生的事情会怎样?一个表格得到了一个新的标题,很难想象还有什么比这更平凡的事情了。对于我来说,乐趣完全在于这个过程,而不在于结果。如果这个过程只需要进行三分钟的 ChatGPT 对话,那么这个过程会变成什么样子?作为程序员,我们的工作除了字面上的编码之外,还涉及许多其他事情,比如指导新人和设计系统,但编码一直是其根本所在。
在我的整个职业生涯中,我一直因解决编程琐碎难题的能力而被雇主选中。然而,突然间,这种能力变得不那么重要了。
我从 Ben 那里得知了很多信息,他一直告诉我他使用 GPT-4 取得了惊人的成果。事实证明,它不仅擅长处理琐碎的事情,还具备了资深工程师的素质:它可以从丰富的知识库中提出解决问题的方法。在一个项目中,Ben 将一个小型扬声器和一个红色 LED 灯泡连接到查尔斯国王肖像上。他的想法是当用户在网站上输入文字时,扬声器会播放声音,灯光会用摩斯密码闪烁出消息。但为设备编写获取消息的程序困扰着 Ben,这似乎需要专业的知识,不仅涉及他所使用的微控制器,还涉及存储消息的后端服务器技术 Firebase。Ben 向我求助,我咕哝了几句。事实上,我并不确定他想要的是否可能实现。然后他问了 GPT-4,它告诉 Ben,Firebase 有一个功能可以让这个项目变得简单得多。就这样,这里还有一些代码,这些代码与微控制器是兼容的。
尽管我害怕使用 GPT-4,也对为了使用它需要向 OpenAI 每月支付二十美元感到有些不适,但我还是开始通过 Ben 来探索它的能力。我们一起研究我们的填字游戏项目。我会说:“你为什么不试着用这个提示词?”他会把键盘递给我。我会说:“不,你来操作”。我们在一起逐渐摸索出了这个人工智能的能力。Ben 在这方面的经验比我多,似乎更能高效地利用它。正如他后来所说的,他自己的神经网络已经开始与 GPT-4 的神经网络对齐了。我想说他已经获得了机械同理心。
有一次,他做了一件让我感到特别惊讶的事情,他让这个人工智能开发了一款贪吃蛇游戏,就像旧诺基亚手机上的那种。在与 GPT-4 进行了一番简短的交流之后,他让它修改游戏,当你输掉比赛时,它会显示你偏离最有效的路线多远。机器人花了大约十秒钟完成了这个任务。坦率地说,我不确定自己能不能完成这项任务。
国际象棋领域数十年来一直被人工智能所主宰,一位玩家唯一的希望就是与机器人搭档。这种半人半人工智能的团队(也就是所谓的半人马)可能仍然能够击败单打独斗的最优秀的人类和人工智能引擎。编程还没有发展到国际象棋那样的程度,但半人马已经出现了。目前看来,单打独斗的 GPT-4 是一个比我更糟糕的程序员,Ben 更糟糕,但 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 在经历了类似的情况后所写的:“我从未让我的程序员大脑参与其中。”那么我都做了些什么?
或许是因为感觉围棋游戏被永久性地贬低了,李世石选择退出这个游戏。我当初学习编程是因为我觉得计算机就像是一种魔法一样。计算机赋予了你力量,但你需要研究它的秘密——学习一种咒语,这需要一种特殊的思维方式。我觉得自己是被选中的。我埋头苦干,认真思考,积累晦涩的知识。然后,有一天,不需要思考和知识就可以达到许多相同的目的。从某种角度来看,这可能会让一个人的大部分工作看起来像是在浪费时间。
每当我想到李世石,就会想到国际象棋。大约三十年前,当机器征服了这个游戏,人们担心再也没有理由去玩它了。然而,国际象棋从未像现在这样受欢迎过——人工智能使这个游戏变得更加活跃。我的一个朋友最近开始学习下国际象棋。他可以随时使用人工智能教练,这个教练可以给他提供正好符合他能力边界的棋局,并且在他输掉比赛后告诉他错在哪里。与此同时,国际象棋大师们在研究计算机的走法,就像在阅读神谕一样。学习国际象棋从未如此简单,研究它最深层的秘密也从未像现在这样令人兴奋。
计算机科学尚未被征服。GPT-4 令人印象深刻,但普通人无法像程序员那样驾驭它。我仍然觉得我的职业是安全的。事实上,我感觉比以前更安全了。随着软件开发变得越来越容易,它会越来越普及,程序员将更多地转向设计、配置和维护。尽管我一直觉得编程中那些琐碎的部分最能让人投入其中、也最为重要,但这些并不是我特别擅长的。我没有通过很多大型科技公司的编程面试。我相对擅长的是知道什么是值得做的、用户喜欢什么,以及如何进行技术和人性层面的沟通。我的一位朋友把这个人工智能的时刻称为“平庸程序员的复仇时刻”。随着编码本身的重要性开始降低,也许软技能会大放异彩。
这让我不确定我的孩子出生后该教他些什么。
我甚至认为,当我的孩子长大成人,我们看待“程序员”的方式,就像我们现在回顾“计算机”发展历史一样。自己敲打 C++或 Python 代码,最终可能看起来像在打孔卡上发出二进制指令一样荒谬。Dijkstra 可能会感到震惊,让计算机做你想做的事情可能就像礼貌地提出请求那么简单。
所以也许要教的不是技能,而是精神。我有时会想,如果我出生在另一个时代,可能会做些什么。在农业时代,编码者可能会研究水车和作物品种,在牛顿时代,可能会着迷于玻璃、染料和时间测量。最近我看了有关神经网络发展历史的口述资料,其中很多被访谈的人——出生于 20 世纪 30 年代前后的人——小时候曾经玩过收音机,这让我感到震惊。也许下一代人会在深夜里探究那些曾被他们的父母视为黑匣子的人工智能。我不应该担心编程时代的结束。黑客精神永存!
领取专属 10元无门槛券
私享最新 技术干货