Go 语言技能:AI 时代的 Go 开发工具链

"Clear is better than clever."
清晰胜于聪明。
—— Rob Pike, Go Proverbs

第 23 章把重构讲完了。嗅坏味道、套 Fowler 手法、小步施工、每步测试,这套东西对 Java、Python、Go 一视同仁。但真到 Go 上手你会发现,Fowler 的目录够不着 Go 的好几层脾气。一段能跑的 Go 代码,可能还停在 Go 1.10 的写法,不地道;可能并发原语用错了,race detector 一开就红,不安全;也可能分配没控住,cache line 在 false sharing,不快。这些坏味道扫不出来,是 Go 二十年攒下来、只有老手才摸得到的门道。

门道都散在各处。Dave Cheney 的高性能工作坊讲一套,dgryski 的 go-perfbook 讲一套,《Go 并发编程实战》讲一套,Go 团队的 modernize 分析又讲一套,再加上无数生产事故换来的风格约定。以前你得一本书一本书读、一个 pprof 一个 pprof 啃。现在有人把这些蒸成一个 Skill,Agent 调一下就能用。

本章介绍五个 Go 专属的 Skill,正好覆盖 Go 工程的四个面:现代化(/modern-go)、性能(chao-go-perf)、并发(chao-go-sync)、风格(go-style-guide),外加一个把这几样打包、还顺带做了效果评估的全家桶(cc-skills-golang)。前三个是本书作者 smallnest 写的,对,写这本书的人和写这些 Skill 的人是同一个;后两个分别来自 madflojo(Benjamin Cane)和 samber。

阅读全文

如何做决策 - 从 Go 的一个 issue 说起

