另一条前路

2001年9月

(本文解释了为什么下一代软件可能大多基于服务器,这对程序员意味着什么,以及这种新型软件为何是创业公司的巨大机遇。本文源自BBN Labs的一次演讲。)

1995年夏天,我和朋友Robert Morris决定创办一家创业公司。当时,Netscape IPO前的公关宣传正铺天盖地,媒体上充斥着关于在线商务的讨论。那时网上只有大约三十家手工搭建的商店。如果未来会有大量在线商店,就需要有搭建它们的软件,于是我们决定编写一些。

最初大约一周,我们打算将其做成一个普通的桌面应用程序。后来有一天,我们萌生了让软件在我们的Web服务器上运行,并使用浏览器作为界面的想法。我们尝试重写软件以使其能在Web上运行,结果很明显,这是正确的方向。如果我们将软件编写成在服务器上运行,那么对用户和我们来说都会容易得多。

这被证明是一个好计划。现在,作为Yahoo Store,这款软件是最受欢迎的在线商店搭建工具,拥有大约14,000名用户。

当我们创办Viaweb时,几乎没有人明白我们所说的软件在服务器上运行是什么意思。直到一年后Hotmail推出,人们才开始理解。现在每个人都知道这是一种可行的方法。我们当时所做的事情现在有了一个名字:应用服务提供商,简称ASP。

我认为下一代软件的很大一部分将采用这种模式编写。即使是损失最大的微软,似乎也看到了将一些东西从桌面移开的必然性。如果软件从桌面移到服务器上,这对开发者来说将是一个截然不同的世界。本文描述了作为这个新世界的首批访客,我们所看到的令人惊讶的事情。如果软件确实向服务器端迁移,那么我在这里描述的就是未来。

下一件大事?

当我们回顾桌面软件时代时,我想我们会惊叹于人们所忍受的不便,就像我们现在惊叹于早期汽车车主所忍受的那样。在最初的二三十年里,你必须是汽车专家才能拥有一辆汽车。但汽车的优势如此巨大,以至于许多非汽车专家也想拥有它们。

电脑现在正处于这个阶段。当你拥有一台桌面电脑时,你最终会学到比你想要了解的更多关于其内部运作的知识。但美国超过一半的家庭拥有一台。我母亲有一台电脑,她用它收发电子邮件和记账。大约一年前,她收到苹果公司的一封信,信中提供新版操作系统的折扣,这让她感到不安。一个只想用电脑收发邮件和记账的六十五岁老太太,却不得不考虑安装新操作系统,这说明有些事情不对劲。普通用户甚至不应该知道“操作系统”这个词,更不用说“设备驱动”或“补丁”了。

现在有另一种交付软件的方式,它将使用户免于成为系统管理员。基于Web的应用程序是在Web服务器上运行,并使用网页作为用户界面的程序。对于普通用户来说,这种新型软件将比桌面软件更简单、更便宜、更便携、更可靠,而且通常更强大。

使用基于Web的软件,大多数用户除了他们使用的应用程序外,无需考虑任何其他事情。所有那些繁琐、不断变化的东西都将位于某个服务器上,由擅长此类工作的人员维护。因此,你通常不需要一台电脑本身来使用软件。你只需要一个带有键盘、屏幕和Web浏览器的设备。也许它会有无线互联网接入。也许它也会是你的手机。无论它是什么,它都将是消费电子产品:一种大约200美元的设备,人们主要根据外观来选择。你为互联网服务支付的费用将超过硬件,就像你现在使用电话一样。[1]

点击到达服务器并返回大约需要十分之一秒,因此高度交互的软件,比如Photoshop的用户,仍然会希望计算发生在桌面上。但如果你看看大多数人使用电脑的目的,十分之一秒的延迟不会是个问题。我母亲并不真正需要一台桌面电脑,像她这样的人还有很多。

用户的胜利

我家附近有一辆车,保险杠上贴着“宁死不便”的贴纸。大多数人,在大多数时候,都会选择最省力的方案。如果基于Web的软件获胜,那将是因为它更方便。而且看起来,无论是对用户还是开发者,它都会更方便。

要使用纯粹基于Web的应用程序,你所需要的只是一个连接到互联网的浏览器。所以你可以在任何地方使用基于Web的应用程序。当你在桌面电脑上安装软件时,你只能在那台电脑上使用它。更糟糕的是,你的文件被困在那台电脑上。随着人们习惯网络,这种模式的不便之处变得越来越明显。

这里的楔子尖端是基于Web的电子邮件。现在数百万人意识到无论身在何处都应该能够访问电子邮件。如果你能看到你的电子邮件,为什么不能看到你的日历呢?如果你能与同事讨论文档,为什么不能编辑它呢?为什么你的任何数据都应该被困在某个遥远办公桌上的电脑里?

“你的电脑”这个概念正在消失,取而代之的是“你的数据”。你应该能够从任何电脑访问你的数据。或者更确切地说,是任何客户端,而且客户端不一定是电脑。

客户端不应该存储数据;它们应该像电话一样。事实上,它们甚至可能变成电话,反之亦然。随着客户端变得越来越小,你有了另一个不将数据保存在其上的理由:随身携带的东西可能会丢失或被盗。把你的PDA落在出租车里就像硬盘崩溃一样,只不过你的数据是被交给了别人,而不是蒸发了。

使用纯粹基于Web的软件,你的数据和应用程序都不会保存在客户端。所以你无需安装任何东西即可使用。没有安装,你就不必担心安装出错。应用程序和你的操作系统之间不会存在不兼容问题,因为软件不在你的操作系统上运行。

因为它无需安装,所以在“购买”之前试用基于Web的软件将变得容易且普遍。你应该期望能够免费试用任何基于Web的应用程序,只需访问提供它的网站即可。在Viaweb,我们整个网站就像一个巨大的箭头,指引用户进行试用。

试用演示后,注册服务只需填写一份简短的表格(越简短越好)。那应该是用户需要做的最后一步工作。使用基于Web的软件,你无需额外付费、无需任何操作,甚至可能在不知不觉中获得新版本。

升级将不再像现在这样令人震惊。随着时间的推移,应用程序将悄然变得更加强大。这需要开发者付出一些努力。他们必须设计软件时要确保它可以在不混淆用户的情况下进行更新。这是一个新问题,但有办法解决。

使用基于Web的应用程序,每个人都使用相同的版本,并且一旦发现错误就可以立即修复。因此,基于Web的软件应该比桌面软件少得多的错误。在Viaweb,我怀疑我们任何时候已知的错误数量从未超过十个。这比桌面软件好几个数量级。

基于Web的应用程序可以同时被多人使用。这对于协同应用程序来说是一个明显的优势,但我敢打赌,一旦用户意识到这是可能的,他们就会开始希望大多数应用程序都具备此功能。例如,让两个人编辑同一文档通常会很有用。Viaweb允许多个用户同时编辑一个网站,这更多是因为这是编写软件的正确方式,而不是因为我们期望用户会这样做,但事实证明许多用户确实有此需求。

