AI 辅助编码的最后一公里(下篇):如何用好AI时代编程中'人类独有的30%'
AI 辅助编码的最后一公里:如何用好AI时代编程中"人类独有的30%"
原文:https://addyo.substack.com/p/beyond-the-70-maximizing-the-human
作者:Addy Osmani
为什么在AI辅助编程时代,人类的独特技能依旧至关重要?
本文是《AI 辅助编码的最后一公里》的后续探讨。
像 Cursor、Cline、Copilot 和 WindSurf 这样的 AI 编程助手,彻底改变了软件开发方式,帮我们解决了大量重复枯燥的基础工作。然而,就像许多资深开发者和行业领袖指出的那样,目前依然存在一个关键的问题:大约还有30%的工作,是AI无法很好地完成的。
正是这30%的差距,决定了一段代码究竟是简单的演示,还是真正能落地的产品级系统。这部分工作包含了最棘手的挑战,比如深入理解复杂需求、设计出易于维护的系统架构、处理各种边缘情况以及确保代码的正确性。简单来说,AI可以生成"代码",但它往往在"软件工程"本身上做得并不好。
科技界的传奇人物蒂姆·奥莱利(Tim O'Reilly),在回顾数十年来的技术变迁时,强调了这样一个观点:每一次自动化的跃进,都只是改变了我们编程的方式,而不是我们为什么需要优秀程序员的理由。我们面对的不是编程的终结,而是"我们今天所认识的编程方式的终结"。也就是说,开发者的角色并不是在消失,而是在转变。
AI编程中的"70%现象":AI擅长什么,又卡在哪儿?
AI编程工具在某些方面表现得惊人地好。尤其在编写模板代码、常规函数,以及快速推动项目完成大约70%的任务时,AI表现出色。很多程序员发现,使用AI辅助编程,能迅速获得一个初步的解决方案,满足大致70%的开发需求。
AI擅长的70%
这70%通常是比较简单、有规律可循的部分,也就是代码中那些已经被充分探索过的路径或通用的框架。正如一位Hacker News评论者所说,AI特别擅长处理软件开发中的 "偶然复杂性"(accidental complexity) ——也就是那些重复的、机械的繁琐工作;而真正的 "本质复杂性"(essential complexity) ,也就是理解并解决问题本身的复杂性,仍然得靠 人类的智慧 来驾驭。
用经典的"人月神话"作者Fred Brooks的话来说,AI能解决的是软件开发中次要的麻烦,而非本质上的难题。
AI卡在哪儿了?
经验丰富的工程师经常提到一个明显的 "最后一公里"瓶颈 。AI可能会给出一个看起来很靠谱的解决方案,但剩下的那关键的30%——例如处理特殊的边界条件、完善架构设计,以及确保代码长期易于维护——还得依靠真正有经验的程序员。
举个简单的例子,AI可能给你一个基本能跑的函数,但如果你不明确提醒它,它就不会自动考虑:
- 异常输入处理
- 竞态条件
- 性能瓶颈
- 为未来需求预留扩展空间
AI的常见问题
AI也经常会犯一个众所周知的错误:它可能生成看似合理却不正确的代码。它可能引入一些隐蔽的小bug,甚至会"幻觉式"地调用根本不存在的函数和库。
程序员Steve Yegge幽默地将如今的AI模型比作"效率惊人的初级开发者",他们干活极其快,又无比热情,但也像是"嗑了兴奋剂"一样,时不时就提出一些天马行空或根本不可行的方案。
更重要的是,目前的AI无法创造出超越自身训练数据之外的全新抽象或策略。AI不会替你发明一种前所未有的算法,也不会创造一种全新的架构。它们只是在"混搭"已有的知识。
AI时代下,工程师必备的持久技能
在这个AI加持的软件开发时代,工程师需要更加专注那些人工智能(目前)无法轻易替代的技能与方法。以下几项能力值得你加倍用心培养:
1. 系统设计与架构思维
设计一个出色的系统,不仅仅是写几段代码那么简单,它需要你全面理解整体架构、权衡利弊、考虑限制条件,真正看到整个系统的"大局"。
核心能力包括:
- 理解各个组件如何互动
- 设计数据流转方式
- 保障扩展性与安全性
- 运用设计模式与原则(如关注点分离、模块化)
AI可以帮你写代码,却无法自动给出复杂问题的最佳架构。好的架构绝不是偶然形成的,而需要富有经验的工程师来主导。
2. 处理极端情况与模糊需求
真实的软件项目中,总是充满奇怪的边缘场景和不断变化的需求,而AI默认情况下通常只解决"常规"的问题。
关键技能:
- 批判性思考与前瞻力
- 想清楚可能的极端场景
- 预料到各种可能失败的情况
- 深入理解业务背景与用户场景
这可能包括空值输入、网络故障、用户的异常操作,或是系统间的整合问题。
3. 代码审查与质量保障
当越来越多的代码是由AI生成时,严谨的代码审查和测试能力变得更加关键。
必备技能:
- 像审查新手工程师的代码一样审视AI生成的代码
- 扎实的单元测试、集成测试以及调试能力
- 编写良好的测试代码
- 养成"测试思维"
一个基本的态度是:"在证明它真正有效之前,假设一切都是坏的"。
4. 调试与解决问题的能力
当软件出问题时,你需要真正的解决问题的本领,才能定位并修复故障。
核心技能:
- 一步一步理清复杂bug
- 重现问题、定位根本原因
- 理解底层系统的运行逻辑
- 掌握计算机科学的基本原理
"系统化地排查问题",并且能从基本原理出发调试代码,这种技能才是顶尖开发者与普通工程师的分水岭。
5. 掌握项目背景与整体视野
软件开发从来不是孤立的编程任务,它总处在用户需求、项目进度、历史遗留代码以及团队流程等更大的背景之中。
系统化思维包括:
- 理解一个改动如何影响系统其他部分
- 软件如何实现业务目标
- 所有组件如何互相连接
- 判断什么合适,什么不合适
6. 沟通与协作能力
软件开发本质上是团队协作的活动。强大的沟通能力始终不可或缺。
重要技能:
- 清晰表达复杂想法
- 向AI提出好的问题
- 明确且精准地表达需求
- 知识共享、撰写文档和代码审阅
值得注意的是,向AI提出好的问题本身就是一种沟通能力,要求你明确且精准地表达需求。
高级开发者的优势:用AI放大你的经验价值
对于资深的程序员来说,AI工具的出现意味着一个提升自身影响力的绝佳机会——前提是你要充分发挥自己的经验优势。
1. 做架构师和主编
让AI写代码的初稿,而你则专注于设计整体架构,并且精炼AI给出的成果。
具体做法:
- 把复杂需求转化为清晰有效的AI指令
- 用挑剔的眼光逐行审查AI生成的代码
- 与AI"结对编程":AI负责敲字快,你掌控智慧
- 坚持高标准,确保代码符合质量、安全和性能要求
2. 用AI推动更大的项目
AI的协助可以极大地提高效率,处理大量机械重复的修改,甚至帮你探索不同的方案。
Steve Yegge 将这种工作方式称为"聊天导向编程(Chat-Oriented Programming, CHOP)",也就是通过不断优化指令、与AI合作完成代码编写。
关键是:
- 你要掌握方向,决定采用哪些工具或方法
- 将AI生成的代码整合成一个有序、有效的整体
- 用经验筛选AI给出的建议
3. 在AI时代,指导并树立标准
高级开发者的另一个重要角色,就是指导年轻开发人员正确、高效地使用AI。
指导重点:
- 教他们如何自己检查、测试AI代码
- 建立严格的测试和审查流程
- 规定使用AI的人必须公开AI的使用情况并自行验证结果
- 推行"可以使用AI,但要坚持严谨负责的工作态度"
4. 持续积累领域知识和预判能力
你的丰富经验和宽广视野,在AI时代反而更具价值。
优势体现:
- 知道软件为什么以某种方式设计
- 了解行业内部运作的细节
- 迅速识别AI产生的错误
- 凭借经验的直觉去引导AI
能够提前预判代码可能引发的二级、三级效应,是高级开发者的显著标志。
5. 发挥软技能与领导力
当AI承担了一部分编码工作后,资深开发者可以把更多精力用在软件工程中的"人"的方面。
领导职责:
- 与利益相关方沟通
- 主持设计会议
- 做出关键判断
- 让技术更好地与业务战略保持一致
- 绘制技术路线图
- 制定AI使用规范
在AI时代,如何成长为一名优秀的初级开发者?
如果你是一个刚入门或者经验尚浅的开发者,你确实需要主动培养一些特殊的技能,以确保你的工作价值超过AI自动生成的代码。
1. 扎实学好基础,千万别忽略"为什么"
学习策略:
- 把AI当成你的老师,而非单纯的"答案机器"
- 当AI生成代码时,追问它为什么这么写
- 确保自己真正理解数据结构、算法、内存管理、并发等基础概念
- 花时间主动阅读官方文档、亲手写一些小程序
如果你只是被动接受AI的代码,而不理解它的原理,那你的实际学习效果可能会更差。
2. 独立解决问题和Debug,别过度依赖AI安全网
实践建议:
- 每周设定一个"完全不使用AI辅助"的日子
- 当AI生成的代码出现Bug时,先自己尝试Debug
- 用调试工具逐步排查问题
- 把AI的建议当做提示,而不是最终答案
这种深度思考又会反过来帮你更聪明地使用AI工具。
3. 养成测试和验证代码的好习惯
核心实践:
- 当你从AI获得代码片段时,别盲目相信它是正确的
- 主动怀疑并测试:写单元测试,通过人工测试验证
- 用AI帮你编写测试用例,但测试的标准和方向由你掌控
- 从一开始就把测试视为开发过程的一部分
每次你发现了AI留下的错误,那你就完成了AI无法做到的任务——这正是你的独特价值体现。
4. 培养代码可维护性的眼光
质量意识:
- 关注"让代码变得易读、易维护、结构清晰"
- 培养对高质量代码的鉴赏能力
- 当AI生成复杂或混乱的代码时,主动重构它
- 假设自己是一名严格的代码评审员
这种追求可维护性的意识,正是那"由人类完成的30%"的核心内容之一。
5. 合理培养你的Prompt和工具使用技巧
技能发展:
- 掌握如何精准提问、给AI合适的上下文信息
- 不断优化提示以获得理想的结果
- 试着先用自己的语言描述解决方案,再让AI帮你实现
- 多尝试不同的AI工具,了解它们的优势和弱点
记住,好的提示往往代表你对问题有深刻的理解。
6. 主动寻求反馈和导师指导
成长策略:
- 别害怕问资深工程师为什么他们更喜欢某种解决方案
- 积极和有经验的同事讨论设计决策和权衡取舍
- 在代码评审时,对前辈的反馈保持开放
- 找机会和前辈做结对编程
从他们的回答中,你能学到资深工程师真正的思维模式,这种智慧无比珍贵。
结论:拥抱变化,聚焦"人"的优势
软件开发一直是一个不断变化的领域——从汇编语言到高级语言,从传统服务器到云计算,现在又从手写代码走向AI辅助开发。每一次变化都自动化了编程的一部分工作,但开发者每次都适应了,并且找到了更多的机会。
正如Tim O'Reilly所说,过去的每次技术革新,"几乎总会带来更多的工作、更多的成长和更多的机会",这次AI的崛起也不例外。AI并非让程序员变得多余,而是重新定义了我们取得成功所需的技能。
要想最大化发挥人类在那30%中的价值,就得关注那些永不过时的核心工程技能:
- 深入理解问题
- 设计清晰的解决方案
- 严格检查代码质量
- 从用户和具体环境的角度出发思考问题
那些能将这些技能与AI工具结合起来的开发者,会远远胜过那些只具备其中一方技能的人。
行动建议
通用建议
- 以成长的心态使用AI:用AI提高生产力,但要坚持弄明白方案为什么有效。把AI当做伙伴,而不是依赖。
- 投入核心技能的培养:加强系统设计能力,思考边缘情况,编写测试,深层次调试。这些长期的职业技能,AI无法替代。
对于高级开发者
- 利用你的经验,通过良好的提示词引导AI,并严格审查它的输出
- 负责任地引导团队如何有效地把AI整合到工作流中
- 将AI帮你节省的时间用于更有挑战的项目,并指导其他人
对于初级开发者
- 着重成为那种真正理解并能改进AI生成代码的工程师
- 以严谨认真闻名——总是仔细测试并复查自己的工作
- 从每个bug和反馈中学习成长
保持适应性
工具会持续演进。你也需要不断更新自己的工具和技能。但只要你的基本功扎实,并拥有协作的态度,就能驾驭任何技术浪潮。
最终思考
AI辅助开发的时代已经到来,让日常编程任务变得更加高效。这解放了我们,让开发者有更多精力投入到那些更有难度、更有意义的创造性任务上。
归根结底,卓越的软件工程从来都是解决问题,而不仅仅是写代码。 AI并没有改变这一点,它只是激励我们将自己的问题解决能力提升到更高层次。
拥抱这个挑战,发挥人类独有的30%价值,我们将在AI辅助编程的新时代中脱颖而出,创造出真正优秀的软件产品。
参考原文:《Beyond the 70%: Maximizing the human 30% of AI-assisted coding》
原文链接:https://addyo.substack.com/p/beyond-the-70-maximizing-the-human