另一条前路
原文:The Other Road Ahead
作者:Paul Graham 发表:2001-09
译者:Claude(baoyu-translate)
2001 年 9 月
(本文解释为什么下一代软件大多会基于服务器、这对程序员意味着什么、为什么这种新软件对创业公司是大机会。本文由 BBN Labs(美国研究机构 Bolt Beranek and Newman)的一次演讲改写。)
1995 年夏天,我和朋友 Robert Morris 决定一起搞一家创业公司。当时 Netscape 上市前的 PR 战正打得如火如荼,媒体上铺天盖地都在谈在线商务。那时候整个 Web 上大概只有三十家真正在卖东西的店,全是手工搭起来的。如果将来要有大量在线商店,那就必须有用来做这些店的软件。所以我们决定写一个。
最开始那一周左右,我们打算做成一款普通的桌面程序。然后某天我们冒出一个想法:让软件跑在我们自己的 Web 服务器上,把浏览器当界面用。我们试着把代码改成在 Web 上跑,结果一目了然——这才是正确的路。如果软件跑在服务器上,对用户和我们都会轻松得多。
事实证明这是个好主意。这套软件如今叫 Yahoo Store,是最流行的在线商店建站工具,用户大约有 14,000 个。
我们刚做 Viaweb 的时候,跟人讲软件跑在服务器上,几乎没人能听懂这话什么意思。直到一年后 Hotmail 上线,人们才开始明白。现在所有人都知道这是一种可行的做法。我们当年所做的事,现在已经有了名字:应用服务提供商(ASP)。
我认为下一代软件的相当一部分都会按这个模式来写。连最有理由抗拒的 Microsoft,似乎都看到了某些东西从桌面挪走是迟早的事。如果软件从桌面搬到服务器,对开发者来说世界会非常不一样。本文要讲的是我们作为这个新世界最早的访客之一,所看到的那些出乎意料的事。软件搬到服务器的程度有多深,我所描述的就是多大程度上的未来。
下一波是什么?
回头看桌面软件这个时代,我想我们会惊叹人们居然忍受了那么多不便,就像今天我们惊叹早期车主能忍受那种麻烦一样。最初那二三十年,要养一辆车你得是汽车专家。但车实在太好用了,一堆不是汽车专家的人也想拥有它。
电脑现在就处于这个阶段。一旦你拥有一台桌面电脑,你最后会被迫了解一堆你本来根本不想知道的、关于这台机器内部正在发生什么的细节。但全美超过一半的家庭都有一台。我母亲有一台电脑,用来收发邮件、记账。大约一年前,她收到 Apple 的一封信,吓了一跳——那封信给她推荐了新版操作系统的折扣。一个 65 岁、只想用电脑收邮件记账的老太太居然要操心装新操作系统,这显然哪里不对。普通用户根本不该听说“操作系统“这个词,更别提“设备驱动“或“补丁“。
现在有了另一种交付软件的方式,能把用户从系统管理员的角色里解放出来。基于 Web 的应用是跑在 Web 服务器上、用 Web 页面做用户界面的程序。对一般用户而言,这种新软件比桌面软件更简单、更便宜、更便携、更可靠,往往也更强大。
有了基于 Web 的软件,大多数用户除了用应用本身,什么都不用想。所有杂乱、不断变化的东西都待在某台服务器上,由擅长此事的人去维护。这样一来,你就不需要严格意义上的“电脑“才能用软件。你需要的只是一个有键盘、屏幕和 Web 浏览器的东西。也许它接无线网。也许它就是你的手机。无论是什么,它都属于消费电子:一个 200 美元左右的小盒子,人们主要根据外壳好看不好看来挑。你为互联网服务付的钱会比硬件贵,就像你今天用电话一样。[1]
一次点击在客户端和服务器之间往返大约要十分之一秒,所以那些重交互的软件——比如 Photoshop——还是会希望计算发生在桌面端。但如果你看大多数人用电脑做的事,十分之一秒的延迟根本不是问题。我母亲其实不需要桌面电脑,跟她一样的人有很多。
给用户带来的好处
我家附近有辆车,保险杠上贴着一张标语:“宁死不便”。多数人在多数时候都会选最省力的那条路。如果基于 Web 的软件赢了,那是因为它更方便。看起来它也确实会更方便——对用户和开发者都一样。
要用一个纯粹的 Web 应用,你需要的只是一个连着互联网的浏览器。所以你可以在任何地方用它。当你把软件装在桌面电脑上,你只能在那台电脑上用。更糟的是,你的文件也被困在那台电脑上。随着大家越来越习惯于网络,这种模式的不便会变得越来越显眼。
打入这个楔子的第一招是基于 Web 的邮箱。几百万人现在都明白了:不管你在哪里,都该能看自己的邮件。那既然能看邮件,为什么不能看日历?既然能跟同事讨论一份文档,为什么不能编辑它?为什么你的任何数据都该被锁在某台远在天边的桌子上的电脑里?
“你的电脑“这个概念正在消失,被“你的数据“取代。你应该能从任何一台电脑访问到自己的数据。或者更准确地说,从任何一个客户端——而客户端不一定是电脑。
客户端不该存数据;它们该像电话一样。事实上它们可能就会变成电话,反过来也一样。而且随着客户端越来越小,你又多了一个不该把数据放在上面的理由:随身携带的东西可能丢、可能被偷。把 PDA 落在出租车上跟硬盘崩溃没什么两样,区别只是你的数据被交到别人手里,而不是直接蒸发。
用纯粹的 Web 软件,无论是数据还是应用都不放在客户端。所以你不用装任何东西。既然没有安装这一步,你就不必担心安装出错。应用和你的操作系统之间不可能存在不兼容,因为软件根本不在你的操作系统上跑。
因为不需要安装,所以“买之前先试“会变得既简单又普遍。任何 Web 应用,你都该期望能免费试用,只要打开它的网站就行。在 Viaweb,我们整个网站就像一个大箭头,指着用户去试用版那边。
试用之后,注册服务应该只要填一个简短的表(越短越好),仅此而已。这就是用户最后要做的事。用基于 Web 的软件,你应该能免费拿到新版本,不用做什么事,甚至可能根本不知道升级发生过。
升级不再像今天这样大动干戈。久而久之,应用会悄悄变得更强。这要求开发者多动点脑子。他们必须把软件设计成可以在不让用户犯迷糊的前提下不断更新。这是个新问题,但有办法解决。
用 Web 应用,所有人用的都是同一个版本,bug 一发现就能修。所以基于 Web 的软件的 bug 数应该远少于桌面软件。在 Viaweb,我怀疑我们任何时候都没有同时存在过十个已知 bug。这比桌面软件好上几个数量级。
Web 应用可以多人同时使用。对协作型应用这是显而易见的好处,但我打赌一旦用户意识到这是可能的,他们会希望大多数应用都这样。比如让两个人同时编辑同一份文档常常会很有用。Viaweb 允许多个用户同时编辑同一个站点——更多是因为这是写这套软件的正确方式,而不是因为我们觉得用户会想要,但事实证明很多人确实想要。
用 Web 应用,你的数据更安全。硬盘崩溃不会成为历史,但用户不会再听说它们。它们发生在服务器农场里。提供 Web 应用的公司是真的会做备份的——一来他们有真正的系统管理员操心这些事,二来一个把用户数据搞丢的 ASP 会陷入大、大、大麻烦。当人们自己硬盘崩了把数据弄没了,他们没法太生气,因为只能怪自己。当一家公司把他们的数据弄没了,他们会愤怒得多。
最后,基于 Web 的软件应该更不容易中毒。如果客户端只跑一个浏览器,那中毒的机会就少,本地也没啥数据可被破坏。而企图攻击服务器的程序,会发现服务器防得很严。[2]
对用户来说,基于 Web 的软件压力更小。我觉得如果你看一下普通 Windows 用户的内心,会发现里面藏着一种巨大的、几乎完全没被满足的渴望——他们想要的就是这种软件。一旦释放出来,会是一股强大的力量。
代码之城
对开发者来说,Web 软件和桌面软件最显眼的差别是:一个 Web 应用不是一整块代码。它是一堆不同类型的程序的集合,而不是一个巨大的二进制文件。所以设计 Web 软件更像是在设计一座城市,而不是设计一栋楼:除了楼,你还得有路、路标、市政设施、警察和消防、增长规划、各种灾难预案。
在 Viaweb,“软件“这个词囊括了:用户直接打交道的相当大的应用;这些应用在用的程序;常驻后台找问题的程序;东西坏了试图重启它们的程序;偶尔跑一下做统计、给搜索建索引的程序;我们手动跑去清资源、迁移或恢复数据的程序;伪装成用户的程序(用来测性能或暴露 bug);诊断网络问题的程序;做备份的程序;连外部服务的接口;一套软件驱动一组很神气的实时服务器状态仪表盘(参观者很爱看,对我们也是必不可少的);对开源软件的修改(包括 bug 修复);以及一大堆配置文件和设置项。我们被 Yahoo 收购后,Trevor Blackwell 写了一段惊人的程序,能在不停机的情况下把店铺迁移到全国各地的新服务器。各种程序还会呼我们、给用户发传真和邮件、跟信用卡处理商完成交易,并通过 socket、管道、HTTP 请求、SSH、UDP 包、共享内存和文件互相通信。Viaweb 的一部分甚至是由“程序的缺席“构成的——因为 Unix 安全的关键之一就是不要跑那些没必要、可能被人利用来攻进你服务器的工具。
事情还不止于软件。我们花了大量时间琢磨服务器配置。我们自己用零件组装服务器——一部分是为了省钱,一部分是为了拿到我们想要的东西。我们得操心上游 ISP 是否对所有骨干网都有足够快的连接。我们一家接一家地“约会“过 RAID 厂商。
不过硬件不仅是要操心的事。当你能控制硬件,你就能为用户做更多。桌面应用可以指定最低硬件要求,但你没法给它再加东西。如果你管着服务器,那你只要装上对应的硬件,就能一步让所有用户拥有发寻呼、发传真、用电话发指令、刷信用卡等等能力。我们一直在找借助硬件加新功能的办法——不只是因为用户高兴,也是为了把自己跟那些(无论是因为做桌面软件,还是因为通过 ISP 转售 Web 应用而)对硬件没有直接控制权的对手区别开来。
因为 Web 应用的软件是一堆程序的集合而不是一个二进制文件,它可以用任意几种不同的语言写。当你写桌面软件时,你几乎被迫用跟底层操作系统一样的语言来写应用——也就是 C 和 C++。所以这两种语言(尤其在经理和 VC 这种非技术人群眼里)成了“严肃“软件开发该用的语言。但这只是桌面软件交付方式带来的副产物。对基于服务器的软件,你想用什么语言都行。[3] 今天很多顶尖黑客在用离 C 和 C++ 很远的语言:Perl、Python,甚至 Lisp。
用基于服务器的软件,没人能告诉你该用什么语言,因为整个系统都是你掌控的,一直到硬件层。不同语言擅长不同任务。每件事你都可以挑最合适的那门来用。而且当你有竞争对手时,“你可以“就等于“你必须”(这一点我们后面还会回来讲),因为如果你不利用这种可能性,你的对手会。
我们的对手大多用 C 和 C++,这让他们的软件看起来明显逊色——比如说,他们没法绕开 CGI 脚本的无状态性。如果你想改点什么,所有改动都得在一个页面上完成,底下挂一个“更新“按钮。我之前在别处写过,靠着用 Lisp(很多人至今仍认为这是一门“研究语言“),我们让 Viaweb 编辑器的行为更像桌面软件。
发布
这个新世界里最重要的变化之一,是发布的方式。在桌面软件行业,发布是巨大的创伤——整个公司咬牙憋足劲,一口气把一坨巨大的代码推出去。这个过程,以及最终的产物,都会让人很自然地想到某些不太雅的比喻。
用基于服务器的软件,你改代码几乎和给自己写一个程序一样。你以一连串增量改动来发布软件,而不是偶尔来一次大爆炸。一家典型的桌面软件公司一年可能发一两次。在 Viaweb 我们经常一天发三到五次。
切到这种新模式,你才会意识到软件开发被发布方式影响得有多深。桌面软件行业那些最讨厌的问题,多半都是因为发布的灾难性。
当你一年只发一个新版本,你会倾向于批发处理 bug。在发布日之前的某个时间,你拼出一个新版本——里面一半代码刚被撕掉重写,引入了无数新 bug。然后一队 QA 进场开始数 bug,程序员沿着清单往下修。一般情况下他们修不到清单尾,事实上没人确定那个尾在哪儿。这就像在池塘里捞碎砖头。你从来不真的知道软件内部在发生什么。最好的情况下你只能拿到某种统计意义上的“差不多对“。
用基于服务器的软件,大部分变更都很小、很增量。这本身就不太容易引入 bug。这也意味着你在发布前最该重点测的就是你最后改的那块。你对代码会有更扎实的把握。一般来说你确实知道里面在发生什么。你当然不会把源码全背下来,但你读源码的时候像飞行员扫仪表盘,而不是侦探试图破解什么谜团。
桌面软件培养出一种对 bug 的宿命论。你知道你发出去的东西里满是 bug,你甚至已经为此搭好了应对机制(比如补丁版本)。那再多几个 bug 又怎样?很快你就会发布你明知道是坏的整块功能。Apple 今年早些时候就这么干了。他们感到压力要发新版操作系统——发布日已经被推迟了四次——但其中一些软件(光盘和 DVD 支持)还没做好。怎么办?他们把没做完的部分剥掉,先把 OS 发出去,让用户以后再装。
用基于 Web 的软件,你永远不必在它能用之前就把它发出去,而你只要它能用就可以立刻发出去。
老江湖可能在想:说“软件不能用就不必发布“听上去很美,可一旦你已经承诺了某个日期发新版本怎么办?在 Web 软件这边,你不会做这种承诺,因为根本没有版本。你的软件是连续地、一点点地变。有些改动比另一些大,但“版本“这个概念跟基于 Web 的软件并不天然契合。
如果有人还记得 Viaweb,这听上去可能怪怪的,因为我们当时一直在宣布新版本。这纯粹是为了 PR。我们发现行业媒体是按版本号思考的。一个大版本(也就是版本号第一个数字翻新)他们会给你大篇幅报道,而点版本(小数点后那个数字翻新)通常最多给一段。
我们的一些对手做的是桌面软件,确实有版本号。仅仅因为他们有版本号——这本身在我们看来恰好是他们落后的证据——他们就能拿到各种各样的曝光。我们不想错过,所以我们也开始给软件打版本号。需要曝光的时候,我们就把上一次“发布“以来加的功能列个清单,往软件上贴一个新版本号,发一份新闻稿宣布新版本即日可用。神奇的是,从来没人识破过我们。
到我们被收购的时候,我们已经这么干了三次,所以是版本 4。如果我没记错,是 4.1。Viaweb 变成 Yahoo Store 之后,没那么饥渴地需要曝光了,所以软件继续在演进,但版本号这套东西就被悄悄丢掉了。
bug
基于 Web 的软件的另一个重大技术优势是,大多数 bug 你都能复现。用户的数据就在你硬盘上摆着。如果有人把你的软件搞挂了,你不必像桌面软件那样靠猜来推断发生了什么——他还在跟你打着电话呢,你应该就能复现这个错误。如果你应用里内置了发现错误的代码,可能你自己已经先知道了。
基于 Web 的软件全天候被使用,所以你做的每件事都立刻被丢进绞肉机。bug 很快就冒出来。
软件公司有时被指责“让用户给你 debug“。我主张的恰好就是这个。对 Web 软件而言这其实是个好计划,因为 bug 又少又转瞬即逝。当你以渐进方式发布软件,一开始 bug 就少。当你能复现错误并瞬间发布修复,大多数 bug 一出现你就能找到并修掉。我们任何时候的 bug 数都不够多,多到值得搞一套正经的 bug 跟踪系统。
你当然该在发布前测一下改动,这样大 bug 就不会被发出去。那些不可避免漏出去的,会涉及边界情况,并且只影响在有人打电话来抱怨之前撞上它的那少数用户。只要你立刻把 bug 修掉,对一般用户来说净效果就是 bug 少得多。我怀疑普通 Viaweb 用户根本没见过 bug。
修新 bug 比修老 bug 容易。在你刚写的代码里找 bug 通常很快。bug 一冒出来,你常常没看源码就已经知道哪里出了错,因为你下意识里其实早就在担心了。修一个你六个月前写的东西里的 bug(一年发一次的情况下平均就是这样)要费力得多。再加上你对那段代码不那么熟,你更容易用难看的方式去补,甚至引入更多 bug。[4]
早点抓到 bug,你也会有更少的复合 bug。复合 bug 是两个独立的 bug 互相作用:你下楼时绊了一下,伸手抓栏杆,结果栏杆在你手里整根掉下来。在软件里,这种 bug 最难找,往往后果也最糟。[5] 传统的“全打烂再过滤 bug“路数天然就会产出很多复合 bug。而以一连串小改动发布的软件天然就不会。地板被持续地清扫干净,那些以后可能卡进什么东西里的零碎物件根本没机会留下来。
如果你用一种叫函数式编程的技术会更有帮助。函数式编程的意思是避免副作用。这玩意儿你在研究论文里见到的概率比在商业软件里高,但对 Web 应用来说,事实证明它真的很有用。要把整个程序写成纯函数式的代码很难,但你可以用这种方式写大块大块的部分。这让你软件里那部分更容易测试,因为它们没有状态——这一点在你不停做小改动并测试的场景下非常方便。Viaweb 编辑器我大半就是用这种风格写的,我们的脚本语言 RTML 是一门纯函数式语言。
桌面软件圈子里的人会觉得难以置信,但在 Viaweb,bug 几乎成了一种游戏。既然发布出去的 bug 多半涉及边界情况,撞上它们的用户多半是高级用户、在拼命压榨产品。高级用户对 bug 更宽容,尤其因为这些 bug 多半是你在加他们要的某项功能时引入的。事实上,因为 bug 既稀有、又得做点高级操作才能见到,高级用户经常会以抓到一个 bug 为荣。他们打电话来报 bug 时的语气是凯旋多于愤怒,好像他们刚得了我们一分。
客服
当你能复现错误,你对客服的态度会变。在大多数软件公司,客服的存在是为了让客户感觉好一点。要么客户为一个已知 bug 来电,要么他们就是在做错事,你得搞清楚是哪一种。无论哪种你都从他们那里学不到太多东西。所以你倾向于把客服电话当成屁股上的疼痛,越远离开发越好。
Viaweb 不是这样。在 Viaweb,客服是免费的,因为我们想听到客户的声音。如果某人遇到问题,我们想立刻知道,这样我们就能复现错误并发出修复。
所以在 Viaweb,开发者一直跟客服紧密接触。客服跟程序员距离大概九米左右,他们知道但凡来了一个真正的 bug 报告,自己可以打断任何事。一个严重的 bug 我们会从董事会会议里出来去修。
我们这种客服路数让所有人都更高兴。客户开心了——你想想看,打去客服电话却被当成“带来重要消息的人“对待,那是什么感觉。客服开心了,因为这意味着他们能帮到用户,而不是对用户念脚本。程序员也开心了,因为他们能复现 bug,而不是听一些模糊的二手报告。
我们当场就修 bug 的政策,改变了客服跟黑客之间的关系。在大多数软件公司,客服是工资低廉的人肉盾牌,黑客则是天父的小复制品,是世界的创造者。无论报 bug 的流程是什么,多半是单向的:客服听到 bug 后填一个表,这个表(或许过 QA 一道手)最终递到程序员那里,程序员把它放进自己的 todo。Viaweb 里不一样。从客户那儿听到一个 bug 一分钟后,客服可能就站在某个程序员旁边,听到他说:“操,你说得对,是个 bug。“听到黑客说“你说得对”,客服那叫一个开心。他们带 bug 来给我们的姿态,就像猫叼着刚咬死的老鼠满怀期待地献给你。这也让他们在判断 bug 严重性时更小心,因为现在面子都押在上面了。
被 Yahoo 收购后,客服被搬到离程序员很远的地方。直到那时我们才意识到,他们其实就是 QA,并且某种程度上还是市场。除了抓 bug,他们还是各种更模糊、更“类 bug“的东西的看守人,比如让用户犯迷糊的那些功能。[6] 他们也是某种代理焦点小组——我们可以问他们,两个新功能用户更想要哪个,他们的判断每次都对。
士气
能立刻发布软件是巨大的动力。我经常走着上班路上想到一个想改的地方,那天就把它做了。这对更大的功能也成立。哪怕一件事要写两周(很少有项目超过两周),我都知道一旦写完我立刻能在软件里看到效果。
如果非要等一年到下一次发布,我大多数想法都会被搁到架子上,至少先放一阵。但想法这东西,会带出更多想法。你有没有注意到,你坐下来写一个东西的时候,里面有一半的想法是你写的过程中想到的?软件也一样。为了实现一个想法去工作,会催生更多想法。所以把一个想法搁到架子上,你失去的不只是它本身被推迟实现的代价,还有它本来会带出的所有别的想法。事实上,把一个想法搁到架子上,可能还会抑制新想法的诞生:当你刚开始想一个新功能,眼角扫到那个架子,就会想“可是我下一个发布要做的新东西已经够多了“。
大公司不去实现功能,而是去“规划“功能。在 Viaweb 我们偶尔为这事栽跟头。投资人和分析师会问我们未来的计划是什么。诚实的答案是:我们没什么计划。我们有一些大方向上的“我们想改进的东西“的想法,但要是我们真知道怎么做,我们早就做了。接下来六个月做什么?看起来收益最大的那件事。我不知道我有没有真敢这么回答过,但事实就是如此。计划只是“搁在架子上的想法“的另一个说法。我们想到好点子,就把它实现掉。
在 Viaweb,跟很多软件公司一样,大多数代码有一个明确的主人。但当你拥有某段代码,你是真的拥有它:除了这段代码的主人,没人需要批准(甚至不必知道)一次发布。除了“在同事面前看起来像个白痴“的那种恐惧之外,没有任何防破坏机制——而那种恐惧已经绰绰有余了。我可能让你觉得我们就是嘻嘻哈哈一路往前砸代码。我们速度确实快,但在把软件推到那些服务器之前,我们想得非常仔细。在可靠性上,注意力比慢动作重要得多。一个海军飞行员之所以能在夜里把一架四万磅的飞机以每小时 140 英里的速度安全降落在一艘起伏的航母甲板上——比一个普通青少年切贝果更安全——靠的就是高度的注意力。
当然,这种写软件的方式是双刃剑。它对一个由信得过的好程序员组成的小团队比对一家中庸者组成的大公司管用得多。在大公司里,坏点子要靠委员会拦住,而不是靠想出这些点子的人本人拦住。
Brooks 反过来
幸好,基于 Web 的软件确实需要的程序员更少。我曾在一家中等规模的桌面软件公司干过,整个工程部门有 100 多人。其中只有 13 人在做产品开发。其他人都在搞发布、移植之类的事。用基于 Web 的软件,你(最多)只要那 13 个人,因为没有发布、没有移植这些事。
Viaweb 整个软件就是三个人写出来的。[7] 我一直被催着多招人,因为我们想被收购,而我们知道买家很难为一家只有三个程序员的公司付出高价。(解决办法:我们多招了人,但给他们造了新项目去做。)
当你能用更少的程序员写软件,你省下的不只是钱。Fred Brooks 在《人月神话》里指出,往项目里加人往往会让它变慢。开发者之间可能的连接数,随着团队规模指数级增长。团队越大,他们花在开会协商各自代码怎么对接的时间越多,由没预料到的相互作用引发的 bug 也越多。幸运的是,这个过程反过来也成立:团队越小,软件开发的效率指数级地变高。我记不起来 Viaweb 的程序员们开过哪怕一次正式的会。我们任何一时刻要说的话,都没多到走去吃午饭那点时间装不下。
如果说有什么坏处,那就是所有程序员多少都得兼任系统管理员。当你在托管软件,必须有人盯着服务器,而实践中真正能盯好的人,只能是写这套软件的人。在 Viaweb,我们的系统组件多、变化又频繁,软件和基础设施之间根本没有明确边界。硬画一条边界会限制我们的设计选择。所以尽管我们一直盼望着某一天(“再过几个月”)一切都稳定到我们能招个专门只看服务器的人,这一天从未到来。
我觉得也只能这样——只要你还在主动开发产品。基于 Web 的软件永远不会变成那种你写完、签入、然后回家就完事的东西。它是个活物,此刻正跑在你的服务器上。一个糟糕的 bug 不会只让一个用户的进程崩掉,它可能让所有人的都崩。如果你的代码里一个 bug 把磁盘上的某些数据搞坏了,你必须修。诸如此类。我们发现你不必每分钟都盯着服务器(前一年左右之后就不必了),但你绝对会想紧盯你最近改过的东西。你不会半夜发布完代码就回家。
观察用户
用基于服务器的软件,你跟代码挨得更近。你也能跟用户挨得更近。Intuit 有个出名的做法:在零售店里跟客户搭话,请求跟着他们回家。要是你曾经看过别人第一次用你的软件,你就知道当时一定有多少惊讶在等着他们。
软件应该做用户以为它会做的事。但你不可能知道用户会怎么想,相信我,除非你看着他们用。基于服务器的软件给了你前所未有的关于用户行为的信息。你不再被困在小小的、人造的焦点小组里。每一个用户的每一次点击你都看得见。你必须想清楚自己要看什么,因为不能侵犯用户隐私,但即便是最一般的统计抽样也会非常有用。
当用户在你的服务器上时,你不必依赖 benchmark。benchmark 是模拟出来的用户。用基于服务器的软件,你能看真实的用户。要决定优化什么,登录到一台服务器,看看是什么在吃 CPU 就行。你也知道什么时候该停止优化:我们最终把 Viaweb 编辑器调到了内存受限而非 CPU 受限的程度,既然我们对减小用户数据的体积无能为力(嗯,没什么轻松办法),那我们大可就停在这儿。
效率对基于服务器的软件很重要,因为硬件是你掏钱买的。每台服务器能撑的用户数是你资本成本的分母——所以如果你的软件足够高效,你可以比对手卖得更便宜还能赚钱。在 Viaweb 我们把每个用户的资本成本压到大约 5 美元。现在应该更低,可能比寄给他们第一个月账单的成本还低。如果你的软件还算高效,硬件已经免费了。
观察用户也能在设计上指导你,不只是优化。Viaweb 有一门叫 RTML 的脚本语言,让高级用户自定义页面样式。我们发现 RTML 变成了某种意见箱——用户只在预设页面样式做不到他们想要的事情时才用它。比如最初编辑器把按钮栏放在页面顶部,但当一批用户用 RTML 把按钮放到左边之后,我们就把那个改成了预设页面样式里的一个选项(事实上是默认选项)。
最后,通过观察用户你常常能看出他们什么时候卡住了。既然客户永远是对的,那这就是某个你需要修的地方的信号。在 Viaweb,拿下用户的关键是在线试用版。它不是一组营销人员搭出来的幻灯片。在我们的试用里,用户真的在用软件。大约五分钟,用完以后他们已经搭出了一家真的、能跑的店。
这个试用是我们获得几乎所有新用户的方式。我想对大多数 Web 应用都会是这样。如果用户能成功跑完试用,他们就会喜欢这个产品。如果他们犯迷糊或者觉得无聊,他们就不会喜欢。所以我们能做的任何让更多人跑通试用的事,都会提高我们的增长率。
我研究过试用过程中的点击轨迹,发现某一步用户会犯迷糊,去点浏览器的“返回“按钮。(如果你写过 Web 应用,你会发现“返回“按钮会变成你最有意思的哲学问题之一。)所以我在那一步加了一条提示,告诉用户他们快好了,并提醒他们不要点返回键。Web 软件还有一个棒的地方是改动有即时反馈:跑完试用的人比例立刻从 60% 上到 90%。既然新用户数是跑完试用人数的函数,光这一处改动就让我们的收入增长率提高了 50%。
钱
1990 年代初,我读到一篇文章,里面有人说软件是订阅生意。一开始这话听起来很玩世不恭。但后来我意识到,它反映的是现实:软件开发是一个持续的过程。我觉得明明白白收订阅费,比逼着用户不断买、不断装新版本来持续给你掏钱,要干净得多。幸运的是,订阅恰好是给 Web 应用计费的天然方式。
托管应用是一片不太可能由 freeware 来填的地。托管应用压力很大,有真金白银的开销。没人愿意免费干这个。
对公司而言,Web 应用是理想的收入来源。每个季度不再从一张白纸开始,你有一条经常性收入流。因为你的软件是渐进演进的,你不必担心新型号会扑街——根本不存在所谓“新型号“,而且要是你对软件做了什么用户讨厌的事,你立刻就会知道。坏账完全不是问题——某人不付钱,把服务关了就行。也不存在盗版的可能性。
最后那条“优势“可能恰好会成为问题。一定量的盗版对软件公司其实是有利的。如果某个用户无论什么价格都不会买你的软件,他用了盗版你也没失去什么。事实上你还赚了,因为他多算一个用户在帮你把软件变成标准——或者他高中毕业之后说不定哪天会买一份。
公司只要能做就喜欢做一种叫“价格歧视“的事,意思是按每个客户能付的最高金额来收钱。[8] 软件特别适合做价格歧视,因为它的边际成本接近零。这也是为什么有的软件在 Sun 上跑比在 Intel 机器上跑要更贵:用 Sun 的公司不在乎省钱,可以放心地多收。盗版相当于价格歧视的最低一档。我觉得软件公司明白这点,对某些类型的盗版故意睁一只眼闭一只眼。[9] 用基于服务器的软件,他们就得另想办法了。
基于 Web 的软件卖得好,特别是和桌面软件比,因为它好买。你可能以为人们先决定要买,再去买,是两步分开的。在做 Viaweb 之前,我若曾想过这个问题,也是这么想的。但事实上第二步会反过来传到第一步:如果某样东西难买,人们会改变主意觉得自己其实也不那么想要。反过来也成立:东西好买你就卖得多。我多买书是因为有 Amazon。基于 Web 的软件大概是这世上最好买的东西,尤其当你刚做完一个在线 demo 时。用户除了输入一个信用卡号,不该被要求做更多。(让他们做更多就是自找苦吃。)
有时基于 Web 的软件会通过 ISP 转售。这是个馊主意。你必须自己管服务器,因为你要不断升级硬件和软件。一旦你放弃对服务器的直接控制权,就放弃了开发 Web 应用大部分的好处。
我们的几个对手就这样自己崩了脚——通常我猜是因为他们被一群西装革履的人占领了,那些人为这个所谓的巨大渠道兴奋不已,没意识到这条渠道会毁掉他们想通过它卖出去的产品。通过 ISP 卖 Web 软件就像通过自动售货机卖寿司。
客户
客户会是谁?在 Viaweb 一开始是个人和较小的公司,我觉得这会是 Web 应用的常态。这些用户准备好尝试新东西,一部分是因为他们更灵活,一部分是因为他们想要新技术带来的更低成本。
Web 应用对大公司常常也会是最佳选择(尽管他们意识到这点会很慢)。最好的内网就是互联网。如果一家公司用真正的 Web 应用,软件会跑得更好,服务器会被管得更好,员工从任何地方都能访问系统。
反对这种做法的论证一般都落到安全上:如果员工访问更容易,坏人也更容易。一些较大的商家不太愿意用 Viaweb,因为他们觉得客户的信用卡信息放在自家服务器上更安全。这件事不太好婉转地说出口,但事实上数据放在我们手里几乎肯定比在他们手里更安全。谁能雇到更好的人来管安全——一家整个生意就是跑服务器的科技创业公司,还是一家服装零售商?我们不仅有更好的人在操心安全,我们也比他们更操心这件事。如果有人攻进了那家服装零售商的服务器,最多影响一家商户,多半还能压下去,最坏情况炒掉一个人。如果有人攻进我们的,可能影响成千上万家商户,多半会上 CNet 的头条,可能会让我们关门。
如果你想保住自己的钱,是把它塞在家里床垫底下,还是放进银行?这个论证适用于服务器管理的方方面面:不只是安全,还有正常运行时间、带宽、负载管理、备份等等。我们的存在系于把这些事做对。服务器问题对我们是大忌,就像危险玩具对玩具厂、沙门氏菌爆发对食品加工厂一样。
一家用 Web 应用的大公司,相当于把 IT 外包了。这听起来挺激进,但我觉得通常是个好主意。这样他们能拿到的服务比内部系统管理员能给的更好。系统管理员之所以容易变得难搞、不响应,是因为他们没直接暴露在竞争压力下:销售要应付客户,开发要应付对手的软件,但系统管理员就像一个老光棍,能让他守规矩的外部力量很少。[10] 在 Viaweb,让我们守规矩的外部力量多得很。给我们打电话的是客户,不只是同事。一台服务器卡死了,我们立刻跳起来;几年过去了,光是想想都还能让我肾上腺素激增一下。
所以 Web 应用通常对大公司也会是正确答案。但他们会是最后意识到这点的,就像他们对桌面电脑那时一样。一部分原因是同样的:让大公司相信他们需要更贵的东西,能赚到很多钱。
有钱客户总是倾向于买昂贵的方案,哪怕便宜的方案更好——因为提供昂贵方案的人能花更多钱来卖给他们。在 Viaweb 我们一直在跟这个抗。我们丢过几个高端商户给那些 Web 咨询公司,那些公司说服商户花五十万美元在自己的服务器上做一个定制在线店会更好。事实上,他们一般并不更好——好几位在圣诞购物季服务器负载上来时就发现了这点。Viaweb 比这些商户最后拿到的东西要复杂得多,但我们没钱告诉他们这一点。一个月 300 美元,我们没钱派一队衣冠楚楚、口气权威的人去给客户做 presentation。
大公司多付的那一部分,相当大比例就是把贵东西卖给他们的成本。(如果国防部为一个马桶座圈付一千美元,部分原因是把马桶座圈卖到一千美元本身就要花很多钱。)这也是内网软件会继续兴旺的一个原因,尽管它大概是个馊主意。它就是更贵嘛。这个怪圈你拿它没办法,所以最佳的策略是先冲小客户。其他客户慢慢来。
服务器再起
软件跑在服务器上不是什么新鲜事。事实上这是老模式:大型机上的应用全是基于服务器的。如果基于服务器的软件这么好,那它上次怎么输了?桌面电脑当年是怎么把大型机干翻的?
最初桌面电脑看起来根本不是个威胁。最早的用户全是黑客——或者按那时的说法,业余爱好者。他们喜欢微机是因为便宜。第一次,你能拥有一台属于自己的电脑。“个人电脑“这个词组现在已经融进语言里了,但当它最初被使用时,听上去带着一种刻意的大胆,就像今天说“个人卫星“那种感觉。
桌面电脑为什么把对手干掉了?我觉得是因为它们的软件更好。而我觉得微机软件之所以更好,是因为它能由小公司来写。
我不觉得很多人意识到了创业公司在最早期有多脆弱、多试探。很多创业公司几乎是意外起步的——两三个人,要么有正职,要么还在上学,写一个原型,要是看上去靠谱就把它变成公司。在这个幼虫阶段,任何一点像样的障碍都能让创业公司原地僵死。写大型机软件需要预先投入太多。开发机器贵,又因为客户会是大公司,你得有一支看起来很神气的销售队伍才卖得动。开一家做大型机软件的创业公司,比晚上在你的 Apple II 上敲点东西出来要严肃多了。所以你看不到很多创业公司去写大型机应用。
桌面电脑的到来催生了大量新软件,因为为它们写应用对幼虫期创业公司来说是个够得着的目标。开发便宜,客户是个人,你能通过电脑商店甚至邮购触达他们。
把桌面电脑推进主流的那个应用是 VisiCalc,第一款电子表格。它是两个在阁楼上工作的家伙写的,但它能做大型机软件做不到的事。[11] 在那个年代,VisiCalc 是如此巨大的进步,以至于人们买 Apple II 就是为了跑它。这开启了一个趋势:桌面电脑赢,是因为创业公司为它写软件。
看起来这次基于服务器的软件也会很好,因为创业公司会写它。电脑现在便宜到你可以像我们当年一样,用一台桌面机当服务器起步。便宜的处理器吃掉了工作站市场(你现在几乎听不到“工作站“这个词了),并且差不多吃透了服务器市场;Yahoo 的服务器要扛全互联网最高级别的负载,用的全是跟你桌面机一样的便宜 Intel 处理器。一旦你把软件写出来,要卖它你只需要一个网站。我们几乎所有用户都通过口碑和媒体上的报道直接找到我们的网站。[12]
Viaweb 是一家典型的幼虫期创业公司。我们害怕真的开公司,前几个月里我们靠把整件事当成“随时可以喊停的实验“来安慰自己。幸运的是,除了技术问题之外几乎没什么障碍。我们写软件的时候,Web 服务器就是我们用来开发的同一台桌面机,靠拨号线连到外部世界。那个阶段我们的所有支出就是吃饭和房租。
现在创业公司去写 Web 软件的理由更充分了,因为写桌面软件已经变得很无趣。如今要写桌面软件,你得按 Microsoft 的规矩来,调他们的 API、绕开他们 bug 满满的操作系统。万一你写的东西真的火了,你可能会发现你只是在替 Microsoft 做市场调研。
如果一家公司想做一个让创业公司在它上面建东西的平台,他们必须把它做成黑客自己也愿意用的东西。这意味着它得便宜、设计好。Mac 刚出来时在黑客圈很受欢迎,很多黑客为它写软件。[13] 在 Windows 上你看到的就少多了,因为黑客不用它。会写软件的那种人现在大多在跑 Linux 或 FreeBSD。
我觉得我们当年不会去开一家做桌面软件的创业公司,因为桌面软件得跑在 Windows 上,而要给 Windows 写软件之前我们得先用它。Web 让我们能绕开 Windows,把跑在 Unix 上的软件直接通过浏览器送给用户。这是一种解放的前景,很像二十五年前 PC 到来的感觉。
微软
桌面电脑刚来时,IBM 是所有人都怕的那个巨人。今天很难想象,但我对当年的那种感觉记得很清楚。现在让人害怕的巨人是 Microsoft,我不觉得他们对自己面临的威胁像 IBM 当年那么瞎。毕竟,Microsoft 自己当年就是有意把生意建在 IBM 的盲区里的。
我前面说我母亲其实不需要桌面电脑。大多数用户大概都不需要。这对 Microsoft 是个问题,他们也知道。如果应用都跑在远端服务器上,没人需要 Windows。Microsoft 会怎么办?他们能用对桌面的控制力来阻止或限制这一代新软件吗?
我猜 Microsoft 会做某种“服务器/桌面“混合体,让操作系统跟他们控制的服务器一起工作。至少,对想要的人来说,文件会集中可用。我估计只要他们能避免,他们不会一路走到极端——把计算放在服务器上、客户端只剩一个浏览器。如果客户端只需要一个浏览器,你就不需要 Microsoft 在客户端,而如果 Microsoft 不控制客户端,他们就没法把用户推向他们自己基于服务器的应用。
我觉得 Microsoft 很难把这只精灵关回瓶里。客户端的种类会多到他们没法全部控制。如果 Microsoft 的应用只能跟某些客户端配合,竞争对手就能拿出“任何客户端都能用“的应用来反将一军。[14]
在一个由 Web 应用主宰的世界里,没有为 Microsoft 自动准备好的位置。他们可能会成功地为自己挣到一个位置,但我不觉得他们会像主宰桌面应用世界那样主宰这个新世界。
与其说会有竞争对手把他们绊倒,不如说是他们自己把自己绊倒。随着 Web 软件的兴起,他们要面对的不只是技术问题,还有自己的一厢情愿。他们需要做的事是把自己现有的生意吃掉,但我看不到他们能正视这一点。让他们走到今天的那种一根筋,现在会反过来对付他们。IBM 当年面对的就是一模一样的局面,他们没解开。IBM 进微机生意进得又晚又敷衍,因为他们对动自己的现金奶牛——大型机——这件事很矛盾。Microsoft 同样会被想保住桌面这件事拖住后腿。一头摇钱树有时是你背上他妈的一只很沉的猴子。
我不是说没人会主宰基于服务器的应用。可能最终会有。但我觉得在那之前会有相当长一段令人愉快的混乱期,就像微机早期那样。那是创业公司的好时光。一大堆小公司活得很好,靠的是做酷东西。
创业公司,更甚之
经典意义上的创业公司是快速、非正式、人少钱少。少数几个人非常努力地干,技术放大了他们决策的影响。一旦赢了,赢得很大。
在一家做 Web 应用的创业公司里,所有你跟“创业公司“挂钩的特征都被推向极端。你能用更少的人、更少的钱写出并发布一个产品。你必须更快,你也能在更非正式的状态下混得过去。你真的可以三个人坐在一间公寓的客厅里、靠一台托管在 ISP 那边的服务器,就把产品发出去。我们就是这么干的。
随着时间推移,团队变得更小、更快、更不正式。1960 年,软件开发意味着一屋子戴角质边眼镜、系着窄黑领带的男人,孜孜不倦地在 IBM 编码表上一天写十行代码。1980 年,是八到十个人组成的团队,穿牛仔裤进办公室、对着 vt100 终端敲键盘。现在是两三个人坐在客厅里、用笔记本电脑。(事实证明牛仔裤还不是非正式的极致。)
创业公司压力大,不幸的是,这一点在 Web 应用这边也被推向极端。很多软件公司,尤其在初期,会有一段开发者睡在桌底下之类的日子。Web 软件让人警觉的是,没有任何东西能阻止“睡在桌底下“成为常态。睡在桌底下的故事通常这么结束:然后我们终于把它发出去了,所有人回家睡了一周。Web 软件永远不“发出去“。你愿意一天工作 16 小时,可以一直工作下去。而既然你能、你的对手也能,你就倾向于被迫这么做。你能,所以你必须。这是反过来运行的帕金森定律。
最糟的不是工时,而是责任。程序员和系统管理员传统上各自有各自的烦恼。程序员要操心 bug,系统管理员要操心基础设施。程序员可以一整天满手都是源代码,但到某个点他们能回家把它忘掉。系统管理员从不真正“下班“,但当他们凌晨四点被呼叫,通常也不必做太复杂的事。在 Web 应用这边,这两种压力被合到了一起。程序员变成了系统管理员,但没有那种通常让这份工作还能忍的、明确划定的边界。
在 Viaweb,我们头六个月就只是在写软件。那段日子像普通早期创业公司一样工时很长。在一家桌面软件公司,那本来就该算我们已经在拼命的阶段,但跟下一个阶段——把用户接到我们服务器上——比起来,简直像在度假。把 Viaweb 卖给 Yahoo 的第二大好处(仅次于钱),就是能把整件事的最终责任倒到一家大公司的肩上。
桌面软件强迫用户当系统管理员。Web 软件强迫程序员当系统管理员。总压力少了,但程序员的多了。这未必是坏消息。如果你是一家跟大公司竞争的创业公司,这反倒是好消息。[15] Web 应用提供了一条直接的路:靠工作量压垮你的对手。创业公司不会要更多。
刚好够用
让你不愿写 Web 应用的一个原因可能是:作为 UI,Web 页面挺烂。这确实是个问题,我承认。我们当年也希望往 HTML 和 HTTP 里加几样东西。但要紧的是,Web 页面刚好够用。
这跟最早的微机有可比之处。那些机器里的处理器其实并没被设计来当电脑的 CPU。它们是被设计来用在交通灯之类的东西里的。但像 Ed Roberts 这种设计了 Altair 的人意识到,它们刚好够用。把这种芯片跟一些内存(最早的 Altair 是 256 字节)和一组前面板开关组合起来,你就有了一台能跑的电脑。能拥有一台属于自己的电脑这件事本身就足够激动人心,所以哪怕它有那么多限制,仍有大把人愿意买。
Web 页面没被设计来当应用的 UI,但它们刚好够用。对相当一部分用户而言,能从任意浏览器使用的软件本身就是足够大的胜利,足以盖过 UI 上的种种别扭。也许你没法用 HTML 写出最漂亮的电子表格,但你可以写出一个能让多人在不同地点、无需特殊客户端软件同时使用的电子表格,或者能整合实时数据流的电子表格,或者在某些条件被触发时呼叫你的电子表格。更重要的是,你可以写出连名字都还没有的新型应用。VisiCalc 毕竟不只是大型机应用的微机版——它是一种新型应用。
当然,基于服务器的应用不一定非得基于 Web。你可以有别的某种客户端。但我相当确信那是个馊主意。如果你能假设所有人都会装你的客户端,这会非常方便——方便到你很容易说服自己他们都会装——但要是他们没装,你就完了。因为基于 Web 的软件对客户端不做任何假设,它能在 Web 能跑的任何地方跑。这本身就是一个大优势,并且随着新的 Web 设备越来越多,这个优势会变大。用户喜欢你,因为你的软件就是能用;你的日子也更好过,因为你不必为每一种新客户端去调它。[16]
我觉得我对 Web 演化的关注程度不输任何人,但我没法预测客户端会发生什么。融合大概会到来,但收敛在哪里?我没法挑赢家。我能预测的一件事是 AOL 和 Microsoft 之间的冲突。无论 Microsoft 的 .NET 最后变成什么,多半都会涉及把桌面跟服务器连起来。除非 AOL 反击,他们要么被挤到一边,要么沦为 Microsoft 客户端和服务器软件之间的一根管子。要是 Microsoft 和 AOL 打起客户端大战,唯一保证两边都能用的就是浏览 Web,意思是 Web 应用会是唯一一种到处都能跑的应用。
最后会是什么样?我不知道。要是你押注 Web 应用,你也不必知道。没人能在不破坏浏览的前提下破坏它。Web 也许不是交付软件的唯一方式,但它是现在管用、并且会长时间继续管用的一种。Web 应用开发便宜,连最小的创业公司都做得到。它们工作量大,而且是一种特别折磨人的那类工作量,但这只会让创业公司的胜算更高。
为什么不呢?
E. B. White 听一位农民朋友说很多通电围栏其实根本没通电,觉得很有趣。牛显然学会了不去碰它们,于是后来根本不需要电。“起来吧,牛!“他写道,“趁暴君打鼾的时候,去拿你的自由!”
如果你是一个想过有朝一日开创业公司的黑客,可能有两件事在拦着你。一件是你对生意一无所知。另一件是你害怕竞争。这两道围栏里都没电。
关于做生意你只需要知道两件事:做用户喜爱的东西,挣的比花的多。把这两件做对,你就领先大多数创业公司了。其余的边走边搞清楚。
你一开始可能挣的没花的多,但只要这个差距收窄得足够快,就没问题。如果你起步资金不足,至少这能逼出节俭的习惯。花得越少,挣得比花得多就越容易。幸运的是,发布一个 Web 应用可以非常便宜。我们当年发布时花了不到一万美元,今天会更便宜。我们当年得花几千美元买服务器,再花几千美元搞 SSL(那时候唯一卖 SSL 软件的公司是 Netscape)。现在你能租一台强得多的服务器、还自带 SSL,价钱比我们当时光带宽费都低。你今天发布一个 Web 应用,花的钱比一把高级办公椅还少。
至于做用户喜爱的东西,给点一般性的建议。先做一个干净、简单、连你自己都想用的东西。尽快把 1.0 推出去,然后持续改进,过程中紧盯用户反馈。客户永远是对的,但不同客户在不同事情上是对的;最不老练的用户告诉你需要简化和澄清什么,最老练的告诉你需要加什么功能。软件最棒的事情就是好用,但通往这一点的路是把默认值做对,而不是限制用户的选择。你的对手软件烂,别得意;你比较的标准应该是软件本来能做到什么,而不是当前对手碰巧做到了什么。一直用你自己的软件。Viaweb 本来是一个在线建店工具,但我们也用它做我们自己的网站。不要光因为某人的头衔是营销、设计或产品经理就听他们的。如果他们有好点子,用它,但拍板的是你。软件必须由懂设计的黑客来设计,而不是由懂一点软件的设计师。如果你不能在设计软件上做得跟实现它一样好,那别开创业公司。
现在说说竞争。你怕的应该不是像你这样的几个黑客,而是真正的公司——有办公室、有商业计划、有销售员等等的那种,对吧?嗯,他们怕你比你怕他们更甚,而且他们这么怕是对的。两个黑客搞清楚怎么租办公室或者招销售员,比任意规模的一家公司搞清楚怎么把软件写出来要容易得多。两边我都待过,我知道。Viaweb 被 Yahoo 收购后,我突然发现自己在为一家大公司工作,那感觉就像试图在齐腰深的水里跑步。
我不是说 Yahoo 不好。他们有几个不错的黑客,最高层的管理者是真能踢屁股的人。作为一家大公司,他们已经算很出色了。但他们的生产率仍然只有一家小创业公司的十分之一左右。没有大公司能比这好太多。Microsoft 让人发怵的地方在于,一家这么大的公司居然还能开发软件。他们就像一座会走路的山。
别被吓倒。你能做到很多 Microsoft 做不到的事,正如他们能做到很多你做不到的。没人能拦住你。你不需要任何人的批准就能开发 Web 应用。你不必去做授权交易、不必去抢零售店的货架位、不必卑躬屈膝求人把你的应用跟 OS 捆绑。你能把软件直接送到浏览器上,没人能在你和潜在用户之间插一脚——除非他们不让人浏览 Web。
你可能不信,但我向你保证,Microsoft 怕你。那些自满的中层经理也许不怕,但 Bill 怕,因为他自己曾经就是你——1975 年,那是上一次出现交付软件的新方式。
注释
[1] 那些做轻量级客户端的公司意识到大头钱在服务里,通常会试图把硬件跟在线服务捆绑在一起。这种做法效果不太好,一部分原因是做消费电子和做在线服务需要两种不同的公司,另一部分原因是用户讨厌这个想法。送剃须刀、靠刀片赚钱也许对 Gillette 管用,但剃须刀的承诺成本比一个 Web 终端小得多。手机厂商满足于卖硬件而不去试图捕获服务收入。互联网客户端大概也该照这个模式。如果有人就这么卖一个外观漂亮、能通过任意 ISP 上网的小盒子,全国每一个技术恐惧症患者都会买一个。
[2] 安全永远更多取决于不出馊事,而不是任何设计决策;但基于服务器的软件的本性会让开发者更注意不出馊事。让一台服务器被攻破后果可能严重到——还想活下去的——ASP 多半会很小心对待安全。
[3] 1995 年我们做 Viaweb 时,Java applet 被认为是大家都将用来开发服务器端应用的技术。在我们看来 applet 是个老掉牙的主意。把程序下载到客户端去跑?还不如索性一路到底,把程序直接跑在服务器上。我们没在 applet 上浪费太多时间,但无数其他创业公司一定被这个泥潭引诱过。能活着爬出来的没几个,否则 Microsoft 不可能在最近一版的 Explorer 里把 Java 砍掉还安然无事。
[4] 这一条要归功于 Trevor Blackwell,他补充说:“写软件的成本随其规模上升的速度比线性更快。这或许主要是因为修旧 bug,所以如果所有 bug 都能被很快发现,这个成本曲线会更接近线性。”
[5] 最难找的 bug 也许是复合 bug 的一种变体:一个 bug 恰好弥补了另一个。当你修了其中一个,另一个就显现出来。但看上去像是这次的修补本身有问题,因为它是你最后改的东西。
[6] Viaweb 内部曾搞过一次比赛,让大家描述我们软件最糟的地方。两位客服并列第一,他们提交的内容我至今想起来还会发抖。两个问题我们都立刻修了。
[7] Robert Morris 写了下单系统,购物者用它下单。Trevor Blackwell 写了图像生成器和管理后台,商户用它来取订单、看统计、配置域名等等。我写了编辑器,商户用它搭自己的站点。下单系统和图像生成器用 C 和 C++ 写,管理后台主要用 Perl,编辑器用 Lisp。
[8] 价格歧视无所不在(你听过多少次零售商号称他们的采购量给你带来了更低价格?),所以当我发现它在 1936 年被罗宾逊-帕特曼法案在美国宣布违法时,相当意外。这条法律似乎并没被严格执行。
[9] 在《No Logo》里,Naomi Klein 说“都市青年“喜欢的服装品牌不会太用力防偷窃,因为在他们的目标市场里,偷窃者也是时尚领袖。
[10] 公司常常困惑:什么该外包、什么不该。一个可能的答案是:把任何不直接暴露在竞争压力下的工作外包出去,因为外包出去会让它暴露在竞争压力下。
[11] 那两个家伙是 Dan Bricklin 和 Bob Frankston。Dan 用 Basic 在几天里写了个原型,然后接下来一年里他俩(多半在晚上)合作做了一个用 6502 机器语言写的更强版本。Dan 当时在哈佛商学院,Bob 名义上有份白天写软件的工作。“做这件事没什么大风险,“Bob 写道,“失败就失败了。没什么大不了。”
[12] 没我说得那么轻松。让口碑跑起来花了痛苦的一段时间,而我们直到雇了一家 PR 公司(说真的,是这一行最好的那家),月费 16,000 美元,才开始拿到大量媒体报道。但唯一有意义的渠道确实是我们自己的网站,这一点是真的。
[13] 如果 Mac 那么好,它怎么输了?还是因为成本。Microsoft 专注于软件生意,并在 Apple 硬件上放出了一群廉价的零部件供应商。再加上在关键期间被一群西装革履的人接管,也帮了倒忙。
[14] 有一样东西能帮到 Web 应用、并能阻止下一代软件被 Microsoft 盖过——一个好的开源浏览器。Mozilla 是开源的,但似乎被它太久作为公司软件存在的历史拖累了。一个小、快、被持续维护的浏览器本身就是件大好事,并且大概也会鼓励公司去造小型 Web 终端。
此外,一个像样的开源浏览器会让 HTTP 和 HTML 继续演化(就像 Perl 一样)。一个小小的 HTTP 增强——允许一次请求里有多个 URL——就能极大帮到 Web 应用,让我们能把“选中一个链接“和“跟随它“区分开来。级联菜单也会很好。
如果你想改变世界,写一个新的 Mosaic。觉得太晚了?1998 年很多人觉得做新搜索引擎已经太晚,但 Google 证明他们错了。只要现有选择足够烂,新东西总有空间。先确保它能在所有免费 OS 上跑——新东西从它的用户开始。
[15] Trevor Blackwell——可能是从亲身经历中知道这事最多的人——写道:
“我会更进一步说:因为基于服务器的软件对程序员太狠了,它造成了一种从大公司转开的根本性经济转移。它要求程序员投入的强度和奉献,是他们只有在为自己的公司干活时才愿意拿出来的。软件公司能雇到熟练的人在不太苛刻的环境里干活,能雇到不熟练的人去硬熬,但他们雇不到高度熟练的人去玩命。既然资本不再被需要,大公司没什么能放上桌的。”
[16] 在本文最初的版本里,我建议避开 JavaScript。那在 2001 年是个好计划,但 JavaScript 现在能用了。Microsoft 可能开始去拥抱并扩展 JavaScript,或者像对待 Java 那样把它废掉。而当你开始能在手机或 PDA(或烤面包机)上浏览真正的 Web 页面时,谁知道它们会不会支持 JavaScript?
感谢 Sarah Harlin、Trevor Blackwell、Robert Morris、Eric Raymond、Ken Anderson 和 Dan Giffin 阅读本文草稿;感谢 Dan Bricklin 和 Bob Frankston 提供 VisiCalc 相关信息;并再次感谢 Ken Anderson 邀请我去 BBN 演讲。
本文与另外 14 篇文章一同收录于《黑客与画家》。