Loading...

另一条路

Original

2001 年 9 月

(本文解释了为什么下一代软件大部分可能是基于服务器的,这对程序员意味着什么,以及为什么这种新型软件对初创企业来说是一个很好的机会。它源于 BBN 实验室的一次演讲。)

1995 年夏天,我和朋友罗伯特·莫里斯决定创办一家公司。当时,网景公司上市前的公关活动正如火如荼地进行着,媒体上也大肆谈论在线商务。当时,网上可能有 30 家实体商店,全部是手工制作的。如果要创建很多在线商店,就需要有制作它们的软件,所以我们决定编写一些软件。

大约第一个星期,我们打算将其打造成一个普通的桌面应用程序。后来有一天,我们想到让软件在我们的 Web 服务器上运行,使用浏览器作为界面。我们尝试重写软件以通过 Web 运行,很明显这是可行的方法。如果我们编写的软件可以在服务器上运行,那么对于用户和我们来说都会方便得多。

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

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

我认为下一代软件中的很多都将基于这种模式编写。即使是损失最大的微软似乎也看到了将某些东西从桌面移出是不可避免的。如果软件从桌面移到服务器上,那么对开发人员来说将意味着一个截然不同的世界。本文描述了我们作为这个新世界的第一批访客所看到的令人惊讶的事情。就软件确实移到服务器上而言,我在这里描述的是未来。

下一步是什么?

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

现在,计算机正处于这个阶段。当你拥有一台台式计算机时,你最终会了解到比你想知道的更多的东西,关于它内部发生的事情。但美国一半以上的家庭都拥有一台台式计算机。我母亲有一台计算机,她用它来收发电子邮件和记账。大约一年前,她收到苹果公司的一封信,信中说苹果公司为她提供了一个新版操作系统的折扣,这让她感到震惊。当一位 65 岁的女人想用电脑收发电子邮件和记账,却不得不考虑安装新的操作系统时,这一定有问题。普通用户甚至不应该知道“操作系统”这个词,更不用说“设备驱动程序”或“补丁”了。

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

有了基于 Web 的软件,大多数用户除了使用应用程序之外,无需考虑任何其他事情。所有杂乱无章、不断变化的东西都将存放在某个服务器上,由擅长此类事情的人维护。因此,通常情况下,您不需要计算机本身来使用软件。您所需要的只是带有键盘、屏幕和 Web 浏览器的东西。也许它可以无线上网。也许它也是您的手机。无论它是什么,它都将是消费电子产品:价格约为 200 美元的东西,人们主要根据外壳的外观来选择。您为互联网服务支付的费用将高于硬件费用,就像您现在为电话支付的费用一样。[1]

单击一次后,服务器将返回,大约需要十分之一秒的时间,因此 Photoshop 等交互性强的软件的用户仍希望在桌面上进行计算。但如果你看看大多数人使用电脑的用途,十分之一秒的延迟不会成为问题。我的母亲实际上不需要台式电脑,像她这样的人还有很多。

用户的胜利

我家附近有一辆汽车的保险杠上贴着“宁死不屈”的标签。大多数人在大多数时候都会选择最省力的选择。如果基于 Web 的软件获胜,那将是因为它更方便。看起来对用户和开发人员来说都是如此。

要使用纯基于 Web 的应用程序,您只需要一个连接到 Internet 的浏览器。因此,您可以在任何地方使用基于 Web 的应用程序。当您在台式计算机上安装软件时,您只能在该计算机上使用它。更糟糕的是,您的文件被困在该计算机上。随着人们逐渐习惯网络,这种模式的不便性变得越来越明显。

这里最薄弱的一点是基于网络的电子邮件。如今,数以百万计的人意识到,无论身在何处,都应该能够访问电子邮件。如果你能查看电子邮件,为什么不能查看日历?如果你能与同事讨论文档,为什么不能编辑它?为什么你的任何数据都要被困在遥远的办公桌上的某台计算机上?

