Javascript

BFF的谎言:为什么前端团队不应该拥有后端代码

BFF(Backend For Frontend)这个概念被讨论了很多年,大部分文章都在讲它的好处:给前端更多控制权、减少沟通成本、提升迭代效率。但我想说点不一样的:BFF可能是过去十年最被滥用的架构模式,它给很多团队带来的不是效率提升,而是隐性灾难

这个判断可能有争议,但基于我多年全栈实践的观察,大部分公司的BFF实践都走偏了。问题不在于BFF本身,而在于一个看似合理但实则危险的假设:前端团队应该拥有和维护BFF代码。

 

谁在真正维护BFF

 

先说个常见场景。你们公司引入了BFF架构,用Node.js写,部署在前端团队的代码仓库。最开始确实很爽,需要什么接口自己写,数据格式自己定,不用等后端排期。

三个月后,问题来了:
- 后端换了新的认证方式,BFF层要同步升级
- 用户反馈接口偶尔超时,排查发现是BFF内存泄漏
- 运营要做数据统计,需要在BFF加审计日志
- 监控告警BFF的某个依赖包有安全漏洞
- 后端要做灰度发布,BFF要配合调整负载均衡策略

Node.js BFF层的三个认知误区:不只是接口转发

很多团队在引入 Node.js 做 BFF(Backend for Frontend)层时,都会陷入一个误区:把它当成简单的接口转发器。写几个路由,调用后端 API,拼装数据,返回给前端,就算完成任务了。

这种理解不能说错,但实在太浅。

我见过不少团队的 BFF 层,最后都沦为"接口透传中间件"——前端要什么数据,就透传什么接口;后端改了接口,前端也跟着改。这样的 BFF 层除了增加一层延迟和维护成本,没有创造任何价值。

今天想聊聊三个常见的认知误区,以及 BFF 层真正应该做什么。

 

误区一:BFF 只是为了"聚合接口"

 

很多人认为 BFF 层的核心价值是"把多个后端接口聚合成一个"。比如一个页面需要调用用户信息、订单列表、推荐数据三个接口,前端调三次太慢,所以在 BFF 层写个聚合接口,一次性返回所有数据。

这个思路听起来很合理,但问题在于:聚合只是手段,不是目的

真正的目的是什么?是为前端定制适合它的数据结构和粒度。

AI编程工具的分野:OpenClaw、Hermes Agent与Claude Code

最近半年,AI编程工具层出不穷。从GitHub Copilot开始,到Cursor、Claude Code、OpenClaw、Hermes Agent,每个都说自己是"下一代编程方式"。

用了几个之后发现,这些工具看起来都是"AI帮你写代码",实际上解决的问题完全不同。

这不是功能对比,是设计理念的分野。

 

三种不同的定位

 

先说结论:OpenClaw、Hermes Agent、Claude Code 虽然都叫"AI编程工具",但定位差异巨大。

OpenClaw:开源、可定制、工程师导向。

核心理念是"把AI当工具"。你可以自己部署、自己调教、自己定义workflow。它不是一个产品,更像是一个框架。

适合人群:愿意折腾、对隐私敏感、有特殊需求的团队。

Hermes Agent:自动化、任务导向、减少人工干预。

核心理念是"把AI当助手"。你下达一个任务,它自动拆解、执行、验证。你不需要一步步指导,它会自己判断下一步做什么。

适合人群:希望提高效率、不想深入细节、任务明确的场景。

技术选型的真相:为什么最后总是选那几个

每次做技术选型,团队都会认真调研:列出五六个候选方案,做技术对比表,分析优缺点,开会讨论半天。最后呢?React、TypeScript、MySQL、Redis,还是那几个。

新人会问:"为什么不试试XX框架?它的性能更好啊。"老人会说:"稳妥起见,还是用主流的吧。"

技术选型最大的谎言是:我们在做技术决策。实际上,大部分时候我们在做风险决策。

 

