标签归档:AI 编程

开发同学在 vibe coding 后,面对代码黑盒应该做什么

最近半年,我们在代码库中看到越来越多这样的提交:一个功能完整的 PR,包含数千行代码,单测覆盖率达到 85% 以上,本地集成测试全绿。然而在提测演示或做方案复盘时,提交代码的工程师无法在不借助模型的情况下,准确描述出某条核心业务链路在异常分支下的具体状态扭转过程。

代码由大模型直接生成,工程师负责提供提示词、粘贴报错、运行命令以及验收功能。这种被称为 vibe coding 的开发模式正在研发团队中快速蔓延。开发人员正在迅速丧失对代码内部实现细节的掌握。

如果一个开发人员完全不需要知道代码内部发生了什么,只要在外部通过输入输出来验证系统,这项工作换成一个不懂技术的产品经理或业务人员,结果并没有本质区别。 当编写代码的动作被模型接管之后,技术人员本身的专业壁垒就会受到直接冲击。

在实际工程推进中,不懂底层原理的使用者在与模型交互时,会迅速遇到一道无法逾越的墙。当系统行为偏离预期,或者出现跨多个子系统的复合型偶发故障时,缺乏系统内部认知的人甚至无法组织出有效的排查提示词。他们只能把控制台的错误堆栈反复扔给模型,陷入尝试、失败、再尝试的低效死循环。

当然,这种情况在模型和 Harness 越来越强的情况下,越来越少了。

当前,判断开发工程师价值的关键指标,在于具体业务子领域是否还需要我们深入理解系统的内部实现,以及需要理解到何种程度。

复杂系统的黑盒沉降

我们原本设想黑盒开发只会停留在低风险的边缘地带。那些生命周期以周计的营销脚本、孤立的数据管道、或者一次性的内部报表工具,被开发者直接当成黑盒丢给模型演化。只要输入和输出符合预期,内部堆叠了多少冗余逻辑,人类完全不需要过问。

这种边界在过去半年里被全面打破。

在真实的研发场景中,复杂的长周期核心系统同样正在被迅速黑盒化。系统的实现逻辑已经开始脱离了我们的掌控。

有些系统已经没有任何一个工程师完整读过底层实现,所有人都在依靠行为验收来驱动迭代。

这一变化的驱动力来自工程吞吐量的极端失衡。过去由一个六人资深团队耗时三个月才能搭建完的复杂状态机,现在借助高阶推理模型,两天内就能生成数万行代码,并配套数千个通过的单元测试与端到端用例。当代码生成的速率超越人类视网膜与大脑工作记忆的物理极限时,人工逐行审查机制就失去了事实上的防御能力。

我们开始被迫接受这种现实。 在面对极其庞大的调用拓扑和复杂的上下文依赖时,我们已经放弃了对抽象语法树的微观控制,转而把整个复杂系统视作一个自组织的、不透明的动力学网络。

这种转变直接剥夺了传统工程学给我们带来的安全感。当不懂内部机理的团队开始掌控这种复杂黑盒系统时,表面上的研发效率提升与潜伏的系统性崩溃风险就绑定在了一起。

演化哲学的工程代价

把软件代码视同生物 DNA 序列,认为系统可以在目标函数的约束下自然演化,是黑盒派的核心立论。生物演化积累了大量的无用突变、历史包袱与内含子序列,依然能在残酷的自然选择中维持机体运转。在很多开发者的设想里,只要外部的行为约束足够严格,内部的代码哪怕堆积成山,系统也能通过模型的自我修剪持续向后演化。

在复杂系统中使用演化哲学,会遭遇物理层面的硬约束。

软件系统与生物体存在本质区别。生物体拥有物理世界施加的绝对法则限制,而软件的目标函数是由人类通过测试套件和契约规范手工定义的。人类工程师编写的测试用例,无论规模多么庞大,都只能覆盖有限的状态空间。

当模型在复杂的业务系统里自我演化时,它会不断寻找使测试用例全绿的阻力最小路径。在处理一个涉及分布式两阶段提交的业务分支时,模型为了修复一个并发竞争的偶发报错,可能会在关键路径上引入一段极其隐蔽的全局读写锁,或者擅自放宽事务隔离级别。从行为验收的角度看,那十几个报错的测试用例确实顺利通过了。

这种微小的局部优化在多轮提示词和版本迭代后,会引发全局架构的雪崩。并发瓶颈从数据库行锁被硬生生搬运到了应用层内存,系统的吞吐量在特定流量脉冲下出现断崖式下跌。由于团队没有人理解这段被模型演化出来的内部调度机制,监控指标只能呈现出 CPU 软中断升高与连接池耗尽,排查人员根本无法把这种宏观症状与某个被模型悄悄修改的同步原语对应起来。

生物演化历经数十亿年,其代价是无数个体的死亡与物种灭绝。在商业软件工程中,任何一次演化走入死胡同,换来的都是真实的资损、核心数据损坏与长达数小时的服务不可用。

重写的大坑与暗知识

当代码产出如此快速时,以前不敢做的重构操作,现在频频出现在现实之中。

并且对于黑盒的代码,当无法维护时,会有人开始直接让 AI 来重写了。

对于极度依赖隐性规则的复杂系统,重写会是一个大坑。

复杂系统的内部实现中,沉淀了海量的暗知识。这些暗知识由线上历史事故、冷门协议的缺陷规避、上下游陈旧系统的怪异行为,以及特定硬件环境下的性能妥协交织而成。在漫长的迭代周期里,这些细节几乎不可能被完整记录在需求文档或提示词工程的上下文中。

当一个承载核心业务的复杂黑盒系统遭遇架构死锁时,工程师试图命令模型从零重写一套全新的系统。模型根据现有的规范文档和接口契约,迅速生成了一个结构干净、抽象完美的新架构。但在接入真实生产流量的瞬间,系统会被各种意想不到的边缘异常彻底击穿。

老系统中那些看似丑陋的防重试逻辑、硬编码的延时等待以及反常的类型转换,恰恰是系统在生产环境存活多年的抗体。在黑盒演化过程中,这些抗体没有被人类工程师转化为显性的设计原则,而是散落在无法辨识的代码废墟中。

当模型完全接管了代码,人类不再阅读实现细节,这些暗知识就随着上下文窗口的更迭永久失传了。重写一个复杂黑盒系统,意味着要重新把过去五年踩过的所有生产故障从头经历一遍。这种重写代价根本不是代码生成速度能够弥补的。

工程师的剩余价值

在复杂的长周期系统也逐步被黑盒代码吞噬的周期里,技术团队内充斥着工程师技能贬值的焦虑。天天面对自己看不懂或者懒得去看的自动化生成代码,开发人员的专业尊严受到了直接侵蚀。

开发人员的剩余价值非但没有消失,反而在系统复杂度失控的悬崖边缘被急速放大。只不过,这种价值的落点发生转移。

编写算法、拼装框架、修补语法的低阶体力劳动被彻底剥离。工程师的核心价值,收敛为以下几项不可替代的底层能力:

