从 SDD、TDD、MDD 到 HDD:AI 编程的质量不靠 prompt,靠护具

Posted on 四 15 10月 2026 in Tech • Tagged with journal, AI, HDD, harness-engineering, TDD, MDD, SDD, methodology, testing, coding-agent

AI 写代码的速度早就超过了你 review 的速度,质量不能再押在提示词和人眼上。本文顺着 SDD、TDD、MDD 到 HDD(Harness-Driven Development,护具驱动开发)这条方法论的主线,讲清楚一件事:把规格、测试、度量打包成一个会自我进化的执行环境,让 agent 每犯一次错,环境就长出一条新规则。另附业界已经趟过的六条实践(含属性测试、变异测试、契约测试、混沌工程的工具链接)、按设计/架构/运维分的三类常见陷阱,以及标准、论文、工具的完整参考清单。


Continue reading

让 Codex 和 Cursor 读写你的知识库:用 FastMCP 搓一个本地 MCP Server

Posted on 二 13 10月 2026 in Tech • Tagged with journal, AI, MCP, FastMCP, knowledge-base, Sphinx, MyST, agent, code-analysis

知识库建好只是第一步,下一步是让 Codex、Cursor 这些 agent 能搜、能读、还能安全地写。我的做法是别把仓库钥匙整个塞给 agent,给它开个柜台:用 FastMCP 写一个一百多行的本地 MCP server,把 Sphinx + MyST + Mermaid 的 Markdown 知识库包成五个工具——目录、搜索、读、写、代码图查询。路径白名单、frontmatter 校验、原子写入、审计流水全在柜台上,写操作不提供删除。再把 graphify 和 Understand-Anything 的代码知识图谱挂上来,让 agent 查图而不是 grep。代码和输出都在 FastMCP 4.1.0 上逐工具验证过,可以整段抄走。


Continue reading

Web Proxy 这道关:应用怎么知道自己该走代理

Posted on 二 13 10月 2026 in Tech • Tagged with tech, proxy, network, security, tls, webrtc, turn, http

企业里的 Web Proxy 不是可有可无的中转,而是把安全策略和网络出口收口的那道关——应用“无感知”地被代理,恰恰是设计目标。真正的坑在于:Windows/macOS 上的应用到底怎么发现自己该走代理?这篇讲清 WPAD/PAC、环境变量、系统设置这三条发现路径,CONNECT 隧道为什么挡不住 TLS,代理该部署在哪、有哪些开源方案,为什么信令可以走代理而实时媒体走 HTTP 代理是反模式,以及当安全策略把媒体逼上 443 时,TURN over TLS 怎么工作、还有哪些从 443 传媒体的方案。


Continue reading

给 FreeSWITCH 这种大服务生成 ASan 报告:内存踩坑的照妖镜

Posted on 二 13 10月 2026 in Tech • Tagged with tech, c, c++, asan, addresssanitizer, freeswitch, memory, debug

C/C++ 服务线上偶发崩溃、跑几天内存涨上去、core dump 栈全是问号——这类内存问题最磨人,因为它"现在不报,等你忘了才报"。AddressSanitizer(ASan)是把这类 bug 从"偶发玄学"变成"当场报错并打出调用栈"的照妖镜:编译时加一个 flag,运行时越界、use-after-free、double-free、泄漏当场抛报告。这篇用 FreeSWITCH 这种大型 C 服务做例子,从加编译参数、跑出报告、到读懂报告,给一套能直接照抄的流程,也讲清楚它为什么不能带着上生产。


Continue reading

集群状态为什么该交给 etcd:用 Raft 从根上消除脑裂

Posted on 一 12 10月 2026 in Tech • Tagged with tech, etcd, raft, split-brain, network-partition, consensus, leader-election, distributed-lock, high-availability, architecture

