为何调试代码的“修驴蹄”过程竟如此令人上瘾
速览
文章以“修驴蹄”这一比喻,形象地描述了软件开发中处理细碎、看似无关紧要的技术问题的过程。尽管这些任务往往枯燥且耗时,但许多开发者却从中获得了意想不到的满足感和乐趣。这种心态反映了技术人员在面对复杂系统时,通过解决微小障碍来推进整体进度的独特心理体验。
AI 深度解读
但“剃牦牛”很有趣:从零构建的诱惑与陷阱
背景
在软件工程和技术开发领域,存在一种普遍现象:工程师或团队往往倾向于“从零开始”(Build from scratch)构建解决方案,而不是直接使用现成的工具或框架。这种现象的根源复杂,既包括工程师对定制自由度的追求、对个人技术的证明欲,也包含客户或管理者对现有解决方案能力的误解,或是认为现有方案无法精确满足特定需求。
然而,这种倾向往往伴随着巨大的隐性成本。在资源(时间、预算)有限的前提下,盲目追求完全自研可能导致项目偏离核心目标,陷入无尽的细节纠缠中。这种现象在技术社区中有一个著名的隐喻——“剃牦牛”(Yak shaving)。
核心内容
什么是“剃牦牛”?
“剃牦牛”是一个源自 MIT AI 实验室的术语,由博士生 Carlin Vieri 创造。它描述的是一种为了达成单一目标,而不得不执行一系列看似相关实则逐渐偏离初衷的任务链,最终导致完全忘记最初目的,甚至陷入与目标毫无关联的琐事中的过程。
该术语的灵感来源于动画片《Ren & Stimpy Show》中的一集“牦牛剃毛日”(Yak Shaving Day)。在这一集中,主角 Ren 和 Stimpy 为了庆祝假期,试图通过某种魔法仪式召唤一只剃了毛的牦牛。这一荒诞的情节让 Vieri 感到新奇。几天后,当他在深夜处理繁琐的行政文书工作(如获取管理员权限、开设 DHL 账户、寻找邮局)时,他向同事抱怨自己正在“剃牦牛”。随后,这一短语在实验室中流传开来。
为了形象地解释这一概念,文中引用了两个经典的例子:
-
LangDev IRC 中的例子:
- 我需要一把斧头来砍树。
- 斧头太钝了,所以我去找磨刀石。
- 听说某个村庄有极好的磨刀石。
- 我需要一头牦牛带我去那个村庄。
- 牦牛的毛太长了,所以我开始给它剃毛。
-
企业家 Seth Godin 的例子:
- “我今天该洗车了。”
- “哦不,水管坏了,我得去 Home Depot 买根新的。”
- “但 Home Depot 在塔潘兹大桥的另一边,我要过收费站,所以我需要 E-ZPass(电子不停车收费系统)。”
- “等等!我可以借邻居的 E-ZPass……”
- “但 Bob 不会借给我,除非我儿子还回他借走的枕头。”
- “那个枕头掉了很多牦牛毛,我不能直接还回去,我得用牦牛毛重新填充它。”
- 结果,为了洗个车,我最后竟然在动物园里给牦牛剃毛。
作者的个人经历:一个静态网站生成器的诞生
文章作者分享了自己的博客构建历程,完美诠释了“剃牦牛”的过程:
- 起初尝试使用 Jekyll、Hugo 或 Gatsby 等静态网站生成器,但觉得自定义自由度不够。
- 决定自建博客,最初直接用 HTML 写文章,发现极其不便。
- 于是构建了一个系统,允许以 JSON 文件形式撰写文章。
- 发现 JSON 处理长篇文章依然 awkward(别扭),于是开发了一个将 Markdown 转换为 HTML 的服务。
- 接着又构建了编译和部署这些文件的工具。
- 结局:为了写博客,作者最终从零开始构建了一个静态网站生成器。
工程中的误区与理性决策
作者指出,无论是生产环境还是玩具项目,大多数项目都面临预算和时间的限制。如果选择“从零构建”,很容易陷入“剃牦牛”的陷阱:一旦开始,就难以预料终点在哪里,最终可能放弃原始目标。
在这种情况下,正确的做法是找到一个能满足核心需求的替代方案,并尽可能削减工作量。然而,尽管存在风险,“剃牦牛”本身却充满乐趣。
为什么“剃牦牛”令人着迷?
“剃牦牛”之所以有趣,是因为它触及了工程师的核心驱动力:
- 从无到有创造事物的喜悦。
- 发现并解决问题的快感。
- 深入知识链条,理解事物运作机制的探索欲。
即使非工程师,也会受到“亲手打造所需之物”这一想法的吸引。Frederick P. Brooks Jr. 在《人月神话》(The Mythical Man-Month)中总结了编程之所以有趣的几个原因:
- 创造事物的纯粹喜悦。
- 为他人创造有用事物的喜悦。
- 用相互关联的活动部件组装复杂、类似拼图的对象,并观察内置规则微妙循环运行的着迷感。
- 持续学习的喜悦。
- 使用灵活、易于处理的表达媒介工作的喜悦。
历史案例:Donald Knuth 与 TeX
TeX 系统的诞生是“剃牦牛”最著名的成功案例之一。
1976年,斯坦福大学教授 Donald Knuth 正在准备《计算机程序设计艺术》第二版。他希望沿用第一版的热排字技术,但该技术已不再可用。他对当时的替代方案不满意,偶然看到 Patrick Winston 的新书采用了数字排字,深受启发,决定自己构建一个数字排字系统。
为了写一本书,Knuth 做了以下事情:
- 创建了编程语言 WEB(一种将文档与代码混合的“ literate programming ”范式)。
- 开发了编译器工具 Weave 和 Tangle。
- 设计了 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 等,虽耗时十年,但成果影响深远。
- 学习价值:尽管大多数自研项目会失败,但对于学习者而言,“剃牦牛”是极佳的学习