第一,是定义系统物理边界与失败容忍度的系统论设计能力。当实现细节彻底黑盒化,整个系统的生存完全取决于外部边界是否足够坚固。如何设计熔断逻辑,如何划分数据强一致性与最终一致性的边界,如何定义灾难恢复时的降级降速策略,这些决策直接关乎企业的商业生死,不可能托付给缺乏全局上下文责任感的模型。

第二,是穿透软件抽象层、理解物理基础设施底层的能力。不论上层代码被模型演化得多像一个不可名状的黑盒,当它最终被编译成汇编指令落到物理 CPU、内存条、网卡与固态硬盘上时,它依然必须服从物理世界的客观定律。

在跨机房专线延迟突增、底层存储硬件出现坏块、操作系统内核调度产生微秒级锁死等极端场景下,缺乏真实物理世界感知的黑盒系统会瞬间丧失全部应对能力。此时能够挽救全局的,永远是那些清楚 Linux 内核参数配置、深刻理解 TCP 拥塞控制算法、明白数据库 B+ 树与 LSM-Tree 存储引擎底层权衡的工程师。

第三,是决定何处必须保留白盒的战略决断力。在复杂的业务全景图中,我们必须划出一条绝对的红线。在这条红线之外,允许模型疯狂试错、野蛮生长、黑盒演化,以换取交付速度;而在红线之内,在涉及资产结算、核心密码学协议、权限鉴权核心以及数据持久化原子性的基石模块上,我们必须死守白盒阵地,每一个状态位、每一行锁逻辑、每一个并发屏障,都必须由人类大脑完全理解、推演与严格审计。

拥抱黑盒演化是应对代码生产力爆发的必然妥协,但盲目迷信黑盒则是工程理性的自杀。

白盒边界的落地

不过,把红线画出来,还远远不够。

如果白盒意味着所有代码都要由人逐行理解,那么几万行的关键模块很快就会耗尽团队的审查能力。如果白盒只意味着安排一位资深工程师签字,它又会退化成一种形式上的责任分配:代码已经合入,签字的人却无法解释失败路径。

从实际出发,白盒要求可以落实到几个可以检查的问题上:

这个模块维护哪些状态?哪些状态转换绝对不允许发生?一次操作在什么位置产生不可撤销的影响?执行中断以后,如何判断它究竟完成到了哪里?修改这里,会影响哪些调用方的既有假设?

负责的工程师需要能够独立回答这些问题,并且指出对应的实现位置。

这里仍然允许模型生成代码。我们限制的是未经理解的关键变更进入系统。生成与理解可以由不同的过程完成,但理解不能被一份自动生成的说明替代。

边界还需要沿着依赖关系检查。

假设一个关键模块本身经过了严格审查,但它依赖的公共组件被模型修改了失败处理方式,原有结论就可能失效。白盒边界如果只按目录划分,很容易漏掉这种变化。把关键模块依赖的行为约定一起纳入审查范围,尤其是超时、重试、错误返回和状态写入的语义。

这样做会拖慢部分公共组件的修改速度。我们需要接受这笔成本,也需要控制它的规模。如果一个普通改动总要召集半个团队评审,说明关键模块依赖了过多外部细节,应该考虑收缩接口和状态共享范围。

白盒区域也不必永久固定。一个模块的状态被拆出、接口变得稳定、替换方式得到验证之后,可以降低内部审查强度。一个原本独立的工具开始承接共享数据写入,就应该重新评估。

「核心业务」四个字无法覆盖整个代码库。范围画得太大,最后往往只能整体降低执行标准。

验证独立

黑盒能接受到什么程度,取决于我们能够从外部验证什么。

这里最容易出现的问题,是实现、测试和验收结论都来自同一条生成链路。模型先理解需求,再生成代码,随后根据代码补齐测试,最后告诉工程师所有测试已经通过。

如果最初的理解遗漏了一个条件,这个条件就可能同时从实现与测试中消失。

覆盖率无法自动发现这种遗漏。某一行代码被执行过,只能证明测试经过了那里。异常分支执行以后留下的状态是否正确,仍然需要另外检查。

因此,关键验收条件在实现之前确定。至少把正常结果、禁止出现的结果,以及失败后允许留下的状态写清楚。

尤其要检查那些跨越多个动作的过程:前一个动作已经完成,后一个动作失败,系统应该停在哪里?用户重新发起请求时,允许重新执行哪些部分?超时之后,调用方能否把结果当成失败?

这些问题没有答案时,继续增加测试数量并不能补上设计缺口。

模型可以帮助枚举场景、生成数据、执行验证。涉及业务承诺的条件,需要由了解系统的人确认。验收阶段还应保留独立于当前实现的依据,避免模型通过修改预期结果,让实现重新获得通过。

测试本身的变更也要审查。

删除一个失败用例,有时是因为旧需求确实失效,有时却只是当前实现暂时无法满足它。二者在测试报告上没有区别。对稳定约束的删除、放宽和跳过,我会要求单独解释,不能夹在几千行功能改动里一起合入。

验证强度当然有成本。复杂故障场景需要准备环境,大规模数据验证消耗资源,长时间运行的检查会增加反馈延迟。我的做法是分开执行频率:局部检查跟随每次修改,影响面较大的验证放在合入和发布环节,昂贵的故障验证集中覆盖关键路径。

目标是让不同风险都有对应的检查位置,同时避免每次修改都等待一套庞大的验证流程。

限制单次变化

代码生成速度上来以后,团队很容易把更大的任务直接交给 agent。

一个需求里同时包含接口调整、状态机修改、数据结构迁移和历史代码整理。模型可能一次完成,最终差异也显得相当统一。但人工审查时,很难再把每一处变化与最初的动机对应起来。

发生回归以后,定位范围同样会扩大。

我们要控制单次变更所包含的独立决策数量。功能增加、结构整理和历史兼容性清理,尽量分开进行。每一部分都需要有能够单独解释的目的,以及对应的验证结果。

这里不适合机械地规定 PR 行数。一次自动生成的重复性修改可能涉及很多文件,实际语义变化很少;一个几行的条件调整,也可能改变整个系统的状态约束。

这次只改变了哪些行为,哪些证据支持这些变化,以及如何撤销?

让 agent 先提交修改计划,也有帮助。人可以在生成大量代码之前检查它准备触及哪些模块,是否引入新的共享状态,是否扩大已有接口的职责。

当然,计划不能被当成执行事实。模型在修复过程中可能偏离原计划,最终仍然需要核对实际改动。尤其要检查那些为了让测试通过而新增的兼容分支、默认值和异常处理。

另外,权限应该跟着风险划分。修改实现、调整验收标准、操作生产数据,是三个不同等级的动作。不能因为 agent 已经获得代码仓库的写权限,就顺带允许它自行决定另外两件事。

保留接管能力

即便验证做得足够认真,团队仍然需要准备一种情况:系统出了问题,agent 连续几轮都没有找到原因。

这时工程师需要接管什么?

首先要接管的是故障判断和损失控制。当前还有哪些请求正在写入?哪些动作可以暂停?哪些状态已经无法直接撤销?继续重试是否会重复产生副作用?

