标签 github 下的文章

数据打脸刻板印象:Go 的“样板代码”竟然和 Rust 一样多?

本文永久链接 – https://tonybai.com/2026/02/08/go-boilerplate-code-vs-rust-data-refutes-stereotypes

大家好,我是Tony Bai。

在编程语言的鄙视链中,Go 语言常常因为其“繁琐”而饱受诟病。

“if err != nil 写断手”、“缺乏语法糖”、“到处都是重复的样板代码”…… 这些似乎已经成为了 Go 的标签。

相比之下,Rust 往往被视为“表达力”的代表,拥有强大的宏、模式匹配和类型系统,能够用更少的代码做更多的事。

然而,Ben Boyter 最近的一项硬核研究,通过分析 GitHub 上各语言 Top 100 仓库(总计约 4 亿行代码),得出了一个令编程语言社区大跌眼镜的结论:

在代码重复率和“样板代码”密度上,Go 和 Rust 几乎处于同一水平线。

不仅是行数:ULOC 指标

传统的 SLOC(源代码行数)往往无法真实反映项目的复杂度和冗余度。Ben Boyter 使用了他开发的工具 scc 中的一个特殊指标:ULOC (Unique Lines of Code,唯一代码行数)

ULOC 指标并非简单的“全量去重”,而是通过剥离“结构性噪音”来更精准地衡量系统的真实复杂度。其计算逻辑如下:

  • 剔除结构化冗余:不仅排除了空行,还排除了单纯的闭合大括号行(})以及在不同文件中大量重复出现的公共引用代码(如 include 或 import)。
  • 过滤文件级模板:有效识别并扣除在项目中每个文件顶部几乎完全相同的 License(许可证)声明头,避免这些非逻辑性的“样板文字”虚增代码总量。
  • 计入注释成本:与传统 SLOC 不同,ULOC 会保留注释统计。作者认为,注释与代码一样需要同等的维护精力,反映了开发者的思考过程,因此属于“有效工作量”。

通过这种方式计算出的 Dryness(干度),代表了剔除“语法支架”和“版权模板”后,真正的业务逻辑与注释在代码中的占比。百分比越高,说明重复代码越少,信息密度越高;百分比越低,说明“样板代码”或重复结构越多。

令人震惊的对比:Go vs Rust

让我们直接看数据(数据来源:GitHub Top 100 仓库分析,2026年2月):

发现了吗?Rust (60.5%) 和 Go (58.78%) 的差距微乎其微,甚至可以说在统计学上是等价的。

Ben Boyter 在文章中坦言,他之前也持有“Go 的样板代码比 Rust 多得多”的刻板印象。但数据表明,虽然两者的“啰嗦”方式不同,但结果是一样的:

  • Go 的啰嗦:体现在显式的错误处理、显式的循环结构,以及为了简单性而不得不写的重复逻辑。
  • Rust 的啰嗦:体现在复杂的类型系统设置、Trait 的实现(impl blocks)、以及为了满足借用检查器而编写的“仪式性”代码。

正如作者所总结的:

Go 狂热者:“Go 很简单!” -> “是的,简单到你需要把同一件事写很多遍。”
Rust 狂热者:“Rust 完美表达!” -> “是的,但你花了 40% 的时间在写 setup 代码和 trait 实现。”

其他颠覆性的发现

除了 Go 和 Rust 的“握手言和”,这份报告还有几个极具冲击力的发现:

1. Lisp 家族是“干度之王”

Clojure 以 77.91% 的惊人密度位居榜首。Haskell 紧随其后。

这验证了一个古老的观点:如果你想要最高的“人类思想 vs 击键次数”比率,Lisp 和函数式语言依然是王者。它们几乎每一行代码都是纯粹的业务逻辑。

2. Java 居然比 Go 和 Rust 都“干”?

Java 的得分为 65.72%,显著高于 Go、Rust 和 C#。

这听起来反直觉,毕竟 Java 以 PublicStaticVoidMain 这种冗长著称。但这可能说明:

  • 现代 Java 及其生态(Spring 等)通过注解等方式极大地消除了样板代码。
  • 或者,Top 100 的 Java 项目多为成熟的业务系统,核心逻辑占比大,而 Go/Rust 项目中系统级代码(通常包含更多底层重复逻辑)较多。

3. 脚本语言的特异性

