软件工程这几年变得有点陌生。前不久我把一位在浏览器性能领域深耕多年的工程师的分享重新翻出来听,他在里面反复强调一个判断:未来十年的软件工程,赢得比赛的不再是“谁的代码写得最漂亮”,而是“谁能用最小的成本把正确的事做出来”。这句话我回味了很久,结合自己这两年带项目、写代码、搭工具链的经历,我觉得可以从他的洞察里提炼出五个关键转型,写出来和大家聊聊。这篇文章不是分享会的听后感,而是把其中的观点落到我自己踩过的坑、调过的系统、改过的流程上,希望能给同样在一线写代码、也在为团队技术方向发愁的工程师一些参考。
1. 第一个转型:AI 不只是补全代码,它正在重写交付流程
1.1 从“帮你写”到“替你干”:交互方式已经变了
两年前我们聊 AI 编程,讨论最多的是自动补全——写一个函数名,它帮你补后面三行。那时候大家的心态是“这玩意儿就是个高级输入法”,好用但谈不上改变工作方式。但现在你再去看主流 AI 编程助手的能力边界,已经远远不止补全:给它一个 issue 描述,它能直接生成整整一个 PR;给它一份接口文档,它能帮你把客户端调用代码、类型定义、单元测试全部铺出来。
我真正意识到“变天了”是在模拟项目 X 里。当时我们要做一批数据迁移脚本,一个同事用 AI 生成了整个迁移逻辑,自己只负责 review。第一眼看上去代码结构很规范,注释也漂亮,跑测试全绿。结果一上灰度就出问题——脚本在处理时区转换时漏掉了夏令时的情况,凌晨那一个小时的数据全部错位。
这件事给我的冲击很大。问题不在 AI 写得不好,而在于“把问题描述清楚”这件事本身变得极其重要。以前我们花时间写代码,现在花时间想清楚:“这个需求的确切边界是什么?异常情况怎么定义?哪些数据是可信的?”你把这些问题描述得越清楚,AI 生成的上限就越高;反过来,你自己都模模糊糊,AI 给你交回来的就是一份做工精致的错误答案。
所以我现在对我们团队的要求变了。新来的同学第一课不是学框架,而是学“如何把需求翻译成一条可执行的机器指令”。你问任何一个问题,至少要能说清楚:输入是什么、输出是什么、边界条件有哪些、失败了怎么处理。这套能力以前叫“需求分析”,现在它变成了每一个写代码的人的基本功。
1.2 新的代码评审:你还在查语法,它在查意图
代码评审这件事也在被 AI 重塑。过去我们 review 一个 PR,看的是命名规不规范、有没有明显的性能问题、逻辑有没有写反。这些低级错误,现在的 AI 工具基本都能在提交前就扫出来。如果人还在 review 阶段一行行查这类东西,你的价值就趋近于零。
真正需要人来判断的,是意图层面的问题。我给自己整理了一个评审四问,分享出来供参考:
- 这段代码真的是在为用户解决问题,还是在为某个“看起来正确的指标”服务?
- 这个改动的影响面是什么?它会不会破坏我们没意识到的东西?
- 有没有更简单的路径可以达到同样目的?还是说写复杂了?
- 三个月后的自己看到这段代码,能不能快速理解当时为什么这么写?
举个例子。有一次我们做一个按钮点击事件的上报,一个同事用 AI 生成了非常完整的埋点代码,覆盖了十几个参数、五个上报时机。代码本身无可挑剔,但评审时我们问了一句:这些数据采集上来给谁看?分析之后发现,这个数据的下游消费者根本不存在,整套上报体系是“为了上报而上报”。最后我们把十几个参数砍成了三个。
这就是人和 AI 的差别。AI 擅长的是在给定的约束下找到最优解,而人要做的是质疑这个约束本身是否正确。以后的评审,重点不是挑毛病,而是确认“我们做的是不是该做的事”。这个转变短期内很难适应,但越早适应,你作为工程师的不可替代性就越强。
1.3 组织层面的冲击:技能模型和团队结构要重构
AI 对软件工程最深远的影响,不在 IDE 里,而在组织层面。传统的软件团队里,角色边界很清晰:产品经理定义需求,架构师设计系统,工程师实现功能,测试保证质量。但 AI 把“实现功能”这件事的成本拉到了极低,这种角色分工的假设就开始松动。
我观察到的现象是:能用 AI 写好代码的人,往往是那些既懂业务、又懂系统的人。他们能区分“这个需求背后的真实动机”和“需求文档里写出来的表面描述”,能把模糊的商业问题转化为清晰的技术约束。这种能力同时横跨了产品、架构和工程三个领域。
未来团队里的核心角色,我称之为“问题拥有者”——他未必是写代码最快的人,但一定是最理解“为什么要做这件事”的人。团队里这样的人越强,AI 的杠杆效应就越大。反过来,如果团队里全是只会按指令执行的人,AI 反而会放大混乱:每个人拿到的上下文不同,生成出来的代码拼在一起就是一场灾难。
这也是为什么我不太担心“AI 会取代程序员”这种说法。AI 能取代的是“代码翻译”——把明确规格翻译成代码的过程。它短期取代不了的是“在模糊和冲突中找到正确路径”的能力。而这个能力,恰恰是从前很多工程师最不愿意培养的部分。
2. 第二个转型:开发者体验从“锦上添花”变成“留人利器”
2.1 为什么过去我们忍了那么烂的开发环境
在聊开发者体验之前,先讲个真实的场景。模拟项目 X 当时有个新的后端服务要接入,文档写了两页纸,写了要用什么版本、要配哪些环境变量、还要手动建一张表。一个刚入职的同学照着文档跑,第一天环境就崩了三次。第一次是依赖版本和本机不一致,第二次是配置项少了一个冒号,第三次是数据库初始化脚本里有个隐藏的 SQL 错误。
折腾到第三天,环境终于跑起来了。但他第一周的产出基本为零。这还算是顺利的。我见过更离谱的,有人在本地环境配置上花了一整个迭代,最后发现只要用 Docker 重新构建就可以解决,但团队里根本没人写过这个 Dockerfile。
为什么会出现这种局面?因为长期以来我们把“搭开发环境”这件事当成工程师的个人修为。环境起不来?你自己想办法。文档不更新?你自己看代码。这种态度的潜台词是:开发者体验不重要,重要的是你够不够“硬核”。
可事实是,开发环境的摩擦成本是团队产能的隐形杀手。每有一个新成员在环境搭建上多花一天,团队就多承担一天的工资成本、时间成本和士气损失。更隐蔽的是,工具链的摩擦会让人产生“这个团队不专业”的潜意识,优秀的人才流失往往不是因为薪资,而是因为“在这干活太累了”。
2.2 黄金路径与内部开发者平台:把正确的事变成容易的事
开发者体验的核心,不是做个漂亮的门户网站,也不是写一堆“最佳实践”文档。它真正的逻辑只有一句:把正确的事变成容易的事,把错误的事变成麻烦的事。
这句话听起来简单,做起来需要一套系统来支撑,这就是最近很火的“平台工程”概念。通俗点说,平台工程不是再造一套工具,而是把团队里所有公认的“标准做法”沉淀成一条修好的路。走在这条路上,资源自动配好、权限自动给好、监控自动接上、部署自动执行;想抄近路乱来,平台会拦着你。
对比一下传统方式和平台化方式在同一个场景下的差异:
| 动作 | 传统流程 | 平台化流程 |
|---|---|---|
| 新成员启动项目 | 阅读文档、手动装依赖、手动改配置、靠运气 | 跑一个标准命令,环境自动拉起 |
| 申请测试环境 | 找运维,提工单,排队等半天 | 自助申请,秒级创建,用完自动释放 |
| 部署上线 | 人工检查、手工点按钮、靠检查清单 | 流水线自动执行,卡在每个质量门禁上 |
| 配置密钥 | 通过聊天工具传来传去 | 平台提供密钥托管,应用运行时自动注入 |
| 监控告警 | 出了事再翻日志 | 平台自动接入日志、指标、告警,开箱即用 |
我在实际落地时最大的体会是:平台工程最难的从来不是技术,而是“共识”。你得先和团队坐下来,把“什么是正确的事”定义清楚,把每个环节的最低标准定下来。否则平台只是把当前的一团乱自动化了,跑得越快死得越快。
2.3 用四个数字判断你的开发者体验是否健康
谈体验不能只谈感受,得有能测量的指标。我这些年观察下来,有四个数字最能反映一个团队开发者体验的真实状态:
第一个是“入职到首次部署”的时长。理想情况应该在三天以内,超过一周说明环境搭建和文档体系有大问题。
第二个是“本地环境搭建”的耗时。一个成熟的工程体系,新成员应该能在半个小时内通过标准命令把环境拉起来。超过两小时,就意味着有人正在用生命填补工具链的窟窿。
第三个是“构建失败平均恢复时间”。构建失败不可怕,可怕的是失败了没人知道为什么、找谁修。恢复时间越长,说明团队对自家构建体系的理解越差,也说明构建过程里的不确定性越高。
第四个是“每周工具链摩擦耗时”。这个数字很主观,但你可以在周会上让大家匿名估:平均每周有多少时间花在处理环境问题、依赖冲突、配置不对这些事上?如果人均超过半天,就说明自动化程度远远不够。
这四个数字不需要做一个复杂的度量系统,一个简单的周报就能统计。重点不是数字多精确,而是让团队意识到:开发体验是可以用数据来驱动改进的,不是靠“大家忍一忍”来维持的。我自己的经验是,只要你开始盯这几个数字,三个月内工具链的摩擦就会明显下降——因为问题一旦被看见,就藏不住了。
3. 第三个转型:性能是一笔预算,不是一个阶段
3.1 性能前置的真正原因:用户不会告诉你他不耐烦
过去很长一段时间,性能优化在团队里的地位很尴尬。项目初期没人提,上线前集中“优化”一波,上线后有人反馈卡顿再修一修。这种“事后消防”的模式,本质上是在赌用户不会因为卡顿而离开。
但真实世界的用户行为非常残酷。页面加载超过三秒,用户就会开始怀疑自己是不是点错了;操作没有及时反馈,用户就会疯狂地重复点击,然后抱怨应用“坏了”。用户不会告诉你他为什么走,他只会默默关掉页面,然后在评论区留下一句“真难用”。
我印象很深的一次是模拟项目 X 的一个查询页。开发时大家都觉得功能好用,上线后业务方反馈“会用的老用户才觉得好用,新用户打开就跑了”。后来一看数据,首屏加载在部分低端安卓机上要接近六秒。一个新用户连页面都没看到,哪来的机会感受到产品好?这就是典型的功能价值被性能拖死。
所以那位工程师的分享里有一句话我特别认同:性能不是功能,性能是功能的载体。你的页面再好看、功能再强大,如果它不能在用户耐心耗尽之前呈现出来,就等于不存在。
3.2 性能预算怎么定才不吵架:从北极星指标倒推
性能预算的最大问题是:一旦你说“首屏要三秒以内”,就会有人问“凭什么是三秒?为什么不是两秒或者五秒?”如果答不上来,预算就被架空了,最后变成墙上的一张纸。
我的建议是,预算必须从业务指标倒推出来,而不是拍脑袋定一个数值。具体可以分五步走:
第一步,定义一个关键用户旅程。不要贪多,先选一个最核心的:比如“从打开应用到完成一次搜索查询”。
第二步,采集真实的性能数据。用真实用户监控拿到这个旅程在 p50、p75、p90 下的耗时分布。实验室数据可以看趋势,但定预算一定要看真实数据。
第三步,按设备分段。把用户分成旗舰机和低端机两群,因为同一套代码在两类设备上的表现能差出三倍。只有旗舰机达标,等于放弃了一大批真实用户。
第四步,和业务方一起设一个“转换率损失”阈值。比如 p75 耗时每多一秒,转化率下降多少,这个数可以通过 A/B 实验估出来。有了这个数,你就不是和技术吵架,而是和业务方一起对目标负责。
第五步,把预算写进团队的工作协议里。预算不是“希望达到”,而是“不允许超过”。超过预算的改动,要么优化后再上,要么明确申请豁免并设置回落日期。
以上任意一步看起来都有工作量,但相信我,比起上线一个月后再做大型性能重构,这种前置约定的成本低得多。
3.3 把预算变成门禁:在 CI 里拦住每一次性能回退
光有预算还不够,预算要变成一条无人可以绕过的高压线才算生效。最隐蔽的性能问题几乎都是“慢慢变差”的:今天加一个依赖多 10KB,明天加一张图片多 50KB,看起来都不起眼,但一个季度下来,首屏体积就翻倍了。这种事靠人工审查很难发现,必须在流水线里自动拦截。
我们的做法是在持续集成的一个环节里加了个性能门禁,每次构建跑完后自动测量几个关键产物的体积和加载耗时,跟预设预算做对比。超出预算就构建失败,直接把问题暴露在提交阶段。
这里有一个非常关键的细节:不要用平均值做判断,要用分位数。平均值会被“运气好的一小撮用户”拉低,掩盖大量真实卡顿。我曾经见过一个接口平均耗时 300 毫秒,看起来很美,但 p95 要两秒多——因为有个第三方依赖在高峰期会抖动。如果一个团队的性能目标是建立在这种“平均”幻觉上的,那迟早要出事。
用分位数定门禁还有一个好处:它天然容忍极少数异常样本,避免误杀。比如 p75 超一点就报警,但 p50 正常,那说明问题只是影响了一部分用户,你可以选择先观察,而不是手忙脚乱回滚代码。这个平衡很重要,门禁太松形同虚设,太紧团队天天挨枪子儿,最后大家就会想办法绕过它。
4. 第四个转型:可持续软件工程,从“能跑”到“少耗”
4.1 一行低效代码的碳足迹:从数据中心到手机屏幕
说到软件开发,很少有人会把它和“碳排放”联系起来。但每一次请求背后,都有一台服务器在消耗电力,都会经过重重网络,最终在一个用户设备上渲染出界面。软件虽然看不见摸不着,它的运行却始终在消耗真实的能源。
我看到过一个令人震惊的数字:全球数据中心的耗电量,已经占到全社会用电的几个百分点,而且还在快速增长。每一张没有压缩的图片、每一段重复执行的计算、每一个不必要的网络请求,都在为这个数字添一块砖。代码的低效,不只是技术债问题,它正在变成一个实实在在的环境议题。
对于商业公司来说,能耗也直接意味着成本。我记得模拟项目 X 当时有一个批量任务,处理同样的数据量,优化前要跑四十分钟,优化后只要八分钟。不只是用户等得不那么急了,服务器的占用时间也降了一大截。如果这个任务每天都跑,一年下来节省的电费和机器成本相当可观。
当然,我不主张为“绿色”而无脑牺牲开发效率。可持续软件工程的核心是:在实现同样功能的前提下,消耗更少的计算资源。它和性能优化的方向高度一致,只是多了一层“对环境负责”的目光。你可以把它理解为——把省电当成一个隐性需求写在每次技术评审里。
4.2 绿色软件的具体姿势:不是装个插件那么浪漫
我在实际项目里摸索过一些具体可行的“减碳”动作,整理成一张体检表,每个团队都可以对着自己的系统过一遍:
| 检查项 | 优化动作 | 落地难度 |
|---|---|---|
| 图片体积 | 转为现代格式、去掉元数据、用响应式尺寸 | 低 |
| 接口返回 | 裁剪冗余字段、启用压缩、增加缓存策略 | 低 |
| 定时任务 | 检查执行频率,能降频的降频 | 低 |
| 前端包体积 | 移除无效依赖、启用按需加载 | 中 |
| 旧功能下线 | 清理不再使用的服务和页面 | 中 |
| 数据存储 | 冷热分层,不常用的数据转到低成本存储 | 中 |
| 渲染方式 | 高耗能视图用服务端渲染或静态化替代 | 高 |
这些动作没有一个需要发明新技术,全是工程基本功。但真正执行下去的不多,因为“省电”带来的好处不直接,大家总是优先做那些能看到即时收益的事。
一个常见的误区是:有些人把可持续软件工程等同于“用某个绿色插件监测碳排放”。那东西作为一个宣传工具可以,真拿它当工程实践的抓手,很难持久。真正的践行方式是把加进系统的每一份成本(计算、存储、网络)都当成需要持续审视的负债。
另外想多说一句:可持续并不意味着牺牲体验。把图片压缩到肉眼无损的体积,用户打开更快,服务器压力更小,碳排放也更低。这个方向的成功标准是“多赢”,而不是“为了环保忍受更差的体验”。
4.3 AI 与能耗的悖论:效率工具本身正在吃掉效率
AI 工具和可持续软件工程之间,有一个不那么容易被注意到的矛盾。AI 的训练和推理都非常耗电,一次大规模模型的训练,其能耗可能相当于数百个家庭一年的用电量。我们享受着 AI 带来的编码提速,但同时也在为算力买单——这个单不仅有金钱,还有能源。
更隐蔽的问题是:AI 生成代码往往比人类手写代码更“啰嗦”。因为它倾向于采用通用、稳妥的实现,而不是针对特定场景的最优解。如果团队不加审查地全盘接受 AI 生成的代码,应用的体积可能在几个版本内悄悄膨胀。
我的态度不是“拒绝 AI”,而是“用 AI 的时候带着成本意识”。比如,收到一段 AI 生成的实现,多问一句:这段逻辑有没有更轻量的写法?能不能复用已有的公共能力?有没有引入一个本不需要的依赖?这些问题的答案,决定了一个 AI 提效显著的团队,最终是变得更高效了,还是变成了一台吞电的机器。
5. 第五个转型:从“实现需求”到“拥有问题”
5.1 “完成 80%”不是完成任务:所有权文化到底在说什么
我在评审里碰到频率最高的一句话是:“这个功能我写完了,但是数据有没有对、用户用不用,不关我的事。”这种“任务完成度”思维,是软件工程里一种隐蔽的浪费。你以为功能上线就结束了,实际上用户跑不通、没人用、用不好,前面的开发等于白做。
所有权文化说的恰好相反:一个工程师对一件事的责任,从“把代码写完”延伸到“让问题被解决”。它不是让你背锅,而是让你在做事的时候有完整的判断链。比如你接到一个需求“增加一个导出报表的功能”,任务式思维会说“做完了,接口通了,按钮亮了”。所有权思维会追问更多:这个报表真的有用户需要吗?导出格式要 CSV 还是 Excel?导出数据量如果超过一百万行怎么办?导出的数据安全吗?这些追问看起来是产品经理的活,但只有最了解代码的实现者才能给出最靠谱的答案。
我在模拟项目 X 里见过一个最典型的正面案例:有个功能模块的负责人接到“在新用户注册流程里加一个推荐码”的需求。他没有直接开工,而是先和运营沟通“推荐码是为了拉新还是为了奖励老用户”,确认主次之后,又检查了现有的用户表结构,最后提交的版本几乎没怎么返工,而且上线两周后他还主动跟进数据,确认推荐码确实带来了预期的新增。
这种做事方式,看起来只是“多想了一步”,但它构筑的信任感完全不同。团队里这样的人多了,组织就不需要那么多层层汇报和反复确认;反过来说,如果大家都只管自己那一亩三分地,系统一定会出现很多无人认领的灰色地带——接口没人维护、文档没人更新、告警没人理会。
5.2 工程师参与决策:不越位,但也不能缺席
所有权文化最容易走向一个极端:工程师变成“指点江山的架构师”,什么都想参与,什么都觉得别人不行。这不是所有权,这是越位。
我的经验是,工程师参与产品决策,应该聚焦在三个问题上:第一,这个问题的本质是什么?第二,在这个问题上,技术的约束点和机会点分别是什么?第三,有没有一种更简单的办法达到同样的目标?而不是去讨论按钮放左边还是右边这种纯交互判断。
有一次我们讨论一个会员体系的重构,产品方提了一版非常完整的功能列表,排期要三个迭代。技术评审时我们发现,列表里有两项功能依赖的核心数据我们根本没有,要采集到可靠的样本至少半年。如果不发声,团队就会花半年去建一个注定失败的体系。后来我们把这两项明确标成“不可行,除非补齐数据采集”,并顺带给出了一个过渡方案,产品方欣然接受。
这就是工程师参与决策的价值:帮团队早一点看到“此路不通”,比事后返工有价值得多。要做到这一点,不需要你兼任产品经理,只需要你在评审时保持一种“我来对最终结果负责”的姿态。一个提问:“这个需求解决了谁的什么问题?”,往往就能拦住一个无效功能。
5.3 未来团队的最小模型:懂问题的人比写代码的人更稀缺
顺着所有权文化往下推,未来的团队结构会越来越向“小而精”的方向演变。一个人如果能同时理解商业问题、系统设计、代码实现和数据分析,AI 在TA手里的产出效率会十倍于一个只会写代码的人。
我说的“最小团队”,不是指永远三到五个人包打天下,而是一个基本配置:产品思维的人负责判断方向,技术能力强的人负责把方向变成现实,再加上一个懂数据的人验证结果。如果这三样能力集中在两三个人身上,那就更理想了。
但这不等于说专业纵深不重要了。恰恰相反,未来最稀缺的是“既深且广”的人才——在某个领域钻得很深,同时又愿意抬头看整个系统的运作逻辑。这种人才在 AI 普及的背景下尤其珍贵,因为 AI 让他如虎添翼,而不是让他可有可无。
6. 把这五点放在一起,我看到的那条暗线
6.1 复杂性正在从代码层转移到系统层
回头看这五个转型——AI 重写交付流程、开发者体验崛起、性能预算前置、可持续变成约束、所有权文化回归——它们表面上彼此独立,背后其实藏着同一条暗线:软件工程的复杂性,正在从“代码怎么写”转移向“系统怎么运转”。
过去十年,我们焦虑的是语言、框架、算法够不够新;未来十年,真正难的是如何在充满变数的业务环境里,用一套既高效又可持续的工程体系,持续交付真正有价值的东西。代码本身的技术含量还在,但它已经不再是最大的瓶颈。
这也解释了一个现象:为什么有些团队用了最好的技术栈,却依然深陷泥潭?因为他们把所有精力都花在了“代码层”的完美上,忽视了系统层的摩擦。工具链让人抓狂、性能靠运气、需求来什么做什么、做完了没人对结果负责——这些才是拖垮团队的真凶。
理解了这条暗线,再看那位工程师分享里的话,就不觉得是唱高调了。他说:“我们不需要更多会写代码的人,我们需要更多对系统负责的人。”以前我把这句话当成一种修辞,现在我真的信了。
6.2 对我们这些一线工程师来说,具体该做什么
最后这几点,是我在听完分享、想完这五个转型之后,给自己列的行动清单。如果你也是在软件行业工作的人,可以照着试试。
第一件,所有人每周抽半天,关掉 IDE,去读自己负责模块的业务数据和用户反馈。只看代码永远发现不了“用户为什么不用”。
第二件,把“搭环境要多久”当成一个正经的开发任务排进迭代。不要因为它不产生用户可见的功能就无限拖延。
第三件,做需求之前,先问三遍“为什么”。第一遍是对方口头说的,第二遍是背后动机,第三遍是“如果我不做这个,可不可以”。
第四件,认真对待性能预算和能耗审视。哪怕是每周只测一次页面体积、只检查一个接口的响应分布,也比上线前抱佛脚强。
第五件,愿意从“这个功能做完了”走向“这个问题解决了”。前者让你成为工具,后者让你成为问题的拥有者。
这五件事没有一件需要引入新框架或新技术,但它们合在一起的复利效应,会远超你重写一次架构或换一套技术栈。我个人的体会是:软件工程的未来不会以某种炫酷工具的形式到来,它会藏在这些更本质的工作习惯里,一点一点地改变团队交付的效率和质感。