Loop Engineering 实践:我把 RDMA 开发库移植到 Go 语言,花费 239 块钱
作者为了在Go语言中实现高性能RDMA库,采用Loop Engineering方法进行自动化移植实验。Loop Engineering的核心是将复杂任务拆分为可管理的小单元,在循环中逐步执行实现、审查和发布。实验从一份PRD出发,生成15个依赖issue,通过AI Agent自动化处理,覆盖设备枚举、PD/MR分配、QP创建、TCP握手和perftest工具构建。AI在macOS上生成代码,使用stub实现确保跨平台编译。但流水线中审查步骤未真正执行,导致cgo与rdma-core库的兼容性问题未被及时发现。真机在Linux服务器编译时,暴露imm_data访问错误和ibv_query_port类型不匹配等致命bug,此外还有内存屏障缺失、资源泄漏等运行时问题。修复阶段通过静态分析工具和真机测试逐步解决,包括编写C辅助函数、调整unsafe.Pointer用法和引入原子操作。最终项目包含3981行Go代码和16个PR,花费239元。文章展示了Loop Engineering在结构化任务中的效率,同时强调了人工审查和硬件环境验证的必要性,对后端系统开发有实践参考价值。
傻瓜式RDMA高性能网络开发:从零跑到 400 Gb每秒
RDMA(远程直接内存访问)是一种高性能网络技术,通过内核旁路、零拷贝和CPU卸载机制,使网卡能直接读写远程内存,实现微秒级延迟和数百Gb/s吞吐,广泛应用于AI训练、分布式存储等领域。但其编程复杂,涉及队列对(QP)、完成队列(CQ)、内存区域(MR)等术语,标准流程繁琐易错。本文介绍了gordma,一个用Go语言封装的RDMA库,提供两套API:高级API类似标准net包,简化开发;底层API直接映射RDMA原语,允许精细控制。在400Gb/s RoCE v2网卡实测中,gordma高级API吞吐达28Gb/s,底层API达232Gb/s,原生基准为392Gb/s。文章详解了RDMA核心概念,包括历史发展、术语速记、传输类型,并演示了使用perftest工具进行基准测试,讨论了单位换算和环境因素影响。gordma为Go开发者提供了从零开始RDMA开发的路径,平衡易用性与性能,适用于高性能计算场景。
amd64 微架构级别对 Go 程序性能提升多少?
文章探讨了Go 1.18引入的AMD64微架构级别(v1至v4)对程序性能的影响。通过设置GOAMD64环境变量,开发者可以选择目标指令集级别:v1为默认基线,v2添加popcnt等指令,v3支持AVX2,v4包括AVX-512。作者以Roaring Bitmaps压缩位集库为例进行基准测试,该库依赖种群计数和位操作。测试在Intel Xeon Gold 6548N处理器上使用Go 1.26.2完成。结果显示,v2级别启用popcnt指令后,位图容器的种群计数操作耗时减少约43%,而v1级别因使用软件回退实现而性能较低。v3级别通过AVX2向量化进一步优化,例如从密集位图构建容器时性能提升38%,集合操作减少22%。v4级别未带来改善,因为Go编译器尚未生成AVX-512指令。文章指出,现代硬件应至少使用v2级别以免费获得性能增益,v3值得探索,但v4当前无效。结论强调编译器标志对性能的关键作用,并揭示了Go编译器在利用新指令方面的局限,为开发者提供了实际调优指导。
Go 实验特性详解
Go语言在版本发布中引入实验性特性,旨在通过用户反馈优化后正式集成。这些特性可能表现为标准库新包、编译器运行时改动或行为变更。例如,Go 1.24的testing/synctest包在反馈后调整API并进入通用可用阶段;Go 1.25的新垃圾回收器设计提升性能,在Go 1.26成为默认选项;Go 1.21的循环变量语义变更消除了历史bug,作为实验发布以测试兼容性。实验特性生命周期多样:通常默认关闭,需通过GOEXPERIMENT环境变量选择加入;若反馈积极,经过版本迭代可能变为默认开启。部分特性如内存arena因负面反馈而搁置,Go 1.22的编译器内联逻辑持续评估。永久实验特性如FieldTrack结构体字段追踪和StaticLockRanking死锁诊断工具则长期存在但无意默认启用。截至Go 1.26,当前实验特性包括JSONv2改进JSON处理、RuntimeSecret清零内存、SIMD访问架构特定操作等。控制实验特性通过GOEXPERIMENT实现:启用时设置逗号分隔小写名称,禁用则添加no前缀,如GOEXPERIMENT=jsonv2,nogreenteagc。开发者应关注GreenTeaGC新垃圾回收器和Dwarf5调试信息生成等特性,它们默认开启但保留临时退出选项。理解这些机制有助于Go开发者利用语言演进,平衡创新与稳定性。
LLM 究竟是如何工作的?
本文系统解析大型语言模型(LLM)的工作原理,聚焦于transformer架构的核心机制。文本首先通过tokenization转换为整数序列,采用子词分词平衡效率与泛化能力。嵌入层将token ID映射为向量,通过训练学习语义关系,如“king”与“queen”的向量接近。位置编码(如Rotary Position Embeddings,RoPE)通过旋转Query和Key向量注入序列顺序信息,解决词序依赖并提升长上下文泛化。attention机制是关键,每个token生成Query、Key、Value向量,通过缩放点积计算相似度,softmax加权聚合信息,并利用因果掩码确保生成顺序。多头注意力并行运行多个attention头,学习语法、语义等多种关系模式,Grouped-Query Attention(GQA)优化内存使用。前馈网络独立处理每个token,通过扩展、非线性变换(如SwiGLU)和压缩存储事实知识,Mixture of Experts(MoE)扩展参数规模而不倍增计算成本。残差连接和层归一化促进梯度流动,使深层堆叠可训练。文章还提及KV缓存等优化,避免复杂数学,提供入门指南,帮助读者理解LLM内部组件及其训练与推理差异。
Go之禅 - 基于Rob Pike思想的Go语言哲学
本文系统阐述了 Rob Pike 思想下 Go 语言的核心设计哲学,其精神可凝练为对简单、清晰与组合的极致追求。哲学强调代码应直接解决问题,拒绝过度聪明的炫技,优先保障可读性。在架构上,Go 抛弃了传统的类继承,转而采用更灵活的接口和结构体嵌入来实现组合。对于接口,推崇小而专注的设计,主张通过实际使用来发现接口,避免预先设计庞大复杂的契约。并发模型是其另一大支柱,明确区分了并发(结构)与并行(执行),并通过“通过通信共享内存”的 channel 机制,为安全高效的并发提供了原生支持,避免了昂贵的互斥锁开销。错误处理上,Go 将错误作为一等值进行显式返回与处理,而非依赖异常机制,这使得程序的控制流和异常路径更加清晰可见。此外,哲学还包括拥抱 gofmt 实现的强制代码风格统一、在简单重复与引入复杂依赖间做出务实权衡、聚焦于优化算法与选择恰当数据结构等实践准则。总体而言,Go 之禅体现了一种实用主义语言设计观,它不追求语言特性的繁复,而是致力于提供一套简洁有效的工具组合,以帮助开发者写出可靠、高效且易于维护的系统。
一行代码使用 Claude Skill 和 deepseek
goskills 是一个命令行工具,旨在解决 Claude Skills 只能在其原生环境中使用的问题,允许开发者在任何应用中集成和调用这些 Skill。该工具最近更新至 v0.1.3 版本,进一步简化了调用流程。用户只需在命令行执行一句 `goskills run` 并附带相应提示,即可调用指定的 Skill,例如使用扩展后的 `markitdown` Skill 将特定网页转换为 Markdown 格式。 工具支持通过包管理器或下载二进制文件进行安装,并提供了丰富的配置选项,如指定模型名称、API 地址和 Skill 目录,这些参数可通过命令行参数或环境变量设置。文章以 `markitdown` 为例,展示了如何扩展官方 Skill 以增强网页处理能力。 核心优势在于其极简的集成方式:开发者无需在自身应用中编写复杂的 LLM 交互与 Skill 解析逻辑,只需在程序中构造并调用相应的 `goskills run` 命令即可。文章提供了 Shell、Python、JavaScript、Go、Java、Rust、C++ 和 C 等多种编程语言的调用示例,演示了如何在不同技术栈中便捷地利用 goskills 执行 Skill。
Notex:一个开源 NotebookLM 替代方案的实现
Notex 是一个受 Google NotebookLM 启发的开源替代方案,旨在提供本地优先、数据不外泄的文档智能处理与知识管理体验。其核心是一个基于检索增强生成(RAG)技术的系统,支持 PDF、Word 等多种文档格式的上传解析,并通过 AI 提供内容问答、总结、思维导图及幻灯片生成等功能。 项目采用务实的技术栈,后端使用 Go 语言(Gin + SQLite)以实现单一二进制部署,前端为嵌入式原生 JavaScript 单页应用。AI 调用层通过 LangChainGo 统一管理,支持 OpenAI、Ollama 本地模型及 Google Gemini。其架构的关键创新点在于将 RAG 与高级视觉内容生成深度集成。 具体实现上,系统处理了中英文混合的文档分词与检索策略。对于视觉化功能,幻灯片生成采用两阶段流程:先由 LLM 生成包含叙事与布局的大纲,再调用图像模型为每页生成配图。信息图生成则利用 Prompt Engineering 将文本转化为结构化的视觉描述描述,驱动图像模型输出手绘风格插图。思维导图生成则通过特定提示词模板,直接输出可渲染的 Mermaid.js 代码。整个系统形成了从文档解析、索引、AI 生成到可视化输出的完整闭环,在保证隐私的前提下提供了丰富的文档处理能力。
拆解Manus:真正有用的深度报告的生成
传统大模型在执行大规模分析任务时,会因上下文窗口被持续填满而导致信息压缩和质量下降,即“上下文窗口陷阱”。为解决此问题,业界探索出两条主要技术路线。其一以Google Gemini Deep Research为代表,通过升级模型、扩大上下文窗口并强化多步推理能力,适合需要深度综合分析的任务。其二以Manus Wide Research为代表,采用分布式并行架构:将大型任务拆解为多个独立子任务,由数百个具备独立上下文的子Agent并行执行,最后由主Agent汇总。这种方式从结构上规避了单Agent上下文溢出的瓶颈,确保大量独立对象(如数十家公司)分析深度的一致性。其架构借鉴了CodeAct论文思想,结合ReAct执行循环、沙箱隔离环境、有向无环图任务分解以及动态质量检测机制,模拟了人类研究员“规划-检索-分析-迭代”的完整工作流,标志着AI从聊天助手向具备规划、工具使用、迭代验证与综合能力的研究助手演进。
40+ Claude Code Tips: From Basics to Advanced
本文系统介绍了40余项Claude Code高效使用技巧,从基础设置延伸至高级工作流编排。核心建议包括:自定义状态栏以实时监控上下文消耗与项目状态;精简系统提示词以优化性能;利用语音交互提升沟通效率;将复杂任务分解为可管理的子问题以实现逐步解决。在开发集成方面,重点讲解了如何熟练运用Git与GitHub CLI进行代码提交、分支管理和PR审查,并强调定期启动新对话以保持上下文“新鲜度”。进阶技巧涉及在容器内安全执行高风险或长时间任务、借助Gemini CLI作为备用工具、以及通过半克隆对话等方式压缩上下文。文章还倡导将Claude Code视为通用接口与协作伙伴,建议用户通过持续实践、编写测试、简化代码及自动化工作流来深化其应用能力,最终实现个人化软件开发流程的全面升级。
扫描全国的公网IP需要多久?
作者基于个人兴趣,在一台旧款4核迷你主机的家庭网络环境下,测试了扫描中国大陆所有公网IP地址的耗时。最终扫描约3.43亿个地址,发现其中约592万个IP可达,总耗时约1小时2分58秒。该测试旨在探索使用单台设备探测全国范围内运营商与云服务商网络连通性、识别故障或劫持情况的技术可行性。 文章核心是介绍了一款由作者重构的网络扫描程序的实现。新版本摒弃了之前依赖libpcap库的gopacket方案,完全基于Go标准库中的icmp与ipv4扩展包构建,无需启用CGO,便于部署与编译。程序架构采用并发模型,主要由三个goroutine协作:一个负责解析APNIC提供的IP网段列表并分发任务;一个负责批量构造并发送ICMP回显请求报文;一个负责监听并接收ICMP回显应答,最终将存活IP输出。代码通过设置BPF过滤器优化性能,并使用进程ID作为ICMP报文标识以准确匹配响应。整个扫描引擎仅约200行代码,展示了使用Go语言进行高效网络编程的典型范例。
啥时候等到Go官方支持SIMD?
Go语言目前缺乏官方的SIMD(单指令多数据流)支持,这一议题在官方问题追踪中持续讨论但进展缓慢。SIMD能显著提升图像处理、机器学习等计算密集型任务的性能,是C++、Rust等语言已具备的能力。Go语言追求简洁性与可移植性,而SIMD实现需针对不同硬件架构进行优化,两者存在设计冲突,导致官方支持犹豫不决。当前,标准库中已局部引入SIMD指令(如Go 1.24中Swiss Tables的实现以及crypto/sha256包),但编译器并未提供自动向量化功能。社区为弥补空缺,开发了第三方库如kelindar/simd、alivanz/go-simd和pehringer/simd,它们通过汇编或自动向量化技术在Go中实现了SIMD操作,但这些方案需要开发者自行管理,可移植性和维护性有限。总体而言,Go在高性能计算领域的潜力受限于SIMD支持的缺失,未来官方的整合将对性能优化至关重要。
Go Reflect 性能
这篇讲的是Go语言reflect包在带来便利的同时,所付出的性能代价。作者没有停留在理论层面,而是通过一组精心设计的基准测试,量化了不同反射操作与直接操作之间的性能差异。 测试以一个普通的struct类型为例,揭示了几个关键结论:通过反射创建对象比直接new慢约50%;而反射赋值的性能损耗则更为显著。有趣的是,使用FieldByName按字段名赋值比按索引Field赋值慢了近4倍,原因在于前者内部有额外的字段查找循环。 文章指出,反射在需要动态处理通用类型的场景(如json编解码、ORM框架)中不可或缺,但其带来的指令增加和interface{}装箱开销不容忽视。因此,在高性能敏感的场合,可以考虑采用代码生成等方式(如easyjson)来规避反射,实现性能优化。文章通过具体数据与源码示例,为开发者在“便利”与“性能”之间权衡提供了清晰的参考。
使用 defer 还是不使用 defer?
这篇讲的是Go语言中defer语句的“爱恨情仇”——从最初赞赏它能简化资源清理代码,到发现其性能开销,再到最终理解其适用边界的全过程。 文章首先展示了defer的魅力:它能让锁的获取与释放成对出现,代码清晰且不易出错,因此在标准库中被广泛使用。然而,性能测试揭示了一个关键事实:使用defer释放锁(70.4 ns/op)比直接调用(19.3 ns/op)慢数倍,多个defer叠加时开销更大。这引出了核心矛盾:defer带来的代码简洁性,是以几十纳秒的性能损耗为代价的。 文章进一步探讨了Go官方对此的优化(如1.8版本的改进),并引用了实际案例(如Prometheus项目)。结论并非一刀切地否定defer,而是提出了务实的平衡点:对于大多数业务代码,defer的便利性远胜于其微小开销;但对于高并发下的“热路径”,通过pprof观察到defer成为瓶颈时,手动管理资源释放则是更优选择。简单说,defer并非免费,但它的代价在绝大多数场景下完全值得。
[译]Go开发中一些有用的模式
作者从使用VB、Java、C#和Python转向Go开发的视角出发,分享了在Go中实现几个经典设计模式的独特方式。文章的核心在于对比:与许多语言依赖注解(Annotation)实现装饰器不同,Go通过函数包装和接口适配来增强功能,使控制流更显式,避免了隐藏的配置陷阱。对于单例模式,Go利用`sync.Once`优雅地解决了其他语言中常见的并发初始化安全与性能问题,甚至结合装饰器模式将不安全的API包装成线程安全版本。此外,文章还介绍了用类型方法实现“静态成员”的技巧,以及如何用带缓冲的channel轻量级模拟信号量。这些示例不仅展示了Go的语法特性,更体现了其通过组合和并发原语来构建清晰、安全代码的哲学,对习惯其他语言范式的开发者很有启发。