当你使用基于Web的应用程序时,你的数据将更安全。硬盘崩溃不会成为过去,但用户将不再听到它们。它们将发生在服务器集群内部。提供基于Web应用程序的公司会真正进行备份——不仅因为他们有真正的系统管理员担心这些事情,还因为丢失用户数据的ASP将面临巨大的麻烦。当人们在硬盘崩溃中丢失自己的数据时,他们不会那么生气,因为他们只能生自己的气。当一家公司为他们丢失数据时,他们会更加愤怒。

最后,基于Web的软件应该更不容易受到病毒攻击。如果客户端除了浏览器什么都不运行,那么运行病毒的可能性就更小,也没有本地数据可供破坏。攻击服务器本身的程序会发现它们防守严密。[2]

对于用户来说,基于Web的软件将_压力更小_。我认为如果你审视一下普通的Windows用户,你会发现他们对符合这种描述的软件有着巨大且几乎未被开发的渴望。一旦释放,它可能是一股强大的力量。

代码之城

对开发者来说,基于Web的软件和桌面软件之间最显著的区别在于,基于Web的应用程序不是一个单一的代码块。它将是不同类型程序的集合,而不是一个单一的巨大二进制文件。因此,设计基于Web的软件就像设计一座城市而不是一栋建筑:除了建筑物,你还需要道路、路标、公用设施、警察和消防部门,以及增长和各种灾难的计划。

在Viaweb,软件包括用户直接交互的相当大的应用程序、那些程序使用的程序、在后台持续运行以查找问题的程序、如果出现故障则尝试重启的程序、偶尔运行以编译统计数据或为搜索构建索引的程序、我们明确运行以进行资源垃圾回收或移动/恢复数据的程序、假装是用户的程序(用于测量性能或暴露错误)、诊断网络问题的程序、进行备份的程序、外部服务接口、驱动一系列令人印象深刻的实时服务器统计数据显示盘的软件(对访客来说很受欢迎,但对我们来说也必不可少)、对开源软件的修改(包括错误修复),以及大量的配置文件和设置。在我们被Yahoo收购后,Trevor Blackwell编写了一个出色的程序,可以在不关闭商店的情况下将它们迁移到全国各地的新服务器上。程序会呼叫我们,向用户发送传真和电子邮件,与信用卡处理商进行交易,并通过套接字、管道、http请求、ssh、udp数据包、共享内存和文件相互通信。Viaweb的某些部分甚至是由程序的缺失组成的,因为Unix安全的关键之一就是不运行人们可能用来入侵服务器的不必要的实用程序。

这不仅仅是软件。我们花了很多时间思考服务器配置。我们自己用组件搭建服务器——部分是为了省钱,部分是为了得到我们想要的东西。我们必须考虑我们的上游ISP是否与所有骨干网有足够快的连接。我们逐一考察了RAID供应商。

但硬件不仅仅是需要担心的事情。当你控制它时,你可以为用户做更多事情。对于桌面应用程序,你可以指定某些最低硬件要求,但你无法添加更多。如果你管理服务器,你只需安装相关硬件,就可以一步到位地让所有用户能够呼叫他人、发送传真、通过电话发送命令或处理信用卡等。我们一直在寻找通过硬件添加新功能的方法,这不仅因为它能取悦用户,也是一种将自己与那些(无论是销售桌面软件,还是通过ISP转售基于Web的应用程序而)无法直接控制硬件的竞争对手区分开来的方式。

因为基于Web的应用程序中的软件将是程序集合而不是单一的二进制文件,所以它可以用任意多种不同的语言编写。当你编写桌面软件时,你实际上被迫使用与底层操作系统相同的语言编写应用程序——即C和C++。因此,这些语言(尤其是在经理和风险投资家等非技术人员中)被认为是“严肃”软件开发的语言。但这只是桌面软件交付方式的产物。对于基于服务器的软件,你可以使用任何你想要的语言。[3]如今,许多顶尖黑客正在使用与C和C++相去甚远的语言:Perl、Python,甚至Lisp。

对于基于服务器的软件,没有人能告诉你使用什么语言,因为你控制着整个系统,一直到硬件层面。不同的语言适用于不同的任务。你可以为每个任务选择最适合的语言。当你有了竞争对手,“你可以”就意味着“你必须”(我们稍后会回到这一点),因为如果你不利用这种可能性,你的竞争对手就会利用。

我们的大多数竞争对手都使用C和C++,这使得他们的软件明显逊色,因为(除其他原因外)他们无法绕过CGI脚本的无状态性。如果你要修改某些内容,所有修改都必须在同一个页面上完成,并在底部有一个“更新”按钮。正如我在其他地方写过的,通过使用Lisp(许多人仍然认为它是一种研究语言),我们可以让Viaweb编辑器表现得更像桌面软件。

发布

这个新世界最重要的变化之一是你发布软件的方式。在桌面软件业务中,发布软件是一场巨大的创伤,整个公司都为此汗流浃背、竭尽全力地推出一个单一的、庞大的代码块。无论是过程还是最终产品,都显而易见地让人联想到一些比较。

对于基于服务器的软件,你几乎可以像为自己编写程序一样进行更改。你以一系列增量更改的方式发布软件,而不是偶尔一次的大爆发。一家典型的桌面软件公司可能每年发布一到两次。在Viaweb,我们经常每天发布三到五次。

当你切换到这种新模式时,你会意识到软件开发在多大程度上受到发布方式的影响。你在桌面软件业务中看到的许多最棘手的问题都源于发布灾难性的本质。

每年只发布一个新版本,你往往会批量处理错误。在发布日期之前,你会组装一个新版本,其中一半代码被拆除并替换,引入了无数错误。然后一群QA人员介入并开始计数,程序员们则按列表逐一修复。他们通常无法完成列表,事实上,没有人确定列表的终点在哪里。这就像从池塘里捞瓦砾。你永远不知道软件内部到底发生了什么。充其量你只能得到一种统计学上的正确性。

对于基于服务器的软件,大多数变化都是小而增量的。这本身引入错误的几率就更小。这也意味着在即将发布软件时,你知道最需要仔细测试什么:你最后更改的内容。你对代码有更强的掌控力。一般来说,你确实知道它内部发生了什么。当然,你不会记住所有源代码,但当你阅读源代码时,你就像飞行员扫描仪表盘一样,而不是像侦探试图解开某个谜团。

桌面软件滋生了对错误的某种宿命论。你知道你发布的产品充满了错误,你甚至建立了弥补机制(例如补丁发布)。那么为什么还要担心多几个呢?很快你就会发布你明知有问题的完整功能。苹果今年早些时候就这样做了。他们感到发布新操作系统的压力,发布日期已经推迟了四次,但部分软件(对CD和DVD的支持)尚未准备好。解决方案?他们发布了没有未完成部分的操作系统,用户将不得不稍后安装它们。

对于基于Web的软件,你永远不必在软件可用之前发布它,并且一旦可用就可以立即发布。

行业资深人士可能会想,说你永远不必在软件可用之前发布它听起来是个好主意,但当你承诺在某个日期前交付新版本软件时会发生什么?对于基于Web的软件,你不会做出这样的承诺,因为没有版本之说。你的软件是逐步且持续变化的。有些变化可能比其他变化更大,但版本的概念就是不自然地适用于基于Web的软件。

