干了十几年开发,我越来越有一种强烈的感受:AI编程这波浪潮带来的最大变化,不是让你少敲了几行代码,而是把过去十几年我在代码里信奉的“编程思想”碾碎重组了一遍。以前我们写程序,核心是在解决“确定性问题”——输入是确定的、逻辑是确定的、输出是可预期的。可当AI真正进入生产环境之后,这套底层逻辑不成立了。
这篇内容不是什么工具安利,也不是模板收藏,我就想聊聊AI时代编程思想的迁移。面对AI,你代码写得好不好,已经不只是“语法够不够熟”“算法够不够快”的问题,而是你还能不能继续保持对系统边界、验证手段、需求本质的把控力。这些东西,恰恰是AI编程最容易被忽视,也最值得重新思考的地方。
写这篇东西,我想分享给三类人:一是刚开始用AI写代码、总感觉生成质量忽高忽低的开发者;二是带着团队做AI应用开发、需要理清楚人机分工节奏的技术负责人;三是虽然还没大规模用AI,但想提前理解“为什么AI会让编程方式发生改变”的学习者。不管你是哪一类,我相信这几点思考都对你有用。
1. 写代码这行的底层逻辑,正在被重写
先聊一个最根本的问题:我们过去写代码,默认遵循的到底是什么规则?想通了这一点,你才能明白为什么AI一进来,很多人会觉得“不对味”。
1.1 传统编程的核心假设:程序是确定性的
从写第一行Hello World开始,我们就被灌输了这样一个观念:程序是对输入做精确变换的机器。你给我一组数据、一个动作,我返回一个明确的结果。这种确定性,是整个软件工程的地基。
类型系统在干什么?它在编译期把所有变量的取值范围钉死。单元测试在干什么?它在运行时校验“给定这个输入,必须输出那个结果”。我们写接口文档、做契约测试、上CI/CD,本质上都属于同一个动作:把不确定性不断压缩,直到程序变成一台“按图纸运转的机器”。
这种编程思想下,代码工程师的角色像是一个“画图纸的人”。你设计数据结构、设计函数边界、设计异常路径,你是整个系统的绝对权威。代码怎么写不是重点,重点是系统在任何场景下都不会失控。这也是为什么老工程师总爱说:“代码给人读的,顺便让机器执行。”
1.2 AI输出的随机性,打破了确定性幻想
AI生成代码完全不同。同一个Prompt你问十次,它能给你十种写法,有的优雅,有的拙劣,甚至有一两次会出现逻辑完全跑偏但表面看起来还挺像样的代码。这不是Bug,这是大模型的生成机制决定的——它本来就是在概率空间里采样,不是在状态机里做确定性跳转。
这就带来一个很扎心的事实:AI无法给你任何关于“正确性”的承诺。它既不能拍胸脯说这段代码100%没有越界,也不能像编译器那样给你一个严格类型检查结果。它的产出更接近“一个经验丰富但偶尔犯迷糊的同事写的初稿”——方向大概率对,但细节必须有人兜底。
很多人刚用AI时特别沮丧,觉得它总写错,反复修也修不干净。其实问题不是AI太笨,而是你还在用“确定性工具”的期待去要求它。它给不了你这个,你越逼它,它越会一本正经地给你编一个错误答案。
1.3 编程思想的根本迁移:从“控制所有分支”到“管理风险”
真正的高手面对AI,第一反应不是让它一口气写完所有代码,而是把工作拆成一个个“风险可控”的小任务。在这个过程中,核心的编程思想发生了转移:从一个“我要把每一行逻辑都写清楚”的执行者,变成“我要在不确定的输出里,搭一层确定性保护壳”的设计者。
保护壳由什么构成?测试、类型、边界校验、Code Review。这些东西以前是软件工程的“质量保障手段”,如今直接变成了“AI编程的核心流程”。没有这层保护壳,AI生成代码越多,系统风险越大;有了这层保护壳,AI生成的代码越多,系统效率越强。
所以我看很多团队用AI效率反而下降了,问题不在于AI行不行,而是他们的编程思想还停留在“代码=确定性产品”的旧模式里。你让AI写一百个函数,却没有任何测试和边界设计,这不叫提效,这叫给自己造了一百个定时炸弹。AI时代的编程思想,第一条就是把“确定性”从代码里挪出来,放到验证体系里。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 从写代码到提需求,需求工程重新成为核心能力
第二个变化,是工程师的工作重心变了。以前我们的日常是“把需求翻译成代码”,现在AI能把大部分代码写出来,真正的技术含量反而退回到了“需求本身”。
2.1 提示词不是玄学,而是微型需求规格说明书
很多人把Prompt当成“咒语”,觉得总有某个神奇的关键词组合能让AI瞬间变成大神。我用了大半年AI编程之后,越来越确信一个观点:好的提示词,本质就是一份好的需求规格说明书。
你去翻一个高质量项目的文档,里面的功能描述、边界条件、输入输出定义、异常处理规则,哪一条是废话?提示词也一样。AI不是你肚子里的蛔虫,它不知道你所谓“做一个统计页面”到底是要按天统计还是按小时统计,是要展示Top10还是全部,是延迟允许三秒还是一个动画。它只能猜,而猜就意味着偏差,偏差就要返工。
我见过太多人吐槽AI写出来没法用,拿过他们的Prompt一看,就两行字:“帮我写个用户登录功能”。这种粒度,哪怕给一个资深的实习生,他也得追着你问半天需求,何况是AI。你越是把需求描述得模棱两可,AI就越会在某个“看似合理但完全不是你想要的”方向上一路狂奔。
2.2 一次完整的AI编程需求,至少包含五个要素
我自己在用AI写业务代码时,会把提示词结构化成下面这个模板,实测下来能大幅减少来回改稿的次数:
plaintext复制系统角色:
你是一名资深后端工程师,技术栈为Java 17 + Spring Boot 3,代码风格遵循团队规范。
背景:
我们有一个订单系统,需要新增一个售后超时自动关闭的功能。
任务:
订单支付完成后,如果超过48小时买家未发起售后申请,系统自动关闭售后入口,并记录一条操作日志。
约束:
1. 只处理“已支付”且“未删除”状态的订单;
2. 使用定时任务实现,支持分布式环境下的幂等执行;
3. 日志记录必须包含订单号、执行时间、操作人(system);
4. 不得修改订单主表结构,扩展逻辑优先使用独立表。
输出格式:
给出实现类的完整代码,包含关键注释;如果存在多方案,请简要说明差异后再给出推荐方案。
这五要素是什么?角色(Role)、背景(Context)、任务(Task)、约束(Constraints)、输出(Output Format)。你别小看这几行字,它本质上就是把过去需求评审会上的口头沟通,变成了AI可以执行的硬性规格。角色约束了它的风格,背景提供了上下文,约束提前把边界钉死,输出格式则保证拿到手的东西可以直接进入评审,不用再花时间整理。
2.3 拆解需求的功力,决定AI产出的上限
还有一个经常被忽视的点:你的需求粒度,决定了AI输出的质量上限。你让它一口气“开发一个电商后台”,它只会给你一个空泛的壳子;你让它“先写完商品列表的查询接口,只包含分页、关键字过滤、状态筛选三个条件”,它就能给你一份相对扎实的可运行代码。
我现在的习惯是,把任何超过半小时才能写完的功能,都继续拆成十五分钟内的“原子任务”。每个原子任务里,只包含一个明确目标、若干个限制条件、一个可验收的结果。写代码的人都知道,一个模块拆得越细,越不容易出问题。这个原则放到AI编程里依然成立,而且比人工作业时更重要,因为AI没有“大局意识”,你给它拆得越细,它跑偏的概率就越低。
拆需求的本质,是你对自己业务的理解深度。你如果连功能边界都说不清楚,AI替你写出来的,只能是一堆需要返工的“半个能用的东西”。所以我的结论是:AI时代,工程师的核心竞争力之一,正在从“写代码的速度”转向“定义需求和拆分任务的能力”。
3. 可验证性优先,把“不确定”变成“可控”
如果说前面聊的是思想层面,那这节就进入实操了。在AI加入生产链路之后,我踩过最大的坑,是“让AI写代码一时爽,交付之后火葬场”。后来慢慢摸索出一套方法,核心就一句话:先定验证标准,再让AI生成实现。
3.1 测试先行:让AI围着你画的靶子打
传统开发里,有人习惯先写实现再补测试;但在AI编程里,我强烈建议反过来,先写测试或者先写接口契约,再让AI补实现。原因很简单——你自己都不知道怎么验证一段代码对不对的时候,AI生成的结果再好,你也没能力判断它好不好。这就像射箭,你得先画个靶子,箭才有参照物。
举个我最近的例子,我要让AI写一个从外部ERP同步订单的接口。我先不急着让它写实现,而是先把接口期望的行为写成一个测试文件:
python复制def test_sync_orders_dedup_by_out_order_id():
"""重复调用同步接口时,相同out_order_id的订单不能重复入库"""
# given: 外部系统返回两条内容相同的订单数据
external_orders = [
{"out_order_id": "A001", "amount": 100.00, "status": "paid"},
{"out_order_id": "A001", "amount": 100.00, "status": "paid"},
]
# when: 调用同步方法
sync_orders(external_orders)
# then: 数据库里只有一条记录
assert count_orders_by_out_id("A001") == 1
写完这个测试之后,我把这段测试代码连同需求描述一起丢给AI,让它去实现sync_orders方法。实测效果比直接让它“帮我写个同步订单接口”好太多。因为测试本身就是最精确、最无歧义的需求描述,AI能直接从断言里推断出它需要处理哪些边界。
3.2 边界校验是AI最容易翻车的地方
我统计过自己使用AI编程时出现的典型错误,排名第一的不是语法错误,而是缺边界处理。AI特别擅长写主流程:正常的入参、正常的逻辑、正常的返回值,写出来赏心悦目。但一旦遇到“列表为空”“金额是负数”“外部接口超时”“并发重复提交”,它常常直接跳过,仿佛这些情况永远不会发生。
所以我的做法是,每次拿到AI生成的代码,先做一次专门的“边界扫描”。我会按照这个清单挨个过一遍:
- 输入参数有没有做空值、长度、格式校验
- 除法和开方操作有没有考虑除零、负数
- 集合操作有没有考虑长度为0、只有一个元素、大量重复
- 外部调用有没有超时设置和失败降级
- 并发场景下有没有幂等性保障
- 数据库操作有没有考虑事务回滚
这个清单看起来基础,但你再回头看AI生成的代码,十次里至少会有三到四次的疏漏。这就是为什么我反复强调,AI可以当“主力”,但不能当“裁判”。它写出的是“理想状态下的实现”,而真正的工程,大部分时间都在处理“非理想状态”。
3.3 Code Review的焦点变了:从“查语法”到“查意图”
以前做Code Review,我们重点看代码风格、性能瓶颈、潜在Bug。现在把AI生成的代码并入代码库时,我的Review重点发生了明显的偏转:
传统Review和AI时代的Review,最大的区别在于:前者是在“判断代码对不对”,后者是在“判断代码是否符合需求意图”。AI写出来的代码通常不是蠢,而是“一本正经地跑偏”。比如你让它实现一个“对订单金额四舍五入到分”,它可能用一个浮点数直接算,结果边缘场景出现精度丢失。代码本身语法完全正确,但它在需求意图层面是错的。
Review AI生成的代码,我给自己定了一个规矩:必须先跑通测试,再逐行看逻辑。因为AI生成的代码,你靠肉眼逐行看很容易被“看似合理”的代码带偏节奏。让它先经过测试筛选,能快速过滤掉大部分逻辑跑偏问题。剩下没被测试覆盖的场景,再结合边界清单人工检查。
3.4 可观测性:让概率性输出暴露得越早越好
最后一条,也是我最近感悟最深的:必须在代码里埋好可观测性。以前我写代码,日志打得相对随意,反正逻辑确定,出问题靠断点也查得出来。但AI生成的代码进生产环境后,你根本没法预判它在某个冷门分支里会做出什么行为。这时候,日志、指标、链路追踪的价值被无限放大了。
我的习惯是,在AI生成代码的入口、出口、异常捕获处,强制让它补充结构化日志,必须包含关键参数和业务标识。你会发现一个好处:当线上出问题时,你能很快判断是“AI代码逻辑本身有误”还是“上下游数据不符合预期”。有了这层信息,你再去反向调整提示词、补测试用例,整个迭代速度会快很多。这个习惯,也让我从“怕AI代码失控”慢慢变成了“即便AI偶尔失误,也能在两三分钟内定位并止损”。
4. AI Agent与系统架构,正在从“主流程”走向“编排者”
前面说的还都是“人机结对编程”的范畴,AI替你写代码,代码最终还是一套确定的程序。但AI编程思想更进一步的变化,发生在AI Agent进入系统架构之后。这个阶段,你面对的不再是“让AI写一个函数”,而是“让AI自主决定如何完成一个目标”。
4.1 传统架构和Agent架构的本质区别
传统架构里,我们一路从单体、SOA、微服务走过来,讲的是“服务之间如何通信、数据如何流转、事务如何保证”。整个系统是一个精密仪器,每个组件都有明确的输入输出,没有哪个环节会“自己拿主意”。
Agent架构完全不一样。一个Agent系统里,核心决策权交给大模型,由它决定调用哪个工具、按什么顺序调用、遇到错误是重试还是换方案。这相当于你把一部分“程序主流程”的指挥权,从一个写死的控制流,交给了一个“大模型指挥调度中心”。
打个比方,传统架构像一个自动化流水线工厂,每台机器只做固定动作;Agent系统更像一个外包项目的负责人,他收到任务后自己拆解,自己去找牛人、找工具、排进度。流水线的优势是确定性和效率,Agent的优势是灵活和对复杂目标的适应能力。
4.2 ReAct模式:让AI“边想边做,边做边看”
在目前的Agent应用开发里,最常见也最值得理解的一个范式是ReAct,即Reasoning + Acting + Observation的循环。它的工作方式是这样:
plaintext复制1. AI收到一个目标(例如:“帮我把销售部的月度报表发到管理群”)
2. AI先生成一个推理步骤(“首先需要从数据服务拉取销售数据”)
3. AI调用一个工具(query_sales_data())
4. AI观察工具返回结果(“数据已返回,共120条记录,格式符合预期”)
5. AI再生成下一步推理(“数据已齐,开始生成PDF附件”)
6. AI调用下一个工具(generate_report_pdf(data))
7. ...直到目标完成
代码层面,它通常长这个样子(伪代码版):
python复制def run_agent(task: str, tools: dict):
messages = [
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": task},
]
while True:
response = llm.chat(messages) # 让模型输出“想法”或“行动”
action = parse_action(response) # 解析模型想调用的工具和参数
if action.type == "finished": # 模型认为任务已完成
return action.result
observation = tools[action.name].run(action.args) # 执行工具,拿到观察结果
messages.append(response)
messages.append({"role": "tool", "content": observation})
作为开发者,在一个Agent项目里,你要写的不再是“业务主流程”,而是下面几层东西:
- 工具层:每一个工具要做什么、入参出参是什么、错误如何返回
- 策略层:哪些场景允许AI自主决策,哪些场景必须回到人审
- 上下文管理层:给AI塞进多少信息,如何裁剪历史对话,避免上下文溢出
- 兜底层:AI连续失败怎么办、超时怎么办、结果校验不通过怎么办
这层思维转换,对老程序员来说是一个不小的挑战。因为过去我们写代码,讲究的是“逻辑闭环”,现在你设计的Agent系统,追求的是“在可控边界内的自我进化”。你的角色,从一个“亲自动手的写码者”,变成了一个“给Agent制定规则和工具箱的编排者”。
4.3 Agent开发的几个关键设计原则
我在做Agent应用开发时,踩过不少坑,也逐渐总结出几条让我非常受益的原则。
第一,工具边界要窄而清晰。 一个工具只做一件事,参数尽量少,语义尽量明确。比如不要做一个“获取订单数据”的万能工具,而是拆成“按订单号查询订单”“按时间范围查询订单列表”“查询订单关联的商品明细”三个工具。AI选择工具的难度下降,出错的概率也会直线下降。
第二,要给AI足够的“路标”。 Agent系统里,AI每一次工具调用,都像在一个陌生的城市里找路。你要在路口竖好路标:工具的description要写得清清楚楚,告诉它什么时候该用这个工具、传什么参数、可能返回什么错误。很多Agent项目翻车,翻在工具描述写得模棱两可,让AI在工具选择上瞎猜。
第三,结果校验不能缺。 Agent完成一个目标之后,输出的结果未必符合你的预期。所以我在Agent系统里会给每个关键节点增加“输出检查器”,用一套规则或用一个小的验证模型,去确认Agent的输出是否完整、格式是否正确、数值是否在合理范围内。这个思想,跟前面讲的“给AI写测试”一脉相承:Agent越是自主,越需要外部校验帮它兜底。
第四,要给Agent留“认输通道”。 不是所有任务Agent都能搞定,也不是所有任务都值得让Agent反复耗着试。我通常会在Agent的System Prompt里明确告诉它:如果连续两次尝试同一工具都失败,或者遇到权限之外的操作,立刻停止执行,把问题抛回给用户。这个设计不是示弱,反而是Agent系统成熟的表现——它知道什么时候该停下来求助,而不是一条路走到黑。
4.4 多Agent协作:从“单兵作战”到“项目组”
再往上一层,是多个Agent配合,类似一个“虚拟项目组”。比如我做过一个内容自动生产系统,里面拆了三类Agent:一个负责收集素材,一个负责撰写初稿,一个负责审核修改。它们之间通过消息队列传递任务和结果,各司其职。
这种架构的设计难点在于任务分解和结果汇总。你要保证Agent A的输出格式能让Agent B顺利消费,还要防止Agent之间互相推诿产生死循环。我的经验是,每个Agent的输入输出都必须是严格定义的JSON Schema,并且每个Agent都要有独立的运行日志。这样任何一个环节出问题,都能快速定位到是哪一个Agent在“捣乱”。
多Agent架构的上限,取决于你的任务拆解能力和每个子Agent的专用工具质量。不要指望一个大模型Agent能包打天下,拆成多个专职Agent,各管一摊事,反而更好控制、更好调优。这也是目前AI应用开发里非常有潜力、也特别考验架构功力的一块领域。
5. 一个真实案例的复盘:让AI完成一个完整的数据报表模块
前面说了不少理论和原则,下面我用一个真实的项目片段,把“AI编程思想”落地的全过程走一遍。这个案例没有用任何炫技方案,就是最常见的“人机结对”,但恰恰是这种日常场景,最能体现思想转变带来的差别。
5.1 任务背景与初始尝试
这个任务是给一个内部运营后台加一个“退款分析报表”模块。业务要求很简单:从订单表里读取退款订单数据,按退款原因分组统计,展示退款金额和退款笔数的每日趋势。
我一开始图省事,就直接给AI丢了一句:帮我写一个退款分析报表的后端接口。结果AI非常积极,很快就给了一个像模像样的接口,表结构也对、连分页都做了。可等我真正拿测试数据一跑,发现几个问题:它把退款原因分组直接用了枚举字符串的原始值,但业务方要求按“A类/ B类/ C类”三个层级汇总;时间维度它默认按自然日统计,但业务方要的是按“退款发起时间”归属到前一天凌晨2点为界的运营日;还有,它完全没有考虑退款金额为负数的异常数据,导致总金额计算直接崩了。
这轮下来,我意识到问题出在需求本身不够精确,不能怪AI。于是我不再挣扎着让它“猜”需求,而是先自己把需求拆清楚、固化成测试用例和接口契约,再返工。
5.2 重构后的完整流程
第一,我先把统计口径写成了一份伪需求文档,发给AI:
plaintext复制任务:实现退款分析报表查询接口
入参:startAt、endAt、reasonLevel
出参:日期、退款原因分组名称、退款金额合计、退款笔数合计
统计口径:
1. 从退款订单表 refund_order 中查询数据;
2. 时间过滤条件:refund_create_time 在 [startAt, endAt) 之间;
3. refund_amount 必须大于0,负数和0不计入统计;
4. 分组字段:reasonLevel 为A时,按 refund_reason_category 分组;为B时,按 refund_reason_sub_category 分组;
5. 日期维度:以 refund_create_time 减去2小时后,取日期,作为运营日;
6. 结果按日期升序、金额降序排列。
需输出的文件:
1. 接口定义及DTO;
2. SQL查询实现;
3. 单元测试,覆盖统计口径、异常金额过滤、运营日边界。
第二,我先不急着要结果,而是要求AI“分步输出”。让它先给接口定义和SQL方案,我确认没问题,再让它生成完整代码。分步做的好处是,中间任何一步跑偏,我都能及时发现,不用等它闷头写完一大堆才发现方向全错了。
第三,代码生成之后,我把重点放在补测试和边界验证上。我手动补充了几个AI大概率漏掉的用例:空数据集合、退款金额全是负数、跨月边界、时间区间为空等。补齐测试后全部跑了一遍,发现有一个运营日边界计算没写对——AI把它写成了“减2小时后取日期”,但实际上有人告诉我“凌晨2点前归属前一日”的正确写法要考虑时区。那一处,是我自己手动修正的。
5.3 案例带给我的三个判断
这个案例前后耗时大约一个下午,其中真正我自己动手写代码的时间大概不到五十分钟,剩下的时间都花在需求拆解、测试设计和Review验证上。如果按传统开发方式,这个模块我一个人从设计到写完再到自测,至少要一整天。效率提升是真实的,但这个提升的取得,恰恰靠的不是“让AI更多地产出代码”,而是“我把更多精力放在AI之前和AI之后”。
这也验证了我前面说的几件事:第一,模糊需求,AI必跑偏,拆得越细越稳;第二,测试是AI代码质量的锚点,没有测试,AI生成的代码就像脱缰野马;第三,AI能做主力,但最后的边界兜底必须是你自己来。你越理解这条分工线,AI用起来越顺手。
6. 常见问题与避坑清单
最后,把我这段时间在AI编程里反复踩的坑和沉淀下来的方法,整理成一份速查手册。你可以把它当checklist用,也可以在AI生成代码后逐条对照。
6.1 高频问题速查表
| 现象 | 根本原因 | 解决思路 |
|---|---|---|
| AI生成代码反复改也改不对 | 需求描述太模糊,AI靠猜 | 把需求拆成原子任务,补齐边界约束和验收标准 |
| 代码主流程正常,边界case全翻车 | 大模型更擅长常见路径,忽略冷门分支 | 用边界清单专项检查,补测试用例驱动修复 |
| 明明给了示例代码,AI还是不听 | 上下文太长,示例权重被稀释 | 把关键示例放在离任务最近的地方,精简无关上下文 |
| AI生成的接口与现有代码风格不一致 | 没在System Prompt里定义风格和技术栈 | 给AI“角色设定”,提供代码风格片段作为参考 |
| Agent工具调用时好时坏,经常选错工具 | 工具描述不清,AI依赖猜 | 重写工具description,明确触发条件、参数含义、输出样例 |
| Agent遇到异常反复重试,消耗大量Token | 缺少兜底策略和退出机制 | 在Prompt中增加“连续失败两次就中止求助”的规则 |
| AI生成大量冗余代码,维护成本高 | 提示词中没有约束代码量 | 要求“最小化实现”,并在Review阶段删除重复逻辑 |
| 测试通过但生产环境出问题 | 测试数据和真实数据分布差距大 | 补充真实样本测试,加强可观测性,灰度上线 |
6.2 工具选型的经验谈
现在AI编程工具和框架的迭代速度非常快,我也没办法给出一个“永远正确”的推荐清单,只能说几条选型原则,供你参考。
如果是日常写代码、做小模块,我建议优先用能和IDE深度集成的辅助编程工具。它们最舒服的场景是“写函数、补全代码、生成单测”,不需要你切换窗口。这类工具的边界是,它们对全局架构的把控较弱,更适合程序员自己为主、AI为辅的工作模式。
如果是做AI Agent应用之类的系统级开发,我更倾向于用大模型API加代码框架组合的方式。比如用LangChain、Spring AI这类框架,配合一个中大参数模型做核心推理。这类方案的优势是逻辑可控、可定制、便于平台化,缺点是上手门槛更高,需要你自己写工具层和编排逻辑。
选型的关键不是跟风追热词,而是想清楚你的痛点到底是“代码写不快”还是“系统需要自主决策”。前者选IDE辅助工具就够了,后者才值得投入精力研究Agent框架。不要在写普通CRUD的时候硬上Agent框架,也不要在做复杂自动化决策的时候指望IDE自动补全能帮你搞定,工具和场景得匹配。
6.3 我个人的四条实操心得
第一,人机协作时,你要扮演“项目经理”而不仅是“程序员”。你把需求拆清楚、把验收标准定好,AI才能真正发挥作用。很多团队用不好AI,是把自己定位成“监工”,只盯着AI写了多少代码,却不去解决需求、测试、边界这些更关键的问题。
第二,上下文不是越长越好,而是越准越好。我给AI项目塞信息时,会刻意精简:只留直接相关的文件摘要、最核心的业务规则、当前的验收标准。一堆无用代码全扔给它,反而会让它在“哪个才是当前重点”上面犯迷糊。
第三,AI编程的时间分配比例会变,但人这一侧的总工作量不会消失。以前80%写代码、20%测试和设计,现在可能变成20%写代码、40%需求拆解、40%验证Review。如果你觉得“用AI之后居然比以前还累”,大概率是因为你没有做好这个时间再分配,还以为自己在过去那套工作流里。
第四,永远保留对AI输出代码的解释权。我的意思是,你至少要能从逻辑上理解AI生成的每一段代码在做什么,并能在必要时手动修改它。AI可以帮你生成代码,但不能替代你去理解自己的系统。那些号称“完全不用看代码,全靠AI”的做法,短期看起来爽,长期就是给自己埋雷。
说到底,AI时代编程思想的转变,说白了就一件事:从追求“代码的确定性”,变成追求“系统的可控性”。代码可以由AI来写,但边界、验证、架构、业务理解这些七寸,必须牢牢握在自己手里。想明白这一点,你手里那些AI工具,才算真正被用对了。
