NeXT 上的 Lotus Improv
Lotus Improv 把数据透视表和一套完全不同的电子表格模型带到了 NeXT,随后跟着平台一起消失。Christopher Drum 在模拟器里把它跑起来,梳理了它当年做对的地方。
中文
复制

人们提起它时语气虔诚,像念咒语一样念叨它,把它当作计算机史上“未曾走过的路”之一低声传颂。拥趸们写下溢美之词,在 YouTube 上发布吹捧式的评测,为它在市场上折戟而扼腕,各自给出理由解释它为何没能点燃世界。可以说,Lotus Improv 的传说至今不灭。把时间拨回 1988 年前后,站在 Steve Jobs 的位置上,不难理解他为何会对我们今天称作“数据透视表”的早期雏形一见倾心。NeXT 当时正苦苦寻找自己的市场,急需能让人为买一套系统掏钱的独占软件。“也许 Improv 能像当年 VisiCalc 成就 Apple II 那样成就 NeXT,”Jobs 心里多半闪过这个念头。把 Improv 做成 NeXT 独占,似乎正是对公司那个挥之不去的问题——NeXTWORLD Magazine 创刊号提出的“Why NeXT?”——一个清醒而前瞻的回答。

NeXTWORLD Magazine 主编 Michael Miley 的首篇专栏“Black Box”。答案的 TL;DR 是:NeXT 是一种“新型计算机”,一台“人际计算机”,第一台从底层开始就为“协作计算”而打造的机器。
NeXT 和 Improv 都针对各自所处时代的计算难题给出了创新解法。NeXT 让害怕终端的人也能接受 UNIX,在百万像素显示器上首度推出 Display Postscript,还让为这套系统开发软件变得轻而易举。Improv 则重新思考了多维数据建模,提供类英语的公式,让人能随心所欲地重排数据视图。两者的骨架都留存至今。NeXT 的操作系统 NeXTSTEP / OPENSTEP 演变成了 macOS,进而衍生出 iOS。Lotus 很快就放弃了 Improv,但随手看一眼今天的表格软件就会发现,数据透视表已被普遍采纳。即便在今天,它给人的感觉依然独树一帜,仍能完成其他表格软件无法如此优雅实现的数据操作。冲着它的传奇色彩,我觉得自己有种极客式的义务去爱它。然而……
历史背景

CIA 那张图出自这篇文章:https://www.msn.com/en-us/news/technology/the-hidden-debt-that-apple-owes-to-the-cia/ar-AA2avYYa
今天的机器
- 上一台:Windows 11 上的 v4.4
- NeXTstation Turbo
- 68040 CPU(可变时钟频率,约 40–50MHz)
- 128MB 内存
- 2GB 硬盘
- 单色「Megapixel」显示器
- NeXTSTEP 3.3
Lotus Improv Rel_ _1.0(v108r0)
开工吧
几件事凑到一起,终于到了该聊聊 Lotus Improv 的时候。第一,又到了一年一度的「国际电子表格日」。第二,Improv 最初是 NeXT 独占,在 Steve Jobs 逝世 15 周年(!)的今天,在这里看看这台机器也算应景。第三,不是我要自夸,这个博客刚好满一岁。当初决定做 Stone Tools 时,我心里有四款软件,Lotus Improv 是其中之一。准确地说,正是它第一次让我冒出「要是有个地方能聊这类东西就好了」的念头。第一篇写的 Deluxe Paint 也是那四款之一。还剩两款没写,尽管下注。

给喜欢看社会崩塌的人一个好消息:我开了一个预测市场,标的只有我自己。2027 年 2 月 9 日我会走多少步?周四之前我会把手上这本书读到第几页?明天我的两只袜子会是一对吗?!
麻烦在于,Deluxe Paint 我熟得不能再熟,提笔就能写,可对其他门类的生产力软件,我实在没什么实际经验。不先摸清 Improv 诞生时的环境,就不可能公正地评价它。于是我按兵不动。老天,我多想让你知道,为了写 Improv 我硬是憋了整整一年,这份自制力简直非人类。

把我想看到的未来显化出来。
我想大家都明白,Improv 既然是电子表格,求和、超越函数之类的数学运算自然不在话下。「它会算数!」既不足以说明它为什么存在,也撑不起它「NeXT 一代电子表格」的名号。所以我们换个方式认识它:看几个能体现它独有长处的例子,再照着 Improv 2.1 Revealed! 这本书的思路,建个模型玩玩地道的美国棒球——这项运动我既热爱,也完全看得懂。
NXIsle

NeXT 初创员工的临时工牌,用的是宝丽来照片。据我所知,唯一没找到的是 Susan Kare。RRAuction 第 4402 号拍品;这套照片在 2024 年 8 月以 1 的价格被狙击拍下。
史蒂文·保罗·乔布斯先生被逐出苹果又回归苹果的故事,还是交给产业史学者去讲更合适。我在时间线里提过一句梗概,如果你真想挖点猛料,今年正好出了一本书专讲这段。NeXT 的硬件口碑不错,但始终没成气候。从长远看,NeXT 工程真正的成果是 NeXTSTEP——它把 UNIX 干净利落地包进了一套清爽、易用、图形化的界面里。这相当了不起。

敬重前辈。DOOM 和万维网(图中是 Tim Berners-Lee 的第一台 Web 服务器)都诞生于 NeXT。
对我来说,真正让我走上编程这条路的是 NeXTSTEP/OPENSTEP 开发者工具背后的技术——Objective-C 和 Interface Builder,它们后来成了 OS X 的开发环境(在此致谢 Big Nerd Ranch 的 Aaron Hillegass Cocoa Bootcamp)。即便到了今天,在 iOS 和 Swift 问世多年之后,NeXT 的技术仍留在苹果软件的 Foundation 层里,那些以 NS 为前缀的类就是证据(Objective-C 时代的命名空间技巧)。