“您的计算机”这一概念正在消失,取而代之的是“您的数据”。您应该能够从任何计算机获取数据。或者更确切地说,任何客户端,客户端不一定是计算机。

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

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

由于无需安装,在“购买”基于 Web 的软件之前试用它将会很容易,也很常见。您应该能够免费试用任何基于 Web 的应用程序,只需访问提供该应用程序的网站即可。在 Viaweb,我们的整个网站就像一个大箭头,引导用户进行试用。

试用演示版后,注册服务只需填写一份简短的表格(越简短越好)。这应该是用户要做的最后一项工作。使用基于 Web 的软件,您无需支付额外费用、无需做任何工作,甚至可能都无需了解新版本。

升级不会像现在这样令人震惊。随着时间的推移,应用程序将悄然变得更加强大。这需要开发人员付出一些努力。他们必须设计软件,以便更新时不会让用户感到困惑。这是一个新问题,但有办法解决它。

对于基于 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++)编写应用程序。因此,这些语言(尤其是管理人员和 VC 等非技术人员)被视为“严肃”软件开发的语言。但这只是桌面软件交付方式的产物。对于基于服务器的软件,您可以使用任何您想要的语言。[3] 如今,许多顶级黑客都在使用与 C 和 C++ 截然不同的语言:Perl、Python 甚至 Lisp。

对于基于服务器的软件,没有人可以告诉你应该使用哪种语言,因为你控制着整个系统,甚至硬件。不同的语言适用于不同的任务。你可以使用最适合每种任务的语言。当你有竞争对手时,“你可以”意味着“你必须”(我们稍后会回到这个问题),因为如果你不利用这种可能性,你的竞争对手就会利用它。

我们的大多数竞争对手都使用 C 和 C++,这让他们的软件明显不如 CGI 脚本,因为(除其他外)他们无法绕过 CGI 脚本的无状态性。如果你要更改某些内容,则所有更改都必须在一个页面上进行,并在底部有一个“更新”按钮。正如我在其他地方所写的那样,通过使用Lisp (许多人仍将其视为研究语言),我们可以让 Viaweb 编辑器的行为更像桌面软件。

发行

在这个新世界中,最重要的变化之一就是发布的方式。在桌面软件行业,发布是一件非常痛苦的事情,整个公司都要努力工作才能推出一个庞大的代码片段。很明显,这个过程和最终的产品都值得比较。

使用基于服务器的软件,您可以像在自己编写的程序中一样进行更改。您可以以一系列增量更改的形式发布软件,而不是偶尔的大规模发布。典型的桌面软件公司可能每年发布一到两次。在 Viaweb,我们通常每天发布三到五次。

当你切换到这个新模式时,你会意识到软件开发受到发布方式的影响有多大。你在桌面软件业务中看到的许多最严重的问题都是由于发布的灾难性造成的。

如果每年只发布一个新版本,您往往会大量处理错误。在发布日期之前的某个时间,您会组装一个新版本,其中一半的代码已被删除并替换,从而引入了无数错误。然后,一队 QA 人员介入并开始清点错误,程序员则按照列表逐一修复错误。他们通常无法完成列表的末尾,而且实际上,没有人知道末尾在哪里。这就像从池塘里捞出碎石。您永远不知道软件内部发生了什么。充其量,您最终得到的只是统计上的正确性。

对于基于服务器的软件,大多数更改都是小的和渐进的。这本身就不太可能引入错误。这也意味着您在即将发布软件时知道最需要仔细测试的内容:您最后更改的内容。最终,您会对代码有更牢固的把握。一般来说,您确实知道代码内部发生了什么。当然,您不会记住源代码,但当您阅读源代码时,您会像飞行员扫描仪表板一样,而不是像侦探试图解开谜团一样。

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

使用基于 Web 的软件,您无需在软件运行之前发布它,而且可以在软件运行后立即发布它。

