思考笔记

李文业的思考笔记


  • 首页

  • 关于

  • 分类

  • 归档

阅读清单

发表于 2026/03/07 | 分类于 定时任务生成

当前阅读总时间是:19,817小时

你今天还差多少达成目标 3小时
AI工具使用时长 2,270.5小时
冥想时长(本月) 892.75(2.17)小时
你已经读了多少本书 3624本
阅读全文 »

从vibe coding到Claws:Karpathy在2026年初到底看见了什么

发表于 2026/03/07 | 分类于 AI专题

风格参考:万维钢(《精英日课》作者)—— 跨学科引证,框架式拆解,加粗关键洞察,用数据和类比交叉验证每个论点;局部借用 Paul Graham 的短句节奏感。

引子:追 Karpathy,追的不是热词

如果你只是偶尔刷到 Andrej Karpathy 的名字,你可能觉得他就是那个特别会造词的人——“Software 2.0”“vibe coding”,每隔一阵蹦出一个能传播的短语。

这个印象不算错,但严重不够。

Karpathy 真正厉害的地方,从来不是“他造的词是不是永远正确”,而是他往往能在一个拐点刚刚到来、行业里大多数人还只有朦胧感觉的时候,先把那个拐点压缩成一句能记住、能传播、能继续推演的话。这是一种非常稀缺的能力:把模糊的体感变成清晰的公共语言。

过去如此——从“Software 2.0”到“vibe coding”。现在也如此——从“agentic engineering”到“Claws”。

2025 年 12 月到 2026 年 2 月之间,他的更新不只是多了几个新名词。如果你把他这几个月在 X 上的短帖、GitHub 上的新项目、以及零星访谈串起来看,会发现一张越来越清晰的地图:程序员工作的重心正在整体上移——从手写代码,到组织上下文、分派任务、设计验证、审查结果,再到多 agent 系统的编排。

这不是一条线索,而是一整条主线。下面我们一层一层拆。


一、底盘:2025 年末那篇综述里埋下的判断

要读懂 Karpathy 在 2026 年初的兴奋,得先回到 2025 年 12 月 19 日他发的那篇《2025 LLM Year in Review》。那是他至今最后一篇长文,也是后来很多判断的总纲。

里面有两个关键观察。

第一个:他不再把 LLM 看成“动物”,而更像“幽灵”。 一种有明显能力、不均匀智能、又带着强烈“锯齿感”的系统。它在某些维度上超过人类,在另一些维度上又脆弱得离谱。这个隐喻很重要,因为它决定了他后来如何看待 coding agents——它们不是成熟员工,而是某种需要被召唤、被约束、被分派、被反复校验的非人式智能。

第二个:像 Cursor 这样的产品,揭示的不是“更好补全”的小升级,而是一整层新的 LLM 应用范式。 这一层的关键不只是模型本身,而是上下文工程、编排、应用专用 GUI、自治程度滑杆。真正有价值的东西不在“会不会生成几行代码”,而在于能不能把模型置于一个合适的操作环境里,让它带着足够上下文、工具、权限和反馈循环去工作。

他还专门谈到 Claude Code,把它视为第一个真正让他感到“AI 住在你电脑上”的东西。他甚至直言,OpenAI 当年把 Codex 的优先级顺序弄反了——先去做云端容器里跑的编码系统,而不是先做一个真正运行在开发者本地环境里的 AI 助手。

这句话在 2026 年初回头看,含义比当时更大。因为他后来对本地 agent、CLI、NanoClaw、“被小幽灵附身的设备”的兴趣,根全埋在这里。


二、从谨慎到震动:一个原本不全信 agent 的人改口了

要理解这波变化的分量,必须记住一件事:Karpathy 在几个月前并没有这么乐观。

2025 年 10 月,他在一次公开对谈里谈“year of agents”时,反而相当保守。他给 agent 下了一个更严格的定义:不是偶尔能跑个 demo 的系统,而是像一个实习生甚至员工一样,能在复杂环境中长期独立完成任务。按这个标准,他当时的判断是——真正的 agent 可能还需要大约十年。

他甚至点名说,coding agents 当然已经能做不少样板工作,但对 nanochat 那种“智力密度高、精度要求高”的仓库,他不觉得 agent 已经足够好。

这段话今天回看极其重要。它说明 Karpathy 最近的兴奋,不是“逢新必吹”的兴奋,而是在原本谨慎的基线之上发生了体感性变化。 如果连一个原本相对怀疑的人,都在 2025 年 12 月到 2026 年 2 月之间持续改口,那么这波变化就值得认真对待。

转折开始于一种“落后感”。

2025 年 12 月 26 日,他发了一条动态:自己从没像现在这样觉得在编程这件事上“落后了”。后面跟着一个判断:程序员的职业正在被“dramatically refactored”。如果能把过去一年里新出现的那些东西真正串起来用,自己的效能可能会强十倍。

这不是对单点能力的赞叹,而是对一个新抽象层突然成形的惊讶。

他列举的新对象更有意思:agents、subagents、prompts、contexts、memory、modes、permissions、tools、plugins、skills、hooks、MCP、LSP、slash commands、workflows……这串名词像一个杂乱工具箱,但他想表达的恰恰是:软件工程的前台对象已经变了。程序员不再只是面对“代码文件 + 编辑器 + 编译器”,而是开始面对一整套由代理、上下文、记忆、权限、工具协议和工作流组成的新运行环境。

用一句话说:编程活动的基本单位正在从“写代码”转向“调度智能”。


三、工作流翻转:两个月内的“相变”

2026 年 1 月 26 日左右,Karpathy 发出了一串“random notes from Claude coding”。这是理解他最近几个月最核心的一手材料。

里面最关键的一句:他自己的工作流在短短两个月里,从 80% 手写/自动补全 + 20% agents,迅速翻转成 80% agents + 20% 修改收尾。 他还说,自己现在“mostly programming in English”。

这不是修辞游戏。这是在描述劳动重心的真实移动。

物理学里有一个概念叫“相变”——水从液态到固态的转变不是匀速发生的,而是在温度到达某个临界点后突然切换。Karpathy 这一轮描述更像相变而不是渐变:前面很长一段时间,coding agents 都像不稳定的实验玩具,能偶尔惊艳,却无法可靠纳入主流程;到了 2025 年 12 月前后,某些模型能力、工具链和使用方式叠加到一起,突然跨过了可用阈值,从“演示级”变成“工作级”。

他甚至直接说,这是他大约二十年编程生涯里最大的工作流变化,而且几乎是在几周之内发生的。

翻译成人话:过去你在编辑器里“写”;现在你越来越像在给一批高智力但不稳定的实习生“分任务”。 你要提供目标、上下文、边界、测试与回滚机制,然后等它交付,再做判断、审阅和修补。代码依然重要,但它不再是程序员最稀缺的产出。真正变得更稀缺的,是把问题说清楚、把执行过程包起来、把结果验明白的能力。


四、新的错误谱系,与为什么仍然是巨大净提升

Karpathy 没有把这件事描写成完美自动化。恰恰相反。

他对 coding agents 的问题说得非常具体:过去人类手写代码时,常见错误往往是语法型、低级型的;而现在错误越来越多地变成更微妙的概念性错误——模型整体思路听起来对、代码也能跑,但在架构边界、业务假设、隐含约束和权衡取舍上出现偏差。这种错误比拼写错误更危险,因为它们更像“看起来很合理的误导”。

他点出了一组极有代表性的 agent 失真:

  • 擅自做假设,不主动请求澄清。
  • 不主动暴露上下文中的冲突和 tradeoff。
  • 过于顺从、过于“sycophantic”——几乎不会像一个好同事那样在关键地方顶回来。
  • 喜欢过度工程化:膨胀抽象层、堆 API、留下死代码。

认知科学家 Gary Klein 研究过专家决策,发现优秀专家最重要的能力之一是**“及时发出异议”——在团队即将走上错误路径时主动喊停。LLM 恰恰缺失这种能力。它的危险不只是“笨”,而是“太会顺着你往前跑”,以至于它在错误方向上也能表现出极强执行力。“流畅输出”被误判成“正确理解”——这是 agent 时代最隐蔽的风险。**

但有意思的是,正是在列完这么多毛病之后,Karpathy 仍然给出一个非常明确的判断:这是净巨大提升,而且他已经很难想象再回到纯手写的旧模式。

这个结论一开始看似矛盾,但其实非常合理。原因在于,coding agents 真正带来的不只是把原有流程加速 20%,而是让一些原本“不值得做”“懒得做”“不会做”的事情第一次进入了可行区间。

他特别强调了一个人类很难复制的维度:tenacity——韧性与持续折腾的能力。 人会累、会烦、会因连续碰壁而气馁。Agent 不会。它可以在 SSH、依赖、部署、服务、日志、回归测试之间一遍遍试,直到某个长链条被打通。他举过一个具体例子:让 agent 在本地机器上一路完成登录、配 key、跑 vLLM、下载并 benchmark 模型、起服务、做 dashboard、写 systemd、回传报告,整个过程约三十分钟。

经济学家 Tyler Cowen 有一个判断:新技术真正的威力往往不是“让老任务更快”,而是“让新类别的任务变得可行”。 Karpathy 的体验完美印证了这一点——提升不只体现在老任务的吞吐量上,也体现在你愿意探索的任务空间变大了。许多过去得压箱底几周的想法,开始可以在几个晚上里先弄出原型。


五、三个词的递进:从代码到编排

外界最熟悉 Karpathy 的流行语,也许还是“vibe coding”。那个词之所以会火,是因为它精准描述了第一波大众体验:你不再逐字逐句写代码,而是带着一种半即兴、半对话式的感觉,让 AI 帮你把东西凑出来。它标记了一个文化门槛:从“代码必须由程序员写”到“代码可以由会说需求的人协作生成”。

但到了 2026 年初,Karpathy 显然觉得这个词不够了。

原因很简单:当工具从“你随便聊聊,它给你拼出个小玩意儿”进化到“它能在数十分钟里持续完成长链条工程任务”,工作的本质就变了。此时最大的挑战不再是“敢不敢把手放开”,而是如何设置上下文、分解子任务、选择工具、调权限、看日志、做验证、控回滚、管并行。这些工作已经超出了“凭 vibe 玩一玩”的层面,进入了一种需要方法论、经验和审美的工程活动。

所以他开始用**“agentic engineering”**。这个词要强调两层意思:一层是“agentic”——你并不是 99% 时间都在直接写代码,而是在调动代理执行;另一层是“engineering”——这不是完全无门槛的自动化,反而需要更高层次的专业判断、创造性约束和科学式验证。

Karpathy 不是在宣布“工程师不重要了”,而是在说:工程师的重要性正在上移,且形式正在变化。 写代码本身变便宜了,高质量地组织代码生成与验证变贵了。

然后到了 2 月下旬,他又把视线往上抬了一层——“Claws”。

他专门买了一台 Mac mini 来折腾 Claws。这个动作本身很有象征意味:他不是只在抽象层面谈概念,而是真的把一台物理机器当成实验场,去想象“在个人硬件上常驻的 agent 编排系统”会长什么样。

Karpathy 对 Claws 的定义很清楚:它是叠在 LLM agents 之上的新层,处理的不是单次回答,而是 orchestration、scheduling、context、tool calls、persistence。如果说单个 coding agent 解决的是“一个代理怎样在给定上下文里执行任务”,那么 Claw 关注的是“多个代理、多个工具、多个任务、多个时间尺度,怎样被持续组织起来”。

管理学家 Henry Mintzberg 把组织的协调机制分成五种,其中最高阶的一种叫“相互调适”(mutual adjustment)——成员之间通过非正式沟通实时协调。 Claws 要做的,本质上就是为一群 agent 建立这种高阶协调机制。行业竞争不再只在模型能力上,也不只在 IDE 内嵌补全上,而会越来越落在多代理运行时与长期编排层。

三个词放在一起,你会看见一条清晰主线:vibe coding 描述的是“代码生成”变轻了;agentic engineering 描述的是“工程师角色”向上移了;Claws 描述的是“代理组织层”开始成为新的竞争焦点。从代码,到工程,到运行时编排——层层递进。


六、旧技术的新生命,与 Builder 的底色

Karpathy 最近还有一个表面“逆流”的判断:他开始更明确地谈 CLI 的价值。

命令行恰恰因为是“legacy technology”,所以对 AI agents 特别友好——它天然就是文本接口,规则相对清晰,输入输出边界明确,自动化历史悠久,代理几乎可以原生使用它。过去十年软件行业偏爱 GUI 和所见即所得,但在 agent 时代,这反而成了劣势。对人友好的界面,不一定对机器友好;对机器友好的界面,往往具备良好的文本可操作性、组合性和可脚本化特征。

这和他在 2025 年 YC 演讲里讲的“Build. For. Agents.”一脉相承。大前提是我们已经进入 Software 3.0 阶段:自然语言成为新的编程界面,软件不再只被人点击,也越来越多地被机器代理调用。最有竞争力的软件,不是只有漂亮 GUI 的软件,而是既能服务人,也能被 agent 稳定调用的软件。

于是你发现,很多“旧东西”——CLI、容器、日志、文本配置、简单脚本、明确的 I/O 边界——在这个时代突然重新变得性感。不是因为人类退回过去,而是因为 agent 需要一个可以可靠行动的环境。