很多团队用 Redis 或 MySQL 存"谁是主、锁在谁手上"这类集群状态,网络一分区就两边各自称主,出现脑裂。根因不是代码写得烂,是这两种库的复制模型本就不保证"分区的少数派会主动退位"。etcd 底层是 Raft,用多数派(quorum)把这件事写进了协议:拿不到多数派票就当不了主、提交不了写,少数派自动失效。这篇讲清楚问题、根因和解法——etcd 的拓扑怎么摆、选主/锁/配置下发怎么用、生产上的最佳实践,以及一串真能让你半夜被叫起来的坑。


Continue reading

从容灾到异地双活:数据层怎么选,以 Redis 为例细讲

Posted on 日 11 10月 2026 in Tech • Tagged with tech, redis, valkey, newsql, tidb, etcd, cassandra, mysql, architecture, high-availability, disaster-recovery, cap

很多人一上来就问"异地双活用什么库",顺序反了。先得想清楚容灾要做到什么程度(RTO/RPO),再决定要不要双活、双活怎么分层,最后才落到数据层选型。这篇按这个顺序走一遍:先讲容灾的两把尺子和五档常用做法,再讲双活为什么只是其中一档、难在分层,最后以 Redis 为例把数据层选型讲透——拓扑、故障切换、双向复制、Valkey 差异,一样不落。


Continue reading

再论 CAP:会议和实时通信为什么要选 AP,以及最终一致性怎么落地

Posted on 六 10 10月 2026 in Tech • Tagged with tech, distributed-system, cap, consistency, availability, webrtc, rtc, freeswitch, architecture

网络会出的岔子一长串——分区、脑裂、闪断、非对称路由、DNS 故障、丢包、抖动、拥塞、时钟漂移——它们全归结为 CAP 里那个躲不掉的 P,所以真正的选择题只在 C 和 A 之间。网络交易选 C,音视频会议和实时通信选 A。本文先按类把网络问题列全,再结合我最近踩的几次坑,重点讲 AP + 最终一致性在实时通信里怎么落地:媒体面为什么天生 AP、信令面的冲突怎么和解、以及什么东西绝对不能最终一致。


Continue reading

用 FreeSWITCH + MySQL 构建异地双活的音视频服务

Posted on 六 10 10月 2026 in Tech • Tagged with tech, freeswitch, mysql, voip, sip, webrtc, architecture, high-availability

很多人以为异地双活的音视频服务,难在 FreeSWITCH 怎么集群。其实 FreeSWITCH 这层信令早有成熟的无状态做法,真正的坑在两处:一是跨机房的 MySQL 怎么同时写不打架,二是活跃通话的会话和媒体流钉死在单机房、切不过去。这篇讲清这三层各自的一致性模型,为什么信令可以 AP、计费必须 CP、媒体只能就近锚定,以及一套能落地的分层方案。


Continue reading

2025 DORA 报告解读:AI 不是团队的替代品,而是组织系统的放大器

Posted on 二 06 10月 2026 in Tech • Tagged with DORA, DevOps, AI, engineering-productivity, software-engineering, SDLC, architecture

2025 年的 DORA 报告给所有狂热押注 AI 编码工具的管理者和工程师泼了一盆清醒的冷水:AI 不是团队能力的替代品,而是组织系统的放大器。成熟的工程团队借它跑得更快更稳,而流程混乱、测试匮乏、架构腐化的团队,只会被 AI 加速推向事故与返工的深渊。本文拆解 2025 DORA 报告的核心洞察:AI 改变了什么、为什么它会同时推高吞吐量与稳定性风险、企业必须具备的七项基础能力、内部上下文的关键价值,并给出一套可在团队落地的七步实操框架。


Continue reading

领域知识库:用 DDD 的思路,让人和各种 AI 工具都能读写

Posted on 一 05 10月 2026 in Tech • Tagged with journal, knowledge-base, DDD, architecture, AI, agent, MCP, documentation, governance