NSCapable。NXPlicable。NXCusable。我攒了一整张这样的清单,一个都用不上。
这次考察我用的是 NeXTSTEP 3.3,转向 OPENSTEP 之前的最后一个版本。NeXTSTEP 看起来、用起来都像一套现代系统,只是有些别致之处。只要你熟悉任何一套现代操作系统,尤其是 macOS,用它就不会起一身疹子。考虑到苹果合并后乔布斯似乎热衷于往 OS X 里加各种视觉花活,NeXTSTEP 显得相当朴素;这里没有任何东西称得上「lickable」。如果你曾好奇 Susan Kare 若有一块比初代 Mac 更大的画布和调色板(NeXTSTEP 是 2-bit)能做出什么,答案就在这里。我喜欢它。Dock 已经有了,只是比后来转到 OS X 时那种灵动活泼要僵硬得多。没有「精灵效果」,也没有动态放大;它始终在场,闲置时也不会自动隐藏。有些应用运行时 Dock 图标会变(比如 Mail),有些则不变(比如 Edit)。有个古怪的设计:Dock 靠图标格上没有三个点来表示应用正在运行。这个选择很奇怪——装饰的居然是未激活的图标。文件浏览给系统使用添了点复杂度。文件浏览器自带一个收藏夹迷你 Dock,当前选中项的路径用巨大的图标渲染出来,然后才是文件浏览器本体。拖动文件和文件夹只能用项目的全尺寸图标。比如你在列表视图里浏览时,就没法把列表项拖进文件夹或 Dock。这一条有点让人摸不着头脑。

所有应用的菜单都由一个可移动的垂直菜单处理。把菜单固定在某处,就为当前应用设定了它的位置,而每个应用都可以有自己的位置。理论上,你在应用之间来回切换时,菜单可能会到处乱跳。好在它也可以用右键在当前鼠标位置唤出;有点 RISC OS 的味道。另外,对喜欢 macOS 上旋转沙滩球的人来说有个好消息!它出现时你会感到那种小小的 ASMR 酥麻感,尤其是在彩色工作站上运行时。能让某样东西有“家”的感觉的,往往是些有趣的小事。

就连最初的 NX 前缀(NX 是 NeXTSTEP;NS 是 OPENSTEP)也像藤壶一样,仍附着在某些代码表面上。
说实话,适应 NeXTSTEP 时我最大的问题是鼠标。默认情况下,它用起来感觉很奇怪,有双层加速曲线,一层用于慢速移动,一层用于快速移动。当越过“慢”与“快”之间的阈值、另一条加速曲线介入时,光标会一下跳过大半个屏幕。除非把鼠标移得非常非常非常非常慢,否则我根本找不到光标。幸运的是,模拟器 Previous 有工具可以帮忙补偿(参见“磨砺石”一节)。

总的来说,你只需要时不时稍微调整一下思路,忘掉一些现代习惯,很快就能适应 NeXTSTEP。35 年过去了,它的外观和感觉仍然很像任何现代操作系统。几乎令人沮丧地像?也许那是另一个话题了。
Formula 1
问题:下面这张来自 Improv 的截图有什么有趣之处?

答案:它包含了为自己构建一份副本所需的全部信息。所有数据、公式、尺寸和关系都暴露在外、清晰可见。我指出这一点,并不是想说截图是分享 Improv 工作表的好方法,尽管你确实可以这么做;事实上,上面这张表就是从截图重建出来的。我想说明的是,在 Improv 的环境中,数据可以多么“可把握”。它的公式读起来很自然,值引用与表中的项目名称相匹配。这东西名副其实。让我们再更彻底地审视一下。要理解 Improv,就得忘掉我们对电子表格的既有认知。斜杠命令?没听说过。B1?J93?K12 = int(A14 * lookup(B2..B7))?疯子的胡言乱语。我们不用通用的字母数字列/行标识符,而是用特定于自己领域的“项目类别”来定义行和列。换句话说,我们不会断言“A 到 L 列代表月份,1 到 31 行代表日期”,而是创建一个名为“months”的类别,为它定义十二个项目,命名为“January”“February”等等;再创建一个名为“days”的类别,定义 31 个这样的项目。看看这些对比视频,它们展示了其中的差异。首先,我会用 LibreOffice Calc 创建一个月份/日期网格,给 January 1 赋一个值,并把 December 31 计算为 January 1 的倍数。
0:00
/0:47
下面是在 Improv 中创建同一张表的过程。有三点值得注意:顺序项如何生成、类别如何命名(对这个简单示例来说并非必需),以及公式如何创建和应用。
0:00
/0:42
要消化的东西很多,我知道。首先是新建的空白工作表只包含一个单元格,而不是一张由空单元格组成的无限表格。Improv 只处理我们定义的数据,且精确到所定义的范围。在 LibreOffice 那个例子里,我们给每列顶部加上标签,从而赋予列以含义,但那是为了我们自己方便,不是为了 Calc。如果我想重温经典的行列命名带来的那种温暖舒适的包裹感,我可以在 Improv 里建一个叫“columns”的类别,把项命名为 A、B、C 等,再建一个叫 rows 的类别,命名为 1、2、3 等。真要用这种平庸的方式处理类别和项,Improv 公式构建器的魔力也就被削弱了。底部面板存放着所有公式,它们按所定义的粒度、以显示的顺序应用。在示例中,我指定了 December:1 =,但同样可以指定 December = 来覆盖整个十二月。那一条公式会作用于十二月中的每一个列表项,既不需要把公式复制到每个单元格,也不需要为单元格引用设置绝对/相对标记。下面是前一张表的简单扩展。一月的每一天增加 10%,十二月对应的那一天则是一月数值的两倍。

公式 1 针对特定项 January,通过 THIS 取得每一项当前的 Day(在当前布局中视觉上显示为若干行 Days),再通过 PREV 向前跳一个单元格。说得更直白些,我们是在说:“一月中的这一天 = 一月中的前一天 * 1.1”。之后,我们更笼统地定义每个十二月的值等于其对应的一月值(“当前行”是隐含的)的两倍。
图中这两条公式就是整张工作表的全部公式。我想强调这一点:没有其他公式藏在单元格里、躲在视线之外、等着被选中或编辑时暴露出来。也没有按单元格复制的公式,让相对单元格引用逐个增加 * 1.1。我们只是引用类别(这里是“months”或“days”)、项(如“January”或“27”),或特定的交点(如“April:19”),并带上相对性标记 [THIS]、[PREV] 和 [NEXT]。你也许正在琢磨怎么钻这个系统的空子,怎么把它绕晕、搞糊涂。你为什么要欺负这样一个老程序呢?Improv 到底做错了什么,要受这种冷遇?“要是两个项重名怎么办?要是两条公式指向同一个单元格怎么办?”别担心,一切都会揭晓,而你会为自己试图迷惑这个老程序而感到应有的羞愧。

我用反白标出了三种情况:条目名有歧义、索引引用,以及公式解析有歧义。
在上面的例子里,我把其中一个 Days 改名为 “March”,这样引用 “March” 时就产生了歧义。“March” 现在指的是那个 Day 还是 Month?我们可以写明确,引用 Months:March。不过要注意,如果不写明确,Improv 会识破我们的把戏并指出来,就像公式 5 那样。在公式 2 里,我把 December:15 设为静态值 1000。在公式 3 里,我也把它设为按“对应 January 值的两倍”计算。注意这些公式上的“重叠”图标(两个相交的方块)以及单元格里的 Overlap 文字。点击重叠图标,我们就有机会通过明确选择该单元格应由哪个公式胜出来解决歧义。干净利落地处理公式歧义,最初被原型团队视为一个棘手的工程难题。摘自 Simson L. Garfinkel 的《Improv: The Inside Story》,NeXTWORLD,1991 年秋季刊:
Back Bay(Improv 的开发代号)小组认为,公式冲突的可能性是该程序的一个真实弱点。似乎没有办法自动解决冲突。 “Jobs 说‘这不是弱点,这是一个很棒的功能!’”Paul(Kleppner)回忆道。“用 1-2-3,你可以复制并覆盖掉一个公式。”Improv 能自动检测冲突并告知用户,这一事实本身就是一大进步。
就个人而言,我喜欢 Improv 的解决方案。我真心觉得更多软件应该非常笨,不要去揣测或猜测我想要什么。用清晰的语言告诉我问题所在,并提供最简单的工具,让我对问题的解决拥有最大的控制权。在帮助我时保持聪明,不要靠耍聪明来帮助我。
自己动手
在我们深入之前,我想确保记下 Improv 漂亮的帮助系统,它配有索引和搜索。考虑到为 NeXT 版本找到一本手册有多难,在我探索过程中能随时使用它,实在弥足珍贵。它插图整洁,对工具的描述简洁(有时过于简洁),并在必要时超链接到文档的其他页面。Improv 觉得它还能做得更好,于是把帮助做成了上下文相关的。
0:00
/0:26
Help 系统被调用时,默认显示当前在用户界面中选中对象的文档。这已经很有用,但配合上面视频演示的“Point for Help”就更强了。它把光标变成一个 ? 符号,点哪里,Help 窗口里就显示哪里的说明。这是个很棒的主意,因为我并不总是知道 Lotus 管某个界面小玩意儿叫什么,也就不知道该搜什么。现在我知道了:“Calc”按钮叫“Status Indicator”,偶尔冒出来的三角形图标叫“Formula Error Indicator”。Pork chop sandwiches.
不正确的上手方式
翻 Usenet 存档时,我看到至少有人把它叫作“厕纸”。Lotus 管它叫“item dispenser”。这是对今天习以为常的某种功能的一次有趣尝试,而且只存在于 NeXT 版 Improv 中。挺可爱,但透着一股刚拿到新开发玩具、兴奋过头的味道。

如果我们需要生成一列项目来填充数据的某个轴,这个工具会替我们生成顺序列表项。它会尽力“猜”我们的意图:输入“Sunday”,然后下拉 dispenser,一周七天的列表就自动生成了。接着我们“撕下”这个列表,项目就装进光标,再把它附着到某个已有项目上,把这一串列表项追加进那个类别。也就是说,我们得先有一个类别里至少存在一个项目,列表才能附上去。这很烦,因为那个已有项目多半和生成的列表毫无关系。我总得先做一个列表,附到某个已有项目上,再删掉那个原本无关的项目。如今我们可以直接在单元格里输入,再智能地把这个单元格扩展到相邻单元格。事实上,Lotus 后来把 Improv 迁移到 Windows 做 2.0 版时,就改用了这套做法。按住 ALT 拖动一个已有项目,效果相同。
0:00
/0:20
最初的 dispenser 确实是一个只有在 NeXT 环境中才可能被想出来的功能。开发者们被 Interface Builder 带来的 GUI 灵活性所激发,这一点我并不怪他们。在 OS X 10.2 早期,我也做过同样的事。它几乎是在恳求我们去摆弄各种 GUI 想法,把元素重新组合成新的配置。“First Responder”和“bindings”的拥趸们,出来报到!那个开发环境的一大优点在于,尝试各种想法时,“说一千次‘不’”是如此容易。Lotus 拥抱了这一点,在 NeXT 上迅速实现了当初在 OS/2 和 Microsoft 的 Presentation Manager 上一直受阻的进展。
许多 Improv 开发者都同意,用 Interface Builder 开发用户界面最棒的地方,不在于能快速设计出某一个界面,而在于能快速尝试大量界面。“它让我们得以开发出许多糟糕的 UI,”Pito 说。“我们有了一个想法,一个小时后就能把它放到屏幕上。”
“item dispenser”被单独点名为受益于 Interface Builder 的具体工具;在当时,确实没有什么东西能像它那样快速、迭代地进行 GUI 开发。事实上,我甚至可以说,今天也没有什么东西能与之相比,即便是 Apple 自己。

Apple 关于构建自定义系统栏的建议:如果可以,别做。左起第二位座谈小组成员显然没收到那份获批配色方案“蓝、黑、白、棕”的通知。
维度裂缝
Joel Spolsky 在编辑 The Best Software Writing I 时,为 Lotus Improv 加了一段个人附注,把它的失败归咎于此:“Improv 要求你为数据定义严格的 n 维超立方体。传统电子表格的灵活性一点都没有。”我想,如果非要把 Improv 描绘得最不堪,Spolsky 说得没错。实际用起来,它并不像他描述的那样令人难以接近。不过,我确实认为他触及了 Improv 始终未能打开局面的核心原因。现在,让我们集体捏住鼻子,潜入“n 维超立方体”这片可怕而阴森的水域,来给棒球建个模型。我们的第一个维度将是 Year。

用 item dispenser 生成一些年份条目。左下角那个原本叫「A」的默认分类,我已经改名为「Year」。
接下来加一个 League 维度。

重命名和添加的顺序随意。小键盘 Enter 会往分类里加一个空条目,这里就是 B2。
再往下走,粒度更细一点,加 Division。在内部,Improv 把我们的工作拆成三部分:数据、视图和公式。屏幕上看到的,只是 Improv 尽力把三维数据摊平成二维视图的结果。必要时 Improv 会往视图里补上额外的列,保证我们始终能看到数据关系的完整范围。

第三张截图里,我在 American 下面输入 West,按下 Enter 之后,对应的 National「Division3」列会自动同步更新。它们永远保持同步——这一点之后肯定不会坑到我,我确信。
现在加点胜负数据,转眼间我们就搭出了一个四维超立方体。怕了吗?由于我只建模到「Division」这一层,我打算把各分区的胜场就地相加来算总数,结果……嗯……「No dice」,棒球里都这么说(大概吧。棒球里真的有骰子吗?)

我加了 Record 维度,条目是 Win、Loss 和 Win Ratio。Format Panel 可以把比例设成百分比。给 Win Ratio 加一条公式后,所有 Win Ratio 单元格里都显示 Error,因为没有数据可算。我试着在一个单元格里写个简单等式补救一下,嘿,至少还有个 Explain 按钮告诉我哪里出了问题。
可惜啊可惜,单元格里只能填具体的数字、日期或文本;任何公式,哪怕再简单,都必须写进 Formula Panel(底部)。这种情况下,我可以写一条针对特定单元格的公式,比如 American:East:2020:Win = 40 + 33 + 32 + 25 + 24,但电子表格的意义就在于替我把这种破事自动化掉。看来最省事的办法是加一个 Teams 分类,把所有球队的胜场加起来,然后——等等……

不,等等等等,这根本不是我要的效果,真是见了鬼了!
该死,那个我信誓旦旦跟自己说不会把我炸飞的玩意儿,偏偏就炸了。这里我们看到了维度建模的缺点,至少对普通人来说是这样,对大多数典型的电子表格用户大概也是如此。它看起来像一张整洁的小图表,但"维度"这个词本身就描述并揭示了问题所在。要新增一个类别,它的条目就必然适用于所有其他类别。团队不是这样运作的;每个 League 和 Division 的团队都是各自独立的。不过我们也许有办法脱身。
分组思维
Lotus 的工程师显然明白,光靠类别是不够的。类别给数据强加了刚性,而真实数据并不总是那么规整。我们需要另一种方式来组织数据。分组是类别内部的、有名字的顺序条目集合。建一个类别,往里加一堆单独的条目。选中其中某个子集的一段连续条目,把它们归为一组,给这组起个独一无二的名字。等所有东西都分好组之后,组还能再分组,组组还能再……等等,我把自己绕晕了。组可以嵌套分组,就这样。

"clock"这个词每次都让我犯这毛病。Clock clock clock clock clock clock clock。受够了被人忽悠说这是个真词!
用"Teams"的时候,我们很快就撞上了分组的一个副作用,以及它如何可能需要在多个类别之间引发连锁反应。我想加团队并按"Division"分组,但这样一来我就不得不把"League"也做成一个组。原本的三个类别现在塌缩成了一个:"Teams"。实际效果是这样的。

我们仍然能享受公式中名称引用的好处,就像上面那个脱离现实的例子一样。对 East 的引用会同时作用于 American 和 National,除非我们像 National.East 和 American.East 那样用 . 来指定。分组可以用 groupsum() 函数来小计,你可以在下面这张数据更丰富的 2022 到 2026 年 MLB 统计图表中看到。不过要注意,我们的 Total 字段里 Percent 有冲突的风险,有两个公式在争夺同一个单元格计算的主导权。方便的 SKIP 关键字会按指定跳过(也就是"不把此公式应用于")组、单元格、条目和类别。

American 和 American West 的合计一致,因为我偷懒,只录了 American West 的数据。
分组让我们的数据结构更细、更具体,但每去掉一个类别,我们就离那个让 Improv 在极客心里盘踞几十年的特性更远一步。你知道我说的是什么。
没有 "Pito" 就拼不出 "pivot"
终于说到圈内人早就急着想聊的那件事了:"Lotus Improv 发明了数据透视表。Wikipedia 上就是这么写的。"以我目前对复古生产力工具的认知,我现在最多愿意承认的是:Lotus Improv 很可能发明了我们今天所理解的数据透视表。但就像 Yoda 故弄玄虚地跟一个本该早就知道的人暗示 Luke 有个妹妹一样,还有另一个程序——未来的 Stone Tools 选题——可能才配得上"第一个数据透视表"的名号。我行使"博客博主"的权利,把最终判决留到那时候。就今天的讨论而言,这个说法足够成立,而且发明者本人在 YouTube 上还有一段不错的视频,第一次向 Lotus 员工展示它。来认识 Pito Salas,数据透视表的发明者。
缩略图里的 Mike Wells 在 28:40 回答提问时透露,NeXT 居然有 "Objective Fortran" 和 "Objective Lisp" ?!?!
Salas 现已退休,当年在 Lotus Development 的 Advanced Technology Group 工作时提出了这个想法。他先拼出一个假版本,有点像幻灯片,展示他想实现的东西:类英语的公式、多维数据,以及可重新排列的数据视图。他拿到了继续推进的许可。"我描述的那些[想法]全是靠比划,"Pito 回忆道,"我根本不知道怎么把它做出来。"埋头苦干一年后,一个代号 "Back Bay" 的原型开始在美国巡展,让财务建模的人惊叹不已。看过的人都想要。我们来看看 Improv 是怎么处理透视的。一开始我先不放数据,这样更容易看清动态视图结构。然后我会挪动类别,展示视图如何灵活地呈现数据。接着我会把类别放进第三个轴,也就是 "Page Category",让我们可以对数据分页。最后我会输入一个公式和一点数据,展示一个同时代透视表做不到的小把戏。
0:00
/0:58
现在我要试着在 LibreOffice Calc v26.8 里复现这套东西。有几点值得注意,不过先让我们围观并嘲笑一下一个 LibreOffice 新手(也就是我)手忙脚乱的操作吧。
0:00
/1:32
对比这几种做法时,有几件事让我印象深刻。首先,在 Improv 里给一个相对复杂的数据集建模,就跟在脑子里想一遍一样简单,数据的呈现方式也和我心里的模型一致。LibreOffice 则要求我在想要的东西和建模方式之间跨过一道相当宽的概念鸿沟,因为每个行项目都要录入大量冗余数据。有些项目,比如 "League",能干净地转换过去,"Record" 就不行。事实上,我到现在也没搞清楚,该用什么最好的办法来转换我在 Improv 里算出来的 "Win Ratio"。LibreOffice 在数据透视表里有"计算字段"这个概念,但要跨列取出相关数据来做计算,相当麻烦。在 Apple Numbers、Microsoft Excel、Google Sheets 和 LibreOffice 里,数据透视表的数据都被拆分出去,成为一份专供透视表视图使用的数据快照。透视表数据通常可以做些轻量调整,但不会影响原始数据。反过来也可以,只是必须先显式要求更新透视表,才能反映主数据表的改动。和 Improv 的做法相比,这是易用性上的巨大退步——在 Improv 里,每个数据视图都直接操作基础数据。两种做法里,拖动分类都一样简单,不过 Improv 可以直接拖放实现 LibreOffice 所谓的"筛选",也就是分页视图,而且总体"手感更好",至少我是这么觉得。LibreOffice 则要我们打开一个单独的面板,在里面拖来拖去。不过我得说,能对筛选器再筛选(也就是排除/包含特定的数据子集)确实很方便。Sheets、Numbers 和 Excel(在线版)全都是严格基于面板的透视操作。有意思的是,面板式做法恰恰是 Lotus 当年拒绝的界面方案,而且是应 Steve Jobs 的要求。还是引自 Garfinkel 那篇文章。
“但分类图标该放哪儿?试了很多方案之后,开发者决定专门做一个图标窗口。 ‘然后 Steve Jobs 来了,’Paul 回忆起 1989 年 4 月 Jobs 的那次到访。Jobs 说:‘你们得能直接抓住分类、拖着它们移动。把它们放到单独一个窗口里,太疏远了,’Paul 记得他这么说。 ‘(我们)就把额外面板这个想法扔了,’把分类方块直接放到工作表上。”

Numbers 无疑是现代透视表里最好看的。操作行列的 GUI 干净紧凑。尤其注意透视表本身列名的位置:它们左对齐于所描述的信息,既压缩了空间,又清楚地区分出各自对应的数据点。

每一款现代透视表都恨不得给我的数据缀上一堆“总计”和小计的行与列。我想把它们关掉,Excel 却把我卡住了。

我很不喜欢 Google Sheets 的做法。在那个滚动视图里(当前显示的是“Values”和“Filters”)挪动行列,真是活受罪。
现在直接把 Improv 处理动态视图的方式和现代透视表比过之后,可以放心地说,它们之所以算是一回事,就跟 Gordon Ramsay 用和牛加格吕耶尔奶酪做出来的东西,和 Happy Meal 盒底那点木屑都叫“芝士汉堡”一样。Improv 好吃多了。
动态范围
“命名范围”是 Lotus 的发明,首次亮相于 Lotus 1-2-3,它试图给混乱的单元格标识带来秩序。在 1-2-3 里,Range > Name > Create 会给你指定的单元格范围起一个名字,之后公式里就能用这个名字引用该范围。所以在 1-2-3 或任何现代电子表格里,我们可以把范围 F1..F23 命名为 Sales,然后 sum(Sales) 就能用了。表面上看,这跟 Improv 用分类和条目处理多维数据的方式很像。但命名范围只是为了方便,并不建立数据值之间的关系。在 Improv 里,Sales 代表的是某条数据的一个基本侧面。求所有销售额的总和是一样的,sum(Sales),但把它作为数据上的一个维度,能给我们更深的操作空间。针对某一年,sum(2020:Sales) 会同时匹配两个轴。sum(2020:Arkansas:Sales) 还能进一步锁定求和范围。看看用现代电子表格和命名范围要怎么做。如果想模仿 Improv 的维度关系,我们必须在每个公式里定义所关心的关系(而且这些公式还得复制到每一个相关单元格),比如:
= SUMIFS(Value, Year, 2020, League, "American", Record, "Win", Division, "East") / SUMIFS(Value, Year, 2020, League, "American", Division, "East")
意思是“只对 Year 为 2020、League 为 "American"、Record 为 "Win"、Division 为 "East" 的行,把名为 "Value" 的区域里的数值求和”
当然,我们可以把写死的筛选条件换成从查找表里取来的值,或者用 LET 语句把相等的值提取出来。甚至可以建一个小型子表来存放计算出的值。很快事情就变得比我预想的复杂得多,所以换成我,宁可老老实实按老办法来,直接写死一堆单元格引用。再强调一遍,在 Improv 里,胜负信息本身就是一个维度,整张表的完整解法就是这一个公式:
Win Ratio = Win / (Win + Loss)
图表功能平平
最后一个大功能是图表,它用上了 NeXT 的图形能力。创建图表会启动一个完全独立的应用程序 Presentation Builder,这家伙雄心勃勃,长大后想成为 PageMaker。生成图表会生成一整张空白页面,图表就放在上面。一整套调色板配合制图流程,可以在整页范围内对图表及其标题、颜色、位置等做精细调整。可以生成多张图表放在同一页上。任意文本和形状、指向重点的线条,甚至声音注释(NeXT 的系统级工具,叫 "Lip Service")都能随意放置。于是情况就是:我们有工具往页面上放任意文本,却没有工具让这些文本居中,Lotus 摊子铺得太大的感觉相当明显。有时候,一个程序只要把它擅长的那部分输出做好就够了,把“页面排版”留给专业软件。再说一遍,我需要软件更笨一点。这还没提那一大堆格式工具,散落在数量多得不合理的调色板、面板和 "inspector" 里。

"PresentationWindow5" 才是页面本身。如果想改选中图形的背景色,该点哪个按钮?你猜到是“Palette 面板的 Fill 选项”了吗?反正我没有。
这些工具在 NeXT 上有一个好处:得益于 NeXT 的 Display Postscript 屏幕渲染引擎,我们做的一切默认都是 Postscript。把文档「打印」成 PostScript,我们就能在任何现代系统上渲染生成的 .ps 文件。我直接在 Affinity 里打开它,得到的正是我在 Improv 里看到的东西,被截断的文字以及一切,但怎么说呢,是_高质量_的截断文字。

不错!为了完全透明起见,这张图上的每一个元素都是作为完全独立的对象导入的。那些文字不可编辑;它们只是看起来像文字的矢量图形。对象以奇怪的方式分组,还带着大量多余的蒙版通道。如果你的目标是从 Improv 导入进来然后「就做几处小调整」,那你可有得受了。更简单的做法是保留柱状图,也就是真正的数据,其他一切重画。
作者笨拙地列举一些烦人之处
你看,我尽力想编织一个引人入胜的叙事,从一个话题转到另一个话题,把呼应和观察缝合在一起,引领你,我亲爱的读者,走上一段经过深思熟虑的旅程。只有你和我,并肩坐在键盘前,聊着软件,一起学习。但有时候,有些杂七杂八的东西我得硬塞进来,却找不到自然的过渡来讨论它们。那么,这里就是我关于 Improv 想让你知道的其他事情的一次脑内倾倒。
-
没有撤销。这不是我介绍的第一个缺少撤销的程序,而且我说的不是那种可以因为生得太早而被原谅的软件。
-
底部的公式面板按显示的顺序应用公式。既然顺序很重要,那么你有时会想重新排列它们就很合理了。除了剪切和粘贴,没有任何机制能做到这一点。这比缺少撤销更让人头疼。
-
Improv 使用特殊的
PREVNEXTTHIS关键字来为公式添加单元格相对性。所以这个值是前一个值乘以 2,或者随便什么。但我们身处一个多维表格中,那么这些关键字究竟指向什么?在公式里,它们必须选定一个类别,而且只有那个类别可以被相对引用。如果一个公式使用多维数据来计算一个值,比如Sales Projection[THIS] = Years[PREV]:Region[THIS] * 1.178,那些关键字就不起作用了,尽管写出这样的公式并期待它成功是完全自然的。 -
没有脚本。Lotus 1-2-3 用户会尤其恼火,因为他们无法把自己精心构建的自动化带到 Improv 上来,而考虑到它们是同一家公司做的,这会是个巨大的意外。我甚至可以说,仅此一点就会把大量潜在转换者推开。没人有时间从零重建自己的金融帝国!
-
没有 3D 表格,意味着项目之间没有链接。一个项目最多可以包含 100 个工作表,这些工作表可以相互引用,但只能在同一个项目文件内。
-
如果某个工作表中的某个类别与另一个工作表中的某个类别逐项完全一致,那么它们可以匹配,数据也会按预期流通。遗憾的是,无法同步共享的类别。在一个工作表中修改项目后,使用该链接类别的其他工作表不会同步这些改动。这意味着我们无法创建一个由其他工作表继承的“主”类别。就像早期生产力软件时代的许多事情一样,用户自身的勤勉在保持一切顺畅运转方面起着很大作用。即便是 Windows 上的第 2 版也没有加入这一功能。要是有人能站出来迎接这个挑战就好了。(伏笔)
说到 2.0 版……
Improv 2.0
1993 年,NeXT 放弃硬件业务,转向 Intel 平台,更名为 NeXT Software,随后发布了 OPENSTEP。与此同时,Improv 也转向了 Intel,但与 NeXT 分道扬镳。借助 2.0 版,Lotus 的开发者终于取得了在 OS/2 上未能实现的成功,把 Improv 移植到了 Windows 3.1。2.0 版的功能集与 1.0 版相似得令人失望,而此时竞争对手的软件已经开始吸收 Improv 的一些独到之处。撤销功能总算有了,感谢 Kapor 这点小恩小惠。脚本功能以 LotusScript 的形式登场。新的 Windows 界面在界面上加了一堆按钮,还拆掉了卷纸架,换上一个更合理的列表生成器。新东西基本就这些,好在老问题一个没少。

2.0 版的一个亮点是为日本做了本地化,也就是说可以写出日式公式:月:合計=sum(1月..3月)
单元格引用的相对性仍然锁死在单一维度上。公式不能自由重排,只能剪切粘贴到目标位置。没有三维工作表。然后,Lotus 在 PC 上的产品策略又添了一层乱。如果 Improv 不合你的胃口,也许他们另一款 Windows 电子表格 1-2-3/Windows 会更顺手。或者另一个另一个选择,Lotus Symphony。或者另一个另一个另一个选择,Lotus Works。或者另一个另一个另一个另一个选择,Lotus 1-2-3 for DOS Release 4,1994 年上市。无论如何,媒体对它评价不错,尽管评论者似乎不太愿意给出毫无保留的推荐。比如《Compute》1994 年 7 月的这篇评测。
“Improv 是一种全新的程序。Excel 的数据透视表和 Quattro Pro 的 Data Modeling Desktop 模仿了重排数据的能力,但这两个功能都远不及 Improv 的类似功能强大灵活。处理常规的行列工作时,你大概还是想留着原来的电子表格,但要真正探索大型模型中的关系,就得靠 Improv。”
或者这篇 PC World,1994 年 2 月的评测。
“如果你在找一款好用的通用电子表格,Improv 不是答案。Improv 被宣传为电子表格,它看起来、用起来可能和这次对比中的其他产品没什么两样,但最准确的描述是:它是一个多维数据建模工具。它不适合所有人,但它擅长的事,做得非常好。”
只看这篇评测,很难猜到就在几个月前,PC World 刚把 Improv 评为他们第十届技术卓越年度大奖应用软件类别的“获胜者”。

它击败了 Quattro Pro 5.0 for Windows Workgroup Edition(名字真够长的)和 WordPerfect 6.0a for DOS。没错,DOS——距离 Windows 95 登场只剩一年多。
Improv 3.0
精神上是 3.0,实体上未必;我们快速看一眼 Quantrix,也就是我前面笨拙地埋下伏笔的那款产品。据前 Lighthouse CEO(也是前 Sun CEO)Jonathan Schwartz 的博客:“1989 年,我和几个朋友创办了一家软件公司 Lighthouse Design,全力投入 NeXT 平台。不管当时我们谁肯承认,Lighthouse 是一群把 Steve Jobs 当作宇宙引力中心的人建起来的。”他们对 Jobs 的忠诚得到了回报——以建议的形式,让他们的产品在 NeXT 上繁荣发展。按 Schwartz 的说法,归根结底,问题不在于如何让 Lighthouse 在 NeXT 上繁荣,而在于如何先让 NeXT 本身繁荣起来。Lighthouse 日薄西山、寻找买家时,他们盼着被 NeXT 收购,但 Jobs 没有接招。他们被 Sun 买下,产品被塞进保险库,再不见天日。

这就是 Microsoft Office 没有移植到 NeXT 的原因(不过听起来在那之前 Steve 对 Bill 挺混蛋的)。出自 Randall E. Stross 的 Steve Jobs and the Next Big Thing。
Microsoft 不愿支持这个平台,于是 Lighthouse 做出了 NeXT 上最接近 Office 套件的东西。他们做了编程工具、项目管理软件、一款叫 Concurrence 的演示工具(Jobs 用过,它后来还“启发”了 Keynote),以及两款电子表格程序:ParaSheet 和 Quantrix。ParaSheet 走的是更传统的路线,而 Quantrix 就是彻头彻尾的 Improv 克隆,我想不出别的说法。同样的分屏工作表/公式,同样的 THIS NEXT PREV 公式工具,同样的可拖拽分类,还能导入 Improv 文档,等等。一位 Hacker News 读者说:“两本手册可以互换。”

_Quantrix _在左,_Improv _在右。_Quantrix _提供了一堆按钮式的贴心功能,按钮会显示与上下文相关的工具。左边那些带标签的东西?拖动它们就能智能创建条目,这取代了 _Improv _的"条目分发器"。
Lighthouse 接过了 _Improv _背后的思路并将其发扬光大,设想出一个可能的 v3 会是什么样子。简单说,我在 _Improv _里抱怨过的每一件事,_Quantrix _都解决了。它有撤销。它有拖放、可重排的公式。它有脚本。它有跨工作表的类别同步。"条目分发器"被替换成了一个内联小部件,像如今任何现代电子表格那样拖动展开。它有多维单元格相对引用。它既能跑在面向 Intel 的 OPENSTEP 上,也能跑在 Motorola 68K 上的 NeXTSTEP 上。它有颜色。它丢掉了上下文帮助(不可能什么都占全)。还有我之前展示的那些用来编辑图表的、乱七八糟的面板和调色板?它们被收进了一个整洁的单一"检查器"。长话短说?如果你想在今天体验最好版本的 Lotus Improv,就用 Lighthouse Quantrix v2.3。原有的酷炫工具全都在,而且做得更好,界面也更合理。另外,Lighthouse 把他们家的 NeXT 应用连同许可证代码一起免费送出去了。多棒啊?
LightHouse Design 为了帮助老用户,为旗下所有 Lighthouse 应用提供 2 用户免费许可证,但不包括 FrameMaker(仅可从 Adobe Systems, Inc. 获得)、OmniWeb(已有 1 用户许可证)和 JavaPlan(目前仍在售的产品)。 ——许可证说明,约 1997 年
Improv 4.0
对于那些愿意接受我对“反转”一词宽松定义的人来说,最大的反转是:Quantrix 至今仍在运营。它活着,而且售价是“询价”,所以我想我还是先把这张信用卡放回钱包里吧。如今,它明确瞄准的是专业、高端的金融建模人群,而不是普通大众。你知道的,就是当年 Lotus 最先向他们展示 Back Bay 原型机的那群人(见时间线)。它的自我介绍视频把许多 35 年前的功能包装成革命性的创新(懂了吗?)。这是对某个行业停滞不前的反手控诉,还是一个产品终于找到了自己的定位?你来评判吧!很难确切弄清到底发生了什么,但我在 Quantrix 论坛上找到了一些零散信息。如果这些信息可信,Lighthouse 的 Quantrix 首席工程师 Pete Murray 创立了 Subx 公司,并在 2003 年将 Quantrix 重建为一款 Java 应用。Quantrix 的网站称它于 2010 年被 IDBS 收购。我至今完全不明白 Quantrix 是如何逃出 Sun 的束缚的,因为 Sun 当时拒绝将 Lighthouse 的应用出售给那些垂涎的买家;那些东西本可以在早期被转换成 OS X 应用。无论如何,它算是比较好看的 JRE 应用之一,但也带有 Java 渲染问题的典型症状,尤其是在文本定位和缩放方面。除此之外,它干净、不冒犯人。乏味?无聊。对,就是这个词:无聊。“它了解自己的目标受众”,这说法或许更厚道一些。

Improv 的教训
那么,这一切让我与 Lotus Improv 的关系走到了哪一步?我为什么要在文章开头抛出那句“然而……”?如果对自己完全诚实,在“想要爱上它”和“真的爱上它”之间,存在一种震颤的张力。这么多周过去,我想自己已经有足够的资格来解释它为何没能风靡世界:它不是一个出色的电子表格程序。让我给这句话加个限定,免得 r/Improv4Life 把我喷得体无完肤;挨喷的事可以等会儿再说。就它所能做的事而言,它令人惊叹,用起来甚至有趣。它做不到的,是为大众提供一种良好的通用电子表格体验。它宣称能做到这一点,把自己定位为“电子表格的 NeXT 一代”。无论 Lotus Improv 为电子表格这一门类成就了什么、又未能成就什么,有一点是确定的:它是一个绝佳的技术演示。从这个角度看,我当年大概也会像 Jobs 一样对它深信不疑,兴奋地拿给那些不信 NeXT 的人看:“瞧我的电脑能干什么!”在朋友中间享受那种技术优越感的得意时刻,确实很有趣,不是吗?可等你玩上一两周,最初那种数据透视带来的兴奋感消退之后,你也许会羞愧地发现自己心里藏着一点买后悔了的感觉。
Adam Bosworth 在 一篇反思自己演讲的文章中——那是他在 ICSOC '04 上做的演讲——思考了软件的复杂与简单之争,并提出:
想想电子表格。它是一种千变万化、马虎随意、可塑而灵活的 媒介,讽刺的是,它却是所有会计师和审计师的噩梦, 因为要可靠地理解一个真正复杂而丰富的电子表格, 几乎是不可能的。Lotus 公司(如今的 IBM)里满是 哈佛 MBA 和 MIT 计算机科学博士,他们打造了 Improv。Improv 的目标 是“把这一切都修好”。它是审计师的梦想。它提供了稀有的高度 抽象、为行与列赋予的形式化规则,简而言之,它真正 可被理解。它彻底失败了,不是因为它未能实现抱负, 而是因为它成功了。
悖论在于,Improv 承诺提升数据的可理解性,结果却收窄了它的受众面。想随手敲几行数据,像临时凑一个电话簿那样?那你得重新把自己的数据想成一张矩阵,里面全是关于朋友的抽象属性。尽管它有亲切的类英文公式,还有好用的数据透视 GUI,Improv 实际上是为远比这些玩具式工具所暗示的更严谨的数据建模而打造的。它是新一代电子表格,面向的是市场中很薄的一层人。话虽如此,总有一小撮读者的硬核数字运算需求与 Improv 的承诺完美契合。如果你正是这种人,你绝对会爱上……Quantrix。
磨刀
改进体验的方法、明显的不足、变通做法,以及把这款软件纳入现代工作流的注意事项(如果可能的话)。
模拟器改进
- Previous 从没在我这儿崩过,而且从早期到现在,配置起来容易多了。4.4 版一直很好用。
- 关于鼠标移动,我发现(在 Previous 里,不是 NeXTSTEP)把 “Slow movement” 设为 “Fast”、把 “Fast movement” 设为 “Slow”,能把手感平衡到接近一致的跟踪效果;这对我管用,我只能保证这么多。
- NeXTSTEP 有一个现代附加组件叫 “GKMouseScaler”,可以让用户画出精确的光标加速曲线,如果你需要更好的控制的话。就我个人而言,从没用上。
- 我觉得 2 位单色显示已经绰绰有余;不需要彩色。
故障排查
- 这是 Improv 的 1.0 版,它确实崩过几次,而且相当突然。似乎没有特定的触发条件,也没有哪个功能会导致崩溃。它就是转起彩球然后死掉。
- NeXTSTEP 本身我觉得挺稳定。
- 从现代软件仓库安装软件时,有三件事要记住。多亏 Previous 提供的一个便利,在 NeXTSTEP 的
root/Net里你可以访问宿主机的文件系统。 - 你会在网上碰到很多 .tar.gz 文件,所以把
gunzip和tar补一补。 - 一旦你有了
.pkg文件,双击它,应该就会自行安装。
与现实世界对接
Improv 确实能导出到 Lotus 1-2-3,但结果多半会让你失望。拿一张带公式和计算值的表格来说:单元格里能看到的内容都会导出,但公式和单元格之间的关系不会。你拿到的只是当前所有值的一张快照,排列方式在视觉上对应导出时的表格结构。Improv 处理共享公式和多维数据的方式,决定了它没法优雅地导出到传统电子表格。如果你有 Improv 文档想导入 Quantrix,得满足两个条件:把 Improv 项目保存为 .imx 文件(不是默认的 .imp),并确保在 ~/Library/Services 装好 Lighthouse FilterServicer.service(在我于「Version 3」一节提到的那个 Quantrix 软件链接所在的同一站点可以下载)。导出图表很简单,这要归功于 Display Postscript。NeXTSTEP 生成的 Postscript 文件在现代机器上用 Ghostscript 或其他图形程序就能正常打开和渲染。
缺了什么?
前面提过,在 NeXT 上我其实推荐用 Lighthouse Quantrix v2.3,而不是 Lotus Improv。Improv 缺的重要功能不少:
- NeXT 上的 v1 没有撤销;Windows 上的 v2 有。
- 公式不能重新排序,只能靠剪切/复制/粘贴。
NEXT和PREV只能沿单一轴生效,尽管在同一个公式里让它们沿多个轴生效在逻辑上完全说得通。- Presentation Builder 一方面过于复杂,另一方面又缺了非常基础的工具。
- 不能引用其他项目里的值,也就是没有 3D 工作表。
- NeXT 上的 v1 没有脚本选项;Windows 上的 v2 有。
总的来说,它缺少传统电子表格那种像黏土一样的可塑性。如果你和我们很多人一样,把电子表格当迷你数据库用,多半会被它搞得很烦。
Fossil Record



见过电子表格跳舞吗?见过,就一次。

随着销量下滑、竞争对手开始采用它的独门特性,Improv 降了价,把自己重新定位得更像一款辅助工具,而不是你的主力工具。

28 度。现在你懂了。

NeXT 在营销中大量使用 Futura Extra Bold Condensed。其他人也一样。
正片来了。拿去和他在 MacWorld 2000 上的 OS X 发布对比一下,算你加分。