English Version

另一条道路

2001年9月

(本文解释了为什么下一代软件的大部分可能是基于服务器的,这对程序员意味着什么,以及这种新型软件为什么是创业公司的绝佳机会。本文源自在BBN实验室的一次演讲。)

1995年夏天,我的朋友Robert Morris和我决定创办一家创业公司。当时,围绕Netscape IPO的公关活动正如火如荼地进行,媒体上有很多关于电子商务的讨论。那时网络上可能只有三十家实际的商店,都是手工制作的。如果将来会有很多在线商店,就需要制作它们的软件,所以我们决定写一些这样的软件。

在最初的一周左右,我们打算将其制作成一个普通的桌面应用程序。然后有一天我们想到让软件在我们的Web服务器上运行,使用浏览器作为界面。我们尝试重写软件使其在Web上工作,很明显这是正确的方法。如果我们编写的软件在服务器上运行,对用户和我们自己都会容易得多。

结果证明这是一个好计划。现在,作为Yahoo Store,这个软件是最受欢迎的在线商店构建器,拥有约14,000个用户。

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

我认为下一代软件的大部分都将按照这个模型编写。即使是损失最大的微软,似乎也看到将一些东西移出桌面是不可避免的。如果软件从桌面移到服务器上,对开发者来说将意味着一个完全不同的世界。本文描述了我们作为这个新世界的首批访客所看到的令人惊讶的事情。就软件确实转移到服务器上的程度而言,我在这里描述的就是未来。

下一件大事?

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

计算机现在正处于这个阶段。当你拥有桌面计算机时,你最终会学到比你想要知道的更多关于其内部情况的知识。但超过一半的美国家庭都拥有一台。我母亲有一台计算机,她用它来收发邮件和记账。大约一年前,她收到Apple的一封信,为她提供新操作系统的折扣,这让她感到担忧。当一个65岁的女性只想用计算机来收发邮件和记账时,却不得不考虑安装新的操作系统,这就有问题了。普通用户甚至不应该知道"操作系统"这个词,更不用说"设备驱动程序"或"补丁"了。

现在有另一种交付软件的方式可以拯救用户免于成为系统管理员。基于Web的应用程序是在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++,这使得他们的软件明显 inferior,因为(除其他外),他们无法解决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,开发者与支持始终保持密切联系。客户支持人员距离程序员约30英尺,他们知道他们可以用真正的错误报告打断任何事情。我们会离开董事会会议来修复严重的错误。

我们的支持方法让每个人都更快乐。客户很高兴。想象一下,拨打支持热线并被当作带来重要消息的人对待是什么感觉。客户支持人员喜欢它,因为这意味着他们可以帮助用户,而不是向他们阅读脚本。程序员喜欢它,因为他们可以重现错误,而不仅仅是听到关于它们的模糊二手报告。

我们即时修复错误的政策改变了客户支持人员和黑客之间的关系。在大多数软件公司,支持人员是报酬过低的人体盾牌,黑客是天父的小型副本,世界的创造者。无论报告错误的程序是什么,都可能是单向的:听到错误的支持人员填写某种表格,最终传递给程序员(可能通过QA),程序员将其放在他们的待办事项列表上。在Viaweb情况完全不同。在从客户那里听到错误的一分钟内,支持人员可能站在程序员旁边,听到他说"该死,你说得对,这是一个错误。“听到黑客说"你说得对"让支持人员很高兴。他们过去常常带着期待的表情给我们带来错误,就像猫给你带来它刚刚杀死的老鼠一样。这也使他们在判断错误的严重性时更加谨慎,因为现在他们的荣誉处于危险之中。

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

士气

能够立即发布软件是一个巨大的动力。 often as I was walking to work I would think of some change I wanted to make to the software, and do it that day. This worked for bigger features as well. Even if something was going to take two weeks to write (few projects took longer), I knew I could see the effect in the software as soon as it was done.

如果我必须等待下一年的发布,我会搁置这些想法中的大部分,至少一段时间。但是关于想法的事情是,它们会导致更多的想法。你有没有注意到,当你坐下来写东西时,最终进入它的一半想法是你在写作过程中想到的?软件也是如此。实施一个想法的工作会给你更多的想法。所以搁置一个想法不仅让你延迟实施它,还损失了实施它会带来的所有想法。事实上,搁置一个想法甚至可能抑制新想法:当你开始想到一些新功能时,你看到搁板并想"但我已经有很多新事情想为下一版做了。”

