Latest articles

从填鸭到因材施教:Andrew Ng 的新赌注,和我们这代学习者的改变

Posted on in Journal

Andrew Ng 又创业了,这次赌的不是更强的模型,是"怎么学"——他说在线教育这十五年改变了在哪学,没改变怎么学。这话让我想起我女儿在大学里的处境:题做得不错,可一碰到没有标准答案的事就露怯。这篇想说清楚:AI 能把因材施教的门槛打下来,但打不下来的那道坎,还得学习者自己迈——文末附一张 Anthropic 研究数据撑着的具体清单,一份给她,一份给我自己。

Continue reading

评估 AI Skills 和知识库:自己写的技能,可能比不装还差

Posted on in Tech

用 AI 生成知识库页面和技能文档很容易,页面唰唰地就多了起来,可细看质量常常撑不住,后面的维护和质量保证反而成了新问题。这篇把“靠不靠谱”拆成生成、验证、维护三笔账分别算,带出 SkillsBench 一个反直觉的发现——自己写的 Skill 可能比不装还差——再给一套可操作的评估框架、风险分级验证流程和一份陷阱清单。

Continue reading

Keepalived 与浮动 IP:机器可以换,服务地址不能换

Posted on in Tech

挂机器不可怕,可怕的是客户端手里那个地址只有一台机器认。Keepalived 的答案是把“服务 IP”做成一张会搬家的值班牌:两台服务器靠 VRRP 互相报活,持有浮动 IP(VIP)的那台挂了,备机几秒内接管同一个地址,客户端不用改任何东西。这篇讲清楚原理、一份照着改的配置、最佳实践,以及六个能让你半夜被叫起来的坑——尤其是 weight 扣不到位导致切不动、VRRP 走 IP 协议 112 而不是端口、以及双机主备没有 quorum 的脑裂。

Continue reading

写 FreeSWITCH module 这件事,套路比 API 数量重要得多

Posted on in Tech

网上讲 FreeSWITCH module 开发的文章大多要么把 mod_skel.c 贴一遍,要么逐行解读某个现成模块,看完还是不知道怎么从零写自己的。其实 module 开发只有几个固定套路:搭骨架、选对钩子、回调别阻塞、管好生命周期。这篇用"实时录音并转文字"这个具体场景把整套方法走一遍,源码签名对照 FreeSWITCH 1.6.19 开源代码核实,附上手 checklist 和常见陷阱表。

Continue reading

我本来想给这个仓库写一份 AGENTS.md,两篇论文劝住了我

Posted on in Tech

AGENTS.md(给 AI coding agent 看的项目说明文件)现在已经进了六万多个 GitHub 仓库,几乎成了标配。可两篇论文把这个"标配"拆开看了一遍:一篇挖了 2303 份真实文件,发现大家写的东西高度集中在"怎么跑测试""怎么搭架构",安全和性能几乎没人提;另一篇直接拿基准测试去测"写了到底有没有用",结果是自动生成的那部分大多是噪音——不提速、不提分,只多花两成推理成本。这篇把两份证据摆在一起,给出一份能直接照着做的写作清单。

Continue reading

Agent Skills 落地指南:把“怎么干这活”写进文件夹

Posted on in Tech

上篇拆了 Anthropic 的上下文工程,结论是“渐进式披露、用到再取”。这篇讲官方把这条原则落成的具体东西——Agent Skills:一个技能就是一个文件夹,靠三级渐进式披露让 AI 按需加载,把确定性交给代码、聪明留给模型。文末用这个博客仓库里真实在用的 walter-blog-write 技能当解剖标本,外加一份能直接照着做的落地清单。

Continue reading

模型吃得越多,忘得越快:Anthropic 谈上下文工程

Posted on in AI

前几年大家都在琢磨怎么写 Prompt,Anthropic 这篇讲的是更上一层的东西——上下文工程。核心主张一句话:大模型的“注意力”是一笔有限预算,喂得越多,反而记得越差。这篇把他们的方法论拆开讲——System Prompt 该停在哪个“海拔”、工具怎么设计才省 Token、什么叫“用到再取”的按需检索,以及长任务的三件套:压缩、结构化笔记、子代理。