技术选型的三个阶段

 

做了很多年技术,观察到一个有意思的现象:工程师对技术选型的态度,会随着工作年限发生变化。

刚入行时,看到新技术就想用。看到有人在用Vue 3,立刻想在项目里试试;看到Rust很火,马上想重写服务;看到某个数据库号称性能是MySQL的10倍,恨不得立刻迁移。

这个阶段的特点是:只看优点,不看成本。

工作几年后,开始变得谨慎。新技术出来不会马上跟,会等社区成熟、生态完善、踩坑的人多了再考虑。这时候的决策标准是:技术是否成熟、团队是否掌握、是否有成功案例。

这个阶段的特点是:看优点也看缺点,但忽略了隐性成本。

TypeScript的两面性:类型安全与开发效率的永恒博弈

TypeScript 在过去十年中从一个"有争议的实验"成长为前端开发的事实标准。根据 2025 年 State of JS 调查,超过 78% 的开发者在生产环境中使用 TypeScript。但与此同时,反对 TypeScript 的声音也从未消失——从 Svelte 宣布移除 TypeScript,到 Turbo 团队从 TypeScript 迁移回 Go,再到无数开发者在社交媒体上抱怨"类型体操"。

这种矛盾现象值得深思:为什么一个被广泛采用的技术,却始终伴随着强烈的质疑声?问题的核心不在于 TypeScript 本身的好坏,而在于我们如何看待软件开发中类型安全与开发效率之间的权衡。

 

类型系统的承诺与现实

 

TypeScript 的核心承诺是通过编译时类型检查,在代码运行前捕获潜在错误。这个承诺听起来很美好,但现实往往更复杂。

 

承诺:编译时捕获错误

 

支持者最常引用的论证是:"TypeScript 能在编译时发现 bug,避免运行时错误。" 这个论点确实有数据支撑。微软的一项研究显示,TypeScript 可以预防约 15% 的提交到主分支的 bug。听起来不错,但我们需要问一个更深层的问题:这 15% 的 bug 值得付出多大的代价?

CQRS和事件溯源:过度设计还是必要演进

博客分类: 

当我们谈论现代架构模式时,CQRS(命令查询职责分离)和事件溯源(Event Sourcing)经常被一起提及,就像它们是某种"高级架构套装"。但真相是,这两个模式既不是银弹,也不是毒药——它们是工具,而工具的价值取决于你用它解决什么问题。

 

从一个真实场景说起

 

想象你正在开发一个电商订单系统。传统的 CRUD 设计很直接:订单表存储当前状态,用户下单就 INSERT,修改订单就 UPDATE。一切看起来都很完美,直到产品经理走过来说:

"我们需要知道每个订单的完整修改历史,包括谁在什么时候改了什么。"

你的第一反应可能是加个审计日志表。但接下来:

"我们还需要实时的数据分析仪表板,显示订单状态分布、转化率、热力图……而且不能影响订单处理的性能。"

这时候,传统的单一数据模型开始显得捉襟见肘。读写混合在同一个数据结构上,写操作需要完整性约束,读操作需要复杂的聚合查询,它们的需求根本不在同一个频道上。

这就是 CQRS 和事件溯源试图解决的问题——但它们真的是最优解吗?

 

CQRS:分离不等于复杂

 

可观测性的三大误区:日志、指标和追踪都不是答案

博客分类: 

当你的生产系统在凌晨两点宕机时,你打开监控面板,看到的是什么?是满屏的红色告警?是上下跳动的 CPU 曲线?还是密密麻麻的错误日志?

如果你的答案是"以上都有",那么恭喜你,你可能正在经历可观测性实践中最常见的困境:拥有大量数据,却无法理解系统到底发生了什么

