Loading...

前方的另一条路

Original

2001 年 9 月

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

在 1995 年的夏天,我和我的朋友罗伯特·莫里斯决定创办一家初创公司。当时,网景 IPO 的公关活动正在如火如荼地进行,媒体上充斥着关于在线商务的讨论。当时,网上可能只有 30 家真正的商店,而且都是手工制作的。如果要出现很多在线商店,就需要有制作它们的软件,所以我们决定编写一些。

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

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

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

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

下一个是什么?

当我们回顾桌面软件时代时,我认为我们会对人们忍受的不便感到惊讶,就像我们现在对早期汽车主忍受的事情感到惊讶一样。在最初的 20 到 30 年里,你必须成为一名汽车专家才能拥有汽车。但汽车的优势如此之大,以至于许多不是汽车专家的人也想要拥有汽车。

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

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

使用基于 Web 的软件,大多数用户不必考虑任何事情,除了他们使用的应用程序。所有混乱、不断变化的东西都将放在某个服务器上,由擅长这类事情的人维护。因此,你通常不需要一台电脑来使用软件。你只需要一个带有键盘、屏幕和 Web 浏览器的设备。它可能具有无线互联网接入功能。它也可能就是你的手机。无论它是什么,它都将是消费电子产品:价格约为 200 美元,人们主要根据外壳的外观来选择。你将为互联网服务支付比硬件更多的费用,就像你现在为电话支付的费用一样。[1]

一个点击到达服务器并返回大约需要十分之一秒,因此,使用高度交互式软件(如 Photoshop)的用户仍然希望计算在桌面上进行。但如果你看看大多数人使用电脑做的事情,十分之一秒的延迟不会成为问题。我母亲并不真正需要一台台式电脑,而且像她这样的人很多。

对用户的优势

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

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

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

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

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

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

由于它不需要安装,因此尝试基于 Web 的软件将变得容易,而且很常见。你应该能够免费试用任何基于 Web 的应用程序,只需访问提供它的网站即可。在 Viaweb,我们的整个网站就像一个指向试用版的巨大箭头。

试用演示后,注册服务只需要填写一个简短的表格(越简短越好)。这应该是用户需要做的最后一件事。使用基于 Web 的软件,你应该能够获得新版本,而无需额外付费,或做任何工作,甚至可能不知道它。

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

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

基于 Web 的应用程序可以同时被几个人使用。对于协作应用程序来说,这是一个明显的优势,但我敢打赌,一旦用户意识到这是可能的,他们就会开始在大多数应用程序中都想要这种功能。例如,让两个人同时编辑同一个文档通常很有用。Viaweb 允许多个用户同时编辑一个网站,与其说是因为这是编写软件的正确方法,不如说是因为我们预计用户会想要这样做,但事实证明,许多用户确实想要这样做。

当你使用基于 Web 的应用程序时,你的数据将更加安全。硬盘崩溃不会成为过去,但用户将不再听到关于它们的消息。它们将发生在服务器场内。提供基于 Web 的应用程序的公司实际上会进行备份——不仅因为他们会有真正的系统管理员担心这类事情,而且因为丢失用户数据的 ASP 会遇到很大的麻烦。当人们在硬盘崩溃中丢失自己的数据时,他们不会太生气,因为他们只能责怪自己。当一家公司为他们丢失数据时,他们会更加生气。

最后,基于 Web 的软件应该更不容易受到病毒的攻击。如果客户端只运行浏览器,那么运行病毒的可能性就更小,而且本地没有数据可以损坏。攻击服务器本身的程序应该会发现它们防御得很好。[2]

对于用户来说,基于 Web 的软件将 压力更小。我认为,如果你看看普通 Windows 用户的内心,你会发现他们对满足这种描述的软件有着巨大而几乎未被开发的渴望。一旦释放出来,它将成为一股强大的力量。

代码之城

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

