1984年10月11日,从苹果停薪留职(1984年3月起)的Andy Hertzfeld和Thunderware合伙人Tom Petrie(另一位合伙人Victor Bull曾与Hertzfeld合作开发苹果Silentype热敏打印机),去给《Byte》杂志撰稿人John Markoff演示低成本高分辨率扫描仪Thunderscan。Hertzfeld对Markoff桌上的IBM PC和字符界面编辑器怀有Mac纯粹主义者典型的虔诚鄙视。但电话响起时,Markoff按下一组快捷键,屏幕瞬间切到另一个程序,挂断后又秒切回笔记。这个名叫Memory Shift的DOS小工具,当场击穿了Mac缔造者的傲慢,也催生了改变Mac生产力命运的Switcher。
在几周前刚发货的512K Macintosh(内存翻了四倍)上,用户依然每次只能跑一个程序,切换软件必须经历漫长的退出、返回Finder再重新加载。Hertzfeld当场决定把这种秒切能力搬上Mac。他向Petrie承诺两周内先完成Thunderscan的Alpha版、11月底交付1.0正式版,随后便一头扎进了Mac底层内存的泥潭。
西雅图密会与15万美元的商业算盘
就在Hertzfeld推进Thunderscan收尾时,微软Mac应用团队经理Jeff Harbers打来电话,邀他飞往西雅图商讨一个神秘战略项目。在微软总部,Harbers和23岁的微软Mac主系统程序员Neil Konzen(16岁做Apple II爱好者时就与Hertzfeld合作过汇编开发系统)听闻他正准备做应用切换器,当场惊掉了下巴。
微软的算盘打得很精。他们花了极大精力把Mac应用塞进初代128K内存,视其为核心竞争优势;但512K Mac允许对手开发大体积软件,且Lotus刚宣布了专为512K Mac打造的集成套件Jazz,支持内部快速切换。如果Mac能同时跑多个程序,微软软件占用内存小的优势就能延续,用户还能自己拼装办公套件。
当天下午,Bill Gates亲自出面谈判。Gates先捧杀Hertzfeld是顶尖程序员,接着按代码量算了一笔精明的账:这项目最多1万行代码,好程序员每周至少写1000行,10周就能搞定;微软顶尖程序员周薪约2000美元,哪怕按封顶4000美元周薪算,总价也就4万美元。
Hertzfeld看穿了这套压价话术,直接回绝了买断提议,坚持独立开发,因为这玩意儿理应成为Mac OS的一部分;Gates随即退一步,只求软件能完美兼容微软应用。1985年1月,在苹果第三方布道师Guy Kawasaki撮合下,Hertzfeld带着写有MacWrite、MacPaint、MacDraw、Finder和Steve Capps迷宫程序的演示版走进Steve Jobs办公室。心理预期原本是25万美元的他,最终与Kawasaki谈妥:10万美元预付款外加独立销售批发价10%的版税(后续又带来5万美元收入)。
苹果随后的商业分发相当务实。Hertzfeld于1985年3月完成首个发布版、4月发布,但行业记录显示6月仍在流通3.0 Beta手册,1985年9月《BYTE》第347页Jerry Pournelle还在专栏里写计划与Excel捆绑但“尚未亲眼看到它运行”。直到1985年10月用户组报告确认4.4版为正式版(11月《MacUser》第22页记录其修复了4.3版的Bug),盒装版才在秋末上架,标价19.95美元,同时免费电子分发,并以每年250美元向软件商授权捆绑。
512K螺蛳壳里的走钢丝算术
回到Palo Alto家中那晚,Hertzfeld连熬20个小时写出了概念验证原型。在技术路线上,微软的Konzen主张把所有应用塞进单一堆区以减少内存碎片,而Hertzfeld选择了独立堆区(heap zones)来隔离应用,换取系统稳健性。他通过给GetNextEvent、Launch和ExitToShell等核心系统调用打补丁(patching traps),并逐一排查置换低内存区(low memory)里硬编码的应用专属全局变量,硬生生在单任务系统里凿出了多应用驻留通道。
隔壁住着(在Burrell Smith家)刚在华盛顿大学读完医学与哲学双博士、1984年7月弃医返苹任软件经理的Bud Tribble。Tribble看完秒切演示后反而抱怨切换太快,缺乏反馈容易让人误触迷失。两人一拍即合,加入了类似旋转餐盘(Lazy Susan)的水平滚动动画,并在圣诞节前做出了应用选择界面和保存常用组合的Switcher Documents。
螺蛳壳里做道场,绚丽的旋转动画背后全是抠内存的苦役。
但在没有内存保护的512K机器上,工程现实远比动画残酷。苹果1985年6月4日的Switcher 3.0 Beta手册规定最低配置为512K Mac并强烈建议外接磁盘驱动器,默认预设下只能同时跑3个各分配128K的应用。连保存单个应用的屏幕状态都要吃掉22K内存,剪贴板转换和LaserWriter支持还得额外扣减。
| 软件或系统开销项 | 内存分配与运行限制 | 越界或冲突后果 |
|---|---|---|
| 默认预设单应用 | 128K(最多同时运行3个) | 超出物理内存上限无法加载 |
| 单应用屏幕状态缓存 | 额外消耗22K内存 | 挤压实际可用工作区 |
| Lotus Jazz / MacPaint | 需手动调配304K / 179K | 参数不准直接导致运行异常 |
| MacDraw / MacWrite | 128K用超80% / 打印需144K | 触发内存溢出导致系统崩溃 |
用户把大把时间花在了算命式的手动试错调参上。1985年11月《MacUser》指出,跑Jazz得手动分304K,MacPaint要179K;1986年的《Power User’s Manual》更警告,MacDraw在128K分配下用超80%空间就会崩溃,配合LaserWriter使用的MacWrite则建议分144K。更糟糕的是,某些专为512K Mac写的应用一旦检测到可用内存超过128K,就会野蛮地默认自己独占全部512K,在Switcher下直接罢工。
早期版本的稳定性更是灾难。1985年4月《MacTutor》读者来信抱怨后续预发布版比0.90版更容易崩,且1.1版从含System和Finder的RAM磁盘启动时存在特定故障。为此,苹果不得不在Beta手册第16页写明一个四键齐按的紧急逃生快捷键:Command–Option–Shift–句号,试图在单应用死机时强行挽救其他程序。
- 风险.在缺乏底层内存保护的架构上做系统级扩展,所有底层债务最终都会变成用户手里的调参说明书和崩溃罚单。
偷师DOS背后的多任务代差
跳出苹果的叙事看,这桩公案最讽刺的地方在于技术代差的错位。Hertzfeld最初鄙视IBM PC,但拯救Mac生产力的灵感偏偏来自DOS工具Memory Shift;更扎心的是,哪怕Switcher做出来了,它在多任务演进史上也只是第一阶段的任务切换(Task Switching)——切走的应用在后台完全被冻结,根本不运行。
而在同一个时代,简陋的DOS阵营里,另一款工具DoubleDOS已经利用系统定时器中断,在两个DOS会话间实现了会话级别的抢占式时间片轮转(Preemptive Multitasking)。Mac为了撑起精美的图形界面,把512K内存和CPU算力吃干榨净,又背负着低内存全局变量的架构包袱,反而只能在多任务机制上原地补课。
《荀子》有云,君子性非异也,善假于物也。Hertzfeld的聪明之处,在于放下了纯血统的身段,用打补丁的脏活把512K Mac从玩具救成了能干活的工具。后来他把Switcher交给了Phil Goldman,后者与Erich Ringewald在1987年开发出支持后台LaserWriter打印的MultiFinder,才终于让Mac迈进了需要应用主动让出CPU的协作式多任务时代。
- 结论.今天看大模型Agent与操作系统的融合也是一样,别光盯着演示视频里的丝滑动画,真正决定生死的是上下文切换的显存成本,以及出错时有没有那组能保命的逃生快捷键。
回到1984年那个十月下午,如果没有Markoff在黑底白字的IBM PC上按下那组快捷键,苹果或许还要在单任务的死胡同里多困大半年。技术演进从来不管什么血统高低,谁能先在螺蛳壳里把内存账算平,谁就能拿到下一张船票。
