功能命名的诗意

近四分之一个世纪以来,我最认真承担的责任之一就是指导设计Mathematica.这部分涉及到建立基本原则,并在整个系统中维护统一和一致性。但在某种程度上所有的能力Mathematica必须用单独的内置函数来表示吗表格NestList-最终构成了整个系统。

这些函数中的每一个都封装了一些重复的计算工作——通常是由一些复杂的算法实现的。这3000多个函数中的每一个都需要一个名字。

我们现在是在一个(壮观!)的新版本的最后几周Mathematica上周,我花了一部分时间对系统中一些有趣的新领域进行最终设计审查。作为这些设计审查的一部分,我们正在确认和调整一些我们将用于新功能的名称。

功能的命名是一门奇怪而又困难的艺术——有点像一种最终抽象的诗歌形式。我们的目标是理解函数的概念和功能,并通过一个、两个或三个词(比如涟漪,或DeleteCases,或FixedPointList),这样当人们看到这些词时,他们就能立即对其功能有正确的认识。在普通诗歌中,即使是最简洁的形式,你也至少能得到一些词语来交流。在函数名中,通常最多可以得到三个。

有了足够的经验,有时可以很容易地为函数起一个小的名字。有时当你想到函数时,它甚至看起来很明显。但有时,它可能会花费大量的时间——与似乎无法解决的问题搏斗,将关于函数的所有内容都打包到一个小名称中。

这是一种不可原谅的、令人谦卑的行为。问题几乎都是一样的。你找不到一个好名字的原因是因为你不能真正完全和最终清楚地理解这个函数的功能。

有时这是因为功能设计得不太对。它有一些混乱的东西,在你能找到一个好名字之前,它必须被理清。

不过,当你最终解开它的时候,还是很令人满意的。这些天来,我通常与团队成员一起进行设计评审。当我们最终找到正确的名字时,电话里的每个人(是的,基本上都是打电话)都会马上说:“哦,对了,就是这个。”我们都觉得自己花了一个小时,或者不管多长时间,仅仅想出了一个或两个单词有点愚蠢。

在普通的人类语言中,新词通常是通过某种形式的自然选择发展起来的。通常一个单词会由一个人介绍,也许一开始是一个短语。然后它传播开来,有时会有一点变化,要么变得足够流行,被广泛理解,对一般的交流有用,要么消失。

但对于计算机语言来说,模式必然是不同的。一旦引入了函数名(对应于语言中的“单词”),它就必须立即成为该语言的一个完整的、永久的元素。因为将编写包含该名称的程序,如果该名称被更改,它们都必须被找到并更新。事实上,在Mathematica在美国,我可以自豪地说,在近25年的时间里,很少有名字需要被修改——因此一个为Mathematica现在的最新版本仍然可以理解和执行1988年的1.0Mathematica

人类语言中的单词和计算机语言中的函数名还有另一个区别。在人类语言中,大多数单词都没有确定的终极、绝对的意义。相反,我们能做的最好的事情是——就像在字典里一样——通过将单词与其他单词联系起来来定义它们。

但是在计算机语言中,每个函数名最终都是指以绝对方式定义的特定功能块,并且可以由特定的精确程序实现。

不过,这通常并不会让函数名变得更容易。它只是意味着“正确名称”的概念更加清晰:一个人最有可能从这个名称中正确地了解函数的功能。

函数名在某种意义上是人机交流的终极点。在这些地方,所有的内部计算活动都必须与人类能够理解的东西相联系。当功能简单时,有图形和其他替代方案。但当功能多样化或复杂时,除了使用语言和事物名称的语言构造,我们不知道其他任何可能性。

中的函数名Mathematica基本上都是以英语为基础的,而且大部分都是由普通英语单词组成的。在普通的人类自然语言中,引入一个完全陌生的单词,并使其逐渐得到普及和理解是可能的。但在动态的计算机语言中——它们必然会突然引入新的名称——人们别无选择,只能利用人们对人类语言的现有理解,比如英语。

当我们想到函数名的时候Mathematica今天,在某种意义上,它们不仅仅是基于“原始英语”。它们还依赖于意义网,而意义网是通过已经存在的数千种其他功能发展而来的Mathematica