大公司不做的是实施功能,而是规划它们。在Viaweb,我们在这方面经常遇到麻烦。投资者和分析师会问我们对未来有什么计划。诚实的回答会是,我们没有任何计划。我们对想要改进的事情有一些总体想法,但如果我们知道怎么做,我们已经做了。我们未来六个月要做什么?任何看起来是最大胜利的事情。我不知道我是否敢于给出这个答案,但这是事实。计划只是搁板上想法的另一个词。当我们想到好主意时,我们就实施它们。

在Viaweb,就像在许多软件公司一样,大多数代码都有一个明确的所有者。但当你拥有某样东西时,你真正拥有它:除了软件的所有者外,没有人必须批准(甚至知道)发布。除了害怕在同僚面前看起来像白痴外,没有防止破坏的保护,这已经足够了。我可能给人的印象是我们只是轻率地向前冲编写代码。我们确实走得很快,但我们在将软件发布到那些服务器之前非常仔细地思考。而且注意力比缓慢移动更重要。因为密切注意,海军飞行员可以在夜间以每小时140英里的速度在摇晃的航母甲板上着陆40,000磅的飞机,比普通青少年切百吉饼更安全。

这种编写软件的方式当然是一把双刃剑。对于一个由优秀、可信赖的程序员组成的小团队来说,它要比由平庸程序员组成的大公司效果好得多,在大公司中,坏想法由委员会抓住,而不是由有这些想法的人抓住。

反向布鲁克斯

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

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

当你能够用更少的程序员编写软件时,它为你节省的不仅仅是金钱。正如Fred Brooks在《人月神话》中指出的,向项目添加人手往往会减慢项目速度。开发者之间可能连接的数量随着群体的大小呈指数增长。群体越大,他们将花更多时间在会议上协商他们的软件如何一起工作,他们从未预见的交互带来的错误就越多。幸运的是,这个过程也反向工作:随着群体变小,软件开发呈指数级变得更有效率。我不记得Viaweb的程序员曾经有过真正的会议。我们在任何时候都没有什么比我们去吃午饭时能说的更多的话要说。

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

我认为不可能有其他方式,只要你仍在积极开发产品。基于Web的软件永远不会是你编写、签入然后回家的东西。它是一个活的东西,现在就在你的服务器上运行。一个严重的错误可能不仅仅崩溃一个用户的进程;它可能崩溃它们所有。如果你的代码中的错误损坏了磁盘上的一些数据,你必须修复它。等等。我们发现你不必每分钟都监视服务器(在第一年左右后),但你肯定想密切关注你最近改变的东西。你不会在深夜发布代码然后回家。

观察用户

有了基于服务器的软件,你与代码的联系更紧密。你也可以与用户的联系更紧密。Intuit以在零售店向客户介绍自己并要求跟随他们回家而闻名。如果你曾经看过有人第一次使用你的软件,你就知道什么样的惊喜在等待着他们。

软件应该做用户认为它会做的事情。但相信我,在你观察他们之前,你不知道用户会想什么。而基于服务器的软件给了你关于他们行为的前所未有的信息。你不限于小的、人为的焦点小组。你可以看到每个用户的每次点击。你必须仔细考虑你要看什么,因为你不想侵犯用户的隐私,但即使是最一般的统计采样也可能非常有用。

当用户在你的服务器上时,你不必依赖基准测试,例如。基准测试是模拟用户。有了基于服务器的软件,你可以观察实际用户。要决定优化什么,只需登录服务器,看看什么消耗了所有的CPU。而且你也知道何时停止优化:我们最终让Viaweb编辑器达到了内存限制而不是CPU限制的程度,由于我们无法减小用户数据的大小(嗯,没有简单的方法),我们知道我们最好停在那里。

效率对基于服务器的软件很重要,因为你要为硬件付费。每个服务器可以支持的用户数量是你的资本成本的除数,所以如果你能让你的软件非常高效,你可以以低于竞争对手的价格销售并仍然获利。在Viaweb,我们将每个用户的资本成本降至约5美元。现在可能更少,可能低于向他们发送第一个月账单的成本。如果你的软件相当高效,硬件现在是免费的。