如果这些问题无法回答,贸然修复代码可能让后续处理更困难。

因此,关键路径上的可观测信息需要围绕状态变化设计。只记录异常堆栈,通常不足以判断一个业务动作完成到了哪里。需要能够把一次操作的开始、关键写入和最终结果关联起来,同时区分「没有执行」与「执行完成但没有返回」。

信息越多,记录与检索的成本也越高。涉及数据内容时,还需要限制记录范围。我不会要求把所有局部变量都写进日志,而会优先保留能够判断执行阶段和副作用的信息。

恢复方案也要区分代码与数据。

代码版本退回以后,新版本已经写入的数据仍然存在。旧实现能否读取这些数据,正在执行的任务能否继续,外部已经发生的动作如何处理,都需要提前确认。一个发布平台上存在的回滚按钮,不能证明业务状态能够恢复。

团队可以让模型生成恢复方案,但需要通过演练检查其中的假设。演练时暴露出一个无法判断完成状态的步骤,就应该补充相应的记录或操作方式。

这些工作会占用原本可以拿来交付功能的时间。我们要优先安排给那些失败后难以恢复、影响范围又大的模块。对于可以直接丢弃并重新生成的结果,没有必要采用同样的投入标准。

我们也不应该假设所有故障最终都需要人手工解决。agent 能完成的排查可以继续交给它。人需要保留的是判断它是否仍在有效推进的能力,以及必要时改变排查方向、停止危险操作的权限。

把暗知识留下

关于暗知识,还有一个地方需要说得更准确。

只要代码、历史记录和运行证据仍然存在,很多知识就有机会被重新找回来。但随着版本累积,重新发现它们需要的时间会增加。故障发生时,团队未必有这个时间。

在每次关键修改中,顺手留下三类信息:这段特殊处理保护了什么约束,当初在什么条件下出现过问题,以及什么证据能够证明它将来可以被删除。

单独写一句「兼容历史逻辑」,对后来的维护者帮助很有限。模型也无法据此判断,这段逻辑究竟承担了必要的保护,还是早已失效的补丁。

记录需要贴近决策发生的位置。约束可以进入验收条件,历史问题可以转化为回归场景,难以自动验证的条件则保留在模块说明和变更记录里。没有必要把所有知识都塞进一份不断膨胀的架构文档。

尤其要防止另一种浪费:模型生成了大量说明,团队却没有检查其中哪些是事实,哪些只是根据代码推测出来的意图。

「当前代码这样执行」和「系统必须这样执行」需要分开记录。前者描述实现,后者约束未来修改。混在一起,模型可能把历史偶然行为永久固化,也可能把必须保留的规则当成可整理的细节删除。

重写之前,这些记录应当成为核对清单。找不到来源的特殊逻辑,需要进一步追踪,不能仅凭实现难看就判定它没有价值。

同样,也不能把所有历史补丁都当作不可触碰的要求。长期保留失效约束,会让新系统继续背负旧系统的复杂度。删除它们需要证据,保留它们也应该能够说明理由。

重新分配时间

这会改变工程师日常工作的时间分配。

一部分原本用于编写常规实现的时间,可以转移到约束定义、关键路径审查、失败恢复和演化设计上。另一部分确实可以节省下来,用于交付更多需求。我们没有必要为了证明专业价值,把节省的时间全部重新填满。

不要求所有工程师都深入内核、网络协议和存储引擎。基础设施知识在某些问题上非常关键,但大量故障仍然来自业务状态、依赖关系和错误的边界假设。团队需要根据系统的风险分布建立能力,不能用一套底层知识清单替代具体判断。

对于个人:能否识别模型没有回答的问题,能否发现验证结论依赖了未经确认的假设,能否在陌生实现中定位关键状态,以及能否解释一次技术选择会给后续修改增加什么成本。

这些能力也需要通过实际接触代码培养。如果年轻工程师长期只负责转发需求和粘贴错误,却没有机会追踪实现、分析失败、参与关键决策,团队几年后可能会出现知识传承的问题。

因此,我们需要让工程师对完整的局部问题负责:提出约束、使用模型实现、解释关键行为、验证异常路径,并参与上线后的问题处理。模型可以承担其中大量工作,但负责的人需要能够检查结果。

团队层面的评价也要变化。生成了多少代码、完成了多少轮对话,都不适合作为主要指标。我们需要观察一次需求从提出到稳定运行花了多久,评审与返工占用了多少时间,线上问题是否反复出现,以及一个模块是否越来越难由其他人接手。

如果编码时间缩短了,排查和返工时间却持续增长,就需要调整当前流程。交付数量暂时增加,也不能掩盖恢复能力和知识覆盖的下降。

回到最初那个数千行代码、测试全绿的 PR,我们不会因为提交人无法背出全部实现就否定它。

但如果他无法解释核心异常分支的状态变化,我们要要求补上这部分理解:追踪关键写入,核对失败后的状态,检查重复执行的后果,再决定是否需要增加验证或修改实现。

这个 PR 可以继续由模型完成修改。合入之前,负责的工程师需要知道哪些结论已经得到验证,哪些风险仍然存在,以及出问题以后应该从哪里开始处理。

以上。

AI Coding 时代如何有效度量研发效能

在 AI Coding 时代,当我们说提升效能 50%,从老板的角度,那应该要干掉 50% 的人。

但又不能真这么干,这是一个简单的财务逻辑,也是一种本能的反应。

但研发又不是完全标准化的流水线。AI 在各环节都有提速,但对于需求理解的一致性,线上兜底,发布治理这些环节没法完全同步提速。

人是可以砍,但最终系统脆弱性、技术债务和交付风险一起放大。

以 AWS 为例,公众知道的类似线上故障发生不止两次了。

并且在一些大的公司,也出现了开发人员不知道自己写的是什么的情况,对于大公司一套巨大的工程体系,如果是一个完全的黑盒,没有人知道里面发生了什么,出现大的问题只是迟早的事情。

聊远了点,回到今天的主题,如何有效的度量研发效能。

当我们用上 AI Coding 之后,在上面所说的整体提效的逻辑中,我们需要细化这个效能的度量逻辑。

同样规模的团队,能不能交付更多有效价值,能不能把交付周期压短,能不能在不明显增加事故和历史债务的前提下,把过去做不到的事情做起来。

从指标的逻辑来看,DevOps 里那套大家已经很熟的「四个指标」——部署频率、交付周期、变更失败率、平均恢复时间依然是很能打的一组指标。尤其是 TTM,也就是从需求进入系统到真正产生用户价值的时间,还是王牌指标。

AI 时代,研发效能的核心指标体系要刷新,但不能推倒重来。

整个度量的逻辑不仅仅在于指标,同时也在于到底把指标绑在什么对象上,怎么解释,怎么防止它们被 AI 放大之后失真。

度量谁

一个问题,AI 产出要不要单独度量?

建议是:可以记录,不要单独考核。

因为 AI 没有责任主体。它不会背 SLA,不会参加事故复盘,也不会在需求失败时承担后果。

如果我们把「AI 生成代码占比」或者「AI 采纳率」当核心 KPI,很快就会把团队带进一个很熟悉的坑:为了优化指标而优化行为,最后牺牲真实交付质量。