如果有人记得Viaweb,这听起来可能很奇怪,因为我们总是宣布新版本。这完全是为了公关目的。我们了解到,行业媒体习惯于版本号思维。对于主要版本(即版本号的第一个数字发生变化)会给予大量报道,而对于点版本(即小数点后的数字发生变化)通常最多只有一段文字。

我们的一些竞争对手提供桌面软件,并且确实有版本号。而这些发布,仅仅是它们的存在,在我们看来就是它们落后的证据,却能获得各种宣传。我们不想错过,所以我们也开始给我们的软件赋予版本号。当我们想要一些宣传时,我们会列出自上次“发布”以来添加的所有功能,给软件贴上一个新的版本号,然后发布新闻稿,声称新版本已立即可用。令人惊讶的是,从来没有人对此提出质疑。

到我们被收购时,我们已经这样做了三次,所以我们当时是版本4。如果我没记错的话,是版本4.1。Viaweb成为Yahoo Store后,不再有那么迫切的宣传需求,所以尽管软件继续发展,版本号的概念还是悄然放弃了。

错误

基于Web软件的另一个主要技术优势是你可以重现大多数错误。用户的数据就在你的磁盘上。如果有人破坏了你的软件,你不需要像桌面软件那样去猜测发生了什么:你应该能够在他们与你通话时重现错误。如果你在应用程序中内置了错误通知代码,你甚至可能已经知道了。

基于Web的软件全天候使用,所以你所做的一切都会立即经受考验。错误很快就会出现。

软件公司有时被指责让用户来调试他们的软件。而这正是我所倡导的。对于基于Web的软件来说,这实际上是一个好计划,因为错误更少且是暂时的。当你逐步发布软件时,一开始就会有少得多的错误。当你能够重现错误并立即发布更改时,你可以在它们一出现就找到并修复大多数错误。我们任何时候都没有足够多的错误需要使用正式的错误跟踪系统。

当然,在发布更改之前你应该进行测试,这样就不会发布重大错误。那些不可避免地漏掉的少数错误将涉及边缘情况,并且只会在有人打电话投诉之前影响到少数遇到它们的用户。只要你立即修复错误,对于普通用户来说,最终效果就是错误少得多。我怀疑Viaweb的普通用户从未见过错误。

修复新错误比修复旧错误更容易。在你刚写的代码中找到错误通常相当快。当它出现时,你甚至在查看源代码之前通常就知道哪里出了问题,因为你已经潜意识里在担心它了。修复六个月前编写的代码中的错误(如果你每年发布一次,这是平均情况)要费力得多。而且由于你对代码的理解不够深入,你更有可能以一种糟糕的方式修复它,甚至引入更多错误。[4]

当你及早发现错误时,复合错误也会减少。复合错误是两个独立的错误相互作用:你下楼时绊倒了,当你伸手去抓扶手时,扶手却从你手中脱落了。在软件中,这种错误最难发现,也往往会带来最糟糕的后果。[5]传统的“破坏一切然后筛选出错误”的方法本身就会产生大量复合错误。而以一系列小改动发布软件则本身倾向于不会。地板不断被清扫干净,以防任何松散的物体日后卡住。

如果你使用一种名为函数式编程的技术,会有所帮助。函数式编程意味着避免副作用。这在研究论文中比在商业软件中更常见,但对于基于Web的应用程序来说,它被证明非常有用。很难将整个程序写成纯函数式代码,但你可以用这种方式编写大部分代码块。它使你软件的这些部分更容易测试,因为它们没有状态,这在不断进行和测试小修改的情况下非常方便。我用这种风格编写了Viaweb编辑器的很大一部分,并且我们将我们的脚本语言RTML设计成一种纯函数式语言。

来自桌面软件行业的人会觉得这难以置信,但在Viaweb,修复错误几乎成了一种游戏。由于大多数已发布的错误都涉及边缘情况,遇到它们的用户很可能是高级用户,他们正在挑战极限。高级用户对错误更宽容,尤其因为这些错误很可能是在添加他们所要求的功能时引入的。事实上,由于错误很少见,而且你必须做一些复杂的事情才能看到它们,所以高级用户经常为发现一个错误而感到自豪。他们打电话给支持部门时,与其说是愤怒,不如说是胜利的心情,仿佛他们从我们这里得了分。

支持

当你能够重现错误时,它会改变你对待客户支持的方式。在大多数软件公司,提供支持是为了让客户感觉更好。他们要么是打电话给你报告一个已知错误,要么是他们自己操作不当,你需要弄清楚原因。无论哪种情况,你都无法从他们那里学到太多。你倾向于将支持电话视为一种麻烦,并希望尽可能地将其与开发者隔离开来。

Viaweb的情况并非如此。在Viaweb,支持是免费的,因为我们希望听到客户的声音。如果有人遇到问题,我们希望立即知道,以便我们能够重现错误并发布修复。

因此在Viaweb,开发者始终与支持部门保持密切联系。客户支持人员距离程序员大约三十英尺,他们知道只要报告一个真正的错误,就可以随时打断任何事情。我们会离开董事会会议去修复一个严重的错误。

我们的支持方法让每个人都更快乐。客户很高兴。想象一下,打电话给支持热线,却被视为带来重要消息的人,那会是什么感觉。客户支持人员喜欢它,因为它意味着他们可以帮助用户,而不是向他们念稿子。程序员也喜欢它,因为他们可以重现错误,而不是仅仅听到模糊的二手报告。

我们即时修复错误的政策改变了客户支持人员和黑客之间的关系。在大多数软件公司,支持人员是薪水过低的人肉盾牌,而黑客则是上帝的微缩版,世界的创造者。无论错误报告程序如何,它很可能都是单向的:听到错误的支援人员填写表格,最终(可能通过QA)传递给程序员,程序员将其列入待办事项。Viaweb则大不相同。在从客户那里听到一个错误的一分钟内,支持人员就可以站在程序员旁边,听到他说“该死,你说得对,这是一个错误。”听到黑客说“你说得对”,支持人员感到非常高兴。他们过去给我们带来错误时,带着和猫给你带来它刚杀死的老鼠一样的期待神情。这也让他们在判断错误的严重性时更加谨慎,因为现在他们的荣誉受到了考验。

在我们被Yahoo收购后,客户支持人员被调离了程序员很远。直到那时我们才意识到,他们实际上是QA,在某种程度上也是营销人员。除了发现错误,他们还是那些模糊的、类似错误的事物的知识守护者,比如让用户感到困惑的功能。[6]他们也是一种代理焦点小组;我们可以问他们用户更喜欢两个新功能中的哪一个,他们总是对的。

士气

能够立即发布软件是一个巨大的动力。通常在我上班的路上,我就会想到一些我想对软件做的改变,然后当天就完成它。这对于更大的功能也适用。即使某个功能需要两周才能完成(很少有项目需要更长时间),我也知道一旦完成,就能立即在软件中看到效果。

如果我必须等待一年才能发布下一个版本,我至少会暂时搁置这些想法中的大部分。然而,想法的特点是它们会引出更多的想法。你有没有注意到,当你坐下来写东西时,最终出现在其中的一半想法都是你在写作过程中想到的?软件也是如此。努力实现一个想法会给你带来更多想法。因此,搁置一个想法不仅会让你延迟实现它,还会让你失去所有因实现它而产生的想法。事实上,搁置一个想法甚至可能会抑制新想法的产生:当你开始思考某个新功能时,你看到架子上的东西,就会想“但我已经有很多新功能想在下个版本中实现了。”

