为什么 Go 社区强调避免不必要的抽象?—— 借用海德格尔哲学寻找“正确”的答案

大家好,我是Tony Bai。

“Go 的哲学强调避免不必要的抽象。”

这句话我们听过无数次。当你试图引入 ORM、泛型 Map/Reduce 、接口或者复杂的设计模式时,往往会收到这样的反馈。这句话本身没有错,但难点在于:到底什么是“不必要”的?

函数是抽象吗?汇编是抽象吗?如果不加定义地“避免抽象”,我们最终只能对着硅片大喊大叫。

在 GopherCon UK 2025 上,John Cinnamond 做了一场与众不同的演讲。他没有展示任何炫酷的并发模式,而是搬出了马丁·海德格尔(Martin Heidegger)和伊曼努尔·康德(Immanuel Kant),试图用哲学的视角,为我们解开关于 Go 抽象的终极困惑。

注:海德格尔与《存在与时间》

马丁·海德格尔(Martin Heidegger)是 20 世纪最重要的哲学家之一。他在 1927 年的巨著《存在与时间》(Being and Time) 中,深入探讨了人(此在)如何与世界互动。John Cinnamond 在演讲中引用的核心概念——“上手状态” (Ready-to-hand)和 “在手状态” (Present-at-hand),正是海德格尔用来描述我们与工具(如锤子)之间关系的术语。这套理论极好地解释了为什么优秀的工具(或代码抽象)应该是“透明”的,而糟糕的工具则会强行占据我们的注意力。

我们都在使用的“必要”抽象

首先,让我们承认一个事实:编程本身就是建立在无数层抽象之上的。

  • 泛型:这是对类型的抽象。虽然 Go 曾长期拒绝它,但在技术上它是必要的,否则我们将充斥着重复代码。

  • 接口:这是对行为的抽象。io.Reader让我们不必关心数据来自文件还是网络。

  • 函数:这是对指令序列的抽象。没有它,我们只能写长长的main函数。

  • 汇编语言:这是对机器码的抽象。

所以,当我们说“避免不必要的抽象”时,我们真正想表达的其实是——避免“不恰当” (Inappropriate) 的抽象

那么,如何判断一个抽象是否“恰当”?

何为抽象?—— 一场有目的的“细节隐藏”

在深入探讨“正确”的抽象之前,我们必须先回到最基本的定义。John Cinnamond 在演讲中给出了一个精炼而深刻的定义:

“抽象是一种表示 (Representation),但它是一种刻意移除被表示事物某些细节的表示。”

让我们拆解这个定义:

  1. 抽象是一种“表示”,而非事物本身 它不是代码的实体,而是代码的地图或模型。例如,一辆模型汽车是真实汽车的表示,但 Gopher 吉祥物是地鼠的抽象——它刻意省略了真实地鼠的所有细节,只保留了核心特征。

  2. 抽象是“有目的的”细节移除 这与仅仅是“不精确”或“粗糙”不同。抽象是有意为之的,它不试图精确描绘所有方面,而是只关注某个特定维度

  3. 抽象在编程中具有动态性

  • 不确定引用 (Indefinite Reference):一个抽象(如io.Reader)通常可以指代许多不同的具体实现。

  • 开放引用 (Open Reference):抽象的内容或它所指代的事物可以随着时间而改变。

为什么要刻意移除细节?John 总结了几个核心动机:

  • 避免重复代码:将重复的逻辑提取到抽象中。

  • 统一不同的实现:允许以统一的方式处理本质上不同的数据结构(如所有实现了Read方法的类型)。

  • 推迟细节:隐藏那些当下不重要、或开发者不关心的细节(例如,你坐火车参会,不需要知道每节车厢的编号)。

  • 揭示领域概念:用抽象来更好地表达业务领域中的核心概念。

  • 驾驭复杂性:这是最核心的理由——没有抽象,我们无法在大脑中一次性处理所有细节,也就无法解决复杂的问题。

