让 AI 把 Python 脚本改写成 Java:跨语言迁移时它最容易丢的东西
让 AI 把 Python 脚本改写成 Java:跨语言迁移时它最容易丢的东西组里有不少“历史脚本”:某个同事几年前用 Python 写的数据清洗、对账、报表生成,跑在一台机器的定时任务里,没人敢动 最近要把其中几个并进 Java 服务,统一部署、统一监控 这种活交给 AI 再合适不过了:输入输出都明确,代码量不大,几百行 Python,它几分钟就能吐出一份结构工整的 Java 第一份迁移我差点直接合进去 代码能编译,单测能过,命名比原脚本还讲究 后来是跑了一遍真实数据对比,才发现有几十行结果和老脚本对不上 查下来,没有一处是“写错了”,全是两门语言默认行为不一样,AI 按字面翻译了语法,却没翻译语义 这篇整理一下我踩到的这些差异,以及现在怎么让 AI 做迁移才比较放心

2026-10-16鱼鱼
kasper的算法(从0到1)
kasper的算法(从0到1)https://javaguide.cn/cs-basics/data-structure/linear-data-structure.html https://javaguide.cn/cs-basics/algorithms/linkedlist-algorithm-problems.html 项目地址:https://github.com/labuladong/fucking-algorithm 在线文档地址:https://labuladong.gitee.io/algo/home/ http://fishmaple.cn/blog/topicBlog?topicId=7
![kasper的算法(从0到1)]()
2023-10-23kasper
让 AI 当「橡皮鸭」:不问答案,先逼自己把问题说清楚
让 AI 当「橡皮鸭」:不问答案,先逼自己把问题说清楚调试时对着一只橡皮鸭把问题讲一遍,很多 bug 会自己露馅——这招老程序员都听过 我后来发现,AI 其实是一只很会追问的橡皮鸭:它不会嫌你啰嗦,还会在你讲不清的地方打断你 前提是:你别一上来就问“怎么修”,先逼自己把问题说清楚 这篇文章记我怎么把 AI 当橡皮鸭用,而不是当自动答题机 写的都是个人习惯,不保证适合每个人,但对我自己很管用 以前我的坏习惯是:报错一贴,再加一句“帮我修” AI 很快给一串可能原因和改法,我挑一个试,不行再试下一个 看起来很高效,其实经常在还没定义清楚问题的情况下乱开枪 典型症状: 修完 A,B 又坏了,才发现根因根本不是 A AI 给的方案依赖一个我其实没有的前提(比如“你用的是某某版本默认配置”)

2026-10-14鱼鱼
Agent 的评估、测试与可观测性:上线前后都要看得见
Agent 的评估、测试与可观测性:上线前后都要看得见Agent 的输出具有不确定性:同一个输入,两次运行的路径可能不同 传统的“写几个单元测试就放心”在这里行不通 本文介绍如何给 Agent 建立 评估(Evaluation) 与 可观测性(Observability) 体系:怎样拆解评估维度、构建评测集、选择打分方式、记录 Trace,并顺带讨论成本与延迟的护栏 文中给出 Python 的回归评测与 Trace 记录代码、Java 的埋点示例,以及常见坑和检查清单 评估分三层:结果层、过程层、效率层 传统软件的行为大多是确定的:相同输入得到相同输出,单元测试通过就有较强的信心 Agent 有三点不同: 非确定性:模型本身有随机性,同一任务可能走不同路径,甚至有时成功有时失败;

2026-10-14鱼鱼
让 AI 起变量名和函数名,我留下的几条品味规矩
让 AI 起变量名和函数名,我留下的几条品味规矩命名一直是我写代码时最磨蹭的环节之一 名字起糊了,后面读代码的人(包括一个月后的我)会一直付税 AI 很擅长甩出一串候选名,也很容易甩出看起来专业、读起来空洞的名字 这篇文章记我让它起名时留下的几条规矩——不是语法规范全文,是品味上的取舍 我愿意让 AI 起名,前提是: 我已经能用一句话说明“这个东西在业务里干什么” 我要的是 3–5 个候选,不是一个“最佳答案” 最终选定权在我,尤其是会进公共 API、表字段、事件名的那些 一上来就说“给个好名字”,它常会给你 handleUserData、processInfo、manageService 这类语法正确但语义稀释的词 候选机模式能逼它发散,也逼我比较

2026-10-14鱼鱼
给 Agent 一个草稿本:为什么 scratchpad 比全塞进 prompt 更稳
给 Agent 一个草稿本:为什么 scratchpad 比全塞进 prompt 更稳做长任务 Agent 时,我最早的做法特别朴素:把所有中间结果、计划、反思,一股脑追加进对话上下文 反正模型“看得见”,多写点总没错 错就错在“多写点” 上下文很快又脏又长:旧计划和新计划并存,失败的工具输出还在,模型开始引用过期结论,或者在同一段推理上打转 更麻烦的是,你很难回答一个基本问题——此刻 Agent 到底相信什么? 后来我给 Agent 加了一个显式的“草稿本”(scratchpad):工作记忆外置到一块可读写的状态里,prompt 里只放当前需要的摘要和指针 稳定性和可调试性都好了不少 这篇讲讲为什么,以及我怎么划分什么该进草稿本 1. 噪声淹没信号 工具返回动辄几千字,失败堆栈、HTML 片段、长 JSON,全进上下文

