Redowan Reflections

RSS: https://rednafi.com/index.xml
Redowan Delowar 的软件工程博客,关于平台工程、分布式系统与实用工程实践。

我们为什么还要听那些没有切身利益的人说话?

<figure><img src="https://blob.rednafi.com/zephyr/no-skin-in-the-game/megaphone-b0b0c559cf0b.jpg" alt="A gray megaphone mounted high on a wall"> </figure><p>我说的是.以下是我认为正确的几句话:</p><ul> <li>如果你不是亲自操作,你的.</li> <li>有影响力并不意味着你一定正确。</li> <li>谈论编码和在真实限制下交付软件是两码事。</li> <li>点击节目视频前,检查创作者的资质信息也无妨。</li> </ul><p>然而,我们却总是听有影响力的人说话,却很少.假设你那个极度依赖AI的主管花了一个下午玩大型语言模型,做了几个带提示的无聊应用,然后坚信软件工程已经解决了。<br><br>现在他们要求生产力提升十倍,却不听组织摩擦或不可避免的交付延迟。所有功能昨天就需要,你们这些菜鸟却落后了。用AI碾压一切吧。</p><p>对于那些不日常开发软件的人来说,很容易爱上大型语言模型。我用它们很多,但我也比那些一次性完成待办事项或自动化几个重复任务的人更常遇到它们的局限性。</p><p>我不假装懂得如何管理一个庞大的组织。所以我不喜欢那些日复一日不做实质性工作的人告诉我软件应该怎么写,或者声称它已经被解决了。<br><br>如果你以写软件为生,你仍然得听经理或主管告诉你怎么做,否则你想失去这份工作。这并不意味着他们是对的,而相信他们是对的,可能会伤害你的心理。</p><p>要说对,你需要亲自行动,当那个被氛围影响的软件凌晨3点崩溃时,你得拿起寻呼机。</p><hr><p>另一类是软件影响者。他们中有些人喜欢一概而论地说:</p><ul> <li>一切都应该用Rust重写</li> <li>我绝不会用像Go这样的GC语言</li> <li>TypeScript 应该在这时候就死了</li> <li>只有婴儿潮一代才写C#</li> <li>Kotlin是Temu的爪哇语…</li></ul>
评论点赞收藏11 天前

Pi harness 的"低效"哲学:为什么小而透明的编码工具更可靠

<figure><img src="https://blob.rednafi.com/misc/pi-harness/cover-62823da84914.png" alt="Pi running in Ghostty with a read tool call"> </figure><p>几个月前,Pi的创作者Mario Zechner做了一场关于.它让我非常有共鸣,所以我想试试这个背带。我也越来越担心Claude Code和Codex随着时间推移变得臃肿。</p><p>我完全不知道这些工具调用在系统提示中输入了什么,或者这对模型的响应有什么影响。我也不知道它们的工具调用是怎么运作的,或者它们在搜索时用什么搜索引擎。<br><br>这种不透明的特性,加上它们时不时对系统指令做出的大幅修改,使得构建可靠的工作流程变得困难。模型本身就足够非确定性。我真的不想让我的工具再增加这些。</p><p>Pi 是一个用 TypeScript 编写的小型编码工具。默认情况下,它为模型提供了四个工具:<code>read</code>,<code>write</code>,<code>edit</code>, 和<code>bash</code>.表面上,这对大多数编码工作来说就足够了。<br><br>核心足够小,你可以一次性读完重要部分。仓库里有更多包,但这是四个显著的包,读起来相当愉快:</p><pre><code>packages/ |-- ai/ # model APIs, streaming, and token usage |-- agent/ # agent loop and tool execution |-- tui/ # terminal rendering and keyboard input `-- coding-agent/ # CLI, sessions, and exten…</code></pre>
评论点赞收藏25 天前

以 Postgres 为参照,对比数据库隔离级别

用 Postgres 的隔离级别作为参照系,评估其他数据库的事务保证。 面试和实际选型时,把 MongoDB、DynamoDB、Cassandra 等数据库的快照语义和冲突处理与 Postgres 的 Read Committed、Repeatable Read、Serializable 对比,找到最接近的等价级别并说明差异。 ClickHouse 等分析型数据库即使支持 MVCC,语句级快照也更接近 Read Committed 而非 Repeatable Read。
评论点赞收藏42 天前

回归PostgreSQL隔离级别