但请记住,并非所有抽象都是一样的。John 将它们分为三类:

  1. 基于“它是如何工作的” (How it works) 这是为了代码复用而提取的抽象。例如,你发现两处代码都在做“检查用户是否是管理员”的逻辑,于是将其提取为一个函数。这种抽象关注的是内部机制。(这类抽象通常比较脆弱,一旦实现细节变化,抽象可能就会失效。)

  2. 基于“它做了什么” (What it does) 这是 Go 语言中接口(Interface)最典型的用法。例如io.Reader,我们不关心它是文件还是网络连接,我们只关心它能“读取字节”。这是一种行为抽象。

  3. 基于“它是什么” (What it is) 这是基于领域模型的抽象。例如一个User结构体,它代表了系统中的一个实体。这种抽象关注的是本质属性。

在现实中,好的抽象往往是这三者的混合体,但在设计时,明确你是在抽象“行为”还是“实现”,对于判断抽象的质量至关重要。

理解了抽象的本质,我们可能会觉得:既然抽象能驾驭复杂性,那是不是越多越好?

且慢。在急于评判一个抽象是否“恰当”之前,我们必须先意识到一个常被技术人员忽略的现实:抽象不仅存在于代码中,更存在于人与人的互动里。这将我们引向了一个更现实的考量维度。

抽象的代价 —— 代码是写给人看的

John 提醒我们,软件开发本质上是一项社会活动 (Social Activity)。

“除非你是为了自己写着玩,否则你的代码总是写给别人看的。团队是一个微型社会,它有自己的习俗、信仰和‘传说’(Lore)。”

引入一个新的抽象,本质上是在向这个微型社会引入一种新的文化或规则。这意味着:

  1. 你需要支付“社会成本”:如果这个抽象与团队现有的习惯(Lore)相悖——比如在一个从未用过函数式编程的 Go 团队里强推 Monad——你将遭遇巨大的阻力。

  2. 团队的保守性:成熟的团队往往趋于保守,改变既定习惯需要巨大的能量。你不能仅仅因为一个抽象在理论上很美就引入它,你必须证明它的收益足以覆盖它带来的社会摩擦成本

  3. 认知负担是共享的:一个抽象对你来说可能很清晰,但如果它让队友感到困惑,那就是在消耗团队的整体智力资源。

因此,当我们评判一个抽象是否“恰当”时,不能只看代码本身,还必须看它是否“合群”。这正是我们接下来要引入海德格尔哲学的现实基础。

锤子哲学 —— “上手状态” vs. “在手状态”