2026-10-14鱼鱼
第一次用 AI 改 bug 的真实节奏
第一次用 AI 改 bug 的真实节奏第一次认真用 AI 改 bug,不是那种“帮我写个排序”的玩具题,是线上真出了问题:某个接口偶发超时,日志里只有一句 Read timed out,复现不稳 我那会儿把堆栈和一段相关代码扔给 AI,它很快给了一版“优化建议”——加超时、加重试、换连接池参数 看起来很专业,我差点就合进去了 后来自己又翻了半小时才发现:真正的原因是下游在高峰时返回了一个空 body,客户端按固定 schema 去解析,偶发抛异常,异常被上层吞掉,最终表现为超时 AI 那套建议能“缓解症状”,但治不了病,还可能把问题藏得更深 这篇文章想写的,是我后来慢慢摸出来的一套节奏:怎么描述现象、给什么上下文、什么时候该自己看代码

2026-10-14鱼鱼
Agent 的 Token 账单怎么省:Prompt Caching、上下文瘦身与模型分级
Agent 的 Token 账单怎么省:Prompt Caching、上下文瘦身与模型分级做 Agent 的人,大概都经历过这么一个时刻:功能调通了,效果也还行,兴冲冲地跑了一批真实任务,然后打开账单页面,沉默了 同样是调用大模型,Agent 为什么比普通聊天贵这么多?钱都花在哪了?能不能在不明显影响效果的前提下省下来?这篇文章想把这笔账算清楚,再聊几种我觉得性价比最高的省钱办法 先声明一下:各家模型的价格和缓存规则变得很快,文中涉及的具体规则,以我写作时(2026 年 10 月)看到的官方文档为准,你落地之前最好再核对一遍 思路是通用的,数字请以官方为准 图片来源:Negative Space / StockSnap(CC0 1.0) 普通聊天,一问一答,输入的就是你的问题加上一些历史

2026-10-14鱼鱼
数据库使用指南:MySQL 与 PostgreSQL,一份写给后端开发者的实战手册
数据库使用指南:MySQL 与 PostgreSQL,一份写给后端开发者的实战手册大多数后端工程师和数据库打交道的方式,是这样演进的:先学会 CREATE TABLE 和 SELECT,再被某次线上慢查询教育一遍,接着是死锁、主从延迟、大表加字段锁住业务、误删数据找不到备份……每一次事故,都是对数据库“知识债”的一次还款 这篇文章希望把这些债务提前梳理一遍:不是 DBA 手册,而是写业务代码的人需要知道的那一部分,同时把 MySQL(InnoDB 引擎)和 PostgreSQL 放在一起讲,因为在实际工作中,你很可能两个都会遇到,而且两者的差异恰恰是很多坑的来源 全文按照一个后端项目从“选型”到“上线运维”的顺序展开: 选型与建模:怎么在 MySQL 和 PostgreSQL 之间做选择;表结构、主键、数据类型、时间、字符集、范式与反范式、软删除、唯一约束

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

2026-10-14鱼鱼
让 AI 帮我把项目升到 Spring Boot 3:它扛了体力活,也埋了几个坑
让 AI 帮我把项目升到 Spring Boot 3:它扛了体力活,也埋了几个坑我们组有个内部服务,一直跑在 Spring Boot 2 上 2.x 早就停止开源免费维护了,安全扫描隔三岔五报一堆依赖漏洞,升级这件事拖了很久,终于排到了我头上 这次我决定全程拉着 AI 一起干 前后大概用了一周多(中间还穿插着别的需求),最后顺利上线 回头看,AI 确实帮我扛了大部分体力活,但也有几个坑是它挖的,或者至少是它没提醒我的 这篇把过程和教训记下来,给同样准备升级的同学参考 先声明:下面说的都是我们这个项目的情况,每个项目的依赖和历史包袱不一样,具体以 Spring 官方的迁移指南为准 一开始我问 AI:“把这个项目从 Spring Boot 2 升到 3,需要改什么?”它给了一份清单,大方向没错:Java 版本要 17 以上、javax 包要换成 jakarta、Spring Security 的配置写法变了,等等

2026-10-14鱼鱼
Java中的协程(虚拟线程)探究
Java中的协程(虚拟线程)探究在Java最新的LTS版本 21中,终于实装了协程这一特性 当然,在这些诸如python、golang等轻量级语言中被称为协程的东西,在Java中有个全新的代号——虚拟线程,为了将协程与线程做区分,在Java21中,原Thread被称之为平台线程 下文中,将统一使用线程/协程的方式称呼 我们都知道,Java中引入了线程的概念,区别于系统中的进程 作为并发执行的最小单元,在一定的条件下,使用多个线程同时运作可以有效提高程序的运转效率 而线程这一能力源于系统本身而并非JVM 之所以说是在一定条件下,是因为受限于机器配置情况(CPU的运作机制、核心数),线程的同时运作并不能线性的提升运行性能,单个cpu并不能同时处理多线程任务,实际的运作方式是基于时间片分片,各个线程抢占式执行代码,这样能减少一些无效的io等待(例如网络io、磁盘io实际是会阻塞等待io结果),同时在多核心场景下也能有效利用cpu
![Java中的协程(虚拟线程)探究]()
2024-10-28鱼鱼