在 Viaweb,软件包括用户直接与之交互的相当大的应用程序、这些应用程序使用的程序、在后台不断运行以查找问题的程序、在出现故障时尝试重新启动程序的程序、偶尔运行以编译统计信息或构建搜索索引的程序、我们明确运行以回收资源或移动或恢复数据的程序、假装是用户的程序(用于衡量性能或暴露错误)、用于诊断网络故障的程序、用于进行备份的程序、与外部服务的接口、驱动大量显示实时服务器统计信息的刻度盘的软件(对访问者来说很受欢迎,对我们来说也是必不可少的)、对开源软件的修改(包括错误修复),以及大量配置文件和设置。特雷弗·布莱克韦尔编写了一个出色的程序,用于将商店迁移到全国各地的新服务器,而无需关闭它们,这是我们在被雅虎收购后完成的。程序向我们发送页面、向用户发送传真和电子邮件、与信用卡处理商进行交易,并通过套接字、管道、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.0 版。如果我没记错的话,应该是 4.1 版。在 Viaweb 成为雅虎商店之后,不再那么迫切需要宣传,所以尽管软件继续发展,但版本号的整个概念被悄悄地放弃了。

错误

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

基于 Web 的软件全天候使用,因此你所做的一切都会立即被严格考验。错误会很快出现。

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

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

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

当你尽早发现错误时,你也会遇到更少的复合错误。复合错误是两个独立的错误相互作用:你下楼时绊倒了,当你伸手去扶扶手时,它从你的手中脱落了。在软件中,这种错误是最难发现的,而且往往会造成最严重的后果。[5] 传统的“破坏一切,然后过滤掉错误”方法本质上会产生很多复合错误。而以一系列小更改发布的软件本质上不会产生很多复合错误。地板不断被清扫干净,以防止任何可能卡在其他东西中的松散物体。

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

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

支持

当你能够重现错误时,它会改变你对客户支持的看法。在大多数软件公司,支持是作为一种让客户感觉更好的方式提供的。他们要么是打电话给你询问已知错误,要么就是做错了什么,你需要弄清楚是什么。无论哪种情况,你都无法从他们那里学到太多东西。因此,你往往将支持电话视为一种痛苦,你希望尽可能地将它与你的开发人员隔离开来。

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

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

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

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

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

士气

能够立即发布软件是一个很大的动力。我经常在去上班的路上想到我想对软件做的一些更改,然后就在那天完成它。这对更大的功能也适用。即使有些事情需要两周才能写完(很少有项目需要更长时间),我知道我可以在它完成后的第一时间看到它在软件中的效果。

如果我不得不等到下一年才能发布,我就会把大多数这些想法搁置起来,至少要搁置一段时间。但想法的特点是,它们会带来更多想法。你有没有注意到,当你坐下来写东西时,最终出现在里面的想法中有一半是你写的时候想到的?软件也是如此。努力实现一个想法会给你带来更多想法。因此,搁置一个想法不仅会让你在实现它方面有所延迟,还会让你失去实现它所带来的所有想法。事实上,搁置一个想法甚至可能会抑制新想法:当你开始想到一些新功能时,你会看到那个架子,然后想“但我已经有很多新东西想在下一个版本中做”。

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

在 Viaweb,就像在许多软件公司一样,大多数代码都有一个明确的拥有者。但当你拥有某样东西时,你真正拥有它:除了软件的拥有者之外,没有人需要批准(甚至知道)发布。除了害怕在同龄人面前显得像个傻瓜之外,没有其他保护措施,而这已经足够了。我可能给人的印象是我们只是漫不经心地向前推进,编写代码。我们确实速度很快,但我们在将软件发布到那些服务器上之前,会非常仔细地思考。而专注比行动缓慢更重要。因为海军飞行员非常专注,所以他可以在晚上以每小时 140 英里的速度将一架 40,000 磅的飞机降落在摇晃的航母甲板上,比普通青少年切面包更安全。

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

布鲁克斯逆定律

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

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

当你能够用更少的程序员编写软件时,它为你节省的不仅仅是金钱。正如弗雷德·布鲁克斯在 人月神话 中指出的那样,在项目中添加人员往往会减慢速度。开发人员之间可能的连接数量随着团队规模的扩大而呈指数级增长。团队越大,他们花在会议上协商他们的软件如何协同工作的时间就越多,他们从不可预见交互中获得的错误就越多。幸运的是,这个过程也反过来:随着团队规模的缩小,软件开发的效率呈指数级提高。我不记得 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 咨询公司说服,他们会更好,如果他们为他们自己的服务器上的定制在线商店支付 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 编码表格上每天编写 10 行代码。在 1980 年,它是一个由 8 到 10 个人组成的团队,穿着牛仔裤去办公室,在 vt100 上打字。现在,它变成了两个人坐在客厅里,用笔记本电脑。 (事实证明,牛仔裤并不是随意的最后一句话。)

