0%

天下苦 AI 味久矣。这话如今说出来,大概不会有人反对。打开任何一个信息流,都能看见同一副腔调:三段式排比、莫名其妙的加粗、把一切结论都包装成「这意味着」,结尾还要来一句「希望对你有帮助」。

「偷懒」是人类进步的源动力。我确实想写点东西,但从前写一篇要坐三四个小时,现在让模型起草,十分钟就能出一版。问题在于那一版实在不忍心发出去。它不太像人话,发出去是污染大家的 timeline,也白白增加读者的理解负担。

思来想去,决定给 AI 去去味儿。

味道出在句法上

最先想到的是列一张禁用词表。试过之后发现没用。那些词早就换过好几轮了,从「赋能」「抓手」换到「颗粒度」「对齐」;禁掉一批,很快又会有新的一批冒出来。

真正稳定的特征在句法层面。举几个我这几个月反复见到的:

  • 先立一个读者并没有的误解,再把误解推翻。「真正的壁垒不是技术,而是认知」,可没有人说过壁垒是技术。
  • 把该展开的关系压掉。写成「三条路,按侵入性从小到大」,读者要先还原一次才知道在数什么。
  • 造缩写。「命中的那部分」缩成「命中段」,既不是通行术语,也没有在前文交代。
  • 用交通隐喻讲抽象过程。「隔着几段路」「把这条路走一遍」,中文不这么说话。

这几条共同的来源是省字。模型在压缩 token,人写文章不按 token 计费。

先把自己的写法变成数字

既然要让它像我,先得知道「我」是什么。这件事靠感觉说不清,我自己的判断也不可靠。

于是把它变成可统计的东西。我把博客 2013 年到 2025 年的 405 篇文章存成一份语料,去掉代码、图片和链接地址,剩下 51.6 万个汉字,跑了一遍统计。

结果里有些数字是我事先没想到的。

平均句长 50.9 字,其中五十字以上的长句占三成三,十五字以内的短句不到百分之九。这和我对自己文风的印象不太一样,我一直觉得自己写得挺利落。

引号几乎全是直角引号「」。中文双引号在 51.6 万字里只出现十次左右。这一条我自己都没意识到,但它是最好认的一项,改稿时一眼就能看出来。

87.9% 的文章没有「总结」章节,写完就停。剩下那 12% 里有总结的,基本都是问答整理类的稿子,因为素材本来就是别人的话,需要自己再落一遍结论。

配图平均每篇 0.9 张,三分之二的文章完全没有图。有图的场合很固定:编译效果、报错界面、操作步骤。

统计之外,还得把原文读一遍。405 篇我没有逐篇读完,但每个体裁都抽了十几篇通读,看句子怎么起、段落怎么接、什么时候突然用一个短句。数字能告诉我平均句长五十字,读原文才知道那五十字是靠逗号、破折号和括号分层的,不是一口气写完。

最后我把结果整理成六层:语言、结构、选题、素材、认知框架、视觉。这六层里,前三层可以让模型照着写,后三层只能提示它立场在哪里。

数字复刻不了判断

第一版样本是我让它试写的,题目是 prefix cache 的命中率为什么换不来吞吐。数据、结构、句式都照做了,交到我手上还是不对。问题出在每一句话怎么选。

后来又改了四轮,每一轮挑出来的毛病都不一样,但把这些毛病追下去,指向的是同一个地方。

第一轮挑出来的是记账腔。稿子里有「它决定了这 1 GiB 最终记在谁头上」,还有「这一点在第三节会变成一笔很难看的账」。用记账的词讲性能,读者会以为在谈钱。

第二轮挑出来的是假想误解。稿子里写「容器能看到的 CPU 是三个不同的东西,混在一起就会得出错误结论」。后半句在替读者预防一个没有人犯过的错,把它删掉,前半句照样成立。

第三轮挑出来的是缩写和压缩。稿子里有「命中段」,有「三条路,按侵入性从小到大」,还有「线程池开到 64,实际执行宽度只有 2」。最后那句里的「执行宽度」是英文 execution width 的直译,中文没有这个说法。

第四轮挑出来的是断句。稿子里有一句「P99 还抖得厉害」,六个字,主语加形容词,前面没有给出观察角度。中文会写成「从延迟曲线上看,P99 也会大幅抖动」。

四轮下来,我归纳出一条总纲:不够省才是对的。把关系说全,观察角度给出来,指代说清楚,该展开的展开。

把批评变成规则

只有 DNA 还不够。DNA 告诉我写成什么样,没告诉我改的时候往哪个方向改,而我下次未必还记得这四轮里揪出来的细节。

所以我把每一轮的批评写成一条规则,一共十七条。每条要有两样东西:一个能定位的触发标记,一个最小改法。

记账腔的触发标记是「账」「台账」「算账」「记在谁头上」出现在非财务语境里。假想误解的标记是陈述之后追加「否则就会怎样」,而原文里并没有人提出过那个误解。压缩拆成四种:主谓补结构的紧凑断句、计数型缩写、英文概念直译,以及省掉施事的判断句。