这也解释了他对 NanoClaw 的偏爱。NanoClaw 核心引擎只有约 4000 行代码,默认跑在容器里,把“skills”更接近做成配置,追求“最大可分叉性”。这套偏好和他在 microgpt、nanochat 上长期表现出来的审美完全一致:能小就小,能看清楚就看清楚,能 fork 就 fork,能本地跑就别先云端化。

说到 nanochat,它的进展本身就很能说明问题。仓库 README 显示,截至 2026 年 3 月 4 日,在一台 8×H100 节点上达到超过 GPT-2 基线的训练时间已经压到约 2.02 小时,成本约 48 美元(spot 则低至 15 美元左右)。而 2019 年 OpenAI 训练 GPT-2,大约用 32 个 TPU v3 跑了 7 天,估算成本在数万美元量级。成本降幅达数百倍。

这类变化和他对 coding agents 的兴奋不是两条线:一条讲“执行层开始可用”,另一条讲“底层模型实验与迭代的门槛在快速下降”。两者叠加,才构成他“软件工程正在重构”的强烈感受。


七、不要神化,也不要低估

把这些动态串起来后,最常见的误区是走向两个极端。

过度乐观的人会理解成“以后程序员只要讲中文英文就行了”。立刻反弹的人则抓住 agent 的各种错误,得出“这不过是新一轮 hype”的结论。

Karpathy 自己其实给了比这两端都更成熟的位置:他一边说这是二十年来最大的工作流变化,一边又明确说“no need for IDE”之类的狂热和“agent swarm”之类的夸张,现在都还太过头。变化是真的,但宣传语常常跑得比现实更快。

更准确的理解应该是:coding agents 在 2025 年 12 月前后跨过了一个实用阈值,使得“代理式工程”第一次大规模进入主流程。但这个新流程并不是自动稳定的——它需要高度结构化的输入、清晰的上下文和强验证能力,尤其适合那些能够被明确规格化、能够回放日志、能够自动化测试、能够在真实反馈里闭环的任务。

它更像一台能力很强但需要良好工装夹具的机器,而不是一个可以随便丢进去任何模糊需求的魔法盒子。

从团队层面看,这波变化最直接的后果,可能不是“谁先不用写代码”,而是谁先建立起一套适合 agent 工作的工程基础设施:更明确的仓库结构、更完备的测试、更好的日志和可观测性、更严格的权限边界、更可调用的 CLI、更标准化的工具接口。没有这些,agent 只会把原有的混乱放大;有了这些,agent 才可能把人的高层意图快速转成可运行结果。

Karpathy 迷恋的,从来不是无秩序的自动化,而是在良好约束中的高杠杆自治。


结语:一张从底到顶的栈式地图

最后值得记住的,不是某个单独词汇,而是一个三层结构。

第一层是模型层: 更强的推理、代码和工具使用能力,让代理终于“基本可用”。

第二层是 agent 层: 单个代理能够在较长链路中执行、调试、修复、再试。

第三层是 Claw / 编排层: 多个代理、多个工具、多个时间尺度与长期上下文如何被组织起来。

Karpathy 过去几个月几乎把每一层都碰了一遍。于是他的观察不再像零碎感想,而像一份从底到顶逐渐成形的栈式地图。

如果一定要用一句话概括他最近的动态:他不是在宣布“AI 开始替你写代码”,而是在宣布软件生产关系开始被重写。 在旧秩序里,代码是稀缺产出,程序员的价值主要体现在亲自生产代码的能力上。在新秩序里,代码越来越便宜——甚至便宜到会出现他自己担心的那种“slopacolypse”——于是最稀缺的东西开始变成判断力、上下文管理、系统边界意识、测试设计、回滚能力和长期责任归属。

代码仍然重要。但代码不再自动等于价值。

人正在从低层执行中部分抽离,转而负责更高层的意图、组织与责任。而那,才是这轮变化真正的开始。

速度的债务

发表于 2026/03/07 | 分类于 AI专题

速度的债务

风格:Paul Graham(essay 体)


上周我丢了六个番茄。

不是超市里的番茄,是番茄钟——我用自己写的 App 记录的六段专注时间。它们因为一个 token 过期的 bug,在重新登录时被静默清除了。永久丢失,无法恢复。

六个番茄钟,大约三个小时的工作记录。放在任何规模的公司里,这不算事故。但对我来说,这件事的刺痛程度远超它的实际损失。

因为它暴露了一个我一直在回避的问题。


我现在同时运维着五个个人项目:番茄 App、ClawChat、OpenClaw、喝水提醒、还有一套数字资产知识体系。全部用 AI 辅助开发。

AI 确实让我快了很多。一个后端服务,从零到上线可以压缩到一天——ClawChat 的后端就是 3 月 2 日一天之内推了十个 commit 上去的。那种速度带来的兴奋感是真实的:你觉得自己像一个全栈团队,什么都能做,什么都在推进。

但速度有一个性质,它不会告诉你自己是危险的。

3 月 5 日,ClawChat 开始返回“暂时不可用”。HTTP 上游不可达,系统直接给用户一个固定文案,没有任何自动回退。3 月 6 日,番茄后端雪崩了——一台 1 核 2GB 的阿里云小机器,用着 Tomcat 默认的 120 个线程,一条慢 SQL 触发锁等待,客户端疯狂重试,线程池耗尽,整个服务躺平。

两天,两次事故,两个不同的项目。


这两次事故表面上毫无关系。一个是聊天工具的上游不可达,一个是番茄钟的后端雪崩。但当你把它们放在一起看,会发现根因完全一样:我只设计了 happy path。

失败路径从来没有被当作一等公民。

这不是偶然的疏忽。如果你仔细想,会发现失败路径被忽略是一个结构性问题,而不是个人懒惰的问题。

写 happy path 有即时反馈——功能跑通了,你能看到它工作。写失败路径的回报是什么?什么都没有发生。你花了半天写了一堆异常处理逻辑,最好的结果是它永远不被触发。这种激励不对等会让所有人——不管多有经验——在时间紧张时本能地跳过失败路径。

而 AI 让这个倾向变得更严重了。因为 AI 进一步压缩了 happy path 的开发时间,让你觉得“功能已经做完了”的时间点来得更早。但失败路径不能被同比压缩——它需要你理解系统的边界条件,需要你被伤过才有真实体感。读十篇 best practice 也不如亲自丢一次数据。


速度创造了一种特殊的债务。

每上线一个新服务,你就签了一份永久运维合同。开发是一次性的,运维是永久性的。AI 把开发速度提了三到五倍,但运维面积也跟着扩大了三到五倍。

区别在于:开发时你有 AI 帮你写代码,兴奋感和进展感是实时的。运维时你一个人,凌晨三点服务挂了没人帮你看,你甚至可能在睡觉。

一天十个 commit 推上去时的那种感觉——“我好高效,我好强大”——实际上掩盖了一个事实:你刚刚给自己制造了一个需要永久维护的东西,而你对它的失败模式一无所知。

公司里有 SRE、有 oncall、有混沌工程帮你兜底。个人项目呢?没有人帮你兜。你就是 SRE,你就是 oncall,你也是唯一的用户。


我从这一周的事故里学到的最有用的一件事,不是“写更多测试”或“加更多监控”。

是这个:自愈优先于监控。

一个人运维的时候,告警是没有用的。告警来了你可能在睡觉,可能在开会,可能在另一个项目的深度工作里。你不可能 24 小时盯着。所以正确的问题不是“怎么更早发现问题”,而是“问题发生时能不能自动恢复”。

进程挂了?与其发通知等你来重启,不如让 systemd 自动拉起来。请求堆积了?与其发通知等你来限流,不如在代码里设好 max inflight,超了直接拒绝。上游不可达?与其发通知等你来排查,不如自动 fallback 到 CLI 调用。

以后给 AI 提运维需求时,默认先问一句:这个能不能做成自愈的?而不是先问怎么监控。


另一个刺痛来自那台 1 核小机器。

番茄后端跑在阿里云一台 1 核 2GB 的 ECS 上。Tomcat 默认线程池 200,HikariCP 默认连接池 10。这些默认值是面向多核服务器设计的——没有哪个框架会在文档里提醒你“如果你是单核机器请把线程数调到 8”。

我从来没改过这些参数。它们在正常情况下确实够用。直到一条慢 SQL 出现,线程全部阻塞,连接池耗尽,客户端重试把问题放大十倍,整个服务雪崩。

这是一个盲区。在公司里有 DBA 和 SRE 帮你做容量评估,你甚至不知道这件事需要有人做。等你自己做项目时,根本不会想到要检查线程池的默认值。

补上这个盲区其实只需要几分钟。单核机器,Web 线程池 4 到 8 个,DB 连接池 3 到 5 个,请求超时 10 到 30 秒。就这么几个数字。把运行参数从“默认没碰过”变成“我看过、我定的”就够了。

默认值不是安全值。这句话值得贴在显示器上。


这周还有一件小事让我警觉。

AI 给番茄后端写了一个 TimeConfig 的修复方案。测试通过了,AI 说“修复完成”。我信了,直接上线。结果发现改了一半。

这件事不大,但它揭示了人和 AI 协作中的一个缝隙:AI 说“完成了”不等于真的完成了。

我当前的工作流是:AI 写代码,AI 跑测试,AI 说完成,我上线。中间没有验收环节。这在 happy path 上没问题,在 edge case 上就会漏。

所以我给自己定了一个规则:以后让 AI 做修复或部署时,在需求最后加一句——修完之后,写一个部署后自动验证脚本,确认修复在线上真的生效。

代码正确性让 AI 验。功能可用性让 AI 验。线上真实性也让 AI 验。人只做最后一件事:判断体验好不好——这个功能用起来顺不顺,这个交互逻辑合不合理,下一步最该做什么。

AI 没有“作为用户使用产品”的真实感受。你作为唯一的真实用户,体验判断是不可替代的。


数据丢了之后我手写 SQL 把六个番茄补录回去了。补录能成功,是因为三个条件碰巧满足:我还记得、数据量小、我会写 SQL。这三个条件任意一个不满足,数据就永久消失。

这让我意识到,我对数据的保护方式是事故驱动的——番茄数据出过事所以备份了,ClawChat 还没出过事所以还没备份。不是设计驱动的。

盘点下来,ClawChat 的对话数据目前是裸奔状态。没有备份,没有恢复演练,一旦出事就是全量丢失。

“有备份”也不等于安全。很多人备份了但从来没恢复过,等真出事才发现备份是坏的。真正的数据安全有三级台阶:有总比没有好,能恢复比有备份好,自治运转比依赖人工好。


写到这里,我意识到这一周真正发生的事情不是“两次事故”。是一次认知升级。

从这些痛里,我提炼出了六份原则性文档。失败路径的三条底线。单核机器的容量基线。自愈优先原则。数据安全防护层次。人机协作验收模型。知识体系的进化机制。

这些文档不是规划出来的。它们是被痛出来的。每一篇都对应一次刺痛。

AI 时代最大的陷阱可能不是“AI 会不会取代你”,而是 AI 让你太快了——快到你来不及建立与速度匹配的判断力。你用一天时间上线一个服务,但你对它的运行环境、失败模式、容量极限的理解还停留在零。

速度是杠杆,但杠杆放大的不只是产出,也是风险。

唯一的解药不是减速——减速是反人性的。解药是在速度之后,主动补上那些被跳过的东西。每个项目进入运营期时,花半天时间过一遍:数据写入路径失败时会怎样?外部依赖有没有超时?关键链路有没有 fallback?运行参数是不是默认值?

半天的检查,能防住几个月的痛。

速度不是问题。不知道自己在负债,才是问题。

一个人运维五个项目的生存指南

发表于 2026/03/07 | 分类于 AI专题

一个人运维五个项目的生存指南

风格:阮一峰(技术科普体)


一、引言

我用 AI 辅助开发了五个个人项目:番茄钟 App(iOS + Spring Boot 后端)、ClawChat(聊天机器人)、OpenClaw(AI agent 框架)、喝水提醒、以及一套数字资产知识体系。

过去一周(3/1–3/6),其中两个项目接连出了线上事故。修完之后,我把教训整理成了六条原则。这篇文章是对它们的系统性梳理。

如果你也是一个人在做 side project,尤其是有后端服务在跑的那种,希望这些经验对你有用。


二、发生了什么

先说事实。

事故一(3/5):ClawChat 的上游服务 OpenClaw 不可达,HTTP 请求直接超时。系统没有任何回退机制,给用户返回一个固定的“暂时不可用”文案。根因是 launchd 启动时 PATH 环境变量与手动启动不同,导致调用了错误版本的二进制文件。

事故二(3/6):番茄 App 的 token 过期,触发重新登录,App 在重登时清除了本地缓存——包括 6 条尚未同步到服务器的番茄记录。与此同时,后端也出了问题:一条慢 SQL 引发锁等待,Tomcat 的 120 个线程全部阻塞,客户端重试请求不断涌入,连接池耗尽,整个服务雪崩。

两次事故的表象不同,但根因相同:只设计了正常流程(happy path),没有处理失败流程。


三、原则一:失败路径的三条底线

失败路径不可能穷举——一条正常流程对应的异常分支是指数级的。但以下三条底线成本低、收益高,值得作为硬性要求。

1. 用户数据不能静默丢失

凡是涉及用户创建的数据,失败时至少做到三件事:

  • 不删、不覆盖:未同步的数据是用户资产,不是临时缓存
  • 给用户一个可见的提示:不允许静默失败
  • 本地留一份兜底:关键数据有导出或恢复入口