单个项目的知识库用 Sphinx + MyST + Mermaid 不难建,难的是一个软件业务由七八个仓库拼起来之后,那些横跨仓库的知识落进了缝里。这其实是个老问题——Eric Evans 在 2003 年就用 DDD 回答过:限界上下文、统一语言、上下文映射。本文把 DDD 的这三件武器搬到知识库上,给出一个联邦式结构(事实源在各仓库,领域层只写三类文件,索引层可重建),再详细讲人和不同 AI 工具(Cursor、Codex、Claude Code)如何通过"写-管-读"闭环共同维护它,以及 MCP 怎么做统一出口。附四类原料的处理法、业界产品对照、按链路落地的顺序、治理清单,和一份带链接的参考文献。


Continue reading

把 C/C++ 服务装进集装箱:用 Docker 构建、运行、分发

Posted on 日 04 10月 2026 in Tech • Tagged with tech, docker, c++, cmake, multi-stage, distroless, devops

C/C++ 最头疼的从来不是写代码,是交付——一个二进制换台机器就跑不起来,缺了某个 .so、glibc 版本对不上、编译器一升级全乱套。这篇讲怎么用 Docker 把这事根治:build 阶段锁死编译环境,run 阶段用 multi-stage 把几 GB 的构建镜像瘦成几十 MB 的运行镜像,distribute 阶段一条 docker push 把带所有依赖的服务发出去。配一个用 CMake + cpp-httplib 写的小 HTTP 服务做完整示例,顺带说清 static 链接、distroless、DNS 这些真会咬人的坑。


Continue reading

DNS,有多少问题因你而起

Posted on 六 03 10月 2026 in Tech • Tagged with journal, dns, sre, reliability, rfc

从 AWS、Facebook、Dyn 三次事故看 DNS 如何成为故障入口或放大器;结合 RFC 2308 / 8767 / 9520,讲清 libcurl 的缓存、handle 复用、旧 IP 兜底,并给出可运行的 C 示例。


Continue reading

引擎归 C++,玩法归 Lua:一个打砖块游戏的分层写法

Posted on 五 02 10月 2026 in Tech • Tagged with tech, lua, cpp, sdl, sol2, game, gamedev

想改一下小球的速度,却要等三分钟重新编译整个 C++ 工程——这是自己拿 C++ 写游戏时最劝退的一件事。这篇借一个真实的 SDL 打砖块项目(eliasdaler/sdl_breakout)讲清楚一种分层写法:C++ 只当"引擎",负责窗口、渲染、音频、输入这些慢变的底层;游戏玩法整个搬到 Lua,改了存盘就生效。文章拆解 sol2 怎么把 C++ 的类和函数暴露给 Lua、GC 怎么接管 SDL 资源,最后附上我把它移植到 macOS 时踩的三个坑和改法。代码引用来自该项目 master 分支,移植改动在 macOS + Apple clang 上实测。


Continue reading

让 Lua 插上翅膀:C 与 Lua 是怎么绑在一起的

Posted on 四 01 10月 2026 in Tech • Tagged with tech, lua, c, ffi, swig, freeswitch, openresty, luajit

Lua 自己什么都不会——不会发网络请求,不会读数据库,连打开一个文件都得靠宿主给的库。它小得可怜,却长在魔兽世界、Nginx、Redis、FreeSWITCH 这些庞然大物里,靠的就是一件事:跟 C 无缝对接,借用整个 C/C++ 生态。这篇讲清楚 C 和 Lua 到底是怎么绑在一起的——从那个来回倒数据的栈,到注册 C 函数、包装 C 对象,再落到两种真实风格:FreeSWITCH 用 SWIG 预生成胶水,OpenResty 用 LuaJIT FFI 干脆不写胶水。代码引用来自 FreeSWITCH master 分支与 LuaJIT 官方文档。


Continue reading

用 AI 跑通软件研发全流程:PDCA 里的体力活外包指南

Posted on 三 30 9月 2026 in Tech • Tagged with ai, sdlc, pdca, engineering, methodology

AI 不是来替代工程师的,它是来接管每个研发阶段里最耗体力的那部分。本文用 Replit 删库事故、DORA 2024(稳定性 -7.2%)、GitClear(churn +39%)、METR(慢 19% 却以为快 20%)这些可核实的数据和案例,把 SDLC 拆成 PDCA 四段,逐段给出能抄的护栏、提示词和"能外包/不能外包"分工,外加一张总 checklist 和数据来源。