写成规则的好处是可验收。改完一段可以逐条对照,指不出对应规则的改动就是改多了;反过来,找得到的毛病也终于有了名字。

它现在能干什么

按这套东西写出来的稿子,句式、结构、判断顺序都对了。最后那篇讲容器里 nproc 为什么报出宿主机核数的文章,前后改了五轮,我才点头。

做不到的地方也清楚:写不出我没有经历过的事。它可以把我踩过的坑写成我的语气,但没踩过的坑,它会编。数据也一样,让它写实测,它会给出一个看起来合理的数字,我得自己回去核对。

想用可以去拿

代码和规则都放在 GitHub 上:Liam0205/skills。

里面是三个独立的 skill,可以只装一个:

  • liam-page-writing:这次蒸馏出来的结果,五份分析产物加 405 篇原文语料。动笔之前会先读产物,再从语料里挑五篇同体裁的原文通读。
  • less-ai-tone:十七条清理规则,不依赖任何语料,单篇文章也能用。
  • writing-dna:蒸馏方法论本身。想给自己或者别人的文章做同样的分析,用的是这一套。

安装两步:

1
2
git clone https://github.com/Liam0205/skills.git
cd skills && ./install.sh --target claude --all

--target 换成 hermes 或 codex,装到对应的目录。默认用软链接,改仓库里的文件立刻生效,方便迭代。

用起来就一句话:让它按某个人的文风写,或者把一段稿子丢过去要求清掉 AI 痕迹。前者要读语料,慢一些;后者快很多。

规则和脚本是 MIT 许可。语料目录里的文章版权归我,只授权阅读和风格分析,不授权转载。

还有一点要说清楚:这套东西对语料的依赖很重。liam-page-writing 之所以能写到七八分像,是因为它在动笔前读了几百篇原文。换成没有语料的场合,它的效果就退回到 less-ai-tone 那一层,管的是句子,管不到是谁的口吻。

「偷懒」在这里的算法是:一次性把风格拆到规则级别,换来以后每篇少改几轮。头一回花的时间远比自己写要多,从第二篇开始,省下来的时间才超过这笔投入。

规则能管住怎么说,管不住说什么。写什么这件事,还是得自己来。

我在做一个跨语言的算子引擎,同一套语义分别用 Go、Java、C++ 实现。有一处用到了读写锁——一个请求局部的数据结构,多个算子并发读它的字段,偶尔有写。三个实现都用各自语言「标准」的读写锁:Go 的 sync.RWMutex、Java 的 ReentrantReadWriteLock、C++ 的 std::shared_mutex。

某次做性能剖析时,我注意到一件有点意思的事:C++ 这边,读写锁的单次拿放在 profile 里是个能看见的开销;而 Go 和 Java 那边,同样形态的拿放几乎不出现在火焰图里。同样一把读写锁,凭什么 C++ 要贵这么多?

这篇文章记录我顺着这个疑问挖下去的整个过程:先用反汇编搞清楚 glibc 的 pthread_rwlock 到底慢在哪、Go 为什么便宜,然后把 Go 的算法移植到 C++(中间失败了一次),最后发现这个原理上完全正确的优化,在真实负载上根本测不出收益。这最后一点,可能是整件事里最值得说的。

阅读全文 »

某次 VSCode 升级之后,我从 macOS 连远端开发机的 Remote-SSH 突然进入了死循环:客户端每隔几秒发起一次新的 SSH 连接,每次都能通过 pubkey 认证、能在远端拉起 vscode-server,但十几秒后就 timed out,紧接着 attempt N+1。前后连了几十次都接不上。

机器上没有任何代码改动,远端服务可达,公钥认证也没坏。问题出在客户端的某个不起眼的角落,被一堆看起来很正常的日志掩盖着。这篇文章记录从现象到根因的整个排查过程,最后定位到一条113 字节长的路径上。

阅读全文 »

我日常的开发环境是 VSCode Remote SSH 连到一台 Linux 开发机,然后在 VSCode 的集成终端里开 tmux。Claude Code 在 VSCode 终端里直接运行时,能正常连接 IDE——可以读到我选中的代码、跳转文件。但一旦进入 tmux,状态栏就显示「Visual Studio Code disconnected」。

这篇文章记录了从现象到根因的完整排查过程。涉及 Claude Code 的 IDE 发现机制源码、tmux 环境变量继承的坑,以及最终的修复方案。

阅读全文 »

一台 4 核 15G 的多用户开发机,某天下午突然卡死了。不是那种「卡一下就好了」的卡,而是整台机器几乎失去响应、持续了将近四个小时的那种卡。SSH 能连上但每个命令都要等很久才有回应,top 刷不动,日志也写不进去。

事后我用 atop(这台机器上每 30 秒打一次点)做了完整的事后分析,从系统级指标一路追到具体进程,最终定位到一条看起来人畜无害的构建命令。然后用 Linux cgroup 给机器加上了系统级的内存防护。

阅读全文 »