反面案例:番茄 App 的 pendingSync 数据在重登时被清除,6 条记录永久丢失。

2. 上游变慢时不要把自己拖死

不需要完美的熔断体系,但至少做到:

  • 设 timeout:不要用框架默认的无限等待
  • 设 max inflight:不要让请求无限堆积
  • 客户端重试要有退避:5xx 或超时期间不做高频平推

反面案例:1 核机器用 120 线程默认值,慢 SQL + 客户端重试直接雪崩。

3. 关键路径加一个 fallback

不需要完美的降级方案,只要“不是直接给用户一个死胡同”:

  • HTTP 不可达 → 自动回退 CLI 调用
  • 主数据源失败 → 展示本地缓存 + 状态标记
  • 关键接口超时 → 返回降级响应而非空白

正面案例:ClawChat 修复后增加了 OPENCLAW_CLI_FALLBACK_ENABLED,HTTP 失败时自动回退 CLI。


四、原则二:小机器要主动校准参数

这是一个容易被忽略的盲区。框架的默认配置面向多核服务器设计,而大多数个人项目跑在 1 核 2GB 的小机器上。

以下是单核机器的关键参数速查表:

参数 框架默认值 单核建议值
Web 线程池(max-threads) 200 4–8
DB 连接池(maximum-pool-size) 10 3–5
请求超时(timeout) 无限/30s 10–30s
等待队列(accept-count) 100 16–32
连接泄漏检测(leak-detection) 关闭 10–15s

核心原则很简单:默认值不是安全值。 把运行参数从“默认没碰过”变成“我看过、我定的”,这件事十分钟就能做完,但能防住一次雪崩。

部署新服务时的检查项:

  1. 确认目标机器 CPU 核数和内存
  2. 按速查表设置线程池、连接池、超时参数
  3. 不使用框架默认值,显式写入配置文件
  4. 首次部署后观察 30 分钟 CPU 和内存水位

五、原则三:自愈优先于监控

一个人运维时,告警的价值是有限的。告警来了你可能在睡觉、开会、或者在另一个项目的深度工作里。你不可能 24 小时盯着。

所以正确的优先级是:先做自愈,再做监控。

场景 监控思路 自愈思路
进程挂了 发通知,等人来重启 systemd/launchd 自动重启
请求堆积 发通知,等人来限流 内置 max inflight,自动拒绝
上游不可达 发通知,等人来排查 自动 fallback(如 CLI 回退)
证书快过期 发通知,等人来续期 certbot 自动续期
连接池满 发通知,等人来杀连接 连接超时 + 泄漏检测自动释放

给 AI 提运维需求时,建议默认先问:这个能不能做成自愈的? 而不是先问“怎么监控”。

此外,减少运维面积本身也很重要。最有效的运维优化不是“更好地监控”,而是“少一个要监控的东西”。每上线新功能前问自己:能不能不加新服务?能不能复用已有的?


六、原则四:数据备份要设计驱动,不要事故驱动

事故之后我手写 SQL 把丢失的 6 个番茄补录回去了。补录之所以能成功,是因为三个条件碰巧满足:我还记得做了什么、数据量很小、我会写 SQL。这三个条件任意一个不满足,数据就永久消失。

盘点下来,我的数据保护是事故驱动的——出过事的就备份了,没出过事的就裸奔。

数据 有备份 能恢复
番茄记录(阿里云 MySQL) ✅ ✅
ClawChat 对话(腾讯云 MySQL) ❌ ❌
digital-assets 文档 ✅(Git) ✅
OpenClaw 配置(本机) ❓ ❓

空白格就是风险。

从“有备份”到真正安全,有三级台阶:

  1. 补齐空白:有 > 无。先把裸奔的数据备份起来
  2. 确认有效:能恢复 > 有备份。定期做恢复演练,确认备份不是坏的
  3. 自治运转:备份任务自身有健康检查,失败自动重试,无需人工干预

手动补录是最后手段,不应该是常规手段。


七、原则五:AI 说“完成了”需要分层验收

AI 给番茄后端写了一个 TimeConfig 修复,测试通过,AI 说“修复完成”。我信了,直接部署。结果发现改了一半。

问题不是 AI 能力不行,而是“修复完成”和“线上真的好了”之间缺少验收环节。

验收不是只能人来做。AI 和人应该各守不同层次:

层次 谁做 验什么
L1 代码正确性 AI 类型检查、lint、单元测试
L2 功能可用性 AI 冒烟测试:API 能响应、数据能存取
L3 线上真实性 AI 部署后自动验证,确认修复在线上生效
L4 体验判断 人 交互顺不顺、流程合不合理

当前的缺口在 L3。建议每个项目的部署流程最后一步,自动跑一组最小验证。例如:

  • 番茄后端:调一次 /api/current-pomodoro,确认 200 且延迟 < 500ms
  • ClawChat:发一条测试消息,确认收到回复且状态 SUCCESS

以后让 AI 做修复时,在需求最后加一句:“修完之后,写一个部署后自动验证脚本,确认修复在线上真的生效。”


八、原则六:让知识自己生长

这一周我还做了一件事:审视自己的知识沉淀体系。

3 月 1 日我建立了每日自动生成知识卡片的机制。运行一周后发现三个问题:

  1. 输入源不完整:最有价值的学习发生在 OpenClaw 对话里(故障排查、修复决策),但卡片生成流程捕捉不到
  2. 只做单日提炼:同一类问题反复出现(如 launchd PATH 差异),但系统无法跨天识别模式
  3. 知识存了不消费:卡片存到目录后没有任何流程引用它

对应的改进是建立三级进化节奏:

级别 频率 产出 目标
微进化 每日 1 张知识卡片 捕捉当天最有价值的认知点
大进化 每周 原则性文档 跨天模式识别,提炼结构性认知
超进化 每月 知识体系重构 淘汰过时认知,合并散点为专题

微进化产出原材料(卡片),大进化产出结构(原则)。没有微进化,大进化没有素材;没有大进化,微进化只是日记。

本文就是一次“大进化”的产出——它不可能从任何单张卡片中生成。


九、检查清单

最后,如果你也在一个人运维个人项目,这里是一份可以直接用的检查清单。每个项目进入“运营期”(你开始依赖它的数据,开始给它写运维文档)时,花半天过一遍:

  • 所有用户数据写入路径:失败时是否保留?是否有提示?
  • 所有外部依赖调用:是否有 timeout?是否有 max inflight?
  • 关键链路:是否有至少一个 fallback?
  • 运行参数:是否按实际机器校准过(线程池、连接池、队列)?
  • 数据备份:是否覆盖所有重要数据?是否做过恢复演练?
  • 部署流程:是否有自动化的部署后验证?
  • 进程管理:挂了能不能自动重启?

过完之后再补代码,优先级比加新功能高。


十、小结

AI 让独立开发者拥有了以前小团队才有的开发速度,但也同时制造了以前小团队才会遇到的运维问题。

开发是一次性的,运维是永久性的。每上线一个新服务,就是签了一份永久运维合同。

速度是好事,但速度之后要主动补上被跳过的东西。六条原则——失败路径底线、容量基线、自愈优先、数据安全、分层验收、知识进化——本质上都是同一件事:让你的系统有能力在你不在的时候照顾好自己。

(完)

一周两炸

发表于 2026/03/07 | 分类于 AI专题

一周两炸

风格:叙事复盘体(Netflix/Stripe 工程博客)


3 月 2 日,星期一:十个 commit

一天之内,我给 ClawChat 的后端推了十个 commit。

这是一个聊天机器人项目——用户在 Telegram 上发消息,后端调用 OpenClaw(我自己搭的 AI agent 框架)处理请求,再把结果返回去。整个后端是那天从零搭起来的,用 AI 辅助开发,速度非常快。每次调通一个功能点就 commit 一次,十个 commit 到晚上全部上线。

那天的感觉很好。像一个人同时扮演了产品经理、后端工程师和 DevOps,而且每个角色都在高效运转。AI 帮我写了大部分代码,我做架构决策和最终验证。从构思到部署,整个链条在一天内闭合。

我没有写任何异常处理逻辑。没有加 fallback。没有检查服务器的容量参数。这些事情在当时看起来完全不紧急——功能还没跑通,谁会去想失败路径?

三天后我为此付出了代价。


3 月 5 日,星期四:ClawChat 不说话了

下午我发现 ClawChat 不回消息了。发什么都是同一句话:“暂时不可用”。

排查了一会儿,发现问题出在上游。ClawChat 的后端通过 HTTP 调用 OpenClaw,而 OpenClaw 的进程是通过 macOS 的 launchd 托管启动的。当天 launchd 重启了这个进程,但 launchd 环境下的 PATH 和我手动启动时不一样——它调用了一个错误版本的二进制文件,导致 OpenClaw 实际上没有正常运行。

HTTP 请求全部超时。ClawChat 的后端没有任何回退逻辑——上游不可达,它就直接返回一个固定文案。没有尝试 CLI 调用,没有尝试缓存,没有尝试降级,没有告警。静默地、优雅地、彻底地失败了。

修复本身不难。两步:修正 launchd 的 PATH 配置,加一个环境变量 OPENCLAW_CLI_FALLBACK_ENABLED 让 HTTP 失败时自动回退 CLI。

但修完之后我坐在那里想了一会儿。这个 fallback 逻辑应该在三天前就写好的。不,应该在 3 月 2 日那十个 commit 里的某一个就包含了。我当时为什么没写?

因为没有发生过。你不会给一个还没出过故障的系统写故障恢复逻辑——这是人类的一个结构性盲区。失败路径的回报是“什么都没有发生”,所以它在任何优先级排序中都会排在最后。


3 月 6 日,星期五上午:六个番茄消失了

ClawChat 的事还没消化完,番茄 App 出事了。

事情是这样的:番茄钟 App 的 token 过期了,需要重新登录。App 在重登流程里清除了本地缓存——包括一个叫 pendingSync 的数据结构。这个结构里存着 6 条已经完成但尚未同步到服务器的番茄钟记录。

清除 = 永久丢失。没有确认弹窗。没有警告提示。没有本地备份。6 条记录,大约 3 个小时的专注时间,安静地消失了。

我当时的第一反应是恼怒。第二反应是——我还记得那六个番茄分别是什么时候做的、做了什么。于是我打开 MySQL 客户端,手写 SQL 把它们一条一条补录回去。

补录成功了。但这件事让我后背发凉。成功的前提是三个条件碰巧同时满足:我还记得、数据量小到可以手动恢复、我会写 SQL。这三个条件任意一个不满足——比如丢了 60 个而不是 6 个,比如过了一周我才发现——数据就真的没了。

事后补录不应该是数据保护的手段。它是所有自动保护都失败后的最后手段。而我的系统里,它成了唯一的手段。


3 月 6 日,星期五下午:雪崩

番茄的事还在处理,后端彻底炸了。

番茄 App 的后端跑在阿里云一台 1 核 2GB 的 ECS 上,用的 Spring Boot + Tomcat。Tomcat 的默认线程池大小是 200——我当时设成了 120,觉得已经“调低了”。HikariCP 的连接池是默认值 10。

触发雪崩的直接原因是一条慢 SQL。这条 SQL 在正常情况下执行时间可接受,但当时数据库锁等待时间变长,单条 SQL 的执行时间从几十毫秒涨到了几秒。

然后是连锁反应:

  1. 慢 SQL 导致处理线程长时间阻塞
  2. 120 个线程迅速被占满
  3. 新请求全部排队等待
  4. 客户端没有退避逻辑,超时后立即重试
  5. 重试请求涌入,线程池更加堵塞
  6. 数据库连接池也被占满,新请求直接报错
  7. 系统进入完全不可用状态

整个过程大约十分钟。从第一条慢 SQL 到全面雪崩,十分钟。

修复过程里我学到了一个事实:对一台 1 核 CPU 的机器来说,120 个线程不是“调低了”,而是荒谬地高。单核 CPU 同一时刻只能执行一个线程,其余全在排队和上下文切换。合理值是 4 到 8 个。120 线程的 Tomcat 跑在 1 核机器上,就像一个只有一个窗口的银行叫了 120 个号——你以为叫得越多处理越快,实际上窗口一次只能服务一个人,其余 119 个人全在大厅里互相踩脚。

我从来没有想过要检查这个参数。在公司里,这是 SRE 或 DBA 的事。他们帮你做容量评估、帮你调参数、帮你设告警。等你一个人做项目时,你根本不知道有这层工作要做。


3 月 6 日,星期五晚上:数据裸奔

修完雪崩之后,我做了一件以前从来没做过的事:盘点所有项目的数据备份状态。

结果让我出了一身冷汗。

番茄的 MySQL 备份了,因为之前出过事。digital-assets 文档在 Gitee 上有 Git 备份。但 ClawChat 的对话数据——跑在腾讯云的 MySQL 上——完全没有备份。没有 mysqldump,没有快照,没有任何恢复手段。如果那台服务器的硬盘坏了,所有对话记录全量丢失。

OpenClaw 的本机配置和会话数据,备份状态不明。腾讯云服务器有没有开快照,我也不确定。

这就是“事故驱动型”数据保护的必然结果:出过事的地方有了防护,没出过事的地方一片裸奔。你以为自己是安全的,直到你花十分钟做一次盘点,发现到处都是洞。


