(本文最初发表于Wolfram的博客.)
要制作一个真正适合的大型软件系统并不容易。但这非常重要。因为它使整个系统不仅仅是各部分之和。它赋予系统无限的可能性,而不仅仅是一堆特定的特性。
但这很难实现。它需要在各个领域保持多年的一致性和连贯性。但我认为我们在这方面做得很成功Mathematica.我认为这实际上是未来最重要的资产之一Mathematica.
这也是我个人深入参与的事情的一部分。
自从21年前我们开始开发它以来,我一直是它的首席建筑师和首席设计师Mathematica的核心功能。特别是对Mathematica6在美国,有大量的设计工作要做。事实上,我认为甚至比为Mathematica1.
事实上,我刚刚意识到在这十年的发展过程中Mathematica6、并且在最后加速——我总共花了大约1万个小时做我们所谓的“设计评审”Mathematica6、努力把所有那些新功能和功能块都整合进去Mathematica尽可能的干净和简单,把所有的东西都放在一起。
至少我是这样做的,做软件设计很像做基础科学。
在基础科学中,一个人从一堆现象开始,然后试图深入挖掘,找出它们背后的东西——试图找到根本原因,最根本的东西,发生了什么。
好吧,在软件设计中,一个人从一堆功能开始,然后需要深入挖掘,以找出到底需要什么样的最终原语来支持它们。
在科学领域,如果一个人能很好地找到基本原理,那么他就能有一个非常广泛的理论,不仅包括他开始研究的现象,还包括很多其他的现象。
在软件设计中也是一样。
如果一个人在寻找原语方面做得很好,那么他就可以构建一个非常广泛的系统,它不仅提供了他最初考虑的功能,而且还提供了更多的功能。
多年来,我们已经开发了一个相当好的设计审查流程。
我们从一些特定的新功能领域开始。然后我们得到一个函数的粗略描述——或者其他我们认为需要覆盖它的东西。然后我们开始进行设计分析这一艰巨的工作。试图找出覆盖该区域的正确基本原语是什么。这些简洁、简单的函数代表了正在发生的事情的本质,它们相互配合,并与其他部分配合Mathematica,以满足需要。
很久以前,我经常独自做设计分析。
但是现在我们公司到处都是有才能的人。焦点是我们的设计分析小组,他们与我们在特定领域的专家一起工作,开始提炼可能的设计过程。
但在某些时候,我总是参与其中。所以任何核心功能Mathematica都是我个人设计的评价。
我有时会想,我这样做是不是太疯狂了。但我认为让一个人最终审查所有事情是确保整个系统真正具有连贯性和一致性的好方法。当然,当这个系统大到Mathematica6、达到我的完美水平需要花费很长时间——大约1万个小时。
设计评审通常是两到二十个人的会议。(他们几乎总是通过网络会议,而不是面对面。)
大多数时候,我们都有一个初步的实现。有时候,参加设计评审会议的人会说:“我们认为我们已经大致解决了这个问题。”有时他们会说"我们不知道如何设置;我们需要你的帮助。”不管怎样,通常情况下,我一开始会尝试已经创建的内容,然后就涉及的整个领域提出很多很多问题。
有时候有点奇怪。接下来的一小时,我会集中思考数论函数的高等数学。接下来的一个小时,我将集中讨论我们应该如何处理世界各地城市的数据。或者我们应该如何设置最通用的外部控制设备接口。
但是,尽管主题非常不同,原则在某种程度上是相同的。
我想了解最基本的东西——看看基本的原语应该是什么。然后,我要确保这些原语的构建,使它们尽可能地适合于整个现有的结构Mathematica所以它们尽可能容易让人们理解和使用。
这通常是一个非常折磨人的过程。逐步打磨,直到它们尽可能的干净和简单。
有时我们开会的时候,事情看起来很复杂。许多函数使用一些奇怪的新构造,并具有各种奇怪的参数和选项。
很明显,我们必须做得更好。但要弄清楚到底是怎么回事往往非常困难。
通常会有一系列渐进的想法。然后是一些大的转变——这些转变通常来自于对真正的核心功能的更清晰的理解。
我们经常会在其他地方讨论一些先例Mathematica.因为我们越能让我们现在设计的东西像以前做过的东西Mathematica越好。
有几个原因。首先,这意味着我们正在使用以前在其他地方测试过的方法。
第二,因为这意味着我们现在所做的将更好地适应已经存在的东西。
第三,因为它意味着那些已经熟悉其他事物的人MathematicaDoes会更容易理解我们添加的新内容。
但一些最困难的设计决策与何时打破先例有关。我们现在做的事情什么时候和以前做过的事情有真正的不同?什么时候它才会足够新颖和庞大,以至于有必要为它创建一些主要的新结构?
至少在我们做设计评审的时候Mathematica对于核心函数,我们总是有一个非常明确的最终目标我们想要写参考文档-“功能页”-我们一直在讨论的内容。
因为该文档将为最终的实现以及函数的最终定义提供规范。
它的工作方式几乎都是一样的:我在电脑上打字,其他人通过屏幕共享观看我的屏幕。我会写每个函数的参考文档。我会问每一句话:“这真的正确吗?”它真的应该这么做吗?”人们会指出我们所说的这个或那个问题。
这是一个很好的过程,我认为它能很好地集中和捕捉我们在设计分析中所做的事情。
在设计评审中会发生的一件事是我们最终确定函数的名称。
命名是一个典型的设计评审过程。它需要深入研究,尽可能清晰地理解一个函数真正做什么,以及它真正是关于什么。然后找到一两个完美的词来抓住它的本质。
这个函数的名字应该对使用这个函数的人足够熟悉这样他们就会马上知道这个函数是干什么的。但这已经足够普遍了,它不会限制人们对这个函数的理解。
不知何故,这个名字的结构也必须传达出这个功能应该有多广泛。如果它相当专门化,那么它应该有一个听起来专门化的名称。如果它非常宽泛,那么它可以有一个更简单的名字——通常是一个更常见的英语单词。
我对候选人的名字总有个测试。如果我设想造一个句子来解释这个函数的作用,那么这个提议的名字会符合这个句子吗?还是说名字为X的函数做了一些被描述为Y的事情?
有时,我们需要花几天的时间来为一个函数取一个正确的名字。但通常人们知道什么时候是对的。它恰好吻合。人们可以马上记住它。
在Mathematica6、函数命名的典型情况是操作.
想出这个名字花了很长时间。
我们创造了这个伟大的功能。但它应该叫什么呢?接口?激活?动态?生活?
什么?
接口可能看起来不错,因为毕竟它创建了一个界面。但这是一种特殊的界面,不是通用的。
激活也许是好事,因为它能让事物活跃起来。但同样的,它太普通了。
动态:这听起来又太笼统了,也有点太专业了。不管怎样,我们想用这个名字其他的东西.
生活这是一个非常令人困惑的词。当人们读到它时,甚至很难解析它。上面写的是"让它活起来"还是"这是有生命的东西"还是什么?
一段时间后,人们意识到必须更清楚地理解这个伟大的新函数在做什么。
是的,它正在创建一个界面。是的,它使事物活跃,有活力,有活力。但实际上,最重要的是,它提供了一种方法控制某物它连接旋钮和开关等,让一个人控制几乎任何东西。
那么像这样的词呢控制?还是很难理解。事物本身是一种控制吗?还是它在施加控制?
处理?同样,这太难理解了。
利用?好一点。但还是有些模糊。而且绝对是马的主题。
轭?那只幸存了好几天。但最后,公牛的笑话战胜了它。
然后来了操作.
一开始,我的反应是,“哦,这个词太长了,不能用在这么重要的功能上。”
但根据我的经验,用一个相当长的词来形容一个功能如此之多的函数通常“感觉不错”。当然,也有人开玩笑说这听起来像是“操纵”。
但是当我们继续讨论这个函数时,我们开始调用它操作在我们自己。每个参与对话的人都知道这意味着什么。当我们继续开发它的所有细节功能时,它似乎仍然适合。它给人一种正确的感觉,那就是控制某件事,让某件事发生。
这就是操作而得名。它工作得很好。
然而,在发展中Mathematica6、我们必须为将近1000个函数命名。每个名字都要姓,就像Mathematica1持续。
有时候,函数应该调用什么是相当明显的。
也许它有一个标准的名字,比如在数学或计算机领域,比如规范或StringSplit.
也许它适合一些现存的姓氏,比如ContourPlot3D.
但大多数时候,每个名字的发明都需要做很多很多的工作。每一个都是一个基本概念的最小表达Mathematica实现了。
不像人类的语言会随着时间的推移而增长和变异,Mathematica必须一劳永逸地定义。这样它就可以被实现,这样计算机和使用它的人都可以知道其中的一切含义。
随着Mathematica系统的发展,在某些方面变得越来越难进行设计。因为每一个新加入的东西都必须适应越来越多已经存在的东西。
但在某些方面,它也变得更容易了。因为有更多的先例可以借鉴。但最重要的是,因为我们(我认为我个人已经)在设计上做得越来越好了。
并不是结果的质量发生了很大的变化。更重要的是,我们在解决设计问题方面变得越来越快。
今天出现的一些问题,我可以在几分钟内解决——但我记得20年前,解决类似的问题需要几个小时。
多年来,出现了不少“老栗子”:我们无法解决的设计问题。在这些地方,我们无法找到一种清晰的方式来添加某些特定的功能Mathematica.
但随着我们在设计方面做得越来越好,我们已经解决了越来越多的问题。动态交互性就是一个很好的例子。事实上,Mathematica6号已经解决了很多问题。
进行设计评审并确定其功能设计Mathematica是一种最令人满意的智力活动。它的主题非常多样化。在某种意义上,它总是非常纯粹。
它涉及到大量的基本思想,并研究如何将它们整合在一起,以创建一个连贯的、有意义的系统。
这当然和我所知道的任何科学研究一样困难。但在很多方面,它更有创造力。人们并不是在试图破译世界上存在的东西。人们试图从零开始创造一些东西——建立一个自己可以在其中工作的世界。
我使用Mathematica6每一天。每天我都在使用无数的设计理念,让所有的部件都能顺畅地结合在一起。
我意识到,是的,这1万个小时的设计评论是值得花费的。即使只是对我来说,我们在其中所做的将会为我节省无数的时间,让我能够做更多的事情Mathematica这样就容易多了。
现在我很期待我们开始做的所有设计评审Mathematica7,Mathematica8…
截至2019年,我们已经达到Mathematica版本12(这也是Wolfram语言版本12),其中,内置6000多种功能.