← 返回信息流
AI 资讯Hacker News·3 小时前

为何调试代码的“修驴蹄”过程竟如此令人上瘾

原标题:But yak shaving is fun

速览

文章以“修驴蹄”这一比喻,形象地描述了软件开发中处理细碎、看似无关紧要的技术问题的过程。尽管这些任务往往枯燥且耗时,但许多开发者却从中获得了意想不到的满足感和乐趣。这种心态反映了技术人员在面对复杂系统时,通过解决微小障碍来推进整体进度的独特心理体验。

AI 深度解读

但“剃牦牛”很有趣:从零构建的诱惑与陷阱

背景

在软件工程和技术开发领域,存在一种普遍现象:工程师或团队往往倾向于“从零开始”(Build from scratch)构建解决方案,而不是直接使用现成的工具或框架。这种现象的根源复杂,既包括工程师对定制自由度的追求、对个人技术的证明欲,也包含客户或管理者对现有解决方案能力的误解,或是认为现有方案无法精确满足特定需求。

然而,这种倾向往往伴随着巨大的隐性成本。在资源(时间、预算)有限的前提下,盲目追求完全自研可能导致项目偏离核心目标,陷入无尽的细节纠缠中。这种现象在技术社区中有一个著名的隐喻——“剃牦牛”(Yak shaving)。

核心内容

什么是“剃牦牛”?

“剃牦牛”是一个源自 MIT AI 实验室的术语,由博士生 Carlin Vieri 创造。它描述的是一种为了达成单一目标,而不得不执行一系列看似相关实则逐渐偏离初衷的任务链,最终导致完全忘记最初目的,甚至陷入与目标毫无关联的琐事中的过程。

该术语的灵感来源于动画片《Ren & Stimpy Show》中的一集“牦牛剃毛日”(Yak Shaving Day)。在这一集中,主角 Ren 和 Stimpy 为了庆祝假期,试图通过某种魔法仪式召唤一只剃了毛的牦牛。这一荒诞的情节让 Vieri 感到新奇。几天后,当他在深夜处理繁琐的行政文书工作(如获取管理员权限、开设 DHL 账户、寻找邮局)时,他向同事抱怨自己正在“剃牦牛”。随后,这一短语在实验室中流传开来。

为了形象地解释这一概念,文中引用了两个经典的例子:

  1. LangDev IRC 中的例子

    • 我需要一把斧头来砍树。
    • 斧头太钝了,所以我去找磨刀石。
    • 听说某个村庄有极好的磨刀石。
    • 我需要一头牦牛带我去那个村庄。
    • 牦牛的毛太长了,所以我开始给它剃毛。
  2. 企业家 Seth Godin 的例子

    • “我今天该洗车了。”
    • “哦不,水管坏了,我得去 Home Depot 买根新的。”
    • “但 Home Depot 在塔潘兹大桥的另一边,我要过收费站,所以我需要 E-ZPass(电子不停车收费系统)。”
    • “等等!我可以借邻居的 E-ZPass……”
    • “但 Bob 不会借给我,除非我儿子还回他借走的枕头。”
    • “那个枕头掉了很多牦牛毛,我不能直接还回去,我得用牦牛毛重新填充它。”
    • 结果,为了洗个车,我最后竟然在动物园里给牦牛剃毛。

作者的个人经历:一个静态网站生成器的诞生

文章作者分享了自己的博客构建历程,完美诠释了“剃牦牛”的过程:

  1. 起初尝试使用 Jekyll、Hugo 或 Gatsby 等静态网站生成器,但觉得自定义自由度不够。
  2. 决定自建博客,最初直接用 HTML 写文章,发现极其不便。
  3. 于是构建了一个系统,允许以 JSON 文件形式撰写文章。
  4. 发现 JSON 处理长篇文章依然 awkward(别扭),于是开发了一个将 Markdown 转换为 HTML 的服务。
  5. 接着又构建了编译和部署这些文件的工具。
  6. 结局:为了写博客,作者最终从零开始构建了一个静态网站生成器。

工程中的误区与理性决策

作者指出,无论是生产环境还是玩具项目,大多数项目都面临预算和时间的限制。如果选择“从零构建”,很容易陷入“剃牦牛”的陷阱:一旦开始,就难以预料终点在哪里,最终可能放弃原始目标。

