另一条前进的道路
Original2001年9月
(本文解释了为什么下一代软件可能会是基于服务器的,这对程序员意味着什么,以及为什么这种新型软件是创业公司的一个很好的机会。这是从在BBN实验室的一次演讲中提取的。)
1995年夏天,我的朋友罗伯特·莫里斯和我决定创办一家创业公司。当时网景公司的首次公开募股宣传正在如火如荼地进行,媒体上也有很多关于网上商务的讨论。那时可能只有大约30家真正的网上商店,全都是手工制作的。如果网上商店会越来越多,就需要制作它们的软件,所以我们决定编写一些软件。
最初我们打算制作一款普通的桌面应用程序。后来有一天我们想到让软件运行在我们的网络服务器上,使用浏览器作为界面。我们尝试重写让软件在网上运行,很明显这才是正确的方向。如果我们把软件写成在服务器上运行,对用户和我们自己来说都会容易得多。
这个计划证明是正确的。现在,作为雅虎商店的一部分,这款软件是最受欢迎的网上商店构建工具,拥有约14,000名用户。
当我们创办Viaweb时,几乎没有人理解我们说软件运行在服务器上的意思。直到一年后Hotmail推出,人们才开始明白这种方式是可行的。现在每个人都知道这是一种有效的方法。它有了一个名称:应用服务提供商(ASP)。
我认为下一代软件的很多部分都会采用这种模式编写。即使是微软这样最有损失的公司,也似乎看到了将某些东西从桌面转移到服务器上的必然性。如果软件从桌面转移到服务器,对开发人员来说将意味着一个完全不同的世界。本文描述了我们作为最早到访这个新世界的人所看到的令人惊讶的事情。在软件向服务器转移的程度上,这里描述的就是未来。
下一个事物?
回顾桌面软件时代,我认为我们会对人们忍受的不便感到惊讶,就像我们现在对早期汽车所有者所忍受的感到惊讶一样。在最初的20到30年里,你必须是一名汽车专家才能拥有一辆汽车。但汽车带来的好处是如此巨大,以至于很多不是汽车专家的人也想拥有它们。
计算机正处于这个阶段。当你拥有一台桌面计算机时,你最终会学到比你想知道的更多关于它内部发生的事情。但美国超过一半的家庭都拥有一台计算机。我的母亲有一台电脑,她用它来收发电子邮件和记账。大约一年前,她收到了一封来自苹果公司的信,提供她购买操作系统新版本的折扣。当一个65岁的女性想使用电脑发送电子邮件和记账时,却不得不考虑安装新的操作系统,这是有问题的。普通用户甚至不应该知道"操作系统"、"设备驱动程序"或"补丁"这样的词语。
现在有另一种交付软件的方式,可以让用户免于成为系统管理员。基于网络的应用程序是在网络服务器上运行并使用网页作为用户界面的程序。对于普通用户来说,这种新型软件将比桌面软件更容易、更便宜、更便携、更可靠,并且通常更强大。
使用基于网络的软件,大多数用户不需要考虑除了他们使用的应用程序之外的任何事情。所有乱七八糟、不断变化的东西都将存放在某个服务器上,由擅长这种事情的人维护。因此,您通常不需要一台电脑来使用软件。您只需要一个带有键盘、屏幕和网络浏览器的设备。也许它还会有无线网络连接。也许它就是您的手机。不管是什么,它都将是消费电子产品:大约200美元的价格,人们主要根据外壳的外观来选择。您将为互联网服务支付的费用比您现在为电话支付的费用更多。[1]
对于像Photoshop这样的高度交互式软件,点击到服务器并返回需要大约十分之一秒,用户仍然希望计算发生在桌面上。但是,如果您看看大多数人使用电脑的方式,十分之一秒的延迟并不会成为问题。我的母亲并不真的需要一台台式电脑,而且也有很多像她一样的人。
对用户的好处
在我家附近有一辆车上贴着一个写着"死亡胜于不便"的车贴。大多数人,大多数时候,都会选择最少工作的选择。如果基于网络的软件获胜,那是因为它更方便。从用户和开发者的角度来看,它似乎确实如此。
要使用纯基于网络的应用程序,您只需要一个连接到互联网的浏览器。因此,您可以在任何地方使用基于网络的应用程序。当您在桌面电脑上安装软件时,您只能在该电脑上使用它。更糟糕的是,您的文件被困在那台电脑上。随着人们越来越习惯网络,这种模式的不便越来越明显。
这里的薄端楔子是基于网络的电子邮件。现在有数百万人意识到,无论您身在何处,都应该能够访问电子邮件消息。如果您可以查看电子邮件,为什么不能查看日历呢?如果您可以与同事讨论文档,为什么不能编辑它呢?为什么您的任何数据都应该被困在某台远程桌面电脑上?
"您的电脑"的概念正在消失,被"您的数据"所取代。您应该能够从任何电脑访问您的数据。或者更确切地说,从任何客户端访问,而客户端不一定是电脑。
客户端不应该存储数据;它们应该像电话一样。事实上,它们可能会变成电话,反之亦然。随着客户端变得越来越小,您有另一个不在它们上面保存数据的理由:您随身携带的东西可能会丢失或被盗。将您的PDA遗落在出租车上就像磁盘崩溃,只是您的数据被他人获取,而不是被蒸发。
使用纯基于网络的软件,您的数据和应用程序都不会保存在客户端上。所以您不需要安装任何东西就可以使用它。当没有安装时,您也不必担心安装出现问题。因为软件不在您的操作系统上运行,所以不会出现应用程序与操作系统不兼容的情况。
由于不需要安装,在您"购买"之前尝试基于网络的软件将变得很容易,也很普遍。您应该期望能够免费试用任何基于网络的应用程序,只需访问提供该应用程序的网站。在Viaweb,我们的整个网站就像一个大箭头,指引用户进行试驾。
在试用演示后,注册该服务应该只需填写一份简短的表格(越简短越好)。这应该是用户需要做的最后一项工作。使用基于网络的软件,您应该能够免费获得新版本,无需额外付费、做任何工作,甚至可能不知道有新版本发布。
升级不会再像现在那样令人震惊。随着时间的推移,应用程序会悄悄地变得更加强大。这需要开发人员付出一些努力。他们必须设计软件,使其可以在不让用户感到困惑的情况下进行更新。这是一个新问题,但是有办法解决它。
对于基于Web的应用程序,每个人都使用相同的版本,并且可以立即修复发现的错误。因此,基于Web的软件应该比桌面软件有更少的错误。在Viaweb,我怀疑我们从未同时存在过10个已知的错误。这比桌面软件好得多。
基于Web的应用程序可以由多人同时使用。这对于协作应用程序来说是一个明显的优势,但我猜用户一旦意识到这种可能性,就会希望大多数应用程序都具有这种功能。让两个人同时编辑同一个文档通常会很有用。Viaweb允许多个用户同时编辑一个网站,这更多是因为这是编写软件的正确方式,而不是因为我们预计用户会想要这样做,但事实证明许多人确实想要这样做。
当您使用基于Web的应用程序时,您的数据将更加安全。磁盘崩溃不会成为过去,但用户将不再听到它们。它们会发生在服务器集群内部。提供基于Web的应用程序的公司实际上会进行备份 - 不仅因为他们会有真正的系统管理员关注这些问题,而且因为一家ASP如果丢失了用户的数据,将会陷入大麻烦。当人们在磁盘崩溃中丢失自己的数据时,他们不会太生气,因为他们只能怪自己。但当一家公司为他们丢失数据时,他们会更加生气。
最后,基于Web的软件应该更不容易受到病毒的攻击。如果客户端只运行浏览器,感染病毒的可能性就更小,而且本地也没有数据可以损坏。攻击服务器本身的程序也应该发现它们受到了非常好的防护。[2]
对于用户来说,基于Web的软件将更加轻松。我认为,如果你深入了解一个普通的Windows用户,你会发现他们内心有一种巨大而几乎未被开发的渴望,希望软件能满足这种描述。一旦被释放,它可能会成为一股强大的力量。
代码之城
对于开发人员来说,基于Web的软件和桌面软件之间最显著的区别是,基于Web的应用程序不是单一的代码块。它将是不同类型程序的集合,而不是单一的大型二进制文件。因此,设计基于Web的软件就像设计一座城市,而不是一座建筑:除了建筑物,你还需要道路、标志、公用设施、警察和消防部门,以及应对增长和各种灾难的计划。
在Viaweb,软件包括相当大的应用程序,用户直接与之交互,这些程序使用的程序,不断在后台运行以寻找问题的程序,试图在发生故障时重新启动的程序,偶尔运行以编译统计数据或为搜索构建索引的程序,我们明确运行以垃圾收集资源或移动或恢复数据的程序,假装是用户的程序(以测量性能或暴露错误),诊断网络问题的程序,备份程序,与外部服务的接口,驱动实时服务器统计数据显示仪表板的软件(对访客很有吸引力,但对我们来说也是不可或缺的),对开源软件的修改(包括错误修复),以及大量的配置文件和设置。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,我们经常一天做三到五次发布。
当你转向这种新模式时,你会意识到软件开发在很大程度上受到发布方式的影响。桌面软件业务中最棘手的许多问题都是由于发布的灾难性性质造成的。
当你一年只发布一个新版本时,你倾向于批量处理bug。在发布日期前的某个时候,你会组装一个新版本,其中一半的代码已被撕裂和替换,引入了无数的bug。然后一支QA人员队伍介入并开始计算它们,程序员则按照列表修复它们。他们通常无法到达列表的末尾,事实上也不确定末尾在哪里。这就像从一个池塘里捞出碎石一样。你永远无法真正知道软件内部发生了什么。最好的情况是你最终得到一种统计意义上的正确性。
在基于服务器的软件中,大部分变化都是小幅和渐进的。这本身就不太可能引入错误。这也意味着您知道在即将发布软件时最需要仔细测试的内容:最近所做的更改。您对代码的掌握会更加牢固。一般来说,您确实知道它内部发生的情况。当然,您没有把源代码全部记住,但当您阅读源代码时,就像飞行员扫描仪表盘一样,而不是像侦探试图解开某种谜团。
桌面软件会培养人们对错误的一种宿命论。您知道您正在发布一些充满错误的东西,您甚至已经建立了一些机制来弥补它(例如补丁发布)。那么,为什么还要担心更多的错误呢?很快您就会发布一些您知道存在问题的全新功能。苹果今年早些时候就这样做了。他们感到压力必须发布他们的新操作系统,但该操作系统的发布日期已经推迟了四次,但有些软件(对CD和DVD的支持)还没有准备好。解决方案?他们发布了操作系统,但没有包含未完成的部分,用户将需要稍后安装它们。
对于基于Web的软件,您永远不需要在软件工作之前发布它,而且一旦它工作就可以立即发布。
行业老手可能会认为,说您永远不需要在软件工作之前发布它是一个很好的想法,但当您承诺在某个特定日期前交付软件的新版本时会发生什么?对于基于Web的软件,您不会做出这样的承诺,因为没有版本的概念。您的软件会逐步和持续地变化。有些变化可能比其他变化大,但版本的概念并不自然地适用于基于Web的软件。
如果有人还记得Viaweb,这可能听起来很奇怪,因为我们一直在宣布新版本。这完全是出于公关目的。我们了解,行业媒体会根据版本号来思考。他们会为主要版本发布提供大量报道,也就是版本号的第一位数有变化,而对于点版本发布,也就是小数点后数字有变化,通常只会给予一个段落的报道。
我们的一些竞争对手正在提供桌面软件,实际上确实有版本号。对于这些发布,仅仅是版本号的存在就似乎对我们来说是他们落后的证据。他们会因此获得各种各样的宣传。我们不想错过这些,所以我们也开始给我们的软件贴上版本号。当我们想获得一些宣传时,我们会列出自上次"发布"以来添加的所有新功能,给软件贴上一个新的版本号,并发布新闻稿说新版本现已立即可用。令人惊讶的是,没有人曾质疑过我们。
在我们被收购时,我们已经这样做了三次,所以我们的软件版本号已经到了4.0。如果我没记错的话,是4.1。在Viaweb成为Yahoo Store之后,就不再那么迫切需要宣传了,所以尽管软件继续演化,但整个版本号的概念也就悄悄地被放弃了。
错误
基于Web的软件的另一个主要技术优势是,您可以重现大多数错误。您可以在您的磁盘上获取用户的数据。如果有人破坏了您的软件,您不需要像使用桌面软件那样猜测发生了什么:您应该能够在他们与您通话时重现错误。如果您的应用程序中内置了错误检测代码,您甚至可能已经知道这个错误了。
基于Web的软件全天候使用,所以您所做的一切都会立即经受考验。错误会很快被发现。
软件公司有时被指责让用户来调试他们的软件。这正是我所提倡的。对于基于Web的软件来说,这实际上是一个很好的计划,因为错误更少且短暂。当您逐步发布软件时,您最初会遇到的错误要少得多。而且当您可以立即重现错误并发布更改时,您可以在错误出现后立即找到并修复大多数错误。我们从未有过足够多的错误需要使用正式的错误跟踪系统。
你当然应该在发布之前先测试变更,这样就不会有太多严重的 bug 被发布。那些不可避免会出现的少数 bug 都是涉及边缘情况的,只会影响到少数遇到它们的用户,直到有人打电话投诉。只要你能及时修复 bug,对于普通用户来说,实际上会出现的 bug 要少得多。我怀疑大多数 Viaweb 用户从未遇到过 bug。
修复新出现的 bug 比修复旧 bug 更容易。刚写完的代码中的 bug 通常很快就能找到。当它出现时,你通常在看源代码之前就知道问题所在,因为你之前一直在潜意识里担心它。但修复 6 个月前写的代码(如果你一年发布一次,这就是平均情况)中的 bug 要费很多功夫。而且由于你不太了解那部分代码,你更有可能以一种丑陋的方式修复它,甚至引入更多 bug。[4]
当你及早发现 bug 时,也能减少复合 bug 的出现。复合 bug 是两个独立的 bug 相互作用:你在下楼梯时绊了一跤,伸手去抓扶手时它却从你手中掉了下来。在软件中,这种 bug 最难找到,而且往往后果最严重。[5] 传统的"把所有东西都弄坏,然后过滤出 bug"的方法,本质上会产生大量复合 bug。而通过一系列小的变更发布软件,就不太容易出现这种情况。地板上的松散物品会被不断清扫干净,不会被卡在什么地方。
使用一种叫做函数式编程的技术也很有帮助。函数式编程意味着避免副作用。这种方式在研究论文中比在商业软件中更常见,但对于基于 Web 的应用程序来说,它却非常有用。编写完全采用函数式编程的整个程序是很困难的,但你可以用这种方式编写大部分代码。这使得软件的这些部分更易于测试,因为它们没有状态,这在你不断进行小修改并进行测试的情况下非常方便。我在编写 Viaweb 编辑器时采用了这种风格,我们还将自己的脚本语言 RTML 设计为一种纯函数式语言。
来自桌面软件行业的人可能很难相信,但在 Viaweb,bug 几乎成了一种游戏。由于大多数发布的 bug 都涉及边缘情况,遇到它们的用户很可能是在尝试一些高级用法。高级用户对 bug 更宽容,尤其是当你在添加他们要求的某个功能时引入了它们。事实上,由于 bug 很少见,而且只有做一些复杂的事情才能遇到它们,高级用户常常会以一种胜利的心情来报告 bug。他们打电话给支持人员,更多是出于自豪而非愤怒,好像他们在我们身上赢了分一样。
支持
当你能重现错误时,你对客户支持的方式就会改变。在大多数软件公司,支持服务是为了让客户感觉好一些。他们要么是在报告一个已知的 bug,要么只是在做错误的事情,你必须弄清楚是什么。在这两种情况下,你都不太能从他们那里学到什么。因此,你倾向于把支持电话视为一种麻烦,想尽量把它们与开发人员隔离开。
但在 Viaweb 并非如此。在 Viaweb,支持是免费的,因为我们希望听到客户的反馈。如果有人遇到问题,我们希望立即知道,这样我们就可以重现错误并发布修复程序。
所以在 Viaweb,开发人员一直与支持人员保持密切联系。客户支持人员距离程序员只有大约 30 英尺,知道他们随时都可以打断正在进行的任何工作,报告一个真正的 bug。我们会中断董事会会议来修复一个严重的 bug。
我们的支持方式让所有人都更加满意。客户非常高兴。想象一下,打电话到支持热线,被视为带来重要消息的人,这种感觉会是什么样的。客户支持人员也喜欢这种方式,因为这意味着他们可以真正帮助用户,而不是只是读给他们听脚本。而对于程序员来说,这意味着他们可以重现 bug,而不是只听到关于它们的模糊的二手报告。
我们即时修复错误的政策改变了客户支持人员和黑客之间的关系。在大多数软件公司里,支持人员是低薪的人盾,而黑客则是上帝般的创造者。无论报告错误的程序如何,它很可能是单向的:支持人员听到错误后会填写一些表格,最终会传给程序员,他们会把它加到待办事项列表上。在Viaweb,情况完全不同。在从客户那里听到错误后的一分钟内,支持人员就可以站在程序员旁边,听他们说"对,你说得对,这确实是个错误。"听到黑客说"你说得对"让支持人员感到很高兴。他们带来错误的样子就像猫带着刚杀死的老鼠一样期待。这也让他们在判断错误的严重性时更加谨慎,因为现在他们的声誉也在线上了。
被雅虎收购后,客户支持人员被远远地移开,远离程序员。这时我们才意识到他们实际上是质量保证和某种程度上的营销人员。除了发现错误,他们还掌握着更模糊的"错误般"的东西,比如让用户困惑的功能。[6]他们也是一种代理焦点小组;我们可以问他们哪个新功能用户更想要,他们总是正确的。
士气
能够立即发布软件是一个很大的激励因素。我经常在上班的路上想到想要对软件做的某些改变,然后当天就去实现它。这对于更大的功能也同样适用。即使某件事需要两周才能完成(很少有项目需要更长时间),我也知道一完成就能立即看到效果。
如果我不得不等到下一个版本才能发布,我会把大部分这些想法搁置一段时间。不过,想法会引发更多想法。你有没有注意到,当你坐下来写点什么的时候,最后写进去的一半想法都是你在写的时候才想到的?对软件来说也是一样的。实现一个想法会给你带来更多想法。所以搁置一个想法不仅会延迟它的实现,还会失去实现它所带来的所有其他想法。事实上,搁置一个想法可能还会抑制新的想法:当你开始想某个新功能的时候,你会看到那个搁置的想法,然后想"但我已经有很多新的想要在下一个版本中做的事情了"。
大公司所做的不是实现功能,而是计划它们。在Viaweb,我们有时会遇到这方面的麻烦。投资者和分析师会问我们未来有什么计划。诚实的回答应该是,我们没有任何计划。我们有一些关于想要改进的事情的大概想法,但如果我们知道该怎么做,我们早就已经做了。未来六个月我们打算做什么?无论看起来最有价值。我可能从未敢这样回答,但这就是事实。计划只不过是搁置在架子上的想法。当我们想到好主意时,我们就去实现它们。
在Viaweb,和许多软件公司一样,大部分代码都有一个明确的所有者。但当你拥有某样东西时,你真的拥有它:除了软件的所有者,没有人需要批准(或者甚至知道)一次发布。防止出错的唯一保护就是害怕在同行面前出丑,这已经足够了。我可能给人的印象是我们只是毫无顾忌地前进,写代码。我们确实很快,但在发布软件到那些服务器上之前,我们会非常仔细地考虑。而且,注意力比缓慢移动更重要。因为他注意力集中,一名海军飞行员可以在夜间,在一艘起伏的航空母舰甲板上,以140英里/小时的速度安全地降落一架40,000磅重的飞机,比普通青少年切面包安全得多。
这种编写软件的方式当然是一把双刃剑。 对于一个由优秀、值得信赖的程序员组成的小团队来说,它的效果要好得多,而不是对一家由平庸程序员组成的大公司来说,在那里,糟糕的想法会被委员会而不是提出它们的人所发现。
逆转布鲁克斯
幸运的是,基于网络的软件确实需要较少的程序员。 我曾经为一家中型桌面软件公司工作,该公司在整个工程部门有超过100人。其中只有13人在产品开发部门工作。其余的人都在从事发布、移植等工作。使用基于网络的软件,你最多只需要那13个人,因为不再需要发布、移植等工作。
Viaweb只由三个人编写。[7] 我一直受到压力要雇用更多人,因为我们想被收购,我们知道买家很难为只有三个程序员的公司支付高价。(解决方案:我们雇用了更多人,但为他们创造了新的项目。)
当你可以用较少的程序员编写软件时,它为你节省的不仅仅是金钱。正如弗雷德·布鲁克斯在《人月神话》中指出的,向项目添加人员往往会减缓进度。开发人员之间的潜在联系数量随着团队规模的增加而呈指数增长。团队越大,他们花在协商如何让软件协同工作上的时间就越多,产生的bug也就越多。幸运的是,这个过程也可以逆转:随着团队变小,软件开发的效率指数级提高。我记不得Viaweb的程序员曾经有过正式会议。我们走到午餐时,说的话从来不会超过我们能说的。
如果这里有什么缺点,那就是所有的程序员在某种程度上都必须兼任系统管理员。当你托管软件时,必须有人监视服务器,实际上只有编写过软件的人才能正确地做到这一点。在Viaweb,我们的系统有太多组件,变化频繁,以至于软件和基础设施之间没有明确的界限。任意划定这样的界限会限制我们的设计选择。因此,尽管我们一直希望有一天("几个月后")一切都足够稳定,我们可以雇用一个专门负责服务器的人,但这从未发生。
只要你还在积极开发产品,我认为这是不可能的。基于网络的软件永远不会是你编写、提交然后就可以回家的东西。它是一个活生生的东西,现在就在你的服务器上运行。一个严重的bug不仅可能崩溃一个用户的进程,还可能崩溃所有用户的进程。如果你的代码中的bug损坏了磁盘上的某些数据,你必须修复它。等等。我们发现,你不需要每分钟都盯着服务器(在第一年之后),但你肯定要关注最近你改动过的东西。你不会在深夜发布代码然后就回家了。
观察用户
使用基于服务器的软件,你可以更紧密地接触你的代码。你也可以更紧密地接触你的用户。Intuit公司有一个著名的做法,就是在零售店里主动向客户介绍自己,并要求跟着他们回家。如果你曾经观察过有人第一次使用你的软件,你就知道他们一定遇到了什么样的惊喜。
软件应该做用户认为它会做的事情。但是相信我,在观察他们之前,你无法知道用户会想什么。而基于服务器的软件为你提供了前所未有的用户行为信息。你不局限于小型的人工焦点小组。你可以看到每个用户的每一次点击。你必须仔细考虑你要观察什么,因为你不想侵犯用户的隐私,但即使是最一般的统计抽样也可能非常有用。
当您有用户在您的服务器上时,您就不必依赖基准测试,例如。基准测试是模拟用户。使用基于服务器的软件,您可以观察实际用户。要决定优化什么,只需登录服务器并查看消耗所有 CPU 的内容。我们最终让 Viaweb 编辑器达到内存限制而不是 CPU 限制的程度,由于我们无法减少用户数据的大小(嗯,没有简单的方法),我们知道我们可能应该就此停止。
对于基于服务器的软件,效率很重要,因为您需要支付硬件费用。每台服务器可支持的用户数量是您资本成本的除数,因此如果您可以使您的软件非常高效,您就可以低于竞争对手的价格并仍然获得利润。在 Viaweb 中,我们将每个用户的资本成本降低到约 5 美元。现在可能会更低,可能低于发送他们第一个月账单的成本。如果您的软件足够高效,硬件现在几乎是免费的。
观察用户既可以指导您的设计,也可以指导优化。Viaweb 有一种名为 RTML 的脚本语言,让高级用户定义自己的页面样式。我们发现 RTML 成为一种建议箱,因为用户只在预定义的页面样式无法完成他们想要的事情时才使用它。最初,编辑器将按钮栏放在页面的顶部,但在许多用户使用 RTML 将按钮放在左侧侧面之后,我们将其作为预定义页面样式中的一个选项(实际上是默认选项)。
最后,通过观察用户,您通常可以知道他们何时遇到麻烦。由于客户永远是对的,这就是需要修复的迹象。在 Viaweb 中,在线试用是获取用户的关键。这不仅仅是营销人员制作的一系列幻灯片。在我们的试用中,用户实际使用了该软件。它大约需要 5 分钟,在结束时,他们已经建立了一个真正可以工作的商店。
试用是我们获得几乎所有新用户的方式。我认为这将是大多数基于 Web 的应用程序的情况。如果用户能够成功完成试用,他们就会喜欢这个产品。如果他们感到困惑或无聊,他们就不会。因此,我们可以做任何事情来让更多人完成试用,都会增加我们的增长率。
我研究了用户在试用过程中的点击轨迹,发现在某一步骤他们会感到困惑,并点击浏览器的后退按钮。(如果您尝试编写基于 Web 的应用程序,您会发现后退按钮成为您最有趣的哲学问题之一。)因此,我在那一步添加了一条消息,告诉用户他们快完成了,并提醒他们不要点击后退按钮。基于 Web 的软件的另一个很棒的特点是,您可以立即获得变更的反馈:完成试用的人数立即从 60% 增加到 90%。由于新用户的数量是完成试用的人数的函数,我们的收入增长增加了 50%,仅仅是因为这一变化。
金钱
在 20 世纪 90 年代初,我读到一篇文章,其中有人说软件是一种订阅业务。起初这似乎是一个非常冷酷的陈述。但后来我意识到,这反映了现实:软件开发是一个持续的过程。我认为,如果您公开收取订阅费,而不是强迫人们不断购买和安装新版本以使他们继续向您付费,这会更加干净。幸运的是,订阅是为基于 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,我们一直面临着这种情况。我们输给了一些网络咨询公司,他们说服高端商家,如果他们在自己的服务器上支付50万美元建立一个定制的在线商店,他们会更好。事实上,正如一些人在圣诞购物季节发现的那样,他们通常并没有变得更好,因为他们的服务器负载上升了。Viaweb要复杂得多,但我们无法告诉他们。以每月300美元的价格,我们无法派遣一支衣着得体、声音权威的团队去向客户做演示。
大公司支付额外费用的很大一部分是销售昂贵产品的成本。(如果国防部为马桶座支付1000美元,部分原因是销售1000美元的马桶座需要花费很多钱。)这也是内部网软件将继续蓬勃发展的一个原因,尽管它可能是一个糟糕的主意。它只是更昂贵。对于这个困境,你无能为力,所以最好的计划是先瞄准较小的客户。其余的客户会随着时间的推移而来。
服务器的后代
在服务器上运行软件并不是什么新鲜事。事实上,这是一种老模式:所有的大型机应用程序都是基于服务器的。如果基于服务器的软件如此有优势,为什么上次它会失败?为什么桌面计算机会超越大型机?
最初,台式电脑并不被视为威胁。最初的用户都是黑客或爱好者,他们喜欢微型计算机因为它们很便宜。"个人电脑"这个词如今已经成为普通用语,但当它第一次被使用时,听起来还有些大胆,就像"个人卫星"这个词一样。
为什么台式电脑最终占据主导地位?我认为是因为它们有更好的软件。而微型计算机软件更好的原因是,它可以由小公司编写。
我认为很多人都没有意识到初创公司在最初阶段是多么脆弱和不确定。许多初创公司几乎是偶然开始的,要么是一对上班族或在校学生编写一个原型,如果看起来很有前景,就可能发展成一家公司。在这个初级阶段,任何重大障碍都会让初创公司停滞不前。编写大型机软件需要太多前期投入。开发机器很昂贵,而且由于客户会是大公司,你还需要一支令人印象深刻的销售团队来销售给他们。开一家初创公司来编写大型机软件要比在晚上用Apple II随意编写东西要严肃得多。因此,你很少看到有初创公司编写大型机应用程序。
台式电脑的出现激发了大量新的软件,因为编写这些应用程序对于初创公司来说似乎是一个可以实现的目标。开发成本很低,客户也会是个人用户,你可以通过电脑商店甚至邮购的方式接触到他们。
推动台式电脑进入主流市场的应用程序是VisiCalc,这是第一个电子表格软件。它是由两个人在阁楼上编写的,却能做到大型机软件无法做到的事情。[11] VisiCalc在当时是如此先进,以至于人们专门购买Apple II来运行它。这只是一个趋势的开始:台式电脑之所以获胜,是因为初创公司为它们编写了软件。
看起来基于服务器的软件这一次也会很好,因为初创公司会编写它们。现在电脑如此便宜,你可以像我们一样,使用台式电脑作为服务器来开始。廉价的处理器已经吞噬了工作站市场(你现在几乎听不到这个词了),并且正在逐步渗透到服务器市场;雅虎的服务器,它们处理的负载可能是互联网上最高的,全部都使用与你台式机上相同的廉价英特尔处理器。一旦你编写好了软件,你只需要一个网站就可以销售了。我们的绝大部分用户都是通过口碑和媒体报道直接来到我们的网站的。[12]
Viaweb是一家典型的初创公司。我们当时非常害怕创办一家公司,最初几个月,我们一直把这件事当作一个随时可能放弃的实验。幸运的是,除了技术问题之外,没有其他太多障碍。在编写软件的时候,我们使用的服务器就是同一台用于开发的台式机,通过拨号线连接到外部世界。在这个阶段,我们唯一的开支就是食物和房租。
现在,初创公司编写基于网络的软件更有理由,因为编写桌面软件已经不那么有趣了。如果你现在想编写桌面软件,你必须按照微软的条件来做,调用他们的API,并绕过他们那些有bug的操作系统。而且,如果你设法编写出一些受欢迎的东西,你可能只是在为微软做市场调研。
如果一家公司想要打造一个初创公司愿意建立在其上的平台,他们必须让黑客自己也想要使用它。这意味着它必须便宜且设计良好。当Mac刚推出时,它受到黑客的欢迎,许多人为它编写了软件。[13] 你在Windows上就不太看到这种情况,因为黑客们不太使用它。现在擅长编写软件的人大多在运行Linux或FreeBSD。
我不认为我们会创办一家公司来编写桌面软件,因为桌面软件必须在 Windows 上运行,在我们能够为 Windows 编写软件之前,我们必须使用它。网络让我们绕过 Windows,通过浏览器直接向用户提供运行在 Unix 上的软件。这是一个令人振奋的前景,很像 25 年前个人电脑的出现。
微软
当桌面电脑出现时,IBM 是每个人都害怕的巨头。现在,令人生畏的巨头是微软,我认为他们并没有像 IBM 那样对面临的威胁视而不见。毕竟,微软有意在 IBM 的盲点上建立了自己的业务。
我之前提到,我的母亲并不真的需要一台桌面电脑。大多数用户可能也不需要。这对微软来说是个问题,他们知道这一点。如果应用程序运行在远程服务器上,就不需要 Windows 了。微软会怎么做?他们能否利用对桌面的控制来阻止或限制这一新一代的软件?
我猜测,微软将开发某种服务器/桌面混合系统,操作系统与他们控制的服务器协作工作。至少,文件将可以集中供用户使用。我不认为微软会完全走向只需要浏览器作为客户端、计算全部在服务器上进行的极端,如果他们能避免的话。如果只需要浏览器作为客户端,你就不需要微软的客户端,如果微软不控制客户端,他们就无法推动用户使用他们的基于服务器的应用程序。
我认为,微软很难把这个精灵装回瓶子里。会有太多不同类型的客户端,他们无法全部控制。而且,如果微软的应用程序只能与某些客户端配合使用,竞争对手将能够通过提供可以在任何客户端上运行的应用程序来超越他们。[14]
在基于网络的应用程序世界里,微软没有自动的立足之地。他们可能会设法为自己创造一席之地,但我不认为他们会像在桌面应用程序世界那样占据主导地位。
这不是因为有竞争对手会绊倒他们,而是他们会自己绊倒自己。随着基于网络的软件的兴起,他们不仅要面临技术问题,还要面对自己的一厢情愿。他们需要做的是蚕食自己现有的业务,但我看不出他们会面对这个。正是让他们走到今天的那种专注,现在反而会成为他们的绊脚石。IBM 正处于完全相同的处境,他们无法掌控。IBM 对微型计算机业务的进入又晚又不彻底,因为他们对威胁自己的现金奶牛——大型机计算业务感到矛盾。微软也将受到想要保护桌面业务的阻碍。一头现金奶牛可以成为一个该死的沉重包袱。
我并不是说不会有人主导基于服务器的应用程序。最终可能会有人这样做。但我认为,会有一个相当长的欢乐混乱时期,就像微型计算机早期一样。那是创业公司的黄金时期。许多小公司蓬勃发展,就是通过制造酷炫的东西做到的。
创业公司,但更甚
典型的创业公司速度快、非正式,只有少数人和很少的资金。这些人非常努力工作,技术放大了他们决策的影响。如果他们成功了,收益会很大。
在一家编写基于网络的应用程序的创业公司,与创业公司相关的一切都被推向了极端。你可以用更少的人和更少的资金编写并推出一款产品。你必须更快,你可以更随意一些。你可以真的只是三个人坐在公寓的客厅里,在一家 ISP 的托管服务器上启动你的产品。我们就是这么做的。
随着时间的推移,团队变得越来越小、更快捷和更加非正式。
1960年,软件开发意味着一个房间里戴着角框眼镜和穿着窄黑领带的男人们,每天勤勉地在IBM编码表上写下10行代码。1980年,是一个由8到10个人组成的团队,他们穿着牛仔裤来上班,在vt100上打字。现在,只有几个人坐在客厅里用笔记本电脑工作。(事实证明,牛仔裤并不是最终的非正式标准。)
创业是有压力的,这种情况在基于Web的应用程序中也被放大了。
许多软件公司,尤其是在初期,会有开发人员睡在办公桌下等情况。令人担忧的是,这种情况可能成为默认状态。关于睡在办公桌下的故事通常是这样结尾的:最后我们终于发布了,然后我们都回家睡了一个星期。基于Web的软件永远不会发布。你可以连续工作16小时,只要你愿意。由于你可以这样做,你的竞争对手也可以,所以你往往会被迫这样做。你可以这样做,所以你必须这样做。这是帕金森定律的逆向运作。
最糟糕的不是工作时间,而是责任。程序员和系统管理员传统上各有自己的烦恼。程序员必须担心bug,系统管理员必须担心基础设施。程序员可能会在源代码中忙碌一整天,但最终他们可以回家忘记这一切。系统管理员从未完全摆脱过工作,但即使在凌晨4点被叫醒,他们通常也不需要做任何复杂的事情。对于基于Web的应用程序,这两种压力被结合在一起。程序员变成了系统管理员,但没有通常使这份工作可以承受的明确界限。
在Viaweb,我们前六个月只是在编写软件。我们工作了通常创业公司的长时间工时。在桌面软件公司,这将是我们努力工作的阶段,但与接下来我们将用户引入我们的服务器的阶段相比,这感觉就像是度假。将Viaweb出售给雅虎(除了钱之外)的第二大好处,就是能够将整个责任转移到一家大公司的肩上。
桌面软件迫使用户成为系统管理员。基于Web的软件则迫使程序员成为系统管理员。总体压力较小,但程序员承担的压力更大。这未必是坏消息。如果你是一家初创公司与大公司竞争,这是个好消息。[15]基于Web的应用程序提供了一种直接的方式来超越你的竞争对手。没有初创公司会要求更多。
刚刚好
可能会阻止你编写基于Web的应用程序的一件事是Web页面作为用户界面的平庸。我承认这确实是个问题。我们真的很想添加一些东西到HTML和HTTP中。但关键是,Web页面已经足够好了。
这里有一个与第一代微型计算机的类比。这些机器中的处理器实际上并不是打算用作计算机的CPU。它们是为控制交通信号灯等设备而设计的。但是像Ed Roberts这样的人,设计出了Altair,意识到它们已经足够好了。你可以将这些芯片与一些内存(第一台Altair有256字节)和前面板开关结合起来,就可以得到一台工作的计算机。拥有自己的计算机是如此令人兴奋,以至于有很多人想购买它们,尽管它们的功能有限。
网页并非为应用程序设计的用户界面,但它们已经足够好了。对于大量用户来说,可以从任何浏览器使用的软件本身就足以抵消用户界面的任何笨拙。也许您无法使用 HTML 编写最漂亮的电子表格,但您可以编写一个电子表格,让几个人可以从不同位置同时使用,而无需特殊的客户端软件,或者可以包含实时数据源,或者可以在触发某些条件时通知您。更重要的是,您可以编写出连名字都还没有的全新类型的应用程序。毕竟,VisiCalc 不仅仅是一个微型计算机版本的大型机应用程序,而是一种全新类型的应用程序。
当然,基于服务器的应用程序不必是基于 Web 的。您可以有其他类型的客户端。但我很确定那是个坏主意。如果您可以假设每个人都会安装您的客户端软件,那将非常方便 - 方便到您可能很容易说服自己他们都会这样做 - 但如果他们不这样做,您就完蛋了。因为基于 Web 的软件不对客户端做任何假设,所以它可以在 Web 可用的任何地方运行。这已经是一个很大的优势,随着新的 Web 设备的不断涌现,这种优势还将不断增长。用户会喜欢您的软件,因为它可以正常工作,而您的生活也会更轻松,因为您不必为每个新的客户端进行调整。[16]
我觉得我一直在密切关注 Web 的发展,但我无法预测客户端的未来会怎样。收敛可能正在到来,但在哪里?我无法选出一个赢家。我可以预测的一件事是,AOL 和微软之间将会发生冲突。无论微软的 .NET 最终会变成什么样,它很可能都会涉及将桌面连接到服务器。除非 AOL 反击,否则他们要么会被边缘化,要么会变成微软客户端和服务器软件之间的管道。如果微软和 AOL 陷入客户端战争,唯一一定可以在两者上都运行的就是浏览网页,这意味着基于 Web 的应用程序将是唯一可以在任何地方运行的应用程序。
这一切会如何发展?我不知道。如果您押注于基于 Web 的应用程序,您也不需要知道。没有人能在不破坏浏览的情况下打破这一点。Web 可能不是传递软件的唯一方式,但它是一种现在可用且将继续可用很长时间的方式。基于 Web 的应用程序开发成本低廉,即使是最小的创业公司也能提供。这需要大量工作,而且是一种特别有压力的工作,但这只会让创业公司的机会更大。
为什么不呢?
E. B. White 很高兴从一位农民朋友那里得知,许多带电围栏实际上没有通电。奶牛显然已经学会远离它们,之后就不需要通电了。"起来吧,奶牛们!"他写道,"趁着暴君打鼾时,夺回你们的自由!"
如果您是一个曾经想过有一天要创办一家创业公司的黑客,可能有两件事一直在阻碍您这样做。一个是您对商业一无所知。另一个是您害怕竞争。这两道栅栏都没有通电。
您只需要知道两件关于商业的事情:打造用户喜爱的产品,以及收支平衡。如果您做好了这两点,您就已经领先于大多数创业公司了。其他的您可以边做边学。
您起初可能无法收支平衡,但只要差距缩小得足够快,您就没问题。如果您一开始资金不足,至少会养成节俭的习惯。您花得越少,收支平衡就越容易。幸运的是,启动一个基于 Web 的应用程序可以非常便宜。我们用不到 1 万美元就启动了,现在的成本甚至更低。我们不得不花数千美元买服务器,还要花数千美元购买 SSL。(当时只有 Netscape 在销售 SSL 软件。)现在您可以租用一台功能更强大的服务器,包括 SSL,花费不到我们当时支付的带宽费用。您现在可以以低于一张豪华办公椅的价格启动一个基于 Web 的应用程序。
关于打造用户喜爱的产品,这里有一些一般性建议。 首先要制作一个简洁实用的版本,是你自己也愿意使用的。快速推出1.0版本,然后继续改进软件,密切聆听用户的反馈。客户永远是对的,但不同客户对不同事情是对的;最简单的用户会告诉你需要简化和明确的地方,最复杂的用户则会告诉你需要添加的功能。软件最好的特点就是易用,但实现这一点的方法是设置正确的默认值,而不是限制用户的选择。不要因为竞争对手的软件很糟糕而自满;你应该把软件与它可能成为的样子相比,而不是与当前竞争对手的产品相比。要经常自己使用自己的软件。Viaweb本来是一个在线商店构建工具,但我们也用它来制作自己的网站。 不要只因为别人的工作头衔就听从他们的意见。如果他们有好的想法,就采纳,但最终决定权在你手中;软件必须由了解设计的黑客来设计,而不是略懂软件的设计师。如果你无法像实现软件一样设计软件,就不要创办创业公司。 现在让我们谈谈竞争。你担心的不是像你一样的黑客团队,而是真正的公司,有办公室、商业计划、销售人员等,对吗?事实上,他们比你更害怕你,他们是对的。对于一两个黑客来说,弄清楚如何租办公室或雇佣销售人员要容易得多,而对于任何规模的公司来说,编写软件都是一个巨大的挑战。我在两个方面都有经历,我知道这一点。当Viaweb被雅虎收购时,我突然发现自己在为一家大公司工作,就像在腰深的水中跑步一样。 我并不是要贬低雅虎。他们有一些优秀的黑客,高层管理人员也是真正的硬汉。对于一家大公司来说,他们是例外。但他们的生产效率仍然只有一个小型创业公司的十分之一。任何大公司都很难做得更好。让人害怕的是,微软这样一家如此庞大的公司竟然还能开发软件。他们就像一座会走路的山。 不要被吓倒。你可以做到微软做不到的事情,就像他们能做到你做不到的事情一样。没有人能阻止你。你不需要任何人的许可就可以开发基于Web的应用程序。你不需要进行许可交易,也不需要在零售店里争取货架位置,更不需要乞求将你的应用程序捆绑在操作系统上。你可以直接将软件交付给浏览器,没有人能在你和潜在用户之间设置障碍,除非他们阻止他们浏览网络。 你可能不相信,但我向你保证,微软是害怕你的。那些自满的中层管理人员可能不害怕,但比尔是害怕的,因为他曾经就是你,在1975年,上一次软件交付方式出现变革的时候。
注释
[1] 意识到大部分利润来自服务,构建轻量级客户端的公司通常试图将硬件与在线服务相结合。这种方法效果并不好,部分原因是需要两种不同类型的公司来制造消费电子产品和运营在线服务,部分原因是用户讨厌这种做法。吉列公司以免费提供剃须刀而靠刀片赚钱的模式可能有效,但网络终端与剃须刀的承诺差异太大。手机制造商满足于只销售硬件,而不试图获取服务收入。这可能是互联网客户端的更好模式。如果有人只是销售一个漂亮小巧的带网络浏览器的盒子,让用户可以通过任何ISP连接,全国的技术恐慌者都会买一个。
[2] 安全性更多取决于不犯错误,而不是任何设计决策,但基于服务器的软件的性质将使开发人员更加注意不犯错误。危及服务器可能造成如此大的损害,以至于希望继续经营的ASP(应用服务提供商)很可能会非常谨慎地对待安全性。
[3] 1995年,当我们开始创办Viaweb时,Java小程序被认为是每个人都将用来开发基于服务器的应用程序的技术。小程序似乎是一个过时的想法。下载程序在客户端运行?直接在服务器上运行程序更简单。我们很少花时间在小程序上,但无数其他初创公司一定被这个陷阱所吸引。很少有人能逃脱,否则微软就不能在最新版本的Explorer中放弃Java了。
[4] 这一点归功于Trevor Blackwell,他补充说"编写软件的成本随其规模的增加呈非线性上升。这可能主要是由于修复旧的错误,如果所有错误都能快速发现,成本可能更加线性。"
[5] 最难找到的错误可能是复合错误的一种变体,一个错误恰好弥补了另一个错误。当你修复一个错误时,另一个错误就会显现出来。但这会让人觉得修复是有问题的,因为那是你最后改动的地方。
[6] 在Viaweb内部,我们曾经举办过一次比赛,描述我们软件最糟糕的地方。两名客户支持人员并列获得了第一名,他们的条目令我至今仍感到颤栗。我们立即修复了这两个问题。
[7] Robert Morris编写了订单系统,顾客用它下订单。Trevor Blackwell编写了图像生成器和管理器,商家用它来检索订单、查看统计数据和配置域名等。我编写了编辑器,商家用它来构建自己的网站。订单系统和图像生成器是用C和C++编写的,管理器主要用Perl编写,编辑器用Lisp编写。
[8] 价格歧视如此普遍(你有多次听到零售商声称他们的购买力意味着更低的价格?)以至于我很惊讶它在美国被1936年的罗宾逊-帕特曼法禁止。这项法律似乎执行力度不大。
[9] 在《无标签》一书中,娜奥米·克莱恩说,受"城市青年"青睐的服装品牌并不太努力防止店铺盗窃,因为在他们的目标市场,盗窃者也是时尚领袖。
[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年,很多人认为推出一个新的搜索引擎已经太晚了,但谷歌证明了他们错了。如果当前的选择足够糟糕,总会有新事物的空间。首先要确保它在所有的自由操作系统上都能正常工作--新事物从它的用户开始。
[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发表演讲。
你可以在Hackers & Painters中找到这篇文章和其他14篇文章。