观察用户可以在设计和优化方面指导你。Viaweb有一种称为RTML的脚本语言,让高级用户定义自己的页面样式。我们发现RTML成了一个建议箱,因为用户只在预定义的页面样式无法做他们想要的事情时才使用它。例如,最初编辑器在页面上放置按钮栏,但在许多用户使用RTML将按钮放在左侧后,我们在预定义的页面样式使其成为一个选项(实际上是默认)。

最后,通过观察用户,你通常可以告诉他们什么时候遇到麻烦。而且由于客户总是对的,这是你需要修复的事情的迹象。在Viaweb,获得用户的关键是在线试驾。它不仅仅是由营销人员构建的一系列幻灯片。在我们的试驾中,用户实际使用软件。花了大约五分钟,在结束时他们构建了一个真实的、工作的商店。试驾是我们获得几乎所有新用户的方式。我认为对于大多数基于Web的应用程序来说也是如此。如果用户能够成功完成试驾,他们会喜欢这个产品。如果他们感到困惑或无聊,他们不会。所以任何我们能做的让更多人完成试驾的事情都会增加我们的增长率。

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

金钱

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

托管应用程序是公司不太可能由免费软件填补的一个领域。托管应用程序有很多压力,并有真实的费用。没有人会想免费做这件事。

对于公司来说,基于Web的应用程序是理想的收入来源。你不是每个季度从一张白纸开始,而是有经常性的收入流。因为你的软件逐渐发展,你不必担心新模型会失败;永远不需要新的模型,如果你对软件做了用户讨厌的事情,你会立即知道。你没有无法收回的账单的麻烦;如果有人不愿意付款,你可以关闭服务。而且没有盗版的可能性。

最后一个"优势"可能成为一个问题。一定程度的盗版对软件公司是有利的。如果某个用户真的不会以任何价格购买你的软件,如果他使用盗版副本,你没有损失任何东西。事实上你获益了,因为他是又一个帮助使你的软件成为标准的用户——或者当他高中毕业时可能会购买副本。

当可能时,公司喜欢做一种称为价格歧视的事情,这意味着向每个客户收取他们能负担的尽可能多的费用。[8] 软件特别适合价格歧视,因为边际成本接近于零。这就是为什么某些软件在Suns上运行比在Intel盒子上运行成本更高的原因:使用Suns的公司对省钱不感兴趣,可以安全地收取更多费用。盗版实际上是价格歧视的最低层次。我认为软件公司理解这一点,并故意对某些类型的盗版视而不见。[9] 有了基于服务器的软件,他们将不得不想出其他解决方案。

基于Web的软件销售得很好,与桌面软件相比,因为它容易购买。你可能认为人们决定购买某物,然后购买它,作为两个独立的步骤。这是我在Viaweb之前的想法,至少在我考虑这个问题时是这样。事实上,第二步可以传播回第一步:如果某物难以购买,人们会改变他们是否想要它的想法。反之亦然:当某物容易购买时,你会销售更多。因为亚马逊的存在,我买了更多的书。基于Web的软件是世界上最容易购买的东西之一,特别是如果你刚刚完成了在线演示。用户不应该只需要输入信用卡号码。(让他们做更多会有风险。)

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

我们的几个竞争对手这样自寻死路——通常,我认为,是因为他们被西装们淹没了,他们对这个巨大的潜在渠道感到兴奋,没有意识到这会破坏他们希望通过它销售的产品。通过ISP销售基于Web的软件就像通过自动售货机销售寿司。

客户

客户会是谁?在Viaweb,他们最初是个人和小公司,我认为这将是基于Web应用程序的规则。这些用户准备尝试新事物,部分是因为他们更灵活,部分是因为他们想要新技术的低成本。

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

反对这种方法的论点通常围绕安全性:如果员工更容易访问,坏人也会更容易。一些较大的商家不愿意使用Viaweb,因为他们认为客户的信用卡信息在他们自己的服务器上会更安全。很难外交地提出这一点,但事实上数据在我们手中几乎肯定比在他们手中更安全。谁可以雇佣更好的人来管理安全,一个整个业务是运行服务器的技术创业公司,还是一个服装零售商?我们不仅有更好的人担心安全,我们更担心它。如果有人闯入服装零售商的服务器,最多影响一个商人,可能可以掩盖,在最坏的情况下可能会让一个人被解雇。如果有人闯入我们的服务器,可能影响数千个商人,可能最终成为CNet的新闻,并可能让我们倒闭。

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