<figure><img src="https://github.com/user-attachments/assets/03a57125-5959-48cd-9f84-7f372220fb35" alt="PostgreSQL transaction isolation levels"> </figure><p>多年来,我参加过几次系统设计面试。有些顺利,有些则不然。有一件事一直很稳定:当我设计一个事务隔离几乎总是在讨论中被提及。</p><p>当需求要求时我通常选择兼容PostgreSQL的NewSQL数据库,比如Aurora PostgreSQL、DSQL或CockroachDB。作为关系型数据库,旨在实现类似NoSQL的扩展,同时保留SQL和ACID事务。</p><p>部分原因是我喜欢用Postgres思考。还有常见的面试手法,系统从一个小规模开始,面试官为了好玩把它放大100倍。使用无共享的Postgres,我可能突然需要手动分片或换个数据库。<br><br>无论哪种选择,都可能改变交易边界,迫使进行重大重新设计。NewSQL 让我可以保留关系模型和分布式事务,覆盖更广泛的规模。</p><p>这仍然留下孤立性的问题。我用Postgres作为参考模型。如果 MongoDB、DynamoDB、Cassandra 或其他数据库更适合这个问题,我会把它的保证和 Postgres 的<em></em>,<em></em>, 和<em></em>隔离层。<br><br>然后我可以描述最接近的Postgres对应词,并解释它们的区别。</p><p>我在面试之外也采用同样的方法。当我遇到不熟悉的 OLTP 或 SQL OLAP 数据库时,我会将其快照语义和冲突处理与 Postgres 进行比较,然后才信任隔离级别的名…</p>
评论点赞收藏42 天前

Go 旗标包提案获批准:支持遍历所有命令行标志的状态

Go 的 flag 包提案于 2026 年 7 月 23 日获批,解决命令行标志、环境变量与默认值优先级冲突时的状态区分问题。当前 Parse 后无法分辨 -debug=false 是用户显式设置还是省略导致的默认 false,需结合 Visit 和 VisitAll 两轮遍历才能正确应用环境变量。 新提案将 set 状态挂载到每个 Flag 对象并提供全量迭代器,使单轮遍历即可判断标志是否被显式设定,简化环境覆盖逻辑并减少错误传播风险。
评论点赞收藏62 天前

Go 接受提案:示例函数可使用任意签名

Go 官方接受提案,允许示例函数拥有任意签名。此前 ExampleXxx 必须无参无返回值才能被 go/doc 收录并显示在 上,新规则支持带参数或返回值的示例函数,如 ExampleTest(t testing.T) 和 ExampleCreateTemp error,但此类示例仅用于文档展示,无法作为可运行测试或 Playground 执行。
评论点赞收藏64 天前

Go 语言中有监督的“发后不管”异步任务管理

Go 中常见的 go func 异步任务存在上下文被取消、panic 导致进程崩溃、无法优雅关闭等隐患。作者提出使用基于缓冲 channel 的小型 worker pool 来管理这些“尽力而为”的任务,实现有监督的 fire-and-forget 模式,避免资源泄漏和不可控风险。
评论点赞收藏67 天前

Go 泛型中的 GC 形状模板化机制解析

深入解析 Go 泛型编译器采用的 GC shape stenciling 机制,对比全单态化与类型擦除的优劣。文章通过 Rust 和 Java 的代码示例,直观展示了 Go 如何根据类型的 GC 形状(大小、对齐、指针部分)合并编译单元,从而在二进制体积和运行时性能间取得平衡。 附带具体的 nm 符号表分析,揭示了字典(dictionary)在共享代码体中的运行时作用,适合想了解 Go 底层实现原理的开发者。
评论点赞收藏80 天前

Go 1.26 重构 go fix:自动化代码现代化与版本兼容

Go 1.26 重构了 go fix 工具,基于新的分析框架自动现代化代码,同时尊重模块声明的 Go 版本。文章梳理了 modernizers 的功能边界及 x/tools 套件的整体更新,适合需要批量升级或迁移旧代码的开发者参考。
评论点赞收藏88 天前

利用 Go singleflight 实现请求合并以缓解缓存击穿

针对缓存击穿导致数据库过载的经典场景,详解 Go singleflight 包如何实现请求合并。文章不仅提供接入方案,还包含如何验证其生效以及为何单 Pod 级别合并通常已足够的工程判断,具有极强的实战参考价值。
评论点赞收藏95 天前

Channel iteration and goroutine leak

A for-range over a channel that's never closed leaks the receiver. Why a fixed number of receives is safe, why a range isn't, and how to catch it with Go 1.27's leak profile.
评论点赞收藏101 天前

从 GNU Stow 迁移至 Chezmoi:一种更稳健的 Dotfiles 管理方案

作者分享从 GNU Stow 迁移到 Chezmoi 管理 Dotfiles 的实践。Stow 基于软链接,在多设备同步时容易因直接写入导致仓库冲突,且新机器初始化繁琐。 Chezmoi 采用“源目录”模式,将配置复制而非链接,避免了自动同步带来的脏数据问题。文章详细介绍了 Chezmoi 的核心机制,包括文件命名规范、模板支持、自动化脚本执行时机(如 Brewfile 变更检测),以及日常编辑和更新的工作流。 此外,还展示了如何利用该工具统一配置 AI Agent(如 Claude Code 和 Codex)的技能文件,解决了不同工具路径不一致的问题。内容包含大量具体的命令示例和工程细节,对关注开发环境自动化和配置管理的读者有较高参考价值。
评论点赞收藏103 天前