Continue reading

极简群聊:OpenResty + Redis,把语音也塞进 WebSocket

Posted on in Tech

想给一群人搭个能打字又能说话的群聊,最先想到的是 WebRTC 再加一台 SFU 转发服务器。可浏览器到今天都没给“把音频塞进 WebSocket”开个口子,OpenResty 也顶不住真正的媒体转发。这篇走另一条极简路线:干脆不做 WebRTC,把语音切成 20 毫秒一帧的音频,和文字走同一个 OpenResty 网关、各占一条 WebSocket 连接,再由 Redis Pub/Sub 广播——两个进程、一个端口,代价是放弃回声消除和弱网下的表现。附可运行的骨架代码,以及带宽、时延的估算账。

Continue reading

思维导图必须自己画:把被 AI 借走的脑子要回来

Posted on in Journal

最近用 AI 用得有点多,活儿照样交得出去,可心里那点"这事我真弄明白了"的踏实感,越来越薄。这篇想说清楚两件事:这种不安不是矫情,认知科学、哲学、心理学这些年正好也在吵这件事,吵出了些挺扎实的研究;以及我给自己定的几条规矩——思维导图必须自己画、每天留出不碰 AI 的时间、把纸笔拾起来、每天给 AI 挑刺——每一条背后都有能说清楚的理由。

Continue reading

GTD 配 Agent:流程图先焊死,LLM 只管节点里的判断

Posted on in Journal

翻出一张 2009 年用 FreeMind 画的 GTD 思维导图,方法论十七年没变,变的是终于可能有样东西能替我把它跑起来。但把整套方法论讲给 LLM 听、让它自由判断每条输入该怎么处理,大概率会乱。这篇把一张 GTD 工作流草图拆成判断、动作、调度三类节点,说清楚哪段该交给 LLM、哪段该交给 Tools/Skills、哪段根本不该用智能。

Continue reading

简单之美:Lua Table

Posted on in Tech

Lua 不区分数组、哈希、集合,只给了一个 table——这不是能力不够,是故意的。本文从 table 的两副面孔讲到元表(metatable),讲到用元表搭 OO,再讲到 LuaJIT 和 OpenResty 怎么给 table 加性能后门,最后落到 OpenResty 里真正跨进程的那张表:共享内存字典 ngx.shared.DICT。附带可以直接照抄的 cheat sheet。

Continue reading

Overhiring、Overqualified:中年技术人求职路上绕不开的两个词

Posted on in Journal

这半年听几个同龄朋友聊起求职,拒信理由翻来覆去就两条——"我们现在 overhiring,先缓缓"和"你 overqualified 了"。两条理由合在一起是个死循环:岗位说不缺人,你自己又被嫌"太够格"。拆开看,这两个词背后各有一句没说出口的潜台词;往大了看,是内需、AI、外企收缩叠在一起的大背景;落到个人,是过去吃饭的本事——写代码、写文档、全栈多语言——正从稀缺品变成大路货。这篇想说清楚这个死循环怎么破,以及我自己想通的三件事。

Continue reading

用 SIPp 给 FreeSWITCH 做测试:注册、呼入、呼出、桥接、会议

Posted on in Tech

给 FreeSWITCH 写功能是一回事,证明它在五百路并发下还注册得上、接得通、桥得稳,是另一回事。SIPp 就是干这个的——用一份 XML 脚本模拟成千上万个话机,把注册、呼入、呼出、桥接、会议这五类场景逐个压过去。这篇给出每类场景可直接改地址就能跑的脚本、命令行和对应的 FreeSWITCH 配置,以及几个新手必踩的坑:认证两段式、CSV 账号注入、带媒体的 INVITE 要放 PCAP、以及为什么 bridge 测试得起两个 SIPp。