过去五年,可观测性(Observability)从一个新兴概念发展成了行业热词。OpenTelemetry 成为 CNCF 的明星项目,eBPF 技术让内核级监控成为可能,各大云厂商都推出了自己的可观测性解决方案。但与此同时,我们也看到了一个悖论:可观测性工具越来越多,系统却越来越难以理解

问题出在哪里?答案可能会让你意外:不是工具不够好,而是我们对可观测性的理解存在根本性偏差。

 

误区一:可观测性 = 日志 + 指标 + 追踪

 

这是最流行的可观测性定义,也是最具误导性的定义之一。

平台工程:开发者体验的下一个十年

博客分类: 

 

引言:从"能用"到"好用"的范式转变

 

2015年,你的团队刚刚完成了 DevOps 转型,开发人员终于可以自己部署应用了。但十年后的今天,你会发现工程师们面对的不再是"如何部署"的问题,而是"在20个工具之间如何协调"的困境。

这就是平台工程(Platform Engineering)兴起的背景——当 DevOps 把开发者从"等待运维"解放出来后,新的问题出现了:认知负担过载

今天我们来聊聊,为什么说平台工程不是 DevOps 的替代品,而是开发者体验(Developer Experience, DX)进化的必然结果,以及这对技术管理者意味着什么。

 

一、DevOps 的胜利与困境

 

 

DevOps 做对了什么

 

DevOps 运动的核心洞察是:消除开发与运维之间的墙。它带来了:

AI辅助开发工具如何改变软件工程实践

博客分类: 

在过去的几年里,人工智能技术的飞速发展正在深刻地改变着软件开发的方式。从代码补全到全栈应用生成,AI辅助开发工具已经从实验室走向了实际生产环境,成为越来越多开发者日常工作流程中不可或缺的一部分。2026年的今天,我们正站在一个转折点上:AI不再只是辅助工具,而是开始重新定义软件工程本身的实践方式。

 

AI辅助开发的演进历程

 

回顾AI辅助开发工具的发展,我们可以清晰地看到三个阶段的演进。第一阶段是简单的代码补全,IDE通过分析本地代码库和语法规则提供基础的自动完成功能。第二阶段是基于大语言模型的智能代码生成,工具能够根据注释或简单描述生成完整的函数甚至类。而我们现在正处于第三阶段:上下文感知的全栈开发助手,它们不仅能写代码,还能理解项目架构、调试问题、重构代码,甚至参与技术决策。

这种演进不是简单的功能叠加,而是开发范式的根本性转变。传统的软件开发流程是"人类思考→人类编码→机器执行",而AI辅助开发正在将其转变为"人类表达意图→AI生成实现→人类审核优化→机器执行"。这种转变的核心在于,开发者的角色从"代码编写者"向"架构设计者和代码审核者"转移。

 

实际应用场景与价值

 

模块化单体的回归:为什么我们要重新审视架构复杂度

博客分类: 

过去十年,微服务架构几乎成为了云原生应用的代名词。从 Netflix 到 Amazon,从创业公司到传统企业,似乎每个人都在把单体应用拆分成数十个甚至上百个微服务。但在 2026 年,我们看到了一个有趣的现象:越来越多的团队开始质疑这种架构选择,甚至主动将微服务重新整合回"模块化单体"(Modular Monolith)。

这不是技术的倒退,而是一次深刻的架构反思。

 

微服务的承诺与代价

 

2015 年左右,微服务架构带来了诱人的承诺:独立部署、技术栈自由、团队自治、水平扩展。Martin Fowler 的经典文章描绘了一幅美好的蓝图——每个服务由一个小团队维护,可以独立发布,使用最适合的技术栈。

但现实远比理想复杂。

当你把一个应用拆分成 50 个微服务时,你实际上是在用分布式系统的复杂度换取模块化的便利性。这个交易是否划算,取决于你的组织规模、技术成熟度,以及最重要的——你是否真的需要独立部署和水平扩展

对于大多数团队来说,答案是否定的。

一个典型的微服务架构带来的隐性成本包括:

页面