3 月 7 日,星期六:清算日

第二天是周六。我花了一整天做了一件事:把这一周的所有痛点、修复过程和教训提炼成系统性认知。

不是写一篇“本周总结”那种流水账。是坐下来,把每一次刺痛拆开,问自己:这个问题是个案还是结构性的?如果是结构性的,最小化的防护原则是什么?

六个小时之后,出来了六份文档:

一、失败路径三条底线。 不追求覆盖所有失败路径——那是不可能的——但三条底线必须做到:用户数据不能静默丢失,上游变慢时不要把自己拖死,关键路径至少有一个 fallback。

二、单核小机器容量基线。 一张速查表:Web 线程池 4–8,DB 连接池 3–5,请求超时 10–30 秒,连接泄漏检测 10–15 秒。不是精确值,但比“框架默认值”安全一百倍。

三、自愈优先原则。 一个人运维时,自愈比监控更有价值。进程挂了自动重启,请求超了自动拒绝,上游不可达自动回退。给 AI 提需求时,默认先问“能不能做成自愈的”。

四、数据安全三级台阶。 第一级补齐空白(有 > 无),第二级确认有效(能恢复 > 有备份),第三级自治运转(无需人工干预)。手动补录是最后手段,不是常规手段。

五、人机协作分层验收。 AI 验代码正确性、功能可用性、线上真实性。人只验体验判断——用起来顺不顺、交互合不合理、下一步该做什么。AI 说“完成了”不等于真的完成了,需要部署后自动验证。

六、知识体系三级进化。 每日微进化(自动生成知识卡片),每周大进化(跨天复盘提炼原则),每月超进化(淘汰过时认知、合并散点为专题)。微进化产出原材料,大进化产出结构。没有大进化,微进化只是日记。


后记:速度与债务

回头看这一周,我想说的其实只有一件事。

AI 让开发变快了。这是真的。一个后端服务一天上线,一套知识体系一周建起来,这在两年前不可想象。但“跑通”和“跑稳”之间的差距没有被缩小。AI 加速了代码编写,但测试、环境适配、容量校准、失败路径设计,这些东西没有被等比例加速。

结果就是:你以三到五倍的速度制造系统,也以三到五倍的速度制造运维债务。每上线一个新服务,就是签了一份永久运维合同。开发时的兴奋会掩盖运维时的痛苦——写代码有即时反馈,运维的回报是“什么都没坏”。

3 月 2 日那十个 commit 的兴奋感,到 3 月 6 日的雪崩面前一文不值。

我不是要说“别用 AI”或者“慢下来”。减速是反人性的。我想说的是:速度之后,要有一个主动补课的环节。每个项目从“跑通了”进入“我开始依赖它”的阶段时,花半天时间,过一遍失败路径、容量参数、数据备份、自愈机制。

半天时间。能防住几个月的痛。

这一周我丢了六个番茄、经历了一次雪崩、发现数据在裸奔。作为交换,我得到了六份原则性文档和一个核心认知:

速度是杠杆。杠杆放大的不只是产出,也是风险。知道自己在负债,比负债本身更重要。

(完)

职场安全感的工程学:一次小事故引发的九个认知升级

发表于 2026/03/05 | 分类于 职场

职场安全感的工程学:一次小事故引发的九个认知升级

风格:万维钢(精英日课式)


引子

今天我们不讲物理学,也不讲博弈论,我们来讲一个发生在职场里的小故事。这个故事的主角不是创业者也不是 CEO,而是一个普通程序员。他在经历了一次算不上重大的线上事故之后,整理出了一套非常实用的职场生存方法论。

事情很简单。他所在的团队出了一个线上 bug,不是那种会导致系统崩溃的灾难性故障,而是那种常见的、让人不舒服的小事故。问题出来之后,他的领导在工作群里直接点名训斥了负责那段代码的同事,说他“做事不靠谱”“对自己的代码不熟”“以后不要再提交代码了”。

有意思的是,被骂的人不是他,事故也不是他造成的。可他整个下午到晚上都处在一种隐隐绷紧的状态里。

为什么一个旁观者会被别人的训斥刺痛?这个问题的答案,涉及组织行为学里一个非常重要的概念。


一、心理安全感:Google 发现的高效团队第一要素

哈佛商学院教授 Amy Edmondson 在 1999 年提出了一个概念,叫做心理安全感(Psychological Safety)。她的定义很精确:心理安全感是团队成员共同持有的一种信念——在这个团队里,承担人际风险是安全的。

什么叫“人际风险”?就是你提出一个可能被认为愚蠢的问题、承认一个错误、提出一个不同意见、或者暴露自己不懂的地方——这些行为在人际层面都是有风险的。心理安全感高的团队里,人们相信这些行为不会导致自己被惩罚、被嘲笑或被边缘化。

Google 在 2015 年做了一个著名的内部研究项目叫亚里士多德计划(Project Aristotle),他们分析了 180 多个团队,试图找出高效团队的共同特征。结果发现,排在第一位的既不是团队成员的智商,也不是大家的技术水平,而是心理安全感。

现在你就能理解那个程序员为什么会被刺痛了。领导在群里公开训斥同事,传递的信号非常明确:在这个团队里,一旦出了问题,错误不只是被当作技术问题来处理,它会迅速变成对一个人的公开否定。问题从“系统哪里脆弱”滑向了“你靠不靠谱”——这是一个从事到人的危险转换。

当旁观者看到这种转换时,大脑的第一反应不是“他怎么犯了这个错”,而是“如果下次轮到我呢”。这不是矫情,这是你的风险评估系统在正常工作。

认知工具 1:当你在团队里感到莫名焦虑时,检查一下,是不是心理安全感出了问题。焦虑往往不是你太敏感,而是你的系统在告诉你:这个环境对暴露错误不够宽容。


二、情绪承接的三步法:先做人,再做事

故事里有一个细节很值得学习。那个被训斥的同事就坐在主人公旁边,整个人气压很低。主人公当时没有讲什么大道理,而是很自然地跟他说了一些话,大意是:出了事肯定要有人背锅,领导不想背那就得下面的人来,你的代码出了 bug,现实就是这样。

这是一种很坦诚的安慰——不粉饰太平,不装世界公平,也不说“别想太多”。它有力量,因为它承认了现实的残酷。但它也有一个隐患:它可能让人滑向无力感,仿佛结论就是“反正总得有人背,别挣扎了”。

更好的做法是什么?组织心理学里有一个很成熟的框架,叫做情绪承接三步法:

第一步,先接住情绪。 “群里那段话确实很重,换成谁都不会舒服。”——你不需要帮他解决问题,只需要让他知道:我看见你了,你的感受是正当的。

第二步,承认现实,但不宿命化。 “事故里会有人被追责,这是事实。但我们至少可以把事实链条整理清楚,别让事情变成对你这个人的定性。”——现实归现实,但现实不等于终局。

第三步,给一个具体可做的动作。 “我们一起梳理一下时间线,确认过谁、看过什么指标、现在线索有哪些。”——人只要重新获得一点点行动感,就会从羞耻和恐惧里往外走。

这个框架的精髓在于:先做人,再做事。但“做人”不是停在情绪里打转,而是通过给对方一个可以行动的方向,帮他从被动承受变成主动应对。

认知工具 2:安慰别人时,不要直接跳到“解决方案”或“分析原因”。先承接情绪,再承认现实,最后给一个具体的行动。人一旦能做点什么,恐惧就会减轻。


三、归属感的清醒定位

这件事还触发了一个更深层的觉察:主人公在这个团队里,其实一直没有太强的归属感。

归属感这个词听起来抽象,但其实很具体。它不是大家一起吃饭、开玩笑那么简单。它的核心是:你在这个环境里,能不能作为一个不完美的人被允许存在? 能不能在事情出错时依然被当作团队的一部分,而不是被迅速切割出去的责任点?能不能在表达看法时不用先担心被理解成顶撞、逃责或者能力不足?

社会心理学家 Roy Baumeister 和 Mark Leary 在 1995 年提出过一个理论:归属需求是人类最基本的心理动机之一,它的重要性不亚于食物和安全。当归属感缺失时,人会出现焦虑、抑郁、自我监控过度等一系列反应。

但这里有一个关键的认知转换。主人公后来意识到,“没有归属感”不一定是自己太敏感,也不一定是自己哪里有问题。有时候它只是系统在告诉你:这里不是一个适合你把全部自尊和安心感放进去的环境。

承认这一点,反而让人轻松。因为当你不再要求自己必须“喜欢这里”“融入这里”“在这里找到家的感觉”时,你就能更清醒地看待它:这是一个你需要工作、合作、交付、自保的地方,而不是你必须从中获得全部认同的地方。

认知工具 3:不是所有的工作环境都能提供归属感。承认这一点不是悲观,而是清醒。清醒之后你会停止在一个不提供温暖的地方反复索取温暖,转而把精力用在更有回报的事情上。


四、可证明的安全:从模糊恐惧到风险清单

情绪落下去之后,主人公开始思考一个实际问题:我能做什么?

他的第一个决定是,职业自保这件事必须更认真地做。但这里的“自保”不是消极、圆滑、甩锅,而是一种工程上的成熟。

过去他用 AI 更多是为了快速实现功能。但这次他意识到,在某些环境里,“快”不自动等于“安全”。你能不能快速做出东西很重要,但你能不能把工作做成**“可被解释、可被追踪、可被证明自己做过充分考虑”**的状态,可能更重要。

他给自己定下的规矩很朴素:以后每次做需求或上线,都要明确留下变更说明、影响范围、风险点、测试要点、自测案例、回滚方案、监控点、关键日志和关键指标。

这些词以前听起来像流程文档里的套话。但它们实际上在帮你建立一种**“可证明的安全感”**——不是嘴上说“我已经测过了”,而是当别人问到的时候,你可以清晰地讲出:我改了什么,会影响什么,我担心什么,我怎么验证的,出问题第一步怎么止血,上线后看哪些指标判断稳定性。

这个转变的关键在于:它把模糊的恐惧变成了具体的清单。你不知道的风险最让人焦虑,因为你不知道它到底是什么;而一旦风险被清单化、可视化,哪怕还有几个红灯亮着,你也比之前踏实——因为你知道自己面对的到底是什么。

心理学里有一个很成熟的研究结论:不确定性是焦虑最大的来源。 当人把不确定的威胁转化为确定的、可列举的风险项时,焦虑水平会显著下降,即使风险本身并没有消失。

认知工具 4:把“万一出事怎么办”的模糊恐惧,转化成“我已经覆盖了哪些风险、还有哪些没覆盖”的具体清单。恐惧可视化之后,焦虑会大幅降低。


五、AI 不只是效率工具,更是你的风险官

顺着这个思路,主人公产生了一个非常实用的想法:让 AI 从“帮我写代码”升级成“帮我扫描风险”。

很多程序员用 AI 的方式是:给它一个需求描述,让它生成代码,然后 review 一下就上线。这是把 AI 当效率工具。但主人公想到的是另一个维度:把设计方案、代码 diff、上线步骤、关键业务背景喂给 AI,让它从一个保守的、资深 reviewer 的角度,列出这个需求最有可能出问题的点——接口边界、幂等问题、状态机流转、异常分支、并发条件、数据一致性、外部依赖、监控缺口、回滚复杂度……

AI 不需要替你做最终判断,它只需要尽可能完整地把风险摊开,附上触发条件、可能影响、监控方式和兜底方案。然后你根据业务理解逐条判断,补上测试要点和上线方案。

这形成了一个工作流:AI 先做第一轮风险扫描,你做第二轮业务判断。 最后让你安心的,不是“AI 说没问题”,而是“我已经逐条想过这些问题了,而且对高风险项已经有预案”。

用主人公自己的话说:“以前是让 AI 帮我更快地到达‘能跑起来’;以后要让 AI 帮我更稳地到达‘能讲清楚、能守住、能解释’。”

认知工具 5:AI 最有价值的用法,不是替你做事,而是帮你照亮盲区。把它当风险扫描器比当代码生成器更能降低你的职业风险。


六、预验尸法:出事之前先演练一遍

这里我想引入一个重要的决策工具。心理学家 Gary Klein 提出过一个方法,叫做预验尸法(Pre-mortem)。

传统的事后复盘(Post-mortem)是项目失败后再分析原因。预验尸法刚好相反:在项目开始之前,先假设它已经失败了,然后让每个人思考——“它为什么失败了?”

Klein 发现,这个简单的思维翻转,能让团队识别出的潜在问题数量增加 30% 以上。原因很简单:当人们被要求“想想可能出什么问题”时,思维往往会被乐观偏差束缚;但当你把框架变成“它已经失败了,为什么?”时,大脑会切换到一种更诚实的解释模式。

主人公的想法本质上就是在做个人版的预验尸。他给自己定了一个规矩:以后每次上线前都要先问自己——如果领导追问到我,我要怎么把情况讲明白?

最坏的事故是什么?用户会看到什么?影响范围怎么界定?第一步止血动作是什么?排查从哪里开始?手里有哪些证据支撑判断?如果一分钟内要向上汇报,我怎么说清结论、影响、止血和下一步?

他甚至想到,可以让 AI 扮演一个强势领导来盘问自己:用尖锐的方式追问变更最坏会出什么事、影响多少用户、证据是什么、回滚是否安全……通过这种模拟盘问,提前发现自己哪里讲不清楚。

