《黑客与画家》读书摘记

黑客与画家:硅谷创业之父Paul Graham文集
Paul Graham
这本书是很久以前看的,没有看完,最近接着看完了,所以没有连贯感觉,但是印象里就是这本书比较厉害,很多东西都描述的很有预见性。

◆ 译者序

黑客行为必须包含三个特点:好玩、高智商、探索精神。

黑客价值观的核心原则可以概括成这样几点:分享、开放、民主、计算机的自由使用、进步

◆ 1 为什么书呆子不受欢迎

最受欢迎的孩子并不欺负书呆子,他们不需要靠踩在书呆子身上来垫高自己。大部分的欺负来自处于下一等级的学生,那些焦虑的中间层。

◆ 2 黑客与画家

确实有些东西会用就行了,不需要知道原理

黑客搞懂“计算理论”(theory of computation)的必要性,与画家搞懂颜料化学成分的必要性差不多大。一般来说,在理论上,你需要知道如何计算“时间复杂度”和“空间复杂度”(time and space complexity);如果你要写一个解析器,可能还需要知道状态机(state machine)的概念;除此以外,并不需要知道特别多的理论。这些可比画家必须记住的颜料成分少很多。

程序员被当作技工,职责就是将产品经理的“构想”(如果这个词是这么用的话)翻译成代码。

认为这个问题的解决方法是一个几乎所有创作者都知道的方法:找一份养家糊口的“白天工作”(day job)。这个词是从音乐家身上来的,他们晚上表演音乐,所以白天可以找一份其他工作。更一般地说,“白天工作”的意思是,你有一份为了赚钱的工作,还有一份为了爱好的工作。

黑客的出发点是原创,最终得到一个优美的结果;而科学家的出发点是别人优美的结果,最终得到原创性。

