我的编程生涯已成历史文物
好吧,我正式宣布:我长达30年的编程生涯已成历史文物。如今从事人工智能工作让我确信,短短数年后,人类回望过去时,定会觉得当年人们居然真的在给机器编程这件事多么可笑。
编程需要人类
八岁那年,我翻遍Commodore 64用户手册,从杂志封底抄写代码,就此开启编程生涯。此后我从未停止学习。编程绝非学个几年就能精通的技艺。过去40年间,我始终置身于行业技术的持续演进浪潮中。招聘程序员时,我们最看重的核心素质是适应力、自主学习能力和批判性思维。要保持技术前沿地位,需要持续不断的努力。
编程的根基在于机械同理心。你必须理解机器运作原理——存储、内存、处理、接口。在此基础上,你需要掌握语言语义与工具集——哪些神奇的字符咒语能被系统实际执行。更进一步,则是大型程序的抽象化、程序系统的构建,乃至计算机系统的整合。程序员工作的核心在于管理复杂性,因此掌握相关技巧至关重要。资深开发者会运用数据结构与算法、配置与状态、封装、函数式与面向对象组合、实体与数据、事件与快照、序列与递归等抽象概念——这永无止境。而产品迭代的洪流每周都在重构你的工具箱。
更要面对取舍!编程(如同所有工程)本质就是权衡取舍。你可以用内存换取处理能力,用时间换取完整性,用可靠性换取成本,用可维护性换取速度——通过调整上百个变量,最终打造出满足需求的程序。
程序并非真空存在。它们旨在解决真实人群的实际问题,最终转化为真实的产品与服务。程序员必须懂得如何定义问题、识别用户需求并以清晰可取的方式满足需求,确保所建系统具备可行性,并能催生可持续的商业模式。程序员编写的程序与用户互动,因此我们始终游走于心理学、社会学与技术交互的边界。
程序员数十年所习得的,是思维运作的本质。当你试图将问题空间的推理分解为步骤集,或拆解不同模块协同工作,或预测事物随时间演变的轨迹时,现场必须有程序员参与。这正是编程作为学科在过去半个世纪渗透至几乎所有科学领域的原因。程序员正是各领域问题解决能力的加速器——他们既是设计师、架构师,更是建造者。
等等…编程需要人类吗?
三年前,我完成了一轮高级工程师职位的候选人面试。面试过程中常会遇到这样的人:无论出于何种原因,他们始终未能掌握编程岗位所需的基础技能。根据岗位要求和候选人特质,若其具备出色的批判性思维或问题解决能力,我们或许会稍作宽容——但这种情况仍令人震惊。经历连续几位候选人失败后,我瘫坐在办公椅上惊呼:“为什么这些候选人连这个基础问题的编程解决方案都搞不定!?” 同事听得忍俊不禁,反问“问题出在哪?”我向他描述后,他答道:“明白了…那么理想的解决方案该是什么形态?”我转身才发现,他并非在指导我的面试技巧,而是正将题目输入我们刚获得早期访问权限的OpenAI GPT3-达芬奇实验平台。几下敲击键盘后,他提交问题,完美无缺的Python代码答案立刻弹出。我审视着它——正确且高效。我惊呆了。于是让他用另一种编程语言实现,它照做了。接着要求不同编程范式,它依然完成。随后它不再等待我们提出更多变体,直接开始自动输出其他语言的解决方案。
自那日起,微软的小团队便开始研究大型语言模型驱动的系统。起初我与业内其他同仁一样,在随后的两年间逐渐意识到:这项技术本身足以提升计算机技术所涉及的几乎所有领域的生产力。但我同样认为,要使这些系统具备解决复杂问题的能力,而非仅限于处理简单示例题,仍需漫长时日。程序员日常使用的技能,远非文本补全神经网络功能所能企及。
我们逐一攻克难题:首先解决系统记忆窗口过短的问题(类似注意力持续时间),为此开发了专项技术;随后将系统与其他工具集成,使其能力超越单纯文本生成;接着攻克系统处理连续长操作链的难题;再之后探索如何将大型任务分解为子任务并保持推进效率。随后我们开发了提升结果可量化性与可靠性的技术。最终,我们致力于增强其自我反思能力,使其能根据实时表现进行自我调整。在整个研究过程中,模型能力不断提升,生态系统持续扩展。我们的系统逐步承担起更多编程工作,减轻了开发者的负担。
今年春季,Anthropic发布的Claude Code包含若干关键要素,真正推动我们的系统进入高速发展阶段。首先,它能通过命令行直接与计算机交互,而非像ChatGPT或API那样局限于网页应用。其次,该系统以优雅方式整合了任务分解、任务委派和工具调用(如网页抓取和文件搜索)等经典模式,使系统能够可靠地协调一系列任务。我们全年都在使用Claude Code这类工具,持续提升AI系统处理大型任务的能力,使其在更长时间内保持更高可靠性。
但这一切并未让我觉得编程本身会成为历史遗物。
不,编程不需要人类
直到上周。我们一直在Claude Code基础上整合各种技术与实验成果,将其作为快速实验平台使用。我们成功将许多来之不易的发现快速整合其中。已在https://github.com/microsoft/amplifier发布早期原型,并计划于未来一两周推出新版——该版本将实现模型无关性(无需运行于Claude Code)。这并非要取代我作为程序员的终极方案,但它让我确信我们的时间表以月计而非年计。它已完成最艰巨的部分。
借助Amplifier,您现在只需描述需求,它便能根据您的编程理念自动构建从设计、后端到前端的全流程方案,包括测试环节。但这并非核心价值。核心在于:使用越频繁,它就越强大。你将逐步构建可复用的工具集,它会捕捉有效技术,从你的使用模式中学习,主动提出自我优化的方案。这正是指数级生产力的体现——你构建的工具将加速后续创作。
过去一周,我用Amplifier分析了两个独立代码库:从其中提取正在开发的功能集,为另一个代码库提出三种实现同类功能的方案,并并行实现所有方案,最终生成成功与失败的总结报告。我还用它将大量Bash脚本转化为Web服务API、Go语言命令行工具和完整Web应用前端。虽然配置提示符需要时间和编程知识,但这些任务仅需向Amplifier发出三条指令。每次运行30-120分钟后,它便能交付包含文档的完整软件。
与此同时,我们扩展团队的其他成员利用它构建了十余个其他项目,包括新版Amplifier、一个全面的评估框架,以及两种不同的图形化实验桌面。最令我惊叹的是某位设计师——尽管编程基础有限,他却构想出从理想设计美学到完整设计框架的全新路径。他融合Figma和Storybook等工具的创意与工作流,打造出全新的助手驱动设计应用,据我估算这可能使他的效率提升十倍。上周我们让Amplifier对接一个管理大型关联任务列表的项目,它不仅完成集成,更让同事得以整夜持续运行,自主完成数十项任务,甚至生成包含多种组件实现方案的“晨报”,征询下一步行动方向。
这并非最终产品,我们(以及整个行业)仍有大量工作要做。硬件和软件制造商(驱动程序、核心库、集成方案)需要发布产品上下文供AI使用。我们需要持续完善并发布系统集成的新标准。但此刻我首次感受到:最艰难的部分已然完成。从此之后,机器将能直接执行指令——无需程序员居中协调。
(近)未来图景
我之前提到的项目——将bash脚本转化为网络应用?整个开发过程其实都在树莓派微型电脑上运行。我刚在上面安装了Amplifier,挂载了旧代码库,就让它自动生成所有其他项目。我根本没碰代码——它生成的成果比我自己花数周时间编写的还要出色。我计划开源该项目供他人使用,但你完全可以想象用相同流程构建定制化软件而不必分发。未来无需下载安装软件,只需告诉机器需求,它就能自动生成。想修改功能?添加特性?创建全新应用?开口即可。
我毕生积累的编程技能,如今只需通过Amplifier这类工具配合恰当指令就能实现。最后一步是将所有专业知识封装交给AI,届时任何人——即使毫无编程经验——都能随时让AI构建所需软件。
那么接下来呢?
我毫不避讳称之为个人存在危机。程序员身份无疑构成了我人格的重要部分。我曾将编程视为一种魔法——通过精准的咒语让机器完成惊人壮举。这曾是职业领域的超能力。如今人人都能施展魔法,意味着什么?我的超能力竟沦为……寻常生活?我还能在行业中立足吗?
这又将如何影响我的传承感?我们总渴望生命中的成就能超越自身而永存。但此刻我明白,自己的职业遗产注定充满戏剧性——如同铁匠、抄写员或宫廷弄臣的命运。
但这次的淘汰或许比以往技术驱动的淘汰更诡异。以往被淘汰者总能带着专业知识和解决问题的能力转型——铁匠建起铸造厂,抄写员成为印刷工,弄臣转型喜剧演员。他们用新工具继续解决相同的问题,往往规模更大。可当解决问题本身变得多余时,又该何去何从?
方才我暂停工作,去读了同事布莱恩·克拉巴赫关于他自身存在危机的博文。他半年前就意识到这一点,但我当时并不相信。诚然,机器终将取代部分编程工作,但可预见的未来我们仍需程序员来指导它们运作。而Amplifier正以每日可见的实证,推翻我对时间线的预判。他在文中描述了这样的顿悟:当意识到取代程序员反而能让他摆脱束缚,专注于程序员最热爱的核心工作——更快解决更宏大的问题时,他获得了心灵慰藉。但我对此存疑。对我而言,识别问题并提出解决方案向来是轻松的部分。在各类创新实验室的经历让我明白,这些环节同样只是可被自动化的流程。“但机器无法获取亟待解决的问题数据!它们根本不知人类面临何种困境!”——没错,除非我们教它们编写实现该功能的软件。
所以,是的。想到现实问题即将被解决确实令人宽慰——当下最迫切需要解决的是社会层面的问题。我无疑会参与其中许多项目。我只需接受这样一个事实:我的主要贡献将不再依赖于辛苦磨砺的编程技能。这些技能很快就会成为任何能购买计算资源者唾手可得的工具。
附注:如果你好奇的话,没错,那张高中毕业照里正在电路板上焊接元件的就是我。😆
本文文字及图片出自 My Programming Career is a Historical Artifact
