AI 辅助编码的最后一公里(下篇):如何用好AI时代编程中'人类独有的30%'

12 分钟阅读
AI编程软件工程编程技能人工智能开发者成长

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工具结合起来的开发者,会远远胜过那些只具备其中一方技能的人。

行动建议

通用建议

  1. 以成长的心态使用AI:用AI提高生产力,但要坚持弄明白方案为什么有效。把AI当做伙伴,而不是依赖。
  2. 投入核心技能的培养:加强系统设计能力,思考边缘情况,编写测试,深层次调试。这些长期的职业技能,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