Continue reading

蘑菇定律:把自己埋进土里的那段日子,才是养分

Posted on in Journal

三年换了两个公司、三个团队,照理说早该习惯了,可每回进新团队,还是问啥啥不知、做啥啥不会,心里那句“我是不是真不行了”总压不下去。蘑菇被养在黑暗里靠养分长根——职场的“蘑菇定律”说的就是这个蛰伏期:先把自己埋进土里,把旧的倒空,根扎稳了,才谈得上出土。

Continue reading

用罗伯特定理来驱除心魔

Posted on in Journal

职场里最让人累的不是加班,而是被自己的心魔拖垮:一次失败没站住,接二连三就没心情了。罗伯特定理把这层窗户纸捅破——没有人因倒下或沮丧而失败,只有一直倒下或一直消极才会失败。本文先讲清它的真实出处(卡维特·罗伯特其实是演说家,不是史学家),再拆解那些流传甚广却常被改写的“失败名言”,最后落到几个能立刻做的小动作。

Continue reading

AI 编程的奥卡姆剃刀原则

Posted on in Journal

AI 写代码不怕麻烦,这是它最大的优点;可麻烦不归它承受,这是它最大的毛病。奥卡姆剃刀说“如无必要,勿增实体”——放到 AI 编程里,要砍的不是代码行数,是你三年后要背的维护工作量。对 FreeSWITCH、OpenResty、OpenSIPS 这类后端服务尤其如此:前人把引擎和脚本层分开,就是替你划好了那条界线,宁可多写几行 XML/Lua/路由脚本,也别轻易让 AI 给你生一个新模块。文末附三段可直接复制的 Prompt:方案阶段数实体、代码阶段做减法、规则文件里常驻约束。

Continue reading

抖动缓冲:同一条网络轨迹下,三种策略谁更好?

Posted on in Tech

打电话时对方声音断断续续,是网络丢包;但还有一种更隐蔽的情况——包都到了,却因为到达时间不齐,播放端缺了当前该播的那一小段。抖动缓冲就是为这件事生的:网络里的包到达时间不规律,播放端却必须每 10ms 吐出一块音频。缓冲浅了会卡顿,深了又增加延迟。我把小固定、大固定和自适应三种策略放在同一条网络轨迹、同一段真人语音下跑了对比实验,用数据说话:没有哪种永远最好,自适应是在延迟与连续之间动态找平衡——它多半比小固定稳、比大固定快,但真遇到突然的抖动峰值,它照样会卡那么一下。整套实验我开源成了一个小项目 ajb-demo,代码在 GitHub 上,读者可以拉下来自己跑、自己听、自己调参数验证——让数据替你选该用哪种策略。

Continue reading

如何避免代码里的霰弹式修改

Posted on in Tech

一个业务规则改一下,却要同时动十几个文件,还经常漏改一两处,导致同一条规则在系统不同地方表现不一致——这就是霰弹式修改(Shotgun Surgery)。这篇讲清楚它的现象、根因和治理办法:根因不是代码写得多,而是一个概念的知识被复制到了很多地方;治理的目标不是"代码只出现一次",而是"一个变化原因只有一个主要修改点"。文中给出判断标准(因为同一个业务原因而变化才抽象)、Change Map 排查法、从 N→1 的重构路径、测试保护步骤,以及一份能照着念的 Code Review 五问。最后单独讲当霰弹跨越多个服务、多个仓库时该怎么办——你失去了"一次改完"的能力,治理思路要从"收成一个修改点"转成"建一个权威来源 + 兼容地滚动"。对后端和通信系统工程师尤其适用:很多霰弹式修改,本质是领域逻辑泄漏到了 Handler 和 Adapter 层。

Continue reading

Start small, stay curious

Posted on in Journal

岁数渐长没关系,别丢掉好奇心和尝试的勇气。从乔布斯的“Stay hungry. Stay foolish.”说起,从大处着眼,从小处着手,不贪大求全,日拱一卒。

Continue reading