黑客与画家

黑客与画家
保罗·格雷厄姆
真话
2018-07-16 20:44:09
这就是找出“不能说的话”的第一种方法:判断言论的真伪。
异端邪说
2018-07-16 20:43:24
我们把这种不一定正确、但是极富争议的言论称为“异端邪说”。关注“异端邪说”,是找出“不能说的话”的第二种方法。
时空差异
2018-07-16 20:42:20
所以,我们就有了找出“不能说的话”的第三种方法:将当代观念与不同时期的古代观念diff^一下。
道貌岸然
2018-07-16 20:49:28
还有第四种寻找“不能说的话”的方法:寻找那些一本正经的卫道者,看看他们到底在捍卫着什么。
机制
2018-07-16 20:52:15
我还想到了第五种方法,可以找出“不能说的话”,那就是去观察禁忌是如何产生的。
客户支持
2018-08-06 19:47:14
Viaweb的开发人员总是与客服人员保持密切联系。客服人员坐在距离程序员只有9米的地方,知道自己可以随时打断程序员的工作,提交新证实的bug的报告。遇到重大bug,我们就算在开董事会,也会马上回来修改程序。
目标客户
2018-08-07 10:19:43
不少公司都很想知道,什么事情可以外包,什么事情不可以外包。一个可能的答案是,公司内部所有不直接感受到竞争压力的部门都应该外包出去,让它们暴露在竞争压力之下。
注: 公司的那些事情可以外包?
创业公司
2018-08-07 10:39:10
桌面软件迫使用户变成系统管理员,互联网软件则是迫使程序员变成系统管理员:
为什么不尝试一下?
2018-08-07 11:11:10
如果你是一个黑客,并且梦想自己创业,可能会有两件事情令你望而却步,不敢真正开始采取行动。一件是你不懂得管理企业,另一件是你害怕竞争。可是实际上,这两件事都是没有通电的电篱笆。
首先,管理企业其实很简单,只要记住两点就可以了:做出用户喜欢的产品,保证开支小于收入。只要做到这两点,你就会超过大多数创业公司。随着事业的发展,你自己就能琢磨出来其他的诀窍。
2018-08-07 11:15:34
至于如何做出用户喜欢的产品,下面是一些通用规则。从制造简洁的产品开始着手,首先要保证你自己愿意使用。然后,迅速地做出1.0版,并且不断以改进,整个过程中密切倾听用户的反馈。用户总是对的,但是不同的用户要求不一样。低端的用户要求简化操作和清晰易懂,高端的用户要求你增加新功能。软件最大的好处就是让一切变得简单。但是,做到这一点的方法是正确设置默认值,而不是限制用户的选择。如果竞争对手的产品很糟糕,你也不要自鸣得意。比较软件的标准应该是看对手的软件将来会有什么功能,而不是现在有什么功能。无论何时,你都要使用自己的软件。
金钱不等于财富
2018-08-07 11:38:56
如果你想要创造财富(这里指的是狭义的财富,也就是使你免于饥饿的东西),那么你应该抱着特别怀疑的态度,去思考那些着眼于你自己感兴趣的东西的商业计划。对于自己感兴趣的东西,你会觉得它们很有价值,伹是它们恰恰最不可能与他人眼中有价值的东西发生重合。」
高科技=可放大性
2018-08-08 09:08:56
在实际操作中,这就意味着我们故意选择那些很困难的技术问题。假定软件有两个候选的新功能,它们创造的商业价值完全相同,那么我们总是选择较困难的那个功能。不是因为这个功能能带来更多的收入,
而是因为它比较难。我们很乐于迫使那些又大又慢的竞争对手跟着我们一起走进沼泽地。创业公司就像游击队一样,喜欢选择不易生存的深山老林作为根据地,政府的正规军无法追到那种地方。我还记得创业初期我们是多么筋疲力尽,整天都为一些可怕的技术难题绞尽脑汁。但是,我还是感到相当高兴,因为那些问题连我们都觉得这么困难,那么竞争对手就更会认为是不可能解决的。
2018-08-08 09:12:14
总的来说,这也是很好的处事原则。如果你有两个选择,就选较难的那个。如果你要选择是坐在家里看电视,还是外出跑步,那就出去跑步吧。这个方法有效的原因可能是遇到两个一难一易的选择时,往往出于懒惰的缘故,你会选择较易的那个选项。在意识深处,你其实知道不懒惰的做法会带来更好的结果,这个方法只是迫使你接受这一点。」
潜规则
2018-08-08 09:13:18
创业是有一些潜规则的,其中一条就是很多事情由不得你。
2018-08-08 09:18:20
另一条潜规则是,创业的付出与回报虽然总体上是成比例的,但是在个体上是不成比例的。
2018-08-08 09:22:23
那么,怎样才能把公司卖掉呢?基本上,不管是否想出售公司,你要做的事情都是一样的(比如多赚钱)。但是,被收购本身就是一门学问,我们在Viaweb花了很多时间研究它。
潜在的买家会尽可能地拖延收购。收购这件事最难的地方就是让买方真正拿出钱。大多数时候,促成买方掏钱的最好办法不是让买家看到有获利的可能,而是让他们感到失去机会的恐惧。对于买家来说,最强的收购动机就是看到竞争对手可能收购你。我们发现这会使得CEO们连夜行动。次强的动机则是让他们担心如果现在不买你,你的高速成长将使得未来的收购耗资巨大,甚至你本身可能变成一个他们的竞争对手。
2018-08-08 09:24:46
我认为你应该和买家一样,也把用户数量当作一个测试指标。像优化软件一样优化公司,用户数量就是判断公司表现好坏的指标。做过软件优化的人都知道,优化难点就是如何测出系统的表现。如果凭空猜测软件最慢的是哪一部分以及怎样让它快起来,那估计百分百会猜错。用户数量也许不是最好的测量指标,但应该也相差不远了。买家关心它,收入依赖它,竞争对手恐惧它,记者和潜在用户则是被它打动。无论你的技术水平有多高,用户数量都比你自己的判断更能准确反映哪些问题应该优先解决。
2018-08-08 09:25:19
此外,将公司管理视同软件优化还能帮助你避免VC担心的另一个陷阱——开发某种产品的时间过长。现在,黑客都已经熟知这一点,并总结出一个术语“过早优化”(premature optimization)。尽快拿出1.0版,然后根据用户的反映而不是自己的猜测进行软件优化。
你必须时刻牢记的最基本的原则就是,
财富和权力
2018-08-08 09:37:27
为什么欧洲在历史上变得如此强大?是因为欧洲优越的地理位置,还是因为欧洲人天生就比较优秀,或者是宗教原因?答案(或者至少是近因)可能就是欧洲人接受了一个威力巨大的新观点:允许赚到大钱的人保住自己的财富。
7.关注贫富分化
2018-08-08 10:10:18
与下棋、画画、写小说一样,赚钱也是一种专门的技能。但是,出于某种原因,我们以完全不同的态度对待这种技能。如果某些人善于下棋或写小说,没有人会有意见;伹是,如果某些人善与赚钱,报纸上就会有社论出来说这是不对的。
为什么?赚钱看上去与其他技能没有本质不同,为什么人们的反应如此强烈?
我认为有三个原因使得我们对赚钱另眼相看。第一,我们从小被误导的对财富的看法;第二,历史上积累财富的方式大多名声不好;第三,担心收入差距拉大将对社会产生不利影响。就我所知,第一点是错的,第二点已经过时了,第三点通不过现实的检验。有没有可能,在现代社会中,收入差距拉大实际上是一种健康的信号?
财富的老爹模式
2018-08-08 09:47:35
为什么财富的分配问题引起这么多争论?部分原因是反对声最大的人当中,很多人都少有创造财富的经验:大学生、继承人、教授、政客、新闻记者。(如果你在酒吧里听过大家议论体育赛事,你一定很熟悉这种现象。)
9.设计者的品味
2018-08-14 16:04:35
9.设计者的品味
2018-08-14 16:05:11
只要你开始思考这些问题,你就会发现,众多不同学科对“美”的认识有着惊人的相似度。优秀设计的原则是许多学科的共同原则,一再反复地出现。
2018-08-14 16:04:17
好设计是简单的设计。
2018-08-14 16:05:29
当你被迫把东西做得很简单时,你就被迫直接面对真正的问题。当你不能用表面的装饰交差时,你就不得不做好真正的本质部分。
2018-08-14 16:03:25
好设计是永不过时的设计。
2018-08-14 16:03:42
以永不过时作为目标也是一种避开时代风潮的影响的方法。
2018-08-14 16:04:05
所以,如果你的作品对今天的人们以及1500年的人都有吸引力,那么它极有可能也会吸引2500年的人。
2018-08-14 16:03:10
好设计是解决主要问题的设计。
2018-08-14 16:02:40
许多坏设计做得很辛苦,但是从一开始方向就错了。20世纪中期,有一股使用无衬线(sans-serif)字体的潮流。这一类字体接近于纯手写的样式,但是它无助于解决最主要的问题。印刷出来的文字首先应该是易于辨认的,所以能够清晰地分辨字母就是最主要的问题——传统的新罗马(Times Roman)字体是一种有衬线的字体,虽然看上去古老得就像维多利亚女王时代的风格,但是它的小写g就是可以很轻易地与小写y区分。
注: 关于设计
2018-08-14 16:07:58
好设计是启发性的设计。
2018-08-14 16:08:51
在建筑学和设计学中,这条原则意味着,一幢建筑或一个物品应该允许你按照自己的愿望来使用。
2018-08-14 16:09:21
在软件业中,这条原则意味着,你应该为用户提供一些基本模块,使得他们可以随心所欲自由组合,就像玩乐高积木那样。
2018-08-14 16:10:36
在数学中,这条原则意味着,一个可以成为许多新工作基础的证明要优于一个难度很高、但无助于未来学科发展的证明
2018-08-14 16:10:48
好设计通常是有点趣味性的设计。
2018-08-14 16:48:24
好设计是艰苦的设计。
2018-08-14 16:52:25
好设计是看似容易的设计。
2018-08-14 16:59:15
好设计是对称的设计。
2018-08-14 16:59:31
对称有两种:重复性对称和递归性对称。递归性对称就是指子元素的重复,比如树叶上叶脉的纹路。
2018-08-14 17:03:06
在数学和工程学中,递归尤其有用。归纳式证明方法既简洁又美妙。在软件中,能用递归解决的问题通常代表已经找到了最佳解法。
2018-08-14 17:03:37
好设计是模仿大自然的设计。
2018-08-14 17:06:01
好设计是一种再设计。
2018-08-14 17:08:56
好设计是能够复制的设计。
2018-08-14 17:10:09
好设计常常是奇特的设计。
2018-08-14 17:11:46
好设计是成批出现的。
2018-08-14 17:13:32
好设计常常是大胆的设计
2018-08-14 17:15:37
单单是无法容忍丑陋的东西还不够,只有对这个领域非常熟悉,你才可能发现哪些地方可以动手改进。你必须锻炼自己。只有在成为某个领域的专家之后,你才会听到心里有一个细微的声音说:“这样解决太糟糕了!一定有更好的选择。”不要忽视这种声音,要培育它们。优秀作品的秘块就是:非常严格的品味,再加上实现这种品味的能力。
注: 如何达到具有好的品味
面向对象编程
2018-08-14 18:18:37
事实上有两种程度的面向对象编程:某些语言允许你以这种风格编程,另一些语言则强迫你一定要这样编程。
2018-08-14 18:18:24
我觉得后一类语言不可取。允许你做某事的语言肯定不差于强迫你做某事的语言。所以,至少在这方面我们可以得到明确的结论:你应该使用允许你面向对象编程的语言。至于你最后到底用不用则是另外一个问题了。
11.百年后的编程语言
2018-08-14 18:25:02
我的判断是,那些内核最小、最干净的编程语言才会存在于进化的主干上。一种语言的内核设计得越小、越干净,它的生命力就越顽强。
2018-08-14 18:29:06
浪费可以分成好的浪费和坏的浪费。我感兴趣的是好的浪费,即用更多的钱得到更简单的设计。
2018-08-14 18:32:21
如果我们把一种语言的内核设想为一些基本公理的集合,那么仅仅为了提高效率就往内核添加多余的公理,却没有带来表达能力的提升,这肯定是一件很糟的事。没错,效率是很重要,但是我认为修改语言设计并不是提高效率的正确方法。
正确做法应该是将语言的语义与语言的实现予以分离。在语义上不需要同时存在列表和字符串,单单列表就够了。而在实现上做好编译器优化,使它在必要时把字符串作为连续字节的形式处理^。
^「我相信,Lisp Machine Lisp(Lisp语言的一种方言)是第一个具体表达这样一种观点的语言:变量的声明(除了动态类型变量之外)只是优化的建议,对一个正确程序本身的含义不构成影响。Common Lisp(Lisp语言的另一种方言)则好像第一个明确提出了这一点。」
2018-08-14 18:34:29
毕竟数组只是散列表的一个子集,其特点就是数组的键全部都是整数向量。进一步说,散列表本身会不会被列表取代呢?
2018-08-14 18:42:03
即使是应用程序,使用多层形式开发也是一种很强大的技巧。自下而上的编程方法意味着要把软件分成好几层,每一层都可以充当它上面那一层的开发语言。这种方法往往会产生更小、更灵活的程序。它也是通往软件圣杯——可重用性(reusability)——的最佳路线。从定义上看,语言就是可以重用的。在编程语言的帮助下,你的应用程序越是采用这种多层形式开发,它的可重用性就越好。
13.书呆子的复仇
2018-08-22 13:13:15
一般来说,如果你动手创造一种新语言,那是因为你觉得它在某些方面会优于现有的语言。J
向心力
2018-08-22 13:31:47
如果你创业的话,千万不要为了取悦风险投资商或潜在并购方而设计你的产品。让用户感到满意才是你的设计方向。只要赢得用户,其他事情就会接踵而来。如果没有用户,谁会关心你选择的“正统”技术是多么令人放心。
随大流的代价
2018-08-22 13:32:08
随大流的代价
一个诀窍
2018-08-22 13:44:18
我们就有了两点结论,我认为它们非常有价值。事实上,这是我用自己的经历换来的。第一,不同语言的编程能力不一样。第二,大多数经理故意忽视第一点。
附录:编程能力
2018-08-22 13:56:12
格林斯潘第十定律”(Greenspun’s Tenth Rule):
任何C或Fortran程序复杂到一定程度之后,都会包含一个临时开发的、只有一半功能的、不完全符合规格的、到处都是bug的、运行速度很慢的Common Lisp实现。
2018-08-22 13:56:25
如果你想解决一个困难的问题,关键不是你使用的语言是否强大,而是好几个因素同时发挥作用:(a)使用一种强大的语言;(b)为这个难题写一个事实上的解释器;或者(c)你自己变成这个难题的人肉编译器。在Python的例子中,这样的处理方法已经开始出现了,我们实际上就是自己写代码,模拟出编译器实现词法变量的功能。
2018-08-22 13:57:45
皮特·诺维格发现,总共23种设计模式之中,有16种在Lisp语言中“本身就提供,或者被大大简化”。(www.norvig.com/design-pattems)」
简洁
2018-08-22 14:18:04
简洁性最重要的方面就是要使得语言更抽象。
效率
2018-08-22 14:28:54
所以,编程时提高代码运行速度的关键是使用好的性能分析器(profiler),而不是使用其他方法,比如精心选择一种静态类型的编程语言。
时间
2018-08-22 14:36:56
,要常年累月不断地做市场推广,直到人们开始接受这种发明。我们就耗费了好几年才使得客户明白ViaWeb不需要下载安装就能使用。不过,好消息是,简单重复同一个信息就能解决这个问题。你只需要不停地重复同一句话,最终人们将会开始倾听。人们真正注意到你的时候,不是第一眼看到你站在那里,而是发现过了这么久你居然还在那里。
2018-08-22 14:37:38
新技术被市场接纳的方式有两种,一种是自然成长式,另一种是大爆炸式。自
再设计
2018-08-22 14:39:52
为了写出优秀软件,你必须同时具备两种互相冲突的信念。一方面,你要像初生牛犊一样,对自己的能力信心万丈;另一方面,你又要像历经沧桑的老人一样,对自己的能力抱着怀疑态度。
2018-08-22 14:40:26
你必须对解决难题的可能性保持乐观,同时对当前解法的合理性保持怀疑。
15.设计与研究
2018-08-22 16:06:07
设计与研究的区别看来就在于,前者追求“好”(good),后者追求“新”(new)。优秀的设计不一定很“新”,但必须是“好”的;优秀的研究不一定很“好”,但必须是“新”的。我认为这两条道路最后会发生交叉:只有应用“新”的创意和理论,才会诞生超越前人的最佳设计;只有解决那些值得解决的难题(也就是“好”的难题),才会诞生最佳研究。所以,最终来说,设计和研究都通向同一个地方,只是前进的路线不同罢
2018-08-22 16:10:19
怎么理解编程语言?你不要把它看成那些已完成的程序的表达方式,而应该把它理解成促进程序从无到有的一种媒介。这里的意思是说,成品的材料和开发时用的材料其实是不一样的。搞艺术的人都知道,这两个阶段往往需要不同的媒介。比如,大理石是一种非常良好、耐用的材料,很适合用于最后的成品,但是它极其缺乏弹性和灵活性,所以不适合在构思阶段用来做模型。
2018-08-22 16:16:24
开发软件的时候,我有一条规则:任何时候,代码都必须能够运行。
2018-08-22 16:17:35
设计意味着做出符合人类特点和需要的产品。但是,“人类”不仅包括用户,还包括设计师,所以设计工作本身也必须符合设计师的特点和需要。