AI 生成测试我怎么取舍:哪些让它写,哪些必须人写
AI 生成测试我怎么取舍:哪些让它写,哪些必须人写用 AI 写业务代码越来越顺手之后,下一件很自然的事就是:让它把测试也补上 说实话,这一步的爽感很强——几分钟冒出一堆 should_xxx,覆盖率数字往上跳,CI 绿灯 问题也正好出在这里:绿灯不等于有保险 我经历过一次挺丢脸的事 AI 帮我补了十几个单测,覆盖率从 40% 拉到 75%,合并后第三天生产就炸了 回头看测试,几乎每个都在验证“mock 对象有没有按我设定的方式被调用”,真正的业务不变量一个都没钉住 测试在保护 mock,不在保护系统 这篇文章想说清楚三件事:哪些测例我愿意交给 AI;哪些我坚持人手写;以及怎么减少“假绿” 图片来源:原创示意图 我不想装清高

2026-10-14鱼鱼
用 AI 读英文技术文档:我怎么防它“翻译腔”和悄悄漏译
用 AI 读英文技术文档:我怎么防它“翻译腔”和悄悄漏译我英文阅读不算差,但读长篇官方文档还是累 尤其是那种配置参考页、迁移指南、RFC 风格的规范,一页几十屏,读到后面前面的全忘了 所以这两年我读英文文档,基本都会拉上 AI 一起:整段丢进去,让它翻成中文,或者干脆让它讲给我听 一开始我觉得这是纯赚的事 直到有一次按译文改了配置,上线前同事问我:“文档里不是说这个参数只有在另一个开关打开时才生效吗?”我回去翻原文,还真有那么一句 unless 从句,而 AI 给我的中文里,这半句干干净净地消失了 译文读起来非常顺,顺到我完全没怀疑 从那以后我对“AI 翻译技术文档”的态度变了:它很好用,但它的错不是乱码式的错,而是读起来很通顺的错

2026-10-16鱼鱼
给仓库写一份 AGENTS.md:让 AI 编程助手少走弯路
给仓库写一份 AGENTS.md:让 AI 编程助手少走弯路用 AI 编程助手久了,你大概会有一种“祥林嫂”式的疲惫:每开一个新会话,就得把同样的话再说一遍 “我们用 pnpm,不是 npm ”“跑测试要加这个参数,不然会连真实数据库 ”“generated 目录下的代码是自动生成的,别改 ”“提交信息要按这个格式写 ” 说一次两次还好,说到第十次,就会开始怀疑人生 更糟糕的是,你偶尔忘了说,AI 就会理直气壮地按自己的默认习惯来,然后你再花时间收拾 解决这个问题的办法其实很朴素:把这些话写下来,放进仓库,让 AI 每次开工前自己读 这就是 AGENTS.md 要干的事 图片来源:rawpixel.com(CC0 1.0) 一句话:给 AI 看的 README

2026-10-14鱼鱼
用 Java + Spring 搭一个简单的 Agent
用 Java + Spring 搭一个简单的 Agent作为 Java 爱好者,很多人会问:Agent 开发是不是只能用 Python?其实不是 Agent 的核心是“调用模型 + 执行工具 + 循环”,用 Java 同样可以优雅地实现,并且能直接复用 Spring 生态里的依赖注入、配置、监控等能力 本文会一步步搭出一个可以扩展的 Agent 骨架:定义工具接口与注册表、封装模型客户端、实现带保护的 Agent 循环、暴露 REST 接口与会话存储,最后给出监控、测试、常见坑与迭代路线 让 Agent 调用 Java 业务能力的两种思路 很多企业的后端系统本身就是 Java 写的:订单、库存、权限、审批流都在 Spring 服务里

2026-10-14鱼鱼
让 AI 解释陌生代码:我怎么听出它在「圆场」
让 AI 解释陌生代码:我怎么听出它在「圆场」接手陌生模块时,我常会把一段代码丢给 AI,问:「这是在干什么?」它几乎总能讲出一套流畅的故事 问题是——流畅不等于正确,更不等于它真读懂了约束 我越来越在意一种说话方式:它在「圆场」 表面在解释,实际在把不确定的地方用顺滑的因果糊过去 这篇文章记我怎么听、怎么追问、什么时候该停 写给同样会在「哇它好懂」和「等等它是不是编的」之间来回横跳的人 我遇到过的圆场,大概有几类: 因果补全:代码里没写为什么,它给你编一个听起来合理的「因为……所以……」 命名联想:函数叫 refreshCache,它就按「刷新缓存」的教科书含义讲,不管仓库里这个词早就变味 忽略例外路径:主路径讲得很漂亮,catch、降级、兼容分支一笔带过

2026-10-15鱼鱼
JEV 是什么:一个不写字、只做判断的模型(附我的调试台 jev.fishmaple.cn)
JEV 是什么:一个不写字、只做判断的模型(附我的调试台 jev.fishmaple.cn)先放链接:jev.fishmaple.cn 这是我前两天搭的一个小调试台,叫 Jev Lab 打开就能用,填一个 OpenRouter 的 Key,就可以直接在浏览器里调 JEV 这篇想聊聊 JEV 到底是个什么东西,它跟传统分类器、重排序差在哪,以及九月它出来之后,OpenAI、微软、Cloudflare、阿里、Perplexity 这些大厂怎么对标的 九月中旬刷 OpenRouter 的模型列表,看到一个叫 typesafe/jev-1.13 的东西,上线日期是 2026 年 9 月 18 日 价格那栏把我看愣了:输入每百万 token 0.042 美元,输出是 0 输出免费?我第一反应是标错了

