AI改变我们的编程方式

延续上一篇关于AI的思考,作为程序员最关心的编程范式的变化,我打算看一下业界有哪些思考和趋势。
这篇文章主要是围绕Tesla前AI总监Andrej Karpathy关于软件3.0的观点展开的。
什么是软件3.0
Andrej Karpathy提出软件开发的演进过程可以被划分为三个主要阶段,即Software 1.0、Software 2.0和Software 3.0,它们代表了编程思想和实现方式的根本性转变。
特性 | Software 1.0 (传统软件) | Software 2.0 (AI 软件) | Software 3.0 (LLM 驱动的软件) |
---|---|---|---|
核心思想 | 明确的指令 (Explicit Instructions) | 从数据中学习 (Learning from Data) | 与通用模型对话 (Interacting with a General Model) |
“代码”是什么? | 人类编写的源代码 (C++, Python) | 神经网络的权重 (Weights) | 自然语言提示 (Prompts) |
如何“编程”? | 程序员在开发环境中编写代码 | 工程师用海量数据训练模型 | 用户通过对话、提问、下指令来引导模型 |
开发者角色 | 软件工程师、程序员 | 机器学习工程师、数据科学家 | 所有人、提示工程师、AI 应用开发者 |
典型例子 | 计算器、操作系统、数据库 | 图像识别、语音识别、推荐系统 | ChatGPT、Copilot (代码助手)、Midjourney (AI绘画) |
优点 | 精确、可靠、行为可预测 | 擅长处理模糊、复杂的模式识别问题 | 开发速度极快、门槛极低、知识广博 |
缺点 | 僵化、无法处理模糊问题 | “黑箱”,需要海量数据,可能产生偏见 | 可能会“幻觉”(一本正经胡说八道)、依赖大公司、有安全风险 |
Software 1.0:传统编程
这是我们最熟悉的软件开发模式。程序员使用Python、C++等形式化的编程语言,一行一行地编写明确的指令来告诉计算机如何执行任务。例如,特斯拉自动驾驶系统中就包含大量的C++代码。这种模式的特点是逻辑精确、行为可预测。
Software 2.0:神经网络编程
Software 2.0的“代码”不再是人类编写的指令,而是神经网络的权重。开发者通过收集和标注海量数据,使用梯度下降等优化算法来“训练”一个神经网络模型。模型从数据中自动学习规律和特征,例如用于图像识别的AlexNet。在特斯拉自动驾驶系统中,神经网络就逐渐取代了传统的C++代码。
Software 3.0:自然语言编程
这是最新的范式,其核心是大型语言模型(LLMs)。开发者不再编写传统代码或训练专门的模型,而是通过自然语言(如英语)编写提示词(Prompts)来与一个强大的、预先训练好的通用LLM进行交互,引导它生成所需的功能或代码。例如,要完成一个情感分类任务,开发者可能只需向LLM提供几句话的描述和几个示例即可。
编程范式的演进
Software的三个阶段是演进关系而非完全取代。Software 1.0是基础,提供精确控制;Software 2.0解决了1.0难以处理的模糊和感知问题;而Software 3.0则建立在2.0的成果(LLMs)之上,将编程的接口从形式化语言转变为自然语言,极大地降低了门槛。它们之间的核心区别在于“代码”的形态和“编程”的方式:从人类编写指令,到用数据优化权重,再到用语言引导模型。
这个变化最酷的地方在于,开发工作的核心,从“告诉电脑怎么做”变成了“告诉AI我想要什么”。在AI的加持下,开发者不用再苦哈哈地抠每一行代码逻辑了,只需要写出清晰、全面的目标说明(Specifications)和提示(Prompts),告诉AI我们期望软件能实现什么功能。然后,AI代理就会像个得力助手,把这些想法转化成我们能读懂、能运行的代码。
所以你看,开发者的角色也变了!程序员不再是单纯的“码农”,而更像是“AI协调员”或者“模型训练师”。最重要的技能也变成了如何拆解复杂问题、做好系统设计,以及一门新学科提示工程(Prompt Engineering)。这不只是简单地提问,而是要学会如何像一个精准的指挥家一样,用最恰当的指令、上下文和约束,引导AI产出我们想要的结果。
当下的AI Coding Assistant的身影现在几乎无处不在,贯穿了整个软件开发的生命周期:
- 规划阶段:脑子里只有一个模糊的想法?没关系,AI能帮你把它变成明确的需求和用户故事。
- 开发阶段:像GitHub Copilot这样的AI编程神器,可以实时帮你写代码、补全函数,据说能把开发效率拉高整整45%!简直太神了!
- 测试阶段:AI还能自动写测试用例、跑测试,帮你揪出代码里的bug和安全漏洞。
- 部署和维护:AI也能优化发布流程,甚至能预测系统可能会在什么时候出问题,让运维工作省心不少。
不过目前AI Coding也不是完美的,存在很多问题:
- 安全问题:现在最头疼的就是“提示注入”(Prompt Injection)。坏人可能会用一些刁钻的问法来“忽悠”AI,让它绕过安全限制,干点坏事,比如泄露你的数据。
- 可信度与可靠性问题:LLM有时候像个“黑箱”,我们搞不清它为什么会做出某个决定。而且它还时不时会一本正经地“胡说八道”(也就是“幻觉”),这对于要求绝对精准的软件来说,可是个大麻烦。
所以目前为止Software 3.0目前更适合作为工具箱中的辅助工具,而非完全取代传统的代码编程。
软件范式的更新
Andrej Karpathy关于软件3.0的讨论中提到它不仅仅是一个技术更新,更是一场深刻的范式革命。
编程的民主化与角色的转变
社区普遍认为,Software 3.0最大的意义在于“编程民主化”。由于编程语言变成了自然语言,非程序员也能参与到软件创建中,极大地拓宽了创新的来源。X平台(原Twitter)上的讨论热烈,用户强调“English is coding”(英语即编程)的理念。对于程序员而言,工作重心从手写代码转向了设计高效的提示(Prompt Engineering)、验证和审计AI生成的代码以及管理整个AI系统。
LLM作为新的“操作系统”
Andrej Karpathy将LLMs比作1960年代的早期计算机或是一种新型的操作系统。这一观点在社区中获得了广泛认同。LLMs成为了一个可编程、可组合的基础平台,开发者可以围绕它来构建各种应用,而不是一切从零开始。
人机协作而非完全取代
目前大家普遍的共识是,Software 3.0强调的是人机协作,即“部分自动化”(Partial Autonomy)。Karpathy提出的“Autonomy Slider”(自主性滑块)概念被反复提及,即用户可以根据任务需求调整AI的介入程度。AI负责生成,人类负责验证,形成高效的“生成-验证”循环。
总而言之,软件3.0不仅仅是工具上的更新换代,它更像是一场关于思维、流程和团队协作方式的革命。公司需要赶紧建立起新的管理规则,培养团队和AI打交道的能力,还得花钱投资一些能管好AI风险的技术。说到底,未来的赢家,不是那些拥有最强AI的人,而是那些最懂得如何与AI共舞、能建立起高效、安全、负责任的人机协作体系的团队和个人。这,才是这场变革中最激动人心的部分!
Public discussion