使用基于Web应用程序的大公司在某种程度上是在外包IT。听起来很激进,我认为这通常是一个好主意。公司可能通过这种方式获得比内部系统管理员更好的服务。系统管理员可能变得暴躁和不响应,因为他们没有直接暴露在竞争压力下:销售人员必须处理客户,开发者必须处理竞争对手的软件,但系统管理员,就像老单身汉,很少有外部力量让他保持一致。[10] 在Viaweb,我们有足够的外部力量让我们保持一致。打电话给我们的是客户,而不仅仅是同事。如果服务器被卡住,我们跳起来;仅仅想到它,多年后仍然让我肾上腺素激增。

所以基于Web的应用程序通常也是大公司的正确答案。然而,他们将是最后意识到这一点的,就像他们在桌面计算机上一样。部分原因是相同的:说服大公司他们需要更昂贵的东西将值很多钱。

富有的客户总是倾向于购买昂贵的解决方案,即使便宜的解决方案更好,因为提供昂贵解决方案的人可以花更多的钱销售它们。在Viaweb,我们一直对抗这个。我们失去了几个高端商户给Web咨询公司,他们说服他们,如果他们在自己的服务器上支付五十万美元购买定制的在线商店会更好。作为一个规则,他们并没有更好,当圣诞节购物季节到来,服务器负载增加时,不止一个发现了这一点。Viaweb比这些商户得到的大部分软件复杂得多,但我们负担不起告诉他们。在每月300美元的价格,我们负担不起派遣一群衣着光鲜、听起来权威的人向客户做演示。

大公司额外支付的大部分钱是向他们销售昂贵东西的成本。(如果国防部为马桶座圈支付一千美元,部分原因是销售一千美元马桶座圈的成本很高。)这也是内联网软件将继续繁荣的一个原因,即使这可能是一个坏主意。它只是更昂贵。对于这个难题你无能为力,所以最好的计划是先争取较小的客户。其余的会及时到来。

服务器之子

在服务器上运行软件并不是什么新鲜事。事实上这是旧模型:大型机应用程序都是基于服务器的。如果基于服务器的软件是一个好主意,为什么上次它失败了?为什么桌面计算机取代了大型机?

起初桌面计算机看起来不太像威胁。第一批用户都是黑客——或者像当时被称为的爱好者。他们喜欢微型计算机,因为它们便宜。第一次,你可以拥有自己的计算机。“个人计算机"这个词现在是语言的一部分,但当它第一次使用时,它有一种故意大胆的声音,就像今天"个人卫星"这个词组。

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

我认为很多人没有意识到创业公司在最早阶段是多么脆弱和不确定。许多创业公司几乎偶然开始——作为几个人,有工作或在学校,编写可能(如果看起来有希望)变成公司的某物原型。在这个幼虫阶段,任何重大障碍都会阻止创业公司死在 tracks上。编写大型机软件需要太多的前期承诺。开发机器很昂贵,而且由于客户将是公司,你需要一个令人印象深刻的销售团队向他们销售。创办一家编写大型机软件的创业公司将是一个比在晚上你的Apple II上拼凑东西严重得多的任务。所以你没有很多创业公司编写大型机应用程序。

桌面计算机的到来激发了很多新软件,因为为它们编写应用程序对幼虫创业公司来说似乎是一个可实现的目标。开发便宜,客户将是个人,你可以通过计算机商店甚至邮购接触他们。

将桌面计算机推向主流的应用程序是VisiCalc,第一个电子表格。它是由在阁楼工作的两个人编写的,却做了任何大型机软件都不能做的事情。[11] VisiCalc在当时是一个巨大的进步,人们购买Apple II只是为了运行它。这是一个趋势的开始:桌面计算机获胜是因为创业公司为它们编写软件。

