“I just chose words carefully”

来源:HackerNews
# "I just chose words carefully":代码命名背后的技术哲学

在软件开发领域,有一句广为流传的谚语:"计算机科学中只有两件难事:缓存失效和命名。"(There are only two hard things in Computer Science: cache invalidation and naming things.)当我们谈论代码质量时,往往首先想到算法复杂度、架构设计或性能优化,却常常忽略了最基础也最关键的环节——**词汇选择**。

最近在 HackerNews 上引发热议的一篇文章 *"I just chose words carefully"*(我只是仔细选择了措辞),恰好切中了这一被忽视的技术实践。作者通过多个实际案例展示了:优秀的软件设计并非来自高深的技巧,而是源于对每一个变量名、函数签名和错误提示的精心打磨。这种"措辞优先"的编程哲学,正在重新定义我们对代码优雅性的理解。

## 核心内容

### 1. 语义精确性优于注释
传统的编程教学鼓励我们"写清晰的注释",但更好的做法是**让代码自我解释**。作者举了一个典型例子:与其写 `// calculate total price with tax`,不如直接将函数命名为 `calculateTotalPriceIncludingTax()`。精确的长名称胜过模糊的短名称加注释,因为注释会过时,而名称是代码的契约。

### 2. 消除语境依赖的歧义
在复杂的业务系统中,同一个词汇往往有多个含义。比如 `user` 可能指系统用户、当前登录者或数据库记录。作者建议采用**语境前缀模式**:
- `authenticatedUser` 而非 `user`
- `rawUserData` 而非 `data`  
- `userRepository.findById()` 而非 `user.get()`

这种"防御性命名"策略能显著降低代码审查时的认知负荷。

### 3. 错误信息的用户视角
技术团队常犯的一个错误是用实现细节描述异常。对比以下两种错误提示:
- 技术视角:`"JSON parsing failed at line 42"`
- 用户视角:`"We couldn't read your configuration file 'settings.json' because it contains invalid formatting on line 3"`

后者虽然长了几个单词,但直接指向解决方案。措辞的选择决定了调试效率。

### 4. 布尔值的肯定性命名
对于布尔变量,作者强调应避免否定式命名(如 `isNotValid`),而选择肯定式(`isValid`)。这不仅是语法习惯,更关乎逻辑可读性。`if (!isNotValid)` 的双重否定比 `if (isValid)` 多消耗 50% 的认知资源。

## 技术分析

从认知心理学角度看,这种"措辞优先"的方法符合**认知负荷理论**(Cognitive Load Theory)。人类工作记忆一次只能处理 4±1 个信息组块。当代码命名含糊时,大脑需要额外的"解码"过程,占用本应用于理解业务逻辑的心智资源。

在架构层面,精确的词汇选择实际上是**领域驱动设计**(DDD)中"通用语言"(Ubiquitous Language)的微观实践。当开发者在代码中使用与业务专家完全一致的术语时,技术实现与业务模型之间的不匹配(Impedance Mismatch)自然消解。例如,在电商系统中,使用 `fulfillOrder()` 而非 `processOrder()`,因为它准确对应了业务流程中的"履约"概念。

此外,现代 IDE 的自动补全和类型推断技术,已经消除了"长变量名影响编码速度"的顾虑。研究表明,开发者阅读代码的时间远多于编写时间(比例约为 10:1),因此投资在命名上的时间具有极高的 ROI。

## 实践建议

对于希望在团队中推广这一理念的开发者,建议采用以下实践框架:

**命名前的"三问法"**:
1. 这个名字在六个月后的代码审查中是否依然清晰?
2. 如果删除所有注释,新同事能否通过名称理解意图?
3. 这个词汇是否与产品经理使用的业务术语一致?

**建立团队词汇表**:
创建一个 `GLOSSARY.md` 文件,统一关键概念的英文表达。例如明确规定:
- `fetch` 用于远程数据获取,`get` 用于内存访问
- `validate` 返回布尔值,`assert` 抛出异常
- `temp` 禁止作为变量名(临时变量也需要描述其临时保存的内容)

**代码审查中的"命名检查单"**:
- 检查缩写是否必要(`auth` vs `authentication`)
- 检查单位是否明确(`timeout` vs `timeoutInMilliseconds`)
- 检查动作是否完整(`handle` 是模糊词,应具体为 `parse`、`validate` 或 `transform`)

## 总结

在 AI 辅助编程日益普及的今天,"I just chose words carefully" 这一理念显得尤为重要。当机器可以生成代码骨架时,人类开发者的价值正转向更高层次的抽象与精确表达。好的命名不仅是代码风格问题,更是技术同理心的体现——它考虑的是下一个阅读这段代码的人,是在凌晨三点调试系统的工程师,是六个月后的自己。在这个意义上,仔细选择措辞不仅是一种技术实践,更是一种专业素养的彰显。