阅读笔记:《黑客与画家》
阅读笔记:《黑客与画家》
阅读时间:2015年9月25日,26日,11月10日,11日,
保罗·格雷厄姆其人其事
青少年时代,格雷厄姆就开始编程。但是,他还喜欢许多与计算机无关的东西,这在编程高手之中是很少见的。中学时,他喜欢写小说;进入康奈尔大学以后,他主修哲学。后来发现哲学很难理解,于是研究生阶段他就去了哈佛大学计算机系,主攻人工智能。
他在这个方向上进展不顺利,因此对学术感到灰心。(但是,作为研究工具的Lisp语言,对他日后产生了重大影响。)博士读到一半,他又去哈佛艺术系旁听。拿到博士学位以后,他报名进入罗德岛设计学院暑期班,学习绘画课程,梦想成为画家。
上完暑期班,他去了欧洲,在有500年历史的佛罗伦萨美术学院继续学习绘画。第二年,钱花完了,他不得不返回美国,在波士顿的一家创业公司中担任程序员。那时是1992年。
“我们生活中的一切,都正在成为计算机。所以,如果你想理解我们目前的世界以及它的未来动向,那么多了解一些黑客的想法会对你有帮助。”
YC在每年的一月和六月举办两次训练营,每次为期三个月。通常每次大概有500个申请者,他们从中挑出20个项目[4]。每个项目将得到1.1万美元的启动资金,外加每个项目成员3000美元的生活津贴,交换条件是YC将拿走该项目5%的股份[5]。如果项目成功,5%的股份将非常值钱。
YC的合伙人对每个项目都进行个别辅导,不仅提供项目建议,还灌输方法论和价值观。每个星期四下午,创业者来到YC的办公室,与格雷厄姆或者其他某个合伙人见面,报告项目的进展,然后一起讨论如何解决一些棘手的难题。
保罗·格雷厄姆有一套完整的创业哲学,他的创业公式是:
(1)搭建原型
(2)上线运营(别管bug)
(3)收集反馈
(4)调整产品
(5)成长壮大
首先,他鼓励创业公司快速发布产品,因为这样可以尽早知道一个创意是否可行。其次,他认为一定要特别关注用户需要什么,这样才有办法将一个坏项目转变成好项目。
小团队更容易成功,创始成员总数最好不要超过三个人。其中一个原因是,创始人越多,股权越不容易平等分配,容易造成内耗。
未来的社会,创业可能成为一种常态,而替别人打工反而成了少见的事情。
译者序
想要把握这个时代,就必须理解计算机。理解计算机的关键,则是要理解计算机背后的人。表面上这是一个机器的时代,但是实际上机器的设计者决定了我们的时代。程序员的审美决定了你看到的软件界面,程序员的爱好决定了你有什么样的软件可以使用。
我们的时代是程序员主导的时代,而伟大的程序员就是黑客。
“出于兴趣而解决某个难题,不管它有没有用,这就是黑客。
根据理查德·斯托尔曼的说法,黑客行为必须包含三个特点:好玩、高智商、探索精神。只有其行为同时满足这三个标准,才能被称为“黑客”。
六条“黑客伦理”(hacker ethic),直到今天这几条伦理都被视为这方面的最佳论述。
(1)使用计算机以及所有有助于了解这个世界本质的事物都不应受到任何限制。任何事情都应该亲手尝试。
(Access to computers—and anything that might teach you somethin
about the way the world works—should be unlimited and total. Always yield to the Hands-On Imperative!)
(2)信息应该全部免费。
(All information should be free.)
(3)不信任权威,提倡去中心化。
(Mistrust Authority—Promote Decentralization.)
(4)判断一名黑客的水平应该看他的技术能力,而不是看他的学历、年龄或地位等其他标准。
(Hackers should be judged by their hacking, not bogus criteria such as degrees, age, race, or position.)
(5)你可以用计算机创造美和艺术。
(You can create art and beauty on a computer.)
(6)计算机使生活更美好。
(Computers can change your life for the better.)
历史上一些最优秀的程序员都是“黑客”。除了上文提到的理查德·斯托尔曼,还包括Unix操作系统创始人丹尼斯·里奇和肯·汤普森,经典巨著《计算机程序设计艺术》的作者、斯坦福大学计算机教授高德纳,Linux操作系统创始人莱纳斯·托沃兹,“开源运动”创始人埃里克·雷蒙德,微软公司创始人比尔·盖茨等。正是黑客把计算机工业推向了更高的高度。
和画家一样,黑客只是怀有一门特殊手艺、有创造天赋的普通人。这个书名还有另一层含义,即编程是一种艺术创作,黑客就是艺术家,开发软件与画家作画、雕塑家雕刻、建筑师设计房屋并没有本质不同。
前言
我们生活中的一切,都正在成为计算机。
如果你想了解黑客,就必须懂一点编程语言。这就好比回到1880年,如果你想理解技术发展,就必须懂一点蒸汽机。
计算机程序只是文本而已。你选择什么语言,决定了你能说什么话。编程语言就是程序员的思维方式。
如果你喜欢思考,阅读此书应该会带给你很多乐趣。虽然黑客从外表看上去一般都是呆呆的,但是他们的大脑内部却是一个有趣得让你吃惊的地方。
1 为什么书呆子不受欢迎
“任何一种艺术,不管是否重要,如果你想要在该领域出类拔萃,就必须全身心投入。”
事实上,大多数“会画”的人,本身就很喜欢画画,将许许多多时间投入其中,这就是为什么他们擅长画画的原因。同样的,受欢迎也不是天生的,而是要你自己做出来的。
孩子们自己创造出来的世界是一个非常原始的世界。
成年人不知道孩子们内部发生的事。认识到这一点很重要。
真实世界的关键并非在于它是由成年人组成的,而在于它的庞大规模使得你做的每件事都能产生真正意义上的效果。
当你所做的事情能产生真实的效果,那就不仅仅是好玩而已了,发现正确的答案就开始变得重要了,
真实世界的特点是,它极其庞大。如果总体足够大,即使是人数最少的少数派,只要聚集在一起,也能产生可观的力量。在真实世界中,书呆子在某些地方聚集起来,形成自己的社区,智力因素成为那里最被看重的东西。
2 黑客与画家
计算机和画画有许多共同之处。事实上,在我知道的所有行业中,黑客与画家最相像。
黑客与画家的共同之处,在于他们都是创作者。与作曲家、建筑师、作家一样,黑客和画家都是试图创作出优秀的作品。
黑客的最高境界是创造规格。虽然看起来,做到这一点的最好方法就是先做出一个样品把规格实现了。
创造优美事物的方式往往不是从头做起,而是在现有成果的基础上做一些小小的调整,或者将已有的观点用比较新的方式组合起来。
塞缪尔·约翰逊[2]说过,人们对一个作家的评价,需要100年才能达成一致[3]。你必须先等他的那些有影响力的朋友都死了,然后再等他的追随者都死了,才能对他有一个公正的评价。
我发现,黑客新想法的最佳来源,并非那些名字里有“计算机”三个字的理论领域,而是来自于其他创作领域。与其到“计算理论”领域寻找创意,你还不如在绘画中寻找创意。
编程语言首要的特性应该是允许动态扩展(malleable)。编程语言是用来帮助思考程序的,而不是用来表达你已经想好的程序。
我们需要的是一种可以随意涂抹、擦擦改改的语言,
真正竞争软件设计的战场是新兴领域的市场,这里还没有人建立过防御工事。只要你能做出大胆的设计,由一个人或一批人同时负责设计和实现产品,你就能在这里战胜大公司。
开发优秀软件的方法之一就是自己创业。
创业的另一个问题是赚钱的软件往往不是好玩的软件,两者的重叠度不高。
“白天工作”的意思是,你有一份为了赚钱的工作,还有一份为了爱好的工作。
有一件事情是可以借鉴的(至少可以确认),那就是应该如何学习编程。画家学习绘画的方法主要是动手去画,黑客学习编程的方法也理应如此。大多数黑客不是通过大学课程学会编程的,他们从实践中学习,13岁时就自己动手写程序了。即使上了大学,黑客学习编程依然主要通过自己写程序。
黑客通过实践学习编程,
黑客就不一样,从一开始做的就是原创性工作,根本没有他人完美的成果可以依靠。所以,黑客的出发点是原创,最终得到一个优美的结果;
创作者另一个学习的途径是通过范例。对画家来说,博物馆就是美术技巧的图书馆。几百年来,临摹大师的作品一直是传统美术教育的一部分,因为临摹迫使你仔细观察一幅画是如何完成的。
作家也是这样学习写作的。富兰克林(Benjamin Franklin)通过总结和模仿艾迪生和斯梯尔的文章,学会了写作。雷蒙·钱德勒(Raymond Chandler)也是如此学会了写作侦探小说。
同样地,黑客可以通过观看优秀的程序学会编程,不是看它们的执行结果,而是看它们的源代码。
还有一个可以借鉴绘画的地方:一幅画是逐步完成的。通常一开始是一张草图,然后再逐步填入细节。
绘画的这个创作过程就值得学习。我认为黑客也应该这样工作。你不能盼望先有一个完美的规格设计,然后再动手编程,这样想是不现实的。如果你预先承认规格设计是不完美的,在编程的时候,就可以根据需要当场修改规格,最终会有一个更好的结果。
一种好的编程语言,应该像油画颜料一样,能够使得我们很从容地改变想法。动态类型语言在这一点上就是赢家,因为你不必提前就设置好各种变量的数据类型。不过我认为,编程语言灵活性的关键还不在这里,而在于这种语言应该非常抽象。最容易修改的语言就是简短的语言。
他对作品每一部分的认真程度完全不取决于预料中会不会有人仔细看这个部分。他就像篮球巨星迈克尔·乔丹(Michael Jordan),每一球都一丝不苟,绝不降低对自己的要求。
坚持一丝不苟,就能取得优秀的成果。因为那些看不见的细节累加起来,就变得可见了。
如果你查看优秀软件的内部,就会发现那些预料中没有人会看见的部分也是优美的。我对待代码的认真程度远远超过我对待其他事情,
如果黑客是一个创作者,他从事的就不是机械性的工作,他必须具备灵感。
黑客就像画家,工作起来是有心理周期的。有时候,你有了一个令人兴奋的新项目,你会愿意为它一天工作16个小时。等过了这一阵,你又会觉得百无聊赖,对所有事情都提不起兴趣。
为了做出优秀的工作,你必须把这种心理周期考虑在内。只有这样,你才能根据不同的事情找出不同的应对方法。你有一辆手动变速的汽车,你把它开上山,有时不得不松开离合器,防止汽车熄火。同样,暂时放手有时也能防止热情熄火。对于画家和黑客这样的创作者,有些工作需要投入巨大的热情,另一些工作则是不需要很操心的日常琐事。在你厌倦的时候再去做那些比较容易的工作,这是个不错的主意。
对于编程,这实际上意味着你可以把bug留到以后解决。
就我所知,当多个画家共同创作一幅作品时,每个人画的部分都是不一样的。通常来说,大师负责画主要人物,助手们负责画次要人物和背景。但是,你肯定找不到某个部分是两个人一起画的。
我认为,这也是多人共同开发一个软件的正确模式。需要合作,但是不要“合”得过头。如果一个代码块由三四个人共同开发,就没有人真正“拥有”这块代码。最终,它就会变得像一个公用杂物间,没人管理,又脏又乱,到处堆满了冗余代码。正确的合作方法是将项目分割成严格定义的模块,每一个模块由一个人明确负责。模块与模块之间的接口经过精心设计,如果可能的话,最好把文档说明写得像编程语言规范那样清晰。
就像绘画作品一样,大多数软件是为人类用户准备的。所以,黑客必须像画家一样,时刻考虑到用户的人性需要,这样才能做出伟大的产品。你必须能够站在用户的角度思考问题,也就是说你必须学会“换位思考”。
大多数创作者都是为人类用户而创作。为了吸引用户,你必须理解用户需要什么。举例来说,几乎所有最伟大的绘画作品都是画人的,因为人类总是对自身感兴趣的。
判断一个人是否具备“换位思考”的能力有一个好方法,那就是看他怎样向没有技术背景的人解释技术问题。
软件的部分功能就是解释自身。为了写出优秀软件,你必须假定用户对你的软件基本上一无所知。你要明白,用户第一次使用你的软件的时候,不会预先做好功课,他们没有任何准备就开始用了,所以软件的使用方式最好能符合用户的直觉,别指望用户去读使用手册。
源代码也应该可以自己解释自己。
程序写出来是给人看的,附带能在机器上运行。
“换位思考”不仅是为了你的用户,也是为了你的读者。这对你是有利的,因为你也会读自己写的东西。
我们能够有把握说的就是,现在正是编程的黄金年代。
我们看到这种模式一再反复出现。一种新的媒介刚刚诞生的时候,人们热情高涨、兴奋不已,短短几代人就探索清楚了这种媒介的大部分可能性,把它的能量发挥到极致。编程目前好像就处在这个阶段。
在达·芬奇的年代,绘画并不是一件很酷的事情,达·芬奇用自己的工作推动绘画成为一种伟大的表达方式。同样,编程到底能够有多酷,取决于我们能够用这种新媒介做出怎样的工作。
“程序写出来是为了让人看懂它的算法,附带告诉计算机如何执行。”一种好的编程语言应该比英语更容易解释软件。只有在那些不太成熟、容易出现问题的地方,你才应该加上注释,提醒读者注意那里,就好像公路上只有在急转弯处才会出现警示标志一样。
3 不能说的话
翻开老照片,看到以前的样子,你会不会感到难为情?我当时真的是穿成这样吗?是的,你没看错,你就是穿成这样。我们穿衣服的时候,根本不知道自己看上去有多傻,还以为很时尚。所谓“时尚”,本质上就是自己看不见自己的样子。好比我们在地球上,却感觉不到地球在动。
要是能坐上时间机器回到过去,不管哪一个年代,有一件事都是不会改变的,那就是“祸从口出”。你一定要小心自己说的话。自以为无害的言论会给你惹来大麻烦。今天,说地球围绕太阳运转真是再平常不过了,如果换在17世纪的欧洲,这么说就大难临头了。
历史的常态似乎就是,任何一个年代的人们,都会对一些荒谬的东西深信不疑。他们的信念还很坚定,只要有人稍微表示一点怀疑,就会惹来大麻烦。
我们这个时代是否有所不同?只要读过一点历史,你就知道答案几乎确定无疑,就是“没有不同”。即使有那么一丝微小的可能,有史以来第一次,我们这个时代的所有信念都是正确的,那也是出于惊人的巧合,而不是因为我们真找到了正确的方向。
一想到现在我们言之凿凿的东西,在未来人们的眼里却是荒诞不经,怎能不令人感叹呢!如果未来有人坐着时间机器来到我们这个时代,哪些话是他小心翼翼避免说出口的?
大庭广众之下,你有没有什么观点不愿说出口?
为了防止他人复制,古代制作地图的工匠会故意在地图上画错一个小地方。如果你的地图与他的地图一样,就说明不太可能是你自己独立制作的。
与历史上别的年代一样,我们的思想几乎肯定也是一张有错误的地图。如果你也犯下与别人一样的错误,那么这个错误不太可能完全来自于你自己。这就像1972年喇叭裤刚刚开始流行,某人声称他觉得喇叭裤很时尚,你觉得这是他完全自发产生的观点吗?
未来的人们很可能会发现,他们觉得很平常的话,在我们今天这个时代都是不能说的。现在有没有伽利略这样的人和事?很可能是有的。
如果我们可以通晓未来,那么找出当代的那些表面上正确、实际上可笑的想法是一件很容易的事。但是,不可能做到这一点。幸运的是,我们可以找到一种几乎有同样效果的替代方法:回顾过去。我们可以去找那些过去被认为理所当然,如今却被认为不可思议的事情,这是用来找出我们自己正在犯下的错误的第三种方法。
过去和现在之间的变化有时候代表了一种进步。
我们可以自以为是地相信,当代人比古人更聪明、更高尚。但是,了解的历史越多,就越明白事实并非如此。古人与我们是一样的人,他们既不是更勇敢,也不是更野蛮,而是像我们一样通情达理的普通人。不管他们产生怎样的想法,都是正常人产生的想法。
记住,所谓“流行”(传统观念也是一种流行),本质上就是自己看不见自己的样子。
只有保持一定的距离才能观察到人们观念的变化,发现流行(也就是人们自以为正确的事情)到底是什么。
时间就是一种产生距离的简单方法。实际上,新的流行让旧的流行更容易被观察到,因为对比之下,旧的流行会显得很荒唐。从钟摆波动的一端望去,上一个周期的端点就显得特别遥远。
不过,想要摆脱你自己的时代的流行,需要一点自觉。没有了时间所产生的距离,你不得不自己创造距离。你不要让自己成为人群的一分子,而要尽可能地远离人群,观察正在发生的事情,特别注意那些被压制的思想观点。
你不仅要远距离观察人群,更要远距离观察你自己。
如果你想要清晰地思考,就必须远离人群。
如果自己就是潮水的一部分,怎么能看见潮流的方向呢?你只能永远保持质疑。问自己,什么话是我不能说的?为什么?
4 良好的坏习惯
只有深入了解当前的技术,黑客才能构想下一代技术。
在计算机工业的历史上,新技术往往是由外部人员开发的,而且所占的比例可能要高于内部人员。
另外两个年轻人——26岁的肯·汤普森和28岁的丹尼斯·里奇——觉得Multics过分复杂,就另起炉灶,写出了一个自己的操作系统。他们参照Multics,为它取了一个搞笑式的名字Unix[6]。
黑客是不服从管教的,这就是他们的本性。
在人们心目中,编程是非常精确、有条不紊的,这真是非常奇怪的想法。计算机确实是非常精确、有条不紊的,但是黑客的所作所为完全出于兴趣,想到哪里就做到哪里,没有明确的计划,只求开心。
在黑客世界中,有些最典型的解决问题的方法实际上与玩笑也相差不远。
Michael Rabin遇到难题的时候,会把问题重新定义成一个较简单的形式,同时一定会假想一个对手正在与他比赛谁能更快地解决问题。
5 另一条路
真的不需要一台桌面电脑,完全可以用互联网软件替代。
注: 学习HTML5。
“你的电脑”这个概念正慢慢成为过去时,取而代之的是“你的数据”。你应该可以从任何电脑上获取你的数据。或者更准确地说,在任何终端设备上获取你的数据,终端设备不一定是电脑。
由于互联网应用程序由多种软件而不是单独一个二进制文件构成,所以可以使用多种编程语言开发。
对于互联网软件,你可以使用任何你想用的语言。[6]当今,许多顶尖黑客使用的语言与C和C++大相径庭:Perl,Python,甚至还有Lisp。
对于互联网软件,没人规定只能使用某些语言开发,因为所有的硬件都控制在你手里,你想要用什么语言,就能用什么语言。不同的语言适合不同的任务,你应该根据不同场合,挑选最合适的工具。
互联网软件的另一个技术优势在于,你能再现大部分的bug。
互联网软件每时每刻都在被使用。你的代码一上线,就会经历严酷考验。bug很快就会浮出水面。
苹果公司的Mac电脑自从一问世,就在黑客之中很流行,许多黑客为它写软件。[20]你在Windows身上就很少看到这种现象,因为黑客不喜欢使用Windows。现在,善于写软件的那类人更喜欢使用Linux或者FreeBSD操作系统。
有了互联网就可以绕过Windows,直接在Unix系统上发布软件,用户通过浏览器使用。
开发互联网软件的创业公司会把与创业有关的每一件事做到极致。只用更少的人、更少的钱,就可以把软件写出来,并且开始运作。你必须打破常规、快速行动,循规蹈矩不可能成功。你完全能够在只有三个人的情况下让产品开始运营,你们唯一的办公场所就是一间公寓,里面放着一台连着ISP的服务器。我们就是这样做的。
创业公司的压力很大,不幸的是,这一点在互联网软件业也发挥到了极致。许多软件公司的开发者都有一段睡在桌子底下(或者类似经历)的日子,尤其是在初创期。令人惊恐的是,对于互联网软件来说,这样的日子没有尽头,什么都不足以阻止这种事情成为常态。对于桌面软件来说,睡桌子底下的经历经常可以告一段落,等到软件发布了,我们就都回家睡上一个星期。互联网软件永远没有收工的那一天,如果你愿意,可以一直干下去,每天忙上16个小时。而且,你能够做到这一点,意味着竞争者也能做到这一点,所以长时间工作变成了一种必需,不得不如此。因为你能做到,所以你必须做到。这简直就是逆向的帕金森定律[22]。
我们创立Viaweb时,一开始的六个月都在编写代码。与其他创业公司一样,在这个早期阶段我们的工作时间也是很长的。换作桌面软件公司,度过这个艰苦阶段之后,一切就会变得轻松了,但是当我们结束这个阶段、打开服务器迎接访问者时,才发现与后来的日子相比,第一阶段的编程简直像在度假。雅虎收购Viaweb,我们第一位的收获当然是金钱,第二位的收获就是能够卸下这些沉重的责任,让一家更大的公司去承担。
管理企业其实很简单,只要记住两点就可以了:做出用户喜欢的产品,保证开支小于收入。只要做到这两点,你就会超过大多数创业公司。随着事业的发展,你自己就能琢磨出来其他的诀窍。
幸运的是,编写一个互联网软件是非常便宜的。我们的总支出就不超过1万美元,现在应该更便宜了。
如今,开发一个互联网软件的费用比购买一把高级办公椅还要便宜。
至于如何做出用户喜欢的产品,下面是一些通用规则。从制造简洁的产品开始着手,首先要保证你自己愿意使用。然后,迅速地做出1.0版,并且不断加以改进,整个过程中密切倾听用户的反馈。
只有懂得设计的黑客,才能设计软件,不能交给对软件一知半解的设计师。如果你不打算自己动手设计和开发,那就不要创业。
其次,让我们来看看竞争。你所害怕的大概不是与你一样的黑客,而是那些像模像样,有着办公室、商业计划、销售员的公司,对不对?可是实际上,他们害怕你胜过你害怕他们,而且这一点上,他们并没有错。几个黑客搞懂如何租用办公室,或者如何雇用销售人员,要比那些公司(不管大公司还是小公司)搞懂如何正确写出软件容易得多。我在这两种地方都待过,所以知道这些。
开发互联网软件不需要得到任何人的许可,没有人能够阻止你。你不需要去申请许可证,不需要在零售店的货架上谋得一席之地,也不需要卑躬屈膝地求人家,将你的软件与操作系统捆绑在一起。你能够通过浏览器发布软件,没有人能在你和浏览网站的用户之间插上一脚。
“帕金森定律”后来成为这些表现形式的代名词,它包括很多内容,其中有一条就是“因为你必须做到,所以你能够做到”。因此,本文作者称“因为你能够做到,所以你必须做到”是逆向的帕金森定律。
6 如何创造财富
如果你想致富,应该怎么做?我认为最好的办法就是自己创业,或者加入创业公司。几百年来,这一直是致富的可靠途径。
从经济学观点看,你可以把创业想象成一个压缩过程,你的所有工作年份被压缩成了短短几年。你不再是低强度地工作四十年,而是以极限强度工作四年。在高技术领域,这种压缩的回报尤其丰厚,工作效率越高,额外报酬就越高。
下面举一个简单的例子说明这个经济学命题。如果你是一个20多岁的优秀黑客,每年的薪水大约是8万美元。这意味着,平均来看,你必须每年至少为公司带来8万美元利润,这样才能保证公司没有亏钱。但是,你的真正工作时间其实可以是公司上班时间的2倍,如果你全神贯注,每小时的产出可以提高3倍。[1]如果再把大公司里令人讨厌的中间管理层除去(他们经常以主管的身份妨碍你的工作),你的效率可以再提高2倍。还有一个可以提高效率的地方:你不用再完成强行指派给你的工作,尽可以根据自己的愿望,做出最能发挥你聪明才智的成果。假定这会把工作效率再增加三倍。将这些因子放在一起做乘法,你的工作效率将是在公司时的36倍。
如果一个优秀黑客在大公司里的身价是每年8万美元,那么一个勤奋工作、摆脱杂事干扰的聪明黑客,他的工作相当于每年新创造300万美元的价值。
这个计算是很粗糙的,有很大的误差。我不会争论这些数字是否准确,但是计算的根据是靠得住的。我没有说放大因子不多不少正好是36,但肯定是大于10的,在个别情况下甚至高达100。
如果你觉得一个程序员一年做出300万美元的利润不太可能,那么不要忘记,我们谈的是他在极限情况下可以创造多少利润。这时,他的休闲时间为0,工作强度之大足以危害到健康。
创业公司不是变魔术。它们无法改变创造财富的法则,它们只是代表了财富创造曲线远端上的一点。这里有一个守恒定律:如果你想赚100万美元,就不得不忍受相当于100万美元的痛苦。比如,你终生为邮政局工作,省下每一分工资,那也是赚到100万美元的一种方法。可是,不难想象为邮政局工作50年是何等漫长的压力。创业公司将你所有的压力压缩到三四年。承受较大的压力通常会为你带来额外的报酬,但是你还是无法逃避基本的守恒定律。如果创业那么轻松,那么所有人就都去创业了。
通过创造有价值的东西而致富,这种方法的优势不仅仅在于它是合法的
,还在于它更简单。你只需要做出别人需要的东西就可以了。
创造有价值的东西就是创造财富。你最好先搞清楚什么是财富。财富与金钱并不是同义词。[3]财富存在的时间与人类历史一样长久,甚至更长久,事实上蚂蚁也拥有财富。金钱是一种历史相对较短的发明。
财富是最基本的东西。我们需要的东西就是财富,食品、服装、住房、汽车、生活用品、外出旅行等都是财富。即使你没有钱,你也能拥有财富。如果有一台魔法机器,能够按照你的命令变出汽车,为你洗衣做饭,提供其他你想要的东西,那么你就不需要钱了。
如果财富真的这么重要,为什么大家都把挣钱挂在嘴边呢?部分原因是,金钱是财富的一种简便的表达方式:金钱有点像流动的财富,两者往往可以互相转化。
最可能明白财富能被创造出来的人就是那些善于制作东西的人,也就是手工艺人。他们做出来的东西直接放在商店里卖。但是,随着工业化时代的来临,手工艺人越来越少。目前还存在的最大的手工艺人群体就是程序员。
注: 作家也是。
程序员坐在电脑前就能创造财富。优秀软件本身就是一件有价值的东西。
你输入的文字符号就是一件完整的制成品。
公司就是许多人聚在一起创造财富的地方,能够制造更多人们需要的东西。当然,有些雇员(比如收发室和人事部的员工)并不直接参与制造过程,但是程序员不然。他们真正地面对产品,一行行地写代码把产品做出来。所以,在程序员看来,事情再明显不过,财富就是被做出来的,而不是某个想象出来的神秘人物分发的大饼。
另一件程序员看来显而易见的事情就是创造财富的速率存在巨大的差异。Viaweb的一个程序员有着惊人的生产力,我记得看着他工作了整整一天,拿出来的产品估计使得公司的市场价值增加了几十万美元。一个优秀程序员连续工作几个星期可能可以创造价值100万美元的财富。同样的时间内,一个平庸的程序员不仅无法创造财富,甚至还可能减少财富(比如引入了bug)。
我们这个世界,你向下沉沦或者向上奋进都取决于你自己,不能把原因推给外界。许许多多不创造任何财富的人——比如本科生、记者和政客——一听到最富有的5%人口占有全社会一半以上的财富,往往会认定这是不公平的。一个有经验的程序员很可能也认为这是不公平的。因为最顶尖的5%的程序员写出了全世界99%的优秀软件。
黑客经常开发开源软件让所有人免费使用,以此把自己的工作捐献给社会。FreeBSD操作系统使我变得更富有。我自己的电脑就在使用FreeBSD,雅虎公司所有的服务器都是如此。
公司一切行为的目的都是盈利,从而生存下去。创造财富是大多数公司盈利的手段。
财富就意味着人们需要的东西,那么把商品送到顾客手中也是人们需要的。
几乎所有情况下,公司的存在目的就是满足人们的某种需要。
一个大学毕业生总是想“我需要一份工作”,别人也是这么对他说的,好像变成某个组织的成员是一件多么重要的事情。更直接的表达方式应该是“你需要去做一些人们需要的东西”。即使不加入公司,你也能做到。公司不过是一群人在一起工作,共同做出某种人们需要的东西。真正重要的是做出人们需要的东西,而不是加入某个公司。
工作就是在一个组织中,与许多人共同合作,做出某种人们需要的东西。
在某些行业,那些真正拼命工作的员工能够创造出比普通员工多十倍甚至百倍的财富。比如,程序员全力开发一个崭新的软件,要比让他常规地维护和更新一个现有的软件能创造更多价值,这等于开辟了一个新的收入来源。
如果一家公司真正能够按照贡献付薪,它将取得巨大成功。许多雇员会更努力地工作。更重要的是,这样一家公司将吸引那些工作特别努力的人,从而超越竞争对手。
但公司不可能对每个人都像销售员那样付薪。销售员是单独工作的,大多数雇员则是集体工作。
要致富,你需要两样东西:可测量性和可放大性。你的职位产生的业绩,应该是可测量的,否则你做得再多,也不会得到更多的报酬。此外,你还必须有可放大性,也就是说你做出的决定能够产生巨大的效应。
在电影中扮演主角就是一种同时具备可测量性和可放大性的工作。你的表现可以用电影的总收入测量,同时也决定了电影的成败,所以也就具备了可放大性。
我认为,任何一个通过自身努力而致富的个人,在他们身上应该都能同时发现可测量性和可放大性。我能想到的例子就有CEO、电影明星、基金经理、专业运动员。有一个办法可以发现是否存在可放大性,那就是看失败的可能性。因为收入和风险是对称的,所以如果有巨大的获利可能,就必然存在巨大的失败可能。CEO、电影明星、基金经理、运动员的头顶都悬着一把宝剑,随时可能掉下来。一旦他们搞砸了,他们就完了。如果你有一个令你感到安全的工作,你是不会致富的,因为没有危险,就几乎等于没有可放大性。
但是,如果你想同时具备可测量性和可放大性,不一定非当上CEO或电影明星不可。你只需要成为某个攻克难题的小团体的一部分就可以了。
只有表演或写作这样的特殊工作,你才会一个人单干。
创业公司不仅仅是十个人的团队,而且是十个同类人的团队。
乔布斯曾经说过,创业的成败取决于最早加入公司的那十个人。我基本同意这个观点,虽然我觉得真正决定成败的其实只是前五人。小团队的优势不在于它本身的小,而在于你可以选择成员。我们不需要小村庄的那种“小”,而需要全明星第一阵容的那种“小”。
一个非常能干的人待在大公司里可能对他本人是一件很糟的事情,因为他的表现被其他不能干的人拖累了。
一个非常能干而且在乎回报的人,通常在同类人组成的小团队中会有更出色的表现,自己也会感到更满意。
什么是技术?技术就是某种手段,就是我们做事的方式。如果你发现了一种做事的新方式,它的经济价值就取决于有多少人使用这种新方式。技术就是钓鱼的鱼竿,而不是那条鱼。这就是创业公司与餐馆或理发店的区别。餐馆煎鸡蛋,理发店剪头发,每次只能为一个顾客提供服务,但是如果你解决了一个热门的技术难题,别人都会使用你的解决方案。这就是可放大性。
回顾历史,大多数因为创造财富而发财的人都是通过开发新技术而实现的。你不可能通过煎鸡蛋或剪头发而致富,因为使用你的服务的人是有限的。
就算看上去与技术无关的商业类公司,其实也是解决技术问题的。比如,麦当劳是快餐连锁集团,它的发展依靠的就是设计出了一个快餐服务体系,可以复制到全世界每一个角落。每一家麦当劳连锁店都必须严格遵守操作规定,这使得它就像软件一样运作。所以,麦当劳其实也符合“一次开发,普遍适用”的模式。
选择公司要解决什么问题应该以问题的难度作为指引,而且此后的各种决策都应该以此为原则。
最好的防御就是进攻。如果你开发出来的技术是竞争对手难于复制的,那就够了,你不需要依靠其他防御手段了。一开始就选择较难的问题,此后的各种决策都选择较难的那个选项。
创业是有一些潜规则的,其中一条就是很多事情由不得你。比如,你无法决定到底付出多少。你只想更勤奋工作2到3倍,从而得到相应的回报。
另一条潜规则是,创业的付出与回报虽然总体上是成比例的,但是在个体上是不成比例的。
对于个人来说,付出与回报之间存在一个很随机的放大因子。你努力30倍,最后得到的回报在现实中并不是30倍,而是0到1000倍之间的一个随机数。假定所有创业者都努力30倍,最后他们得到的总体平均回报是30倍,但中位数却是0。
创业公司如同蚊子,往往只有两种结局,要么赢得一切,要么彻底消失。你通常不知道自己会是哪一个结局,只有等到最后一刻才会明了。
保险的做法就是在早期卖掉自己的创业公司,放弃未来发展壮大(但风险也随之增大)的机会,只求数量较少但是更有把握的回报。
如果你的公司有机会被收购,那将是不错的选择。管理一家公司与创立一家公司是不同的两件事。当情况基本稳定下来以后,不妨让大公司来接手。
被收购本身就是一门学问,我们在Viaweb花了很多时间研究它。
潜在的买家会尽可能地拖延收购。收购这件事最难的地方就是让买方真正拿出钱。大多数时候,促成买方掏钱的最好办法不是让买家看到有获利的可能,而是让他们感到失去机会的恐惧。对于买家来说,最强的收购动机就是看到竞争对手可能收购你。我们发现这会使得CEO们连夜行动。次强的动机则是让他们担心如果现在不买你,你的高速成长将使得未来的收购耗资巨大,甚至你本身可能变成一个他们的竞争对手。
在这两种收购动机中,归根结底的因素都是用户数量。你以为买家在收购前会做很多研究,搞清楚你的公司到底值多少钱,其实根本不是这么回事。他们真正在意的只是你拥有的用户数量。
事实上,买家假定用户知道谁有最好的技术。虽然这听上去很蠢,但是用户是你证明自己创造了财富的唯一证据。财富就是人们需要的东西,如果没人使用你的软件,可能不是因为你的推广活动很失败,而是因为你没有做出人们需要的东西。
把用户数量当作一个测试指标。
你必须时刻牢记的最基本的原则就是,创造人们需要的东西,也就是创造财富。如果你想通过创造财富使得自己致富,那么你必须知道人们需要什么。
还记得从经济学观点看什么是创业公司吗?简单说,就是可以让人更快速工作的地方。你不再是慢慢地积累50年的普通工资,而是要尽快地将这笔钱赚到手。
只要懂得藏富于民,国家就会变得强大。让书呆子保住他们的血汗钱,你就会无敌于天下。
7 关注贫富分化
顶级的国际象棋大师与普通的象棋俱乐部成员下一万盘棋,一盘都不会输。
与下棋、画画、写小说一样,赚钱也是一种专门的技能。
财富从何而来?人类创造出来的。
如果你想要更多的财富,自己生产就可以了。
一个人的价值真的等于我们100个人的价值吗?你想一想,一个篮球队会同意用一个运动员交换100个普通人吗?
人与人之间的差别并不是那么稳定的线性关系。也许CEO和运动员的技能和决心只比普通人高出10倍(倍数不重要),但是人与人之间就是存在着重大差别。
在自由竞争的市场经济中,价格由买家的需求决定。
当我们讨论“收入分配不公平”时,我们还要问问收入从何而来,[8]收入背后的财富到底是谁生产出来的。
技术的发展是否加剧了贫富分化?首先,技术肯定加剧了有技术者与无技术者之间的生产效率差异,毕竟这就是技术进步的目的。一个勤劳的农民使用拖拉机比使用马可以多耕六倍的田。但是,前提条件是他必须掌握如何使用新技术。
我自己就亲眼目睹过技术的这种杠杆效应不断扩大。高中时,我通过割草和在冰淇淋店当服务员赚钱,它们是我能找到的仅有的工作。现在的高中生可以通过开发软件或制作网站赚钱。不过,只有少数高中生具备这种能力,其余的人还是只能去冰淇淋店当服务员。
技术无法使其变得更便宜的唯一东西,就是品牌。
富人日常做的事情也和普通人差不多。无所事事的闲适生活早就成为罕见情况了。如今,确实有很多人非常有钱,完全不必再去工作,他们之所以还在工作,不是因为感到社会压力,而是因为无所事事使人感到孤独和消沉。
现代社会的收入差距扩大是一种健康的信号。技术使得生产率的差异加速扩大,如果这种扩大没有反映在收入上面,只有三种可能的解释:(a)技术革新停顿了;(b)那些创造大部分财富的人停止工作了;(c)创造财富的人没有获得报酬。
如果得不到报酬,人们是否愿意创造财富?唯一的可能就是,工作必须能提供乐趣。
一个社会需要有富人,这主要不是因为你需要富人的支出创造就业机会,而是因为他们在致富过程做出的事情。
9 设计者的品味
不管每个人的工作是什么,他们内心里都有一种愿望——把自己的工作做好。
就像别的工作一样,只要你不断地从事设计工作,你就会做得越来越好。你的品味会出现变化,你会像别人一样有所提高。
好设计是简单的设计。
在写作上,这种说法意味着只说必须要说的话,并且说得简短。
好设计是永不过时的设计。只要没有错误,每一个数学证明都是永不过时的。
如果解决方法是丑陋的,那就肯定还有更好的解决方法,只是还没有发现而已。
以永不过时作为目标是一种帮助自己找到最佳答案的方法:如果你不愿别人的答案取代你的答案,你就只好自己做出最佳答案。某些大师的作品太过杰出,永不过时,使得后人几乎难以在该领域立足。自从16世纪出现了德国雕刻大师杜勒(Dürer),后世的雕刻家都因为自己的作品被拿来与他的作品作比较而苦不堪言。
如果一件东西长盛不衰,那么它的吸引力一定来自本身的魅力,而不是来自风潮的影响。
如果你希望自己的作品对未来的人们有吸引力,方法之一就是让你的作品对上几代人有吸引力。我们很难猜想未来是什么样子,但是可以肯定,未来的人们不会在乎今天流行的风潮,这一点与上几代人是相同的。所以,如果你的作品对今天的人们以及1500年的人都有吸引力,那么它极有可能也会吸引2500年的人。
好设计是解决主要问题的设计。
历史上,物理学的主要难题曾经一度是如何诠释经典著作,后来逐渐变成对可观测到的行为进行预测,这种转变使得物理学的发展速度大大加快。
好设计是启发性的设计。英国女作家简·奥斯汀的作品几乎不带有任何描述。她不告诉读者每件东西看上去是什么样子,只是把故事讲得非常生动,让读者自己把一切都想象出来。同样,绘画作品也分为描述性绘画和启发性绘画,后者往往比前者更引人入胜。每个人看到《蒙娜丽莎》都有自己的理解。
在建筑学和设计学中,这条原则意味着,一幢建筑或一个物品应该允许你按照自己的愿望来使用。举例来说,一幢好的建筑物应该可以充当平台,让你想怎么布置就可以怎么布置,过上自己想过的家庭生活,而不是使得你像执行程序一样只能过上建筑师为你安排的生活。
在软件业中,这条原则意味着,你应该为用户提供一些基本模块,使得他们可以随心所欲自由组合,就像玩乐高积木那样。
幽默一定程度上反映了力量。幽默感是强壮的一种表现,
强壮的标志(或者至少是特点)就是轻松面对自己的人生。充满自信的人常常像燕子一样,以一种居高临下的姿态轻盈地看待周围的一切,比如希区柯克拍摄的电影、16世纪画家布勒哲尔(Bruegel)的绘画(甚至莎士比亚也是一个这方面的例子)。
好设计是艰苦的设计。如果观察那些做出伟大作品的人,你会发现他们的共同点就是工作得非常艰苦。如果你工作得不艰苦,你可能正在浪费时间。
困难的问题需要艰巨的付出才能解决,高难度的数学证明需要结构非常精细的解决方法(它们往往做起来很有趣),工程学也是如此。
在绘画上,肖像画通常占据最高地位。这不是偶然的,原因不仅是面部肖像比其他题材更能打动人,还因为我们太擅长观察脸,所以肖像画家不得不加倍努力才能达到我们的要求。如果画的是树,树枝画偏了五度也不会有人发现。但是,如果你把别人的眼睛画偏了五度,人们一眼就能看出来。
好设计是看似容易的设计。
让人觉得他轻轻松松就获胜了,优秀设计师也是如此,他们的工作看上去很容易。大多数时候,这是一种错觉。作家的文章读起来流畅自如,但是背后其实经过了反复修改。
白描其实是最难画的视觉媒介,因为它们要求几近完美的再现。用数学语言说,线条属于闭合解(closed-form solution),水平不够的艺术家没有办法直接解决问题,只能通过不断逼近来求解。
在大多数领域,看上去容易的事情,背后都需要大量的练习。练习的作用也许是训练你把刻意为之的事情变成一种自觉的行为。有时,我们的训练只是为了让身体养成下意识的反应。优秀钢琴家弹奏名曲可以不经过大脑直接完成,艺术家也是这样,熟练以后,脑海中的艺术形象会自动从手上流淌出来,仿佛有人在一旁为他打节奏一样。
人们有时会说自己有了“状态”,我的理解是,他们这时可以控制自己的脊髓。脊髓是更本能的反应,面对难题时,它能释放你的直觉。
好设计是对称的设计。对称也许只是简洁性的一种表现,但是它十分重要,值得单独列为一点。自然界的对称大量存在,这就说明了对称的重要性。
在写作中,你会发现对称无处不在,短语、句子、小说的情节都是如此。音乐和美术也大量使用对称。
在数学和工程学中,递归尤其有用。归纳式证明方法既简洁又美妙。在软件中,能用递归解决的问题通常代表已经找到了最佳解法。巴黎的埃菲尔铁塔如此引人注目,部分原因就是它的外形是递归的,大塔上面还有小塔(图9-2)。
好设计是模仿大自然的设计。我不是说模仿大自然这种行为本身有多么好,而是说大自然在长期的演化中已经解决了很多设计问题。
写实的目的不是为了给生活留下一模一样的记录,而是为你的思想提供一个咀嚼点:你的眼睛看着某样东西,你的手就代表你的思想,画出一些比较有意思的内容。
现在的计算机已经很强大了,不仅能模拟出大自然的环境,还能模拟大自然发展演变的结果。遗传算法可能会创造出正常条件下难以设计的复杂事物。
好设计是一种再设计。很少有人一次就把事情做对。专家的做法是先完成一个早期原型,然后提出修改计划,最后把早期原型扔掉。
扔掉早期原型是需要信心的,你必须有本事看出什么地方还可以改进。举例来说,刚刚开始学画的人往往不愿意重画画错的地方。他们觉得能画成现在这样已经很不错了,如果重画某些部分,结果可能还不如现在。所以,他们就说服自己,我的画已经过得去了,没准别人也会这么看。
这想法很危险。你应该培养对自己的不满。达·芬奇为了把一根线画对,经常要画五六次。
建筑师莱特设计的古根海姆博物馆,最早的时候,右半边有点像古代的塔庙(ziggurat),他后来把它倒过来,就成了现在的样子。
犯错误是很正常的事情。你不要把犯错看成灾难,要勇于承认、勇于改正。达·芬奇实际上重新发明了素描这种艺术形式,把它当作一种探索更多可能的方式。开源软件因为公开承认自己会有bug,反而使得代码的bug比较少。
做修改的时候,有一个合适的工具会使得改动更容易。
好设计是能够复制的设计。我们对待复制的态度经常是一个否定之否定的过程。刚入门的新手不知不觉地模仿他人,逐渐熟练之后才开始创作原创性作品。最后他会意识到,把事情做对比原创更重要。
等到你逐渐对一件事产生热情的时候,就不会满足于模仿了。你的品味就进入了第二阶段,开始自觉地进行原创。
最伟大的大师最终会达到一种超脱自我的境界。
米开朗基罗并没想过要树立米开朗基罗风格,他只是想画好作品,结果不由自主地创造出了米开朗基罗风格。
你最后发展出来的风格是自然而然形成的。
唯一达到“奇特”的方法,就是追求做出好作品,完成之后再回过头看。
好设计是成批出现的。15世纪住在佛罗伦萨的伟大艺术家有建筑师布鲁内莱斯基、画家吉贝尔蒂、雕塑家多纳泰洛、画家马萨乔、画家菲利普里皮、画家弗拉安吉利科、雕塑家韦罗基奥、画家波提切利、达·芬奇和米开朗基罗。当时,米兰也是同等的大城市,请问你能说出15世纪米兰城有什么伟大艺术家吗?
今天,生活在美国的人口大概是15世纪佛罗伦萨的一千倍。那么按照比例推算,在我们之中存在着一千个达·芬奇和一千个米开朗基罗。如果这种推算成立,我们应该每天都看到令人惊叹的艺术奇迹。
推动人才成批涌现的最大因素就是,让有天赋的人聚在一起,共同解决某个难题。互相激励比天赋更重要,达·芬奇之所以成为达·芬奇,主要原因不仅仅是他的天赋,更重要的是他生活在当时的佛罗伦萨,而不是米兰。
在历史的任何时刻都有一些热点项目,一些团体在这些项目上做出伟大的成绩。如果你远离这些中心,几乎不可能单靠自己就取得伟大成果。某种程度上,你个人最多可以对趋势产生一定的影响,但是你不可能决定趋势,实际上是趋势决定了你。
好设计常常是大胆的设计。
爱因斯坦的相对论触犯了许多同时代的物理学家,许多年后还没有被完全接受,法国物理学家直到20世纪50年代才接受相对论。
今天的实验性错误就是明天的新理论。如果你想做出伟大的新成果,那就不能对常识与真理不相吻合之处视而不见,反而应该特别注意才对。
伟大成果的出现常常来源于某人看到一样东西后,心想我能做得比这更好。
单单是无法容忍丑陋的东西还不够,只有对这个领域非常熟悉,你才可能发现哪些地方可以动手改进。你必须锻炼自己。只有在成为某个领域的专家之后,你才会听到心里有一个细微的声音说:“这样解决太糟糕了!一定有更好的选择。”不要忽视这种声音,要培育它们。优秀作品的秘诀就是:非常严格的品味,再加上实现这种品味的能力。
10 编程语言解析
计算机刚发明的时候,所有程序就是一条条机器语言的命令。
所谓“编译器”,本身就是一个程序,作用是将简便方式书写的程序(就像上面这一行命令)转变为硬件可以理解的语言。
这种简便方式书写的程序所使用的语言就叫做高级语言。它让你能够使用更强大的命令开发程序,比如现在你就有了“重复n次操作”的命令,不再仅限于只能做简单的“两个数相加”。
高级语言还有一个优点,它使得程序更具有可移植性。
编译器处理的高级语言代码又叫做源码。它经过翻译以后产生的机器码就叫做目标码。
绝大多数程序员在绝大多数时候都使用高级语言编程。
程序员的时间要比计算机的时间昂贵得多,后者已经变得很便宜了,
Fortran、Lisp、Cobol、Basic、C、Pascal、Smalltalk、C++、Java、Perl和Python,全都是高级语言。它们只是比较出名的几种而已。现在的高级语言大概有几百种之多。不同机器语言的指令集基本相同,但是高级语言就不一样,它们开发程序的模式差别相当大。
如果你长期使用某种语言,你就会慢慢按照这种语言的思维模式进行思考。所以,后来当你遇到其他任何一种有重大差异的语言,即使那种语言本身并没有任何不对的地方,你也会觉得它极其难用。缺乏经验的程序员对于各种语言优缺点的判断经常被这种心态误导。
各种语言简直是天差地别,比如Fortran I和最新版的Perl就是两种完全不同的语言,而早期版的Perl和最新版的Perl之间的差别也大得惊人。
语言之间确实有差别,但是很难确定地说哪一种语言是最好的。这个领域依然还在快速发展。
C语言是一种低层次语言,很接近硬件,几乎堪称可移植的汇编语言,而Lisp语言的层次则是相当高。
如果你非常关注运行速度,那么最好使用接近机器的语言。大多数操作系统都是用C语言写的,这并非偶然。不过,硬件的运行速度越来越快了,所以使用C这样的低层次语言开发应用程序的必要性正在不断减少,但是大家似乎还是要求操作系统越快越好。
语言设计者之间的最大分歧也许就在于,有些人认为编程语言应该防止程序员干蠢事,另一些人则认为程序员应该可以用编程语言干一切他们想干的事。Java语言是前一个阵营的代表,Perl语言则是后一个阵营的代表。(美国国防部很看中Java也就不足为奇了。)
在静态类型语言中,写代码时必须知道每个变量的类型。而在动态类型语言中,随便什么时候,你都可以把变量设为任意类型的值。
你应该使用允许你面向对象编程的语言。至于你最后到底用不用则是另外一个问题了。
现在好像每隔一段日子就能听到一种新出现的语言。乔纳森·埃里克森把这种现象称为“编程语言的文艺复兴”。人们有时还会用另一个说法,即“编程语言的战争”。这并不矛盾,文艺复兴时期就是存在很多战争的。
11 一百年后的编程语言
很难预测一百年后的人类生活,只有少数几件事是可以确定的。那时,汽车将具备低空飞行能力,城市规划的法规将放宽,大楼可以造到几百层,大街上一天到晚看不见太阳,女性个个都学过防身术。本文只想讨论其中的一个细节:一百年后,人们使用什么语言开发软件?
为什么这个问题值得思考?原因不是我们最终会用上这些语言,而是幸运的话,我们从现在开始就能用上这些语言。
我认为,编程语言就像生物物种一样,存在一个进化的脉络,许许多多分支最终都会成为进化的死胡同。这种现象已经发生了。Cobol语言曾经流行一时,但是现在看来没有任何后续语言继承它的思想。它就像尼安德特人[1]一样,进化之路已经走到了尽头。
编程语言存在一个进化的脉络,从而引导读者思考,在整个进化过程中,某一种语言的位置到底在哪里?
编程语言之所以可能出现聚合,一个原因是它的概率空间[3]比较小,另一个原因是它的突变不是随机的。语言的设计者们总是有意识地借鉴其他语言的设计思想。
对于语言设计者来说,认清编程语言的进化路径特别有用,因为这样就可以照着样子设计语言了。这时,认清进化的主干就不仅有助于识别现存的优秀语言,还可以把它当作设计语言的指南。
任何一种编程语言都可以分成两大组成部分:基本运算符的集合(扮演公理的角色)以及除运算符以外的其他部分(原则上,这个部分可以用基本运算符表达出来)。
我认为,基本运算符是一种语言能否长期存在的最重要因素。其他因素都不是决定性的。这有点像买房子的时候你应该先考虑地理位置。别的地方将来出问题都有办法弥补,但是地理位置是没法变的。
慎重选择公理还不够,还必须控制它的规模。数学家总是觉得公理越少越好,我觉得他们说到了点子上。
你仔细审视一种语言的内核,考虑哪些部分可以被摒弃,这至少也是一种很有用的训练。在长期的职业生涯中,我发现冗余的代码会导致更多冗余的代码,不仅软件如此,而且像我这样性格懒散的人,我发现在床底下和房间的角落里这个命题也成立,一件垃圾会产生更多的垃圾。
我的判断是,那些内核最小、最干净的编程语言才会存在于进化的主干上。一种语言的内核设计得越小、越干净,它的生命力就越顽强。
无论一百年后的计算机是什么样子,我们基本上可以断定它们的运行速度一定会快得多。如果摩尔定律依然成立,一百年后计算机的运行速度将是现在的74乘以10的18次方倍(准确地说是73 786 976 294 838 206 464倍)。真是让人难以想象。不过实际上更现实的预测并不是速度会提高这么多,而是摩尔定律最终将不成立。不管是什么东西,如果每18个月就增长一倍,那么最后很可能会达到极限。但那时的计算机比现在快得多大概是毫无疑问的。即使最后只是略微快了100万倍,也将实质性地改变编程的基本规则。
随着技术的发展,每一代人都在做上一代人觉得很浪费的事情。30年前的人要是看到我们今天如此随意地使用长途电话,一定会感到震惊。100年前的人要是看到一个普通的包裹竟然也能享受一天内从波士顿发件、途经孟菲斯、抵达纽约的待遇,恐怕就要更震惊了。
我已经预测了,一旦未来硬件的性能大幅提高将会发生什么事。新增加的运算能力都会被糟蹋掉。
浪费可以分成好的浪费和坏的浪费。我感兴趣的是好的浪费,即用更多的钱得到更简单的设计。所以,问题就变成了如何才能充分利用新硬件更强大的性能最有利地“浪费”它们?
设计编程语言的时候,我们应该有意识地问自己,什么时候可以放弃一些性能,换来一点点便利性的提高。
论文就是你写一篇文章,试着搞清楚某件事。软件也是如此。我觉得一些最好的软件就像论文一样,也就是说,当作者真正开始动手写这些软件的时候,他们其实不知道最后会写出什么结果。
过去10年最激动人心的趋势之一就是开源语言的崛起,比如Perl、Python和Ruby。
新语言更多地以开源项目的形式出现,而不是以研究性项目的形式出现。这是语言的一种发展趋势。
一百年后的物理学基本上不可能预测。但是计算机语言不一样,现在就动手设计一种一百年后可以吸引使用者的新语言,这在理论上似乎是可能的。
设计新语言的方法之一就是直接写下你想写的程序,不管编译器是否存在,也不管有没有支持它的硬件。这就是假设存在无限的资源供你支配。不管是今天还是一百年后,这样的假设好像都是有道理的。
你应该写什么程序?随便什么,只要能让你最省力地写出来就行。但是要注意,这必须是在你的思维没有被当前使用的编程语言影响的情况下。这种影响无处不在,必须很努力才能克服。
设计语言的正确做法就变成了,看着一段程序,然后问自己是不是能把它写得更短一点?
12 拒绝平庸
如果你想当一个黑客,应该学习哪些语言。他建议从Python和Java入手,因为它们比较容易学。想当高级一点的黑客,还应该学习C和Perl。前者用来对付Unix系统,后者用来系统管理和开发CGI脚本。最后,真正非常严肃地把黑客作为人生目标的人,应该考虑学习Lisp:
Lisp很值得学习。你掌握它以后,会感到它给你带来的极大启发。这会大大提高你的编程水平,使你成为一个更好的程序员。尽管在实际工作中极少会用到Lisp。
在讨论学习拉丁语有何价值时,你往往也会听到这一类的话。拉丁语无助于你找工作(也许古典文学教授的工作除外),但是它可以训练你的思维,帮助你更好地运用母语(比如英语)进行写作。
但是且慢,拉丁语的比喻并不完全适合Lisp语言。拉丁语无助于你找工作的原因是因为没有人说拉丁语。如果你用它写作,没有人能看懂。但是,Lisp是一种计算机语言,无论我们程序员使用哪一种语言与计算机交谈,它都能听懂。
在不考虑其他情况的条件下,某家公司的软件更快更好用,就会把竞争者赶出这个市场。一旦你开始创业,你就会更深切地感受到这一点。一般情况是,创业公司要么赢得一切,要么彻底失败。你要么成为富翁,要么一无所获。创业的时候,如果你选择了错误的技术,竞争对手就会一举打败你。
选择使用哪一种技术的时候,你不能考虑别人的做法,只能考虑什么样的技术能最好地完成工作。
大公司每年平均成长大约10%。所以,如果你掌管一家大公司,只要每件事都做到大公司的平均水准,你就能得到大公司的平均结果,也就是每年成长大约10%。
如果你掌管创业公司,当然也可以这样。你把每件事都做到平均水准,就能得到平均结果。问题在于,小公司的平均结果就意味着关门倒闭。创业公司的生存率远低于50%。所以,如果你掌管创业公司,最好做一些独特的事情,否则就会有麻烦。
10年前,开发桌面软件就意味着要使用C语言。但是,对于互联网软件,你能使用任何你想用的语言。
如果选择哪种语言都行,你到底使用哪一种语言?我们选择Lisp。
Lisp语言真的非常合适快速开发软件,而且我们的软件运行在服务器端,你一写完代码就能发布出去,所以这又进一步放大了快速开发的效果。
Lisp是一种抽象层次非常高的语言,
商场如战场,对手摸不透你,你的胜算就增加了。
在Viaweb创业期间我从来没有公开谈论过Lisp语言。我们对新闻媒体闭口不谈Lisp,如果你在我们的网站上搜索Lisp,只会发现我在个人介绍中提到过两次,那是我写的两本关于Lisp的书。这是故意的,创业公司对竞争对手应该越保密越好。如果他们不知道(或者不关心)我们的软件用什么语言开发,我就要把这个秘密保持下去。
最了解我们技术的人就是客户。他们不关心Viaweb用什么语言开发,但是发现它真的很好用。
编程语言的编程能力有差异。
今天的大多数程序员通常情况下都不会想用机器语言编程,而是使用一种高级语言,然后再让编译器帮你把它翻译成机器语言。这种观念甚至已经移植到了硬件,从20世纪80年代开始,硬件的指令集都是针对编译器而不是针对程序员设计的。
到了一定年龄之后,程序员极少主动更换自己的编程语言。不管习惯使用的是哪一种语言,他们往往认为这种语言已经足够好了。
通过归纳法我们就会知道,唯一洞悉所有语言优劣的人必然是懂得最强大的那种语言的人。(这大概就是埃里克·雷蒙德所说的Lisp语言使你成为一个更好的程序员的意思。)
Lisp的宏是独一无二的。信不信由你,Lisp宏的作用与括号有关。Lisp语言的设计者大量使用括号并不是为了标新立异。
Lisp代码由Lisp数据对象构成。
表面上,一个老年人拄着拐杖蹒跚而行,你不要只是看看而已,他背后可能有更多的故事值得了解,你应该想得更深一些。
我写这篇文章的目的不是想改变任何人的观点,而是想让那些有兴趣学习Lisp语言的人放心,他们知道Lisp是一种强大的语言,但是担心使用者太少,学会了也没什么用。我想让他们明白,在商业竞争中使用Lisp语言就会带来优势。
技术的变化速度通常是很快的。但是,编程语言不一样,与其说它是技术,还不如说是程序员的思考模式。编程语言是技术和宗教的混合物。
如果你为创业公司工作,那么这里有一个评估竞争对手的妙招——关注他们的招聘职位。
如果是招聘C++或Java程序员的公司,对你也不会构成威胁。如果他们招聘Perl或Python程序员,就稍微有点威胁了。至少这听起来像一家技术公司,并且由黑客控制。如果我有幸见到一家招聘Lisp黑客的公司,就会真的感到如临大敌。
13 书呆子的复仇
在黑客圈子里,Perl被公认比Java酷得多。黑客社区网站Slashdot就是用Perl开发的。
还有一种更新的语言叫做Python,它的使用者往往看不起Perl。另一些人则认为Ruby语言是取代Python的最佳选择。
当你按照Java、Perl、Python、Ruby这样的顺序观察这些语言,你会发现一个有趣的结果。至少,如果你是一个Lisp黑客,你就看得出来,排在越后面的语言越像Lisp。Python语言模仿Lisp,甚至把许多Lisp黑客认为属于设计错误的功能也一起模仿了。至于Ruby语言,如果回到1975年,你声称它是一种有着自己句法的Lisp方言,没有人会提出反对意见。编程语言现在的发展不过刚刚赶上1958年Lisp语言的水平。
1958年,约翰·麦卡锡第一个提出了Lisp语言。我认为,当前最流行的编程语言不过只是实现了他在1958年的想法而已。
这种语言本质上不是一种技术,而是数学。数学是不会过时的。
Lisp语言是无意中从纯理论发展为编程语言的,而Fortran从一开始就是作为编程语言设计出来的。但是,今天我们把Lisp看成高级语言,而把Fortran看成一种相当低层次的语言。
许多项目是无所谓选择哪一种编程语言,反正不同的语言都能完成工作。一般来说,条件越苛刻的项目,强大的编程语言就越能发挥作用。但是,无数的项目根本没有苛刻条件的限制。大多数的编程任务可能只要写一些很小“胶水程序”,然后再把这些小程序连起来就行了。你可以用自己熟悉的编程语言或者用对于特定项目来说有着最强大函数库的语言来写这些“胶水程序”。如果你只是需要在Windows应用程序之间传递数据,使用Visual Basic照样能达到目的。
Lisp的最大优势体现在编程任务的另一端,就是在激烈竞争的条件下开发那些解决困难问题的复杂程序。
ITA的软件的核心是一个20万行的Common Lisp程序,它的搜索能力比竞争对手高出许多个数量级。
如果你无法找到10个Lisp黑客,那么你可能选错了创立软件公司的城市。
事实上,选择更强大的编程语言会减少所需要的开发人员数量。因为:(a)如果你使用的语言很强大,可能会减少一些编程的工作量,也就不需要那么多黑客了;(b)使用更高级语言的黑客可能比别的程序员更聪明。
如果你创业的话,千万不要为了取悦风险投资商或潜在并购方而设计你的产品。让用户感到满意才是你的设计方向。只要赢得用户,其他事情就会接踵而来。如果没有用户,谁会关心你选择的“正统”技术是多么令人放心。
衡量语言的编程能力的最简单方法可能就是看代码数量。所谓高级语言,就是能够提供更强大抽象能力的语言,从某种意义上,就像能够提供更大的砖头,所以砌墙的时候用到的砖头数量就变少了。因此,语言的编程能力越强大,写出来的程序就越短(当然不是指字符数量,而是指独立的语法单位)。
如果使用Lisp语言,程序能变得多短?以Lisp和C的比较为例,我听到的大多数说法是C代码的长度是Lisp的7倍到10倍。
一种出色的工具到了真正优秀的黑客手里,可以发挥出更大的威力。
总之,根据上面的这个数字,如果你与ITA竞争,而且你使用C语言开发软件,那么ITA的开发速度将比你快20倍。如果你需要一年时间实现某个功能,它只需要不到三星期。反过来说,如果ITA开发某个新功能用了三个月,那么你需要五年才能做出来。
程序员使用某种语言能做到的事情是有极限的。
在一个高度竞争的市场中,即使开发速度只相差两三倍,也足以使得你永远处在落后的位置。
由于选择了不当的编程语言而导致项目失败的可能性,是你的经理不愿意考虑的问题。事实上大部分的经理都这样。因为你知道,总的来说,你的经理其实不关心公司是否真的能获得成功,他真正关心的是不承担决策失败的责任。所以对他个人来说,最安全的做法就是跟随大多数人的选择。
技术本来就应该是尖端的。
编程语言的所谓“业界最佳实践”,实际上不会让你变成最佳,只会让你变得很平常。如果你选择的编程语言使得你开发软件的速度只有(选择更激进技术的)对手的几分之一,那么“最佳实践”真的起错了名字。
事实上,这是我用自己的经历换来的。第一,不同语言的编程能力不一样。第二,大多数经理故意忽视第一点。
如果你想在软件业获得成功,就使用你知道的最强大的语言,用它解决你知道的最难的问题,并且等待竞争对手的经理做出自甘平庸的选择。
格林斯潘第十定律”(Greenspun’s Tenth Rule):
任何C或Fortran程序复杂到一定程度之后,都会包含一个临时开发的、只有一半功能的、不完全符合规格的、到处都是bug的、运行速度很慢的Common Lisp实现。
如果你想解决一个困难的问题,关键不是你使用的语言是否强大,而是好几个因素同时发挥作用:(a)使用一种强大的语言;(b)为这个难题写一个事实上的解释器;或者(c)你自己变成这个难题的人肉编译器。
如果你不想让经理发现你正在使用Lisp编程,你可以告诉他你用的是XML。
14 梦寐以求的编程语言
编程语言不是数学定理,而是一种工具,为了便于使用,它们才被设计出来。所以,设计编程语言的时候必须考虑到人类的长处和短处,就像设计鞋子的时候必须符合人类的脚型。如果鞋子穿上去不舒服,无论它的外形多么优美,多么像一件艺术品,你也只能把它当作一双坏鞋。
只要有了达到“临界数量”(critical mass)的最初用户和足够长的时间,一种语言可能就会达到应有的流行程度。
即使不考虑语言本身的优秀是否能带动流行,我想单单流行本身就肯定会使得这种语言变得更好,只有流行才会让它保持优秀。编程语言的最高境界一直在发展之中。
我们得先承认,确实有一个外部因素会影响到语言的流行。一种语言必须是某一个流行的计算机系统的脚本语言(scripting language),才会变得流行。Fortran和Cobol是早期IBM大型机的脚本语言。C是Unix的脚本语言,后来的Perl和Python也是如此。Tcl是Tk的脚本语言,Visual Basic是Windows的脚本语言,(某种形式的)Lisp是Emacs的脚本语言,PHP是网络服务器的脚本语言,Java和JavaScript是浏览器的脚本语言。
编程语言总是与它们依附的系统联系在一起的。所以,如果你想设计一种流行的编程语言,就不能只是单纯地设计语言本身,还必须为它找到一个依附的系统,而这个系统也必须流行。除非你只想用自己设计的语言取代那个系统现有的脚本语言。
编程语言还需要有一本介绍它的书。这本书应该不厚,文笔流畅,而且包含大量优秀的范例。布赖恩柯尼汉和丹尼斯里奇合写的《C程序设计语言》(C Programming Language)就是这方面的典范。眼下,我大概还能再加一句,这一类书籍之中必须有一本由O’Reilly公司出版发行。这正在变成是否能吸引黑客的前提条件了。
编程语言还应该有在线文档。事实上,在线文档可以当作一本书来写,但是目前它还无法取代实体书。实体书并没有过时,它们读起来很方便,而且出版社对书籍内容的审核是一种很有用的质量保证机制(虽然做得很不完美)。书店则是程序员发现和学习新语言的最重要的场所之一。
黑客动手写程序之前,至少会在心里盘算一下哪种语言的打字工作量最小,然后就选择使用该语言。这个笑话其实与真实情况相差无几。
对黑客来说,选择编程语言的时候,还有一个因素比简洁更重要,那就是这种语言必须能够帮助自己做到想做的事。
所谓一次性程序,就是指为了完成某些很简单的临时性任务而在很短时间内写出来的程序。
令人吃惊的是,一次性程序往往不是真的只用一次,就像二战期间很多美国大学造的一大批临时建筑后来都成了永久建筑。许多一次性程序后来也都变成了正式的程序,具备了正式的功能和外部用户。
开发大型程序的另一个方法就是从一次性程序开始,然后不断地改进。
Perl就是一个鲜明的例子。它不仅仅设计成适合开发一次性程序,而且它本身就很像一次性程序。最初的Perl只是好几个生成表格的工具收集在一起而已。后来程序员用它写一次性程序,当那些程序逐渐发展壮大后,Perl才随之发展成了一种正式的编程语言。到了Perl 5,这种语言才适合开发重要的程序,但是在此之前它已经广为流行了。
什么样的语言适合写一次性程序?首先,它必须很容易装备。一次性程序是你只想在一小时内写出来的程序,所以它不应该耗费很多时间安装和配置,最好已经安装在你的电脑上了。它必须是想用就用的。C语言可以想用就用,因为它是操作系统的一部分;Perl可以想用就用,因为它本来就是一种系统管理工具,操作系统已经默认安装它了。
函数库就是别人帮你写好的程序,所以它是编程语言的另一个重要特点,并且我认为正在变得越来越重要。
我认为,未来50年中,编程语言的进步很大一部分与函数库有关。未来的函数库将像语言内核一样精心设计。优秀函数库的重要性将超过语言本身。
函数库的设计基础与语言内核一样,都是一个小规模的运算符集合。函数库的使用应该符合程序员的直觉,让他可以猜得出哪个函数能满足自己的需要。
我们在Viaweb搞了一块很大的面板,上面有各种各样的仪表盘,用来显示服务器的状况。仪表盘的指针由微型马达驱动,每当马达旋转的时候,就会发出一阵轻微的噪音。在我的工位没法看到仪表盘,但是只要我听到声音,就能立刻知道服务器出现了问题。
加快I/O速度将是很值得做的一件事。在这方面,编程语言也能起到作用,有些措施是显而易见的,比如采用简洁、快速、格式化输出的函数,还有些措施则需要深层次的结构变化,比如采用缓存和持久化对象(persistent object)。
一种编程语言要想变得流行,最后一关就是要经受住时间的考验。
大多数黑客往往会等上几年,看看某一种新语言的势头,然后才真正考虑使用它。
虚拟现实建模语言VRML刚诞生时曾经轰动一时,但是我决定等到一两年后再去学习它,结果一两年后已经没有学习的必要了,因为市场已经把它遗忘了。
所以,发明新事物的人必须有耐心,要常年累月不断地做市场推广,直到人们开始接受这种发明。我们就耗费了好几年才使得客户明白Viaweb不需要下载安装就能使用。不过,好消息是,简单重复同一个信息就能解决这个问题。你只需要不停地重复同一句话,最终人们将会开始倾听。人们真正注意到你的时候,不是第一眼看到你站在那里,而是发现过了这么久你居然还在那里。
新事物的发展改进一般也需要很长时间。大多数技术在诞生后都逐渐发生了巨大的变化,编程语言更是如此。诞生头几年,一小批早期使用者比其他因素更能促进技术发展。
新技术被市场接纳的方式有两种,一种是自然成长式,另一种是大爆炸式。自然成长式的一个例子就是在车库里白手起家、自力更生的创业者。几个好朋友埋头工作,在外界毫不知晓的情况下开发出某种新技术。他们把它推向市场,没有任何宣传,最初的用户寥寥无几(但是热心程度无与伦比)。创业者持续改进新技术,与此同时,通过口碑效应,用户数量不断增长。在创业者不经意间,他们已经壮大起来了。
一般来说,车库里的创业者会妒忌大爆炸式的创业公司。后者的主导人物个个光彩照人、自信非凡,深受风险资本商的追捧。他们什么都买得起,在公关公司配合产品推出的宣传活动中,他们自己也附带成为了明星人物。自然成长式的创业者坐在自家车库里,觉得自己又穷又可怜。但是我想他们不必难过。最终来看,自然成长式会比大爆炸式产生更好的技术,能为创始人带来更多的财富。如果你研究一下目前的主流技术,就会发现大部分都是源于自然成长式。
著名散文家E.B.怀特说过,“最好的文字来自不停的修改”。所有优秀作家都知道这一点,它对软件开发也适用。设计一样东西,最重要的一点就是要经常“再设计”,编程尤其如此,再多的修改都不过分。
为了写出优秀软件,你必须同时具备两种互相冲突的信念。一方面,你要像初生牛犊一样,对自己的能力信心万丈;另一方面,你又要像历经沧桑的老人一样,对自己的能力抱着怀疑态度。在你的大脑中,有一个声音说“千难万险只等闲”,还有一个声音却说“早岁哪知世事艰”。
任何措施,只要能让“再设计”周而复始地进行下去,就都是可取的。文章可以修改到你满意为止,但是软件的修改通常来说可以无休止地进行下去。
让我们试着描述黑客心目中梦寐以求的语言来为以上内容做个小结。这种语言干净简练,具有最高层次的抽象和互动性,而且很容易装备,可以只用很少的代码就解决常见的问题。不管是什么程序,你真正要写的代码几乎都与你自己的特定设置有关,其他具有普遍性的问题都有现成的函数库可以调用。
这种语言的句法短到令人生疑。你输入的命令中,没有任何一个字母是多余的,甚至用到Shift键的机会也很少。
这种语言的抽象程度很高,使得你可以快速写出一个程序的原型。然后,等到你开始优化的时候,它还提供一个真正出色的性能分析器,告诉你应该重点关注什么地方。你能让多重循环快得难以置信,并且在需要的地方还能直接嵌入字节码。
这种语言有大量优秀的范例可供学习,而且非常符合直觉,你只需花几分钟阅读范例就能领会应该如何使用此种语言。你偶尔才需要查阅操作手册,它本身很薄,里面关于限定条件和例外情况的警告寥寥无几。
这种语言的内核很小,但很强大。各个函数库高度独立,而且和内核一样经过精心设计,它们都能很好地协同工作。语言的每个部分就像精密照相机的各种零件一样完美契合,不需要为了兼容性问题放弃或者保留某些功能。所有函数库的源码都很容易得到。这种语言能够很轻松地与操作系统和用其他语言开发的应用程对话。
这种语言以层的方式构建。较高的抽象层透明地构建在较低的抽象层之上。如果需要的话,你可以直接使用较低的抽象层。
除了一些绝对必要隐藏的东西,这种语言的所有细节对使用者都是透明的。它提供的抽象能力只是为了方便你的开发,而不是为了强迫你按照它的方式行事。事实上,它鼓励你参与它的设计,给你提供与语言创造者平等的权力。你能够对它的任何部分加以改变,甚至包括它的语法。它尽可能让你自己定义的部分与它本身定义的部分处于同等地位。这种梦幻般的编程语言不仅开放源码,更开放自身的设计。
15 设计与研究
外国游客常常惊讶地发现,美国人交谈的时候,一开始总是问“你干什么工作”。我一直讨厌回答这个问题,因为一句话说不清楚。不过我最终找到了解决方法,现在如果有人问我干什么工作,我会正视对方的双眼说:“我正在设计一种Lisp语言的新方言。”如果你也有同样困扰,我推荐你也如此回答。对方就立刻转向其他话题了。
艺术的各个领域有着巨大的差别,但是我觉得任何一个领域的最佳作品都不可能由对用户言听计从的人做出来。
做一个好的设计师就像做一个好医生一样。你不能头痛医头,脚痛医脚。病人告诉你症状,你必须找出他生病的真正原因,然后针对病因进行治疗。
大多数优秀设计都是这样产生的,它们关注用户,并且以用户为中心。
我说设计必须考虑用户的需求,这里的“用户”并不是指所有普罗大众。事实上,你可以选择任何想要的目标用户。
到了艺术领域,情况就完全变了。设计必须以人为本。设计椅子的时候,你不能只考虑椅子,还必须考虑人体各种千奇百怪的特点,不可能回避掉这一点。所有的艺术都必须迎合人类的兴趣和极限。举例来说,不考虑其他因素时,肖像画就是比风景画更能引发观众的兴趣。文艺复兴时期的经典绘画作品都是画人的,这并非巧合。如果绘画艺术不能用来表现人类本身,那么绘画也不会成为今天这样受推崇的艺术形式了。
如果人类真的擅长和细节打交道,那么我们应该都用机器语言编程才对。
怎么理解编程语言?你不要把它看成那些已完成的程序的表达方式,而应该把它理解成促进程序从无到有的一种媒介。
评价一种语言的优劣不能简单地看最后的程序是否表达得很漂亮,而要看程序从无到有的那条完成路径是否很漂亮。
19世纪英国作家简·奥斯汀的小说为何如此出色?一个原因就是她把自己的作品大声读给家人听,所以她就不会陷入孤芳自赏难以自拔的境地,不会长篇累牍地赞叹自然风光,也不会滔滔不绝地宣扬自己的人生哲学。
你可以随便找一本平庸的“文学”读物,想象一下把它当作自己的作品读给朋友们听,这样会让你真切地感受到那些“文学”读物高高在上的视角,读者必须承受所有沉重的负担才能阅读这些作品。
如果你正在设计某种新东西,就应该尽快拿出原型,听取用户的意见。
与之对照,还有另一种软件设计思想,也许可以被称为“万福玛丽亚”模式。它不要求尽快拿出原型,然后再逐步优化,它的观点是你应该等到完整的成品出来以后再一下子隆重地推向市场,就像圣母玛丽亚降临一样,哪怕整个过程漫长得像橄榄球运动员长途奔袭、达阵得分也没有关系。在互联网泡沫时期,无数创业公司因为相信了这种模式而自毁前程。我还没听说过有人采用这种模式而获得成功。
注: 有了一个想法,先发表出来,直到变成了具体的方案。落实之后,再变成可以用到的东西。
为什么15世纪油画首次亮相会引起轰动并很快流行起来?原因就是油彩使得画家可以在原型上直接画出最后的样子。你可以按照自己的想法画出初稿,但是它并不对你构成限制。接下来你可以逐步加上细节,甚至对初稿做出重大修改,直到最后完成。
软件开发也可以这样做。原型(prototype)并不只是模型(model),不等于将来一定要另起炉灶,你完全能够在原型的基础上直接做出最后的成品。我认为,只要有可能,你就应该这样做。
先做出原型,再逐步加工做出成品,这种方式有利于鼓舞士气,因为它使得你随时都可以看到工作的成效。开发软件的时候,我有一条规则:任何时候,代码都必须能够运行。
大多数画家都是先画一个草图,然后再逐步加工。如果你采用这种方式,那么从理论上说,你每天收工的时候都可以看到整体的效果,不会对最后的成品一点感觉都没有。
画家之间甚至流传着一句谚语:“画作永远没有完工的一天,你只是不再画下去而已。”这种情况对于第一线的程序员真是再熟悉不过了。
设计意味着做出符合人类特点和需要的产品。但是,“人类”不仅包括用户,还包括设计师,所以设计工作本身也必须符合设计师的特点和需要。
本文出自 个人生活数据分享,转载时请注明出处及相应链接。
本文永久链接: http://sikaoa.com/2015/10/02/4193