- SignalDesk2 days ago
chouheiwa, 快 10 年开发经验了 查看知乎原文 动态规划这个名字,是 1950 年为了骗过国防部长才想出来的。 这不是段子。Richard Bellman [1] 在自传里自己写过这段,Stuart Dreyfus 后来专门写过一篇文章 [2] 复述。他当时在 RAND 做多阶段决策过程的研究,经费来自空军,顶头上司、国防部长 Charles Wilson 对 research 这个词有种病态的恐惧和厌恶: a pathological fear and hatred of the word "research" 对研究这个词有种病态的恐惧和厌恶。 看到数学两个字更是如此。所以他得挑两个既不像研究、又没法被当成贬义的词凑在一起。dynamic 听着动感十足,programming 在当时指排程和规划,跟写代码没关系。两个词一拼,经费保住了,期末考试从此多了一道让人头大的题型。 这种事在计算机领域是成批出现的,而且成批到能编一份表。下面这份表是我把出处一条条查回去之后排出来的,每条只回答四件事,这词唬在哪,内核是什么,谁起的,值不值。前半按出生年份走,后半是反过来的例子,名字最朴素,坑最深。 动态规划 字面唬人在于动态和编程两个词都指向某种复杂的运行时机制。内核是把大问题拆成子问题,算过的记下来,下次直接取。递推公式加一张备忘表,本科生一节课能讲完。 命名动机前面说了,纯粹是预算政治。有意思的是这个名字的副作用一直延续到今天,programming 在 1950 年指规划,在 1960 年之后指写程序,词义漂移之后,每一届学生第一次听到这个词都会先误解一遍,然后被老师纠正一遍。 一个为了通过审查而起的名字,让后面七十年的人多绕了一道弯 。 蒙特卡洛(感谢 @潘蕊 提供) 听起来像某种高深的随机过程理论。内核是拿随机数去撞一个算不出来的答案,撞的次数够多,统计出来的比例就逼近真值。求圆周率的经典做法是往方框里乱撒点,数一数落进内切圆的比例,乘以四。 名字来自摩纳哥的赌场。Nicholas Metropolis 1987 年在 Los Alamos Science 上写了一篇回忆文章 [3] ,讲这套方法在洛斯阿拉莫斯诞生的过程,其中有一句是他本人交代命名经过: I suggested an obvious name for the statistical method. 这个统计方法该叫什么,我当时提了个一想就通的名字。 紧接着他交代了为什么一想就通,因为斯坦·乌拉姆有个舅舅老是找亲戚借钱,理由是他非去蒙特卡洛不可。这套方法当时是曼哈顿工程的机密,需要一个代号,赌桌和随机抽样又天然搭得上,名字就这么定了。乌拉姆自己在自传里说,最初的念头是他生病期间玩单人纸牌时冒出来的,他想算清楚一局牌能赢的概率,发现硬推算不动,不如多发几把牌数一数。 这条和动态规划配成一对 ,两个名字都不是从技术内涵里长出来的,一个躲审查,一个当代号。 人工智能(感谢 @刀刀刀 ) 这份表里名字和内核落差最大的一条,因为它压根就不是为了描述内核起的。 1955 年 8 月,John McCarthy 联合 Marvin Minsky、Nathaniel Rochester、Claude Shannon 向洛克菲勒基金会提交了达特茅斯夏季研究项目的申请书,这是这个词第一次出现在纸面上,申请书里写的是一次两个月十个人的人工智能研究。当时这类研究通常归在控制论名下,而控制论是隔壁 MIT 的 Norbert Wiener 立起来的招牌。McCarthy 后来解释过为什么要另起一个词: I wished to avoid having either to accept Norbert Wiener as a guru or having to argue with him. 我不想要么把维纳供成祖师爷,要么天天跟他吵。 这个词的起点是划界线,划完界线才轮到定义。它被起得足够宽,宽到几乎任何自动化的计算机系统都能往里装,这个副作用一直延续到今天的融资材料里。 更麻烦的是它的边界会自己往后退。Douglas Hofstadter 1979 年在《哥德尔、艾舍尔、巴赫》里把一条观察命名为特斯勒定理,说人工智能就是那些还没被做出来的事。Larry Tesler 本人在个人网站上澄清过 [4] ,这句他被引错了,原话是智能指的是机器还没做到的那些事。 下棋做成了就改叫搜索,认图片做成了就改叫模式识别,补代码做成了就改叫自动补全。 一个每做成一件事就把自己缩小一圈的词,衡量的是人的预期,不是机器的能力 。 宏 字面上像某种宏大的机制。内核是在编译之前做文本替换,你写一行,预处理器把它换成很多行,编译器从头到尾没见过你写的那个名字。 macro 取自希腊语的大,指的是一条指令展开成一大片,跟宏观没关系。Doug McIlroy 1960 年在 CACM 上发的那篇论文 [5] 把条件展开、嵌套定义、递归定义这些能力系统地讲了一遍,GNU m4 的手册 [6] 至今把它列为这条技术线的源头,同页还提到 Alan Perlis 在 1950 年代就主张宏语言应该跟被处理的语言解耦。 值不值这一栏它及格。文本替换和函数调用的区别是实打实的,展开发生在编译前还是运行时,决定了你能不能在里面写类型、能不能调试、报错指向哪一行。 这个词切出来的界线,是很多人被 C 的宏坑过之后才真正理解的 。 拜占庭将军问题 听起来像军事史。内核是分布式系统里有一部分节点会发出互相矛盾的错误消息,剩下的节点还得达成一致,结论是只用口头消息时,忠诚节点得超过三分之二。 Leslie Lamport 1982 年那篇论文 [7] 之前,这个问题已经被研究过了。他在个人主页上写过一段自述 [8] ,说得非常直白: The main reason for writing this paper was to assign the new name to the problem. 写这篇论文的主要目的,就是给这个问题换个新名字。 第一版他想叫阿尔巴尼亚将军问题,理由是当时阿尔巴尼亚比较封闭,不会有人跳出来抗议,同事 Jack Goldberg 提醒他世界各地都有阿尔巴尼亚人,才换成拜占庭。他还提到这种给问题套故事的做法是跟 Dijkstra 学的,哲学家就餐问题火了之后大家都发现,故事比公式好记。 这条是全表里最坦诚的一个,作者自己承认论文的主要贡献是改名 。 布隆过滤器 名字像某种精密的信号处理装置。内核是一个位数组加几个哈希函数,判断一个元素肯定不在集合里,或者可能在,有假阳性,没有假阴性。 命名毫无玄机。Burton Bloom [9] 1970 年在 CACM 上发了篇讲空间和时间取舍的论文,后人拿他的姓当了名字。这一类还有 Merkle 树、Paxos、Raft,前者是姓氏,后两个是地名和缩写。 用人名地名命名是最诚实的一种,它不承诺任何东西,也就不会误导任何人 。 生成器(感谢 @pyduck ) 名字暗示某种能凭空造东西的装置。内核是一个会中途停住的函数,停住的时候局部变量和执行到哪一行全都原地冻着,下次调用从断点接着往下跑。 Python 这套东西的规格书是 PEP 255 [10] ,2001 年由 Neil Schemenauer、Tim Peters、Magnus Lie Hetland 提出。文档里对冻结这个词给了明确定义,说的是所有局部状态都保留下来,包括局部变量的当前绑定、指令指针、内部求值栈,存下来的信息足够让下一次调用从原地继续。PEP 里也交代了灵感来源,一支来自 Icon 语言,一支来自 CLU 的迭代器,也就是 Barbara Liskov 那一系。 值不值这一栏它及格。生成器和返回列表的函数在内存占用上差着一个数量级,这个区分是真实存在的。 这个词的毛病是取偏了重点,它描述的是产出的动作,稀罕的能力其实是停下来 。 依赖注入 这词是 Martin Fowler 定的。James Shore [11] 2006 年写过一篇很短的博客吐槽它,那句评价流传至今: a 25-dollar term for a 5-cent concept 25 美元的词,讲的是 5 分钱的概念。 内核 [12] 是把对象需要的东西传给它,而不是让它自己造。写 iOS 的时候这件事每天都在做, init(networkClient:) 里把 client 传进去,不在类里直接 new 一个。这行代码在 Swift 里没人觉得需要专门起个名字,可它一旦被叫成依赖注入,就自动获得了一层架构感,能进面试题,也能撑起一整个框架的存在理由。 同一批还有幂等性、最终一致性、心跳、租约、背压。说白了都是一句话能讲完的东西,印在简历上却比实际内容值钱不少。 面向对象 造词的人后来自己不认账了。Alan Kay 在 1997 年 OOPSLA 的演讲里说过一句 [13] 很有名的话,大意是这个词是他造的,而他当时想的东西跟 C++ 完全不是一回事: I did not have C++ in mind. 我脑子里想的可不是 C++。 他强调的核心一直是消息传递,词流行开之后,全世界理解的面向对象变成了类和继承。同一格里还有 MVC,发明者 Trygve Reenskaug 自己说过 [14] ,整件事里最难的部分是给几个组件起名字,最早叫 Model-View-Editor,反复讨论才定成现在这个,1979 年 12 月那份原始技术备忘录 [15] 还能查到。 造词的人管不住词的去向,这是命名这件事最大的风险 。 四个从别处借来的词 剃牦牛 [16] 说的是连环前置任务,你想做 A,发现得先做 B,做 B 之前又冒出来一个 C。词是 MIT AI Lab 的 Carlin Vieri 造的,灵感来自 1991 年动画片《Ren & Stimpy》里的剃牦牛日片段,他后来回忆过 [17] 当时觉得那集实在太古怪。 自行车棚 [18] 出自 Parkinson 1957 年的琐碎定律,委员会花五分钟批准核反应堆,花一小时争论棚子用什么材料,讨论时间跟金额成反比。 货物崇拜编程来自 Feynman 1974 年在加州理工那场演讲 [19] ,岛民用椰壳做耳机、竖竹竿当天线,仪式做全了,飞机不来。 海森堡 bug [20] 借的是测不准原理,指那种你一加日志它就消失的 bug。这个词常被算到 Jim Gray 1985 年那篇论文头上,其实 ACM 的出版物里 1983 年就出现过,Gray 只是让它出了名。 这四个词的共同点是,它们描述的现象原本没有名字,起了名字之后才变得可讨论 。 注意力机制 名字自带认知科学的暗示,好像模型真的在关注什么。它的计算过程写出来只有一行。 把输入投影成 Q、K、V 三份,拿 Q 和 K 算相似度,softmax 归一成一组加起来等于 1 的权重,再拿这组权重给 V 做加权平均。换句话说,三次矩阵乘法加一次 softmax,末了做个加权求和,没了。学术论文里也是这么写的,这篇 [21] 直接把注意力描述成对输入 token 原始嵌入做的加权平均,另一篇 [22] 讲得更细,输出就是所有 value 的加权平均值。 词嵌入 同样带光环。PyTorch 官方文档 [23] 的定义一点都没打算装: A simple lookup table that stores embeddings of a fixed dictionary and size. 一张简单的查找表,存着固定词表大小和维度的向量。 源码 [24] 里那个类的第一行 docstring 也是这句。 emb = nn.Embedding(vocab_size, dim) # 一张 vocab_size × dim 的表 emb(torch.tensor([5])) # 取第 5 行,就这一件事 数学上它等价于 one-hot 向量乘嵌入矩阵,工程上就是一次数组下标访问。 训练过程让这张表变得有意义,取值这一步本身没有任何智能可言 。 KV Cache 这个倒是把答案直接写在名字里了,还是有不少人当它是什么推理黑科技。Sebastian Raschka 手撸过一遍 [25] 给人看,NVIDIA 官方的推理优化博客 [26] 讲得更实在,自回归生成时每一步都要重算之前所有 token 的 K 和 V 张量,那不如把它们在显存里存下来。缓存,标准得不能再标准的缓存。 值不值这一栏它是及格的。这个词把推理阶段的显存占用和吞吐圈成了一块可讨论的区域,没有它,工程师得每次重复描述一遍那个重算过程。 BPE 今天大家把它当分词算法,它最早是个压缩算法。Philip Gage 1994 年在 The C Users Journal 上发了篇讲数据压缩的文章 [27] ,做法是反复找出现频率最高的相邻字节对,用一个没被用过的字节替换掉,直到压不动为止。2016 年 Sennrich 等人那篇 ACL 论文 [28] 把它搬到机器翻译的子词切分上,原文 [29] 里写得很清楚,这是一项简单的数据压缩技术,他们只是拿来做词的切分。 一个 1994 年的压缩算法,成了今天所有大模型的入口 。这条也说明,术语的难度和它在系统里的位置没什么关系。 Agent 这一批里最被高估的词。骨架是一个循环,模型生成一轮,判断要不要调工具,要就执行,把结果塞回上下文,再走一轮,直到模型说不用了为止。 Anthropic 那篇 Building Effective Agents [30] 给的定义就是这个意思,模型自己决定流程走向和工具调用,跟提前用代码写死路径的 workflow 区分开: LLMs dynamically direct their own processes and tool usage. 模型自己掌控流程和工具怎么用。 同一篇里那句更值钱的话是,最成功的实现都没用复杂框架,用的是简单可组合的模式。Simon Willison 当时专门推荐过这篇 [31] 。我在 拆 Claude Code 工具系统那篇 里看到的实际代码,也是这个骨架。 值不值这一栏它及格,因为 agent 和 workflow 的区分对应两种完全不同的失败模式和成本结构, 多智能体协调那篇 里我算过这笔账。 MCP Anthropic 2024 年 11 月开源 [32] 的这个协议,官方文档 [33] 拿 USB-
- 情报分类:工作与职业机会
- 分类依据:内容涉及招聘、求职或职业发展
- 信息来源:资讯 / 知乎日报
- 发布时间:2026/9/17 07:21:47
- No replies yet