初创公司压力很大,不幸的是,对于基于 Web 的应用程序来说,这也是一种极端情况。许多软件公司,尤其是在开始的时候,都会经历一段时期,开发人员在办公桌下睡觉等等。关于基于 Web 的软件令人担忧的事情是,没有什么可以阻止这种情况成为默认情况。关于在办公桌下睡觉的故事通常以这样的结局告终:然后我们终于发布了它,我们都回家睡了一周。基于 Web 的软件永远不会发布。你可以每天工作 16 个小时,只要你愿意。而且因为你可以,你的竞争对手也可以,你往往被迫这样做。你可以,所以你必须。这是帕金森定律的反向运行。

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

在 Viaweb,我们花了最初的六个月时间只是编写软件。我们像早期初创公司一样,工作了通常的长时间。在一家桌面软件公司,这将是我们努力工作的一部分,但与下一阶段相比,这感觉就像度假一样,我们把用户带到了我们的服务器上。将 Viaweb 卖给雅虎的第二大好处(除了钱之外)是能够将整个事情的最终责任转嫁到一家大公司的肩上。

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

足够好

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

这里有一个与第一批微型电脑的相似之处。这些机器中的处理器实际上并非旨在成为电脑的 CPU。它们的设计目的是用于交通灯等东西。但像埃德·罗伯茨这样的人,他设计了 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.怀特从一位农民朋友那里得知,许多带电围栏都没有电流通过,对此感到好笑。牛显然学会了远离它们,在那之后,你就不需要电流了。“起来吧,牛!”他写道,“在暴君打鼾的时候,夺回你们的自由!”

如果你是一个黑客,曾经想过有一天要创办一家初创公司,可能有两件事阻止了你。一个是你不了解商业。另一个是你害怕竞争。这两个围栏都没有电流。

关于商业,你只需要知道两件事:打造用户喜欢的产品,以及支出比收入多。如果你做到了这两点,你将领先于大多数初创公司。你可以边走边学剩下的东西。

你可能一开始不会支出比收入多,但只要差距缩小的速度足够快,你就会没事。如果你一开始资金不足,至少会培养一种节俭的习惯。你花的越少,支出比收入多就越容易。幸运的是,发布基于 Web 的应用程序的成本可能非常低。我们以不到 10,000 美元的资金发布了它,现在会更便宜。我们不得不花数千美元购买服务器,以及数千美元购买 SSL。(当时唯一销售 SSL 软件的公司是网景。)现在,你可以租用一台功能更强大的服务器,包括 SSL,价格比我们当时只为带宽支付的价格还要低。你现在可以以不到一把昂贵办公椅的价格发布一个基于 Web 的应用程序。

至于打造用户喜欢的产品,这里有一些一般性的建议。首先,制作一些干净简洁的东西,你自己也想要使用。快速发布 1.0 版本,然后继续改进软件,在改进过程中仔细倾听用户的意见。客户永远是对的,但不同的客户对不同的东西是对的;最不成熟的用户向你展示你需要简化和澄清什么,而最成熟的用户告诉你你需要添加什么功能。软件最好的状态是简单,但实现这一点的方法是将默认值设置正确,而不是限制用户的选择。如果你的竞争对手的软件很糟糕,不要沾沾自喜;将你的软件与之比较的标准应该是它可以是什么,而不是你目前的竞争对手碰巧拥有什么。自己使用你的软件,一直使用。Viaweb 应该是一个在线商店构建器,但我们也用它来制作我们自己的网站。不要仅仅因为他们的职位头衔而听取营销人员、设计师或产品经理的意见。如果他们有好的想法,就使用它们,但最终决定权在你手中;软件必须由了解设计的黑客来设计,而不是了解一些软件的设计师。如果你不能像实现软件一样设计软件,就不要创办一家初创公司。