大公司不实现功能,而是规划它们。在Viaweb,我们有时会因此遇到麻烦。投资者和分析师会问我们未来有什么计划。真实的答案是,我们没有任何计划。我们对想要改进的事情有一些大致的想法,但如果我们知道如何做,我们早就做了。未来六个月我们要做什么?任何看起来最有益的事情。我不知道我是否敢给出这个答案,但那是事实。计划只是搁置在架子上的想法的另一个说法。当我们想到好主意时,我们就立即实施它们。

在Viaweb,和许多软件公司一样,大多数代码都有一个明确的负责人。但当你拥有某样东西时,你是真正拥有它:除了软件的负责人,没有人需要批准(甚至知道)发布。除了害怕在同事面前显得像个傻瓜之外,没有任何防止破坏的保护措施,而这已经足够了。我可能给人留下了我们只是漫不经心地埋头写代码的印象。我们确实进展很快,但在将软件发布到那些服务器上之前,我们考虑得非常仔细。而且,注意力比缓慢行动对可靠性更重要。因为他全神贯注,一名海军飞行员可以在夜间以每小时140英里的速度,更安全地将一架40,000磅的飞机降落在摇晃的航母甲板上,这比普通青少年切百吉饼还要安全。

这种编写软件的方式当然是一把双刃剑。它对于一个由优秀、值得信赖的程序员组成的小团队来说效果要好得多,而不是对于一个由平庸程序员组成的大公司,在那里,糟糕的想法是由委员会而不是提出者发现的。

反向布鲁克斯定律

幸运的是,基于Web的软件确实需要更少的程序员。我曾经在一家中型桌面软件公司工作,整个工程部门有100多人。其中只有13人从事产品开发。其余的人都在忙于发布、移植等等。对于基于Web的软件,你最多只需要那13个人,因为没有发布、移植等等。

Viaweb只由三个人编写。[7]我总是面临着雇佣更多人的压力,因为我们想被收购,而且我们知道买家很难为一家只有三名程序员的公司支付高价。(解决方案:我们雇佣了更多人,但为他们创建了新项目。)

当你能用更少的程序员编写软件时,你节省的不仅仅是金钱。正如Fred Brooks在《人月神话》中指出的,向项目中增加人手往往会减慢进度。开发者之间可能的连接数量随着团队规模的增长呈指数级增长。团队越大,他们花在会议上协商软件如何协同工作的时间就越多,并且由于意想不到的交互而产生的错误也越多。幸运的是,这个过程也反向运作:随着团队规模变小,软件开发效率呈指数级提高。我不记得Viaweb的程序员开过任何实际会议。我们任何时候要说的话,都没有多到需要专门开会,午饭路上就能说完。

如果这里有缺点,那就是所有程序员在某种程度上也必须是系统管理员。当你托管软件时,必须有人监控服务器,实际上,唯一能正确做到这一点的人就是编写软件的人。在Viaweb,我们的系统组件众多且变化频繁,以至于软件和基础设施之间没有明确的界限。随意声明这样的界限会限制我们的设计选择。因此,尽管我们一直希望有一天(“几个月内”)一切都能足够稳定,我们可以雇佣一个专门负责服务器的人,但这从未发生过。

我认为只要你还在积极开发产品,就不可能有其他方式。基于Web的软件永远不会是你写完、提交然后就可以回家休息的东西。它是一个活生生的东西,此刻正在你的服务器上运行。一个严重的错误可能不仅仅导致一个用户进程崩溃;它可能导致所有用户进程崩溃。如果你的代码中的一个错误损坏了磁盘上的某些数据,你必须修复它。等等。我们发现你不需要每分钟都盯着服务器(大约一年后),但你肯定会密切关注你最近更改的东西。你不会深夜发布代码然后回家。

观察用户

对于基于服务器的软件,你与你的代码更紧密地接触。你也可以与你的用户更紧密地接触。Intuit公司以在零售店向顾客介绍自己并请求跟随他们回家而闻名。如果你曾观察过某人第一次使用你的软件,你就会知道有什么惊喜在等着他们。

软件应该按照用户所想的方式运行。但相信我,在你观察他们之前,你根本不知道用户会怎么想。基于服务器的软件为你提供了前所未有的用户行为信息。你不再局限于小型、人为的焦点小组。你可以看到每个用户进行的每一次点击。你必须仔细考虑你要查看什么,因为你不想侵犯用户的隐私,但即使是最普遍的统计抽样也可能非常有用。

当用户在你的服务器上时,你无需依赖基准测试。基准测试是模拟用户。对于基于服务器的软件,你可以观察实际用户。要决定优化什么,只需登录服务器,看看是什么消耗了所有的CPU。你也会知道何时停止优化:我们最终将Viaweb编辑器优化到内存受限而非CPU受限的程度,而且由于我们无法(至少不容易)减少用户数据的大小,我们知道我们不妨就此打住。

效率对于基于服务器的软件很重要,因为你要为硬件付费。每台服务器能支持的用户数量是你的资本成本的除数。如果你能让你的软件非常高效,你就可以以低于竞争对手的价格销售,并且仍然盈利。在Viaweb,我们将每位用户的资本成本降至约5美元。现在会更低,可能比给他们寄第一个月账单的成本还要低。如果你的软件足够高效,现在硬件几乎是免费的。

观察用户可以指导你的设计和优化。Viaweb有一种名为RTML的脚本语言,允许高级用户定义自己的页面样式。我们发现RTML成了一种建议箱,因为用户只有在预定义页面样式无法满足他们需求时才会使用它。例如,最初编辑器将按钮条放在页面顶部,但在许多用户使用RTML将按钮放在左侧边栏后,我们将其作为预定义页面样式中的一个选项(实际上是默认选项)。

最后,通过观察用户,你通常可以判断他们何时遇到了麻烦。而且由于客户永远是对的,这表明你需要修复某些东西。在Viaweb,获取用户的关键是在线试用。它不仅仅是营销人员制作的一系列幻灯片。在我们的试用中,用户实际使用了软件。大约五分钟后,他们就搭建了一个真实可用的商店。

试用是我们获得几乎所有新用户的方式。我认为大多数基于Web的应用程序也会是这样。如果用户能成功完成试用,他们就会喜欢这个产品。如果他们感到困惑或无聊,他们就不会喜欢。因此,我们所做的一切能让更多人完成试用的事情,都会提高我们的增长率。

我研究了参与试用用户的点击轨迹,发现他们在某个步骤会感到困惑并点击浏览器的“后退”按钮。(如果你尝试编写基于Web的应用程序,你会发现“后退”按钮会成为你最有趣的哲学问题之一。)于是我在那个点添加了一条消息,告诉用户他们快完成了,并提醒他们不要点击“后退”按钮。基于Web软件的另一个优点是你可以从更改中获得即时反馈:完成试用的人数立即从60%上升到90%。由于新用户数量是完成试用数量的函数,仅仅因为这一改变,我们的收入增长了50%。