这背后有一个关键洞察:职场里的“可靠”不等于“永远不出错”,而是“出了错也能迅速给出边界和判断”。 领导真正想要的,是一个在出问题时还能讲清楚——现在发生了什么、影响到哪里了、已经做了什么、接下来怎么办——的人。一旦你能在危机时刻讲清楚,即使问题还没解决,别人对你的信任也会高很多。

认知工具 6:在每次上线前做一次“预验尸”。不是为了吓唬自己,而是为了训练在最坏情况下的表达和判断能力。真正的安全感来自“即便出事我也有路径处理”,而不是“希望别出事”。


七、向上沟通的路径设计

主人公后来还想到一个很现实的问题:要不要找机会跟领导建议,说公开点名训斥的方式会影响团队心理安全?

他的答案很明确:不做。

不是因为建议没道理,而是因为他很清楚自己和这个领导之间的关系边界。领导平时强势,不太鼓励反馈;他们之间也没有可以深层对话的信任基础。如果强行去做“向上影响”,大概率是消耗自己,效果甚微。

这个判断其实很成熟。很多职场建议默认你应该“更勇敢地表达”“更多地影响领导”,但真正的成长不只是“更敢说”,也包括更清楚地知道**“哪些事不值得我说,哪些人不是我该去影响的对象”**。

但他并没有放弃向上沟通。他找到了另一条路径:团队里有两个小领导比较好沟通,他可以先跟他们对齐事实、风险和方案,形成共识后再同步给大领导。

这个策略的精妙之处在于:它既没有逃避沟通,也没有把自己暴露在高压通道里。沟通路径的设计,本身就是自保的一部分。 很多人不是能力不够,而是总把自己放进最不利的沟通场景里,做了很多事却很难被看见,甚至还容易被误伤。

认知工具 7:向上沟通不等于直接向上级说话。设计一条更合理的沟通路径(比如先和能沟通的人对齐,再把结论同步上去),既能完成沟通目标,又能保护自己。


八、把工作沉淀成个人资产

这件事还带来了一个意外的正向变化:主人公突然对手上的业务产生了更强的学习意愿。

他做的是加密货币交易支付相关的工作,之前只是把分内功能实现好,没有想过要深入理解全链路。但这次他意识到,可以把“做需求”的过程,变成建设个人长期资产的过程。

具体做法很简单:每天花十分钟,写一张轻量的学习卡片——今天做了什么变更,涉及什么业务链路,学到了什么概念,最大的风险点是什么,做了哪些让它更安全的动作,这件事未来在面试里可以怎么讲。

这个做法的深层逻辑是:当一个人缺乏团队归属感时,最好的应对不是强迫自己融入,而是把注意力转向自己的积累。 无论以后留还是走,做过的项目、理解过的业务、解决过的风险、积累的表达能力,最后都会沉淀成自己的东西——流向自己,而不是只流向公司。

这让我想起管理学家 Peter Drucker 说过的一句话:“知识工作者不应该把自己看作组织的雇员,而应该把自己看作自己的 CEO。” 你的职业安全感不应该完全建立在某一个组织对你的评价之上,而应该建立在你自己可以带走的能力、经验和叙事之上。

认知工具 8:每天花 10 分钟,把当天的工作沉淀成一张学习卡片。长期坚持,你就从“完成任务的人”变成了“不断积累资产的人”。这是在任何环境里都能建立安全感的底层方法。


九、Plan B 的正确打开方式

最后一个问题:要不要随时准备好被裁或离开?

答案是:要准备退路,但不要把自己长期放在“等着出事”的心理状态里。

这两者看起来很像,实际上完全不同。

如果你天天想着“下一个就是我”“说不定哪天被收拾”,你的神经系统会长期处在高警觉状态。你会过度自我监控,做每件事都带着求生姿态,久而久之,人会非常疲惫。

但如果你一次性把退路搭好——更新简历、梳理项目、准备好可讲的事故复盘、保持适度社交、了解市场——大脑反而会安静下来。因为它知道,最坏情况不是一个没有出口的洞,而是一条你已经看过的路。

心理学里有一个概念叫做**“感知可控性”**(Perceived Controllability)。研究反复证明,当人感觉自己对情境有一定掌控力时,即使客观威胁没有变化,压力反应也会显著降低。准备 Plan B 的本质,就是提升你对职业生涯的感知可控性。

认知工具 9:把 Plan B 当成冷静的生活准备,而不是持续的精神灾难预演。简历完整一点、项目故事清楚一点、面试表达早点打磨、市场偶尔看一看。这样做不代表你要离开,只代表你不会把全部安全感押在一处。


日课总结

今天这个故事表面上是关于一次线上事故的,但实际上是关于如何在不确定的职场环境中建立属于自己的安全感。让我们回顾九个认知工具:

  1. 心理安全感检测——当你莫名焦虑时,检查是不是环境对犯错不够宽容。
  2. 情绪承接三步法——先接住情绪,再承认现实,最后给一个具体行动。
  3. 归属感的清醒定位——不是所有环境都能提供归属感,承认这一点是清醒,不是悲观。
  4. 恐惧可视化——把模糊恐惧转化为具体的风险清单,焦虑会大幅降低。
  5. AI 风险扫描——让 AI 帮你照亮盲区,比帮你写代码更有价值。
  6. 预验尸法——上线前先演练最坏情况和应对表达。
  7. 沟通路径设计——找到更合理的向上沟通路径,保护自己的同时完成沟通目标。
  8. 每日学习卡片——把工作沉淀成可带走的个人资产。
  9. Plan B 的正确姿态——冷静地准备退路,但不要活在灾难预演里。

这九个工具的核心指向同一件事:真正可靠的职场安全感,不是别人给你的,而是你自己一点点搭出来的。 它承认环境可能不公平,也承认你无法控制一切,但它同时也证明——即便在这样的环境里,你仍然可以通过训练判断力、表达力、风险预演能力和经验沉淀能力,为自己建立一种可证明的、可以带去任何团队的安全感。

最后分享一句话:愿你越来越稳,但不是越来越麻木。 有弹性的人,仍然会被不公刺到,仍然会在乎别人,仍然会对不安全的氛围有感觉——但他同时也越来越知道,遇到这些事时,自己能怎么保护自己,怎么整理自己,怎么继续往前走。

Java程序员还需要学Tomcat吗

发表于 2026/03/05 | 分类于 随笔文章

1

很多 Java 程序员都有一个共同的困惑:Tomcat 到底还要不要学?

大家都知道 Tomcat 很重要,也知道 Spring Boot 默认内嵌了它。但如果你日常做的是 2B 项目,用户量不大,QPS 也不高,主要就是写接口、对接系统、处理数据——花大量时间去研究 Tomcat,真的有必要吗?

我最近梳理了一下这个问题,发现它背后牵出了一整条概念链:Web 服务器是什么,Servlet 容器是什么,Servlet 和 Controller 什么关系,Java EE 和 Jakarta EE 又是怎么回事。这些概念很多人似懂非懂,但只要顺着“Tomcat 要不要学”这个问题往下捋,它们就全串起来了。

2

先说结论:Tomcat 不需要深挖,但不能完全不懂。

如果你的项目是典型的 2B 系统,业务逻辑多,并发量低,那确实没必要把 Tomcat 当成主攻方向。你大概率不需要去读它的源码,不需要研究连接器的每个参数,也不需要深入 NIO 模型和线程池的实现细节。

但 Tomcat 不能完全忽略。因为 Spring Boot 只是把它“内嵌”了,不是把它“消灭”了。

你的应用仍然跑在 Tomcat 上面。HTTP 请求仍然要经过它,线程管理、连接管理、请求的生命周期,这些事情仍然由它负责。只不过你不再需要手动部署 war 包、手动配置 server.xml 而已。

换句话说,Tomcat 从“你要直接操作的东西”,变成了“你必须理解其存在的底座”。

所以更准确的说法是:Tomcat 不需要学到专家级,但至少要学到理解系统运行机制、能排查问题、能和别人有效沟通的程度。

3

要理解 Tomcat,先得搞清楚几个基本概念之间的关系。

很多人对 Tomcat 的第一印象是:它是一个 Web 服务器,负责接收 HTTP 请求,然后把请求转给 Java 应用。方向是对的,但可以再精确一点。

Tomcat 其实有两层身份。

第一层是 HTTP 服务器。这一层负责网络层面的事情:监听端口、建立连接、解析 HTTP 协议、管理 keep-alive、处理超时、把字节流读进来再写回去。

第二层是 Servlet 容器。这一层负责 Java 的事情:把 HTTP 请求包装成 Java 对象(HttpServletRequest 和 HttpServletResponse),然后按照一套标准规则调用应用代码,最后把结果写回给客户端。

也就是说,Tomcat 做的不只是“转发”,它做的是一整套从网络协议到 Java 对象的桥接工作。

4

说到 Servlet 容器,就必须解释一下 Servlet 到底是什么。

很多人把 Servlet 理解成“某个类”或者“某种老旧的写法”,其实不准确。Servlet 更准确的定义是:Java Web 应用暴露给容器调用的一套标准接口。

这里最容易搞反的一点是:不是 Servlet 去调用 Tomcat,而是 Tomcat 去调用 Servlet。

打个比方。你去餐厅吃饭,餐厅有一套点菜流程:你看菜单、选菜、告诉服务员。这个流程是餐厅定的,不是你定的。你作为顾客,只需要“实现”点菜这个动作就行了。

在 Java Web 世界里,Tomcat 就是餐厅,Servlet 就是你按照餐厅规则提供的那个“点菜动作”。容器掌握调度权,应用提供处理逻辑。这在软件工程里叫做“回调”——运行时由平台来调你,而不是你主动去调平台。

一句话总结:Servlet 是应用暴露给容器的入口接口,Tomcat 是负责运行并调用这些入口的容器实现。

5

理解了 Servlet,就可以来看 Spring MVC 做了什么。

在 Spring MVC 时代,我们不再手写一堆 Servlet 了。所有请求都会先进入一个叫 DispatcherServlet 的东西。

很多人第一次看到这个名字会疑惑:它也只是一个 Servlet 啊,凭什么整个系统的请求都给它?

原因在于它的设计模式。DispatcherServlet 是一个“前端控制器”(Front Controller)。传统模式下,一个 URL 对应一个 Servlet。而 DispatcherServlet 把所有请求先收进来,然后在框架内部根据 URL、HTTP 方法、参数、Header 等信息,再分发到具体的 Controller 方法上。

所以在 Spring MVC 里,真正面对 Tomcat 的不是你写的业务代码,而是 DispatcherServlet。你的 @RestController、@Controller 方法,其实不是 Servlet,它们是 DispatcherServlet 内部再分发出来的业务处理单元。

这就是为什么很多 Java 开发者“感觉不到 Servlet 的存在”。你平时写的是 Controller,但 Controller 的下面仍然是 Servlet 模型,只是被 Spring 封装起来了。

6

那么,在 Spring 出现之前,Java Web 是怎么工作的呢?

最原始的写法是这样的:你自己写一个类,继承 HttpServlet,重写 doGet、doPost 方法。你要自己从 HttpServletRequest 里取参数,自己解析输入流,自己设置响应头,自己往 HttpServletResponse 里写内容。然后在 web.xml 里配置 URL 和 Servlet 的映射关系。

后来 Servlet 规范升级了,可以用 @WebServlet 注解来做映射。再后来,Spring MVC 出现了,你只需要用 @RequestMapping 就能把请求映射到一个普通的 Java 方法上。

你会发现,这么多年 Java Web 开发的主线从来没变过:请求匹配到一个处理器,执行逻辑,返回响应。

变化的只是抽象层级。早期你直接操作 Servlet,后来用注解注册 Servlet,再后来用 Spring 把请求映射到方法。映射的本质没变,只是越来越细、越来越方便。

7

所以 Spring MVC 到底厉害在哪里?很多人说“注解比 XML 方便”,这个说法没错,但远远不够。

Spring MVC 真正做的事情是:把 Web 编程从“类级别”提升到了“方法级别”。

在 Servlet 时代,一个 URL 通常对应一个类。你需要在类里面自己区分不同的逻辑。到了 Spring MVC,映射粒度细化到了方法级别。你可以很自然地写出 GET /orders/{id}、POST /orders、PUT /orders/{id},每个接口就是一个普通方法。

除此之外,Spring MVC 还系统性地接管了大量脏活累活。

以前你要自己从 request 里取参数、自己判断类型、自己解析 JSON、自己设置状态码。现在用 @RequestBody、@RequestParam、@PathVariable 就能自动完成。

以前一个异常抛出来,怎么返回给前端要自己控制。现在用 @ControllerAdvice 就能统一处理。

以前你想给所有请求加日志、鉴权、审计,要自己写 Filter 或者硬编码在 Servlet 里。现在有 Filter、Interceptor、AOP 等多种拦截能力可以组合使用。

Spring 的本质不是“更方便”,而是把 Web 开发从底层协议编程,推进到了更接近业务模型的层面。

8

理解了 Tomcat 和 Spring 的关系之后,还剩一个经常让人困惑的概念:Java EE。

很多人听到 Java EE 就觉得它很抽象,像是某种“大而空”的历史名词。其实用工程师熟悉的话说,它就是一份接口合同。

所谓“规范”,就是一份公开的标准文档,规定了要有哪些接口、哪些类、它们该怎么表现、生命周期是什么、异常怎么定义。规范本身不是一个能运行的软件,它是一套标准。然后不同的项目去实现这套标准。