基于服务器的软件这次看起来会很好,因为创业公司将编写它。计算机现在如此便宜,你可以像我们一样,使用桌面计算机作为服务器开始。便宜的处理器已经吃掉了工作站市场(你现在很少听到这个词了),并且在服务器市场上大部分路程;Yahoo的服务器,处理像互联网上任何地方一样高的负载,都有与你桌面机器相同的廉价Intel处理器。一旦你编写了软件,你销售它所需要的只是一个Web站点。几乎所有的用户都是通过口碑和媒体中的推荐直接访问我们的网站。[12]

Viaweb是一个典型的幼虫创业公司。我们害怕创办公司,在最初的几个月里,我们安慰自己,把整个事情当作一个实验,我们可能随时取消。幸运的是,除了技术障碍外几乎没有障碍。当我们编写软件时,我们的Web服务器是我们用于开发的同一台桌面机器,通过拨号线连接到外部世界。在那个阶段我们唯一的开支是食物和租金。

现在创业公司有更多理由编写基于Web的软件,因为编写桌面软件变得不那么有趣了。如果你想现在编写桌面软件,你必须在微软的条款下做,调用他们的API,并在他们有缺陷的操作系统周围工作。如果你成功编写了起飞的东西,你可能发现你只是在为微软做市场研究。

如果一个公司想要制作一个创业公司将建立的平台,他们必须制作黑客自己会想使用的东西。这意味着它必须便宜且设计良好。Mac在刚推出时受到黑客的欢迎,其中许多人编写了它的软件。[13] 你在Windows上较少看到这一点,因为黑客不使用它。擅长编写软件的人现在倾向于运行Linux或FreeBSD。

我认为我们不会创办一家编写桌面软件的创业公司,因为桌面软件必须在Windows上运行,在我们能够为Windows编写软件之前,我们必须使用它。Web让我们绕过Windows,通过浏览器直接向用户交付运行在Unix上的软件。这是一个令人 liberating 的前景,很像25年前PC的到来。

微软

回到桌面计算机到来的时候,IBM是每个人都害怕的巨人。现在很难想象,但我清楚地记得这种感觉。现在可怕的巨人是微软,我认为他们不像IBM那样对面临的威胁视而不见。毕竟,微软是故意在IBM的盲点上建立他们的业务的。

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

我猜微软将开发某种服务器/桌面混合,操作系统与他们控制的服务器协同工作。至少,对于想要这样的用户,文件将集中可用。我不期望微软会完全走向在服务器上进行计算的极端,如果他们可以避免的话,客户端只有一个浏览器。如果你只需要一个浏览器作为客户端,客户端上就不需要微软,如果微软不控制客户端,他们就不能推动用户使用他们的基于服务器的应用程序。

我认为微软将很难把精灵关在瓶子里。将会有太多不同类型的客户端让他们全部控制。如果微软的应用程序只与某些客户端一起工作,竞争对手将能够通过提供在任何客户端上工作的应用程序来胜过他们。[14]

在基于Web应用程序的世界里,微软没有自动的位置。他们可能成功地为自己创造一个位置,但我不认为他们会像在桌面应用程序世界那样统治这个新世界。

不是竞争对手会绊倒他们,而是他们会自己绊倒自己。随着基于Web软件的兴起,他们将面临不仅是技术问题,还有他们自己的愿望思维。他们需要做的是蚕食他们现有的业务,我看不出他们能够面对这一点。把他们带到现在的同样专注现在将对他们不利。IBM处于完全相同的情况,他们无法掌握它。IBM迟来且半心半意地进入微型计算机业务,因为他们对威胁他们的现金牛——大型机计算感到矛盾。微软同样将因为想要拯救桌面而受阻。现金牛可能是你背上该死的沉重猴子。

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

创业公司但更是如此

经典的创业公司快速而非正式,人少钱少。这少数人工作非常努力,技术放大了他们做出的决定的影响。如果他们获胜,他们赢得很大。

在编写基于Web应用程序的创业公司中,你与创业公司相关的一切都被推向极端。你可以用更少的人和更少的钱编写和启动产品。你必须更快,你可以更不正式。你真的可以作为一个三个人坐在公寓客厅里,服务器位于ISP的产品启动产品。我们就是这样。