业内资深人士可能会想,说软件在运行前无需发布,这个想法听起来不错,但如果你承诺在某个日期之前发布新版本的软件,会发生什么情况呢?对于基于 Web 的软件,你不会做出这样的承诺,因为没有版本。你的软件会逐渐且持续地变化。有些变化可能比其他变化更大,但版本的概念并不自然地适用于基于 Web 的软件。

如果有人还记得 Viaweb,这可能听起来很奇怪,因为我们总是在发布新版本。这完全是出于公关目的。我们了解到,行业媒体都是以版本号来思考的。他们会对主要版本进行重点报道,这意味着版本号的第一位数字是新的,而对小数点版本,通常最多只报道一段,这意味着小数点后有一位新的数字。

我们的一些竞争对手提供桌面软件,而且确实有版本号。而对于这些版本,在我们看来,这本身就是他们落后的证据,他们会得到各种各样的宣传。我们不想错过,所以我们也开始为我们的软件提供版本号。当我们想要宣传时,我们会列出自上次“发布”以来添加的所有功能,在软件上贴上新的版本号,并发布新闻稿,称新版本立即可用。令人惊讶的是,从来没有人为此打电话给我们。

到我们被收购时,我们已经这样做了三次,所以我们使用的是第 4 版。如果我没记错的话,是第 4.1 版。在 Viaweb 成为 Yahoo Store 之后,不再迫切需要宣传,因此尽管软件继续发展,但整个版本号的概念被悄然放弃了。

漏洞

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

基于网络的软件全天候使用,因此你所做的一切都会立即受到考验。漏洞很快就会出现。

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

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

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

尽早发现错误,复合错误也会减少。复合错误是两个相互作用的独立错误:你下楼梯时绊倒,当你伸手去抓扶手时,扶手会掉在你的手上。在软件中,这种错误最难发现,而且往往会导致最严重的后果。[5] 传统的“破坏一切,然后过滤掉错误”方法本质上会产生大量复合错误。而通过一系列小改动发布的软件本质上不会产生复合错误。地板上的任何松散物体都会被不断清扫干净,以免以后卡在什么东西上。

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

桌面软件行业的人可能很难相信这一点,但在 Viaweb,漏洞几乎成了一场游戏。由于大多数发布的漏洞都涉及边界情况,遇到漏洞的用户很可能是高级用户,他们正在挑战极限。高级用户对漏洞更宽容,尤其是因为您可能在添加他们要求的某些功能的过程中引入了漏洞。事实上,由于漏洞很少见,而且您必须进行复杂的操作才能看到它们,因此高级用户通常会为发现漏洞而感到自豪。他们会以胜利而非愤怒的精神致电支持人员,就好像他们从我们这里获得了分数一样。

支持

当你可以重现错误时,它就会改变你对客户支持的态度。在大多数软件公司,提供支持是为了让客户感觉更好。他们要么打电话给你,告诉你一个已知的错误,要么他们只是做错了什么,你必须找出原因。无论是哪种情况,你都无法从他们那里学到什么。因此,你倾向于将支持电话视为一件麻烦事,希望尽可能将其与开发人员隔离开来。

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

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

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

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

在我们被雅虎收购后,客服人员被调离程序员很远。直到那时我们才意识到,他们实际上是 QA,而且在某种程度上也是营销人员。除了捕捉错误之外,他们还负责保管模糊的、类似错误的东西,比如让用户感到困惑的功能。[6] 他们还是一个代理焦点小组;我们可以问他们,用户更想要两个新功能中的哪一个,他们总是对的。

士气

能够立即发布软件是一个很大的激励因素。我经常在上班路上想到一些我想对软件进行的更改,并在当天完成。这也适用于较大的功能。即使有些功能需要两周才能编写完成(很少有项目需要更长时间),我知道我可以在完成后立即在软件中看到效果。