Shell Script 的密度极高(72.24%),但这主要是因为 Shell 脚本通常很短且高度定制化(Bespoke),很难复用,因此“唯一性”很高。

小结:复杂度的守恒

这个研究告诉我们一个道理:语言特性(Features)并不一定能消除复杂度,它往往只是转移了复杂度。

Go 选择了少量的特性,导致逻辑必须通过显式的重复代码来表达;Rust 选择了丰富的特性(宏、泛型、Trait),导致开发者必须编写大量的结构性代码来支撑这些特性。

对于 Gopher 来说,这或许是一种宽慰:别再为 if err != nil 感到羞愧了。隔壁写 Rust 的兄弟,虽然代码看起来很酷,但他们为了让编译器开心而敲击键盘的次数,并不比你少。

毕竟,软件工程没有银弹,只有取舍。

资料链接:https://boyter.org/posts/boilerplate-tax-ranking-popular-languages-by-density/


聊聊你的“啰嗦”体验

看完这个数据,你是感到“意料之中”还是“大吃一惊”?在你的实际开发中,你觉得 Go 的 if err != nil 更磨人,还是 Rust 的类型体操和 Trait 实现更让你头大?你认同“复杂度守恒”这个观点吗?

欢迎在评论区留下你的看法,让我们来一场理性的“语言之争”!


还在为“复制粘贴喂AI”而烦恼?我的新专栏 AI原生开发工作流实战 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?

  • 想写出更地道、更健壮的Go代码,却总在细节上踩坑?
  • 渴望提升软件设计能力,驾驭复杂Go项目却缺乏章法?
  • 想打造生产级的Go服务,却在工程化实践中屡屡受挫?

继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!

我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。

目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

技术考古:Markdown 为何从博客工具演变成统治 AI 世界的“通用语”?

本文永久链接 – https://tonybai.com/2026/01/13/how-markdown-took-over-the-world

大家好,我是Tony Bai。

在这个由科技巨头主导、充斥着复杂算法和封闭生态的数字世界里,有一种技术显得格格不入。它没有专利壁垒,没有复杂的构建流程,甚至不需要特定的软件就能阅读。

它是 Markdown

近期,知名科技博主 Anil Dash 发布了一篇题为《How Markdown Took Over the World》的长文。他在文中深情回顾了这一格式的诞生与崛起,并指出:在这个由科技巨头主导、充斥着封闭生态的数字世界里,Markdown 是一场属于普通人的胜利。

如今,从 GitHub 上的亿万代码仓库,到 ChatGPT等大模型 生成的每一个回答,再到你随手记下的 Apple Notes,Markdown 无处不在。它不仅成为了技术人员的“普通话”,更意外地成为了 AI 时代的“通用语”。

这一切,都始于 20 年前一位“固执”的苹果博主为了偷懒而写的一个小脚本。今天,让我们跟随 Anil Dash 的视角,回顾这段充满偶然与必然的技术传奇。

缘起:一个博主的“偷懒”计划

2002 年,John Gruber 做了一个在当时看来极其不理性的决定:全职运营一个只关注苹果公司动态的博客——Daring Fireball

在那个博客刚刚兴起的蛮荒时代,发布内容并不容易。你要么忍受简陋的输入框,要么得手写复杂的 HTML 标签。为了能在写文章时(比如加粗、插入链接)不被繁琐的 HTML 标记打断思路,John 决定为自己开发一套工具。

他的核心理念是:既然 HTML (HyperText Markup Language) 太复杂,那就叫它 Markdown 吧。

如果你想加粗,就用 **;想引用,就用 >;想列表,就用 -。这些符号并非凭空创造,而是深受电子邮件时代纯文本格式习惯的影响。John 的天才之处在于,他将这些约定俗成的习惯标准化,并写了一个 Perl 脚本将它们转换为合法的 HTML。

2004 年 3 月,在 Aaron Swartz(那位早逝的天才少年)的协助测试下,Markdown 正式发布。没有人预料到,这个小小的工具将改变互联网的未来。

统治世界:从程序员到 AI

