黑客与画家
保罗 · 格雷厄姆其人其事
位置 65
一开始,他们的软件完全采用传统模式,即用户首先下载安装,然后在自己的硬盘上做出网店的雏形,最后再上传到服务器。后来,格雷厄姆灵机一动:为什么不让用户通过浏览器直接操作服务器呢!这样就完全省去了安装和上传的步骤。于是,他们改变方向,决定把软件做成一个互联网程序。这是世界上第一个通过互联网使用的软件。
位置 73
八月初,他们做出了可以上线的Demo版。十月份,他们来到纽约,向两个天使投资人展示,希望能够筹集到5万美元。结果,两个投资人都表示愿意投资,于是他们就拿到了10万美元。十二月,Viaweb正式开始发展客户。1996年夏天,Viaweb得到了第二轮天使投资80万美元。他们用这笔钱雇了CEO和新程序员,还租了新办公室。
位置 79
1996年圣诞节,他们的客户总数达到了70家,其中包括著名摇滚杂志《滚石》。一年后,客户总数增长了5倍,公司看起来发展得很好。
位置 86
运营创业公司,每天都像在战斗;而为大公司工作,就像在窒息中挣扎。”于是,他选择了辞职。
位置 109
YC在每年的一月和六月举办两次训练营,每次为期三个月。通常每次大概有500个申请者,他们从中挑出20个项目④。每个项目将得到1.1万美元的启动资金,外加每个项目成员3000美元的生活津贴,交换条件是YC将拿走该项目5%的股份⑤。如果项目成功,5%的股份将非常值钱。
位置 123
到目前为止,从YC“毕业”的创业公司共有200多家,已经失败的公司不到20%,远低于90%的业内平均水平。这些YC学员成为新一代硅谷创业公司的主流,他们组成了一张不断壮大的关系网,有人把这些迅速崛起的硅谷新成员称为“YC匪帮”。
位置 135
商业方法: 保罗·格雷厄姆的创业哲学
保罗·格雷厄姆有一套完整的创业哲学,他的创业公式是:
- 搭建原型
- 上线运营(别管bug)
- 收集反馈
- 调整产品
- 成长壮大
首先,他鼓励创业公司快速发布产品,因为这样可以尽早知道一个创意是否可行。 其次,他认为一定要特别关注用户需要什么,这样才有办法将一个坏项目转变成好项目。 他说:“许多伟大的公司,一开始的时候做的都是与后来业务完全不同的事情。乔布斯创建苹果公司后的第一个计划是出售计算机零件,然后让用户自己组装,后来才变成开发苹果电脑。你需要倾听用户的声音,琢磨他们需要什么,然后就去做。”
位置 146
格雷厄姆认为,我们正在进入一个创业时代。未来的社会,创业可能成为一种常态,而替别人打工反而成了少见的事情。一方面,创业是最有效的创造财富的方法,对创始人、对投资者、对社会都是如此。“
位置 150
以前创业很昂贵,你不得不找到投资人才能创业。而现在,唯一的门槛就是勇气。”
译者序
位置 189
根据理查德·斯托尔曼的说法,黑客行为必须包含三个特点:好玩、高智商、探索精神。只有其行为同时满足这三个标准,才能被称为“黑客”。另一方面,它们也构成了黑客的价值观,黑客追求的就是这三种价值,而不是实用性或金钱。
位置 192
将黑客的价值观总结为六条“黑客伦理”(hackerethic),直到今天这几条伦理都被视为这方面的最佳论述。
- 使用计算机以及所有有助于了解这个世界本质的事物都不应受到任何限制。任何事情都应该亲手尝试。
- 信息应该全部免费。(All information should be free.)
- 不信任权威,提倡去中心化。(Mistrust Authority—Promote Decentralization.)
- 判断一名黑客的水平应该看他的技术能力,而不是看他的学历、年龄或地位等其他标准。
- 你可以用计算机创造美和艺术。(Youcancreateartandbeautyonacomputer.)
- 计算机使生活更美好。(Computerscanchangeyourlifeforthebetter.)
位置 212
“对于黑客来说,关着的门就是一种挑衅,而锁着的门则是一种侮辱。……黑客相信,只要有助于改进现状、探索未知,人们就应该被允许自由地使用各种工具和信息。
前言
位置 274
编程语言对程序员的思想有巨大的影响。你从他们写的软件中就可以看出来。旅游网站Orbitz成功打入了竞争激烈的网络订房订票市场。该市场原先被两大巨头主宰,一个是微软公司,另一个是拥有数十年电子预定服务经验的Sabre。Orbitz是怎么从它们手中抢到市场的?最主要的原因就是它使用了一种更好的编程语言。
1 为什么书呆子不受欢迎:他们的心思在别的地方
位置 355
书呆子不受欢迎的真正原因,是他们脑子里想着别的事情。他们的注意力都放在读书或者观察世界上面,而不是放在穿衣打扮、开晚会上面。他们就像头顶一杯水来踢足球,一边踢球,一边拼命保持不让水洒出来。
位置 389
同样,在任何社会等级制度中,那些对自己没自信的人就会通过虐待他们眼中的下等人来突显自己的身份。我已经意识到,正是因为这个原因,在美国社会中底层白人是对待黑人最残酷的群体。
位置 397
如果说其中还有一丝安慰,那就是书呆子不妨记住,这种虐待不是针对个人的。一群孩子成群结伙地欺负你,那并不是因为你做错了什么,而是因为这一伙人需要找一件事情一起干,这就好像一群人成群结伙地去打猎一样。他们实际上并不恨你,他们只是需要一个共同的目标。
位置 430
我认为,真实世界的关键并非在于它是由成年人组成的,而在于它的庞大规模使得你做的每件事都能产生真正意义上的效果。学校、监狱、上流社会的女士午餐会,都做不到这一点。这些场合的成员都好像关在封闭的泡沫之中,所作所为只对泡沫内部有影响,对外部没有影响。那么很自然地,这些场合就会产生野蛮的做法。因为它们不具备实际功能,所以也就无所谓采用的形式⑦。
位置 451
书呆子已经在思考的东西,正是真实世界看重的东西。他们与别人不一样,不把所有时间用来玩一种耗尽全力但又毫无意义的游戏。
位置 452
我们的感受,有点像一个被重新塞进中学的成年人。他不知道穿什么衣服,听什么音乐,用什么暗语。在别的孩子眼里,他就像一个彻头彻尾的外星人。不过,成年人很清楚不用在乎别人怎么想,我们就没有这种自信。
位置 463
至于学校,不过是这个虚假环境中关住牲口的围栏。表面上,学校的使命是教育儿童。事实上,学校的真正目的是把儿童都关在同一个地方,以便大人们白天可以腾出手来把事情做完。我对这一点没有意见,在一个高度工业化的社会,对孩子不加管束,让他们四处乱跑,无疑是一场灾难。 让我困扰的,不是把孩子关在监狱里,而是(a)不告诉他们这一点,(b)把这监狱的大部分交给犯人来管理。
位置 487
被其他小孩欺负只是问题的一部分。还有别的问题存在,甚至可能是更糟糕的问题。那就是我们没有得到真正的工作,没能发挥我们的才能。人类喜欢工作,在世界上大多数地方,你的工作就是你的身份证明。但是,我们那时做的所有事情根本就是无意义的,至少那时看来是这样。
位置 490
最好的情况下,那些事情也不过是遥远的将来我们可能从事的实际工作的练习。它所面向的目标是如此遥远,以至于当时我们都不知道自己练习这些到底是为了干什么。更常见的情况是,那些事情不过是一系列随意设置的绳圈,你被要求一个个跳过去。你在学习中遇到的文字都是专为考试而设计的,目的就是为了出题,而不是为了讲清楚问题。(南北战争的三个主要原因是……等到考试的时候,就会有一道题:请列出南北战争的三个主要原因。)
位置 495
过去的社会中,青少年扮演着一个更积极的角色。工业化时代到来前,青少年都是某种形式的学徒, 他们是成年人社会的低级成员。
2 黑客与画家:黑客也是创造者,与画家、建筑师、作家一样。
位置 651
现在,我意识到自己错了。黑客搞懂“计算理论”(theory of computation)的必要性,与画家搞懂颜料化学成分的必要性差不多大。一般来说,在理论上,你需要知道如何计算“时间复杂度”和“空间复杂度”(time and space complexity);如果你要写一个解析器,可能还需要知道状态机(state machine)的概念;除此以外,并不需要知道特别多的理论。这些可比画家必须记住的颜料成分少很多。
位置 658
编程高手的工作细节: 编程就是在调试
我喜欢直接坐在计算机前编程,而不是在纸上编程。更糟的是,我不是耐心地一步步写出整个程序,确保大体上是正确的,而是一股脑不管对错,先把代码堆上去,再慢慢修改。书上说,调试(debugging)是最后的步骤,用来纠正打字的错误和疏忽。可是我的工作方法看上去却像编程就是在调试。很长一段时间内我都为此事沮丧,就像小学里老师教我怎么拿铅笔,我却总是学不会的那种感觉。如果我那时看到其他创作领域,比如绘画或者建筑,我就会想到,自己的方法其实有一个正式的名称:打草稿。我现在认为,大学里教给我的编程方法都是错的。你把整个程序想清楚的时间点,应该是在编写代码的同时,而不是在编写代码之前,这与作家、画家和建筑师的做法完全一样。
位置 681
如果大学和实验室不允许黑客做他们想做的事情,那么适合黑客的地方可能就是企业。不幸的是,大多数企业也不允许黑客做他们想做的事情。大学和实验室强迫黑客成为科学家,企业强迫黑客成为工程师。
位置 692
大公司vs创业公司: 两者的对比
如果某一天你想要去赚大钱,那么记住上面这一点,因为这是创业公司能够成功的原因之一。大公司为了避免设计上的灾难,选择了减少设计结果的标准差。但是当你排斥差异的时候,你不仅将失败的可能性排除在外,也将获得高利润的可能性排除在外。这对大公司来说不是问题,因为生产特别优秀的产品不是它们的获胜手段。大公司只要做到不太烂,就能赢。所以,如果你的竞争优势是在软件设计方面,并且你的对手是一家大公司,它大到由一群产品经理来设计软件,那么你的对手将永远无法赶上你。不过说实话,这样的机会不容易找到。
位置 700
真正竞争软件设计的战场是新兴领域的市场,这里还没有人建立过防御工事。只要你能做出大胆的设计,由一个人或一批人同时负责设计和实现产品,你就能在这里战胜大公司。微软公司自己一开始就是这样走向成功的,苹果公司和惠普公司也是如此。我觉得几乎所有的创业公司都是这样取得成功的。
位置 703
开发优秀软件的方法之一就是自己创业。但是,这样做会遇到两个问题。一个是自己开公司的话,必须处理许许多多与开发软件完全无关的事情。我创立Viaweb的时候,如果有四分之一时间可以用于开发,就感到很幸运了。我在其他四分之三时间所做的事情,从单调乏味到惊悚恐怖,无所不包。我来说一个比较,有一次董事会开到一半,我不得不离开去补牙。我记得坐在牙医诊所的椅子上,等着医生开动牙钻的那段时间,与刚才待在公司的时间相比,简直感觉像是在度假一样。创业的另一个问题是赚钱的软件往往不是好玩的软件,两者的重叠度不高。设计编程语言是很好玩的事情,事实上,微软的第一个产品就是一种编程语言⑥。但是,如今没有人会出钱买编程语言。如果你想赚钱,你可能不得不去干那些很麻烦很讨厌的事情,因为这些事情没人愿意义务来干。
位置 715
关于工作和爱好: 黑客如何才能做自己喜欢的事情?
黑客如何才能做自己喜欢的事情?我认为这个问题的解决方法是一个几乎所有创作者都知道的方法:找一份养家糊口的“白天工作”(day job)。这个词是从音乐家身上来的,他们晚上表演音乐,所以白天可以找一份其他工作。更一般地说,“白天工作”的意思是,你有一份为了赚钱的工作,还有一份为了爱好的工作。
当我说,黑客解决生计问题的方法是找一份“白天工作”,然后在其余时间开发优美的软件,我并没有说这是一个新方法。开源软件界的黑客早就这样做了。我想说的其实是,开源软件的这种工作模式可能就是正确的模式,因为它已经被其他领域的创作者都验证过了。
我们面试程序员的时候,主要关注的事情就是业余时间他们写了什么软件。因为如果你不爱一件事,你不可能把它做得真正优秀,要是你很热爱编程,你就不可避免地会开发你自己的项目。
位置 734
黑客和画家的共同点: 都是创作者
因为黑客更像创作者,而不是科学家,所以要了解黑客,不应该在科学家身上寻找启示,而是应该观察其他类型的创作者。那么,从画家身上,我们还能借鉴到什么对黑客的启示呢?
绘画的这个创作过程就值得学习。我认为黑客也应该这样工作。你不能盼望先有一个完美的规格设计,然后再动手编程,这样想是不现实的。如果你预先承认规格设计是不完美的,在编程的时候,就可以根据需要当场修改规格,最终会有一个更好的结果。
位置 810
我认为,这也是多人共同开发一个软件的正确模式。需要合作,但是不要“合”得过头。如果一个代码块由三四个人共同开发,就没有人真正“拥有”这块代码。最终,它就会变得像一个公用杂物间,没人管理,又脏又乱,到处堆满了冗余代码。正确的合作方法是将项目分割成严格定义的模块,每一个模块由一个人明确负责。模块与模块之间的接口经过精心设计,如果可能的话,最好把文档说明写得像编程语言规范那样清晰。
位置 835
用户第一次使用你的软件的时候,不会预先做好功课,他们没有任何准备就开始用了,所以软件的使用方式最好能符合用户的直觉,别指望用户去读使用手册。在这方面,我见过的最佳系统是1984年原始的Macintosh电脑。它做到了那时别的软件都做不到的事情:它真的能用。
位置 842
程序写出来是给人看的,附带能在机器上运行。
3 不能说的话:如果你的想法是社会无法容忍的,你怎么办?
位置 875
但真正令人惊恐的是,流行一时的不仅有衣服,还有道德观念。明明是专横武断、毫无依据的错误观点,但是大多数人却深信不疑,受到影响而不自知。这是非常危险的。流行的衣服,其实是很难看的衣服;流行的道德观念,其实不是善而是恶。但是,如果别人都穿流行的衣服,而你不穿,你就会遭到嘲讽;如果别人都遵守流行的道德观念,而你不遵守,结果则要严重得多,你会被解雇、流放、监禁,甚至被杀。
位置 1014
就本文而言,这样做会产生一个重要结果,那就是孩子“被迫”在一个精心设计的环境中长大。他的头脑或多或少是纯洁无暇的,一点也不知道那些“不能说的话”,从来没有被真实的社会生活“污染”过。孩子眼里的世界是不真实的,是一个被灌输进他们头脑的假想世界。将来当孩子长大以后接触社会,就会发现小时候以为真实的事情,在现实世界中是荒唐可笑的。
位置 1105
公司管理: 公司健康运作的关键是自我批评精神
其实,一个公司是否健康运作,可以用一个指标衡量,那就是对负面评价的容忍程度。做出伟大产品的公司,自我评价往往以“批评”和“自嘲”为主,而不是以“肯定”和“表扬”为主。我认识的杰出成就人士都认为自己做得不好,之所以能成功只是因为其他人做得更差。
位置 1108
训练自己去想那些不能想的事情,你获得的好处会超过所得到的想法本身。这就像田径比赛之前要做一些伸展运动,把肢体活动开。你要把身体伸展到极限,远超过跑步所需要的那种程度,这样一来,比赛的时候才能跑得更快。同样,如果你能“远远地”跳出传统思维,提出让别人一听就脑袋轰一声炸开的惊人观点,那么你就在“小小地”跳出传统思维方面不会有任何困难。要知道,人们把后面的这种情况称为“创新”。
位置 1118
这时你要明白,自由思考比畅所欲言更重要。如果你感到一定要跟那些人辩个明白,绝不咽下这口气,一定要把话说清楚,结果很可能是从此你再也无法自由理性地思考了。我认为这样做不可取,更好的方法是在思想和言论之间划一条明确的界线。在心里无所不想,但是不一定要说出来。我就鼓励自己在心里默默思考那些最无法无天的想法。
位置 1150
不过,更好的回答是“我还没想好”。哈佛大学校长拉里·撒墨尔斯(LarrySummers)被逼表态时,就是这样说的。他后来解释说:“别想在我身上做石蕊试验。”人们喜欢讨论的许多问题实际上都是很复杂的,马上说出你的想法对你并没有什么好处。
位置 1194
如果你的数学不好,那么你自己会知道,因为考试的时候你得不出正确答案。但是,如果你的思想很保守,你自己不会知道,而且你很可能还会持有相反的看法。
位置 1215
如果你想要清晰地思考,就必须远离人群。但是走得越远,你的处境就会越困难,受到的阻力也会越大,因为你没有迎合社会习俗,而是一步步地与它背道而驰。小时候,每个人都会鼓励你不断成长,变成一个心智成熟、不再耍小孩子脾气的人。但是,很少有人鼓励你继续成长,变成一个怀疑和抵制社会错误潮流的人。如果自己就是潮水的一部分,怎么能看见潮流的方向呢?你只能永远保持质疑。问自己,什么话是我不能说的?为什么?
为什么要找不能说的话
- 首先,我这样做与小孩子翻石头是出于同样的原因:纯粹的好奇心。我对任何被禁止的东西都有特别强烈的好奇心。我要亲眼看一下,然后自己做决定。
- 其次,我这样做是因为我不喜欢犯错。如果像其他时代一样,那些我们自以为正确的事情将来会被证明是荒谬可笑的,我希望自己能够知道是哪些事情,这样可以使我不会上当.
- 再次,我这样做,是因为这是很好的脑力训练。想要做出优秀作品,你需要一个什么问题都能思考的大脑。尤其是那些似乎不应该思考的问题,你的大脑也要养成思考它们的习惯。 训练自己去想那些不能想的事情,你获得的好处会超过所得到的想法本身。这就像田径比赛之前要做一些伸展运动,把肢体活动开。你要把身体伸展到极限,远超过跑步所需要的那种程度,这样一来,比赛的时候才能跑得更快。同样,如果你能“远远地”跳出传统思维,提出让别人一听就脑袋轰一声炸开的惊人观点,那么你就在“小小地”跳出传统思维方面不会有任何困难。要知道,人们把后面的这种情况称为“创新”。
如何找不能说的话
- 首先,我们可以看看,周围的人因为说了什么而陷入麻烦。 只有同时满足两个条件才行。第一个条件是,这些话不能说出口;第二个条件是,它们是正确的,或者看起来很可能正确
- 我们把这种不一定正确、但是极富争议的言论称为“异端邪说”。关注“异端邪说”,是找出“不能说的话”的第二种方法。
- 我们可以去找那些过去被认为理所当然,如今却被认为不可思议的事情,这是用来找出我们自己正在犯下的错误的第三种方法。 将当代观念与不同时期的古代观念diff一下。diff得到的结果,有一些用当代标准衡量是很令人震惊的。古人认为可以说的话,我们认为是不可以说的。但是,你有把握断言你比古人更正确吗?
- 还有第四种寻找“不能说的话”的方法:寻找那些一本正经的卫道者,看看他们到底在捍卫着什么。 就本文而言,这样做会产生一个重要结果,那就是孩子“被迫”在一个精心设计的环境中长大。他的头脑或多或少是纯洁无暇的,一点也不知道那些“不能说的话”,从来没有被真实的社会生活“污染”过。孩子眼里的世界是不真实的,是一个被灌输进他们头脑的假想世界。将来当孩子长大以后接触社会,就会发现小时候以为真实的事情,在现实世界中是荒唐可笑的。
- 我还想到了第五种方法,可以找出“不能说的话”,那就是去观察禁忌是如何产生的。 某种道德观念到底是怎么出现的,又是怎么被其他人接受的?如果我们能够理解它的产生机制,可能就可以应用于我们自己的时代。
4 良好的坏习惯:与其他美国人一样,黑客的成功秘诀就是打破常规。
位置 1221
对于程序员来说,“黑客”这个词的字面意思主要就是“精通”,也就是他可以随心所欲地支配计算机。
位置 1227
信不信由你,“黑”的这两个意思也是相关的。丑陋的做法与聪明的做法存在一个共同点,那就是都不符合常规。
位置 1252
不过,有些人的这种态度不是真的,而是装出来的。某些年轻程序员注意到了知名黑客的怪癖,就会模仿,好使自己显得更聪明。这种装出来的不服从再加上故作姿态挑毛病的态度,不仅仅令人恼火,而且实际上会延缓创新的进程。
位置 1287
为什么程序员如此激烈地反对这样的法律?如果我是立法者,肯定对这种神秘现象有兴趣。这就好比如果我是一个农夫,半夜突然听到鸡舍有动静,肯定会去看个究竟。黑客都是聪明人,很少出现所有人意见一致的情况。如果他们都说有问题,那么也许真的就是什么地方出了问题。
位置 1308
Michael Rabin⑨遇到难题的时候,会把问题重新定义成一个较简单的形式,同时一定会假想一个对手正在与他比赛谁能更快地解决问题。
位置 1319
在我看来,一个人们拥有言论自由和行动自由的社会,往往最有可能采纳最优方案,而不是采纳最有权势的人提出的方案。专制国家会变成腐败国家,腐败国家会变成贫穷国家,贫穷国家会变成弱小国家。经济学里有一条拉弗曲线(Laffercurve),认为随着税率的上升,税收收入会先增加后减少。我认为政府的力量也是如此,随着对公民自由的限制不断上升,政府的力量会先增加后减小。
位置 1338
如果读美国开国元勋的自述,你会发现他们听起来很像黑客。“反抗政府的精神,”杰弗逊写道,“在某些场合是如此珍贵,我希望它永远保持活跃。”你能想象今天的美国总统也这么说吗?这些开国元勋就像直率的老祖母,用自己的言辞让他们的那些不自信的继承者感到了惭愧。
5 另一条路:互联网软件是微机诞生后的最大机会。
位置 1344
创业机会: 来自于行业变化导致的市场需求 1995年的夏天,我和我的朋友罗伯特·莫里斯①决定创业。那时,正赶上网景公司②的股票即将上市,各种公关活动如火如荼,媒体都在谈论网络商务。当时大约有30家左右的网上商店,全部是手工制作网页。如果网络商务真要大规模发展,必须用专门的软件制作网上商店,所以我们决定动手写这样的软件。
位置 1404
由于没有安装这一步,所以在“购买”之前试用互联网软件将变得非常普遍、非常容易。只要联上网站,应该就能免费试用该网站提供的服务。Viaweb的整个网站处处都是鼓励用户试用的提示。
位置 1428
设计桌面软件就像设计一幢大楼,而设计互联网软件就像设计一座城市:你不仅需要设计建筑物,还要设计道路、路标、公用设施、警察局、消防队,并且制定城市发展规划和紧急事件的应对方案。
位置 1430
Viaweb的软件包括:与用户直接对话的一些大型应用程序、被这些大型程序使用的程序、常驻后台报告系统出错的程序、重新启动出错部分的程序、生成统计报告或数据库索引的程序(偶然运行)、回收资源或者移动及恢复数据的程序(手动运行)、伪装成用户的程序(为了测试系统和发现bug)、诊断网络故障的程序、完成备份的程序、对外提供服务界面的程序、实时显示服务器状态和访问数据的程序(很受用户欢迎,对我们也是必不可少的)、修改后的开源软件程序(包括修正bug)以及许许多多的配置和设定文件。在我们被雅虎买下以后,Trevor Blackwell写过一个令人叹为观止的程序,可以在不关闭网站的情况下,将网上商店转移到另一个机房的服务器上。此外,还有向系统管理员发出传呼信号的程序、向用户发传真和电子邮件的程序、引导完成信用卡交易的程序、在套接字、通信管路、HTTP请求、SSH、UDP数据包、共享内存、文件之间互相通信的程序。一部分Viaweb服务器上故意不安装某些程序,因为保证Unix系统安全的关键之一就是不运行那些不需要的东西,降低服务器被侵入的可能性。
位置 1455
对于互联网软件,没人规定只能使用某些语言开发,因为所有的硬件都控制在你手里,你想要用什么语言,就能用什么语言。不同的语言适合不同的任务,你应该根据不同场合,挑选最合适的工具。尤其是在竞争者存在的情况下,“可以这样做”就变成了“必须这样做”(详见后文),因为如果你不利用语言的优势,那就会听任对手超过你。
位置 1472
一年一次发布版本,解决软件的bug时就好像在足球场上捡小石块一样费劲,你永远不知道为什么软件内部会出这么多问题。最好的结果也不过是,你得到了一个统计学意义上“合格”的版本。
位置 1483
互联网软件的发布规则是:它运行不了,你就无法发布;一旦它能运行了,你就可以立刻发布。
位置 1520
复合式bug有一个子类型:两个bug是互相弥补的,好比“负负得正”,软件反而能正常运行。这种bug可能才是最难发现的bug。当你修正了其中的一个bug,另一个bug才会暴露出来。这时对你来说,你会觉得刚才修正错了,因为那是你最后修改的地方,你就怀疑自己在那里做错了,但是你其实是对的。
位置 1530
高级使用者对bug的容忍度比较高,尤其如果这些bug是在开发新功能的过程中引入的,而这些新功能又正是他们所需要的,他们就更能理解了。事实上,因为bug不多,你只有经过一些复杂的过程以后才会遇到它们,所以高级使用者往往因为发现了bug感到很得意。他们打电话给客服时,多半是一副胜利者的口吻,而不是怒气冲冲的样子,好像他们击败我们得分了一样。
位置 1539
公司价值观: 以客户为中心
Viaweb的开发人员总是与客服人员保持密切联系。客服人员坐在距离程序员只有9米的地方,知道自己可以随时打断程序员的工作,提交新证实的bug的报告。遇到重大bug,我们就算在开董事会,也会马上回来修改程序。
我们的政策是当场修复bug,这改变了客服人员与黑客之间的关系。在大多数软件公司,客服人员是低工资的边缘人,黑客则是呼风唤雨的主宰者。这些公司有各种各样的bug报告流程,但是几乎都是单向式的:使用者打电话给客服人员报告bug,客服人员填写某种形式的表格,传递给程序员(可能会经质量监控部门之手),程序员把bug写入待解决问题的清单。Viaweb不是这样,在收到使用者的bug报告之后一分钟内,程序员就会对站在身边的客服人员说:“没错,你是对的,这是一个bug。”客服人员从黑客嘴里听到“你是对的”,会感到欢欣鼓舞。
客服人员还必须大概了解相关知识、回答与bug相关的一些问题、解释令使用者迷惑不解的功能等。⑨有时,他们也扮演了使用者的代理人,我们会问他们哪个新功能是用户更想要的,他们总是能做出正确的回答。
公司价值观: 坚持自我批判
我们在Viaweb举办过一个比赛,看谁能说出我们软件中最差劲的地方。两位客服人员并列第一,我至今想起他们的叙述都不寒而栗。比赛一结束,我们立刻修复了那两个问题。
位置 1560
你有没有注意过,坐下来写东西的时候,一半的构思是写作时产生的?软件也是这样。实现某个构思,会带来更多的构思。
位置 1564
大公司的做法不是立刻实现新功能,而是先对新功能做一个计划。
位置 1565
投资者和分析家会问,你们对未来有何计划。真实的回答是,我们没有任何计划。我们有改进的想法,但是如果我们想到应该怎么改进,就已经把它实现了。接下来六个月我们要做什么?所有能想到的最佳改进。我不知道自己是否有胆量公开这么说,但这是实话。计划这个词,只是将构思束之高阁的另一种表达方式。只要想到好的构思,我们就立刻着手实现。
位置 1568
Viaweb和其他许多软件公司一样,大部分代码都有明确的负责人,而且只有一个。如果你负责某件事,那就真的是你负责。
位置 1574
当然,这样写软件也有局限。它适用于小型的、由优秀可靠程序员组成的开发团队,不适用于大型的、充斥大量平庸之辈的软件公司,在那里不是程序员想出好的构思,而是一个委员会集体批准坏的构思。
位置 1586
Viaweb的开发者只有3个人。
罗伯特·莫里斯写了客户下单的前台订单系统,特雷弗·布莱克韦尔写了图片系统和后台管理系统(商家用来处理订单、查看统计数据、修改设置等),我写了站点生成器(商家用来搭建网站的外观)。订单系统和图片系统的开发语言是C和C++,后台管理系统主要是Perl,站点生成器是Common Lisp。
位置 1593
人数越来越多,开会讨论各个部分如何协同工作所需的时间越来越长,无法预见的互相影响越多越大,产生的bug也越来越多。幸运的是,这个过程的逆向也成立:人数越来越少,软件开发的效率将指数式增长。
商业模型: 互联网项目的单元模型
效率对互联网软件至关重要,因为硬件费用由你支付。你的资本支出成本除以服务器所能支持的最大用户数量,就是你为每个用户付出的成本。如果你的软件效率高,你就能比同样硬件配置的竞争对手多发展用户,获得更多的利润。我们在Viaweb的时候,每个用户的硬件成本大约是5美元,现在应该更低,可能比把第一个月的账单寄给他们的成本还要低。如果软件效率足够高,每个用户的硬件成本现在可以接近免费。
商业模型: 以终为始,把商业当成系统工程来做
我研究了用户点击行为,发现在某一个地方,在线试用的用户会停止前进,改为点击浏览器的“后退”按钮。(如果你写过互联网软件,你会发现“后退”按钮是设计中最费脑筋的问题之一,很有意思。)所以,我就在那个地方加了一条提示,告诉用户已经接近终点了,提醒他们不要点击“后退”按钮。这时,互联网软件的另一个好处就体现出来了,你做了修改,马上就可以得到反馈。完成在线试用的用户比例从60%立刻上升到了90%。由于新增付费用户的数量是完成在线试用的用户数量的一个函数,所以与修改前相比,我们的收入增长了将近50%。
位置 1652
只要有可能,商业性公司就会采用一种叫做“价格歧视”⑭(price discrimination)的定价方法,也就是针对不同的客户给出不同的报价,使得利润最大化。软件的定价特别适合采用价格歧视,因为软件的边际成本⑮接近于零。这就是为什么很多软件的Sun服务器版本比Intel服务器版本更贵的原因,因为如果一个公司购买Sun服务器,就表明它很有钱,不在乎对设备的投资,那么为什么不向它开个高价呢?
位置 1666
相比桌面软件,互联网软件卖得更好,因为它易于销售。你可能认为,购买商品时,人们是先做出决定,然后再购买,好像这个行为分成两个独立的步骤。创立Viaweb之前,我也是这样想的,不过我从未对这个问题进行过深入思考。事实上,第二步对第一步有反作用,如果某样商品购买起来很困难,人们就会改变主意,放弃购买。反过来也成立,如果某样东西易于购买,你就会多买一点。
位置 1693
某种程度上,使用互联网软件的大公司就好像把它的IT部门外包出去了。虽然听起来很激进,但是我认为这样做很好。比起自己雇用系统管理员,外包可以让这些公司得到更好的服务。
位置 1700
公司管理: 关于外包与否
不少公司都很想知道,什么事情可以外包,什么事情不可以外包。一个可能的答案是,公司内部所有不直接感受到竞争压力的部门都应该外包出去,让它们暴露在竞争压力之下。
位置 1711
有一段时间,我们构思了一种新类型的服务,名叫“Viaweb黄金版”。它比我们普通类型的服务贵十倍,但是功能一模一样,唯一的区别就是有专人穿着西装面对面把它卖给你。我们从未把这个构思付诸实践,但是我很肯定,要是真推出的话,一定会有商家购买。大公司付出的高价之中,很大一部分是商家为了让大公司买下这个商品而付出的费用。
位置 1717
所以,最好的安排就是把个人和小企业客户放在第一位。其他的客户该来的时候就会来。
位置 1725
我认为,许多人没有意识到最早的创业公司是多么脆弱和踌躇。许多创业公司的出现完全出于偶然。几个朋友在一起,白天都要上班或者上学,利用业余时间做出一个产品原型,如果这个东西看上去有市场,那么可能就会开公司。
位置 1745
口碑效应发挥效果需要很长一段时间。报道我们的媒体也不是很多,后来我们以每月1.6万美元(再加上一些认股权证)的代价,聘请了Schwartz Communications公司(他们大概是高科技行业中最好的公关公司),媒体报道才多了起来。但是,真正起到决定性作用的销售推广渠道只有一个,那就是我们自己的网站。
位置 1762
但是,苹果公司还没有失败,如果它能把iPod升级成手机,并且将网络浏览器包括在其中,那么微软公司就有大麻烦了。)(译者注:这段话写于2001年9月,苹果公司的iPhone手机已于2007年6月上市。)
位置 1833
个人选择: 是打工还是创业?
互联网软件要求的那种工作强度和付出,只有当公司是其本人所有时,程序员才愿意提供。软件公司可以雇到能干的人,让他们去干轻松的事情,也可以雇到不能干的人,让他们去干艰苦的事情,但是无法雇到非常能干的人,让他们去干非常艰苦的事情。
E.B.怀特曾经从一个农民朋友那里听到一则趣闻。许多农场用电篱笆防止奶牛逃跑,但是不少电篱笆其实并没有通电。不过奶牛们已经吃过苦头,显然学会了不去碰电篱笆,这时不通电也能起到效果。“奶牛们,行动吧!”他写道,“趁着统治者打鼾时,夺回你们的自由!”
如果你是一个黑客,并且梦想自己创业,可能会有两件事情令你望而却步,不敢真正开始采取行动。一件是你不懂得管理企业,另一件是你害怕竞争。可是实际上,这两件事都是没有通电的电篱笆。
首先,管理企业其实很简单,只要记住两点就可以了:做出用户喜欢的产品,保证开支小于收入。只要做到这两点,你就会超过大多数创业公司。随着事业的发展,你自己就能琢磨出来其他的诀窍。
至于如何做出用户喜欢的产品,下面是一些通用规则。从制造简洁的产品开始着手,首先要保证你自己愿意使用。然后,迅速地做出1.0版,并且不断加以改进,整个过程中密切倾听用户的反馈。用户总是对的,但是不同的用户要求不一样。低端的用户要求简化操作和清晰易懂,高端的用户要求你增加新功能。
其次,让我们来看看竞争。你所害怕的大概不是与你一样的黑客,而是那些像模像样,有着办公室、商业计划、销售员的公司,对不对?可是实际上,他们害怕你胜过你害怕他们,而且这一点上,他们并没有错。几个黑客搞懂如何租用办公室,或者如何雇用销售人员,要比那些公司(不管大公司还是小公司)搞懂如何正确写出软件容易得多。
我无意贬低雅虎。它拥有一些很好的黑客和顶尖的管理人才。对于一家大公司来说,它可谓是出类拔萃了。但是,它的生产效率仅仅相当于小型创业公司的十分之一。没有任何一家大公司能做得更好。
6 如何创造财富:致富的最好方法就是为社会创造财富。创造财富的最好方法就是创业。