对于特定类型的名称的含义有明确的约定。(以列表生成列表;函数以图像操作图像;函数以找到进行某种搜索;等等。)在语言的典型用法中,名字往往会以各种方式一起出现。在语言和系统中有明确的概念框架和隐喻。(指重复函数应用;指嵌套结构的扁平化;动态指动态交互性;等等。)

在普通的人类语言中,自然选择无疑往往倾向于遵循特定模式的词语。例如,有时一致性可以使单词更容易记住;有时不一致会让它们更突出,从而更容易记住。但是,并没有一个宏大的计划来以一种特定的方式组织这些单词:比如避免使用模糊的意思“占用”较短的单词,或者让单词以一种特定的方式更容易分类。

但是当我们引入函数名的时候Mathematica我们既有能力,也有责任去设计一切。当然,发展Mathematica是渐进的,在任何给定的时间,我们只能预见到一定数量的事情将会发生。但是,我仍然煞费苦心地以最好的方式为每个新功能命名。

有哪些标准呢?

首先,必须利用人们现有的知识和理解。如果有一个熟悉的名字已经被广泛使用,那么如果有可能,就必须使用它。

当然,有时这个名字可能只在某些特定的领域为人所熟知。它可能非常短——也许只有一个字母——如果没有进一步的背景就无法理解。在这种情况下,我们通常做的是Mathematica就是在名称中嵌入某种程式化的上下文。例如,菲涅耳积分S(x)有个名字菲涅耳Mathematica.)

在构建Mathematica在美国,我们有一个长期存在的原则,那就是尽量使每个功能都具有普遍性——这样它就能适用于尽可能广泛的情况。但是,有时候,一个函数会有一个特定的、熟悉的用法。但是,如果函数的名称只反映了这个用途,那么就忽略了函数。因为如果没有一个更通用的名称,人们就不会想到把它应用到其他场合。(例如,它是列表,不是“vector”,它是,而不是“外积”。)

实际上,函数命名的责任之一就是函数的名称在很大程度上直接决定了人们对函数的看法。如果他们被名字引导到一个特定的方向,那将是他们使用函数的方向。

甚至名字的“质感”对于让人们正确地思考功能也很重要。一个复杂的函数应该有一个复杂的名称(比如DynamicModuleEventHandler).一个简单、通用的函数应该有一个简单的名称(比如长度总计).完成清晰但不寻常的任务的函数应该有一个意外的名称(比如线程通过).

现在在Mathematica关于如何命名函数有很多先例。我们总是尽可能地遵循这些先例。首先,因为它们通常代表了我们现在试图解决的命名问题的良好解决方案。第二,因为通过遵循它们,可以保持一定的一致性,从而使系统更容易发展,使人们更容易学习系统,并猜测他们不知道的功能。

为一个函数,当一个人发现一个好名字会发生的一件事是,当人们听到这个名字,他们能成功地“解压缩”成一句话描述的函数必须常常实际上仅仅通过使用函数的名称作为一个句子的主要部分。事实上,当我们试图为一个函数找到一个好的名字时,我通常会建议我们试着写一个句子来描述这个函数的功能——我们可能会在文档中心为函数,然后压缩到块,我们需要的名称本身。

函数命名的一个令人痛苦的方面是,无论您如何巧妙地使用它,它都不可能完美。我经常说,唯一完全一致的语言是什么都不做的语言。一旦有实际的功能要表示,就不可避免地会出现尴尬的情况和角落。例如,希望在系统的每个区域中保持一致的简单性。但是在这些区域的重叠处却存在着不一致。

有时我们会遇到英语的局限性:一个概念没有任何熟悉的词或短语,也许是因为这个概念对我们的经验来说是新的。在这种情况下,人们通常必须做的就是——就像自然语言一样——想出一个类比。

我们所考虑的一些类比和隐喻一开始就相当野蛮和古怪。但最终它们会变得更温顺播种收获是扩展地名的语言基础的重要途径Mathematica

