新买的笔记本电脑在头几个月里非常快。可是操作系统和程序更新几次之后,它不知不觉就像旧电脑一样开始卡顿。芯片年年变快,体感速度却迟迟不见提升。有一句话用一句话点破了这种奇妙的现象,那就是“沃斯定律(Wirth’s Law)”。
简单来说,沃斯定律指的是“软件变慢的速度比硬件变快的速度更快”这一经验法则。无论硬件进步多少,软件都会先把这些提升吃掉,因此用户感受到的速度原地踏步,甚至不进反退。
本文将依次介绍沃斯定律的由来、软件变得臃肿的原因、当今我们身边可见的例子,以及打造精简软件的方法。

追赶更快芯片的臃肿软件
沃斯定律从何而来?

这条定律得名于瑞士计算机科学家尼克劳斯·沃斯(Niklaus Wirth)。沃斯在1970年发布了编程语言Pascal,并于1984年获得被誉为计算机科学界诺贝尔奖的图灵奖。
(1) 《精简软件的呼吁》
1995年,沃斯在学术期刊《计算机》(Computer)上发表了一篇题为《精简软件的呼吁》(A Plea for Lean Software)的文章。他在文中把“软件变慢的速度比硬件变快的速度更快”这句话作为同事马丁·赖泽(Martin Reiser)的话加以介绍,这句话后来被称为沃斯定律。
(2) 用数字看臃肿的软件
沃斯写道,仅仅约25年前,交互式文本编辑器用8,000字节就能做出来,编译器则必须装进32千字节以内。然而它们的后代却需要以兆字节计的内存,他批评说,若不是硬件快了大约一千倍,这些软件根本无法使用。
(3) 与摩尔定律成对的观察
如果说摩尔定律(Moore’s Law)是预测半导体芯片上的晶体管数量会持续翻倍,那么沃斯定律就是相反一面的观察:由此获得的性能并没有原封不动地回到用户手中。沃斯写道,从1978年到1993年,英特尔80×86系列处理器的性能提高了335倍,同时补充说,软件无止境的胃口却丝毫没有减小的迹象。
软件为什么越来越臃肿?

沃斯指出了人们轻易接受软件膨胀的两个原因。一是硬件性能提升得太快,二是消费者分不清必要功能和锦上添花的功能。
(1) 功能蔓延(Feature Creep)
每推出新版本就添上一两个功能,久而久之,连大多数人几乎不用的功能也越积越多,程序随之变得臃肿。沃斯尖锐地指出,人们把复杂误当成了精巧。
(2) 层层叠加的抽象层(Layers of Abstraction)
把让开发更轻松的工具和库叠上好几层,开发速度虽然加快了,运行时要经过的步骤也相应增多。
(3) 对快速硬件的信赖
一旦“反正电脑会变快,优化以后再做也行”的想法蔓延开来,打磨效率的工作就会被往后推。正如沃斯引用的另一句话所说,软件会不断膨胀,直到占满可用的内存。
今天我们身边的沃斯定律

沃斯定律在每个时代都换着名字反复上演。20世纪90年代流行一句玩笑:“英特尔给的,微软都拿走了。”2009年在谷歌开发者大会上,谢尔盖·布林也以联合创始人拉里·佩奇的名字,把同样的现象称为“佩奇定律”。
- 即时通讯应用(Messenger Apps):收发文字这件事古今无异,但一个应用占用数百兆字节内存已是常事。
- 网页(Web Pages):读几段新闻,却要连同广告、跟踪代码乃至视频播放器一起下载,页面因此迟迟打不开。
- 文字处理软件(Word Processors):输入、删除、移动文字的基本工作没变,安装容量和启动时间却一版比一版多。沃斯指出,有了窗口和图标,并不意味着编辑器的本来任务发生了变化。
- 手机系统更新(OS Updates):新操作系统按最新设备打造后,用了几年的设备做同样的事也会明显变慢。
打造精简软件的方法

沃斯没有止步于批评,而是亲自做出了榜样。1986年至1989年,他与同事尤尔格·古特克内希特(Jürg Gutknecht)仅凭两人之力打造了名为Oberon的操作系统,还一并设计了同名编程语言。包括编辑器和编译器在内,Oberon的核心还不到200千字节。
(1) 专注于本质
先确定真正必要的功能,其余部分则拆分开来,只让需要的人自行添加使用。
(2) 持续测量性能
每加入一项新功能就测量运行速度和内存用量,及早察觉程序一点点变重的趋势。
(3) 敢于删减的勇气
沃斯说,编程中最大的满足感来自成功删掉某样东西的时候。删除不再使用的代码,和添加功能一样重要。
沃斯定律提醒我们,在硬件进步替软件掩盖赘肉的同时,有些代价很容易被忽视。要让用户随着芯片变快而享受到更快的体验,开发者必须从一开始就把效率和简洁作为标准。这也与减少电力消耗和设备更换成本息息相关。
与其先想着添加,不如先考虑删减,这正是开发快速而持久的软件的第一步。