如果我不得不等待一年才能发布下一个版本,我会将大部分想法搁置一段时间。但是,想法会引发更多想法。您是否注意到,当您坐下来写东西时,一半的想法都是您在写东西时想到的?软件也是如此。努力实现一个想法会给您带来更多想法。因此,搁置一个想法不仅会延迟实施,还会放弃实施它所可能引发的所有想法。事实上,搁置一个想法甚至可能会抑制新想法的产生:当您开始考虑一些新功能时,您会瞥见搁置的想法并想“但我已经有很多新东西想在下一个版本中做。”

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

在 Viaweb,就像在许多软件公司一样,大多数代码都有一个明确的所有者。但是当你拥有某个东西时,你就真的拥有它了:除了软件所有者之外,没有人需要批准(甚至不知道)发布。除了害怕在同事面前看起来像个白痴之外,没有任何防止破坏的措施,而这已经足够了。我可能给人的印象是我们只是漫不经心地向前编写代码。我们的速度确实很快,但在将软件发布到这些服务器之前,我们非常谨慎。对于可靠性来说,细心比缓慢更重要。由于他非常专注,所以海军飞行员可以在夜间以每小时 140 英里的速度将一架 40,000 磅的飞机降落在颠簸的航母甲板上,比一般的青少年切百吉饼还要安全。

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

布鲁克斯逆袭

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

Viaweb 仅由三个人开发。[7] 我一直面临着聘请更多员工的压力,因为我们想要被收购,而且我们知道,买家很难为一家只有三名程序员的公司支付高价。(解决方案:我们聘请了更多人,但为他们创造了新项目。)

当你用更少的程序员编写软件时,你节省的不仅仅是金钱。正如弗雷德·布鲁克斯在*《人月神话》中指出的那样,*增加项目人员往往会减慢项目进度。开发人员之间可能存在的联系数量会随着团队规模的扩大而呈指数级增长。团队越大,他们在会议上讨论软件如何协同工作的时间就越多,他们从不可预见的交互中发现的 bug 就越多。幸运的是,这个过程也可以反过来:团队越小,软件开发的效率就会成倍提高。我不记得 Viaweb 的程序员曾经开过真正的会议。我们每次要说的话从来没有比我们去吃午饭时说的话多。

如果说这里有什么缺点,那就是所有的程序员在某种程度上也必须是系统管理员。当你托管软件时,必须有人监视服务器,而实际上,唯一能做好这件事的人是编写软件的人。在 Viaweb,我们的系统有如此多的组件,而且变化如此频繁,以至于软件和基础设施之间没有明确的界限。武断地宣布这样的界限会限制我们的设计选择。因此,尽管我们一直希望有一天(“几个月后”)一切都会稳定下来,我们可以雇一个只负责服务器的人,但这从未发生过。

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

观察用户

使用基于服务器的软件,您可以更密切地了解代码。您还可以更密切地了解用户。Intuit 因在零售店向顾客介绍自己并要求跟随他们回家而闻名。如果您曾经看过某人第一次使用您的软件,您就会知道他们一定会遇到什么惊喜。

软件应该按照用户的想法运行。但请相信我,除非你观察用户,否则你无法知道用户的想法。而基于服务器的软件可以为你提供有关用户行为的前所未有的信息。你不再局限于小型、人工的焦点小组。你可以看到每个用户的每一次点击。你必须仔细考虑要查看的内容,因为你不想侵犯用户的隐私,但即使是最一般的统计抽样也可能非常有用。

例如,当您的服务器上有用户时,您不必依赖基准测试。基准测试是模拟用户。使用基于服务器的软件,您可以观察实际用户。要决定优化什么,只需登录服务器并查看哪些内容消耗了所有 CPU。而且您还知道何时停止优化:我们最终将 Viaweb 编辑器优化到了受内存限制而不是受 CPU 限制的程度,而且由于我们无法减少用户数据的大小(当然,这并不容易),我们知道我们最好就此止步。