随着时间的推移,团队变得更小、更快、更不正式。1960年,软件开发意味着一屋子的人戴着牛角框眼镜,穿着窄窄的黑领带,勤奋地在IBM编码表格上每天写十行代码。1980年,这是一个八到十个人穿牛仔裤上班,输入vt100的团队。现在是一两个人坐在客厅里用笔记本电脑。(牛仔裤原来不是非正式的最后词。)

创业公司有压力,不幸的是,基于Web的应用程序也将这推向极端。许多软件公司,特别是在开始时,有开发者睡在桌子下面的时期等等。基于Web软件的可怕之处在于没有什么可以防止这成为默认情况。睡在桌子下的故事通常结束:最后我们发布了它,我们都回家睡了一周。基于Web的软件永远不会发布。只要你想要,你可以工作16小时天。因为你能够,而且你的竞争对手能够,你往往被迫这样做。你能,所以你必须。这是反向运行的帕金森定律。

最糟糕的不是工作时间,而是责任。程序员和系统管理员传统上各有自己独立的担忧。程序员必须担心错误,系统管理员必须担心基础设施。程序员可能整天在源代码中辛勤工作,但在某个时候他们可以回家忘记它。系统管理员永远不会真正离开工作,但当他们确实在凌晨4:00被传呼时,他们通常不必做任何非常复杂的事情。有了基于Web的应用程序,这两种压力结合在一起。程序员成为系统管理员,但没有使工作可忍受的明确限制。

在Viaweb,我们前六个月只是编写软件。我们工作了早期创业公司的通常长时间。在桌面软件公司,这将是我们努力工作的部分,但与下一阶段相比感觉像是假期,那时我们让用户进入我们的服务器。出售Viaweb给Yahoo的第二大好处(除了钱)是能够把整个事情的最终责任推给大公司。

桌面软件迫使用户成为系统管理员。基于Web的软件迫使程序员成为。总压力较少,但对程序员来说更多。这不一定是坏消息。如果你是一个与大公司竞争的创业公司,这是好消息。[15] 基于Web的应用程序提供了一种直接的方式胜过你的竞争对手。没有创业公司要求更多。

足够好

可能阻止你编写基于Web应用程序的一件事是Web页面作为UI的蹩脚。这是一个问题,我承认。有一些我们真的很想添加到HTML和HTTP的东西。然而,重要的是Web页面只是足够好。

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

Web页面不是为了成为应用程序的UI而设计的,但它们只是足够好。对于相当数量的用户来说,你可以从任何浏览器使用的软件本身就是一个足够大的胜利,足以超过UI中的任何笨拙。也许你不能使用HTML写出最好看的电子表格,但你可以写一个电子表格,几个人可以从不同位置同时使用而无需特殊的客户端软件,或者可以合并实时数据馈送,或者可以在某些条件触发时传呼你。更重要的是,你可以编写甚至还没有名称的新型应用程序。毕竟,VisiCalc不仅仅是大型机应用程序的微型计算机版本——它是一种新型应用程序。

当然,基于服务器的应用程序不必是基于Web的。你可以有其他类型的客户端。但我很确定这是一个坏主意。如果你能假设每个人都会安装你的客户端会很方便——如此方便,以至于你可以轻易说服自己他们都会——但如果他们不这样做,你就完蛋了。因为基于Web的软件对客户端不做任何假设,它将在Web工作的任何地方工作。这已经是一个很大的优势,随着新的Web设备激增,这个优势会增长。用户会喜欢你,因为你的软件就是工作,你的生活会更容易,因为你不必为每个新客户端调整它。[16]

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

这一切将如何发展?我不知道。如果你赌基于Web的应用程序,你不必知道。没有人可以在不破坏浏览的情况下破坏它。Web可能不是交付软件的唯一方式,但它是现在有效并将继续工作很长时间的方式。基于Web的应用程序开发成本低,即使是最小的创业公司也容易交付。它们是很多工作,而且是特别有压力的那种,但这只会使创业公司的几率更好。

为什么不?

E.B. White惊讶地从一位农民朋友那里得知,许多通电的栅栏没有任何电流通过它们。奶牛显然学会了远离它们,之后你就不需要电流了。“起来,奶牛们!“他写道,“在暴君打鼾时夺取你们的自由!”

如果你是一个黑客,想过有一天创办创业公司,可能有两件事阻止你这样做。一个是你对商业一无所知。另一个是你害怕竞争。这两个栅栏都没有电流。