2026-10-14鱼鱼
动态路由数据源(多租户)解决方案
动态路由数据源(多租户)解决方案当下有很多服务都使用了多数据源,或是出于跨库查询或是分库分表、读写分离等,多数据源解决方案早已不是稀罕事 常见的解决方案包括使用多数据源框架(例如Shareding-Jdbc)、在数据库端做代理(例如MYCAT)、对于固定的几个数据源连接,也可以直接手动配置多个数据源,这种相关处理有很多源码,我在github上也有简单的实现:fishstormX/dynamicDataSource: 动态数据源的实现,基于maven自定义多模块骨架 Spring Boot2.0.x,本文实现的是动态数据源,主要为了解决 多租户问题(不同的用户群组有不同的数据源和配置,强调数据的隔离性) 本文技术能实现的是动态数据源,基于Spring框架,即能够将注入的Datasource根据租户不同使用不同的来源,同时根据租户增减动态的增删和缓存数据源(增是因为会有新增租户可能使用到项目启动后的数据源,减是因为租户数不可预料,不可直接缓存所有的数据源)

2021-01-07鱼鱼
Redis原理-源码解析:数据结构2 list
Redis原理-源码解析:数据结构2 list所有原理实现基于Redis版本6.0.9 Redis中的list采用的是链表,在开始前,我们先看看list的最基本指令实现 t-list.c 由此可知,Redis的List底层数据结构都是基于quickList的 这是list所依赖的数据结构: quicklist.h 我们注意到其是由quicklistNode所构成的链表,而其中的数据实则为zl(ziplist)或是bookmark,在大多时候quicklistNode都使用ziplist存储数据 在上文中lpush执行了一个插入方法quicklistPush,在quicklist.c中有他的实现: quicklist真正存储数据的结构是ziplist,所以倒不如说,在Redis中,list是一个由ziplist节点构成的链表

2020-11-28鱼鱼
长任务 Agent 的断点续跑:Checkpoint、幂等与人工审批怎么落地
长任务 Agent 的断点续跑:Checkpoint、幂等与人工审批怎么落地一个 Agent 跑到第 37 步,这时候部署系统滚动发布,Pod 被重启了 或者模型接口突然开始返回 429,重试几次之后放弃了 又或者它走到“给客户发邮件”这一步,按规定要等主管审批,而主管这会儿在开会,三个小时后才能看手机 这些时候你该怎么办?从头再跑一遍吗? 前 36 步花掉的 token 和时间先不说,更要命的是,前面那些步骤里,如果有“发了邮件”“建了工单”“扣了款”这种动作,从头再跑就意味着再发一次、再建一次、再扣一次 Demo 阶段的 Agent 很少考虑这些,因为 Demo 跑一次也就几十秒 但只要你的 Agent 开始处理真实的长任务,这个问题迟早会找上门 这篇文章想聊聊我对这个问题的理解,以及一个能落地的最小实现

2026-10-14鱼鱼
给 Agent 设计工具:参数与错误返回怎么约定才好用
给 Agent 设计工具:参数与错误返回怎么约定才好用做 Agent 久了会发现:模型“聪不聪明”常常不是瓶颈,工具好不好用才是 同一个模型,换一套清晰的工具契约,成功率能差一截;换一套含糊的,它就会在重试里空转,或者把半成功当成成功继续往下跑 我踩过的坑大多长这样:工具返回一句 "failed",模型不知道是参数错了、权限不够,还是下游超时;于是它换个说法再调一次,参数其实没变 或者工具抛了未捕获异常,框架把它变成空字符串,模型以为“没结果”就去编造 这篇文章只谈两件事:参数怎么设计,以及错误怎么返回,让工具对模型可观测、对系统可重试 图片来源:原创示意图 能用枚举就别用字符串 比如 priority: "high"|"normal"|"low",不要 priority: string 然后在文档里写“建议传 high”

2026-10-14鱼鱼
分布式系统中的一致性算法和问题解决
分布式系统中的一致性算法和问题解决在撰写脑裂问题相关的博客时发现脑裂问题的产生原因在不同算法下的分布式系统各不相同,需要先大致了解一致性算法并针对性的解决 市面上有很多开源的分布式系统,他们的数据一致性算法不尽相同,例如k-v系统的祖师爷——zookeeper采用的是ZAB的算法,而最近流行的Consul是raft算法,不同数据中心server沟通的方式则是gossip协议 不同的协议和方式对选举和数据同步有不同的处理机制,利用这篇文章来对比常见的分布式一致性算法 一个系统可能会使用多个不同的一致性算法,以便于在不同的业务环节上有着各自更贴切的处理 ps:有种观点是一致性算法不是很准确,因为replica也能保证数据某种程度上具有一致性,有人称之为共识算法

2021-03-13鱼鱼
什么是 AI Agent?从 ReAct 循环讲起
什么是 AI Agent?从 ReAct 循环讲起最近一年,“Agent”这个词几乎出现在每一篇 AI 文章里 但很多人写了半天 Agent,其实只是把一个大模型接口包了层壳 这篇文章从最小的模型出发,讲清楚 Agent 到底是什么,以及它的核心运行机制——ReAct 循环 读完之后,你应该能回答三个问题:Agent 和普通聊天有什么本质区别?一个 Agent 的每一步到底在发生什么?怎样用几十行代码搭出一个能跑的最小 Agent,并知道它会在哪里出问题? ReAct 循环:思考 → 行动 → 观察,直到给出最终答案 早期使用大模型,基本是“一问一答”:把问题写进提示词,模型返回一段文字 这种方式对写文案、翻译、解释概念很好用,但一遇到下面这些需求就力不从心:

2026-10-14鱼鱼