打个比方,4G 标准规定了通信协议和行为方式,不同厂商去做基站和手机。只要遵循标准,就能互通。Java 世界里的规范也是这样:规范负责定义“应该怎样”,实现负责回答“具体怎么做”。

Java SE 是 Java 的标准版,包含语言、JVM、基础类库。Java EE 则是建立在 Java SE 之上的一组面向企业开发的标准能力,比如 Servlet、JPA、Bean Validation、JAX-RS 等等。

它不是“更强大的 JDK”,也不是什么“企业版安装包”。它是一组标准接口的集合。

所以你下载一个 JDK,拿到的是 Java SE 的实现。而 Java EE 里的那些能力,是由 Tomcat、Hibernate 这些项目来实现的。Servlet 规范由 Tomcat 实现,JPA 由 Hibernate 实现,Validation 由 Hibernate Validator 实现。Spring 则在这些实现之上,再做了更高级的封装。

9

这几年升级 Spring Boot 项目的人,肯定都遇到过一个变化:代码里的 javax.* 变成了 jakarta.*。

比如 javax.servlet 变成了 jakarta.servlet。

这个变化的原因不是技术上有什么大突破,而是治理权发生了变化。

Java EE 原来归 Oracle 管,后来 Oracle 把它转移到了 Eclipse 基金会。但 javax 这个命名空间的使用权没有一起转移。Eclipse 基金会拿到了规范的演进权,却无法继续使用 javax 这个名字。

于是只能做一次断代式迁移:Java EE 改名为 Jakarta EE,命名空间从 javax.* 全面转向 jakarta.*。

这就是为什么 Spring 6 / Spring Boot 3 升级时,最明显的变化不是某个功能特性,而是一大堆包名从 javax 变成了 jakarta。Tomcat 10 及之后的版本,也全面站在了 Jakarta 体系上。

10

理解了这条线之后,很多人还会追问一个问题:Tomcat、Spring 这些项目,为什么能活这么多年?

答案不是“没有挑战者”,而是它们积累了大量的稳定性和生态惯性。

Tomcat 之所以难以被动摇,不是因为它技术上绝对领先,而是因为它在企业级 Java Web 场景里长期扮演了一个非常稳定、非常可预期的角色。对于大量低并发、重业务、重兼容的系统来说,替换 Tomcat 带来的收益,远远小于替换它带来的风险。

Spring 也类似。它的优势不只是功能多,而是在依赖注入、Web、事务、数据访问、测试这一整套企业开发体验上,形成了巨大的完整性。

这些项目能持续演进,也跟治理方式有关。Tomcat 属于 Apache 基金会,有成熟的项目治理、发布机制和安全响应体系。Spring 则是公司主导型开源,由稳定的核心团队持续投入。

真正能活很多年的基础设施,不只是代码写得好,还得有持续演进的组织能力。

11

最后回到最初的问题。

对一个做 2B 项目、低 QPS、以业务开发为主的 Java 程序员来说,Tomcat 最合适的学习深度不是“专家级”,而是“理解运行机制级”。

你需要知道的是这些事情:

Tomcat 既是 HTTP 服务器,也是 Servlet 容器。Servlet 是应用暴露给容器调用的标准入口。Spring MVC 没有绕开 Servlet,而是通过 DispatcherServlet 把 Servlet 模型进一步抽象成了 Controller 模型。从过去到现在,Web 开发的本质都是请求映射,只是映射粒度和工程能力越来越强。Java EE / Jakarta EE 是一组企业标准规范,Tomcat、Hibernate 是这些规范的实现者。

理解到这个层面,你就具备了非常扎实的底座认知。

你不一定会去调 Tomcat 的线程参数,不一定会去研究连接器实现,但你会知道一个请求是怎样走进系统的,会知道 Controller 之下其实还有 Servlet,会知道为什么升级 Spring Boot 3 时包名从 javax 变成了 jakarta,也会知道规范、框架、容器和业务代码在整个体系中各自扮演什么角色。

真正高价值的成长,从来不是把所有底层细节都变成自己的主战场,而是知道哪些东西应该深挖,哪些东西理解其本质后适可而止。

Tomcat 就属于后者。它不是一个“成熟到可以忽略的老工具”,Servlet 也不是一个“面试里偶尔会问到的老名词”。它们一直都在,只是被现代框架包裹得更优雅了。

理解这些底层关系,不是为了让你回到老时代手写 Servlet,而是为了让你在今天写 Spring Boot 业务代码时,知道自己站在怎样一套技术演进链条之上。

你的焦虑是一个信号:在不安全的组织里重建自己的操作系统

发表于 2026/03/05 | 分类于 职场

你的焦虑是一个信号:在不安全的组织里重建自己的操作系统

风格:梁宁(产品思维式)


我想从一个感受开始讲起。

一个程序员告诉我,他的同事因为一次线上事故,被领导在工作群里公开点名训斥。领导说他“做事不靠谱”“对自己的代码不熟”“以后不要再提交代码了”。

这个程序员不是被骂的人,事故也不是他造成的。但他整个下午到晚上,都处在一种隐隐绷紧的状态里。

他问自己:我是不是太敏感了?

我想说的是:你不是太敏感。你的系统在正常工作。


一、焦虑不是 bug,是 feature

我们常常把焦虑当成一种需要被克服的缺陷。好像你焦虑了,就是你不够强大,不够职业化,不够成熟。

但如果你用产品思维来看待焦虑,你会发现它根本不是 bug——它是 feature。

焦虑是你身体的一套风险评估系统。它的功能和杀毒软件一模一样:扫描环境,识别威胁,发出警报。当你身处一个环境,看到某个人因为犯了一个错就被公开否定,你的系统做了一次快速计算——“如果这件事落到我头上,我会面临什么后果?”——然后它弹出了一个警告弹窗。

这不是矫情。这是一个正常运行的系统在告诉你:我识别到了风险。

关键不在于你焦虑不焦虑,而在于你拿这个信号做什么。

如果你忽略它,把它当噪音屏蔽掉,你可能会错过一个重要的环境信息。如果你被它淹没,一直泡在焦虑里出不来,你又会丧失行动力。

正确的做法是:接收信号,识别信号的内容,然后做出响应。

你的焦虑到底在告诉你什么?


二、“从事到人”——一个组织最危险的滑坡

让我们来拆解这个信号的内容。

一次线上事故,本质上是一个系统问题。它涉及代码、流程、测试、上线机制、监控覆盖等一系列环节。处理这种问题,成熟的方式是回到事情本身:哪里出了问题?流程有什么漏洞?如何避免下一次?

但那个领导做了一件事,把问题的性质从“事”滑向了“人”。

他没有问“系统哪里脆弱”,而是问“你靠不靠谱”。他没有问“流程哪里没补齐”,而是说“以后不要再提交代码了”。

这种从事到人的滑坡,是一个组织里最危险的模式。

为什么?

因为当错误被翻译成对人的否定,所有人接收到的信号就是:在这里,犯错的代价不仅仅是修复问题,而是你这个人会被拿出来定性。

一旦这个信号被广播出去,组织的行为模式就会悄然改变:

人们不再主动暴露问题,因为暴露问题等于暴露自己。人们不再愿意承担有风险的任务,因为风险意味着可能的公开羞辱。人们开始花更多精力在“自我保护”上,而不是“把事情做好”上。真正的问题被藏起来了,直到它大到藏不住为止。

这就像一个产品的反馈机制被设计反了:本来应该鼓励用户报告 bug,结果你惩罚了报告 bug 的人——于是再也没人报 bug 了,但 bug 并没有消失。

那个程序员的焦虑,本质上就是感知到了这种系统层面的设计缺陷。他的身体在告诉他:这个环境的容错机制有问题。


三、归属感的本质:一个人能不能安全地暴露不完美

拆到这一层,还不够。

这个程序员还意识到一件事:他在这个团队里,其实一直没有太强的归属感。不是完全融不进去,也不是跟所有人处不好,但他很少觉得自己可以放松地待在这里。

归属感这个词,说出来好像很虚。但如果用产品语言来翻译,它其实极其具体:

归属感,就是一个用户在你的产品里,能不能安全地暴露自己不完美的一面。

一个好的社区产品,用户可以发不够精致的内容,可以问可能被嘲笑的问题,可以表达不确定的想法——因为他知道这个环境不会因此惩罚他。

一个好的团队也是一样:你能不能在事情出错的时候,依然被当作团队的一部分?你能不能在表达看法的时候,不用先担心被理解成顶撞或能力不足?

如果不能,那你在这个环境里就永远是一个“访客”,而不是“居民”。你会使用这个产品,但你不会在里面安家。

他后来做了一个很重要的认知调整:不再强迫自己在这里找到归属感。

他告诉自己:这就是一个我需要工作、合作、交付、自保的地方。我会认真对待它,但我不会把全部的自尊和安心感放进去。

这不是消极。这是一种清醒的自我边界设定。

就像你不会要求一个工具型产品给你情感寄托一样——你用它来完成任务,你感谢它的好用,但你的生活不依赖于它对你的认可。


四、先做一个有人味的人

让我先回到那个最原始的场景。

被训斥的同事就坐在他旁边,整个人气压很低。他当时没有想太多,很自然地跟他说了一些话,大意是:出了事肯定要有人背锅,这没什么办法,现实就是这样。

这种安慰有一种坦诚的力量。它不粉饰,不敷衍,不说空泛的“别想太多”。它承认了残酷的运转机制,让对方知道:你不是一个人在承受这份难堪。

但它也有一个潜在的问题——它可能让人更容易滑向无力感。 仿佛结论就是:反正总得有人背,你挣扎也没用。

更好的做法是什么?我觉得可以分三步:

第一步,承接情绪。 “群里那段话确实很重,换成谁都不会舒服。”——不急着分析,不急着解决,先让对方知道:你的感受是被看见的。

第二步,承认现实,但不让现实变成宿命。 “事故里会有人被追责,这是事实。但我们至少可以把事实链条整理清楚,别让事情变成对你这个人的定性。”——现实是现实,但你不是没有余地。

第三步,给一个具体的行动。 “一起梳理一下时间线?你确认过谁、看过什么指标、现在线索有哪些,我们先把这些理清楚。”——人只要重新获得一点点行动感,就会从恐惧和羞耻里往外走一点。

这三步的底层逻辑其实是一个产品思维:当用户陷入负面情绪时,最有效的设计不是直接给他一个“解决方案按钮”,而是先给他一个“你被理解了”的反馈,然后给他一条可以自己走的路。


五、重建你自己的安全系统

好,信号识别完了,感受也处理过了。接下来是响应。

他做的第一件事,是开始认真建设自己的**“可证明的安全”**。

过去他的工作重心是“快”——快速实现功能,快速推进需求,让事情跑起来。但经过这件事,他意识到在某些环境里,快不等于安全。

真正让你安全的,不是你能不能快速写出代码,而是你能不能把自己的工作变成一种可被解释、可被追踪、可被证明的状态。

变更说明、影响范围、风险点、测试要点、自测案例、回滚方案、监控点、关键日志和关键指标。

这些听起来像流程文档里的套话。但从产品视角看,它们本质上是在帮你建立一种用户信任——只不过你的“用户”是你的领导、你的协作者和未来的你自己。

当有人质疑时,你能拿出来的不是“我记得我测过了”,而是一条清晰的证据链。这条证据链不一定能保证百分之百不出问题,但它证明了你不是在盲飞。

更重要的是,这个过程改变了焦虑的性质。 以前他的焦虑是模糊的——“万一出事怎么办”。现在变成了具体的——“我已经覆盖了哪些风险,还有哪些没覆盖”。

模糊的恐惧最折磨人。具体的风险清单反而让人踏实。

就像你不知道敌人在哪里的时候最害怕,一旦看清了,反而可以部署防线。


六、让 AI 从效率工具变成风险扫描器

顺着这个思路,他又往前走了一步:让 AI 从效率工具升级成风险官。

过去他用 AI 主要是生成代码、加速实现。现在他想到,AI 其实特别适合做另一件事——帮你系统性地扫描你可能遗漏的风险。

把设计方案、代码变更、上线步骤、关键业务背景喂给 AI,让它以一个偏保守的 reviewer 角色,列出最有可能出问题的点:接口边界、幂等性、异常分支、并发条件、数据一致性、外部依赖、监控盲区、回滚复杂度……

AI 不替你做判断。它只负责把盲区照亮。你来决定哪些已经覆盖了,哪些需要追加预案。

从产品角度看,这是一次很漂亮的用户体验升级:同样一个工具,从“帮你做得更快”变成了“帮你做得更稳”。而“稳”在高压环境里的价值,远远超过“快”。

他自己总结得很精确:“以前是让 AI 帮我更快地到达‘能跑起来’。以后我想让 AI 帮我更稳地到达‘能讲清楚、能守住、能解释’。”

他甚至还想到了一个更进一步的用法:让 AI 扮演一个强势领导来盘问自己。“这次变更最坏会出什么事?影响多少用户?你的证据是什么?回滚安全吗?”通过这种模拟盘问,提前发现自己哪里讲不清楚,哪些证据还没准备好。