金钱

在1990年代早期,我读到一篇文章,有人说软件是一种订阅业务。起初这听起来像是一个非常愤世嫉俗的说法。但后来我意识到它反映了现实:软件开发是一个持续的过程。我认为如果你公开收取订阅费会更清晰,而不是强迫人们不断购买和安装新版本以便他们持续向你付费。幸运的是,订阅是基于Web应用程序的自然计费方式。

托管应用程序是一个公司将扮演重要角色的领域,而这个角色不太可能由免费软件来填补。托管应用程序压力很大,并且有实际开销。没有人会想免费做这件事。

对于公司来说,基于Web的应用程序是理想的收入来源。你不再是每个季度都从零开始,而是拥有持续的收入流。因为你的软件是逐步演进的,你无需担心新模式会失败;本身就不需要有新模式,如果你对软件做了用户讨厌的事情,你会立即知道。你不会有无法收回的账单问题;如果有人不付款,你只需关闭服务即可。而且没有盗版的可能性。

最后一个“优势”可能最终会成为一个问题。一定程度的盗版对软件公司有利。如果有些用户无论如何都不会购买你的软件,那么他使用盗版副本你也没有损失任何东西。事实上你还赚了,因为他多了一个用户,有助于让你的软件成为标准——或者他以后高中毕业时可能会购买一份正版。

在可能的情况下,公司喜欢进行所谓的“价格歧视”,这意味着向每个客户收取他们能承受的最高价格。[8]软件特别适合价格歧视,因为边际成本接近于零。这就是为什么有些软件在Sun服务器上运行比在Intel机器上运行更贵的原因:使用Sun服务器的公司不关心省钱,可以安全地向他们收取更多费用。盗版实际上是价格歧视的最低层级。我认为软件公司明白这一点,并故意对某些类型的盗版视而不见。[9]对于基于服务器的软件,他们将不得不拿出其他解决方案。

基于Web的软件销售良好,尤其与桌面软件相比,因为它易于购买。你可能认为人们决定购买某物,然后购买它,是两个独立的步骤。在Viaweb之前,如果我曾思考过这个问题,我就是这么想的。事实上,第二步可以反向影响第一步:如果某样东西很难购买,人们就会改变他们是否想要它的想法。反之亦然:当某样东西容易购买时,你会卖出更多。我买更多的书是因为有亚马逊。基于Web的软件是世界上最容易购买的东西,特别是如果你刚刚完成了一个在线演示。用户除了输入信用卡号之外,不应该需要做更多的事情。(让他们做更多,你将自担风险。)

有时基于Web的软件通过充当经销商的ISP提供。这是一个糟糕的主意。你必须管理服务器,因为你需要不断改进硬件和软件。如果你放弃对服务器的直接控制,你就会放弃开发基于Web应用程序的大部分优势。

我们的一些竞争对手就是这样搬起石头砸了自己的脚——通常,我认为,是因为他们被那些对这个巨大潜在渠道感到兴奋的西装革履的人所压倒,却没有意识到这会毁掉他们希望通过它销售的产品。通过ISP销售基于Web的软件就像通过自动售货机销售寿司一样。

客户

客户会是谁?在Viaweb,最初的客户是个人和小公司,我认为这对于基于Web的应用程序来说将是常态。这些用户愿意尝试新事物,部分原因是他们更灵活,部分原因是他们希望获得新技术带来的更低成本。

基于Web的应用程序对大公司来说也常常是最好的选择(尽管他们会迟迟才意识到)。最好的内网就是互联网。如果一家公司使用真正的基于Web的应用程序,软件会运行得更好,服务器会得到更好的管理,员工可以从任何地方访问系统。

反对这种方法通常围绕着安全性展开:如果员工更容易访问,那么坏人也更容易访问。一些大型商家不愿使用Viaweb,因为他们认为客户的信用卡信息放在自己的服务器上会更安全。要委婉地指出这一点并不容易,但事实上,数据在我们手中几乎肯定比在他们手中更安全。谁能雇佣更好的人来管理安全,是一家整个业务就是运行服务器的科技创业公司,还是一家服装零售商?我们不仅有更好的人员担心安全,我们自己也更担心。如果有人入侵了服装零售商的服务器,最多只会影响一个商家,很可能被掩盖,最坏的情况可能导致一个人被解雇。如果有人入侵我们的服务器,可能会影响数千家商家,很可能会成为CNet上的新闻,并可能导致我们倒闭。

如果你想让你的钱安全,你是把它放在家里的床垫下,还是存入银行?这个论点适用于服务器管理的各个方面:不仅仅是安全,还包括正常运行时间、带宽、负载管理、备份等。我们的生存取决于正确地完成这些事情。服务器问题对我们来说是绝对禁止的,就像危险玩具对玩具制造商,或沙门氏菌爆发对食品加工商一样。

一家使用基于Web应用程序的大公司,在某种程度上是在外包IT。尽管听起来很激进,但我认为这通常是个好主意。公司通过这种方式可能会获得比内部系统管理员更好的服务。系统管理员可能会变得脾气暴躁、反应迟钝,因为他们没有直接面临竞争压力:销售人员必须与客户打交道,开发人员必须与竞争对手的软件打交道,但系统管理员,就像一个老单身汉,很少有外部力量来约束他。[10]在Viaweb,我们有充足的外部力量来约束我们。打电话给我们的人是客户,而不仅仅是同事。如果服务器卡住了,我们就会跳起来;多年后,仅仅想到它都会让我肾上腺素飙升。

因此,基于Web的应用程序通常对大公司来说也是正确的选择。然而,他们将是最后意识到这一点的人,就像他们对待桌面电脑一样。部分原因也相同:说服大公司他们需要更昂贵的东西,将带来巨大的利润。

富裕的客户总是倾向于购买昂贵的解决方案,即使廉价的解决方案更好,因为提供昂贵解决方案的人可以花费更多来推销它们。在Viaweb,我们总是面临这种情况。我们失去了几家高端商家,他们被Web咨询公司说服,认为如果他们花费五十万美元在自己的服务器上定制一个在线商店会更好。通常情况下,他们并没有过得更好,不止一家公司在圣诞购物季到来、服务器负载升高时发现了这一点。Viaweb比这些商家获得的大多数东西都要复杂得多,但我们负担不起告诉他们。每月300美元,我们无法负担派遣一支衣着考究、听起来权威的团队去向客户做演示。

大公司额外支付的很大一部分费用是向他们销售昂贵产品的成本。(如果国防部为马桶座支付一千美元,部分原因在于以一千美元的价格销售马桶座本身就需要高昂的成本。)这就是内网软件将继续蓬勃发展的原因之一,尽管它可能是一个糟糕的主意。它就是更贵。你对这个难题无能为力,所以最好的计划是先争取小客户。其余的会随着时间到来。

服务器之子

在服务器上运行软件并非新鲜事。事实上,这是旧模式:大型机应用程序都是基于服务器的。如果基于服务器的软件是个好主意,为什么上次它会失败?为什么桌面电脑会超越大型机?