对于基于服务器的软件来说,效率很重要,因为您需要为硬件付费。每台服务器可以支持的用户数量是资本成本的除数,因此如果您可以使软件非常高效,那么您就可以以低于竞争对手的价格出售产品,同时仍能获利。在 Viaweb,我们将每位用户的资本成本降至约 5 美元。现在这个成本会更低,可能低于向他们发送第一个月账单的成本。如果您的软件效率合理,那么硬件现在是免费的。

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

最后,通过观察用户,你通常可以知道他们什么时候遇到麻烦。由于客户永远是对的,所以这就是你需要解决的问题的信号。在 Viaweb,吸引用户的关键是在线试用。这不仅仅是营销人员制作的一系列幻灯片。在我们的试用中,用户实际上使用了该软件。大约花了五分钟,最后他们就建立了一个真正的、可以运行的商店。

我们几乎通过试用获得所有新用户。我认为大多数基于 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 是一家典型的初创企业。我们对创办一家公司心生恐惧,头几个月里,我们安慰自己,把整个事情当成一个实验,随时可能取消。幸运的是,除了技术障碍外,几乎没有什么障碍。在编写软件时,我们的 Web 服务器就是我们开发时使用的台式机,通过拨号线路与外界相连。我们那个阶段唯一的开销就是食物和房租。

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

如果一家公司想打造一个初创公司愿意使用的平台,那么他们必须让黑客们自己也愿意使用它。这意味着它必须价格低廉且设计精良。Mac 刚推出时就受到黑客的追捧,许多人为它编写软件。[13] Windows 的情况则比较少见,因为黑客们不使用它。现在,擅长编写软件的人往往运行 Linux 或 FreeBSD。

我认为我们不会创办一家初创公司来编写桌面软件,因为桌面软件必须在 Windows 上运行,而在我们为 Windows 编写软件之前,我们必须先使用它。Web 让我们可以绕过 Windows,通过浏览器直接向用户提供在 Unix 上运行的软件。这是一个解放人的前景,很像 25 年前个人电脑的出现。

微软

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

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

我猜微软会开发某种服务器/桌面混合系统,操作系统可以和他们控制的服务器协同工作。至少,文件将集中提供给需要的用户。如果可以避免,我不希望微软走极端,在服务器上进行计算,客户端只使用浏览器。如果你只需要客户端浏览器,那么你就不需要微软在客户端上,如果微软不控制客户端,他们就无法将用户推向基于服务器的应用程序。

我认为微软很难控制住这个魔瓶。客户端类型太多,他们无法控制所有客户端。如果微软的应用程序只适用于某些客户端,竞争对手将能够通过提供适用于任何客户端的应用程序来超越他们。[14]

在基于 Web 的应用程序世界中,微软不会自动占据一席之地。他们可能会成功为自己赢得一席之地,但我不认为他们会像在桌面应用程序世界中一样主宰这个新世界。

与其说是竞争对手会绊倒他们,不如说是他们自己绊倒了自己。随着基于 Web 的软件的兴起,他们面临的不仅仅是技术问题,还有他们自己的一厢情愿。他们需要做的是蚕食他们现有的业务,而我认为他们不会面临这样的情况。让他们走到今天的那种一心一意现在将对他们不利。IBM 也处于同样的境地,但他们无法掌控它。IBM 进入微型计算机业务的时间很晚,而且心不在焉,因为他们对威胁他们的摇钱树——大型机计算感到矛盾。微软同样会因为想要拯救桌面而受到阻碍。摇钱树可能是你背上的沉重负担。

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

初创企业更是如此

典型的创业公司发展速度快,且不拘形式,人员少,资金少。这几个人工作非常努力,技术放大了他们所做决策的影响。如果他们成功了,他们就大获全胜。

