作者 | James Somers 译者| 明明如月
责编 | 夏萌
出品 | CSDN(ID:CSDNnews)
就像父母教我读写一样,作为程序员,我也要确保孩子能够学会编程。编程不仅是一项不断发展的技术,更是一项日益重要的技能。学会编程可以提升孩子们的综合能力,在就业中具有优势。但现在,我的妻子怀着我们的第一个孩子,距预产期还有三周。虽然我是程序员,但我担心等孩子长大学会打字时,编程可能已不再那么重要。
这种担忧始于我参与的一个业余项目。几个月前,我和朋友本决定尝试用电脑制作一个《纽约时报》风格的填字游戏。我们曾用软件制作过一个星期六的谜题,只是加入了一些个人想法。现在,我们想开发一个自动生成填字游戏的程序,无需人工干预。
在以往的项目中,我们的角色分明:Ben 擅长硬件,我负责软件。比如,我们曾做过一个霓虹灯招牌,靠近我们公寓的地铁站时会亮起。本负责硬件部分,我处理交通数据的编程。尽管本的编程经验有限,复杂任务通常由我来完成。但在填字游戏项目中,本引入了新帮手:注册了 ChatGPT Plus 服务,并使用 GPT-4 作为编程助手。
结果出人意料。在项目讨论中,我们确定软件需求,本应能迅速独立完成这些功能。例如,我们需要一个命令从字典中随机选取一百行。我思考良久,改了很多次代码,但均未能达到预期的效果。与此同时,Ben 仅通过告诉 GPT-4 需求,它就迅速写出了可以完美运行的代码。另外 Ben 想开发一个评估词典单词的苹果应用,但不懂其复杂性。我尝试过开发苹果应用,但从未完成。苹果的编程环境难以掌握:需学习新语言、掌握不同的代码编辑和运行工具、理解用户界面组件及其搭配方式,以及掌握应用打包方法。积累这些新知识令人望而却步。然而第二天,我收到邮件,附有完全满足本需求的应用。它流畅、界面设计吸引,本仅花几小时就完成了。GPT-4 承担了大部分工作。
大多数人已经使用过人工智能,但并非都印象深刻。Ben 近期表示:“直到我用它编程,我深受震撼。”我怀疑,一些非程序员群体在看到 ChatGPT 生成的生硬文章或错误信息后,可能仍低估了其技术价值。
传统上需多年学习才能掌握的技能,现在似乎瞬间可得。对我而言,编程是深邃、丰富的领域。但现在,我仿佛要为这门艺术写悼文。我想到了围棋选手李世石,他曾是顶尖高手、韩国英雄。但他因 2016 年输给人工智能 AlphaGo 而闻名。李世石本以为能轻松胜出,但最终只赢一局。发布会上,他对无力感到抱歉。三年后,他退役。李世石的经历反映了一个问题:我投入大量时间和精力的事业将变成什么?
我的对电脑的热爱始于 90 年代初,在蒙特利尔,我六岁时就与哥哥一起玩《真人快打》。他向我展示了游戏中的特殊技能,被称为“终结技”。尽管我们都不会使用这些技巧,但他通过连接到 FTP 服务器并在 MS-DOS 终端中输入命令,找到了这些技巧的指令,并打印出来。我们回到地下室,轮流用这些技巧在游戏中击败对方。
我小时候一直以为哥哥是黑客。像许多程序员一样,我梦想着入侵和控制远程系统,不是为了制造混乱,而是出于对未知世界的好奇。1986 年《黑客宣言》中,洛伊德布兰肯希普表达了一种积极的观点:“我的罪行是好奇心”,强调了探索和发现的价值。我最喜欢的是 1995 年电影《黑客》中的一个场景,新成员戴德墨菲展示了他能够识别出从背包中取出的每本计算机书籍的能力。戴德通过敲击键盘实现了在学校启动喷水系统和调整油轮压载的壮举,展示了知识就是力量。
我在五年级时家搬到了新泽西。高中时,我在 Borders 书店买了 Ivor Horton 的《开始学习 Visual C++》,一本 1200 页的书,我视其为我的第一本“魔法书”。像许多教程一样,这本书开始时读起来简单,但很快变得复杂。中世纪学生们将学习中的挫折时刻称为“驴子桥”,源于欧几里得《几何原本》中的第一个难点。对我而言,《开始学习 Visual C++》中的“动态内存分配”就是我的“驴子桥”,但我没能越过。
我并没有因此而放弃。我鲜明记得那个关键时刻:在一次长途飞行中,我带着一台方形的黑色笔记本电脑和一张 Borland C++ 编译器的 CD-ROM。这个编译器可以把我写的代码转换成电脑能执行的程序。我花了好几天时间才让编译器工作。大多数程序员的第一个程序都是简单地显示“Hello, world”,但当我尝试运行我的程序时,却遭遇了一系列的错误提示。解决一个问题后,又会出现新的挑战。我那时就像是有了一把魔法扫帚的《哈利波特》,却不知道如何让它飞起来。但我知道,只要坚持,就会有所成就。我意识到编程不仅仅是关于知识和技巧,更多的是耐心和对编程的热爱。程序员就是那些能忍受无尽枯燥挑战的人。想象一下,你得用几乎不懂的语言,通过电话向外行解释组装家具的方法,没有任何图示可参考。你得到的唯一反馈可能是你的建议荒谬,整个过程乱糟糟的。所以,当你最终成功时,那份成就感是极其珍贵的。我清晰地记得,在飞机走廊上躺着,最后一次按下回车键的那一刻。我坐起来,看到电脑屏幕上显示的“Hello, world”,仿佛电脑自己在说话。它就像一个刚苏醒的智能体,向我展示了它的存在。
大多数程序员和《黑客》电影中描绘的完全不同。在程序员眼中,“黑客”更多指编程的尝试和创新。我虽未系统学习编程,但喜欢用它来完成有趣或实用的小任务。例如,大一时,我知道会错过 2006 年大师赛,那时泰格伍兹正处于状态上升期。我想实时了解比赛,于是开发了一个程序,能从 pgatour.com 网站获取领先榜数据,并在伍兹每次得分时发短信给我。后来,在阅读《尤利西斯》的英语课上,我写了个程序,随机选句子,计算音节数,组成俳句。这虽比现在的聊天机器人原始,但我觉得它特别有诗意:
I’ll flay him alive
Uncertainly he waited
Heavy of the past
这激发了我对编程的兴趣。我开始为朋友的初创公司编码,逐渐发现计算机世界结构宽广有序,像地层叠加。每个子领域或系统都建立在更古老的基础上,层次复杂但易理解。深入挖掘,就能体会赛车手杰基斯图尔特所说的“机械同情心”对机器性能和限制的深刻感知。
在朋友公司的工作中,我的“机械同情心”得到了发展。大二时,我和朋友看《危险边缘》,他建议我制作电视节目游戏版。我沉思几小时后,遗憾地认为这超出了我的能力。但到了大三,我找到了解决方案。我对机器的理解加深了。接下来的十四小时,我完成了游戏制作。“玩吉姆博危险边缘”成为我和朋友的常规活动。这让我明白,人们为何全情投入他们的工艺:看到别人享受你创造的东西,感觉无与伦比。
我那时全身心投入编程,以至于忽略了学业。我沉迷于编程,对课程热情不足。记得一天晚上,我在实验室占用多台电脑,运行并行处理程序,地板上铺满了算法思路的打印纸。这种专注导致我常梦见期末考试不堪一击尤其是数学系的实分析课。2009年,正值金融危机,我以 2.9 的绩点毕业。
我的第一份全职工作作为程序员意外地轻松到手。那时开发人员很好找工作,成绩好坏影响不大。计算机科学成为热门专业,编程“培训班”迅速兴起,短期内就能将初学者培养成高薪程序员。我大学主修经济学,但在一次面试中,首席执行官对我提出的期望薪水给予了高 10% 的报价。
那是科技行业快速增长、低利率的时期。工作文化规范逐渐确立,谷歌等公司推广的文化影响行业。程序员享有优越待遇,如免费餐饮、顶级医疗保舰健身设施,以及“20%自由时间”规则。他们的技能被视为关键且独特,但也形成了一些迷信,如编程任务时间难以预估,截止日期常被忽视。
我意识到这一切中有些不对劲。我曾在十几岁时做网页设计,需求旺盛,收入可观。但随着工具如 Squarespace的出现,非专业人士也能轻松建站,导致高薪、低难度的编程工作逐渐减少。
“通过观察别人在日常生活中的小事,就可以看出这个人是否有道德标准” Hartley Lin 的漫画
面对行业变化,程序员社区的普遍看法是,不断提升技能。通过持续学习和适应,我们努力保持安全这是一个明智的策略,直到真正的危机出现。当我们被允许使用 AI 聊天机器人辅助编程时,我最初对其有些排斥,预计同事们也会这样。但我很快发现,办公桌屏幕上出现了典型的 AI 聊天交互颜色斑马图案。这些工具被认为能提高工作效率,有时甚至能使问题解决速度提高十倍。
我对这种效率的必要性表示怀疑。我喜欢编程过程,享受解决问题带来的成就感。我常用的工具,如文本编辑器,既满足了这两个需求,又提高了我对编程技能的掌握。尽管这些工具使我工作更高效,但我仍感到自己的努力得到认可。然而,AI显得不同。它提供巨大帮助,但我担心它会削弱我解决难题时的乐趣和满足感。虽然我可能变得极其高效,但展示的只是最终产品。
程序员的日常工作成果通常不太引人注目,甚至经常出人意料地普通。对我来说,乐趣主要在于解决问题的过程,而不是最终产品。如果这个过程只需要几分钟的 ChatGPT 会话完成,情况将会怎样?我们程序员的工作不仅仅是编写代码,还包括指导初级员工和进行高层次的系统设计,但编码始终是核心部分。在我的职业生涯中,解决复杂编程问题的能力是我被面试和录用的关键。然而,现在这种能力似乎变得不那么重要了。
在一篇文章中,Ben 向我展示了他利用 GPT-4 取得的成就。GPT-4 不仅擅长处理复杂任务,还表现出高级工程师的素质,能从庞大的知识库中提出解决问题的方案。在一个项目中,Ben 将一个小喇叭和红色 LED 灯泡安装在查尔斯国王画像的框架里,灯泡代表王冠上的宝石。当在配套网站上输入信息时,喇叭播放旋律,灯泡以摩尔斯电码闪烁信息。但他遇到了难题,无法让这个装置接收新信息。要实现这一功能,似乎需要对他正在使用的微控制器有深入了解,并熟悉后端服务器技术,如 Firebase。我给出了一些建议,但并不确定其可行性。后来,Ben 向GPT-4 寻求建议,GPT-4 告诉他 Firebase 有一个可以简化项目的功能,并提供了与微控制器兼容的代码。
虽然最初我对使用 GPT-4 和支付其服务费有所犹豫,但通过与 Ben 的合作,我开始探索它的能力。在处理填字游戏项目时,我会建议 Ben 如何向 GPT-4 提问,但让他操作。我们一起逐步了解了这个人工智能的能力。Ben似乎能更有效地使用 GPT-4,他的“神经网络”开始与 GPT-4 对齐,达到了一种“机械共鸣”。特别令我惊讶的是,他使用 GPT-4 构建了一个类似老款诺基亚手机上的贪吃蛇游戏,并让它修改游戏,显示输掉游戏时与最有效路径的差距,这个过程仅用了大约十秒钟。我不确定我自己是否能完成这样的任务。
在长期由人工智能主导的国际象棋领域,与机器人合作是玩家的唯一希望。这种半人类、半 AI 的团队,被称为“半人马”,可能仍能击败最优秀的人类和单独工作的最佳AI引擎。尽管编程还没有变成像国际象棋那样的游戏,但“半人马”模式已经出现。目前,单独的 GPT-4 还不如我编程,Ben 的编程能力更弱,但将 Ben 和 GPT-4 结合起来,形成了一个强大的组合。
不久后,我也开始尝试使用 GPT-4。我在工作中制作了一个小型搜索工具,希望能突出显示用户查询与搜索结果的匹配部分。但我试图通过将查询分解成单词的方式处理,无意中使问题变得复杂化。我变得不耐烦,开始考虑使用 GPT-4。也许我不需要花整个下午编程,而是可以通过“提示”或与 AI 进行对话来解决问题。
Edsger W. Dijkstra 在 1978 年的论文《关于“自然语言编程”的愚蠢》中指出,使用母语而非专业编程语言(如C++ 或 Python)来指导计算机,会放弃计算机的精确性优势。他认为,正式的编程语言能有效排除使用母语时不可避免的模糊性。这一观点在编程界广泛接受。2014 年,这篇论文在 Reddit 上流传时,一位顶级评论者指出,这个想法显而易见,但许多人仍然不知道它。
我在首次使用 GPT-4 时,能理解 Dijkstra 的观点。你不能仅仅对 AI 说,“解决我的问题。”尽管这样的日子可能会来临,但目前它更像是你需要学会演奏的乐器。你必须小心地指定想要的结果,像跟初学者交谈一样。在解决搜索高亮问题时,我发现自己对 GPT-4 的要求过多,看着它失败后不断调整。最终,我将问题分解成具体、抽象、明确的子问题,这些子问题加在一起,将得到我想要的结果。
找到与 AI 合作的正确方式后,我开始发现到处都有使用 GPT-4 的机会;我终于明白了办公室里到处都是聊天会话屏幕的原因也明白了 Ben 为何如此高效。我开始更频繁地尝试使用它。
我重新投入到填字游戏项目中。谜题生成器的输出格式相对简陋,我希望将其转换成一个漂亮的网页形式,以便轻松浏览网格中的单词,并一目了然地看到评分信息。但这个任务非常复杂:每个字母都需要标记其属于的单词,无论是横向还是纵向。这是一个细致的问题,可能会耗费整个晚上的时间。随着孩子的到来,我缺少了可以自由支配的夜晚。因此,我开始与 GPT-4 进行交流。这个过程需要一些来回对话;有时候,我不得不亲自阅读一些代码行来理解它在做什么。但我几乎没有进行我之前认为是编程本质的思考,比如数字、模式或循环;我没有用大脑模拟计算机的活动。正如另一位程序员 Geoffrey Litt 在类似经历后所写,“我从未动用过我的详细程序员大脑。”那么,我究竟做了什么呢?
也许正是这种感觉促使围棋高手李世石退役因为游戏已经被永久地改变了。我之所以开始编程,是因为计算机给我一种魔法的感觉。机器赋予了我力量,但要求我研究它的神秘秘诀学习一种魔法语言。这需要一种特殊的心态。我感觉自己被选中了。我专注于乏味的、细致的思考和积累晦涩的知识。然后,有一天,很多相同的目标可以在没有思考和知识的情况下实现。从某种角度看,这似乎使得我很大一部分工作生活变得像是在浪费时间。
但每当我想到李世石,我就会想到国际象棋。大约三十年前,机器征服了这个游戏,当时的担忧是人们再也没有理由去玩它了。然而,国际象棋从未像现在这样受欢迎人工智能使这个游戏变得更加生动。我的一个朋友最近开始学习它。他可以随时向人工智能教练求助,这个教练能够提供刚好在他能力边缘的国际象棋问题,并且在他输掉比赛后告诉他哪里出了问题。同时,在最高水平上,国际象棋大师们研究计算机提出的走法,就像是在解读神灵的启示。学习国际象棋从未如此简单;探索它最深奥的秘密从未如此令人兴奋。
计算机科学尚未被完全掌握。虽然 GPT-4 令人印象深刻,但它并非所有人都能像专业程序员那样运用。因此,作为一名程序员,我对自己的专业领域感到更加安全。实际上,随着软件制作的简化,软件数量将增加,程序员可能会更多地转向设计、配置和维护等方面工作。我过去总认为编程中繁琐的部分至关重要,但我并不擅长这些。我曾多次在大型科技公司的传统编程面试中失败,而我更擅长理解哪些项目值得构建、用户喜欢什么,以及如何在技术和人性之间沟通。一个朋友将这个人工智能时代称为“普通程序员的复仇”,编程本身开始变得不那么重要,更柔软的技能可能更为重要。
这让我思考,我应该教给未出生的孩子什么。随着时间的推移,“程序员”这个词可能会像我们现在看待“计算机”一词一样它曾指手工进行计算的人。亲自使用 C++ 或 Python 编程可能会变得像使用打孔卡输入二进制指令一样过时。虽然 Dijkstra 可能会感到震惊,但让计算机精确执行你想要的任务可能变成了一种礼貌提问的艺术。
因此,我应该教授的可能不是某一具体技能,而是一种思维方式。如果我生活在不同的时代,我会做什么?农业时代的编程者可能会研究水车和作物品种;在牛顿时代,他们可能对玻璃、染料和计时器感兴趣。我最近读到 20 世纪 30 年代出生的人在小时候玩无线电,这让我深受感动。下一代人可能会在深夜探索他们的父母曾视为黑箱的人工智能。我不应担心编程时代的结束,因为探索和创新的精神永存。
你是否有过利用AI技术来解决编程问题的经验?文章中提到AI对编程职业的影响,你是否同意作者的看法?你认为这种变化对程序员的未来意味着什么?