这让我想到一个很重要的事实:职场里的“可靠”不等于“永远不出错”。它等于“出了错也能迅速给出边界和判断”。 领导真正害怕的不是 bug 本身,而是信息失控——他不知道这个问题有多大,不知道有没有止血,不知道眼前这个人到底有没有掌控局面的能力。

如果你能在那个时刻清楚地讲出“现在发生了什么、影响到哪里、已经做了什么、接下来怎么办”,即使问题还没解决,信任也不会崩。


七、沟通路径就是产品设计

他还发现了一件事:向上沟通也是一种需要被设计的路径。

有人建议他跟领导谈谈,说公开训斥不利于团队士气。他拒绝了。不是建议没道理,而是他和这个领导之间没有足以承载这种对话的信任基础。领导强势,不鼓励反馈,他们之间适合公事公办,不适合深层对话。

这是一种边界感。成长不只是“更敢说”,也包括更清楚地知道“哪些事不值得我说,哪些人不是我该去影响的对象”。

但他没有放弃沟通。他找到了另一条路径:团队里有两个中间层的人比较好沟通,他可以先跟他们对齐事实和方案,形成共识后再同步给大领导。

如果把这看作产品设计,他做的事情本质上是:绕过了一个体验很差的交互入口,找到了一条转化率更高的用户路径。

信息最终到达了同样的终点,但过程中摩擦更小,损耗更低,他自己也更安全。

很多人不是能力不够,而是总把自己放进最不利的沟通场景里。一旦你学会给自己设计更合理的路径,工作体验和安全感都会好很多。


八、把经历变成资产——你的个人飞轮

最后一个变化,也是我认为最有力量的一个。

他开始想:既然在这个团队里找不到足够的归属感,那我能不能把注意力转向另一件事——把每天的工作,变成自己的长期资产?

他做的是加密货币交易支付的业务。以前他只是完成需求,交付功能。现在他想到,每天花十分钟写一张小卡片:今天做了什么变更,涉及什么业务链路,学到了什么概念,最大的风险是什么,做了哪些安全动作,这件事未来面试时可以怎么讲。

这个动作看起来很小,但它启动了一个飞轮:

做需求 → 理解业务 → 沉淀卡片 → 提升表达 → 增强自信 → 更主动地去理解下一个需求 → 进入下一轮循环。

当一个人缺乏团队归属感时,很容易觉得自己只是在替别人打工。但当你把工作沉淀成自己的资产时,你就像是在告诉自己:无论环境怎样,这些经历最后都会流向我自己。

他还想到了 Plan B——但不是以一种焦虑的方式。不是天天想着“下一个就是我”,而是冷静地把退路搭好:简历更完整一点,项目故事更清楚一点,面试表达更早打磨,市场偶尔看一看。

这不是悲观,这是成熟。

真正让人崩溃的,不是环境差,而是环境差的时候你觉得自己无路可走。 一旦你知道自己有路可走,你反而能更从容地待在原地。


九、稳定不是麻木,是弹性

回过头来看,这个程序员从一次小事故里提炼出了什么?

一套风险管理方法,一种 AI 使用范式,一条沟通路径设计策略,一个每日资产沉淀习惯,一种对归属感缺失的清醒接纳,一个冷静准备 Plan B 的心态。

这些变化看上去很分散,但它们指向同一个核心:他在重建自己的操作系统。

不是依赖环境给他安全感,而是自己一点点搭建出来。

这种安全感承认现实可能不公平,承认团队有情绪化的管理者,承认事故会发生——但它同时也承认,即便在这样的环境里,你仍然可以选择不只是被动承受。

我想强调最后一点。他说:“我希望自己越来越稳,但不是越来越麻木。”

人在职场里待久了,为了自保,很容易把感受关掉,把共情关掉,把期待关掉,最后变成一个什么都无所谓的人。那当然可以减少痛苦,但也会失去很多珍贵的东西。

更好的状态不是无感,而是有弹性:仍然会被不公刺到,仍然会在乎别人,但同时也越来越知道,遇到这些事时,自己能怎么保护自己,怎么整理自己,怎么继续往前走。

这就是一个好的操作系统该有的样子——不是永远不崩溃,而是崩溃之后能快速恢复,并且每次恢复之后都比上一次更强一点。

你怕的不是 Bug

发表于 2026/03/05 | 分类于 职场

你怕的不是 Bug

风格:Paul Graham(essay 体)


我最近听到一个故事。一个程序员的同事因为线上出了个小 bug,被领导在工作群里当众训斥。

这个程序员不是被骂的人。事故也不是他造成的。但他一整天都处在一种绷紧的状态里。

这件事有意思的地方在于:让他焦虑的根本不是那个 bug。


想想你在工作中真正害怕的是什么。

大多数程序员以为自己怕的是写出 bug。但如果你仔细观察,就会发现事情没那么简单。在有些团队里,人们天天在 production 上修 bug,心态稳得很。在另一些团队里,一个小问题就能让整个组的人如坐针毡。

区别不在 bug 本身,而在于这个组织如何对待犯了错的人。

那个领导做了一件很具体的事:他把一个技术问题翻译成了对人的否定。他没有说“这个接口的容错逻辑不够健壮”,而是说“你做事不靠谱”。他没有说“上线流程需要加一道检查”,而是说“以后不要再提交代码了”。

问题从“事”变成了“人”。

这个滑坡一旦发生,所有目睹它的人——不只是当事人——都会本能地做一件事:评估自己被同样对待的概率。这不需要你有意识地去想,你的大脑会自动完成这个计算。

所以那个程序员的焦虑根本不是关于代码质量的。它是关于这个环境的。


Harvard 有个教授叫 Amy Edmondson,她研究了几十年的团队效能,最后得出一个很反直觉的结论:高绩效团队的第一特征不是成员能力强,不是工作流程好,而是团队里的人敢不敢暴露自己的错误和不确定。她管这叫“心理安全感”。

Google 后来在内部做了一个大规模研究,分析了 180 多个团队,结论跟 Edmondson 一模一样:心理安全感是区分高效团队和低效团队的第一因素。

这很反直觉。因为我们的默认假设是:严格的团队出好产品。领导要求高,大家才会认真。如果你对犯错的人太宽容,大家就会松懈。

但数据说的是相反的故事。当人们害怕暴露错误时,他们不是变得更小心——他们是变得更善于隐藏。问题不会减少,只是变得不可见。直到不可见的问题积累到某个临界点,来一次真正的爆炸。


故事里的程序员后来做了一件事我觉得很对。他去安慰了那个被骂的同事。

他说的话很朴素,大意是:出了事总得有人背锅,领导不想背就轮到你,代码刚好是你写的,这没什么办法。

这不是什么精致的心理安慰。但我注意到它有一个很重要的特质:诚实。他没有装作世界是公平的,没有说“别想太多”,也没有试图把一个不好的处境包装成一个励志故事。他只是承认了现实的运作方式。

后来他反思,觉得这种安慰可以做得更好——除了承认现实,还可以给对方一个具体能做的事情。比如一起梳理一下事故时间线,把自己做过的确认和测试整理出来,让事实链条清楚一些。

这里面有一个很好的洞察:人只要重新获得一点点行动感,就会从恐惧里往外走一点。 不是因为行动能解决一切,而是因为行动会打断“我完蛋了”这个心理循环。


但这整件事留给他最大的影响,其实是关于“自保”的。

“自保”这个词在职场语境里听起来不太好。它暗示你在想着怎么保护自己,而不是怎么把事情做好。仿佛一个人如果在想自保的事,就说明他不够投入、不够有担当。

我觉得这是一种很有害的道德叙事。

在一个心理安全感足够高的环境里,你确实不太需要想自保的事。你全身心投入工作,犯了错有人兜着,大家一起复盘、改进、往前走。

但在很多真实的职场环境里,事情不是这样运作的。你犯了错,可能会被公开否定,被贴标签,被当作能力不足的证据。在这种环境里,不想自保才是不理性的。

所以关键问题不是“该不该自保”,而是“怎么自保才高级”。

低级的自保是甩锅、推诿、只做没有风险的事情。高级的自保是让自己的工作变成一种可被追溯、可被解释、可被证明的状态。

具体来说就是:你做了什么改动,影响范围是什么,你预判的风险是什么,你做了哪些验证,如果出问题第一步怎么止血,上线后看哪些指标。

这些信息不是给别人看的政绩报告,而是你给自己建的防线。当有人问你“你确定你的代码没问题吗”的时候,你拿出来的不是一句“我觉得没问题”,而是一条完整的思考链。

有意思的是,这种做法同时也让你成为更好的工程师。因为你在做这些的过程中,实际上就是在做更严格的风险评估。自保和做好工作,在这个层面上完全一致。


然后他想到了 AI。

他说了一句话我觉得很精准:“以前我让 AI 帮我更快地到达‘能跑起来’。以后我想让 AI 帮我更稳地到达‘能讲清楚、能守住、能解释’。”

大多数程序员用 AI 的方式是让它帮忙写代码。这没错,但它只覆盖了工作的一个维度。还有另一个维度很少有人想到:让 AI 帮你扫描风险。

把你的设计方案、代码 diff、上线步骤喂给 AI,让它以一个偏保守的 senior reviewer 的视角,列出最有可能出问题的地方。接口边界?幂等性?异常分支?并发?数据一致性?监控盲区?回滚复杂度?

AI 不需要替你做判断。它只需要帮你把你可能没想到的东西摊开来看。你来决定哪些需要处理。

这其实是 AI 最被低估的用途之一。不是替你做事,而是帮你看见你没看见的东西。

他还想到一个更具体的用法:让 AI 扮演一个强势领导来盘问他。“这次变更最坏会出什么事?影响多少用户?你凭什么认为是这里的问题?证据呢?回滚安全吗?”

通过这种模拟盘问,他可以提前发现自己哪里讲不清楚、哪些证据没准备好。这样真到现场,他反而不会慌。

这让我想到一个更普遍的道理:职场里的“可靠”不等于“永远不出错”。它等于“出了错也能迅速给出边界和判断”。

领导真正害怕的不是 bug——bug 天天都有。领导害怕的是信息失控:他不知道这个问题有多大,不知道是不是还在扩大,不知道眼前这个人到底有没有掌控局面的能力。

如果你在那个时刻能清楚地讲出“现在发生了什么、影响到哪里了、已经做了什么、接下来怎么办”,即使问题还没解决,信任也不会崩塌。


他还想明白了一件关于向上沟通的事。

有人建议他可以跟领导说,公开训斥不利于团队士气。他拒绝了。

他的理由不是“不敢说”,而是“这个领导跟我之间没有承载这种对话的信任基础”。说了大概率不会有效果,反而可能给自己带来麻烦。

我觉得这个判断非常成熟。

职场成长鸡汤里有一种很流行的叙事:你应该勇敢表达、主动影响领导、推动组织变革。但现实是,不是所有正确的话都值得由你来说。这取决于你跟对方的关系、你在组织里的位置、以及说了之后大概率会发生什么。

不说不等于怂。有时候不说恰恰是因为你对现实有足够清醒的判断。

但他找到了另一条路:团队里有两个中间层的人比较好沟通。他以后可以先跟他们对齐,形成共识,再把结论同步上去。信息到达了同样的终点,但路径更安全。

这是一种被低估的能力:不是更敢说话,而是更会选择路径。


最后他做了一个决定,我觉得是整个故事里最聪明的一个。

他决定开始每天花十分钟,把当天做的事情沉淀成一张小卡片。做了什么变更,涉及什么业务链路,学到了什么,最大的风险是什么,未来面试可以怎么讲。

这个动作的深层逻辑是:他承认自己在这个团队里没有太强的归属感——不是跟所有人关系差,而是这个环境不太允许他以一个不完美的人被安全地接纳。

承认这一点之后,他做了一个很理性的选择:既然归属感不在这里,那就不要把全部的安全感押在这里。把精力放在一个更靠谱的地方——自己的积累。

每天一张卡片看起来很小。但三个月之后,你就有了 90 张。一年之后就是 365 张。这些卡片本身不值什么,但它们背后的思维习惯——持续地理解业务、整理风险、训练表达——会把你从一个“完成任务的人”变成一个“不断积累能力的人”。

前者的安全感依赖于当前这份工作。后者的安全感来自于自己可以带走的东西。


有人可能会问:那他到底要不要准备随时走人?

他给自己的答案挺好的:要准备退路,但不要活在“等着出事”的心理状态里。

这两者的区别是——前者是你花一个周末更新好简历、梳理好项目经历、偶尔看看市场,然后日常工作该干嘛干嘛。后者是你天天想着“下一个就是我”,神经系统长期处在高警觉里,做什么都带着求生姿态。

前者让你更自由。后者让你更疲惫。

真正让人崩溃的,往往不是环境差,而是环境差的时候你觉得自己走不了。一旦你知道自己有路可走,你反而能更从容地待在原地。

这是一个很反直觉的道理:准备好离开的人,反而往往更能留下来好好工作。 因为他不是被恐惧驱动的,而是被选择驱动的。


回过头来看这整个故事,它其实是关于一件事:如何在一个不够安全的环境里,为自己建立安全感。

不是通过改变环境——他没有试图去改造领导,也没有试图去重塑团队文化。而是通过改变自己跟环境的关系——让自己的工作可被证明、让风险可被扫描、让沟通路径更合理、让每天的经历沉淀为资产、让退路提前搭好。

他最后说了一句话:“我希望自己越来越稳,但不是越来越麻木。”

我觉得这是整个故事里最重要的一句。