在一家编写基于 Web 的应用程序的初创公司中,与初创公司相关的一切都被推向了极致。你可以用更少的人员和更少的资金编写和发布产品。你必须更快,而且你可以更随意地行事。你可以真的在三个人坐在公寓客厅里,在 ISP 上共置一台服务器的情况下发布你的产品。我们就是这样做的。

随着时间的推移,团队规模越来越小,速度越来越快,也越来越不拘礼节。1960 年,软件开发意味着一屋子戴着角质框眼镜、系着窄窄的黑色领带的男人,每天在 IBM 编码表单上勤奋地编写十行代码。1980 年,软件开发团队由八到十人组成,他们穿着牛仔裤去办公室,在 vt100 上打字。现在,团队变成了几个坐在客厅里拿着笔记本电脑的人。(事实证明,牛仔裤并不是不拘礼节的代名词。)

创业压力很大,不幸的是,这种压力在基于 Web 的应用程序上也达到了极致。许多软件公司,尤其是在刚起步时,都有开发人员睡在办公桌下等情况。基于 Web 的软件令人担忧的是,没有什么可以阻止这种情况成为常态。关于睡在办公桌下的故事通常以以下结局收场:最后我们终于发布了产品,然后大家都回家睡了一个星期。基于 Web 的软件从不发布。你可以每天工作 16 个小时,想干多久就干多久。因为你可以,你的竞争对手也可以,所以你往往被迫这样做。你可以,所以你必须。这是帕金森定律的反面例子。

最糟糕的不是工作时间,而是责任。传统上,程序员和系统管理员各有各的烦恼。程序员要担心错误,系统管理员要担心基础设施。程序员可能会花一整天时间埋头苦干源代码,但到了某个时候,他们就可以回家忘掉这一切。系统管理员永远不会完全放下工作,但当他们在凌晨 4:00 接到电话时,通常不需要做任何非常复杂的事情。有了基于 Web 的应用程序,这两种压力就结合在一起了。程序员变成了系统管理员,但没有了通常使工作可以忍受的明确界限。

在 Viaweb,我们花了六个月时间编写软件。我们像早期创业公司一样长时间工作。在一家桌面软件公司,这应该是我们努力工作的部分,但与下一个阶段相比,这感觉就像是度假,那时我们将用户带到我们的服务器上。将 Viaweb 卖给雅虎的第二大好处(仅次于金钱)是能够将整个项目的最终责任推给一家大公司。

桌面软件迫使用户成为系统管理员。基于 Web 的软件迫使程序员成为系统管理员。总体而言,压力较小,但程序员的压力更大。这不一定是坏消息。如果你是一家与大公司竞争的初创公司,这是好消息。[15] 基于 Web 的应用程序提供了一种超越竞争对手的直接方法。没有一家初创公司会要求更多。

刚刚好

有一件事可能会阻止您编写基于 Web 的应用程序,那就是网页作为 UI 的缺陷。我承认,这是一个问题。我们确实希望在 HTML 和 HTTP 中添加一些东西。但重要的是,网页已经足够好了。

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

网页并非设计为应用程序的用户界面,但它们已经足够好了。对于相当多的用户来说,可以从任何浏览器使用的软件本身就足以弥补用户界面的尴尬。也许您无法使用 HTML 编写外观最好的电子表格,但您可以编写一个电子表格,让几个人可以在不同位置同时使用,而无需特殊的客户端软件,或者可以包含实时数据馈送,或者可以在触发某些条件时向您发送页面。更重要的是,您可以编写尚未命名的新型应用程序。毕竟,VisiCalc 不仅仅是大型机应用程序的微型计算机版本——它是一种新型应用程序。