Markdown 的崛起并非一夜之间,但它的生命力却异常顽强。

  1. 开发者的拥抱:GitHub 的出现是关键转折点。它将 README.md 设为项目标配,使得 Markdown 成为了开发者描述项目的标准格式。
  2. 应用的普及:从 Slack 到 Discord,从 Notion 到 Obsidian,现代生产力工具几乎全部内置了 Markdown 支持。哪怕是 Google Docs 和 Apple Notes 这样的大众软件,最终也向用户需求妥协,加入了 Markdown 支持。
  3. AI 的通用语:最令人意想不到的转折发生在当下。当最前沿的 LLM(大型语言模型)需要一种格式来输出结构化内容时,它们不约而同地选择了 Markdown。因为它既对人类可读,又对机器友好,且完全开放。

Anil Dash 在他的回顾文章中总结了 Markdown 成功的 10 个技术原因,其中几点尤为深刻:

  • 解决真实问题:它不是为了“发明一种新格式”,而是为了解决“手写 HTML 太痛苦”这个具体痛点。
  • 利用现有习惯:它没有强迫用户学习新符号,而是沿用了电子邮件时代的纯文本习惯(如 > 表示引用)。
  • 没有知识产权 (IP) 负担:John Gruber 从未试图将其商业化或申请专利,这种彻底的开放性消除了所有采用者的顾虑。
  • “查看源码”的哲学:Markdown 文件本身就是教程。你只需要看一眼源文件,就能立刻学会怎么写。

硬币的另一面:自由的代价

当然,Markdown 这种彻底的自由和缺乏中央控制,也带来了一个长期的副作用——碎片化

正因为 John Gruber 当年只给出了一个 Perl 脚本而没有定义极其严谨的规范,导致后来出现了各种“方言”。GitHub 有自己的 GitHub Flavored Markdown (GFM),Reddit 有自己的解析规则,Obsidian 和 Notion 也都添加了各自的私有语法(如双向链接 [[Link]])。

这导致了一个尴尬的现实:虽然 Markdown 到处都是,但你的 Markdown 文件未必能在所有地方都完美渲染。 表格的语法支持不一,数学公式的写法各异,甚至连换行符的处理都有微妙差别。

直到后来 CommonMark 等项目的出现,才试图事后诸葛亮式地去修补这种分裂。

但幸运的是,Markdown 的核心语法(标题、列表、粗体、引用、链接)已经足够稳固,成为了事实上的标准。正是这最基础的 80% 功能,支撑起了它在 AI 时代的通用性。对于大语言模型而言,这些细微的方言差异完全可以忽略不计——它只需要用最基础的语法,就能让全世界读懂。

这也再次印证了那个道理:在规模化面前,简单且“足够好”的方案,往往能战胜完美但复杂的方案。

启示:善良与开放的力量

Markdown 的故事,是对当代科技行业的一种温柔提醒。

真正的互联网基础设施,往往不是由拿了巨额风投的初创公司在董事会里规划出来的。它们往往源于像 John Gruber 或 Aaron Swartz 这样的人——他们有正职工作,但也充满热情;他们为了解决自己的问题而造轮子,然后慷慨地将其分享给世界。

在这个被“护城河”、“生态闭环”和“商业化变现”充斥的时代,Markdown 证明了:一个好的点子,加上一颗慷慨的心,依然可以改变世界。

下次当你用 ** 加粗文字,或者看着 ChatGPT 逐行吐出格式完美的回答时,请记得:这背后没有复杂的商业算计,只有一位在费城看球赛的博主,想让你打字时能稍微轻松一点。

资料链接:https://www.anildash.com/2026/01/09/how-markdown-took-over-the-world/


你的 Markdown 记忆

Markdown 已经陪伴了我们 20 年。你还记得自己第一次接触 Markdown 是在什么场景下吗?是写 GitHub README,还是做笔记?你最喜欢的 Markdown 编辑器又是哪一款?

欢迎在评论区分享你的 Markdown 故事和神器推荐! 让我们一起致敬这个简单而伟大的工具。

如果这篇文章让你对 Markdown 有了全新的认识,别忘了点个【赞】和【在看】,并转发给你的朋友,哪怕他只是个爱记笔记的非程序员!


还在为“复制粘贴喂AI”而烦恼?我的新专栏 AI原生开发工作流实战 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?

  • 想写出更地道、更健壮的Go代码,却总在细节上踩坑?
  • 渴望提升软件设计能力,驾驭复杂Go项目却缺乏章法?
  • 想打造生产级的Go服务,却在工程化实践中屡屡受挫?

继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!

我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。

目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言进阶课 AI原生开发工作流实战 Go语言精进之路1 Go语言精进之路2 Go语言第一课 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com
这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats