| | 初代 Macintosh:125 篇中的第 104 篇 Switcher 作者:Andy Hertzfeld 日期:1984 年 10 月 人物:Andy Hertzfeld、Neil Konzen、Bill Gates、Bud Tribble、Steve Jobs、Steve Capps、Charles Simonyi、Phil Goldman、Tom Petrie、Victor Bull、John Markoff、Burrell Smith、Guy Kawasaki 主题:软件设计、技术、报酬 摘要:Macintosh 的第一个多任务环境 The Switcher 的 About 框 1984 年 3 月我从 Apple 休假之后(见 Leave Of Absence),参与的第一个商业产品是一款面向 Macintosh 的低成本高分辨率扫描仪,名为 Thunderscan,是我与一家名为 Thunderware 的小公司合作创造的(见 Thunderscan)。我于 1984 年 6 月开始着手开发,到 10 月初,它已接近完成。Tom Petrie 是 Thunderware 的两位负责人之一(另一位是 Victor Bull,我曾与他合作开发 Silentype 热敏打印机(见 What Hath Woz Wrought),那是我为 Apple 做的第一个项目),他为多家计算机杂志安排了几次演示,以争取好评来推广产品。1984 年 10 月 11 日,我与 Tom 驱车前往 Hillsborough 的一间办公室,为 Byte 杂志演示 Thunderscan。Byte 的评测人是 John Markoff,他是 San Francisco Chronicle 的技术撰稿人,也是报道个人计算机行业最优秀的记者之一。Tom 讲解 Thunderscan,我则搭建演示环境并开始扫描。John 问了几个问题,用他的 IBM PC 做笔记,那台机器上运行着一个基于字符的文本编辑器,我带着 Macintosh 纯粹主义者那种典型的虔诚鄙夷看着它。正当我回答他其中一个问题时,电话响了。“抱歉,”他对我们说,同时在键盘上按下一个组合键,他的显示器屏幕瞬间切换到了另一个程序。他在电话里谈了一两分钟,偶尔打几个字,然后结束通话,按下一个组合键切换回他的 Thunderscan 笔记。“你刚才做了什么?”我问 John,对他运行的软件感到好奇。“你怎么这么快就切换到另一个应用程序的?”“哦,我在跑 Memory Shift。你没见过吗?”John 回答道。“这是一个 DOS 实用程序,能把多个应用程序常驻在内存中,让你在它们之间快速切换。我最近一直在用。”John 快速连续地敲了几次切换命令,向我展示它切换起来有多快。“你知道吗,我想我可以在 Macintosh 上做到这个”,我甚至还没经过有意识的思考,就突然脱口而出。内存是初代四倍的 512K Macintosh 几周前才刚刚开始出货。我曾考虑过尝试在 512K Mac 上同时运行多个应用程序,但被低内存冲突和其他潜在的坑给挡住了。但现在,当我观察 John 的 PC 上 Memory Shift 的实际运行情况时,我突然看到了一个简单的实现方法,看起来并不太难实现。“是啊,那会很酷,”John 表示赞同。我继续做 Thunderscan 的演示,但我很难集中注意力,因为我止不住地想应用程序切换的事。有几个复杂的问题需要解决,但看起来完全可行,而且我觉得如果我能让它工作起来,它会极其有用。Tom Petrie 注意到我对这个新想法有多兴奋,在他开车送我回家的路上,他提醒我之前的承诺,并让我保证会尽快完成 Thunderscan 的 alpha 版本,然后才敢开始新东西。我们商定了一份大约十几项任务的清单,我认为我能在两周内完成。一旦 alpha 版本完成,我可以短暂休息一下,去开发应用程序切换功能,然后再回到 Thunderscan 完成定于 11 月底发布的 1.0 版本。在接下来的两周里,我专注于打磨 Thunderscan,使其为 alpha 版本做好准备,但我
像 {{NAME_ab12cd34}} 这样写出的值是真实值的占位符。请完全按照其书写方式使用它们,无论是在回复中还是在工具调用中:它们会在任何内容运行之前被替换为真实值。不要要求验证它们,也不要用示例替换它们。
别跟我争。$100k 是公道的,你心里清楚。
也曾在空闲时刻思考应用程序切换器的设计。一个根本性的决定是:是把所有应用程序装入单一堆中,从而通过最小化碎片来最优利用内存,还是为每个应用程序分配独立的“堆区域”。我决定选择独立的堆区域,以便更好地隔离应用程序,但我不确定这是否正确。有许多小问题要解决。最关键的是,系统软件在低内存中保留了大量应用程序专用的全局变量(见 Mea Culpa),这些变量需要在上下文切换时交换,以便每个应用程序都能维护自己的一组变量。困难之处在于列出究竟需要交换哪些变量的精确清单;许多变量很明显,但有些相当微妙,并且取决于应用程序如何使用它们。我知道我的第一版不会完美,但我有信心,一旦看到应用程序实际如何失败,我就能调试不可避免的问题。在开始冲刺完成 Thunderscan 几天后,我接到了 Jeff Harbers 打来的一个令人感兴趣的电话,他是 Microsoft 的 Macintosh 应用程序团队经理。Jeff 告诉我,Microsoft 有一个非常战略性的项目需要在 Macintosh 上实现,他们认为我是实现它的理想人选。他在电话里不肯再多说,但提出可以飞我到西雅图当面讨论。尽管我正忙于努力完成 Thunderscan,但我还是被勾起了兴趣,接受了他的提议,下周二飞往西雅图与他会面。Jeff 在机场接我,我们开车到 Microsoft 的主楼,Neil Konzen 也加入了我们,他是一位 23 岁的有才华的人,是 Microsoft 在 Macintosh 上的主要系统程序员。我认识 Neil 是在他早期作为 Apple II 爱好者的日子里,当时他只有 16 岁,我们合作给一个汇编语言开发系统添加功能。Jeff 问我在做什么,我告诉了他 Thunderscan,他似乎对此感兴趣。但当我提到我即将开始用一个应用程序切换实用工具做一些实验时,他下巴都掉了,看起来不敢相信我说的话。“这正是我们想和你谈的!”,他喊道,“你已经在做这件事了,太好了”。Jeff 解释说,Microsoft 投入了大量精力让他们的应用程序在 128K Macintosh 可用的小空间里良好运行,他们认为这是关键竞争优势。但就当时情况而言,512K Mac 会削弱他们的努力,因为它允许应用程序大得多。此外,Lotus 最近宣布了一个面向 512K Macintosh 的集成应用套件,名为 Jazz,可以轻松在不同功能领域之间快速切换。但如果 Macintosh 能同时运行多个应用程序,Microsoft 应用的小内存占用将继续是有利的,因为它们较低的内存需求意味着更多应用可以同时运行,用户可以自行组合定制应用套件。这次访问的目的是说服我按合同为 Microsoft 编写一个应用程序切换器。Neil Konzen 曾考虑过一个潜在设计,并在白板前向我传达了它。他决定使用我拒绝的单一堆方法,并加入一些有趣的巧妙变化来最小化内存碎片。我告诉他使用独立堆区域的替代方法,以及我认为用一些内存碎片换取更强的稳健性可能是值得的。我告诉他我会再考虑一下他的方法。最后,我在 Microsoft 的那个下午以与他们的 CEO Bill Gates 的私人会面告终。Jeff 把我领进 Bill 的办公室,并为 h 回顾了下午的讨论
im,在借故离开、留下我们单独谈一项开发协议之前。在 Macintosh 开发过程中,我见过 Bill 几次;虽然我尊重他的技术才干,但我对他作为工于心计的商人日渐增长的名声心存警惕。寒暄了几句,并告诉我 Macintosh 对 Microsoft 有多重要之后,他直视着我的眼睛说:“你是个非常优秀的程序员,对吧?我觉得你一定是个非常优秀的程序员。”“大概吧,”我回答,不明白他为什么要恭维我。“嗯,我觉得你是。你觉得做这个项目要多久?一两个月?我觉得像你这样优秀的程序员能在两个月内完成。”“我真的不知道,”我回答,“我进展得还不够,还不知道它是否可行。”“好吧,我们来算算吧,”他用略带居高临下的语气说。“我认为它不会超过 10,000 行代码,而像你这样优秀的程序员每周至少应该能写一千行代码,所以如果你真像我想的那么优秀,我觉得你不到 10 周就能写完。”我不知道该怎么回应,所以保持沉默,让他继续说。“那你觉得一个真正优秀的程序员应该拿多少钱?在我们这儿,我们给最好的程序员大约每周两千美元。你觉得你应该拿得比这更多吗?”“我不知道,”我回答
的内存低位区域,判断哪些内容需要换出。看到它开始运行,真是无比满足——起初总是崩溃,但随着我逐一排查各种问题,它逐渐稳定下来。它运行了大约一个小时,我看到 Bud Tribble 回家了。Bud 终于完成了他在 University of Washington 的 M.D./Ph.D. 项目,其中包括一年的实习,但他觉得做 Macintosh 比当医生更有趣,所以几个月前,也就是 1984 年 7 月,他回到了 Apple,做他原来的软件经理工作。Bud 住在 Burrell Smith 家,就在我家隔壁。我把 Bud 拽到我家,给他看我如何在 MacPaint、MacWrite 和 MacDraw 之间快速切换。他印象深刻,但令我意外的是,他抱怨说这种几乎瞬间完成的切换其实太快了。“我觉得在没有任何反馈的情况下从一个应用切换到另一个应用可能会让人困惑,”他告诉我。“万一有人不小心切换了呢?也许你可以用动画让过渡更平滑。”这对我来说是个好主意。我们决定让一个应用水平滚出屏幕,同时另一个应用滚入,这给用户一个简单、具体的心智模型:应用围绕着一个类似 Lazy Susan 的东西排列,用户可以旋转它,把想要的应用转到可见区域。我很快写了一些快速滚动例程,看到应用在屏幕上飞快划过,那效果让我惊叹不已。我开始向 Apple 的朋友们展示我的概念验证演示,也在一些用户组演示中展示,反响非常积极。不幸的是,我还得完成 Thunderscan 的产品发布,我勉强在 11 月底按承诺完成了。短暂休假后,我在 12 月初回到工作中,继续开发我现在称为 “Switcher” 的东西,到圣诞节时我已经实现了大部分功能,包括一个用于选择应用的简单 UI,以及用于记住相关应用集合的 “Switcher Documents”。1985 年 1 月初,我接到 Guy Kawasaki 的电话,他是 Apple 的第三方布道师之一,他告诉我 Apple 有兴趣收购 Switcher,并指派他来促成此事。第一步是安排一次给 Steve Jobs 的演示。我带着些许忐忑走进 Steve 的办公室,因为我认为 Switcher 对 Apple 至少值 25 万美元,但我确信 Steve 绝不会愿意付我那么多钱。但我也为 Switcher 感到自豪,并且很想看看 Steve 会如何反应。我启动了我当时标准的演示:MacWrite、MacPaint、MacDraw 和 Finder,以及 Steve Capps 写的一个小迷宫生成程序。我配置 Switcher 时最初关闭了滚动动画,这样我稍后展示时效果会更强。我演示了在 MacWrite、MacPaint 和 MacDraw 之间剪切粘贴,只需几秒而不是几分钟,然后我打开滚动动画,开始快速地在它们之间双向切换。“好了,我看够了,”Steve 打断我。“很棒。Apple 会把它和 Mac 捆绑销售。恭喜。”但随后他停顿了一下,用极其锐利的目光盯着我看了片刻,仿佛在打量我,或者也许只是想吓唬我。“但我不想你利用这个局面。我不会允许你占 Apple 的便宜。”“你什么意思?”我问他,真心感到困惑。“你不可能在没有从 Apple 工作中获得的机密信息的情况下写出那个程序。你没有权利随意收费。”我开始生气了。“这个程序只完成了一半,如果我认为你付我的钱不公平,我就没有动力完成它。”Steve 又用锐利的目光看了我一眼,停顿了几秒钟。然后他
像 {{NAME_ab12cd34}} 这样写出的值是真实值的占位符。请完全按照书写的样子使用它们,无论是在回复中还是在工具调用中:它们会在任何内容运行之前被填入真实值。不要要求验证它们,也不要用示例替换它们。
文章标题:别跟我争。10万美元很公道,你心里清楚
只报了一个数字,没有任何解释。“十万美元。”“我不知道,”我告诉他,“我觉得它很可能远不止这个数。”“别跟我争。10万美元很公道,你心里清楚。”我似乎别无选择,只能接受Steve的定价,因为他这个人很难争得赢,而我又确实很想让Switcher随Mac一起捆绑销售。最终,我是和 Guy Kawasaki 谈定了最后的协议。除了那10万美元之外,我还争取到了:如果Apple单独销售Switcher,我可获得批发价10%的版税。Steve发誓他们绝不会单独卖,但最终这笔版税又带来了5万美元。让Switcher跑起来并不算太难,但要把它做完却非常困难,因为它推翻了应用程序的一些底层假设,却又坚持要让一切都照常工作。后期的大量工作,是拿我能弄到的每一个应用程序来测试它,并调试崩溃。通常我都能琢磨出某种技术手段来缓解问题,而不在别处造成更糟的问题。不出所料,完成Switcher最难的部分,是让它与Microsoft的应用程序顺畅配合。部分原因是Microsoft是很早的开发者,对系统肆意妄为,大多数开发者都不敢这么做;但主要原因是,他们的应用程序中的指令为了节省空间被编码成伪代码,沿袭了Xerox的字节码解释器的传统,而 Charles Simonyi 推崇这种做法。不幸的是,伪代码让我在程序崩溃时无法反汇编它,这让调试更加困难。我最终开发出一种调试技术:单步跟踪他们的解释器,一次走六条指令,才能到达真正干活的那些指令,但这么做相当痛苦。我下定决心要硬啃下去,因为我在访问Microsoft时做出了承诺。在1985年3月完成Switcher第一个版本之前,我处理的最后几个问题之一与应用挂起有关。如果你在运行多个应用程序,你不会希望一个应用挂起就把它们全都拖垮。我加了一个功能:如果当前应用挂起,用户就可以杀掉它,办法是在垂直消隐中断处理程序中监视某个特定的按键组合。我知道必须选一个非常罕见的按键组合,因为你不希望用户误杀了他们的应用。我选定了shift-command-option-period,即同时按住四个键,我觉得这很难被无意中碰上。但我很意外地接到了Microsoft的 Jeff Harbers 打来的电话。“嘿,我喜欢你刚加的那个中止功能,但你得改一下按键组合,因为我们在Microsoft Word里用的就是这个。”Jeff 告诉我。Microsoft Word非常复杂,拥有极其繁多的键盘快捷键——在我看来实在太多了。“好吧,给我个建议改成什么,我会考虑的,”我告诉 Jeff。Jeff 心里并没有具体想法,所以他说很快会再联系我。第二天他回电话给我,说他想要撤回请求,让我保留shift-command-option-period作为中止组合,我听了忍不住笑了。“好,我觉得没问题,”我告诉他,“但为什么改主意了?它不还是和Word冲突吗?”“我们会在下个版本里改掉Word,不再用它。问题在于我们找不到一个安全的组合——我猜我们已经把每个按键组合都用上了!”我在1985年4月正式发布了Switcher的完成版,之后又维护了几个版本。最终,我把它交给了 Phil Goldman,一位来自Princeton的了不起的年轻程序员,他最近被Apple聘用,后来写出了MultiFinder(与Er
文章标题:别跟我争了。10 万美元很公道,你心里清楚
正文: ich Ringewald),Switcher 日后的继任者,于 1987 年。情况比以往任何时候都好 返回 The Original Macintosh Handicapped | | The Original Macintosh: | 125 篇中的第 104 篇 | 作者: | Andy Hertzfeld | 日期: | 1984 年 10 月 | 人物: | Andy Hertzfeld、Neil Konzen、Bill Gates、Bud Tribble、Steve Jobs、Steve Capps、Charles Simonyi、Phil Goldman、Tom Petrie、Victor Bull、John Markoff、Burrell Smith、Guy Kawasaki | 主题: | 软件设计、技术、薪酬 | 摘要: | Macintosh 的首个多任务环境 | | The Switcher 关于框 | 情况比以往任何时候都好 | | 情况比以往任何时候都好 | 返回 The Original Macintosh | Handicapped | Handicapped | | 相关故事 • 休假 • Thunderscan 总评分:4.79(最佳) |
| The Original Macintosh: | 125 篇中的第 104 篇 | |||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 作者: | Andy Hertzfeld | |||||||||||||||||||||||
| 日期: | 1984 年 10 月 | |||||||||||||||||||||||
| 人物: | Andy Hertzfeld、Neil Konzen、Bill Gates、Bud Tribble、Steve Jobs、Steve Capps、Charles Simonyi、Phil Goldman、Tom Petrie、Victor Bull、John Markoff、Burrell Smith、Guy Kawasaki | |||||||||||||||||||||||
| 主题: | 软件设计、技术、薪酬 | |||||||||||||||||||||||
| 摘要: | Macintosh 的首个多任务环境 | |||||||||||||||||||||||
| The Switcher 关于框 | ||||||||||||||||||||||||
| 情况比以往任何时候都好 | 情况比以往任何时候都好 | 返回 The Original Macintosh | Handicapped | Handicapped | ||||||||||||||||||||
| 情况比以往任何时候都好 |
像 {{NAME_ab12cd34}} 这样写出的值都是真实值的占位符。请在回复和工具调用中都完全按原样使用它们:它们会在任何内容运行之前被填入真实值。不要请求验证它们,也不要用示例替换它们。
别跟我争。$100k 是公道的,你知道的


| 作者: | Andy Hertzfeld |
|---|---|
| 日期: | 1984年10月 |
| 人物: | Andy Hertzfeld, Neil Konzen, Bill Gates, Bud Tribble, Steve Jobs, Steve Capps, Charles Simonyi, Phil Goldman, Tom Petrie, Victor Bull, John Markoff, Burrell Smith, Guy Kawasaki |
| 主题: | 软件设计、技术、薪酬 |
| 摘要: | Macintosh 的第一个多任务环境 |

1984年3月从 Apple 请假离职后,我参与的第一个商业产品(见《离职》)是一款面向 Macintosh 的低成本、高分辨率扫描仪,名叫 Thunderscan,是我与一家名为 Thunderware 的小公司合作创造的(见 Thunderscan)。我在1984年6月开始做它,到10月初时,它已接近完成。

| 情况比以往更好 | 情况比以往更好 | 返回最初的 Macintosh | 残障 | 残障 | ||
|---|---|---|---|---|---|---|
| 情况比以往更好 |



写成 {{NAME_ab12cd34}} 这样的值是真实值的占位符。请完全按原样使用它们,无论是在回复中还是在工具调用中:它们会在任何内容运行之前被填入真实值。不要要求验证它们,也不要用示例替换它们。