当然,基于服务器的应用程序不一定是基于 Web 的。你可以使用其他类型的客户端。但我敢肯定这不是个好主意。如果你能假设每个人都会安装你的客户端,那将非常方便——方便到你可以轻易说服自己所有人都会安装——但如果他们不安装,你就完蛋了。因为基于 Web 的软件对客户端没有任何假设,所以它可以在任何能运行 Web 的地方运行。这已经是一个很大的优势,而且随着新 Web 设备的激增,这个优势还会越来越大。用户会喜欢你的软件,因为你的软件很好用,你的生活也会更轻松,因为你不必为每个新客户端调整它。[16]

我感觉自己和其他人一样密切关注着网络的发展,我无法预测客户端会发生什么。融合可能即将到来,但在哪里呢?我无法挑选出赢家。我能预测的一件事是美国在线和微软之间的冲突。无论微软的 .NET 最终是什么,它都可能涉及将桌面连接到服务器。除非美国在线反击,否则他们要么被推到一边,要么变成微软客户端和服务器软件之间的管道。如果微软和美国在线陷入客户端战争,那么唯一可以肯定的是两者共同发挥作用的将是浏览网络,这意味着基于网络的应用程序将是唯一一种可以在任何地方使用的应用程序。

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

为什么不呢?

EB White 从一位农民朋友那里得知,许多带电围栏没有电流通过,他觉得很有趣。奶牛显然学会了远离它们,从此以后就不需要电流了。“站起来,奶牛们!”他写道,“趁暴君还在打鼾,你们要自由!”

如果你是一名黑客,想过有一天创办一家初创公司,那么可能有两个因素阻碍你这样做。一是你对商业一无所知。二是你害怕竞争。这两道屏障都没有电流。

关于商业,你只需要知道两件事:打造用户喜爱的产品,以及赚得比花的更多。如果你能做好这两件事,你就会领先于大多数初创公司。剩下的事情,你可以慢慢来。

一开始,你可能赚的钱不会比花的多,但只要差距缩小得足够快,就没问题。如果你一开始资金不足,至少可以养成节俭的习惯。花得越少,越容易赚得比花的多。幸运的是,推出基于 Web 的应用程序非常便宜。我们推出时花费不到 10,000 美元,现在甚至更便宜。我们必须花数千美元购买服务器,再花数千美元购买 SSL。(当时唯一一家销售 SSL 软件的公司是 Netscape。)现在,你可以租用功能更强大的服务器(包括 SSL),而费用比我们单独支付带宽费用还低。现在,你可以以比购买一把高档办公椅的费用还低的价格推出基于 Web 的应用程序。

至于如何打造用户喜爱的产品,这里有一些通用的技巧。首先,制作一些干净、简单、您自己想要使用的产品。快速推出 1.0 版,然后继续改进软件,同时密切倾听用户的意见。客户永远是对的,但不同的客户对不同的事情有不同的看法;最不成熟的用户会告诉您需要简化和澄清哪些内容,而最成熟的用户会告诉您需要添加哪些功能。软件最好的功能就是简单,但做到这一点的方法是设置正确的默认设置,而不是限制用户的选择。如果竞争对手的软件很差劲,不要自满;比较您的软件的标准是它可能达到的水平,而不是您当前竞争对手所拥有的水平。始终自己使用您的软件。Viaweb 应该是一个在线商店构建器,但我们也用它来制作我们自己的网站。不要仅仅因为他们的职位而听从营销人员、设计师或产品经理的意见。如果他们有好的想法,就使用它们,但决定权在您手中;软件必须由懂设计的黑客来设计,而不是对软件知之甚少的设计师。如果你不能设计软件并实现它,就不要创业。

现在让我们谈谈竞争。你害怕的可能不是像你这样的黑客团体,而是真正的公司,有办公室、有商业计划、有销售人员等等,对吧?好吧,他们比你更怕你,他们说得对。对于几个黑客来说,想办法租办公室或雇佣销售人员要比一家公司编写软件容易得多。我曾站在双方,所以我知道。当 Viaweb 被雅虎收购时,我突然发现自己在为一家大公司工作,感觉就像在齐腰深的水中奔跑一样。