位置 1976
关键概念: 财富的定义
财富是最基本的东西。我们需要的东西就是财富,食品、服装、住房、汽车、生活用品、外出旅行等都是财富。即使你没有钱,你也能拥有财富。如果有一台魔法机器,能够按照你的命令变出汽车,为你洗衣做饭,提供其他你想要的东西,那么你就不需要钱了。要是你身处南极洲内陆,再多的钱对你也是无用的,因为没有东西可买,你真正需要的是财富。财富才是你的目标,金钱不是。
位置 1993
交换媒介的优点是,它使得交易可以进行下去。缺点是,它往往模糊了交易的实质。人们觉得做生意就是为了挣钱,但是金钱其实只是一种中介,让大家可以更方便地获得自己想要的东西。大多数生意的目的是为了创造财富,做出人们真正需要的东西。
位置 2035
另一件程序员看来显而易见的事情就是创造财富的速率存在巨大的差异。Viaweb的一个程序员有着惊人的生产力,我记得看着他工作了整整一天,拿出来的产品估计使得公司的市场价值增加了几十万美元。一个优秀程序员连续工作几个星期可能可以创造价值100万美元的财富。同样的时间内,一个平庸的程序员不仅无法创造财富,甚至还可能减少财富(比如引入了bug)。
位置 2067
关键概念: 工作的定义
一个大学毕业生总是想“我需要一份工作”,别人也是这么对他说的,好像变成某个组织的成员是一件多么重要的事情。更直接的表达方式应该是“你需要去做一些人们需要的东西”。即使不加入公司,你也能做到。公司不过是一群人在一起工作,共同做出某种人们需要的东西。真正重要的是做出人们需要的东西,而不是加入某个公司。
工作就是在一个组织中,与许多人共同合作,做出某种人们需要的东西。
位置 2076
大公司会使得每个员工的贡献平均化,这是一个问题。我觉得,大公司最大的困扰就是无法准确测量每个员工的贡献。大多数时候它只是在瞎猜。在大公司中,你只要一般性地努力工作,就能得到意料之中的薪水。你不能明显无能或懒惰,但是谁也没觉得你会把全部精力投入工作。
你想更努力地工作,但是你的工作与其他许多人的工作混杂在一起,这样就产生了问题。在大公司中,个人的表现无法单独测量,公司里其他人会拖累你。
位置 2097 关键概念: 致富的关键
要致富,你需要两样东西:可测量性和可放大性。你的职位产生的业绩,应该是可测量的,否则你做得再多,也不会得到更多的报酬。此外,你还必须有可放大性,也就是说你做出的决定能够产生巨大的效应。
位置 2110
如果你想同时具备可测量性和可放大性,不一定非当上CEO或电影明星不可。你只需要成为某个攻克难题的小团体的一部分就可以了。
位置 2115
因此,创业或加入一家创业公司最可能实现前文的情况,那就是你对老板说,我打算十倍努力地工作,请你把我的薪水也增加十倍吧!但是,有两个区别。第一个区别是你的要求并非向老板提出,而是直接向顾客提出(毕竟老板只是顾客的代理人)。第二个区别是你并非一个人完成这个任务,而是在一个小团体中与其他几个有同样抱负的人一起合作完成。
位置 2132
乔布斯曾经说过,创业的成败取决于最早加入公司的那十个人。我基本同意这个观点,虽然我觉得真正决定成败的其实只是前五人。小团队的优势不在于它本身的小,而在于你可以选择成员。我们不需要小村庄的那种“小”,而需要全明星第一阵容的那种“小”。
位置 2138
创业公司为每个人提供了一条途径,同时获得可测量性和可放大性。因为创业公司是小团队,所以具备可测量性。因为创业公司通过发明新技术盈利,所以具备可放大性。
位置 2147
小团队天生就适合解决技术难题。技术的发展是非常快的,今天很有价值的技术,几年后可能就会丧失价值。小团队在如今这个时代可谓如鱼得水,因为他们不受官僚主义和繁琐管理制度的拖累。而且,技术的突破往往来自非常规的方法,小团队就较少受到常规方法的约束。大公司也能开发出新技术,就是开发得比较慢而已。大公司的规模决定了它们无法快速行动,也无法测量并奖励表现优异的员工。
位置 2159
假定你是一个手脚敏捷的小男孩,身后有一条壮硕的大狗正在追你。你跑到楼梯口,这时应该上楼还是下楼?我觉得应该上楼。如果下楼的话,大狗可能跑得跟你一样快。上楼的话,大狗的庞大身躯就将成为劣势。不错,跑上楼你会比较吃力,但是大狗会感到更吃力。
位置 2162
在实际操作中,这就意味着我们故意选择那些很困难的技术问题。假定软件有两个候选的新功能,它们创造的商业价值完全相同,那么我们总是选择较困难的那个功能。不是因为这个功能能带来更多的收入,而是因为它比较难。我们很乐于迫使那些又大又慢的竞争对手跟着我们一起走进沼泽地。创业公司就像游击队一样,喜欢选择不易生存的深山老林作为根据地,政府的正规军无法追到那种地方。我还记得创业初期我们是多么筋疲力尽,整天都为一些可怕的技术难题绞尽脑汁。但是,我还是感到相当高兴,因为那些问题连我们都觉得这么困难,那么竞争对手就更会认为是不可能解决的。这不仅是创业公司运作的好方法,更是创业公司的本质。风险投资商(VC)知道这个道理,为它起了一个名字——进入壁垒(barrier stoentry)。
位置 2174
设置“进入壁垒”的方法之一就是申请专利。但是专利的保护程度可能不高。竞争对手通常能找到绕过专利的方法。如果找不到,它们可能就不找了,直接侵犯你的专利,等着你去起诉它们。
位置 2185
总的来说,这也是很好的处事原则。如果你有两个选择,就选较难的那个。如果你要选择是坐在家里看电视,还是外出跑步,那就出去跑步吧。这个方法有效的原因可能是遇到两个一难一易的选择时,往往出于懒惰的缘故,你会选择较易的那个选项。在意识深处,你其实知道不懒惰的做法会带来更好的结果,这个方法只是迫使你接受这一点。
位置 2191
创业的潜规则: 很多事情由不得你,搞明白平均数和中位数
但创业是有一些潜规则的,其中一条就是很多事情由不得你。比如,你无法决定到底付出多少。你只想更勤奋工作2到3倍,从而得到相应的回报。但是,真正创业以后,你的竞争对手决定了你到底要有多辛苦,而他们做出的决定都是一样的:你能吃多少苦,我们就能吃多少苦。另一条潜规则是,创业的付出与回报虽然总体上是成比例的,但是在个体上是不成比例的。我在前面说过,对于个人来说,付出与回报之间存在一个很随机的放大因子。你努力30倍,最后得到的回报在现实中并不是30倍,而是0到1000倍之间的一个随机数。假定所有创业者都努力30倍,最后他们得到的总体平均回报是30倍,但中位数却是0。⑪大多数创业公司都以失败告终,其中并不都是很烂的项目(互联网泡沫时期曾经出现过专门介绍狗粮的门户网站)。一种很普遍的情况是,某个创业公司确实在开发一个很好的产品,但是开发时间太长了一点,结果资金都用完了,只好关门散伙。
位置 2211
创业的一个好出路: 出售公司
保险的做法就是在早期卖掉自己的创业公司,放弃未来发展壮大(但风险也随之增大)的机会,只求数量较少但是更有把握的回报。我们曾经遇到过一个这样的机会,但是自以为是地将它放过了,事后才觉得自己很愚蠢。此后,我们就急不可耐地盼着把公司卖掉。在第二年里,只要有任何人对Viaweb流露出稍微一点点的兴趣,我们就试着努力把公司卖给他。但是,始终没有买家,所以我们不得不继续把公司开下去。
那么,怎样才能把公司卖掉呢?基本上,不管是否想出售公司,你要做的事情都是一样的(比如多赚钱)。但是,被收购本身就是一门学问,我们在Viaweb花了很多时间研究它。
潜在的买家会尽可能地拖延收购。收购这件事最难的地方就是让买方真正拿出钱。大多数时候,促成买方掏钱的最好办法不是让买家看到有获利的可能,而是让他们感到失去机会的恐惧。对于买家来说,最强的收购动机就是看到竞争对手可能收购你。我们发现这会使得CEO们连夜行动。次强的动机则是让他们担心如果现在不买你,你的高速成长将使得未来的收购耗资巨大,甚至你本身可能变成一个他们的竞争对手。
事实上,买家假定用户知道谁有最好的技术。虽然这听上去很蠢,但是用户是你证明自己创造了财富的唯一证据。财富就是人们需要的东西,如果没人使用你的软件,可能不是因为你的推广活动很失败,而是因为你没有做出人们需要的东西。
所以,我认为你应该和买家一样,也把用户数量当作一个测试指标。像优化软件一样优化公司,用户数量就是判断公司表现好坏的指标。
位置 2242
关键概念: 致富的定义 你必须时刻牢记的最基本的原则就是,创造人们需要的东西,也就是创造财富。如果你想通过创造财富使得自己致富,那么你必须知道人们需要什么。
7 关注贫富分化:“收入分配不平等”的危害,会不会没有我们想的那样严重?
位置 2290
我认为有三个原因使得我们对赚钱另眼相看。第一,我们从小被误导的对财富的看法;第二,历史上积累财富的方式大多名声不好;第三,担心收入差距拉大将对社会产生不利影响。就我所知,第一点是错的,第二点已经过时了,第三点通不过现实的检验。
位置 2297
财富与金钱是两个概念。金钱只是用来交易财富的一种手段,财富才是有价值的东西,我们购买的商品和服务都属于财富。你到海外旅行时,不用看当地人的银行账户就会知道你来到的是富国还是穷国。你只要看看他们的财富就行了:建筑、街道、服装、健康状况等。
位置 2303
我们大多数人都在为其他人创造财富,然后用创造出来的财富交换金钱,再用金钱交换我们需要的另一种财富。
位置 2330
想象一个人的产出是另一个人的100倍是一件毫无困难的事情。在古罗马时代,根据奴隶的技能不同,他们的价格会相差50倍。④上述收入差距还没有考虑激励因素或者现代科技带给你的生产力放大效应。
位置 2345
一个人的工作具有多少价值不是由政府决定的,而是由市场决定的。
位置 2348
“他一个人的价值真的等于我们100个人的价值吗?”社论作者这样问道。回答取决于你怎么定义“价值”。如果你同意“价值”可以定义为实现自身技能而得到的报酬,那么回答显然就是“对的”。
位置 2360
当我们说一些工作报酬过高,另一些工作报酬过低,我们的真实想法到底是什么?在自由竞争的市场经济中,价格由买家的需求决定。如果人们喜欢棒球甚于喜欢诗歌,那么棒球运动员的收入就是要比诗人的收入高。如果说某种工作的报酬过低,那就相当于说人们的需求不正确。
位置 2412
到了19世纪,情况就变了,虽然存在大量贪污受贿(今天依然如此),但是政府逐渐被一些将良心和名誉看得比金钱更重要的人所控制。技术的发展使得通过创造而积累财富的速度第一次有可能超过通过偷窃而积累财富的速度。19世纪典型的富人不是宫廷朝臣,而是实业家。
位置 2421
即使情况已经发生变化,但是由于人类历史上主要的致富方式长期以来都是偷窃,所以我们依然对有钱人抱有一种怀疑态度。
位置 2459
这种变化模式不断在一个又一个的行业重现。只要存在对某种商品的需求,技术就会发挥作用,将这种商品的价格变得很低,从而可以大量销售。
位置 2465
如果想要真正地对收入加以考察,你必须使用“真实收入”的概念(以购买力衡量的收入),而不是使用“名义收入”的概念(以货币衡量的收入)。但是,计算“真实收入”的常用方法忽略了大部分随着时间增长的财富,因为“真实收入”要用消费者物价指数才能算出来,但是消费者物价指数是根据一系列样本商品的价格计算的,本身就不具有全面的精确性,而且新发明产品的价格没有计算在内。(
位置 2469
就算我们认定有了抗生素、飞机旅行、电力系统以后,人类的生活大大改善,真实收入的计算方法却说我们的生活只有轻微的改善。
位置 2470
衡量收入变化的另一种方法就是,问如果你乘坐时间机器回到过去,你需要花多少钱购买同样的东西。举例来说,假定你回到1970年,你会发现今天价格不到500美元的CPU处理能力在那时至少价值1.5亿美元。
位置 2489
无论在物质上,还是在社会地位上,技术好像都缩小了富人与穷人之间的差距,而不是让这种差距扩大了。如果参观雅虎、英特尔、思科的办公室,会看到每个人都穿着差不多的衣服,有着同样的办公室(或者小隔间)、同样的家具,彼此直呼对方的名字,不加任何头衔或敬语。
位置 2492
技术的发展加大了贫富差距,这是不是一个社会问题?好像没有那么严重。技术在加大收入差距的同时,缩小了大部分的其他差距。
位置 2499
我想提出一种相反的观点:现代社会的收入差距扩大是一种健康的信号。技术使得生产率的差异加速扩大,如果这种扩大没有反映在收入上面,只有三种可能的解释:(a)技术革新停顿了;(b)那些创造大部分财富的人停止工作了;(c)创造财富的人没有获得报酬。
位置 2502
我觉得可以很有把握地说,(a)和(b)都不是好事。
位置 2504
如果你想让社会保持繁荣,同时收入差距不扩大,那么就只剩下(c)这一种可能了,即创造大量财富的人不获取报酬。举例来说,苹果公司的两位创始人将欢欣鼓舞地每天工作20个小时,为社会提供苹果电脑,然后只领取一份相当于大公司里朝九晚五的上班族领取的税后工资。
位置 2507
如果得不到报酬,人们是否愿意创造财富?唯一的可能就是,工作必须能提供乐趣。会有人愿意免费写一个操作系统,但是他们不愿意免费为你安装、提供电话支持、进行客户培训等。
位置 2513
在历史的不同时点,你是否能够通过创造财富而致富就是这样一种打开/关闭的循环过程。公元800年的意大利北部,关闭(贵族偷窃平民的财产);公元1100年的意大利北部,打开;公元1100年的法国中部,关闭(仍然是封建社会);公元1800年的英国,打开;1974年的英国,关闭(投资所得税高达98%);1974年的美国,打开。以上每一种情况,打开时,财产创造活动就出现了,关闭时,财富创造活动就消失了,这就好像电扇和噪音的那种相伴关系。
位置 2519
但是,只要你压制收入差距的扩大,不管是用偷窃私人财产的做法(封建社会),还是用高额税收的做法(某些现代政府),最终结果看来都是一样的,那就是社会作为一个整体变得更贫穷了。
8 防止垃圾邮件的一种方法:不久前,许多专家还认为无法有效地过滤垃圾邮件。本文改变了他们的想法。
位置 2549
用户收到的垃圾邮件越多,他就越不可能注意到被过滤掉的垃圾邮件中包含着一封正常邮件。这就导致了一个很奇怪的后果,如果你的过滤器效果越好,就越不能出现误判,一旦误判,后果就会变得很严重,因为过滤器工作得非常良好,所以用户相信它,就不太可能去检查被它过滤掉的邮件。
9 设计者的品味:如何做出优秀的东西?
位置 2707
把品味说成个人的偏好可以有效地杜绝争论,防止人们争执哪一种品味更好。但是问题是,这种说法是不正确的。只要你自己开始动手设计东西,就能明白这一点。
工程思考: 好设计的特征
- 好设计是简单的设计。从数学领域到绘画领域,你都可以听到这种说法。在数学中,它表示简短的证明往往是更好的证明。 当你被迫把东西做得很简单时,你就被迫直接面对真正的问题。当你不能用表面的装饰交差时,你就不得不做好真正的本质部分。
- 好设计是永不过时的设计。只要没有错误,每一个数学证明都是永不过时的。 以永不过时作为目标是一种帮助自己找到最佳答案的方法:如果你不愿别人的答案取代你的答案,你就只好自己做出最佳答案。
- 好设计是解决主要问题的设计。
- 好设计是启发性的设计。 在软件业中,这条原则意味着,你应该为用户提供一些基本模块,使得他们可以随心所欲自由组合,就像玩乐高积木那样。
- 好设计通常是有点趣味性的设计。
- 好设计是艰苦的设计。 如果开发“功能”非常艰难,那么“形式”将不得不全部都由“功能”决定,因为没有多余的精力再来单独开发“形式”了。人们常常觉得野生动物非常优美,原因就是它们的生活非常艰苦,在外形上不可能有多余的部分了。
- 好设计是看似容易的设计。
- 好设计是对称的设计。 对称也许只是简洁性的一种表现,但是它十分重要,值得单独列为一点。自然界的对称大量存在,这就说明了对称的重要性。对称有两种:重复性对称和递归性对称。递归性对称就是指子元素的重复,比如树叶上叶脉的纹路。
- 好设计是模仿大自然的设计。我不是说模仿大自然这种行为本身有多么好,而是说大自然在长期的演化中已经解决了很多设计问题。所以,如果你的设计与大自然很接近,那么它基本上不会很差。
- 好设计是一种再设计。很少有人一次就把事情做对。专家的做法是先完成一个早期原型,然后提出修改计划,最后把早期原型扔掉。
- 好设计是能够复制的设计。我们对待复制的态度经常是一个否定之否定的过程。刚入门的新手不知不觉地模仿他人,逐渐熟练之后才开始创作原创性作品。最后他会意识到,把事情做对比原创更重要。
- 好设计常常是奇特的设计。某些最出色的作品堪称不可思议:欧拉公式、16世纪画家布勒哲尔的《雪中猎人》(图94)、SR71“黑鸟”超音速侦察机(图95)、计算机的Lisp语言等。它们不仅优美,而且美得很奇特。
- 好设计是成批出现的。15世纪住在佛罗伦萨的伟大艺术家有建筑师布鲁内莱斯基、画家吉贝尔蒂、雕塑家多纳泰洛、画家马萨乔、画家菲利普里皮、画家弗拉安吉利科、雕塑家韦罗基奥、画家波提切利、达·芬奇和米开朗基罗。 推动人才成批涌现的最大因素就是,让有天赋的人聚在一起,共同解决某个难题。互相激励比天赋更重要,达·芬奇之所以成为达·芬奇,主要原因不仅仅是他的天赋,更重要的是他生活在当时的佛罗伦萨,而不是米兰。
- 好设计常常是大胆的设计。在任何一段历史中,人们都会把某些荒谬的东西当作正确的,并且深信不疑,以至于一旦你出言质疑,就有被排挤或者被暴力伤害的危险。
11 一百年后的编程语言:一百年后,人类怎样编程?为什么不从现在开始就这样编程呢?
位置 3118
对于大多数程序,速度不是最关键的因素,所以你通常不需要费心考虑这种硬件层面上的微观管理。随着计算机速度越来越快,这一点已经越发明显了。
位置 3129
效率低下的软件并不等于很烂的软件。一种让程序员做无用功的语言才真正称得上很烂。浪费程序员的时间而不是浪费机器的时间才是真正的无效率。随着计算机速度越来越快,这会变得越来越明显。
位置 3164
顺便说一句,我不认为面向对象编程将来会消亡。我觉得,除了某些特定的领域,这种编程方法其实没有为优秀程序员带来很多好处,但是它对大公司有不可抗拒的吸引力。面向对象编程使得你有办法对一团乱码似的代码进行可持续性开发。通过不断地打补丁,它让你将软件一步步做大。大公司总是倾向于采用这样的方式开发软件。我预计一百年后也是如此。
12 拒绝平庸:别忘了你的对手与你一样,能用任何想用的语言编写互联网软件。
位置 3297
如果选择哪种语言都行,你到底使用哪一种语言?我们选择Lisp。首先,很明显,对于这个市场来说,快速开发出产品是很重要的。我们所有人都是从零开始,所以能够快速做出新功能的公司就会取得巨大的竞争优势。我们知道Lisp语言真的非常合适快速开发软件,而且我们的软件运行在服务器端,你一写完代码就能发布出去,所以这又进一步放大了快速开发的效果。
位置 3301
创办Viaweb的时候,我们对于如何经营一家公司毫无经验,对市场推广、雇用员工、融资、发展新客户等都一无所知。在此之前,我和莫里斯甚至连一天正式上班的经历都没有。我们唯一擅长的事情就是开发软件。
位置 3304
可以这样说,我们使用Lisp只是一个大胆的冒险。我们设想如果用Lisp语言开发自己的软件,就能比竞争对手更快地写出新功能,还能做到他们做不到的事情。同时,因为Lisp是一种抽象层次非常高的语言,所以就不需要非常庞大的开发团队,这会降低成本。如果我们的设想是正确的,那么我们就能用更少的钱做出一个更好的产品,从而获得利润。最终,我们将独占市场,竞争对手什么也得不到,到头来只能退出这个行业。我们当时心里就是这么盘算的。
位置 3309
我们前前后后遭遇到很多竞争对手,一共大概有二三十个,但是他们的软件没有一个能与我们竞争。
位置 3334
Lisp语言的好处不在于它有一些狂热爱好者才明白的优点,而只在于它是目前最强大的编程语言。它没有得到广泛使用的原因就是因为编程语言不仅仅是技术,也是一种习惯性思维,非常难于改变。
位置 3340
大家都知道,徒手用机器语言写出整个程序是一件很蠢的事。但是,把这个观点推广到一种更普遍的情况,知道的人就不多了。如果你有好几种语言可以选择,在不考虑其他因素的情况下,你不选择最强大的那种语言就是一件很蠢的事。
位置 3351
如果你的程序很短,只是为了特定场合一次性使用,那么你最好根据自己要解决的问题选择具有最强大函数库的语言。
位置 3401
我在前文一再声称Lisp语言无比强大,无论Blub语言的程序员对此多么怀疑,看到这个事实应该足以让他感到很好奇,我们居然用到了这么多宏。我们这样写代码并不是为了好玩。我们是一家小创业公司,拼尽全力写代码,只是为了给竞争对手布下重重障碍,不让他们赶上来。
位置 3421
技术的变化速度通常是很快的。但是,编程语言不一样,与其说它是技术,还不如说是程序员的思考模式。编程语言是技术和宗教的混合物。
位置 3435
创业公司的tips: 创业公司评估竞争对手的妙招
如果你为创业公司工作,那么这里有一个评估竞争对手的妙招——关注他们的招聘职位。 在Viaweb创业期间,我读过大量竞争对手的招聘职位。差不多每个月都有一个新的竞争对手浮出水面。我首先会看他们的产品有没有一个试用版,然后就去找他们的招聘职位。这样过了几年,我就知道哪些公司值得关注,哪些公司不用在意。有些公司的职位描述使用了大量的IT词汇,这样的内容越多,这家公司就越不构成威胁。最不用担心的竞争对手就是那些要求应聘者具有Oracle数据库经验的公司,你永远不必担心他们。如果是招聘C++或Java程序员的公司,对你也不会构成威胁。如果他们招聘Perl或Python程序员,就稍微有点威胁了。至少这听起来像一家技术公司,并且由黑客控制。如果我有幸见到一家招聘Lisp黑客的公司,就会真的感到如临大敌。
13 书呆子的复仇:在高科技行业,只有失败者采用“业界最佳实践”。
位置 3471
如果语言各有不同,你的经理就会突然发现,有两个互相关联的方程,他必须找到一个能够同时满足两个方程的最佳解,而最要命的却是他对此根本一无所知。 第一个方程是找到(相对于要解决的问题)能够适用20年左右的最佳语言, 第二个方程是(为这种语言)找到合适的程序员、函数库的机会有多大。
位置 3509
由此也就得出了20世纪50年代的编程语言到现在还没有过时的原因。简单说,因为这种语言本质上不是一种技术,而是数学。数学是不会过时的。
位置 3517
Lisp和Fortran代表了编程语言发展的两大方向。前者的基础是数学,后者的基础是硬件架构。从那时起,这两大方向一直在互相靠拢。
位置 3581
使用一种不常见的语言会出现的问题我想到了三个:你的程序可能无法很好地与使用其他语言写的程序协同工作;你可能找不到很多函数库;你可能不容易雇到程序员。
位置 3608
如果你创业的话,千万不要为了取悦风险投资商或潜在并购方而设计你的产品。让用户感到满意才是你的设计方向。只要赢得用户,其他事情就会接踵而来。如果没有用户,谁会关心你选择的“正统”技术是多么令人放心。
位置 3614
强大的编程语言如何让你写出更短的程序?一个技巧就是(在语言允许的前提下)使用“自下而上”(bottomup)的编程方法。你不是用基础语言(baselanguage)开发应用程序,而是在基础语言之上先构建一种你自己的语言,然后再用后者开发应用程序。这样写出来的代码会比直接用基础语言开发出来的短得多。
位置 3717
如果你想解决一个困难的问题,关键不是你使用的语言是否强大,而是好几个因素同时发挥作用:(a)使用一种强大的语言;(b)为这个难题写一个事实上的解释器;或者(c)你自己变成这个难题的人肉编译器。
位置 3721
在面向对象编程的世界中,我们大量听到“模式”(pattern)这个词,我觉得那些“模式”就是现实中的因素(c),也就是人肉编译器。
位置 3725
皮特·诺维格发现,总共23种设计模式之中,有16种在Lisp语言中“本身就提供,或者被大大简化”。(
14 梦寐以求的编程语言:一种好的编程语言,是让黑客可以随心所欲使用的语言。
位置 3872
所以,编程时提高代码运行速度的关键是使用好的性能分析器(profiler),而不是使用其他方法,比如精心选择一种静态类型的编程语言。为了提高运行速度,并没有必要每个函数的每个参数类型都声明清楚,你只需要在瓶颈处声明清楚参数类型就可以了。所以,更重要的是你需要能够找出瓶颈到底在什么地方。
位置 3878
这个问题一部分源于沟通不畅。语言设计者喜欢提高编译器的速度,认为这是对自己技术水平的考验,而最多只把性能分析器当作一个附送给使用者的赠品。但是在现实中,一个好的性能分析器对程序的帮助可能大于编译器的作用。
位置 3881
让性能分析器自动运行可能是一个好主意。它自动告诉程序员每个部分的性能,而不是非要等到程序员手动运行后才能知道。比如,当程序员编辑源码的时候,代码编辑器能够实时用红色显示瓶颈的部分。另一个方法应该是设法显示正在运行的程序的情况,这对互联网软件尤其重要,因为服务器上有很多
位置 3891
现在有一些语言先编译成字节码(bytecode),然后再由解释器执行。这样做主要是为了让代码容易移植到不同的操作系统,但是这也可以变成一项很有用的功能。让字节码成为语言的正式组成部分,允许程序员在瓶颈处内嵌字节码,这可能是一个不错的主意。然后,针对这部分字节码的优化也就变得可以移植了。
位置 3898
用户关心的是反应时间(responsetime),但是软件的另一种效率正在变得越来越重要,那就是每个处理器能够同时支持的用户数量。未来许多有趣的应用程序都将是运行在服务器端的互联网软件,所以每台服务器能够支持的用户数量就成了软件业者的关键问题。互联网软件的资本支出就取决于这个指标。
位置 3915
我有一个朋友,他的客户第一次提出某种需求时,他很少理会。因为他知道人们有时候会想要自己并不真正需要的东西。为了避免浪费时间,只有当客户第三次或第四次提出同样的需求时,他才认真对待。这个时候客户可能已经很不高兴了,但是这至少保证他们提出的需求应该就是他们真正需要的东西。
位置 3921
所以,发明新事物的人必须有耐心,要常年累月不断地做市场推广,直到人们开始接受这种发明。我们就耗费了好几年才使得客户明白Viaweb不需要下载安装就能使用。不过,好消息是,简单重复同一个信息就能解决这个问题。你只需要不停地重复同一句话,最终人们将会开始倾听。人们真正注意到你的时候,不是第一眼看到你站在那里,而是发现过了这么久你居然还在那里。