Go 标准库新增 goroutine 泄漏检测方案:复用 GC 机制

Go 标准库正式接受了一个新的 goroutine 泄漏检测方案。该方案的核心创新在于复用现有的垃圾回收机制来识别和定位泄漏,而非引入全新的独立追踪系统。 这对 Go 开发者排查并发问题是一个重要的工具升级。
评论点赞收藏104 天前

Postgres 19 新特性:用 WAIT FOR LSN 实现读取自身写入

介绍 PostgreSQL 19 引入的新命令 WAIT FOR LSN,用于解决副本读取自身写入数据时的延迟问题。该命令允许副本阻塞直到回放完特定的写入日志。 文章详细解释了其解决的读后写一致性难题、替代的传统变通方案,以及 timeout、status 和 mode 等具体选项的实际用途。对数据库内核爱好者和高并发架构师具有高价值。
评论点赞收藏109 天前

用 standard.site 将博客部署到 ATProto

作者分享了利用 和 Sequoia 工具,将基于 Hugo 构建的静态博客自动镜像到 ATProto 协议的技术实践。通过配置 GitHub Actions,实现了在每次代码推送时无需人工干预即可自动同步记录,展示了去中心化社交网络与现有静态网站工作流的集成方法。
评论点赞收藏115 天前

如果不愿承担值班责任,或许不该提交主干代码

作者提出了一个强烈的工程文化观点:如果你不愿意承担生产环境的On-call责任(接电话),就不应该直接向主干分支(mainline)提交代码。 文章批评了那些只提代码不改Bug的“驱动式AI变更”,认为这会破坏团队对代码的共同责任感。这是一个极具争议性和讨论价值的观点,非常适合HN风格的读者进行辩论。
评论点赞收藏123 天前

使用testscript测试Go命令行工具

介绍了一个名为testscript的Go测试库,它源自cmd/go内部的脚本测试机制。文章详细说明了如何使用该库来测试命令行接口(CLI),包括验证参数解析、标准输出/错误、退出码以及临时文件操作。 对于需要编写高质量CLI工具的Go开发者来说,这是一个非常实用且具体的技术指南。
评论点赞收藏135 天前

txtar格式漫游指南

介绍了Russ Cox在2018年提出的txtar格式,这是一种用于存储多文件测试用例的纯文本归档格式。文章列举了Go Playground、cmd/go脚本测试、gopls标记测试等知名项目都在使用它。 虽然内容偏向于工具介绍,但对于理解Go生态系统内部测试基础设施的设计思路很有帮助,适合喜欢深挖底层工具链的开发者。
评论点赞收藏143 天前

Go 语言中的类型安全日志记录实践

针对 Go 语言 slog 包默认宽松导致的潜在生产环境 JSON 错误问题,提出了严格的类型安全解决方案。通过 Attr 构造函数、LogAttrs 和上下文感知日志器等手段,结合 sloglint 工具规范代码。 内容极具工程实战价值,直击开发者痛点,适合 Go 工程师深入阅读和实践。
评论点赞收藏144 天前

将Go处理器中的网络协议适配逻辑抽离

文章指出在Go语言的RPC处理器中,大部分代码其实是在做协议适配(wire plumbing)。作者建议将这些重复的适配逻辑提取出来,使用泛型适配器来简化Unary RPC处理器的实现,从而让核心业务逻辑更清晰。 这是一个典型的工程重构技巧,适合对Go泛型和RPC架构感兴趣的开发者。
评论点赞收藏151 天前

Go 语言陷阱:闭包捕获可变引用详解

深入剖析 Go 语言中闭包捕获可变引用的机制:闭包持有的是变量的实时引用而非快照。通过实际代码示例展示了这一特性如何导致常见的逻辑陷阱,并提供了保持代码行为可预测的解决方案。 属于典型的 Go 语言底层机制踩坑指南,适合中级 Go 开发者阅读。
评论点赞收藏158 天前

Go 标准库正式纳入 UUID 提案解析

解读 Go 语言标准库正式接纳 UUID 提案的背景与细节。文章分析了 API 设计背后的权衡取舍,包括为何选择当前的接口形式以及可能带来的兼容性影响。 这是 Go 生态的一个标志性变化,对日常使用 UUID 的 Go 开发者有直接的信息增量。
评论点赞收藏164 天前

登录芦苇

登录后关注作者、收藏内容和参与讨论。