事情的起点,是 Go 仓库里一个很普通的 issue(golang/go#77273)。

在 Go 这种量级的开源项目里,每天都有人提出各种各样的提案:增加一个语法糖、调整一处行为、复活一个曾经被否决的设计……其中有相当一部分,是在重新提起一个早已被讨论过、并且已经下过结论的话题

对维护者来说,这是一件很消耗精力的事。如果每个人都可以无限次地把一个已经决定的问题重新拉出来辩论一遍,那么决策永远不会真正「落地」,团队会被无穷无尽的回锅讨论拖垮。

于是,在这条 issue 的讨论里,有人贴出了 Go 官方提案流程(go.dev/s/proposal)中的一段话:

一般来说,对于「重新审议此前已经决定的提案」这件事,我们的做法遵循 John Ousterhout 在他那篇 Open Decision-Making 中给出的建议,尤其是其中「Reconsideration(重新审议)」那一节。

换句话说,连 Go 团队这样的顶级工程组织,在「怎么做决策、决策之后还要不要重新讨论」这件事上,引用的也不是某套高深的管理学理论,而是 John Ousterhout —— 也就是写《软件设计的哲学》那位斯坦福教授 —— 的一篇博客。

那一节的核心其实只有一句话:当有人想推翻一个已经做出的决定时,先问一句 「你掌握了什么新的信息?」(What new information do you have?)。如果没有新信息,那就不必重新讨论;如果有,那随时欢迎修正。

这套关于「决策」的方法论,远不止「要不要重新讨论」这一个点。Ousterhout 在这篇文章里,系统地讲了他在两家创业公司里摸索出来的一整套**开放式决策(Open Decision-Making)**框架。

下面是这篇文章的完整翻译。


开放式决策

作者:John Ousterhout,斯坦福大学计算机科学系教授
原文:Open Decision-Making
最后更新:2021 年 6 月 8 日

引子

在创办并领导两家创业公司的过程中,我亲历过形形色色的决策:有些成功,有些惨败。回过头看,那些好与坏的结果背后,其实有一套可以总结的规律。我逐渐形成了一套自己偏爱的决策方法,它处在「集权 — 开放」这条光谱中相当靠近「开放」的那一端:与其依赖少数几个人拍板,不如尽可能去汇聚许多人的集体智慧。

很多管理者对这种做法心存疑虑,担心它低效、担心自己失去掌控。但我的经验恰恰相反:

  • 达成共识,往往比你想象的要容易。
  • 领导者其实不需要把决策攥得那么紧。
  • 尽早把争议摆到台面上,反而能减少后期的冲突。

阅读全文

等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go

seq 库的一行代码,从左读到右。写过 lo.Map(lo.Filter(...)) 的人,大概会愣一下。

这个库的开发我昨天晚上在微信上了做了直播,展示我如何使用Loop Engineering 从 0 构建出来。使用的是火山引擎的coding plan, GLM-5.2模型,花了 2 小时,耗费Token 7.23M。你可以查看直播回放:

你也可以访问这个库的项目地址: https://github.com/smallnest/seq, tasks目录中有需求文档和设计文档。

阅读全文

Go 实验特性详解

Go 在发布新版本时经常会附带实验性特性(experimental features)

这些实验性特性有不同的形式:有时是标准库中全新的包,有时是编译器或运行时的改动,偶尔也可能是对 Go 行为的破坏性变更。

大多数情况下,实验性特性的目的是在某个功能正式进入 通用可用(general availability) 阶段、成为 Go 的永久组成部分之前,从用户那里获取真实世界的反馈。如果该特性导致性能退化,或收到社区的负面反馈,它可以在最终定稿前被修改——甚至被完全放弃。

阅读全文

amd64 微架构级别对 Go 程序性能提升多少?

在 Go 1.17 之前,Go 编译器总是生成可由任何 64 位 x86 处理器执行的 x86 二进制文件。
Go 1.18 为 AMD64 引入了 4 个架构级别 。每个级别在编译器可以包含在生成的二进制文件中的 x86 指令集上有所不同:

  • GOAMD64=v1(默认值):基准模式。仅生成所有 64 位 x86 处理器都能执行的指令。
  • GOAMD64=v2:所有 v1 指令,加上 CMPXCHG16B、LAHF、SAHF、POPCNT、SSE3、SSE4.1、SSE4.2、SSSE3。
  • GOAMD64=v3:所有 v2 指令,加上 AVX、AVX2、BMI1、BMI2、F16C、FMA、LZCNT、MOVBE、OSXSAVE。
  • GOAMD64=v4:所有 v3 指令,加上 AVX512F、AVX512BW、AVX512CD、AVX512DQ、AVX512VL。

例如,设置 GOAMD64=v3 将允许 Go 编译器在生成的二进制文件中使用 AVX2 指令(这在某些情况下可能会提高性能);但是这些二进制文件将无法在不支持 AVX2 的旧 x86 处理器上运行。
Go 工具链也可能生成更新的指令,但会通过动态检查来确保它们只在支持的处理器上执行。例如,如果设置了 GOAMD64=v1,并且 CPUID 报告 POPCNT 指令可用,那么 math/bits.OnesCount 仍然会使用该指令。否则,它会回退到通用实现。
Go 工具链目前不生成任何 AVX512 指令。
不支持 SSE3 的平台不支持种族检测器。

64 位 Intel 和 AMD 处理器已经演进了几十年。当你为 64 位 Intel 或 AMD 处理器编译 Go 程序时,编译器默认面向的是一个将近 20 年前的指令集。生成的二进制文件几乎能在任何 x64 芯片上运行,但同时也放弃了自 2003 年以来添加的所有指令。

我们通常用微架构级别(microarchitecture levels)来描述这一分层。每个级别捆绑了一组可以假定存在的指令集扩展:

级别 新增内容(大致)
v1 原始 AMD64 基线(SSE2)
v2 popcnt、SSE4.2
v3 AVX2
v4 AVX-512(F/BW/DQ/VL)

阅读全文

爽呆了,不费吹灰之力,我把scapy翻译成了Go语言

创建需求文档

1
❯ /prd 将 https://github.com/secdev/scapy port到Go语言,保持它的功能和便利性

啥时候等到Go官方支持SIMD?

单指令多数据流(SIMD,Single Instruction Multiple Data)是一种并行计算技术,允许一条指令同时处理多个数据点。SIMD在现代CPU中广泛应用,能够显著提升计算密集型任务的性能,如图像处理、机器学习、科学计算等。随着Go语言在高性能计算领域的应用逐渐增多,SIMD支持成为了开发者关注的焦点。

当前很多主流和新型的语言都有相应的simd库了,比如C++、Rust、Zig等,但Go语言的simd官方支持还一直在讨论中(issue#67520)。Go语言的设计目标是简单性和可移植性,而SIMD的实现通常需要针对不同的硬件架构进行优化,这与Go的设计目标存在一定冲突。因此,Go语言对SIMD的支持一直备受争议。
最近几周这个issue的讨论有活跃起来, 希望能快点支持。

阅读全文

DeepSeek数据库暴露?扫描一下,应该不止此一家吧!

DeepSeek出街老火了,整个AI界都在热火朝天的讨论它。

同时,安全界也没闲着,来自美国的攻击使它不得不通知中国大陆以外的手机号的注册,同时大家也对它的网站和服务安全性进行了审视,这不Wiz Research就发现它们的数据库面向公网暴露并且无需任何身份即可访问。这两个域名oauth2callback.deepseek.com:9000和dev.deepseek.com:9000。

AI的核心技术既需要这些清北的天才去研究,产品也需要专业的人才去打磨。像DeepSeek这么专业的公司都可能出现这样的漏洞,相信互联网上这么数据库无密码暴露的实例也应该不在少数(实际只找到了2个)。

基于上一篇《扫描全国的公网IP要多久》,我们改造一下代码,让它使用 tcp_syn 的方式探测clickhopuse的9000端口。

首先声明,所有的技术都是为了给大家介绍使用Go语言开发底层的网络程序所做的演示,不是为了介绍安全和攻击方面的内容,所以也不会使用已经成熟的端口和IP扫描工具如zmap、rustscan、nmap、masscan、Advanced IP Scanner、Angry IP Scanner、unicornscan等工具。

同时,也不会追求快速,我仅仅在家中的100M的网络中,使用一台10多年前的4核Linux机器进行测试,尽可能让它能出结果。我一般晚上启动它,早上吃过早餐后来查看结果。

阅读全文