关于商业你只需要知道两件事:构建用户热爱的东西,花的比赚的少。如果你把这两点做对,你就会领先大多数创业公司。其余的你可以边走边学。

你一开始可能花的比赚的多,但只要差距足够快地缩小,你就会没事。如果你开始资金不足,至少会鼓励节俭的习惯。你花的越少,花的比赚的越容易。幸运的是,启动基于Web的应用程序可能非常便宜。我们在不到1万美元的情况下启动,现在会更便宜。我们不得不在服务器上花费数千美元,再花费数千美元获得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应该是每个人都用来开发基于服务器应用程序的技术。Applets在我们看来是一个过时的想法。下载程序在客户端运行?简单地把程序全部放在服务器上运行更容易。我们在applets上浪费了很少时间,但无数其他创业公司一定被诱入这个焦油坑。很少有能够活着逃脱的,否则微软不能在最新版本的Explorer中放弃Java。

[4] 这一点归功于Trevor Blackwell,他补充说"编写软件的成本比其规模增长得更快。这主要是由于修复旧错误,如果所有错误都很快发现,成本可以更线性。”

[5] 最难找到的错误类型可能是复合错误的一种变体,其中一个错误恰好补偿了另一个。当你修复一个错误时,另一个变得可见。但这似乎修复是错误的,因为那是你最后改变的事情。

[6] 在Viaweb内部,我们曾经举办过一个比赛,描述我们软件最糟糕的事情。两个客户支持人员并列第一, entries 我现在回想起来仍然不寒而栗。我们立即修复了这两个问题。

[7] Robert Morris编写了订购系统,购物者用来下订单。Trevor Blackwell编写了图像生成器和管理器,商家用来检索订单、查看统计信息和配置域名等。我编写了编辑器,商家用来构建他们的站点。订购系统和图像生成器是用C和C++编写的,管理器主要是用Perl,编辑器是用Lisp。

[8] 价格歧视是如此普遍(你多久听到零售商声称他们的购买力意味着为你提供更低价格?)我惊讶地发现它被1936年的Robinson-Patman法案在美国取缔。这项法律似乎没有得到严格执行。

[9] 在《No Logo》中,Naomi Klein说,受到"城市青年"喜爱的服装品牌不会太努力防止入店行窃,因为在他们的目标市场中,入店行窃者也是时尚领导者。

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

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

[12] 这并不像我听起来那么容易。口碑传播需要痛苦地长时间才能开始,直到我们雇佣了一家公关公司(无疑是业内最好的)每月16,000美元,我们才开始获得大量媒体报道。然而,唯一重要的渠道确实是我们自己的Web站点。

[13] 如果Mac如此伟大,为什么它输了?又是成本。微软专注于软件业务,并向Apple硬件释放了一大群廉价组件供应商。在关键时期西装接管了也没有帮助。

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

除此之外,一个合适的开源浏览器将导致HTTP和HTML继续发展(如Perl那样)。能够区分选择链接和跟随链接将对基于Web的应用程序有很大帮助;你需要的只是HTTP的一个简单增强,允许在请求中多个url。级联菜单也会很好。

如果你想改变世界,编写一个新的Mosaic。认为太晚了?1998年很多人认为推出一个新的搜索引擎太晚了,但Google证明他们错了。如果当前选择足够糟糕,总是有新事物的空间。确保它首先在所有免费的操作系统上工作——新事物从他们的用户开始。

[15] Trevor Blackwell,可能比任何人都从个人经验中更多地了解这一点,写道:

“我会更进一步说,因为基于服务器的软件对程序员如此困难,它导致了远离大公司的根本经济转变。它需要程序员只有在自己的公司时才愿意提供的强度和奉献精神。软件公司可以雇佣熟练的人在不太 demanding 的环境中工作,可以雇佣不熟练的人忍受困难,但他们不能雇佣高技能的人来拼命。由于资本不再需要,大公司没有什么可以带来的。”

[16] 在本文的原始版本中,我建议避免使用Javascript。这在2001年是个好计划,但Javascript现在可以工作了。

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

你会在《Hackers & Painters》中找到本文和其他14篇文章。

一些技术细节

日文翻译

微软最终同意了

盖茨电子邮件