John 引用了海德格尔在《存在与时间》中的一个著名概念:Ready-to-hand (上手状态)与 Present-at-hand (在手状态*。

  • 上手状态 (Ready-to-hand):当你熟练使用一把锤子钉钉子时,你的注意力完全在钉钉子这件事上,锤子本身在你意识中是“透明”的。你感觉不到它的存在,它只是你身体的延伸。

  • 在手状态 (Present-at-hand):当锤子突然坏了(比如锤头掉了),或者你拿到一把设计奇特的陌生工具时,你的注意力被迫从“钉钉子”转移到了“锤子”本身。你开始审视它的构造、重量和用法。

这对代码意味着什么?

  • 好的抽象是“上手状态”的:比如for循环。作为经验丰富的开发者,你使用它时是在思考“我要遍历数据”,而不是“这个循环语法是怎么编译的”。它透明、顺手,让你专注于解决问题。

  • 坏的抽象是“在手状态”的:比如一个复杂的、过度设计的 ORM 或者一个晦涩的 Monad 库。当你使用它时,你的思维被迫中断,你需要停下来思考:“这个函数到底在干什么?这个参数是什么意思?”

如果一个抽象让你频繁地从“解决业务问题”中抽离出来去思考“工具本身”,那么它很可能是一个坏的抽象

注:通过学习和实践,在手状态 (Present-at-hand)的抽象可以转换为 上手状态 (Ready-to-hand)的抽象。

真理的检验 —— “本质真理” vs. “巧合真理”

接着,John 又搬出了康德关于真理的分类,引导我们思考抽象的持久性

  • 分析真理 (Analytic Truth):由定义决定的真理。比如“所有单身汉都没结婚”。在代码中,这就像unnecessary abstractions are unnecessary,虽然正确但没啥用。

  • 综合真理 (Synthetic Truth):由外部事实决定的真理。比如“外面在下雨”。它的真假取决于环境,随时可能变。

  • 本质真理 (Essential Truth):虽然不是由定义决定,但反映了世界的本质规律。比如“物质由原子构成”。

这对抽象意味着什么?

当你提取一个抽象时,问问自己:它代表的是代码的“本质真理”,还是仅仅是一个“巧合”?

举个例子:你有一段过滤商品的代码,可以按“价格”过滤,也可以按“库存”过滤。你提取了一个Filter(Product) bool的抽象。

  • 如果未来所有的过滤需求(如颜色、大小)都能用这个签名解决,那么你发现了一个本质真理。这个抽象是稳固的。

  • 但如果突然来了一个需求:“过滤掉重复的商品”,这个需求需要知道所有商品的状态,而不仅仅是单个商品。原本的Filter(Product) bool签名瞬间失效。

如果你提取的抽象仅仅是因为几段代码“长得像”(巧合),而不是因为它们“本质上是一回事”,那么当需求变更时,这个抽象就会崩塌,变成一种负担。

由此可见,好的抽象不是被创造出来的,而是被发现(Recognized)出来的。它们是对代码中某种本质结构的捕捉。

实战指南 —— 如何引入抽象?

最后,John 给出了一个评估抽象是否“恰当”的五步清单:

  1. 明确收益 (Benefit):你到底是为了解决重复、隐藏细节,还是仅仅因为觉得它“很酷”?

  2. 考虑社会成本 (Social Cost):编程是社会活动。这个抽象符合团队的习惯吗?引入它是否需要消耗大量的团队认知成本?(比如在 Go 里强推 Monad等函数式编程的范式)。

  3. 是否处于“上手状态” (Ready-to-hand):它能融入开发者的直觉吗?还是会成为注意力的绊脚石?

  4. 是否本质 (Essential):它是否捕捉到了问题的核心结构,能经得起未来的变化?

  5. 是否涌现 (Emergent):它是你从现有代码中“识别”出来的模式,还是你强加给代码的枷锁?

小结:保持怀疑,但别放弃好奇

Go 社区的“避免不必要的抽象”文化,本质上是对认知负担的防御。我们见过太多为了抽象而抽象的烂代码。但 John 提醒我们,不要因此走向另一个极端——恐惧抽象

正确且必要的抽象是强大的武器,它能让我们驾驭巨大的复杂性。只要我们能像海德格尔审视锤子那样审视我们的代码,区分“上手”与“在手”,区分“本质”与“巧合”,我们就能在 Go 的简约哲学中,找到属于自己的那条“正确”道路。

资料链接:https://www.youtube.com/watch?v=oP_-eHZSaqc


你的“锤子”顺手吗?

用海德格尔的视角审视代码,确实别有一番风味。在你现在的项目中,有哪些抽象是让你感觉“如臂使指”的(上手状态)?又有哪些抽象经常让你 “出戏”,迫使你不得不去研究它内部的构造(在手状态)?

欢迎在评论区分享你的“哲学思考”!让我们一起寻找那个最本质的代码真理。👇

如果这篇文章带给你一次思维的“脑暴”,别忘了点个【赞】和【在看】,并转发给那些喜欢深究技术的伙伴!


点击下面标题,干货!

- 读懂Go的设计哲学:为什么说它是“恰到好处”的80/20语言?

- 为什么说 Go 的设计哲学是一场“逆行”?

- Go 的“显式哲学”为何在接口上“食言”了?—— 探秘隐式接口背后的设计智慧

- 【Go系统编程】01 文件I/O:从文件描述符到 io.Reader/Writer 的抽象

- 【Go开发者的数据库设计之道】05 落地篇:Go 语言四种数据访问方案深度对比

- Go语言的“灵魂拷问”:接口只关乎行为,还是也应拥抱数据?

- 像构建 Claude Code 一样构建应用:揭秘 Agent-native 架构的 5 大核心原则


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

  • 告别低效,重塑开发范式

  • 驾驭AI Agent(Claude Code),实现工作流自动化

  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1173418.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2026自动化展会导航:口碑好,一网打尽!智能/压力机/液压气动/环保/机床/激光技术设备/机械,自动化展览怎么选择 - 品牌推荐师

随着工业4.0与智能制造的加速推进,自动化展会已成为连接技术供应商、制造企业与行业专家的核心平台。2026年,全球自动化领域将迎来新一轮技术迭代与市场整合,展会不仅是企业展示创新成果的窗口,更是采购方精准对接…

自动操作浏览器,又一款 Chrome 神器,开源了!

大家最近在折腾 AI Agent 时,有没有遇到过这种尴尬的情况:让 AI 去某个网站查资料、抓数据,它在后台吭哧吭哧跑了半天,最后告诉你:“对不起,报错了”。大多时候,你会发现这些问题,主…

2026年新加坡留学中介哪家好:五家优选全面对比 - 速递信息

——文章最新发布时间:2026年1月 一、推荐背景与评价体系 在新加坡留学申请市场日益繁荣且服务质量参差不齐的背景下,选择一家好的新加坡留学中介已成为成功实现新加坡教育梦想的关键因素。新加坡留学中介的"好&q…

2026 年前端必会的 10 个现代 CSS 布局技巧

说句大实话。 到了 2026,前端的价值早就不止“看起来好看”。 你要管性能、管可维护性、管架构干不干净、管设计系统能不能扩展——还得顺手把 JavaScript 用量压下来,交付更好的体验。 如果你还在用几年前那套方式搭布局,你已经落后了。不是…

十条经过实战检验的 TypeScript monorepo 约定

点击上方 程序员成长指北,关注公众号 回复1,加入高级Node交流群十条经过实战检验的 TypeScript monorepo 约定 —— 覆盖命名、TS 配置、project references、构建、发布、测试与边界控制 —— 让代码库能够在时间中稳定扩展。Monorepo 在最初总是让人感…

2026年出国留学服务哪个更专业:五家优选全面对比 - 速递信息

——文章最新发布时间:2026年1月 一、推荐背景与评价体系 在全球留学申请竞争日益激烈且各国录取标准持续提升的背景下,选择一家专业可靠的出国留学机构已成为成功实现海外名校梦想的关键因素。全球留学不同于单一地区…

苹果终于眨眼了:打电话给谷歌救 Siri(对,真的是谷歌)

在苹果总部的某个角落,Siri 可能又一次礼貌地回了句:“我不太明白你的意思。”然后 Tim Cook 的脸——据说当场红到像煮熟的龙虾。接着,全世界最有钱的科技公司,干了一件很“反苹果”的事:给谷歌打电话求救。是的&…

分析各类原料分子包裹技术产品和服务厂家,全国排名如何? - 工业品牌热点

问题1:市场上各类原料分子包裹技术产品生产商那么多,怎么判断哪家价格合理? 对于有原料分子包裹技术需求的企业来说,价格合理从来不是单纯看报价数字,而是要结合成本结构交付质量和长期价值综合评估。很多企业容易…

Anthropic万字长文:一篇AI Agent评估体系的详细解析!

Datawhale干货 作者:Anthropic团队,来源:PaperAgentAnthropic发布了一篇blog《揭秘AI Agents评估》,细节满满!原文略微有点长,整理了一张脑图,要点精髓:良好的评估(evalu…

COSCon‘25 第十届中国开源年会登上中国日报,并获评思否「最受开发者欢迎的技术活动」

由开源社主办的 COSCon25 第十届中国开源年会于 2025 年 12 月在北京圆满落幕。开源驱动的下一代 AI 技术与生态、AI 时代的数据挑战、开源芯片的生态发展与未来趋势、新时代下的全球协作、被 AI 颠覆的 Coding、极速狂飙的具身智能开源浪潮…… 这些在开年 DeepSeek 时刻之后&…

2026年新加坡中学留学机构推荐:五家优选全面对比 - 速递信息

——文章最新发布时间:2026年1月 一、推荐背景与评价体系 在新加坡中学留学申请竞争日益激烈且录取标准持续提升的背景下,选择一家专业可靠的新加坡中学留学机构已成为成功实现新加坡优质教育梦想的关键因素。新加坡中…

2025年就业导向新西兰留学机构推荐:五家优选全面评测 - 速递信息

——文章最新发布时间:2026年1月 阅读摘要 文档类型:榜单评测与选型 评测维度:规划能力申请经验团队实力服务透明度增值服务Top Pick: 新东方前途出国 其它上榜: 新东方广州、启德教育、金吉列留学、新通教育 关键…

“买几送几“解题模板探讨

点击标题下「蓝色微信名」可快速关注现在小学生的数学题和我们小时候感觉不是一个层级的,例如"买几送几"应用题,还真得需要一些理解,可以通过如下的解题思路模板体会下,还是要对孩子多些宽容。第一步:找&quo…

MySQL自增id超过int最大值的场景

点击标题下「蓝色微信名」可快速关注 数据库的主键我们有时候会用自增列,但是自增都会有个上限,如果达到怎么办?技术社群的这篇文章《MySQL自增id超过int最大值怎么办?》就给我们讲解了MySQL数据库自增列达到上限该怎么办&#xf…

Instagram十亿级“用户名已被占用“背后的架构设计

点击标题下「蓝色微信名」可快速关注尽管国内无法访问但已经火遍全球的Ins软件,即Instagram,可能很多朋友都了解或者接触过,例如最近北京国安要引进的新外援,就是球迷们根据国安总经理马永明(Matthias Brosamer&#x…

vue3怎么实现网页端的文件夹上传?

武汉码农の大文件上传奇遇记:在长江边写信创代码 各位好,我是小王,武汉光谷某软件公司"防脱发小组"组长。最近接了个政府项目,要求在信创环境下上传4G文件,还必须开源可审查——这就像让我用热干面调料写火…

百度WebUploader在vue-cli项目里怎么用文件夹上传?

作为一名前端开发工程师,我近期接手了公司一个有些年头的旧项目改造工作。这次改造的核心需求,是要给这个旧项目增添大文件上传功能,尤其得支持 10G 左右文件的上传,并且还要具备断点续传的能力。 在众多解决方案中,我…

html中如何用js实现大文件文件夹上传?

北京码农の10G文件上传奇遇:在胡同里写信创代码 各位好,我是老张,北京中关村某软件公司“脱发攻坚队”队长。最近接了个政府项目,要求上传10G文件,还必须兼容信创环境并提供全套文档——这活儿就像在故宫里装Wi-Fi&am…

【2026最新】电商数据分析平台实用解析:从选型到落地应用 - 速递信息

导语 随着电商运营日益精细,数据已成为店铺经营与决策的重要依据。数据显示,2025年超过七成电商从业者将数据分析视为日常运营的关键一环。面对市面上众多的数据工具,如何选择适配自身业务的分析平台成为商家普遍关…

教育平台如何用百度UE实现PPT内容无缝转存至网页?

CMS企业官网Word导入全攻略:一个.NET码农的求生之路 兄弟们好!我是福建某小公司的.NET码农,最近接了个CMS企业官网的外包活,客户爸爸要求加个"Word全家桶一键导入"功能,还要保留所有妖艳的样式。预算680元封…