研发效能度量一定要有清晰主体。这个主体通常有三层:

  • 工程师个体
  • 团队
  • 价值流或产品线

在 AI 时代,我更建议把主分析单位放在团队和价值流,但个体数据也需要通晒,人与人还是需要比较,并且人的实际使用情况也需要观测和度量。

说到个体度量,可能会有人觉得开始卷了,回到了粗暴管理

我觉得个体数据要看,并且要公开到一定程度。否则团队里谁在真正把 AI 用进生产,谁还停留在传统写法,谁能稳定地产出高质量变更,谁在用 AI 快速制造垃圾代码,管理层根本看不见,辅导也无从下手。问题从来不在于能不能比较,问题在于拿什么比较,以及比较之后准备用它干什么。

可以把「个体可观测」和「个体直接考核」分开。前者要做细,后者要克制。个体层的数据主要解决三类问题:第一,识别使用差异。第二,识别能力短板。第三,识别风险人群。比如有的人 AI 使用频率很高,但交付周期没有改善,返工率还在上升,这通常不是工具问题,是任务拆解、约束描述、结果校验出了问题。还有一种人,表面上 AI 使用不多,但需求稳定、事故极少、关键模块掌控力强,这类人往往承担了大量隐性复杂度,单纯看「人均产出量」会被严重低估。

所以个体层该看的,不是「生成了多少」,而是「借助 AI 之后,个人交付行为发生了什么变化」。可以重点盯几组数据:需求从领取到合并的中位时长、PR 平均大小、评审往返次数、回退率、线上问题关联率、测试补充情况、跨模块变更占比、AI 建议采纳后的修改幅度。这里面真正有价值的,不是某个数字本身,而是前后变化和人与人之间的分布差异。一个人 AI 采纳率高,不说明他强;采纳率高、评审一次过、上线后稳定,这才说明工具真的转化成了产能。反过来,另一个人采纳率也高,但 PR 越来越大、review 来回打架、上线后热修频繁,这种数据就已经在报警了。

个体数据为什么要通晒?

团队协作里,很多能力本来就是相对的。谁的需求吞吐稳定,谁总能把复杂变更压在可控范围里,谁的变更老是把测试链路打爆,谁对 AI 的依赖已经超过了校验能力,这些不能永远藏在「一团和气」后面。通晒的价值是建立真实参照系。工程团队里最怕的一种状态,是大家都觉得自己做得差不多,实际上产出质量、稳定性、问题密度差了一倍以上。数据如果不拉平,组织就只剩印象管理。

当然,个体通晒有前提。第一,口径必须统一。第二,不能只晒单一指标。第三,必须配上下文。比如一个人长期负责遗留系统改造,变更失败率高一点、交付周期长一点,很正常;另一个人长期做边缘功能,吞吐高也不稀奇。脱离任务难度做横向比较,最后一定会逼着大家抢简单活。我的经验是,个体层至少要把任务类型、系统风险等级、需求大小这几个维度一起带上。不然表面上是在做精细化管理,实际上是在奖励投机。

团队层和价值流层还是主轴,因为真正的交付结果最终只能在这两层闭环。一个工程师再强,也没法单独决定发布窗口、联调效率、测试环境、跨团队依赖和灰度策略。AI 时代尤其如此。代码写快以后,瓶颈更容易从个体编码能力转移到团队协作和系统机制上。所以如果一个团队整体 TTM 没降、变更失败率在升、MTTR 也没有改善,那就算团队里有几个人个体数据很亮眼,也不能说明这个组织真的变快了。很多管理者容易被「明星工程师 + AI」的局部高产迷惑,这是很危险的。效能度量最终看的是系统,不是看谁在局部冲得猛。

价值流这一层更关键,因为它决定了管理层看到的是局部繁荣,还是真实效率。一个需求从业务提出到用户可用,中间穿过产品、研发、测试、运维、合规、数据、客服,任何一个环节卡住,前面所有 AI 提速都白搭。很多团队以为自己效能不差,问题出在开发不够快;把价值流拉直一看,开发可能只占整个周期的 20%。剩下 80% 都耗在等待、确认、返工和协调上。这个时候你还在研究个人 AI 采纳率有没有上去,说实话,方向已经偏了。

所以,三层都要度量,但角色不同。

  • 个体层,解决的是识别差异、暴露问题、推动辅导。
  • 团队层,解决的是交付责任和工程能力。
  • 价值流层,解决的是端到端效率和组织瓶颈。

如果非要再说得更落地一点,可以这样处理:

  • 个体层数据全量采集,有限通晒,谨慎用于绩效
  • 团队层数据作为正式经营指标,进入月度复盘
  • 价值流层数据进入管理层决策,用来推动跨部门改造

这里还有一个问题:AI 使用情况本身,确实会逐渐演化成个体能力差异的一部分。今天还可以说是工具习惯差异,再过一段时间,它会越来越接近工程生产方式差异。有人能用 AI 快速完成问题拆解、方案比选、代码生成、测试补全、文档整理,再自己完成严格校验;有人只是把 AI 当高级补全,甚至生成什么就提交什么。两者的产出质量和成长速度,一定会拉开。这个差异如果不观测,组织是在主动放弃识别新能力结构的机会。

还是那句话,观测不等于迷信,比较不等于唯排名论。个体层数据要服务于两件事:培养更强的人,提前发现风险。它不能把团队带回那种老派的、只会按数字压人的管理习惯。因为 AI 时代最不缺的,就是表面上很漂亮的数字。真正缺的,是能把这些数字放回具体工程语境里解释清楚的人。

量结果

我一直不太赞成把研发效能拆成「过程指标 vs 结果指标」两个完全对立的东西。工程里没这么清楚。很多大家嘴里的结果指标,实际上掺了很多过程含义。代码行数就是典型例子。

很多人说 LOC 已经过时,这话只说了一半。更准确一点:LOC 从来就不是好的一线效能指标,在 AI 时代更差。

原因有三个。

  • 生成成本塌了:过去一个人写 500 行和写 50 行,投入成本通常不同。现在 AI 补全、生成、重构、搬迁代码,几分钟就能吐出成百上千行。代码行数和人类投入的相关性被打穿了。
  • 噪音变大:AI 很容易生成「看起来很完整」的实现:参数校验、日志、适配层、重复样板、冗余抽象全都给你带上。LOC 涨得飞快,但业务价值未必增加。
  • 债务被掩盖:最麻烦的是第三点。AI 会让代码库存增长速度明显快于架构治理速度。表面上看,产出变高了;往后看,维护成本、理解成本、回归成本都在涨。LOC 会把这个问题盖住。

所以代码行数其实没有啥意义,只当成代码影响范围的辅助信号,别当产出指标。

那真正该量什么结果?

可以分三类。

交付结果

这是最基础的一层:

  • 需求交付数量
  • 需求交付周期
  • 按期上线率
  • 有效发布次数
  • 版本回退率

这里要提醒一下:上线需求数也很容易失真。
因为需求切得越碎,上线数越好看;但碎到一定程度,用户感知价值可能没有提升,反而多了协调成本。

所以需求数量一定要配合需求粒度标准化。最少要把需求分成几类:小修复、小功能、中型功能、跨系统项目、技术治理项。不同类型分开统计,不然一张表里什么都看不出来。

业务结果

如果团队做的是业务研发,最终还是得往用户影响上落。常见的:

  • 某类功能从提出到用户可用的时间
  • 用户覆盖范围
  • 功能使用率
  • 转化率变化
  • 关键漏斗改善
  • 客诉下降
  • 线上稳定性对收入的影响

很多技术管理者不敢碰业务指标,怕研发背锅。我反而觉得该看,但不要简单归因。业务结果可以做关联分析,不要粗暴做责任归因。比如某个推荐功能两周上线了,但实验效果一般,这不等于研发效能差。研发效能差,应该体现在 TTM 过长、试验成本过高、回滚困难、迭代慢,而不是实验结论本身不好。

工程结果

如果团队做的是平台、基建、中间件、工具链,不能硬套 GMV、转化率这种业务指标。这个场景下我更看这些:

  • 接入团队数
  • 接入周期
  • 平台能力调用成功率
  • 构建时长变化
  • 测试时长变化
  • 故障发现提前量
  • 资源成本变化
  • 事故数和事故影响面
  • 研发人均可支撑服务数

基建团队最吃亏的一点,是价值释放往往滞后,而且分散在别人的效率提升里。如果你只盯上线需求数,这类团队会被系统性低估。

TTM 还是核心指标

如果只能保留一个指标,我还是会选 TTM。

这里说的 TTM,不是立项到上线的日历时间,而是价值从进入研发系统到到达用户手里的有效时间。很多公司嘴上讲敏捷,实际上量的是开发开始到提测结束,这根本不是 TTM。

为什么 TTM 在 AI 时代更重要?

因为 AI 最直接改变的,就是局部生产速度。代码写快了,单测补得快了,文档初稿也快了。问题是,这些加速会不会真的传导到业务价值交付,完全不确定。

我见过最典型的一种情况:

  • 开发编码时间下降 40%
  • PR 数量上涨 2 倍
  • 评审负担上涨 60%
  • 测试回归时长上涨 35%
  • 发布前冻结窗口变长
  • 最终需求上线周期几乎没变

如果你只看编码侧的数据,会得出一个完全错误的结论:AI 大幅提升了效能。
如果你看 TTM,问题一下就暴露了:加速发生在局部,瓶颈转移到了下游。

所以 TTM 的价值就在这里。它不关心你用了什么先进工具,它只看最终有没有把价值更快交出去。

TTM 怎么拆

TTM 不能只看一个总时长,否则只能看热闹。要拆段看:

  • 需求澄清耗时
  • 方案设计耗时
  • 开发耗时
  • 评审耗时
  • 测试耗时
  • 等待发布耗时
  • 灰度验证耗时

拆完之后,你才知道 AI 真正帮到了哪一段,堵在了哪一段。

另外,在 AI 时代,这种拆段是否合理,是否可以合并不同阶段或角色,让一些信息的流转内化为个人的思考逻辑,实现端到端的 AI 化。

比如,产品经理直接从需求到前端代码的实现。

看分布,不看均值

TTM 最忌讳只看平均值。平均值非常会骗人。正确看法至少要有:

  • P50
  • P75
  • P90
  • 超过阈值的长尾需求占比

因为 AI 往往会优先优化简单需求。这样 P50 可能很好看,P90 反而更差。原因也简单,简单需求被快速吞掉之后,系统里剩下的都是复杂需求、遗留系统改造、跨域联动项目,长尾会更长。

如果你只看均值,会误判整个系统在变快。

四个指标

DevOps 四指标在今天依然能打,但口径需要有一些升级。

部署频率

部署频率比 LOC 强太多。因为它至少是靠近真实交付动作的。代码写了多少行没人关心,真正有意义的是你有没有把变更安全地推到生产环境。

但部署频率也不能裸看。

高频不等于高效

AI 上来之后,一个常见变化就是团队更愿意切小 PR,发小版本。这个方向本身没问题,小批量交付通常更安全。问题在于,有些团队把一个正常需求拆成大量低价值、低独立性的碎发布,频率上去了,用户价值没上去,测试和发布成本反而更高。

所以我一般会同时看三个维度:

  • 单位时间部署次数
  • 每次部署的有效变更量
  • 每次部署的独立可验证价值

没有后两项约束,部署频率很容易变成表演数据。

适用场景不同

业务团队和基建团队的部署频率口径也不能完全一样。

业务团队可以看:

  • 每周或每日生产发布次数
  • 灰度发布次数
  • 从功能完成到触达用户的次数

基建团队更适合看:

  • 核心服务变更发布频率
  • 非工作时段紧急发布占比
  • 配置变更自动化发布比例
  • 平台工具链版本迭代频率

基建团队很多时候更强调稳定和兼容,追求极端高频未必合理。比如数据库、中间件、网关这类系统,频率太高反而可能说明变更管理有问题。

交付周期

交付周期本质上是 TTM 在工程流水线里的展开版。通常从代码提交到生产运行,也有人从需求进入开发开始统计。具体口径可以按团队定,但必须固定。

AI 时代交付周期最容易出现两个假象。

  • 提交变快了,交付没变快: 这是前面说的局部提速问题。AI 让提交更快,但后续验证没跟上,周期不会实质下降。
  • PR 变多了,周期看起来更短:如果团队把一个需求拆成多个极小 PR,每个 PR 周期都很短,报表会很好看。但从需求视角看,整体仍然很慢。所以我建议同时维护两套口径:一个是 PR 级交付周期,另一个是需求级交付周期。PR 级用于观察工程流水线摩擦,需求级用于看真实业务交付。只看其中一个,都会失真。

变更失败率

这个指标在 AI 时代的重要性实际上上升了。

因为生成式编码提高了变更速度,也提高了「错误以正确形式出现」的概率。以前很多错误是写不出来,现在是能很快写出一个逻辑闭环、风格统一、还能过部分测试的错误实现。它更隐蔽,也更容易通过表面检查。

可以把变更失败率定义得更工程化一点,至少包含这些事件:

  • 发布后触发回滚
  • 发布后引发 Sev 事故
  • 发布后触发热点修复
  • 发布后造成核心指标异常
  • 发布后引起客户可感知故障

如果定义太窄,只算重大事故,这个指标会钝化。定义太宽,又会把正常试错算进去。团队需要自己定边界,但边界一旦定了就别频繁改。

AI 对失败率的影响机制

这里有几个常见来源:

  • 生成代码对边界条件覆盖不足
  • 引入不必要抽象,增加理解偏差
  • 与历史代码风格和隐式约束不一致
  • 测试代码同样由 AI 生成,出现「同源缺陷」
  • 变更面比工程师主观预期更大

我自己比较警惕第四点。很多团队现在喜欢让 AI 顺手补测试,看起来很完整。但如果实现和测试都建立在同一段错误理解上,测试通过并不能证明正确。