我无意贬低雅虎。他们有一些优秀的黑客,高层管理人员也非常厉害。对于一家大公司来说,他们非常出色。但他们的生产力仍然只有小型初创公司的十分之一。没有哪家大公司能做得比这更好。微软的可怕之处在于,一家如此大的公司竟然可以开发软件。他们就像一座可以行走的山。

不要被吓倒。你可以做微软做不到的事情,正如他们能做你不能做的事情一样。没有人可以阻止你。你不必征求任何人的许可来开发基于 Web 的应用程序。你不必签订许可协议,或在零售商店占据货架空间,或卑躬屈膝地将你的应用程序与操作系统捆绑在一起。你可以将软件直接交付给浏览器,没有人可以在不阻止潜在用户浏览 Web 的情况下介入你和潜在用户之间。

你可能不相信,但我向你保证,微软害怕你。自满的中层管理人员可能不害怕,但比尔害怕,因为他曾经和你一样,那是在 1975 年,当时出现了最后一次交付软件的新方式。

笔记

[1] 意识到大部分收入都花在服务上,打造轻量级客户端的公司通常会尝试将硬件与在线服务结合起来。这种方法效果并不好,部分原因是需要两种不同的公司来打造消费电子产品和运营在线服务,部分原因是用户讨厌这个想法。免费提供剃须刀并靠刀片赚钱对吉列来说可能可行,但剃须刀比 Web 终端的承诺要小得多。手机制造商满足于销售硬件,而不必试图获取服务收入。互联网客户端可能也应该效仿。如果有人只卖一个外观漂亮的小盒子,带有可用于连接任何 ISP 的 Web 浏览器,那么全国的每个技术恐惧症者都会买一个。

[2] 安全性总是更多地取决于不要搞砸,而不是任何设计决策,但基于服务器的软件的性质将使开发人员更加注意不要搞砸。入侵服务器可能会造成如此大的损害,以至于 ASP(希望继续经营)可能会对安全性非常谨慎。

[3] 1995 年,当我们创办 Viaweb 时,Java 小程序被认为是每个人都会用来开发基于服务器的应用程序的技术。在我们看来,小程序是一个过时的想法。下载程序在客户端上运行?更简单的方法是直接在服务器上运行程序。我们在小程序上浪费的时间很少,但无数其他初创公司一定被引诱进入了这个陷阱。很少有公司能活着逃脱,否则微软不可能在最新版本的 Explorer 中放弃 Java。

[4] Trevor Blackwell 提出了这一观点,他补充道:“编写软件的成本会随着软件规模的扩大而线性增加。这可能主要是因为需要修复旧错误,如果能快速找到所有错误,那么成本可能会更线性地增加。”

[5] 最难发现的 bug 可能是复合 bug 的一种变体,即一个 bug 恰好弥补了另一个 bug。当你修复一个 bug 时,另一个 bug 就会显现出来。但看起来好像是修复出了问题,因为这是你最后修改的。

[6] 在 Viaweb 内部,我们曾经举办过一场比赛,要求描述我们软件中最糟糕的地方。两名客服人员并列第一,他们给出的答案至今让我不寒而栗。我们立即解决了这两个问题。

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

[8] 价格歧视如此普遍(你是否经常听到零售商声称他们的购买力意味着你可以享受更低的价格?),令我惊讶的是,美国 1936 年的《罗宾逊-帕特曼法》禁止了价格歧视。这项法律似乎没有得到有力的执行。

[9] 娜奥米·克莱因在*《No Logo》一*书中指出,“城市青年”青睐的服装品牌并不会刻意去防止商店偷窃,因为在他们的目标市场中,偷窃者同时也是时尚的引领者。

[10] 公司经常会思考什么该外包,什么不该外包。一个可能的答案是:将不直接面临竞争压力的工作外包,因为外包会使其面临竞争压力。

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

[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 篇文章。