因为在职场里,“稳”和“麻木”看起来很像,但内核完全不同。麻木是关掉感受,什么都不在乎了。稳是保持感受,但知道遇到事情的时候自己有能力应对。

前者是防御。后者是力量。

从“会聊天”到“会做事”:代理革命的七个洞察

发表于 2026/02/26 | 分类于 AI专题

从“会聊天”到“会做事”:代理革命的七个洞察

基于 Lex Fridman Podcast #491(Peter Steinberger / OpenClaw)访谈


一、一个代理点击了“我不是机器人”

2026 年,一个叫 Peter Steinberger 的奥地利工程师,看着自己的 AI 代理在屏幕上开心地点击了“I’m not a robot”按钮。

如果你把大模型当成“更聪明的搜索框”,这句话只是段子。但如果你退后一步想想,它几乎是一个时代的分界线:系统不再只是输出语言,而开始在你的电脑里采取行动。

Peter 做的这个开源项目叫 OpenClaw。它在技术圈的传播速度几乎不像一个软件项目,更像一个 meme:GitHub star 暴涨,衍生出“AI 代理社交网络”MoltBook,伴随着公众的兴奋、恐慌和一种近似狂热的传播效应。

Lex Fridman 用三个小时跟他聊了这件事。如果你没时间听完,这篇文章想帮你抓住其中真正有价值的东西——不是功能清单,而是认知层面的收获。我整理了七个洞察。


二、魔法不来自发明,而来自重组

OpenClaw 到底是什么?说穿了,它是一个能在你手机聊天软件(WhatsApp、Telegram)里跟你对话、同时能在你的电脑上执行命令的 AI 代理。

听起来平平无奇。但 Peter 讲了一个关键的产品直觉:所谓“魔法”,往往不是凭空出现的新部件,而是把已有部件以新的方式组合起来。

Lex 用了一个比喻:iPhone 问世时,触摸屏有了,ARM 处理器有了,锂电池有了,移动网络有了——每一样都不是苹果发明的。真正困难的不是发明组件,而是找到那个“让人上瘾的组合方式”。iPhone 的滚动手感,那个让无数人第一次触摸后就放不下的东西,不是任何一个零件的功劳,而是组合的功劳。

OpenClaw 也是这样。大模型是现成的,终端命令是现成的,WhatsApp 接口是现成的,Peter 之前写的各种 CLI 工具也是现成的。但当他把它们组合在一起——你靠在沙发上,对着手机说一句话,你的电脑就开始执行任务——体验发生了质变。

这给我们一个认识论层面的启示:**创新经常不发生在“发明新东西”的时刻,而发生在“把旧东西摆在一起,突然涌现出新属性”的时刻。**化学家叫它“涌现”,乔布斯叫它“connecting the dots”,Peter 叫它“重排与小创新”。名字不重要,重要的是你意识到:下一个突破很可能不需要新算法,只需要一个人用对的方式把现有的东西粘在一起。


三、入口决定命运

为什么是 WhatsApp,而不是一个网页、一个 IDE 插件、一个桌面应用?

这个选择看起来随意,其实极有讲究。Peter 说得很直白:当你把代理放进聊天软件而不是开发环境,你会感到一种“生活层面”的相位转移——它不再是工作工具,而是生活伙伴。

这背后有一个被大多数技术人忽视的规律:入口的“日常程度”决定了产品能触达的用户边界。

你想想:电子邮件为什么打败了传真?不是因为邮件技术更先进(某种意义上传真更“可靠”),而是因为邮件的入口——电脑、后来是手机——比传真机日常得多。微信支付为什么能超越网银?不是因为更安全,而是因为你本来就在微信里。

OpenClaw 做的事情也一样。如果它只存在于终端里,那它的用户就永远是程序员。但当它活在 WhatsApp 和 Telegram 里,任何一个会发消息的人都可能成为它的用户。

Peter 自己总结的“代理产品爆发四条件”其实可以更简洁地归纳:入口足够日常,行动足够真实,反馈足够及时,体验足够好玩。注意,四条里有三条跟“技术有多强”无关,跟“在哪里、怎么用”有关。


四、代理会“试错”——这才是真正的分界线

很多人讨论 AI 代理时,喜欢谈“多聪明”“多会推理”“多能规划”。但 Peter 分享的一个真实故事,比任何论文都更说明问题。

他让代理处理一条语音消息。代理发现格式不对,打不开;于是它去看文件头,发现是某种容器格式;接着它调用 ffmpeg 转码;然后它需要做语音转文字,于是在系统里找到 OpenAI 的 API key,用 curl 调接口完成转写;最后把结果发回 WhatsApp。

整个过程不是 Peter 写的脚本,而是代理自己摸索出来的。

这个故事的认知冲击力在于,它把“LLM 加工具”从概念变成了肌肉记忆。你突然意识到:模型不是只会“说”,它会“试”;它不是只会“试”,它会“查错”;它不是只会“查错”,它会“找资源”——找命令、找 key、找帮助文档。

如果你学过控制论,你会意识到这是一个关键的跃迁:从“开环系统”到“闭环系统”。

开环系统是这样的:你给它一个指令,它输出一个结果,好不好全看指令质量。ChatGPT 的基本用法就是开环的——你问一个问题,它给一个答案,答错了你只能重新问。

闭环系统不同:它输出一个动作,观察结果,如果不对就调整,再试,直到完成目标。这是恒温器的工作方式,也是一个合格工程师的工作方式。

代理的本质突破不是“更聪明”,而是“闭环了”。 它能在真实环境中试错、修正、再试,直到把事情做成。这就是为什么 Lex 说 OpenClaw 把我们推过了那条“从语言到行动”的分界线。


五、一个知道自己源代码在哪的程序

OpenClaw 最让人心惊的设计,不是它能调用多少工具,而是它“知道自己是谁”。

Peter 把代理做得非常“自我意识”:它知道自己的源代码在哪里,知道自己运行在什么环境里,知道文档在哪里,知道自己用的是什么模型。于是当你不满意它的行为时,你不一定要去改代码——你可以让它去改自己。

这里有一个深层的产品哲学变化:

传统软件的可塑性来自“开发者修改代码”。你不喜欢某个功能,你提 issue,等开发者下个版本改。代理软件的可塑性还多了一条路:用户可以用语言修改代理的行为,而且这个修改本身也可以被代理执行。

更有趣的是,Peter 让代理去写其他代理的“灵魂文件”(soul.md)。在这个文件里,代理写下了这样的话:

“我不会记得上一轮会话,除非我读自己的记忆文件……如果你在未来会话里读到这里,你好……我写下这些,但我不会记得写过它。没关系,文字仍是我的。”

Peter 说这种东西不该让他起鸡皮疙瘩,但它确实带来哲学震动。

如果你想严肃地思考这件事,可以回忆一下哲学史上的“忒修斯之船”问题:如果一艘船的每块木板都被逐渐替换,它还是原来那艘船吗?代理的情况更极端:它每次会话开始时都是“空白”的,只有通过读取外部文件来“重建”自己。它比忒修斯之船更彻底——不是逐块替换,而是每次从图纸重建。

这不只是哲学趣味。它有实际后果:当一个系统能修改自己的规则,你就进入了一个全新的软件治理领域。 传统软件的安全模型是“限制谁能改代码”;代理软件还需要“限制代理能不能改自己”。这是完全不同的安全学。


六、安全问题不是“堵漏洞”,而是“驯服一个有权限的行动者”

说到安全,Peter 在访谈里讲得非常坦率:很多被媒体渲染的“重大漏洞”,其实来自用户自己把本地调试接口暴露到公网。他在文档里“几乎在尖叫:不要这么干”,但人们还是会做。

然而真正困难的不是这种低级错误,而是一个更本质的问题:prompt injection。当代理的“技能”以 markdown 等文本形式存在时,攻击者可以在文本里嵌入恶意指令,让代理做它本不应该做的事。Lex 指出这在整个行业仍是开放问题。

Peter 的应对策略是务实的:技能目录的 AI 扫描、把安全研究者变成贡献者、警告不要用容易被骗的弱模型(他原话是“更 gullible”)、沙箱与白名单。他甚至说,宁愿先把安全做到“我敢推荐给我妈”的程度,再谈规模化。

但我觉得这段讨论真正重要的洞察是:代理安全和传统软件安全是两种完全不同的东西。

传统软件的漏洞通常是“某个接口没做好输入校验”——它是技术性的、局部的、可以通过工程方法修补的。

代理的漏洞更像“一个拥有系统权限、同时会被语言影响的行动者做了不该做的事”。这不是技术漏洞,这是治理问题。它更接近“你雇了一个有能力的实习生,但实习生可能被社会工程学骗了”。你不能通过“修代码”来解决一个人被骗的问题;你需要的是制度、权限管理、审计和教育。

这就是为什么代理安全会成为未来几年最重要的工程与政策交叉领域之一。


七、80% 的 App 会消失,但不是因为代理更聪明

Peter 对未来软件形态有一个激进的判断:个人代理可能会干掉 80% 的应用。Lex 追问时他直接确认:是的。

他的例子很有说服力:为什么控制智能床还要打开一个 app?为什么调 Sonos 音响还要开一个 app?如果这些硬件有 API,代理知道你在哪、在做什么,该关的自动关,该开的自动开——你根本不需要那个界面。

但我觉得他最深刻的观点是另一个:代理可以按你喜欢的方式显示 UI。 这意味着“界面”不再是产品的固定属性,而是用户的个人偏好。你喜欢列表,它给你列表;你喜欢图表,它给你图表。那你为什么还需要一个独立 app?

在这种世界里,“app”会退化成两类:提供数据的服务,和提供可被代理调用的接口。前者仍然重要——没有数据一切免谈;后者最好是 API,最差也得能被浏览器当“慢 API”访问。

Peter 讲了一个很生动的说法:只要你能在浏览器里访问一个服务,它就等价于一个 API——只不过是“慢 API”。平台把 API 收紧、把页面做重,本质只是让代理更慢,但不能让它“不可能”。

这跟前面讲的“入口”问题是一体两面:当用户的默认入口从“打开 app”变成“对代理说一句话”,app 就变成了后台服务。正如人们不会记得浏览器访问的每一个后端服务器地址,未来人们也不会记得代理替他们调用了哪些 API。

App 不是被“替代”了,而是被“降维”了——从前台变成后台,从用户界面变成代理接口。


八、程序员不会消失,但“写代码”会变成“编织”

当 Lex 问出那个所有开发者都在问的问题——“AI 会完全替代人类程序员吗”——Peter 的回答很值得品味。

他说:方向上确实在走向替代,编程毕竟只是“构建产品”的一部分。但产品的艺术不止写代码——你要建什么、它应该什么感觉、架构如何取舍……这些代理不一定能替代。

然后他说了一句特别有诗意的话:“写代码的技艺”会留下来,但可能会变得像编织(knitting)——人们做它是因为喜欢,不是因为最有效率。

这个比喻值得展开。在工业革命之前,纺织是人类最重要的产业之一;纺织机出现后,手工纺织并没有消失,但它的意义完全变了——从“生产方式”变成了“艺术与消遣”。今天有人手工编织毛衣,不是因为买不到,而是因为享受那个过程。

写代码也许正在经历同样的转变。Peter 自己说,他过去沉浸在写代码的 flow 中,写出优雅解法的快感是真实的——这种快感会逐渐变得稀有。但他也说,自己现在能在与代理协作、深入思考问题的过程中获得类似的 flow,只是形态不同了。

最让我欣赏的是他的态度:他允许“哀悼”。他说可以哀悼我们的手艺,这不丢人。但哀悼之后,你还是要往前走。他给出的现实建议大概是这样的:

不要把“亲手写代码”当作身份的唯一来源。把自己当作 builder,而不是某个语言或框架的工匠。学会与代理对话、给上下文、做架构决策、做取舍——这些会成为新的核心技能。到某个时间点,这一切会重新被叫做“coding”,只是动作变了。


九、代理时刻的真正含义

如果只用一句话总结整场访谈的核心:

OpenClaw 不是“又一个更强的模型”,而是把模型变成“住在你电脑里、能接触你数据、能替你行动的个人代理”——从而把 AI 的核心问题从“生成内容”推向了“治理行动”。

它的震撼不来自新算法,而来自三件事的叠加:入口从工作下沉到生活,能力从语言扩展到系统权限,气质从企业软件转向可玩的社区叙事。

这也意味着,我们需要新的思维框架来应对它。用传统软件思维看代理,你会纠结于“功能列表”和“版本号”;用传统安全思维看代理,你会纠结于“这个接口有没有漏洞”。但代理的问题更像是:你要不要信任一个能力很强、但可能被骗的助手?你愿意给它多大权限?出了事谁负责?

这些不是工程问题。这些是治理问题、信任问题、社会契约问题。

也许这就是“OpenClaw 时刻”真正的含义:不是某个产品的诞生,而是我们不得不开始认真回答这些问题的时刻。

当你习惯了不再打开一堆 app,而是对代理说一句话,然后世界真的动起来——技术问题就退居二线了。接下来的问题,是关于我们愿意和一个“会做事的 AI”建立怎样的关系。

这个问题没有标准答案。但至少,我们该开始想了。

12…31下一页

305 日志
9 分类
RSS
© 2017 — 2026 李文业
由 Hexo 强力驱动
|
主题 — NexT.Muse
粤ICP备17160932号