所以在高风险变更里,测试不能只依赖生成。关键路径一定要有人做反例设计。

平均恢复时间

很多团队对 MTTR 的重视程度不够,尤其是业务团队。实际上,AI 时代恢复能力的重要性在上升。

当代码生成速度变快,进入生产环境的变更更多、更碎、更频繁,系统面对故障的概率和复杂度都在变化。你不一定能把每次变更都做得完美,但你必须能快速止血。

MTTR 的价值在于衡量团队是否真正具备工程韧性。这个指标背后对应的是一整套能力:

  • 监控和告警是否有效
  • 变更是否可追踪
  • 是否支持快速回滚
  • 灰度和开关能力是否完善
  • 值班机制是否靠谱
  • 故障定位信息是否充分

很多团队前面三个指标都好看,MTTR 很差。这样的系统经不起规模化 AI 变更。因为一旦出事,恢复慢会把前面所有频率和周期优势全吃掉。

历史债务

AI Coding 真正会在一年后把团队拉开差距,这里的差距在于谁更早处理历史债务。

这个问题现在还没有被足够重视。但是实际中已经越来越严重了。

因为短期内 AI 会制造一种繁荣感:交付更快,PR 更多,需求吞吐上升。可如果代码库质量、模块边界、测试资产、文档一致性没有同步改善,债务会以更快速度积累。

AI 会怎样放大债务

几个很典型的模式。

  • 重复实现增多:工程师直接让 AI 在局部上下文里生成功能,很容易绕过现有抽象和公共能力。短期最省事,长期就是重复轮子到处长。
  • 中间层膨胀:AI 很擅长生成 adapter、wrapper、facade 这类看起来规整的中间层。问题是很多层根本没有必要,只是为了让局部代码更顺。半年后系统会变得非常厚,排障和重构都很痛苦。
  • 测试资产劣化:生成测试很快,真正有效的测试不快。团队如果只追求覆盖率,很快就会积累大量低价值测试:断言脆弱、依赖实现细节、执行慢、维护成本高。最后 CI 时间越来越长,大家开始跳过测试。
  • 文档与实现漂移更快:AI 可以快速生成设计说明、变更记录、接口文档初稿。但只要流程里没有强约束,这些文档过几周就过时。文档数量增加,不代表知识管理更好。
  • 债务怎么量:技术债务很难精确,但不代表不能量。至少看四组信号:

    • 重复代码比例或重复能力点数量
    • 关键模块复杂度变化
    • 测试执行时长与稳定性
    • 历史模块变更失败率和恢复时长

指标落地

说一堆指标,如果最后只是做一张月报,那基本没用。研发效能度量要落地,大概可以看三点:统一口径、自动采集、和决策绑定。

统一口径

很多团队最大的问题不是没数据,是每个人嘴里同一个词代表不同意思。

比如「交付周期」,有人从排期开始算,有人从开始开发算,有人从代码提交算。你拿这三种数据做横向比较,结论一定错。

所以第一件事就是给每个指标下工程定义:

  • 起点是什么
  • 终点是什么
  • 谁负责标记状态
  • 异常情况怎么处理
  • 统计周期是什么
  • 看均值还是分位数

这一步很枯燥,但躲不过去。没有口径统一,报表越华丽越危险。

自动采集

凡是靠人手填的效能数据,最后都会漂。

我建议优先从这些系统自动取数:

  • 需求系统
  • Git 仓库
  • CI/CD 平台
  • 测试平台
  • 线上监控与事故系统
  • 发布平台
  • 值班和告警系统

AI 时代还可以补一些辅助数据,比如:

  • AI 建议采纳率
  • AI 生成代码在最终提交中的占比
  • AI 相关变更的回退率
  • AI 生成测试的失败分布

但这些只建议做诊断维度,不建议直接进核心看板。

和决策绑定

指标如果不进入真实决策流程,就只会变成汇报材料。

可以把不同指标绑定到不同节奏:

周维度

团队看流水线摩擦:

  • PR 周期
  • 构建失败率
  • 测试时长
  • 发布次数
  • 热修次数

月维度

管理者看交付和稳定性:

  • TTM 分布
  • 部署频率
  • 变更失败率
  • MTTR
  • 技术债务信号

季度维度

看结构性问题:

  • 跨团队依赖导致的等待占比
  • 核心系统复杂度变化
  • 自动化覆盖关键路径的比例
  • 平台能力复用率
  • 人均支撑规模变化

只有当指标驱动了人力投入、架构治理、流程调整,度量才算产生价值。

常见误区

  • 误区一: 拿 AI 使用量替代研发效能。 比如:人均每天调用 AI 多少次,AI 生成了多少代码,采纳率多少,这些数据可以看工具渗透率,不能代表团队变快了,更不能代表交付变好了。高采纳率有时候只是因为团队在写更多样板代码。
  • 误区二:把效能问题当管理问题。 一看到周期长,就加日报、加审批、加同步会。这个思路在 AI 时代更危险,因为编码加速之后,组织摩擦会成为主要瓶颈。继续加管理动作,只会让非编码时间更长。效能最后还是要回到工程根上:架构边界、测试自动化、环境一致性、发布能力、可观测性、模块治理。
  • 误区三:把所有团队放在一套指标下排序。业务、基建、平台、安全、数据团队的工作性质差异很大。统一看板可以有,统一排名很容易把组织带偏。
  • 误区四:只看短期提速,不看长期维护成本。 AI 最容易制造的错觉就是这个月吞吐上涨了,于是大家默认效能提升。可如果未来三个月回归变慢、故障变多、重构困难,这个月的漂亮报表只是透支。
  • 误区五:只看平均值。平均值会把长尾、异常、结构性阻塞全部抹平。工程管理里,很多真正该解决的问题都藏在 P90 之后。

最后

研发效能从来不是一个分数问题,它是一个约束系统问题。得回答下面的问题:

  • 价值有没有更快交出去
  • 变更是不是足够安全
  • 出问题能不能快速恢复
  • 现在的速度有没有透支未来

这四件事里,TTM 仍然是排第一的。因为业务不会为你写了多少代码买单,也不会为你调了多少次 AI 买单。业务只关心一件事:价值多久能到用户手里。

AI Coding 改变了工程生产函数。

但它没有改变研发效能的基本物理规律。局部速度不等于系统速度,生成能力不等于交付能力,短期吞吐不等于长期效率。

不要急着发明一套全新的效能宗教。先把工程里的主干指标守住,把主体放对,把业务团队和基建团队分开看,把技术债务纳入视野,再去观察 AI 到底在哪些环节真的创造了增益。

这样量出来的数据,才能指导决策。否则报表再热闹,也只是另一种噪音。

以上。

作为 CTO,应该如何看待 AI 编程

前段时间和几个技术圈的朋友吃饭,聊到最近很火的 AI 编程工具(Cursor 估值近百亿),大家的深入程度都各不相同。有人已经把 Cursor 当成标配,离了它写代码都不太行;有人还在观望,觉得这玩意儿不太靠谱;有人在团队内小范围试点,看一看;有人怕有风险,不敢在团队内推广(不仅仅是安全风险,还有组织内部的一些问题)。