在这种情况下,正确的做法是找到一个能满足核心需求的替代方案,并尽可能削减工作量。然而,尽管存在风险,“剃牦牛”本身却充满乐趣。

为什么“剃牦牛”令人着迷?

“剃牦牛”之所以有趣,是因为它触及了工程师的核心驱动力:

  • 从无到有创造事物的喜悦。
  • 发现并解决问题的快感。
  • 深入知识链条,理解事物运作机制的探索欲。

即使非工程师,也会受到“亲手打造所需之物”这一想法的吸引。Frederick P. Brooks Jr. 在《人月神话》(The Mythical Man-Month)中总结了编程之所以有趣的几个原因:

  • 创造事物的纯粹喜悦。
  • 为他人创造有用事物的喜悦。
  • 用相互关联的活动部件组装复杂、类似拼图的对象,并观察内置规则微妙循环运行的着迷感。
  • 持续学习的喜悦。
  • 使用灵活、易于处理的表达媒介工作的喜悦。

历史案例:Donald Knuth 与 TeX

TeX 系统的诞生是“剃牦牛”最著名的成功案例之一。

1976年,斯坦福大学教授 Donald Knuth 正在准备《计算机程序设计艺术》第二版。他希望沿用第一版的热排字技术,但该技术已不再可用。他对当时的替代方案不满意,偶然看到 Patrick Winston 的新书采用了数字排字,深受启发,决定自己构建一个数字排字系统。

为了写一本书,Knuth 做了以下事情:

  • 创建了编程语言 WEB(一种将文档与代码混合的“ literate programming ”范式)。
  • 开发了编译器工具 WeaveTangle
  • 设计了 Knuth-Plass 换行算法
  • 设计了 Computer Modern 字体。
  • 创建了定义矢量图形的语言 METAFONT
  • 开发了设备无关的输出格式 DVI

TeX 的构建耗时近十年,书籍也相应延迟出版。但这并非徒劳,TeX 如今已成为社会科学、科学和工程领域广泛使用的排版系统(其宏包 LaTeX 更是大众常用)。

结论:失败与学习的辩证关系

虽然 Knuth 的故事是极端成功的案例,但大多数“剃牦牛”的行为最终会失败。人们往往因为沉没成本(觉得已投入的时间太珍贵)或过程本身的乐趣而难以停止。有时,当意识到“我到底在做什么”时,兴趣消退,或资源耗尽,项目才会终止。

然而,对于学习者而言,“剃牦牛”具有极高的价值。

  • 计算机科学课程往往要求学生进行一定程度的“剃牦牛”,即使这并非教授的本意。
  • 深入挖掘任务背后的知识体系,往往比完成主要指令收获更多。
  • 例如,如果想通过“剃牦牛”的方式构建一个计算系统,就必须学习布尔逻辑、逻辑电路、计算机体系结构、编程语言和操作系统等广泛知识(参考 Noam Nisan 和 Shimon Schocken 的《计算机系统的要素》)。

因此,即使从未到达终点,只要在“剃牦牛”的过程中学到了东西,这一过程本身就具有极高的意义。

关键要点

  • 定义:“剃牦牛”(Yak shaving)指为达成目标而执行一系列连锁任务,导致偏离初衷、陷入无关琐事的现象。该术语源于 MIT AI 实验室,灵感来自卡通片《Ren & Stimpy Show》。
  • 成因:工程师对定制自由的追求、证明技能的欲望,以及客户/管理者对现有方案能力的误解,常导致团队选择“从零构建”而非使用现成方案。
  • 风险:在预算和时间有限的项目中,盲目自研可能导致陷入无休止的细节纠缠,最终放弃核心目标。
  • 驱动力:“剃牦牛”之所以吸引人,是因为它满足了创造欲、解决问题的好奇心以及持续学习的乐趣,这与《人月神话》中描述的编程乐趣高度一致。
  • 经典案例:Donald Knuth 为了解决书籍排版问题,从零构建了 TeX 系统,并在此过程中发明了 WEB 编程语言、Knuth-Plass 算法、METAFONT 等,虽耗时十年,但成果影响深远。
  • 学习价值:尽管大多数自研项目会失败,但对于学习者而言,“剃牦牛”是极佳的学习
查看原文 →parksb.github.io