你不能盼望先有一个完美的规格设计,然后再动手编程,这样想是不现实的。如果你预先承认规格设计是不完美的,在编程的时候,就可以根据需要当场修改规格,最终会有一个更好的结果。
(大公司的内部结构,使得它们很难这样做。这是又一个创业公司占优之处

做什么不重要,怎么做才重要,做好了比做的多更好

坚持一丝不苟,就能取得优秀的成果。因为那些看不见的细节累加起来

机械的工作可以留到烦躁的时间,宝贵的时间可以学习一些积极的东西,或者创造性的想法

对于编程,这实际上意味着你可以把bug留到以后解决。消灭bug对我来说属于轻松的工作,只有在这个时候,编程才变得直接和机械,接近社会大众想象中的编程的样子。消灭bug的过程就像解一道数学

这也是多人共同开发一个软件的正确模式。需要合作,但是不要“合”得过头。如果一个代码块由三四个人共同开发,就没有人真正“拥有”这块代码。最终,它就会变得像一个公用杂物间,没人管理,又脏又乱,到处堆满了冗余代码。正确的合作方法是将项目分割成严格定义的模块,每一个模块由一个人明确负责。模块与模块之间的接口经过精心设计,如果可能的话,最好把文档说明写得像编程语言规范那样清晰。

的角度思考问题正是成功的奥秘所在。“换位思考”并不就意味着你要做自我牺牲

太他妈经典了

》一书的卷首语:
程序写出来是给人看的,附带能在机器上运行。

自行其道、完全不替读者着想,被看成是高水平、高智商的表现,甚至都发展成了一种风尚。

◆ 你是一个随大流的人吗

有时候就是少说话,自己的知识局限,或者道听途说都会给自己带来尴尬,主卧要不要卫生间就是这样的尴尬。少说多做多学

如果回答是没有,那么你也许应该停下来想一想了。你的每一个观点都能毫不犹豫地说出口,你自己深深赞同这些观点,并且你也确信肯定会获得别人的赞同,这是否太过于巧合了?

◆ 为什么这样做

我这样做,是因为这是很好的脑力训练。想要做出优秀作品,你需要一个什么问题都能思考的大脑。

智力越高的人,越愿意去思考那些惊世骇俗的思想观点。这不仅仅因为聪明人本身很积极地寻找传统观念的漏洞,还因为传统观念对他们的束缚力很小,很容易摆脱。从

训练自己去想那些不能想的事情,你获得的好处会超过所得到的想法本身

◆ 守口如瓶

心里无所不想,但是不一定要说出来。

◆ 笑脸相迎?

不过,更好的回答是“我还没想好”

发表任何观点之前,最好能够多想一想,思考一下

”人们喜欢讨论的许多问题实际上都是很复杂的,马上说出你的想法对你并没有什么好处。
假设社

人们喜欢讨论的许多问题实际上都是很复杂的,马上说出你的想法对你并没有什么好处。

另一种反击的方法就是使用隐喻(metaphor)。

◆ 永远质疑

,每个人都会鼓励你不断成长,变成一个心智成熟、不再耍小孩子脾气的人。但是,很少有人鼓励你继续成长,变成一个怀疑和抵制社会错误潮流的人。

◆ 4 良好的坏习惯

丑陋的做法与聪明的做法存在一个共同点,那就是都不符合常规

计算机确实是非常精确、有条不紊的,但是黑客的所作所为完全出于兴趣,想到哪里就做到哪里,没有明确的计划,只求开心。

反抗政府的精神,”杰弗逊写道,“在某些场合是如此珍贵,我希望它永远保持活跃。”
你能想象今天的美国总统也这

们提醒我们不要忘记自己从何而来,提醒我们,正是那些不服从管教的人们,才是美国财富与力量的源泉

◆ 用户的胜利

云上

你的电脑”这个概念正慢慢成为过去时,取而代之的是“你的数据”。你应该可以从任何电脑上获取你的数据。或者更准确地说,在任何终端设备上获取你的数据,终端设备不一定是电脑。

他们必须正确地设计软件,使得它能够平滑升级,不让使用者感到困惑。这就是互联网软件面临的新问题,

现在的冠状病毒,对远程办公也是一种新尝试和考验

互联网应用程序能够同时被多人使用,所以非常适合团队协作性的工作。大多数用户现在还不了解软件协同办公,否则估计他们会强烈要求大部分应用程序都具备这个功能。举例来说,允许两个用户同时编辑一个文档是一项很有用的功能。

◆ 代码之城

对于互联网软件,没人规定只能使用某些语言开发,因为所有的硬件都控制在你手里,你想要用什么语言,就能用什么语言。不同的语言适合不同的任务,你应该根据不同场合,挑选最合适的工具。

◆ 软件的发布

软件的发布过程可以分解为一系列的渐进式修改,而不是猛地推出一个大幅变动的版本。常见的桌面软件可能一年发布一到两个新版本,而我们在Viaweb经常是一天发布三到五个版本。

联网软件的发布规则是:它运行不了,你就无法发布;一旦它能运行了,你就可以立刻发布。

◆ 软件bug

联网软件每时每刻都在被使用。你的代码一上线,就会经历严酷考验。bug很快就会浮出水面。

因为他们竟然把发现bug的任务交给用户去完成。说实话,我其实提倡这种做法。对于互联网软件,这样做的好处很多,因为它的bug相对比较少,而且处理周期比较短

早一点发现bug就不容易形成复合式bug,也就是互相影响的两个bug。举例来说,一个bug是楼梯很滑,另一个bug是扶手松了,那么只有当这两个bug互相作用时,才会导致你从楼梯上摔下来。在软件中,复合式bug是最难发现的bug,往往也会导致最大的损失。传统的方法是:“把软件彻底拆开,将所有bug统统清理干净。”这样做难免产生一大堆的复合式bug。

◆ 客户支持

Viaweb的开发人员总是与客服人员保持密切联系。客服人员坐在距离程序员只有9米的地方

我们的这种方法让所有人都感到满意。客户很高兴,拨打厂商服务热线是免费的,而且还被当作通风报信的人,受到郑重对待。客服人员也喜欢这样,因为这使得他们可以帮助用户,而不是对着用户读操作手册;程序员喜欢这样,因为他们能够再现bug,而不是通过模糊不清的二手报告了解bug。

◆ 全身心投入

一半的构思是写作时产生的?软件也是这样。实现某个构思,会带来更多的构思。

◆ 逆向的《人月神话》

《人月神话》一书中所指出的,向一个项目增加人手,往往会拖慢项目进程。随着参与人数的增加,人与人之间需要的沟通呈现指数式增长

◆ 关注用户

通过关注用户,你可以知道他们在使用软件的过程中什么时候遇到了麻烦。因为顾客总是对的,所以这表明你需要修正软件。推广Viaw

◆ 金钱问题

没有盗版是一种“优势”,但也是一个问题。一定数量的盗版对软件公司是有好处的。不管你的软件定价多少,有些用户永远都不会购买。如果这样的用户使用盗版,你并没有任何损失。

购买商品时,人们是先做出决定,然后再购买,好像这个行为分成两个独立的步骤。创立Viaweb之前,我也是这样想的,不过我从未对这个问题进行过深入思考。事实上,第二步对第一步有反作用,如果某样商品购买起来很困难,人们就会改变主意,放弃购买。

◆ 目标客户

如果你想把钱藏在安全的地方,请问你是选择放在家中床垫下面,还是放在银行

◆ 桌面电脑

听上去简直就是痴心妄想,就像今天我们听到“个人卫星”(personal satellite)时的那种感觉。

◆ 创业公司

除了长期加班,更可怕的事情是沉重的压力

桌面软件迫使用户变成系统管理员,互联网软件则是迫使程序员变成系统管理员:用户的压力变小了,程序员的压力变大了。

◆ 为什么不尝试一下?

一件是你不懂得管理企业,另一件是你害怕竞争

做出用户喜欢的产品,保证开支小于收入。

◆ 6 如何创造财富

[插图]
6 如何创造财富
如果你想致富,应该怎么做?我认为最好的办法就是自己创业,或者加入创业公司。几百年来,这一直是致富的可靠途径。“创业公司”(startup)这个词诞生于20世纪60年代,但是它与中世纪集资进行的航海冒险活动其实也相差无几。
创业公司往往与技术有关,所以“高技术创业公司”这个短语几乎就是同义重复。创业公司其实就是解决了某个技术难题的小公司。
许多人对此一无所知,但也发了财。这就好像你不用学习物理学也能成为一个出色的棒球投球手。但是,我认为理解这些原理,有助于你取得成功。

认为最好的办法就是自己创业,或者加入创业公司。几百年来,这一直是致富的可靠途径

◆ 一个命题

不再是低强度地工作四十年,而是以极限强度工作四年。在高技术领域,这种压缩的回报尤其丰厚,工作效率越高,额外报酬就越高。

◆ 运气的成分

也就是通过创造有价值的东西在市场上得到回报,从而致富

通过创造有价值的东西而致富,这种方法的优势不仅仅在于它是合法的(许多其他方法如今都是不合法的),还在于它更简单。你只需要做出别人需要的东西就可以了。

◆ 金钱不等于财富

财富与金钱并不是同义词

财富才是你的目标,金钱不是

交换媒介的优点是,它使得交易可以进行下去。缺点是,它往往模糊了交易的实质。人们觉得做生意就是为了挣钱,但是金钱其实只是一种中介,让大家可以更方便地获得自己想要的东西。大多数生意的目的是为了创造财富,做出人们真正需要的东

◆ 手工艺人

目前还存在的最大的手工艺人群体就是程序员。

◆ 工作是什么

公司一切行为的目的都是盈利,从而生存下去。

一个大学毕业生总是想“我需要一份工作”,别人也是这么对他说的,好像变成某个组织的成员是一件多么重要的事情。更直接的表达方式应该是“你需要去做一些人们需要的东西”

工作就是在一个组织中,与许多人共同合作,做出某种人们需要的东西。

◆ 更努力地工作

大公司中,个人的表现无法单独测量,公司里其他人会拖累你

◆ 可测量性和可放大性

测量性和可放大性。

如果你有一个令你感到安全的工作,你是不会致富的,因为没有危险,就几乎等于没有可放大性

◆ 小团体=可测量性

小团体=可测量性
就算你无法测量每个员工的贡

个因素是,每个划船手看不到自己更努力划桨有何不同;另一个因素是,一千人的团队使得任何个人的努力都被大大地平均化了。

一千人中随便挑出10个人,把他们放在一条小船上,他们很可能会划得更快。

◆ 高科技=可放大性

高科技=可放大性

设置的壁垒有多高

申请专利。但是专利的保护程度可能不高。竞

◆ 潜规则

我觉得许多人都不喜欢大公司处事按部就班、会议没完没了、人际关系冰冷、管理层瞎指挥……

真正创业以后,你的竞争对手决定了你到底要有多辛苦,而他们做出的决定都是一样的:你能吃多少苦,我们就能吃多少苦。

蚊子唯一的防御就是,作为一个物种,它们的数量极多,但是作为个体,却极难生存

◆ 用户数量

大多数时候,促成买方掏钱的最好办法不是让买家看到有获利的可能,而是让他们感到失去机会的恐惧。对于买家来说,最强的收购动机就是看到竞争对手可能收购你。我们发现这会使得CEO们连夜行动。次强的动机则是让他们担心如果现在不买你,你的高速成长将使得未来的收购耗资巨大,甚至你本身可能变成一个他们的竞争对手。

认为你应该和买家一样,也把用户数量当作一个测试指标。像优化软件一样优化公司,用户数量就是判断公司表现好坏的指标

用户数量也许不是最好的测量指标,但应该也相差不远了。买家关心它,收入依赖它,竞争对手恐惧它,记者和潜在用户则是被它打动。无论你的技术水平有多高,用户数量都比你自己的判断更能准确反映哪些问题应该优先解决。

◆ 财富和权力

工程师愿意接受普通薪水去做一些诱人的项目(比如战斗机和登月火箭),而与日常生活关系更密切的技术革新(比如电灯泡和半导体)只能由创业者来发明。

理解这些有助于回答一个重要的问题:为什么欧洲在历史上变得如此强大?是因为欧洲优越的地理位置,还是因为欧洲人天生就比较优秀,或者是宗教原因?答案(或者至少是近因)可能就是欧洲人接受了一个威力巨大的新观点:允许赚到大钱的人保住自己的财富。

◆ 7 关注贫富分化

我认为有三个原因使得我们对赚钱另眼相看。第一,我们从小被误导的对财富的看法;第二,历史上积累财富的方式大多名声不好;第三,担心收入差距拉大将对社会产生不利影响。就我所知,第一点是错的,第二点已经过时了,第三点通不过现实的检验。有没有可能,在现代社会中,收入差距拉大实际上是一种健康的信号?

◆ 财富的老爹模式

事实上,财富与金钱是两个概念。金钱只是用来交易财富的一种手段,财富才是有价值的东西,我们购买的商品和服务都属于财富。你到海外旅行时,不用看当地人的银行账户就会知道你来到的是富国还是穷国。你只要看看他们的财富就行了:建筑、街道、服装、健康状况等

每个人的技能不同,导致收入不同,这才是贫富分化的主要原因,正如逻辑学的“奥卡姆剃刀”原则所说,简单的解释就是最好的解释。

一个人的工作具有多少价值不是由政府决定的,而是由市场决定的。

当我们说一些工作报酬过高,另一些工作报酬过低,我们的真实想法到底是什么?在自由竞争的市场经济中,价格由买家的需求决定。如果人们喜欢棒球甚于喜欢诗歌,那么棒球运动员的收入就是要比诗人的收入高。如果说某种工作的报酬过低,那就相当于说人们的需求不正确。

◆ 偷窃

积累财富最常见的方法其实是偷窃。游牧社会是偷别人的牲口,农业社会是征税(和平时期)和直接掠夺(战争时期)。

在控制程度更高的社会,统治者和官僚阶层用税收代替直接充公。但是,根本的一点并没有变,那就是致富的方法不是创造财富,而是以统治者的强权进行搜刮掠夺。

农奴相同。(在热那亚和比萨这样的港口城市,中产阶级也会包括海盗。)但是,与农奴不同的是,中产阶级有强烈动机大量创造财富

农奴创造的所有财富都属于他的主人,所以大量创造财富对农奴来说意义不大。城镇的出现使得那里的人们可以独立生活,保住自己创造出来的财富。

中产阶级的出现使得财富总量不再是一个固定不变的值,财富的分配也不再是一种零和游戏。苹果公司的两个创始人乔布斯和沃兹尼亚克没有使得他人变得更贫穷就赚到了钱。事实上,他们创造出来的东西使得人类的物质生活变得更富有。他们只能这样做,否则不会有人付钱给他们的。

◆ 技术的杠杆效应

技术应该会引起收入差距的扩大,但是似乎能缩小其他差距。一百年前,富人过着与普通人截然不同的生活。他们住在大房子里,有许多仆人服侍,穿着华丽但是不舒适的服装,乘着马车旅行(因此还有马厩和马夫)。现在,由于技术的发展,富人的生活与普通人的差距缩小了。

技术无法使其变得更便宜的唯一东西,就是品牌。这正是为什么我们现在越来越多地听到品牌的原因。富人与穷人之间生活差异的鸿沟正在缩小,品牌是这种差距的遗留物。

如今,确实有很多人非常有钱,完全不必再去工作,他们之所以还在工作,不是因为感到社会压力,而是因为无所事事使人感到孤独和消沉。

少少还是有一些互相隔离的趋势,但主要是因为教育层次的差别,而不是财富的差别。

技术在加大收入差距的同时,缩小了大部分的其他差距。

◆ 公理的不同意见

如果得不到报酬,人们是否愿意创造财富?唯一的可能就是,工作必须能提供乐趣

但是,只要你压制收入差距的扩大,不管是用偷窃私人财产的做法(封建社会),还是用高额税收的做法(某些现代政府),最终结果看来都是一样的,那就是社会作为一个整体变得更贫穷了。

个社会需要有富人,这主要不是因为你需要富人的支出创造就业机会,而是因为他们在致富过程做出的事情。我在这里谈的不是财富从富人流向穷人的那种扩散效应(trickle-down effect),也不是说如果你让亨利·福特致富,他就会在下一场宴会雇用你当服务员,而是说如果你让他致富,他就会造出一台拖拉机,使你不再需要使用马匹耕田了。

◆ 8 防止垃圾邮件的一种方法

是,贝叶斯方法的真正优点在于你知道你正在计算的是什么东西

◆ 9 设计者的品味

美感是第一道关卡。丑陋的数学在世界上无法生存。

想要的学生不仅应该技术过硬,还应当能够使用技术做出优美的产品。

你妈妈这时不是教给你什么是美学,而只是想阻止你们两个争吵。
就像大人哄小孩的其他话一样,这句话也是模棱两可的,与其他话会发生冲突。大人教导你说品味只是每个人的偏好而已。但是来到博物馆,他们却对你说,仔细观赏达·芬奇的作品,因为他是伟大的艺术家,品味超凡。

仔细一想真的这样,全在一张嘴,看你怎么说

他们却对你说,仔细观赏达·芬奇的作品,因为他是伟大的艺术家,品味超凡。

要你开始思考这些问题,你就会发现,众多不同学科对“美”的认识有着惊人的相似度。优秀设计的原则是许多学科的共同原则,一再反复地出现

好设计是简单的设计。

特别是对于数学公理来说,少即是多。

要说的话,并且说得简短。

当你被迫把东西做得很简单时,你就被迫直接面对真正的问题。当你不能用表面的装饰交差时,你就不得不做好真正的本质部分。

好设计是永不过时的设计。

如果一件东西长盛不衰,那么它的吸引力一定来自本身的魅力,而不是来自风潮的影响。

好设计是解决主要问题的设计。

好设计是启发性的设计。

在数学中,这条原则意味着,一个可以成为许多新工作基础的证明要优于一个难度很高、但无助于未来学科发展的证明。在科学领域中,总体上可以把引用次数看作对他人启发性大小的粗略指标。

好设计通常是有点趣味性的设计

好设计是艰苦的设计。

在绘画上,肖像画通常占据最高地位。这不是偶然的,原因不仅是面部肖像比其他题材更能打动人,还因为我们太擅长观察脸,所以肖像画家不得不加倍努力才能达到我们的要求。如果画的是树,树枝画偏了五度也不会有人发现。但是,如果你把别人的眼睛画偏了五度,人们一眼就能看出来。

好设计是看似容易的设计

练习的作用也许是训练你把刻意为之的事情变成一种自觉的行为

好设计是对称的设计。对称也许只是简洁性的一种表现,但是它十分重要,值得单独列为一点。自然界的对称大量存在,这就说明了对称的重要性。

好设计是模仿大自然的设计。我不是说模仿大

好设计是一种再设计。很少有人一次就把事情做对。专家的做法是先完成一个早期原型,然后提出修改计划,最后把早期原型扔掉。

好设计是能够复制的设计。我们对待复制的

等到你逐渐对一件事产生热情的时候,就不会满足于模仿了。你的品味就进入了第二阶段,开始自觉地进行原创。

好设计常常是奇特的设计。

爱因斯坦并不想让相对论变得很奇特,他只想找出真理,是真理本身显得很奇特。

唯一达到“奇特”的方法,就是追求做出好作品,完成之后再回过头看。

好设计是成批出现的

推动人才成批涌现的最大因素就是,让有天赋的人聚在一起,共同解决某个难题。互相激励比天赋更重要,达·芬奇之所以成为达·芬奇,主要原因不仅仅是他的天赋,更重要的是他生活在当时的佛罗伦萨,而不是米兰。

好设计常常是大胆的设计。

:“这样解决太糟糕了!一定有更好的选择。”不要忽视这种声音,要培育它们。优秀作品的秘诀就是:非常严格的品味,再加上实现这种品味的能力。

◆ 机器语言

一个操作所需的代码越多,就越难避免bug,也越难发现它们。

◆ 高级语言

程序员的助手不是一个人,而是编译器。所谓“编译器”,本身就是一个程序,作用是将简便方式书写的程序(就像上面这一行命令)转变为硬件可以理解的语言。

编译器不是高级语言唯一的实现方法,另一种方法是使用解释器,它的作用是实时地将代码解释为相应的机器语言,然后一行行运行。相比之下,编译器则是先将整个程序全部翻译成机器语言,然后再运行。

◆ 开放源码

开放源码的优势还不仅局限于可以自己动手解决bug。这里的关键是所有人都可以参与。所以,开源软件就像一篇经受同行评议的论文

◆ 语言的战争

绝大多数程序员在绝大多数时候都使用高级语言编程。现在很少有人使用汇编语言。程序员的时间要比计算机的时间昂贵得多,后者已经变得很便宜了,所以几乎不值得非常麻烦地用汇编语言开发软件。只有少数最关键的部分可能还会用到汇编语言,比如开发某个计算机游戏时,你需要在微观层面控制硬件,使得游戏速度得到最大限度的终极提高。
Fortran、Lisp、Cobol、Basic、C、Pascal、Smalltalk、C++、Java、Perl和Python,全都是高级语言。它们只是比较出名的几种而已。现在的高级语言大概有几百种之多。不同机器语言的指令集基本相同,但是高级语言就不一样,它们开发程序的模式差别相当大。
那么,应该使用哪一种语言?嗯,关于这个问题,现在有很多争论。部分原因是,如果你长期使用某种语言,你就会慢慢按照这种语言的思维模式进行思考。

“你用什么语言并不重要,重要的是你对问题是否有正确的理解。代码以外的东西才是关键。”
这当然是一派胡言

◆ 抽象性

如果你非常关注运行速度,那么最好使用接近机器的语言。

◆ 安全带还是手铐?

静态类型语言与动态类型语言之争

中,写代码时必须知道每个变量的类型。而在动态类型语言中,随便什么时候,你都可以把变量设为任意类型的值。

我本人更喜欢动态类型,痛恨那些限制我的自由的语言。

◆ 面向对象编程

面向对象编程的优点在于,如果你需要修改程序,计算另一种图形的面积,比如三角形,你只需要再另外增加一块相应的代码就可以了,甚至可以不修改程序的其他部分。但是,批评者会反驳说,这种方法的缺点是,由于增加代码不用考虑其他部分,结果往往导致写出性能不佳甚至有副作用的代码,就好比造房子不考虑已经完成的部分一样。

◆ 文艺复兴

实际上,很多历史学家相信战争是文艺复兴的一个副产品。当时,欧洲活力旺盛可能就是因为它分成许多互相竞争的小国。它们互相毗邻,所以新思想能够从一个国家传播到另一个国家,但是它们又互相独立,使得单个的统治者无法遏制创新的发展。相比之下,中国古代的封建皇朝禁止民间建造大型的远洋船只,阻止了经济的正常发展。

◆ 11 一百年后的编程语言

我的判断是,那些内核最小、最干净的编程语言才会存在于进化的主干上。一种语言的内核设计得越小、越干净,它的生命力就越顽强。

我已经预测了,一旦未来硬件的性能大幅提高将会发生什么事。新增加的运算能力都会被糟蹋掉。

浪费可以分成好的浪费和坏的浪费。我感兴趣的是好的浪费,即用更多的钱得到更简单的设计

效率低下的软件并不等于很烂的软件。一种让程序员做无用功的语言才真正称得上很烂。浪费程序员的时间而不是浪费机器的时间才是真正的无效率。随着计算机速度越来越快,这会变得越来越明显。

代码写给人看的,机器都能看懂,而人不行。

浪费程序员的时间而不是浪费机器的时间才是真正的无效率。

每增加一个解释层,软件的运行速度就会慢一个数量级。但是,多余的软件层可以让编程灵活起来。

极端的例子可能就是文学,文学研究者的任何成果几乎对文学创作者都毫无影响。

设计新语言的方法之一就是直接写下你想写的程序,不管编译器是否存在,也不管有没有支持它的硬件。这就是假设存在无限的资源供你支配。不管是今天还是一百年后,这样的假设好像都是有道理的。

现在,我们的两个观点就是:(1)一百年后的编程语言在理论上今天就能设计出来;(2)如果今天真能设计出这样一种语言,很可能现在就适合编程,并且能够产生更好的结果。如果我们把这两个观点联系起来,那就得出了一些有趣的可能性。为什么不现在就动手尝试写出一百年后的编程语言呢?

◆ 秘密武器

如果你想当一个黑客,应该学习哪些语言。他建议从Python和Java入手,因为它们比较容易学。想当高级一点的黑客,还应该学习C和Perl。前者用来对付Unix系统,后者用来系统管理和开发CGI脚本。最后,真正非常严肃地把黑客作为人生目标的人,应该考虑学习Lisp:
Lisp很值得学习。你掌握它以后,会感到它给你带来的极大启发。这会大大提高你的编程水平,使你成为一个更好的程序员。尽管在实际工作中极少会用到Lisp。

我们唯一擅长的事情就是开发软件。我们希望这一点可以弥补我们的劣势。任何在软件开发上面有助于我们获得优势的事情我们都不能放过。

在竞争中,你的对手无法理解你的技术优势,这可是再宝贵不过了。商场如战场,对手摸不透你,你的胜算就增加了。

◆ Blub困境

Lisp 语言到底好在什么地方?如果它真的这么好,为什么没有得到广泛使用呢?这种问题听起来有点像绕口令,但是实际上回答起来很简单。Lisp语言的好处不在于它有一些狂热爱好者才明白的优点,而只在于它是目前最强大的编程语言。它没有得到广泛使用的原因就是因为编程语言不仅仅是技术,也是一种习惯性思维,非常难于改变。当然,上面两句话都需要进一步解释。
我先从一个争议极大的命题开始讲起:编程语言的编程能力有差异。
至少不会有人反对高级语言比机器语言更强大这一观点。今天的大多数程序员通常情况下都不会想用机器语言编程,而是使用一种高级语言,然后再让编译器帮你把它翻译成机器语言。这种观念甚至已经移植到了硬件,从20世纪80年代开始,硬件的指令集都是针对编译器而不是针对程序员设计的。
大家都知道,徒手用机器语言写出整个程序是一件很蠢的事。

如果在开发的程序必须与另一个程序紧密配合,那么可能最好还是使用后者的开发语言。如果你的程序只是要做一些很简单的事(比如整数运算或者位操作),那就不妨使用一种比较靠近机器的低层次语言,主要原因是这样运行起来会更快一些。

表面上,一个老年人拄着拐杖蹒跚而行,你不要只是看看而已,他背后可能有更多的故事值得了解,你应该想得更深一些。

◆ 创业公司的合气道

因为编程语言的特点之一就是它会使得大多数使用它的人满足于现状,不想改用其他语言。人类天性变化的速度大大慢于计算机硬件变化的速度,所以编程语言的发展通常比CPU的发展落后一二十年。

技术的变化速度通常是很快的。但是,编程语言不一样,与其说它是技术,还不如说是程序员的思考模式。编程语言是技术和宗教的混合物。所以,一种很普通的编程语言就是很普通的程序员使用的语言,它的变化就像冰山那样缓慢。

有些公司的职位描述使用了大量的IT词汇,这样的内容越多,这家公司就越不构成威胁。最不用担心的竞争对手就是那些要求应聘者具有Oracle数据库经验的公司,你永远不必担心他们。如果是招聘C++或Java程序员的公司,对你也不会构成威胁。如果他们招聘Perl或Python程序员,就稍微有点威胁了。至少这听起来像一家技术公司,并且由黑客控制。如果我有幸见到一家招聘Lisp黑客的公司,就会真的感到如临大敌。

◆ 13 书呆子的复仇

[插图]
13 书呆子的复仇
软件业有一场永不停息的战斗,书生气的开发者与官僚主义的经理之间总是发生冲突。大家应该都看过漫画《呆伯特》,熟悉里面那个发型高耸的经理。[插图]我想,技术行业的大部分人对这个角色都过目难忘,因为在他们的公司里就有这个角色的原型。
那些经理奇迹般地同时具备了两种很常见但很难结合在一起的特点:(a)对技术一无所知;(b)对技术有强烈的个人观点。
举例来说,假设你需要写一个软件。你的经理根本不懂这个软件的运作机制,也不知道各种编程语言有什么区别。但是,他竟然明确要求你一定要使用某一种语言进行开发。

那些经理奇迹般地同时具备了两种很常见但很难结合在一起的特点:(a)对技术一无所知;(b)对技术有强烈的个人观点。

认为所有语言都一样的看法的缺点是自欺欺人,但是优点是可以使许多事情变得很简单。我想这就是为什么它被广泛接受的主要原因。它是一个令人舒服的想法。

在黑客圈子里,Perl 被公认比Java酷得多。黑客社区网站Slashdot就是用Perl开发的。我估计你不可能看到黑客愿意使用Java的JSP技术开发网站。可是,还有一种更新的语言叫做Python,它的使用者往往看不起Perl。另一些人则认为Ruby语言是取代Python的最佳选择。

◆ 为什么Lisp语言很特别

至今还有2种是Lisp独有的。按照被大众接受的程度,这9种思想依次如下排列。

◆ 向心力

使用一种不常见的语言会出现的问题我想到了三个:你的程序可能无法很好地与使用其他语言写的程序协同工作;你可能找不到很多函数库;你可能不容易雇到程序员。

如果你创业的话,千万不要为了取悦风险投资商或潜在并购方而设计你的产品。让用户感到满意才是你的设计方向。只要赢得用户,其他事情就会接踵而来。如果没有用户,谁会关心你选择的“正统”技术是多么令人放心。

◆ 随大流的代价

语言的编程能力越强大,写出来的程序就越短(当然不是指字符数量,而是指独立的语法单位)

◆ 一个诀窍

由于选择了不当的编程语言而导致项目失败的可能性,是你的经理不愿意考虑的问题。事实上大部分的经理都这样。因为你知道,总的来说,你的经理其实不关心公司是否真的能获得成功,他真正关心的是不承担决策失败的责任。所以对他个人来说,最安全的做法就是跟随大多数人的选择。
在大型组织内部,有一个专门的术语描述这种跟随大多数人的选择的做法,叫做“业界最佳实践”。这个词出现的原因其实就是为了让你的经理可以推卸责任。既然我选择的是“业界最佳实践”,如果不成功,项目失败了,那么你也无法指责我,因为做出选择的人不是我,而是整个“业界”。
我认为这个词原来是指某种会计方法,大致意思就是不要采用很奇怪的处理方法。在会计方法中,这可能是一个很好的主意。“尖端”和“核算”这两个词听上去就不适合放在一起。但是如果你把这个标准引入技术决策,你就开始要出错了。

第一,不同语言的编程能力不一样。第二,大多数经理故意忽视第一点。

◆ 附录:编程能力

任何C或Fortran程序复杂到一定程度之后,都会包含一个临时开发的、只有一半功能的、不完全符合规格的、到处都是bug的、运行速度很慢的Common Lisp实现。

程序的形式应该仅仅反映它所要解决的问题。代码中其他任何外加的形式都是一个信号,(至少对我来说)表明我对问题的抽象还不够深,也经常提醒我,自己正在手工完成的事情,本应该写代码通过宏的扩展自动实现。

◆ 流行的秘诀

编程语言不是数学定理,而是一种工具,为了便于使用,它们才被设计出来

◆ 外部因素

一种语言必须是某一个流行的计算机系统的脚本语言(scripting language),才会变得流行。Fortran和Cobol是早期IBM大型机的脚本语言。C是Unix的脚本语言,后来的Perl和Python也是如此。Tcl是Tk的脚本语言,Visual Basic是Windows的脚本语言,(某种形式的)Lisp是Emacs的脚本语言,PHP是网络服务器的脚本语言,Java和JavaScript是浏览器的脚本语言。

如果你想设计一种流行的编程语言,就不能只是单纯地设计语言本身,还必须为它找到一个依附的系统,而这个系统也必须流行。

编程语言本来就需要一个好的实现,而且这个实现必须是免费的

编程语言还需要有一本介绍它的书

事实上,在线文档可以当作一本书来写,但是目前它还无法取代实体书。实体书并没有过时,它们读起来很方便,而且出版社对书籍内容的审核是一种很有用的质量保证机制(虽然做得很不完美)。

◆ 简洁

假定你的语言已经能够满足上面三项条件——一种免费的实现,一本相关书籍,以及语言所依附的计算机系统——那么还需要做什么才能使得黑客喜欢上你的语言?

简洁性是静态类型语言的力所不及之处。不考虑其他因素时,没人愿意在程序的头部写上一大堆的声明语句。只要计算机可以自己推断出来的事情,都应该让计算机自己去推断。举例来说,hello-world 本应该是一个很简单的程序,但是在Java语言中却要写上一大堆东西,这本身就差不多可以说明Java语言设计得有问题了。

◆ 可编程性(Hackability)

黑客改造语言的乐趣就好比外科医生摆弄病人内脏的乐趣,或者青少年喜欢用手挤破青春痘的那种感觉。

一种真正优秀的编程语言应该既整洁又混乱。“整洁”的意思是设计得很清楚,内核由数量不多的运算符构成,这些运算符易于理解,每一个都有很完整的独立用途。“混乱”的意思是它允许黑客以自己的方式使用。

◆ 函数库

简洁性的最高形式当然是有人已经帮你把程序写好,你只要运行就可以了。函数库就是别人帮你写好的程序,所以它是编程语言的另一个重要特点,并且我认为正在变得越来越重要。Perl 就赢在它具有操作字符串的巨大函数库。这类函数库对一次性程序特别重要,因为开发一次性程序的原始目的往往就是转化或提取字符串。许多Perl程序的原型可能就是把几个函数库调用放在一起。

◆ 效率

编程时提高代码运行速度的关键是使用好的性能分析器(profiler)

人们在使用非常高级的语言(比如Lisp)时,经常抱怨很难知道哪个部分对性能的影响比较大。

随着互联网软件的兴起,越来越多的程序主要不是受限于计算机的运算速度,而是受限于I/O的速度。加快I/O速度将是很值得做的一件事。

◆ 时间

所以,发明新事物的人必须有耐心,要常年累月不断地做市场推广,直到人们开始接受这种发明。

人们真正注意到你的时候,不是第一眼看到你站在那里,而是发现过了这么久你居然还在那里。

新技术被市场接纳的方式有两种,一种是自然成长式,另一种是大爆炸式。

◆ 再设计

一方面,你要像初生牛犊一样,对自己的能力信心万丈;另一方面,你又要像历经沧桑的老人一样,对自己的能力抱着怀疑态度

如果你能平衡好希望和担忧,它们就会推动项目前进,就像自行车在保持平衡中前进一样。

让这两股相反的力量保持平衡是很难的。初出茅庐的年轻黑客都很乐观,自以为做出了伟大的产品,从不反思和改进。上了年纪的黑客又太不自信,甚至故意回避一些挑战性很强的项目。

◆ 梦寐以求的编程语言

这种语言以层的方式构建。较高的抽象层透明地构建在较低的抽象层之上。如果需要的话,你可以直接使用较低的抽象层。

◆ 15 设计与研究

现在如果有人问我干什么工作,我会正视对方的双眼说:“我正在设计一种Lisp语言的新方言。”如果你也有同样困扰,我推荐你也如此回答。对方就立刻转向其他话题了

设计与研究的区别看来就在于,前者追求“好”(good),后者追求“新”(new)。优秀的设计不一定很“新”,但必须是“好”的;优秀的研究不一定很“好”,但必须是“新”的

有一句话说“顾客永远是对的”,这是指评价优秀设计的标准是看它能够多大程度上满足用户的需求。如果你的小说没人爱看,或者你做的椅子极不舒服,那么就说明你的作品失败了,被一票否决了。

可是,让用户满意并不等于迎合用户的一切要求。用户不了解所有可能的选择,也经常弄错自己真正想要的东西。做一个好的设计师就像做一个好医生一样。你不能头痛医头,脚痛医脚

除非设定目标用户,否则一种设计的好坏根本无从谈起。

如果你觉得自己在为傻瓜设计产品,那么很可能不仅无法设计出优秀产品,而且就连傻瓜也不喜欢你的设计。

最后写出来的程序就像已经完成的数学证明一样,是一棵经过精心修剪的树木,上面杂乱滋生的树杈都已经被剪去了。所以,评价一种语言的优劣不能简单地看最后的程序是否表达得很漂亮,而要看程序从无到有的那条完成路径是否很漂亮。

它不要求尽快拿出原型,然后再逐步优化,它的观点是你应该等到完整的成品出来以后再一下子隆重地推向市场

无数创业公司因为相信了这种模式而自毁前程。我还没听说过有人采用这种模式而获得成功

原型(prototype)并不只是模型(model),不等于将来一定要另起炉灶,你完全能够在原型的基础上直接做出最后的成品

士气是设计的关键因素

先做出原型,再逐步加工做出成品,这种方式有利于鼓舞士

不断迭代,有里程碑

画作永远没有完工的一天,你只是不再画下去而已。”这种情况对于第一线的程序员真是再熟悉不过了

设计意味着做出符合人类特点和需要的产品。但是,“人类”不仅包括用户,还包括设计师,所以设计工作本身也必须符合设计师的特点和需要。

◆ 术语解释

应用服务提供商(ASP, Application Service Provider) 这种软件公司允许用户通过网络使用存放在服务器上的软件,而不是采用传统的方式让用户在自己的电脑上安装软件后使用。

布鲁克斯假说(Brooks’s Hypothesis) 程序员一天写出的代码行数是一个常量,与他使用什么语言无关。

“奥卡姆剃刀”原则(Occam’s Razor) 简单的解释就是较好的解释。

帕金森定律(Parkinson’s Law) 完成一项任务所需要的资源会不断扩展,直至把这种资源消耗光为止。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值