作为技术负责人,面对 AI 编程这个话题,确实挺纠结的。一方面,这东西确实能提效(但不能只盯着提效这个逻辑),另一方面,各种担心也不是空穴来风。今天想聊聊,站在 CTO 的角度,到底该怎么看待和处理这个事。

先说说目前我观察到的几种典型态度。

四种常见的应对策略

第一种是ALL IN 派。这一派通常有几个特征:要么是连续创业者出身,习惯了快速试错;要么是 AI 的忠实信徒。在性格上,他们会偏向冒险一些,相信「天下武功唯快不破」。

从公司规模来看,这种策略多见于 50-200 人的成长期公司。为什么?因为这个阶段的公司正处在生死时速,既有一定的资源去尝试新东西,又还没有大公司那么多条条框框。CTO 往往直接向 CEO 汇报,有较大的决策权。他们的逻辑很简单:如果 AI 真能让研发效率翻倍,那就是弯道超车的机会。

但这种激进往往源于一种可能被时代抛弃的焦虑。刚经历过移动互联网时代的洗礼,深知错过风口的代价。所以看到 AI 编程工具,第一反应就是不能再错过了。

第二种是坚决抵制派。这一派往往技术功底深厚,可能是从程序员一路做上来的。他们可能写过操作系统,造过各种轮子,对代码有种近乎偏执的掌控欲。在他们眼里,让 AI 写代码就像让机器人替你谈恋爱,总觉得少了点什么,没有灵魂。

并且这种策略常见于两类公司:一是金融、医疗等强监管行业的大公司,动辄上千人的技术团队,任何技术决策都如履薄冰;二是某些技术驱动的独角兽,公司文化中有很强的工程师自豪感,「我们的代码都是艺术品」。

换个角度看,这种抵制其实是一种保护。保护什么?保护既得利益,保护现有体系,更重要的是保护自己的价值认同。当你花了二十年时间成为编程高手,突然有人告诉你 AI 十秒钟就能写出差不多的代码,这种冲击是巨大的。抵制,某种程度上是在对抗这种价值崩塌。

第三种是建立预期后科学推广。这一派通常是职业经理人出身,可能有 MBA 背景,擅长做 PPT 和汇报。他们的特点是理性、谨慎、程序正义。什么事都要有方法论,有流程,有数据支撑。

这种策略在 500-2000 人规模的成熟公司可能会比较常见。为什么?

因为船大难掉头。这个体量的公司,往往已经有了完整的研发流程、质量体系、安全规范。任何新工具的引入都需要考虑对现有体系的影响。CTO 的 KPI 里,「稳定」的权重往往大于「创新」。

但问题在于,「科学」有时候会变成「科学主义」。制定了详尽的试点方案,设计了完美的评估指标,组织了多轮评审会议,最后发现三个月过去了,还在讨论试点范围。等到真正推广的时候,市场上已经有更新的工具了。这种「理性」背后,其实是一种精致的不作为。

第四种是躬身入局派。这一派有个特点:有比较强的好奇心。他们是一些爱折腾的技术。看到新工具,第一反应不是评估风险或收益,而是「让我试试看」。

这种人通常出现在两种场景:一是 20-50 人的初创公司,CTO 还在一线写代码,甚至就是技术合伙人;二是某些特别重视技术文化的中型公司(200-500人),虽然 CTO 不用写生产代码了,但还保持着 hands-on 的习惯。

其实,这一派的逻辑很朴素:没有调查就没有发言权。与其听别人说,不如自己试。这种实用主义的背后,往往是对技术的真正热爱和对未知的好奇。他们不会被各种宏大叙事忽悠,也不会因为恐惧而止步不前。

无论采取哪种策略,团队里总有人在用 AI 写代码。就像当年公司禁用 QQ,大家就用网页版;禁用网页版,就用手机。技术的渗透往往是自下而上的,任何自上而下的管控都可能流于形式。

需要考虑的核心问题

站在 CTO 的位置,引入 AI 编程工具不是简单的技术选型,而是一个系统性决策。至少要考虑这几个维度:

成本问题。表面上看,AI 工具能提高编码效率,降低人力成本。但别忘了,工具本身也要钱。Cursor 企业版每人每月 40 美元,且高级模型大概率是不够用的,全公司算下来也是笔不小的开支。更重要的是隐性成本:代码质量下降带来的维护成本、安全漏洞带来的修复成本、团队能力退化带来的长期成本。

安全问题。这可能是大家说得最多的问题。你的代码会不会被上传到 AI 服务商的服务器?会不会被用来训练模型?竞争对手会不会通过某种方式获取你的核心算法?这些都不是杞人忧天。特别是对于金融、医疗等敏感行业,数据安全是红线,碰不得。虽然类似于 Cursor 有隐私模式,但这个隐私模式真的隐私吗?或者说这里定义的隐私的边界是什么?

稳定性问题。AI 生成的代码看起来能跑,但真的稳定吗?边界条件考虑了吗?异常处理完善吗?性能优化了吗?很多时候,AI 给出的是「能用」的代码,而不是「好用」的代码。如果团队过度依赖 AI,很可能会埋下大量隐患。

技术债务问题。这是个更深层的问题。当团队习惯了「不求甚解」的开发模式,技术债务会像滚雪球一样越滚越大。代码结构混乱、命名不规范、重复代码满天飞,到最后谁都不敢动,只能推倒重来。

Jim Collins 在《从优秀到卓越》中有句话说得特别好:「轻率地依赖技术是一种债务,而不是资产。」只有当技术服务于清晰的概念和目标时,才能成为推动力。否则,就是加速灭亡的工具。

我的实际使用体验

说实话,这一年多我自己也在大量使用各种 AI 编程工具。从 Cursor 到 Trae(因为 Cursor 不让我用高级模型了),从 ChatGPT 到 Claude,基本上市面上的工具都试了个遍。体验下来,确实有种「Vibe Coding」的感觉——写代码变快了,做项目没那么费劲了。

但慢下来思考,内心其实有点恐慌。

为什么恐慌?不是工具不好,而是我发现自己在变懒。遇到问题,第一反应不再是分析问题、设计方案,而是想着「怎么让 AI 帮我写出来」。这种思维模式的改变,其实挺可怕的。

以前写一个 API,我会仔细考虑接口设计、参数校验、异常处理、性能优化。现在呢?一句 prompt,AI 啪一下就给你生成了。代码能跑,功能也对,但总觉得哪里不对劲。等你想改的时候才发现,你压根不知道它为什么这么设计,改一个地方,可能会影响十个地方。

还有更可怕的,随着时间的流逝,这种依赖会形成惯性。你用得越多,越像在维护一份「外包」代码。只不过这个外包商是 AI,而你成了那个下需求的产品经理。

表面上看,你在主导 AI。实际上呢?你越来越依赖它,它也越来越多地接手决策。到最后你会发现,代码是它写的,架构是它设计的,你只是个「prompt 工程师」。

这让我想起一个段子:以前是「CV工程师」(复制粘贴),现在升级成「AI工程师」(AI写我调)。看似进步了,其实本质没变,都是不求甚解。