Continue reading

AI 语音客服的两道生死坎:延迟和可信度

Posted on 三 30 9月 2026 in Tech • Tagged with tech, llm, voice-agent, latency, rag, freeswitch, contact-center, asr, tts

AI 语音客服 demo 能跑,离敢上生产还隔着两道坎。一是延迟:用户对电话里的沉默极其敏感,超过一秒就觉得"卡了",得盯"首响应"而不是"总时长",靠流式和流水线把它压进一秒。二是可信度:LLM 会用完全自信的语气编造一个不存在的优惠、报错一个余额数字,在客服场景就是事故,得靠 RAG、工具调用、护栏这五道防线给它套缰绳。而且这两件事经常打架,工程上只有按场景权衡,没有免费的午餐。


Continue reading

Understand Anything:给陌生代码库画一张能走的地图

Posted on 三 30 9月 2026 in Tech • Tagged with tech, AI, code-reading, knowledge-graph, Understand-Anything

接手陌生代码库,难的往往不是看不懂某个函数,而是不知道该先看哪里。Understand Anything 把文件、函数、类和依赖关系做成可探索的图,再用导览、搜索和问答帮你找入口。它适合当代码阅读的地图,但图上的解释仍要回到源码核对。


Continue reading

用 Lua 写 Dialplan 接 LLM:从零搓一个 AI 智能客服

Posted on 二 29 9月 2026 in Tech • Tagged with tech, freeswitch, lua, unimrcp, mrcp, llm, asr, tts, contact-center, voip

FreeSWITCH + UniMRCP + LLM 的分工和架构有了,落到代码,XML dialplan 表达不了"调 HTTP、维护多轮上下文、按 LLM 结果分支"这种逻辑,得用 Lua。这里有一份能读懂的完整 voice_agent.lua 骨架——从接通、放欢迎语、开麦识别、调 LLM 网关、合成回复,到打断、超时、转人工、挂断的完整对话循环,关键处标清楚哪里要按你的环境改。顺带说清 mod_unimrcp 的 speak / play_and_detect_speech 怎么用,以及为什么 LLM 场景要用自由识别而不是固定语法。


Continue reading

给电话装个"会聊天的大脑":FreeSWITCH + UniMRCP + LLM 的语音智能体

Posted on 一 28 9月 2026 in Tech • Tagged with tech, freeswitch, unimrcp, mrcp, llm, asr, tts, contact-center, voip, rtc

MRCP 给通话加上了"听懂"和"会说"。再往下走一步:在 contact center 里,FreeSWITCH 管呼叫、UniMRCP 管 ASR/TTS,本来已经能做语音 IVR;但真正让它"活"起来的,是中间插进来的 LLM。传统 IVR 靠固定语法只能听懂预设的几句话,LLM 能听懂客户随口说的任何一句,还能带着上下文对答、调用工具查真实数据。三者怎么分工、一次对话在时序上怎么流转、延迟和打断这些工程难点怎么处理,连同一份能照着做的落地清单,都在这儿。


Continue reading

MRCP 协议入门:让 SIP 呼叫用上语音识别与合成的那根控制通道

Posted on 日 27 9月 2026 in Tech • Tagged with tech, mrcp, sip, asr, tts, voip, rtc, telephony

前面几篇讲 FreeSWITCH、OpenSIPS 都是在讲"怎么接通一路电话"。往上走一层:电话接通之后,想让机器听懂人说话(ASR)、让机器开口说话(TTS),媒体流已经在 RTP 上跑了,可谁来告诉引擎"现在开始识别""用这个语法""合成这段 SSML"?这就是 MRCP 干的活。它是什么、v1 和 v2 差在哪、一次识别在协议上到底怎么流转、UniMRCP 是怎么落地的、有哪些典型场景和踩坑点,这里一并说清。


Continue reading