起初,桌面电脑看起来并没有多大威胁。第一批用户都是黑客——或者当时被称为业余爱好者。他们喜欢微型计算机,因为它们便宜。这是第一次,你可以拥有自己的电脑。“个人电脑”这个词现在已是语言的一部分,但它最初使用时,带有一种刻意大胆的意味,就像今天的“个人卫星”这个词一样。

为什么桌面电脑会占据主导地位?我认为是因为它们有更好的软件。我认为微型计算机软件之所以更好,是因为它可以由小公司编写。

我认为很多人没有意识到创业公司在早期阶段是多么脆弱和不确定。许多创业公司几乎是偶然开始的——几个家伙,要么有日常工作,要么还在上学,编写一个可能(如果看起来有前景)会变成公司的原型。在这个萌芽阶段,任何重大障碍都会让创业公司戛然而止。编写大型机软件需要前期投入太多。开发机器昂贵,而且由于客户将是大公司,你需要一支看起来令人印象深刻的销售团队才能将产品卖给他们。创办一家编写大型机软件的创业公司,将比晚上在你的Apple II上随便捣鼓点东西要严肃得多。因此,你不会看到很多创业公司编写大型机应用程序。

桌面电脑的出现激发了大量新软件的诞生,因为为它们编写应用程序对萌芽期的创业公司来说似乎是一个可实现的目标。开发成本低廉,客户将是可以通过电脑商店甚至邮购接触到的个人用户。

将桌面电脑推向主流的应用程序是VisiCalc,第一个电子表格软件。它是由两个在阁楼里工作的人编写的,却能做大型机软件无法做到的事情。[11]VisiCalc在当时是如此先进,以至于人们购买Apple II只是为了运行它。这就是一个趋势的开始:桌面电脑之所以获胜,是因为创业公司为它们编写了软件。

这一次,基于服务器的软件看起来会表现良好,因为创业公司会编写它。现在电脑如此便宜,你可以像我们一样,用一台桌面电脑作为服务器来起步。廉价处理器已经吞噬了工作站市场(你现在甚至很少听到这个词),并且正在大部分地渗透服务器市场;Yahoo的服务器,处理着互联网上最高的负载,都使用与你桌面电脑中相同的廉价Intel处理器。一旦你编写了软件,你所需要做的就是建立一个网站来销售它。我们几乎所有的用户都是通过口碑和媒体报道直接来到我们的网站的。[12]

Viaweb是一个典型的萌芽期创业公司。我们对创办公司感到恐惧,最初几个月我们通过将整个事情视为一个随时可能叫停的实验来安慰自己。幸运的是,除了技术障碍,几乎没有其他障碍。当我们编写软件时,我们的Web服务器就是我们用于开发的同一台桌面机器,通过拨号连接到外部世界。那个阶段我们唯一的开销是食物和房租。

现在创业公司有更多理由编写基于Web的软件,因为编写桌面软件已经变得不那么有趣了。如果你现在想编写桌面软件,你必须按照微软的条款来做,调用他们的API并围绕他们有缺陷的操作系统进行开发。如果你设法写出了一些大受欢迎的东西,你可能会发现你只是在为微软做市场调研。

如果一家公司想创建一个供创业公司在其上构建的平台,他们必须让它成为黑客自己会想使用的东西。这意味着它必须便宜且设计精良。Mac刚推出时受到黑客的欢迎,许多黑客为其编写了软件。[13]在Windows上这种情况较少见,因为黑客不使用它。擅长编写软件的人现在倾向于运行Linux或FreeBSD。

我认为我们不会创办一家编写桌面软件的创业公司,因为桌面软件必须在Windows上运行,而在我们为Windows编写软件之前,我们必须先使用它。Web让我们能够绕过Windows,通过浏览器直接向用户交付在Unix上运行的软件。这是一个解放性的前景,很像二十五年前个人电脑的出现。

微软

当年桌面电脑出现时,IBM是人人畏惧的巨头。现在很难想象,但我清楚地记得那种感觉。现在令人恐惧的巨头是微软,我认为他们不像IBM那样对面临的威胁视而不见。毕竟,微软是故意在IBM的盲点上建立起自己的业务的。

我前面提到,我母亲并不真正需要一台桌面电脑。大多数用户可能都不需要。这对微软来说是个问题,他们也知道。如果应用程序在远程服务器上运行,就没有人需要Windows。微软会怎么做?他们能否利用对桌面的控制来阻止或限制这一代新软件?

我猜测微软会开发某种服务器/桌面混合模式,操作系统与他们控制的服务器协同工作。至少,文件将集中可用,供有此需求的用户使用。我预计微软如果能避免,就不会完全走向极端,即在服务器上进行计算,客户端只用浏览器。如果你只需要一个浏览器作为客户端,那么客户端就不需要微软,如果微软无法控制客户端,他们就无法将用户推向他们基于服务器的应用程序。

我认为微软将很难把精灵关在瓶子里。客户端类型会太多,他们无法全部控制。如果微软的应用程序只适用于某些客户端,竞争对手就可以通过提供适用于任何客户端的应用程序来胜过他们。[14]

在基于Web的应用程序世界中,微软没有自动的立足之地。他们可能会成功为自己争取一席之地,但我认为他们不会像在桌面应用程序世界中那样主导这个新世界。

与其说竞争对手会绊倒他们,不如说他们会自己绊倒自己。随着基于Web的软件的兴起,他们将面临的不仅是技术问题,还有他们自己的一厢情愿。他们需要做的是蚕食他们现有的业务,而我看不出他们能做到这一点。正是这种让他们走到今天的专注,现在将反过来阻碍他们。IBM当时也处于完全相同的情况,他们无法掌控。IBM迟迟不情愿地进入微型计算机业务,因为他们对威胁其摇钱树——大型机计算——感到矛盾。微软同样会因为想保住桌面业务而受阻。摇钱树也可能成为你背上该死的沉重负担。

我不是说没有人会主导基于服务器的应用程序。最终可能会有人主导。但我认为会有一段相当长的愉快混乱时期,就像微型计算机早期一样。那对创业公司来说是个好时机。许多小公司蓬勃发展,通过创造酷炫的东西做到了这一点。

创业公司,但更甚

经典的创业公司是快速、非正式的,人少钱少。那些少数人非常努力地工作,而技术放大了他们所做决策的影响。如果他们赢了,他们就大赢。

在编写基于Web应用程序的创业公司中,你与创业公司相关的一切都被推向了极致。你可以用更少的人和更少的钱编写并推出产品。你必须更快,而且你可以更随意。你真的可以像三个人坐在公寓客厅里,服务器托管在ISP那里一样推出你的产品。我们就是这样做的。

随着时间的推移,团队变得更小、更快、更非正式。1960年,软件开发意味着一屋子戴着角框眼镜、系着窄黑领带的男士,勤奋地在IBM编码表格上每天编写十行代码。1980年,则是一个由八到十人组成的团队,他们穿着牛仔裤去办公室,在vt100终端上打字。现在,则是几个人坐在客厅里,用笔记本电脑工作。(而且牛仔裤也并非非正式着装的终极形态。)