作为 CTO 的思考框架

那么,作为技术负责人,到底该怎么看待和使用 AI 编程工具?我觉得需要建立一个清晰的思考框架。

第一,明确 AI 的定位。AI 编程工具是助手,不是替代品。它应该帮助程序员更高效地实现想法,而不是替程序员思考。这个定位必须在团队内部达成共识,否则很容易走偏。

第二,建立使用边界。什么代码可以用 AI 写,什么不可以?我的建议是:

  • 样板代码、测试用例、文档注释——可以大胆用
  • 业务逻辑、核心算法、安全相关——谨慎用或不用
  • 学习新技术、快速原型——可以用,但要理解原理

第三,强调代码审查。AI 生成的代码必须经过严格的 Code Review。不仅要审查功能正确性,更要审查代码质量、设计合理性、安全隐患等。千万不能因为是 AI 写的就放松标准。

第四,投资团队成长。这点特别重要。AI 工具的普及,对程序员的要求不是降低了,而是提高了。以前你只需要会写代码,现在你需要会判断代码好坏、会设计系统架构、会解决复杂问题。这些能力不是 AI 能替代的,反而因为 AI 的存在变得更加稀缺和重要。

具体的实施建议

如果你决定在团队中引入 AI 编程工具,这里有一些具体的建议:

1. 先试点,后推广

不要一上来就全员推广。选择一两个小团队或项目先行试点,收集使用数据和反馈。试点期至少 3-6 个月,要关注这些指标:

  • 编码效率是否真的提升了?
  • 代码质量有没有下降?
  • 团队成员的接受度如何?
  • 有没有安全或合规问题?

2. 制定明确的使用规范

规范不需要太复杂,但一定要明确。比如:

  • 哪些代码库可以使用 AI 工具
  • 敏感代码和数据的处理原则
  • AI 生成代码的标记和审查流程
  • 工具选型和采购流程

3. 加强技术培训

不是培训怎么用 AI 工具,而是培训如何在 AI 时代保持竞争力。包括:

  • 系统设计能力
  • 代码审查能力
  • 问题分析和解决能力
  • 对 AI 生成代码的判断能力

4. 建立反馈机制

定期收集团队使用 AI 工具的反馈,及时发现和解决问题。可以通过:

  • 月度问卷调查
  • 定期的分享会
  • 1 对 1 沟通
  • 代码质量数据分析

5. 保持技术敏感度

AI 技术发展很快,作为 CTO 要保持对新技术的敏感度。但也不要被各种营销话术忽悠,要基于实际效果做决策。

更深层的思考

站在更高的角度看,AI 编程工具的出现,其实是在重新定义程序员这个职业。

以前,程序员的核心技能是「把想法转化为代码」。现在,这个转化过程很大程度上可以由 AI 完成。那程序员的价值在哪里?

我觉得在于三个方面:

第一,定义正确的问题。爱因斯坦说过,提出问题比解决问题更重要。在 AI 时代,知道要解决什么问题、如何定义问题,变得更加关键。

第二,设计优雅的方案。AI 可以写代码,但很难设计出优雅、可扩展、高性能的系统架构。这需要经验、品味和全局思维。

第三,处理复杂的情况。现实世界的问题往往不是非黑即白的。如何在各种约束条件下找到最优解,如何处理各种边界情况和异常,这些都需要人的判断。

从这个角度看,AI 编程工具不是程序员的终结者,而是一次职业升级的机会。那些只会写代码的程序员可能会被淘汰,但那些会思考、会设计、会解决复杂问题的程序员,会变得更有价值。

对团队文化的影响

引入 AI 编程工具,不仅仅是技术决策,也会深刻影响团队文化。

学习文化的改变。以前遇到不会的,查文档、看源码、问同事。现在呢?直接问 AI。这种便利性是好事,但也可能导致浅尝辄止,不求甚解。作为 CTO,要引导团队保持深度学习的习惯。

协作模式的改变。当每个人都有 AI 助手时,pair programming 还有必要吗?code review 的重点是什么?这些都需要重新思考和定义。

价值认同的改变。什么样的程序员是优秀的?是 prompt 写得好的,还是系统设计得好的?团队的价值导向必须明确,否则容易迷失方向。

风险管理

作为 CTO,风险管理始终是重要职责。在 AI 编程工具的使用上,需要特别关注这些风险:

知识产权风险。AI 生成的代码可能包含其他项目的代码片段,存在版权风险。团队需要有意识地审查和规避。

依赖风险。如果团队过度依赖某个 AI 工具,一旦工具不可用或政策变化,可能会严重影响开发进度。

能力退化风险。这是最隐蔽也最危险的。当团队习惯了 AI 代劳,自主解决问题的能力可能会逐渐退化。等到真正需要的时候,才发现已经力不从心。

安全合规风险。特别是在金融、医疗、政府等行业,数据安全和合规要求很高。使用 AI 工具可能会触碰红线,需要特别谨慎。

一些实用的建议

最后,给正在纠结是否引入 AI 编程工具的 CTO 们一些实用建议:

1. 自己先用起来。不要只看网上别人的视频或他人分享的文章,自己深度使用至少一个月,持续的跟进更新,形成自己的判断和手感。

2. 小步快跑。不要想着一步到位,先从风险较小的场景开始,比如单元测试、文档生成等。

3. 数据说话。建立量化指标,用数据来评估效果,而不是凭感觉。

4. 保持开放。技术在快速发展,保持学习和调整的心态。今天的最佳实践,可能明天就过时了。

5. 关注人。技术只是工具,人才是核心。如何让团队在 AI 时代保持成长和价值,这是最重要的课题。

写在最后

作为 CTO,我们已经站在技术变革的前沿。AI 编程工具的出现,既是机遇,也是挑战。

机遇在于,它确实能提升效率,降低门槛,让我们能够更快地实现想法。挑战在于,如何在使用工具的同时,不失去核心竞争力,不积累技术债务,不触碰安全红线。

这需要智慧,需要平衡,更需要不断的思考和调整。

如果你已经在使用 AI 编程工具,不妨问问自己和团队:

  • 我们是在利用 AI,还是在依赖 AI?
  • 团队的核心能力是在增强,还是在弱化?
  • 面对没有 AI 的场景,我们还能高效工作吗?

如果你还在观望,也不妨思考:

  • 竞争对手都在用 AI 提效,我们不用会不会落后?
  • 如何在保证安全的前提下,适度引入 AI 工具?
  • 团队对 AI 工具的态度如何,有没有抵触或过度期待?

无论如何,保持清醒的头脑,做出适合自己团队的选择。

以 Jim Collins 在《从优秀到卓越》中话结尾:

轻率地依赖技术是一种债务,而不是资产。是的,只有合理地使用技术,让这种技术服务于一个简单、清晰、连贯并且已经被深刻理解的概念时,技术才会成为加速发展的根本推动力。相反,当技术没有被合理使用,只是被当作一个简单的解决办法,也没有被深刻地认识到它是如何与一个清晰连贯的概念联系在一起的时候,技术就是加速你灭亡的工具。