现在让我们谈谈竞争。你害怕的不是像你一样的黑客群体,而是真正的公司,有办公室、商业计划、销售人员等等,对吧?好吧,他们比你更害怕你,而且他们是对的。对于几个黑客来说,弄清楚如何租用办公空间或雇佣销售人员比任何规模的公司都更容易获得软件编写。我曾经身处两边,我知道。当 Viaweb 被雅虎收购时,我突然发现自己为一家大公司工作,这就像试图在齐腰深的水中奔跑一样。

我并不是要贬低雅虎。他们有一些优秀的程序员,高层管理人员都是真正的狠角色。对于一家大公司来说,他们很出色。但他们的生产力仍然只有小型初创公司的十分之一左右。没有一家大公司能比这做得更好。微软可怕的地方在于,一家如此庞大的公司竟然还能开发软件。他们就像一座会走路的山。

不要害怕。你能做很多微软做不到的事情,就像他们能做很多你做不到的事情一样。没有人能阻止你。你不需要征得任何人的许可来开发基于 Web 的应用程序。你不需要做许可协议,也不需要在零售店获得货架空间,也不需要卑躬屈膝地让你的应用程序与操作系统捆绑在一起。你可以直接将软件交付到浏览器,没有人可以在你和你潜在用户之间插手,除非阻止他们浏览 Web。

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

注释

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

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

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

[4] 这一点归功于特雷弗·布莱克韦尔,他补充说,“编写软件的成本随着其规模的增加而呈非线性增长。也许这主要是由于修复旧错误,如果所有错误都能快速找到,成本可能会更线性。”

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

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

[7] 罗伯特·莫里斯编写了订购系统,购物者用它来下订单。特雷弗·布莱克韦尔编写了图像生成器和管理器,商户用它来检索订单、查看统计数据和配置域名等等。我编写了编辑器,商户用它来构建他们的网站。订购系统和图像生成器是用 C 和 C++ 编写的,管理器主要用 Perl 编写的,编辑器用 Lisp 编写的。

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

[9] 在《无标志》中,娜奥米·克莱因说,深受“城市青年”喜爱的服装品牌并没有努力阻止商店盗窃,因为在他们的目标市场中,商店盗窃者也是时尚领袖。

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

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

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

[13] 如果 Mac 如此出色,为什么它会失败?又是成本。微软专注于软件业务,并对苹果硬件释放了一大批廉价的组件供应商。此外,在关键时期,西装革履的人接管了公司,这也没有帮助。

[14] 一件可以帮助基于 Web 的应用程序,并帮助下一代软件不被微软所掩盖的事情,是一个好的开源浏览器。Mozilla 是开源的,但似乎因为长期以来一直是企业软件而受到影响。一个小型、快速的浏览器,并且得到积极维护,本身就是一件很棒的事情,而且可能会鼓励公司构建小型 Web 设备。

除此之外,一个合适的开源浏览器将导致 HTTP 和 HTML 继续发展(例如 Perl)。能够区分选择链接和跟随链接将极大地帮助基于 Web 的应用程序;你只需要对 HTTP 进行一个微不足道的增强,就可以在请求中允许多个 URL。级联菜单也是一个好主意。

如果你想改变世界,就编写一个新的 Mosaic。认为太迟了吗?在 1998 年,许多人认为推出一个新的搜索引擎为时已晚,但谷歌证明了他们错了。如果当前的选择足够糟糕,总会有空间容纳新的东西。首先确保它在所有免费操作系统上都能正常工作——新事物从用户开始。

[15] 特雷弗·布莱克韦尔,他可能比任何人都更了解这一点,写道:

“我更进一步地说,因为基于服务器的软件对程序员来说太难了,它导致了从大公司转向小型公司的根本经济转变。它需要程序员投入的强度和奉献精神,而他们只有在自己的公司时才会愿意提供。软件公司可以雇佣有技能的人在不太苛刻的环境中工作,也可以雇佣没有技能的人忍受艰苦,但他们不能雇佣高技能的人来拼命工作。由于不再需要资本,大公司在谈判桌上几乎没有筹码。”

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