创业公司压力很大,不幸的是,基于Web的应用程序也将这种压力推向了极致。许多软件公司,尤其是在初期,都有开发者睡在办公桌下等等的时期。基于Web软件令人担忧的是,没有什么能阻止这种情况成为常态。关于睡在办公桌下的故事通常以这样的结局告终:然后我们终于发布了,大家回家睡了一周。基于Web的软件永不“发布”。你可以想工作多久就工作多久,每天16小时。而且因为你能做到,你的竞争对手也能做到,你往往被迫这样做。你能,所以你必须。这是帕金森定律的反向运作。

最糟糕的不是工作时间,而是责任。程序员和系统管理员传统上各有各的担忧。程序员必须担心错误,系统管理员必须担心基础设施。程序员可能一整天都埋头于源代码中,但到某个时候他们可以回家并忘记它。系统管理员从不完全脱离工作,但当他们在凌晨4点被呼叫时,他们通常不需要做任何非常复杂的事情。对于基于Web的应用程序,这两种压力结合在一起了。程序员变成了系统管理员,但却没有通常使这份工作变得可承受的明确界限。

在Viaweb,我们前六个月只专注于编写软件。我们像早期创业公司一样长时间工作。在一家桌面软件公司,这本该是我们努力工作的阶段,但与下一阶段——当我们将用户引入我们的服务器时——相比,这感觉就像度假。将Viaweb出售给Yahoo的第二大好处(仅次于金钱)是能够将整个事情的最终责任推卸给一家大公司。

桌面软件迫使用户成为系统管理员。基于Web的软件迫使程序员成为系统管理员。总的压力更小,但程序员的压力更大。这不一定是坏消息。如果你是一家与大公司竞争的创业公司,这是个好消息。[15]基于Web的应用程序提供了一种直接超越竞争对手的方式。创业公司别无所求。

刚刚好

可能阻止你编写基于Web应用程序的一件事是网页作为用户界面的不足。我承认这是一个问题。我们确实_非常_想在HTML和HTTP中添加一些东西。然而,重要的是网页已经足够好用了。

这里与第一批微型计算机有相似之处。那些机器中的处理器实际上并非旨在成为计算机的CPU。它们被设计用于交通信号灯之类的设备。但像设计Altair的Ed Roberts这样的人意识到,它们已经足够好了。你可以将这些芯片中的一个与一些内存(第一台Altair有256字节)和前面板开关结合起来,你就会得到一台能工作的电脑。能够拥有自己的电脑是如此令人兴奋,以至于有很多人愿意购买它们,无论它们有多么有限。

网页并非设计为应用程序的用户界面,但它们已经足够好用了。对于相当数量的用户来说,可以从任何浏览器使用的软件本身就足以成为一个巨大的优势,足以抵消用户界面上的任何不便。也许你无法使用HTML编写出最好看的电子表格,但你可以编写一个允许多人从不同地点同时使用、无需特殊客户端软件的电子表格,或者可以整合实时数据流,或者在特定条件触发时呼叫你的电子表格。更重要的是,你可以编写出甚至还没有命名的新型应用程序。VisiCalc毕竟不仅仅是大型机应用程序的微型计算机版本——它是一种新型应用程序。

当然,基于服务器的应用程序不一定非得是基于Web的。你可以有其他类型的客户端。但我很确定那是个坏主意。如果你能假设每个人都会安装你的客户端,那会非常方便——方便到你很容易说服自己他们都会安装——但如果他们不安装,你就完蛋了。因为基于Web的软件不假定客户端的任何特性,它可以在Web工作的任何地方运行。这本身就是一个巨大的优势,随着新的Web设备普及,这个优势还会增长。用户会喜欢你,因为你的软件就是能用,你的生活也会更轻松,因为你无需为每个新客户端进行调整。[16]

我觉得我像任何人一样密切关注着Web的演变,但我无法预测客户端会发生什么。融合可能正在到来,但会在哪里?我无法选出赢家。我能预测的一件事是AOL和微软之间的冲突。无论微软的.NET最终会是什么,它可能都将涉及将桌面连接到服务器。除非AOL反击,否则他们要么被排挤,要么变成微软客户端和服务器软件之间的管道。如果微软和AOL陷入客户端战争,唯一确定能在两者上都运行的将是Web浏览,这意味着基于Web的应用程序将是唯一能在任何地方运行的类型。

这一切将如何发展?我不知道。如果你押注基于Web的应用程序,你也不必知道。没有人能在不破坏浏览功能的情况下破坏它。Web可能不是交付软件的唯一方式,但它是一种现在可行并将长期可行的方式。基于Web的应用程序开发成本低廉,即使是最小的创业公司也能轻松交付。它们工作量大,而且压力特别大,但这只会让创业公司的胜算更大。

为什么不?

E. B. White从一位农民朋友那里得知,许多电围栏实际上并没有电流通过,这让他感到好笑。奶牛显然学会了远离它们,之后你就不再需要电流了。他写道:“起来,奶牛们!趁暴君打鼾时,夺回你们的自由!”

如果你是一个曾想过有一天创办一家创业公司的黑客,可能有两件事阻碍着你。一是你对商业一无所知。另一个是你害怕竞争。这两道围栏都没有电流。

关于商业,你只需要知道两件事:创造用户喜欢的东西,并赚得比花得多。如果你做对了这两件事,你就会领先于大多数创业公司。其余的你可以在实践中摸索。

你可能一开始赚得没有花得多,但只要差距缩小得足够快,你就会没事。如果你一开始资金不足,至少会培养节俭的习惯。你花得越少,赚得比花得多就越容易。幸运的是,启动一个基于Web的应用程序可以非常便宜。我们启动时花费不到10,000美元,现在会更便宜。我们不得不花费数千美元购买服务器,再花费数千美元获取SSL。(当时唯一销售SSL软件的公司是Netscape。)现在你可以租用一台功能强大得多的服务器,包含SSL,费用比我们当时仅为带宽支付的还要少。现在启动一个基于Web的应用程序,花费甚至比一把高档办公椅还要少。

至于创造用户喜欢的东西,这里有一些一般性建议。首先制作一个你自己会想使用的简洁简单的东西。快速推出1.0版本,然后继续改进软件,在此过程中密切倾听用户的意见。客户永远是对的,但不同的客户在不同的事情上是对的;最不精通的用户会告诉你需要简化和澄清什么,而最精通的用户会告诉你需要添加什么功能。软件最好的特质是易用,但实现这一点的方法是设置好默认值,而不是限制用户的选择。如果你的竞争对手的软件很糟糕,不要自满;衡量你软件的标准应该是它可能达到的样子,而不是你现有竞争对手碰巧拥有的东西。始终自己使用你的软件。Viaweb本应是一个在线商店搭建工具,但我们也用它来搭建我们自己的网站。不要仅仅因为他们的职位头衔就听信营销人员、设计师或产品经理。如果他们有好主意,就采纳,但最终由你来决定;软件必须由懂设计的黑客来设计,而不是懂一点软件的设计师。如果你不能像实现软件一样设计软件,就不要创办创业公司。

现在我们来谈谈竞争。你害怕的可能不是像你这样的黑客群体,而是那些有办公室、有商业计划、有销售人员等的实际公司,对吗?嗯,他们比你更害怕你,而且他们是对的。对于几个黑客来说,弄清楚如何租用办公空间或雇佣销售人员要比任何规模的公司编写软件容易得多。我两边都经历过,我知道。当Viaweb被Yahoo收购后,我突然发现自己为一家大公司工作,那感觉就像在齐腰深的水中奔跑。

