第 1 章 · 02 造轮子 vs 用轮子:不冲突的两件事


第 1 章 · 02 造轮子 vs 用轮子:不冲突的两件事

本节摘要:有人一听说「造轮子」就警惕:「你是让我不用 Bash 自己造个 Shell?你是让我不用 Git 自己写个版本控制?生产怎么办?」这是对造轮子最大的误解。本节要破除这个误解:造轮子是学习手段,用轮子是生产手段,两者不仅不冲突,反而互相促进。你造一个 Shell 是为了理解 Shell,造完之后日常仍用 Bash——但从此你看 Bash 的眼神不一样了:每个设计决策你都能说清来由。

内容来源:基于「Build your own X」索引的方法论整理。

学习目标

阅读完本节,你应当能够:

  1. 破除「造轮子=排斥成熟工具」的误解。
  2. 说清造轮子(学习手段)与用轮子(生产手段)的分工。
  3. 解释为什么「造一遍」反而让你「更会用」成熟工具。
  4. 理解成熟工具的价值:凝聚了无数被验证的设计决策。

一、学习价值:这个误解不破除,你走不进本书

「造轮子」(reinventing the wheel)在工程语境里常带贬义——「别重复造轮子」是名言,意思是「有现成的成熟工具就用,别自己重写」。这句话在生产环境完全正确。

但本书讲的「造轮子」是另一个语境——学习。学习的造轮子,与生产的「别造轮子」,是两件不冲突的事。它们的分工是:

  • 生产用成熟工具:上线项目用 Bash、Git、Nginx、MySQL,因为它们经过千万用户验证,稳定可靠。
  • 学习造简化版:为了理解原理,从零造一个简化版 Shell/Git/服务器,功能不全但揭示机制。

混淆这两者,要么会「学习时不敢造,怕重复」(错过理解原理的机会),要么会「生产时沉迷自造,不用成熟工具」(重复劳动、踩坑)。本书针对的是前者——鼓励你在学习时大胆造,理解之后再回到生产用成熟工具。

二、认知拆解:造一遍让你更会用

造轮子有个反直觉的好处:造完之后,你用成熟工具反而更得心应手。

以 Shell 为例(本书第 2 章)。你日常用 Bash,但可能从没真正想过「为什么 ls | grep | wc 能串起来」「为什么 cd 是内建命令而非外部程序」。当你亲手造一个 Shell,实现 fork+exec、管道、重定向之后,再回到 Bash:

  • 你看到 A | B,脑中浮现「A 的 stdout 接到 B 的 stdin,通过 pipe 系统调用」。
  • 你看到 cd,明白它必须是内建(否则改的是子进程的目录,Shell 自己不变)。
  • 你写 Shell 脚本(姊妹篇《Linux 命令》第 9 章)时,对变量展开、信号、退出码的理解完全不同——因为你造过这套机制。

「懂原理」让你从「记忆命令」升级为「推导命令」——忘了某个选项,你能从原理推出来;遇到陌生命令,你能从机制猜出它的行为。这种能力,只有「造过一遍」才能获得。

成熟工具为什么值得用

既然你能造,为什么生产还要用成熟的?因为成熟工具凝聚了你造简化版时会跳过的无数细节:

  • 边界情况处理:你的迷你 Shell 跑 ls 没问题,但跑复杂的命令组合、处理各种引号转义、兼容不同终端……Bash 处理了几十年积累的所有边界。
  • 性能优化:你的迷你数据库能用,但在百万级数据、并发写入、崩溃恢复上,SQLite/MySQL 投入了巨大优化。
  • 安全加固:你的迷你 Web 服务器能响应请求,但防 XSS、处理慢连接、TLS 加密……Nginx 替你处理了这些。

成熟工具的「重」不是缺点,而是「这些细节都帮你处理了」的代价。学习时造简化版理解原理,生产时用成熟工具享受这些细节——两者各得其所。

三、行动建议:造完之后回到成熟工具,对比体悟

本书每章带你造一个简化版,造完之后,做这个练习:

  1. 造你的简化版(如迷你 Shell、迷你 Git)。
  2. 回到成熟工具(Bash、Git),用它做同样的任务。
  3. 对比体悟:成熟工具哪里比你做的强?它处理了哪些你没考虑的细节?你能否从原理理解它为什么那么设计?

这个「造 → 用 → 对比」的循环,能让你对成熟工具的理解指数级加深。你不再是「盲信工具」,而是「理解后选择」——知道每个工具为什么这样设计、它的能力边界在哪。

本节要点回顾

  1. 「造轮子」分两个语境:学习的「造简化版」与生产的「别重复造」;两者不冲突,分工不同。
  2. 造一遍让你更会用成熟工具——「懂原理」让你从「记忆命令」升级为「推导命令」。
  3. 成熟工具的价值在细节:边界情况、性能、安全,这些是简化版会跳过的。
  4. 「造 → 用 → 对比」循环:造简化版理解原理,回到成熟工具,对比体悟细节。

推荐上手顺序

  1. 选本书某一章(如第 2 章造 Shell),跟着导读造一个简化版。
  2. 造完后,回到 Bash,用它跑相同任务(如 ls | grep | wc)。
  3. 观察 Bash 处理了哪些你的简化版没考虑的细节(引号、复杂管道、信号)。
  4. 问自己:「我现在能解释 Bash 的每个行为吗?」——能,就达到了本节的目标。

下一节讲怎么挑一个「造得起」的项目——本书的难度梯度与时间预算。

作者与出处
来源:codecrafters-io
许可证:CC0-1.0
整理人: 灏天文库整理
由灏天文库结构化整理,提供目录导航、全文检索与在线阅读,便于系统化学习
发布者: 作者: 转发
评论区 (0)
U