引言:为什么我们(以及 AI)总是在 Who 和 Whom 之间纠结?
如果你曾经在写英文技术文档、Commit Message 或者给海外客户发邮件时,对着键盘犹豫不决,不确定该用“Who”还是“Whom”,那么请放心,你并不孤单。事实上,即便到了 2026 年,在 AI 编程助手(如 Cursor、Copilot)普及的今天,这依然是自然语言处理(NLP)中一个极具挑战的“边界情况”。
这两个词不仅让非英语母语者感到头疼,就连许多大语言模型(LLM)在缺乏上下文时也会生成看似通顺但语法错误的输出。这种混淆并非毫无缘由——它们发音相同,拥有共同的词根,甚至在口语中“Whom”正逐渐被“Who”取代。然而,作为追求极致专业度的开发者,我们在撰写正式的架构设计文档(RFC)、API 规范说明或商务合同时,准确使用“Who”和“Whom”是体现语言素养和技术严谨性的关键细节。
在这篇文章中,我们将不仅仅停留在语法层面,而是结合 2026 年最新的Vibe Coding(氛围编程)理念,从主谓逻辑、代词替换法到实际的代码解析,带你像调试一段遗留代码一样,彻底理清这两个代词的使用规则。
第一部分:理解核心——主格与宾格的逻辑映射
要掌握“Who”和“Whom”,我们需要回到英语语法的最基础概念:主格与宾格。对于我们这些习惯于面向对象编程(OOP)的开发者来说,这两个概念其实非常直观:
#### 1. Who 是动作的执行者
“Who”是主格代词。你可以把它想象成代码中的主动调用者或主线程。它指的是执行动作的人或事物。当你想要询问“是谁发起了这个请求?”时,你就在使用“Who”。
关键点: “Who”总是与动词紧密相连,作为动作的发出者。它就像异步操作中的 Promise 的发起者。
#### 2. Whom 是动作的承受者
另一方面,“Whom”是宾格代词。想象一下函数调用中的参数或回调函数的接收者。它通常出现在动词或介词之后。当你想要询问“这个异常被抛给了谁?”或“你处理了哪个 User Object?”时,你应该使用“Whom”。
关键点: “Whom”并不执行动作,而是承受动作,或者是介词结构的一部分。
第二部分:实战技巧——像工程师一样判断
仅仅理解定义是不够的,我们需要在“高频交互”的开发环境中快速做出判断。让我们来看看几个经过实战验证的技巧,这也是我们教给 AI 模型以提高其语法准确性的 Prompt 逻辑。
#### 技巧一:“He/Him”代换法(类型检查)
这是判断该用哪个词的最简单、最有效的方法,类似于在代码中进行类型检查。我们将疑问句暂时转化为陈述句,看看代词应该变成什么形式:
- 尝试用“He”或“She”(主格)代换:如果句子读起来通顺,就使用 Who。
- 尝试用“Him”或“Her”(宾格)代换:如果句子读起来通顺,就使用 Whom。
记忆小窍门: “Him”和“Whom”都以字母“m”结尾。只要你想到 Him,就想到 Whom。这就像我们在命名变量时,利用后缀来区分类型一样。
#### 技巧二:简化句子结构(最小复现)
在复杂的英语长句中,修饰成分(干扰项)往往会干扰我们的判断。为了准确定位代词的角色,我们可以尝试在脑海中精简句子,只保留最核心的主语、动词和宾语(SVO)结构。这与我们在 Debug 时通过注释掉部分代码来定位 Bug 的思路是一致的。
#### 技巧三:介词提示法(语法高亮)
在英语中,介词后面必须跟宾语。因此,当你看到“with”、“to”、“for”、“by”、“from”等介词位于疑问代词之前时,这通常是一个强烈的信号,提示你应该使用“Whom”。例如,“To whom…”、“With whom…”。在代码中,这就像是方法调用 INLINECODE619eafd6 中的 INLINECODE26988cc8 参数。
第三部分:代码视角的深度剖析
现在,让我们通过具体的例子来演练上述技巧。我们将把每个句子像拆解代码一样进行分析,看看语法是如何运作的。我们将引入一些 Python 伪代码来辅助理解句子的语法树结构。
#### 示例 1:基础主语识别
例句: [Who/Whom] wrote this algorithm?
代码化思维分析:
# 我们正在寻找一个 subject,也就是这个动作的发起者
Subject = Unknown
Verb = "wrote"
Object = "this algorithm"
# 测试代换逻辑
if Subject == "He": # "He wrote this algorithm" -> 语法正确
return "Who"
elif Subject == "Him": # "Him wrote this algorithm" -> 类型错误,Him 是 Object
raise SyntaxError("Subject required")
- 分析步骤:
1. 我们需要确定是“谁”执行了“写”这个动作。
2. 应用代换法:这句话等同于“He/She wrote this algorithm.”
3. 因为“Him wrote…”听起来是错误的,而“He wrote…”是正确的。
4. 结论: 应该使用 Who。
- 最终句子: Who wrote this algorithm?
#### 示例 2:介词宾语识别
例句: You were speaking to [who/whom]?
代码化思维分析:
# 这是一个介词结构,寻找介词的宾语
Preposition = "to"
Object_of_preposition = Unknown
# 测试代换逻辑
if Object_of_preposition == "him": # "I was speaking to him" -> 逻辑通顺
# 记得我们的口诀吗?Him 和 Whom 都有 ‘m‘
return "Whom"
else:
return "Who"
- 分析步骤:
1. 这句话中有一个介词“to”。代词是“to”的宾语。
2. 应用代换法:我们在心里把它变成“I was speaking to him.”
3. 记住我们的口诀:Him = Whom(都以 m 结尾)。
4. 结论: 应该使用 Whom。
5. 进阶说明:在正式英语中,我们通常将介词前置,变成“To whom were you speaking?”,但在口语或非正式写作中,将介词后置也是可以接受的,但依然要求使用 Whom。
- 最终句子: You were speaking to whom?
第四部分:深入剖析复杂从句(代码示例)
让我们看一个带有复杂定语从句的例子。这类情况在技术写作中尤为常见,也是最容易出错的“边界情况”。
#### 示例 3:复杂从句的简化
原始复杂句: The developer [who/whom] we interviewed yesterday will join the team.
代码化思维分析:
# 定义一个函数来解析这个从句
def analyze_clause(relative_pronoun):
clause = "we interviewed yesterday"
subject = "we"
verb = "interviewed"
# 我们正在寻找 interview 的宾语
# 也就是 "interviewed (someone)"
target = relative_pronoun
# 代换测试
sentence = "We interviewed " + target.pronoun
if target == "him":
return "Whom" # 宾格
else:
return "Who" # 主格 (错误)
- 简化分析:
1. 从句部分是“we interviewed yesterday”。
2. 从句的主语是“we”,动词是“interviewed”。
3. 我们需要知道空格处的词是“面试”这个动作的执行者还是承受者。
4. 简化重组:“We interviewed (him/her).” -> 我们面试了他。
5. 再次应用 Him/Whom 口诀。
6. 结论: 应该使用 Whom。
- 最终句子: The developer whom we interviewed yesterday will join the team.
#### 示例 4:更深层的句法分析(陷阱警告)
原始复杂句: I need to know [who/whom] is responsible for the database failure.
陷阱警告: 很多同学看到“know”就认为是宾语,从而选 Whom。这是错误的。这就像在多线程编程中误判了变量的作用域。
代码化思维分析:
# 句子结构:Main Clause + Subordinate Clause
Main_Clause = {
"Subject": "I",
"Verb": "need to know",
"Object": "整个从句的内容" # 这里不知道具体是谁,所以不能因为跟在 know 后面就选 Whom
}
Subordinate_Clause = {
"Subject": Unknown, # 这才是我们要填的词!
"Verb": "is",
"Adjective": "responsible for the database failure"
}
# 核心逻辑:判断从句内部的主谓关系
if Unknown == "He":
# "He is responsible..." -> 主格结构成立
return "Who"
else:
# "Him is responsible..." -> 语法报错
return None
- 正确分析:
1. 这里的“who/whom”实际上引导了一个从句:“is responsible for the database failure”。
2. 在这个从句内部,代词是“is”的主语。
3. 即使整个句子结构复杂,我们要看的是从句内部的关系。
4. 测试:“He is responsible…” -> 通顺。“Him is responsible…” -> 错误。
5. 结论: 必须使用 Who。
- 最终句子: I need to know who is responsible for the database failure.
第五部分:2026 前沿视角——AI 辅助与多模态开发
在 2026 年的今天,我们的开发环境已经发生了巨大的变化。我们不再仅仅是单纯的写作者,而是AI 辅助系统的指挥家。理解“Who”和“Whom”的区别,在以下几个前沿技术领域有着意想不到的应用价值:
#### 1. Vibe Coding 与 AI 结对编程
在使用 Cursor 或 GitHub Copilot 等工具进行“氛围编程”时,清晰的主谓逻辑直接决定了 AI 生成代码的准确性。想象一下,你正在给 AI 写 Prompt 来生成一个数据库查询:
- 模糊的指令: "Show me the users who the manager hired."
* AI 可能困惑:是 INLINECODEfea0658e 作为主语执行了 INLINECODEd1452db2,还是 INLINECODEcc7fd43f 被动接受了 INLINECODE28120d87?
如果主从句逻辑混淆,AI 可能生成错误的 SQL JOIN 条件。*
- 精准的指令: "Show me the users whom the manager hired."
* 明确的信号:Whom 告诉 AI(以及阅读代码的同事),users 是动作的承受者。
* AI 生成逻辑更准确:SELECT * FROM users WHERE id IN (SELECT user_id FROM hires WHERE manager_id = ...)
最佳实践: 在写 Prompt 时,正确的语法不仅仅是礼貌,更是为了减少 AI 的“幻觉”,确保生成的上下文准确无误。
#### 2. LLM 驱动的技术文档生成
我们现在经常使用 Agentic AI(自主 AI 代理)来自动生成 API 文档。如果你在代码注释或 Commit Message 中混淆了 Who 和 Whom,AI 在解析这些非结构化数据时可能会产生歧义,特别是在涉及权限控制和审计日志的场景下。
- 场景: "The user who/whom granted access…"
* 如果是 Who:User 是授权者。
* 如果是 Whom:User 是被授权者。
在自动生成 RBAC(基于角色的访问控制)策略时,这种语法上的微小差异可能导致权限配置的灾难性错误。因此,语法即安全。
第六部分:生产环境中的最佳实践与性能优化
在工程实践中,我们不仅要知其然,还要知其所以然。以下是我们在实际项目中总结的“技术规范”。
#### 1. 正式 vs 非正式语境的权衡(技术债务的考虑)
我们必须承认,语言是在演变的。在现代英语口语和许多非正式的书面交流(如 Slack 消息、代码注释)中,“Who”正在逐渐取代“Whom”。
然而,作为专业人士,请遵循以下原则:
- 正式场合: 在RFC(征求意见稿)、法律合同、官方技术博客中,必须严格区分。使用错误的 Whom 可能会让你显得不够专业,甚至产生法律歧义;而正确使用 Whom 则展示了你精准的语言驾驭能力,类似于编写了无 Bug 的核心代码。
- 非正式场合: 代码注释、内部 Wiki。如果你用了 Who 来代替 Whom,没人会指责你,但这可能被视为一种“技术债务”。
#### 2. 常见陷阱与容灾处理
- “Guess who” 的特殊情况:
* 语法解释: 这是一个省略句,全句其实是“Guess [the person] who is at the door.”
* 在这里,代词在从句中作主语(is at the door),而不是 Guess 的宾语。因此,标准用法确实是“Guess who?”。这是一个许多母语者也说不清道不明的固定搭配,但我们可以看到语法逻辑依然站得住脚。
- 不要过度纠正:
有时候,为了避免用错 Whom,人们会生硬地把句子改得很别扭,就像为了追求设计模式而过度封装代码一样。
糟糕的写法:* "The employee whom the manager fired is angry."(虽然语法正确,但略显拗口)
更好的写法:* "The manager fired the employee, and he is angry."(清晰,直接,易读)
在编写技术文档时,清晰永远是第一原则。如果使用 Whom 会让句子变得难以阅读,不妨考虑重组句子结构。这也是敏捷开发中“可工作的软件优于详尽的文档”这一原则在写作上的体现。
总结
掌握“Who”和“Whom”的区别,就像是编程中理解变量作用域一样,虽然细微,但对代码(语言)的准确性至关重要。回顾一下我们的核心武器:
- 角色定义:Who 是主语,Whom 是宾语。
- He/Him 大法:用 He 对应 Who,用 Him 对应 Whom(记住那个 m)。
- 代码化思维:遇到长难句,先剥离修饰语,找到核心动词,就像我们 Debug 时剥离复现步骤一样。
下次当你再次敲击键盘,面对这两个选项时,不要去猜。稍微停下来,做一个简单的代换测试,或者想一想如果是 AI 解析这句话,它会怎么理解主谓结构。你会发现,正确的答案其实一直就在你的逻辑之中。保持好奇,持续练习,在这个 AI 遍地的时代,你将不仅能写出正确的英语句子,更能深刻理解其背后的逻辑之美,成为真正的“全栈”沟通者。