我无意贬低Yahoo。他们有一些优秀的黑客,高层管理人员也都是真正的实干家。对于一家大公司来说,他们是出类拔萃的。但他们的生产力仍然只有小型创业公司的十分之一左右。没有哪家大公司能比这好多少。微软令人恐惧的地方在于,一家如此大的公司竟然还能开发软件。他们就像一座会走路的山。

不要被吓倒。你能做到的微软做不到的,和他们能做到的你做不到的,一样多。没有人能阻止你。你不需要征得任何人的许可来开发基于Web的应用程序。你不需要进行许可交易,不需要在零售店获得货架空间,也不需要卑躬屈膝地让你的应用程序与操作系统捆绑销售。你可以直接将软件交付到浏览器,没有人能在不阻止用户浏览Web的情况下,阻碍你与潜在用户之间的联系。

你可能不相信,但我向你保证,微软害怕你。那些自满的中层经理可能不害怕,但比尔害怕,因为他曾经就是你,早在1975年,那是上一次出现新的软件交付方式的时候。

注释

[1] 意识到大部分利润来自服务,构建轻量级客户端的公司通常试图将硬件与在线服务结合起来。这种方法效果不佳,部分原因是你需要两种不同类型的公司来制造消费电子产品和运营在线服务,部分原因在于用户讨厌这种想法。赠送剃须刀并在刀片上赚钱可能对吉列有效,但剃须刀的投入远小于Web终端。手机制造商满足于销售硬件,而不试图同时获取服务收入。这可能也应该是互联网客户端的模式。如果有人只销售一个外观漂亮的小盒子,内置Web浏览器,你可以通过任何ISP连接,那么全国的科技恐惧症患者都会买一个。

[2] 安全性总是更多地取决于不犯错,而非任何设计决策,但基于服务器的软件的性质将使开发者更加注重不犯错。服务器被攻破可能造成巨大损失,以至于ASP(如果想继续经营)很可能会非常重视安全。

[3] 1995年,当我们创办Viaweb时,Java小程序(applets)被认为是所有人都会用来开发基于服务器应用程序的技术。对我们来说,小程序似乎是一个过时的想法。下载程序在客户端运行?不如干脆直接在服务器上运行程序。我们几乎没有在小程序上浪费时间,但无数其他创业公司肯定被引诱进了这个焦油坑。很少有人能活着逃脱,否则微软就不可能在最新版本的IE浏览器中放弃Java。

[4] 这一点归功于Trevor Blackwell,他补充道:“编写软件的成本随着其规模的增长呈超线性增长。这可能主要是由于修复旧错误,如果所有错误都能迅速发现,成本可能会更趋于线性。”

[5] 最难发现的错误可能是一种复合错误的变体,其中一个错误恰好弥补了另一个错误。当你修复一个错误时,另一个错误就会显现出来。但看起来好像是修复本身出了问题,因为那是你最后更改的东西。

[6] 在Viaweb内部,我们曾举办过一次比赛,描述我们软件最糟糕的地方。两位客户支持人员并列第一,他们的描述至今让我不寒而栗。我们立即修复了这两个问题。

[7] Robert Morris编写了订单系统,供购物者下单。Trevor Blackwell编写了图片生成器和管理器,供商家检索订单、查看统计数据和配置域名等。我编写了编辑器,供商家搭建网站。订单系统和图片生成器是用C和C++编写的,管理器主要用Perl编写,编辑器则用Lisp编写。

[8] 价格歧视如此普遍(你多久听到一次零售商声称他们的购买力意味着为你带来更低的价格?),以至于我惊讶地发现它在1936年的《罗宾逊-帕特曼法案》(Robinson-Patman Act)中被美国法律禁止。这项法律似乎没有被严格执行。

[9] 在《无品牌》一书中,娜奥米·克莱恩(Naomi Klein)说,受“都市青年”青睐的服装品牌不会太努力地阻止商店盗窃,因为在他们的目标市场中,盗窃者也是时尚引领者。

[10] 公司经常想知道哪些工作应该外包,哪些不应该。一个可能的答案是:外包任何没有直接暴露在竞争压力下的工作,因为外包它将使其暴露在竞争压力之下。

[11] 这两个人是Dan Bricklin和Bob Frankston。Dan在几天内用Basic编写了一个原型,然后在接下来的一年里,他们一起工作(大部分在晚上),用6502机器语言编写了一个更强大的版本。当时Dan在哈佛商学院,Bob名义上有一份编写软件的日常工作。Bob写道:“做生意没有很大的风险,如果失败了就失败了,没什么大不了的。”

[12] 这并不像我说的那么容易。口碑传播耗费了漫长而痛苦的时间,直到我们每月花费16,000美元聘请了一家公关公司(公认是业内最好的),才开始获得大量媒体报道。然而,唯一重要的渠道确实是我们自己的网站。

[13] 如果Mac那么好,为什么会失败?还是成本。微软专注于软件业务,并向苹果硬件释放了一大批廉价组件供应商。此外,在关键时期,西装革履的人接管了公司,这也无济于事。

[14] 有一件事将有助于基于Web的应用程序,并有助于防止下一代软件被微软的光芒掩盖,那就是一个好的开源浏览器。Mozilla是开源的,但似乎长期作为企业软件而受到影响。一个小型、快速且积极维护的浏览器本身就是一件好事,也可能会鼓励公司构建小型Web设备。

除此之外,一个合适的开源浏览器将促使HTTP和HTML继续发展(就像Perl那样)。它将极大地帮助基于Web的应用程序区分选择链接和跟随链接;你所需要做的只是对HTTP进行一个微不足道的增强,允许在一个请求中包含多个URL。级联菜单也会很好。

如果你想改变世界,就写一个新的Mosaic。觉得太晚了吗?1998年,很多人认为推出一个新的搜索引擎已经太晚了,但Google证明他们错了。如果现有选项足够糟糕,总会有新事物的空间。首先确保它能在所有免费操作系统上运行——新事物从其用户开始。

[15] Trevor Blackwell,他可能比任何人都对此有更深的亲身经验,他写道:

“我会更进一步地说,正因为基于服务器的软件对程序员来说如此艰难,它导致了经济上从大公司向外的一个根本性转变。它需要程序员付出那种只有在自己的公司时才愿意提供的强度和奉献。软件公司可以雇佣有技能的人在要求不高的环境中工作,也可以雇佣没有技能的人忍受艰辛,但他们无法雇佣高技能的人去拼命。由于不再需要大量资本,大公司能提供的东西很少。”

[16] 在这篇论文的原始版本中,我建议避免使用Javascript。在2001年,那是一个好计划,但现在Javascript已经可行了。

致谢

感谢Sarah Harlin、Trevor Blackwell、Robert Morris、Eric Raymond、Ken Anderson和Dan Giffin审阅本文草稿;感谢Dan Bricklin和Bob Frankston提供VisiCalc的信息;再次感谢Ken Anderson邀请我在BBN发表演讲。

你可以在黑客与画家中找到这篇论文和另外14篇。