要是像英语就好了Mathematica——具有这样的特征:一个特定的词只表示一个特定的东西,或者至少是一类东西。但事实并非如此。一个单词可以充当不同的词类,也可以有迥然不同的意思。通常在实际的英语用法中,可以通过上下文来消除歧义。

但是在单个函数名的微小长度中,没有这个选项。这通常意味着人们不得不拒绝一些很棒的单词,只是为了避免它在英语中的另一种用法可能造成的误解。(例如,“Live”或“Active”不能作为候选词动态-他们太容易被误解了。)

如果幸运的话,一本同义词典(这些天Wolfram | Alpha)会给出一个词,既表达了相同的概念,又避免了潜在的误解。但有时,人们不得不重新安排整个名称的结构,以避免误解的可能性。

然而,在所有这些判断调用之后,在所有这些努力明确一个函数的作用之后,我们必须得出一个结论:我们必须确定一个明确的名称。这将很好地代表功能以及为实现它所做的所有工作。这将作为一个永久的句柄,人们可以通过它访问一些功能Mathematica

我不知道在过去的四分之一个世纪里我花了多少时间想出这些名字Mathematica.每一篇文章都包含了一些想法,一些创造性的概念——冻结在一小段文字中。像小诗。成千上万的。

15个评论

  1. 我记得我对《播种与收获》的介绍感到非常惊讶。不过我想,他们的名字都很了不起,尽管我自己也在想,他们会不会出生在一个不像伊利诺斯州那样以农业为业的地方。

  2. 应该有一个TallyBy函数

    匿名
  3. 的确,Wolfram研究人们花几个小时和小时适当的符号名称的选择,还有他们的参数,以及如何处理输入和输出的特殊情况,什么是最稳定的,当看到相对于其他符号名称。我认为(通常)这是一个很好的选择。如果比较M中的符号名和传统语言(Java、c#、c++、Fortran等)中类(及其成员)中使用的名称,就会发现M中的符号名仍然是最系统和一致的。这些传统语言中的一些名字和命名习惯给我带来的感觉从轻微的咯咯笑到彻底的大笑。在M中也有一些错误的选择,但他们是诚实的。总而言之,我们必须使用一种自然的语言来命名函数/符号,这就是问题所在。如果您想使用正确的名称来描述它所做的事情,您仍然受到英语语言所能提供的限制。

  4. 引用Phil Karlton的名言:“在计算机科学中只有两件难事:缓存失效和命名。”

  5. 这篇博文让我想起了一句名言:

    在计算机科学中只有两件困难的事情:缓存失效和命名事物。

    菲尔Karlton

    约翰·S。
  6. 给东西命名是件很困难的事,
    这不仅仅是你的节日游戏之一……

    艾略特

    Dreiss
  7. @Alfonso, @John:我听过这句话的一个版本,“在计算机科学中只有两件事是困难的:缓存失效,命名和偏离一个错误。”

  8. 你把命名和诗歌比较,真有意思。它立刻让我想起了保罗·狄拉克的轶事:

    奥本海默当时在Göttingen工作,伟大的数学物理学家狄拉克有一天找到他说:“奥本海默,他们告诉我你在写诗。我看不出一个人如何能在从事物理学前沿工作的同时写一首诗。他们是对立的。在科学领域,你要用每个人都能理解的语言,说出一些以前没人知道的东西。在诗歌中,你一定要表达一些大家都已经知道却没有人能理解的东西。

    里克•布莱恩
  9. 这篇博文让我想起了一句名言:
    在计算机科学中只有两件困难的事情:缓存失效和命名事物。
    菲尔Karlton

  10. 给东西命名是件很困难的事,
    这不仅仅是你的节日游戏之一……
    艾略特

  11. 给东西命名是件很困难的事,
    这不仅仅是你的节日游戏之一……
    艾略特

  12. 应该有一个TallyBy函数

  13. 给东西命名是件很困难的事,
    这不仅仅是你的节日游戏之一……

    艾略特

  14. 这篇博文让我想起了一句名言:
    在计算机科学中只有两件困难的事情:缓存失效和命名事物。

  15. 给东西命名是件很困难的事,
    这不仅仅是你的节日游戏。

Baidu