作者:Paul Graham,是Y Combinator的联合创始人之一,在YC官网上的介绍如下:
https://www.ycombinator.com/people/
他的个人网站: http://www.paulgraham.com/
文章列表: http://www.paulgraham.com/articles.html
保罗·格雷厄姆,YC创始人,退休
保罗·格雷厄姆是 On Lisp(1993), ANSI Common Lisp(1995)和 Hackers & Painters(2004)的作者。 1995年,他和罗伯特·莫里斯(Robert Morris)创立了首家SaaS公司Viaweb,并于1998年更名为Yahoo Store。 在2002年,他发现了一种简单的垃圾邮件过滤算法,该算法启发了当前一代的过滤器。 他拥有康奈尔大学的文学学士学位和哈佛大学的计算机科学博士学位。
YC是美国一家成立于2005年的加速器投资机构,目前已经孵化了超过1900家初创公司,这些公司的总估值达到1000亿美元。其中包括刚刚在美国上市的Dropbox,以及Airbnb、Reddit等。
出于兴趣而解决某个难题,不管它有没有用,这就是黑客(优秀程序员)。
黑客行为必须包含三个特点:好玩、高智商、探索精神。
黑客价值观的核心原则可以概括成这样几点:分享、开放、民主、计算机的自由使用、进步。
黑客不服从管教,具有叛逆精神。
只有传统意义上的黑客才能被称为hacker,而那些恶意入侵计算机系统的人应该被称为cracker(入侵者)。
1 为什么书呆子不受欢迎(Why Nerds Are Unpopular)
- 他们的心思在别的地方。
- 如果智力本身与"受欢迎"无关,为什么聪明的小孩一直不受同龄人的欢迎呢?我认为,答案就是他们真的不想让自己受欢迎。
- "书呆子"的目标具有两重性。他们毫无疑问想让自己受欢迎,但是他们更愿意让自己聪明。
- 书呆子不受欢迎的真正原因,是他们脑子里想着别的事情。
- 真实世界的关键并非在于它是由成年人组成的,而在于它的庞大规模使得你做的每件事都能产生真正意义上的效果。
- 真实世界的特点是,它极其庞大。
- 学校的真正目的是把儿童都关在同一个地方,以便大人们白天可以腾出手来把事情做完。
- 专业化。当工作的专业程度越来越高时,我们就必须接受更长时间的训练。
- 叛逆心理的主要焦点在于毒品的使用,尤其是大麻。
- 大部分孩子使用毒品的主要原因是出于叛逆心理。
- 校园生活的真正问题是空虚。
2 黑客与画家(Hackers and Painters)
- 黑客也是创作者,与画家、建造师、作家一样。
- 黑客真正想做的是设计优美的软件,考核这种工作是非常困难的。
- 大学和实验室强迫黑客成为科学家,企业强迫黑客成为工程师。
- 黑客如何才能做自己喜欢的事情?找一份养家糊口的"白天工作"(day job)。
- 黑客解决生计问题的方法是找一份"白天工作",然后在其余时间开发优美的软件。
- 如果你不爱一件事,你不可能把它做得真正优秀,要是你热爱编程,你就不可避免地会开发你自己的项目。
- 黑客更像创作者,而不是科学家。
- 大多数黑客不是通过大学课程学会编程的,他们从实践中学习。
- 创作者另一个学习的途径是通过范例。黑客可以通过观看优秀的程序学会编程,不是看它们的执行结果,而是看它们的源代码。
- 优秀的软件也要求对美的狂热追求。
- 普通黑客与优秀黑客的所有区别之中,会不会"换位思考"可能是最重要的单个因素。
- 判断一个人是否具备"换位思考"的能力有一个好方法,那就是看他怎样向没有技术背景的解释技术问题。
- 程序写出来是给人看的,附带能在机器上运行。
3 不能说的话(What You Can't Say)
- 如果你的想法是社会无法容忍的,你怎么办?
- 你是一个随大流的人吗?
- 真话。找出"不能说的话"的第一种方法:判断言论的真伪。
- 异端邪说。我们把这种不一定正确,但是极富争议的言论称为"异端邪说"。关注"异端邪说",是找出"不能说的话"的第二种方法。
- 时空差异。找出"不能说的话"的第三种方法:将当代观念与不同时期的古代观念diff一下。
- 道貌岸然。孩子的大脑就是我们所有"不能说的话"的一面反射镜。
- 机制。第五种方法,可以找出"不能说的话",那就是去观察禁忌是如何产生的。
- 为什么要找出"不能说的话"?包括纯粹的好奇心,不喜欢犯错,这是很好的脑力训练。优秀作品往往来自于其他人忽视的想法,而最被忽视的想法就是那些被禁止的思想观点。
- 守口如瓶。一旦发现了"不能说的话",下一步怎么办?我的建议就是别说,至少也要挑选合适的场合再说,只打那些值得打的仗。
- 笑脸相迎?一是逐步把辩论提升到一个抽象的层次;二是使用隐喻(metaphor);最好的一种可能就是幽默。
- 永远质疑。
- 想要摆脱你自己的时代的流行,需要一点自觉。
- 如果你想要清晰地思考,就必须远离人群。
- 如果自己就是潮水的一部分,怎么能看见潮流的方向呢?你只能永远保持质疑。问自己,什么说是我不能说的?为什么?
4 良好的坏习惯(Good Bad Attitude)
- 在大众眼里,"黑客"(hacker)就是入侵计算机的人。可是,在程序员眼里,"黑客"指的是优秀程序员。也指"精通",可以随心所欲地支配计算机。
- 黑客是不服从管教的。
- 保护"知识产权"的力度不断增大,已经威胁到了他们完成工作所必需的"思想自由"。
- 黑客是不服从管教的,这就是他们的本性。这也是美国人的本性。
- 对于适当的不服从管教,保持宽容不会有太大的坏处,反而很有利于美国的国家优势,它使得美国不仅能吸引聪明人,还能吸引那些很自负的人。
- 正是那些不服从管教的人们,才是美国财富与力量的源泉。
5 另一条路(The Other Road Ahead)
- 使用互联网软件,除了软件本身,大多数用户不需要知道别的事情。
- 使用那些纯粹的互联网软件,你只需要一个能够上网的浏览器即可。有了互联网软件,你的数据和软件本身都不保存在终端设备上,不用安装就能使用。
- 所有用户都使用同样版本的互联网软件,bug一发现就会立刻得到纠正。
- 由于互联网应用程序由多种软件而不是单独一个二进制文件构成,所以可以使用多种编程语言开发。
- 互联网软件带来的最大变化之一,就是软件发布方式的改变。互联网软件的发布规则是:它运行不了,你就无法发布;一旦它能运行了,你就可以立刻发布。
- 互联网软件的另一个技术优势在于,你能再现大部分的bug。解决新代码的bug要比解决历史遗留代码的bug容易。
- 有一种编程方法叫做"函数式编程",它对你会有帮助,可以避免一些副作用。
- 当你可以再现错误时,你开发客服支持的方式就变了。
- 互联网软件不仅把开发者与他的代码更紧密地联系在了一起,而且把开发者与他的用户也更紧密联系在了一起。关注用户不仅有助于优化程序,还有助于指导你的设计。
- "订报纸模式"正是互联网软件天然的收费模式。
- 谁是互联网软件的目标客户?Viaweb一开始就把个人和小企业当作目标客户。我认为这是互联网软件的通行规则。
- 为什么桌面电脑大获全胜?主要是因为它们的软件更出色。为什么它们的软件更出色?原因可能是这些软件是小公司写出来的。
- 在互联网软件的世界,微软并不会因为它在桌面软件世界的成功而自动得到一席之地。
- 纵观创业公司的历史,你会发现它们变得越来越小,越来越快,越来越不像正规的企业。桌面软件迫使用户变成系统管理员,互联网软件则是迫使程序员变成系统管理员;用户的压力变小了,程序员的压力变大了。
- 如果你是一个黑客,并且梦想自己创业,可能会有两件事情 令你望而却步,不敢真正采取行动。一件是你不懂得管理企业,另一件是你害怕竞争。
- 管理企业只要记住两点就可以了:做出用户喜欢的产品,保证开支小于收入。
- 至于如何做出用户喜欢的产品,下面是一些通用规则。从制造简洁的产品开始着手,首先要保证你自己愿意使用。然后,迅速地做出1.0版,并且不断加以改进,整个过程中密切倾听用户的反馈。用户总是对的,但是不同的用户要求不一样。低端的用户要求简化操作和清晰易懂,高端的用户要求你增加新功能。软件最大的好处就是让一切变得简单。但是,做到这一点的方法是正确设置默认值,而不是限制用户的选择。
6 如何创造财富(How to Make Wealth)
- 如果你想致富,应该怎么做?我认为最好的办法就是自己创业,或者加入创业公司(startup)。
- 从经济学观点看,你可以把创业想象成一个压缩过程,你的所有工作年份被压缩成了短短几年。你不再是低强度地工作四十年,而是以极限强度工作四年。
- 任何公司的成功历程中,运气都是一个很大的随机因素。
- 通过创造有价值的东西而致富,这种方法的优势不仅仅在于它是合法的,还在于它更简单。
- 创造有价值的东西就是创造财富。
- 金钱是财富的一种简便的表达方式:金钱有点像流动的财富,两者往往可以互相转化。
- 金钱就是交换中介,它必须数量稀少,并且便于携带。
- 世界上可供交换的财富不是一个恒定不变的量。人类历史上的财富一直在不停地增长和毁灭(总体上看是净增长)。
- 目前还存在的最大的手工艺人群体就是程序员。
- 最顶尖的5%的程序员写出了全世界99%的优秀软件。
- 公司一切行为的目的都是盈利,从而生存下去。创造财富是大多数公司盈利的手段。
- 大公司最大的困扰就是无法准确测量每个员工的贡献。
- 要致富,你需要两样东西:可测量性和可放大性。
- 小团体=可测量性。创业公司的真正意义是,理想情况下,你与其他愿意更努力工作的人一起组成一个团队,共同谋取更高的回报(相比他们为大公司工作的情况)。
- 乔布斯曾经说过,创业的成败取决于最早加入公司的那十个人。
- 团队越大,每个人的贡献就越接近于整体的平均值。
- 高科技=可放大性。回顾历史,大多数因为创造财富而发财的人都是通过开发新技术而实现的。
- 选择公司要解决什么问题应该以问题的难度作为指引,而且此后的各种决策都应该以此为原则。
- 在实际操作中,这就意味着我们故意选择那些很困难的技术问题。
- 如果你开发出来的技术是竞争对手难于复制的,那就够了,你不需要依靠其他防御手段了。
- 创业的潜规则:一条就是很多事情由不得你,另一条是创业的付出与回报虽然总体上是成比例的,但是在个体上是不成比例的。
- 用户是你证明自己创造了财富的唯一证据。
- 为何欧洲在历史上变得如此强大?答案可能就是欧洲人接受了一个威力巨大的新观点:允许赚到大钱的人保住自己的财富。
- 要鼓励大家去创业。只要懂得藏富于民,国家就会变得强大。让书呆子保住他们的血汗钱,你就会无敌于天下。
7 关注贫富分化(Mind the Gap)
- 我认为有三个原因使得我们对赚钱另眼相看。第一,我们从小被误导的对财富的看法;第二,历史上积累财富的方式大多名声不好;第三,担心收入差距拉大将对社会产生不利影响。
- 每个人的技能不同,导致收入不同,这才是贫富分化的主要原因。
- 一个人的工作具有多少价值不是由政府决定的,而是由市场决定的。
- "不公平"这三个字就是"老爹模式"的独门标志。老爹模式认为财富就是从某个口子流出来,被大家分享的东西,而不是来源于满足他人的需求的创造活动。
- 在大部分的人类历史中,积累财富最常见的方法其实是偷窃。游牧社会是偷别人的牲口,农业社会是征税(和平时期)和直接掠夺(战争时期)。
- 中产阶级的出现使得财富总量不再是一个固定不变的值,财富的分配也不再是一种零和游戏。
- 技术的杠杆效应。技术对生产效率的提高不是线性的,而可能是多项式形态(polynomial)的。
- 技术应该会引起收入差距的扩大,但是似乎能缩小其他差距。
- 技术无法使其变得更便宜的唯一东西,就是品牌。
- 无论在物质上,还是在社会地位上,技术好像都缩小了富人与穷人之间的差距,而不是让这种差距扩大了。
- 现代社会的收入差距扩大是一种健康的信号。
- 一个社会需要有富人,这主要不是因为你需要富人的支出创造就业机会,而是因为他们在致富过程中做出的事情。
8 防止垃圾邮件的一种方法(A Plan for Spam)
- 因为贝叶斯方法计算的是概率,所以它必须考虑邮件中所有的线索,不管是肯定性线索到家没是否定性线索。
- 在所有对抗垃圾邮件的方法之中(从软件方法到法律方法),我认为单独来看,"贝叶斯过滤"是最有效的工具。
9 设计者的品味(Taste for Makers)
原文:http://www.paulgraham.com/taste.html
- 好设计是简单的设计。
- 好设计是永不过时的设计。
- 好设计是解决主要问题的设计。
- 好设计是启发性的设计。
- 好设计通常是有点趣味性的设计。
- 好设计是艰苦的设计。
- 好设计是看似容易的设计。
- 好设计是对称的设计。
- 好设计是模仿大自然的设计。
- 好设计是一种再设计。
- 好设计是一种能够复制的设计。
- 好设计常常是奇特的设计。
- 好设计是成批出现的。
- 推动人才成批涌现的最大因素就是,让有天赋的人聚在一起,共同解决某个难题。
- 好设计常常是大胆的设计。
优秀作品的秘诀就是:非常严格的品味,再加上实现这种品味的能力。
10 编程语言解析(Programming Languages Explained)
- 机器语言(也包括汇编语言)
- 高级语言
- 开放源码
- 语言的战争
- 抽象性
- 安全性还是手铐?
- 面向对象编程
- 文艺复兴
11 一百年后的编程语言(The Hundred-Year Language)
原文:http://www.paulgraham.com/hundred.html
- 基本运算符是一种语言能否长期存在的最重要因素。
- 那些内核最小、最干净的编程语言才会存在于进化的主干上。
- 编程语言进化缓慢的原因在于它们并不是真正的技术。
- 正确做法应该是将语言的语义与语言的实现予以分享。
- 一百年后的程序员最需要的编程语言就是可以让你毫不费力地写出程序第一版的编程语言,哪怕它的效率低下得惊人。
- 即使是应用程序,使用多层形式开发也是一种很强大的技巧。
- 新语言更多地以开源项目的形式出现,而不是以研究性项目的形式出现。
- 我们的两个观点就是:(1)一百年后的编程语言在理论上今天就能设计出来;(2)如果今天真能设计出这样一种语言,很可能现在就适合编程,并且能够产生更好的效果。
12 拒绝平庸(Beating the Averages)
该章节主要说的是作者创办的Viaweb主要采用Lisp语言开发,他认为这是战胜竞争对手的秘密武器。他讲了很多Lisp语言的优点,如支持宏,抽象层次高,是最强大的编程语言。埃里克·雷蒙德的文章《如何成为一名黑客》说:真正非常严肃地把黑客作为人生目标的人,应该考虑学习Lisp。
13 书呆子的复仇(Revenge of the Nerds)
- 软件业有一场永不停息的战斗,书生气的开发者与官僚主义的经理之间问题发生冲突。
- 朝着数学的方法发展。
- 为什么Lisp语言很特别
- 条件结构(if-then-else结构)
- 函数也是一种数据类型。
- 递归
- 变量的动态类型
- 垃圾回收机制
- 程序由表达式组成
- 符号类型
- 代码使用符号和常量组成的树形表示法。
- 无论什么时候,整个语言都是可用的。
- 语言优势真正体现的地方。条件越苛刻的项目,强大的编程语言就越能发挥作用。
- 如果你创业的话,千万不要为了取悦风险投资商或潜在并购方而设计你的产品。让用户感到满意才是你的设计方向。
- 随大流的代价。
- 由于选择了不当的编程语言而导致项目失败的可能性,是你的经理不愿意考虑的问题。
- 编程语言的所谓"业界最佳实践",实际上不会让你变成最佳,只会让你变得很平常。
附录:编程能力
我们需要写一个函数,它能够生成累加器,即这个函数接受一个参数n,然后返回另一个函数,后者接受参数i,然后返回n增加(increment)了i后的值。
Python:
def counter(n): curr = [n] def incr(i): curr[0] += i return curr[0] return incr if __name__ == '__main__': c = counter(10) print(c(1)) // 11 print(c(1)) // 12 print(c(1)) // 13
Go:
func incr(n int) func(int) int { return func(i int) int { n += i return n } } func main() { add := incr(10) fmt.Println(add(1)) fmt.Println(add(1)) fmt.Println(add(1)) }
Java:
interface Calc { int incr(int i); } public class Solution { public static Calc foo(final int n) { return new Calc() { int s = n; public int incr(int i) { s = s + i; return s; } }; } public static void main(String[] args) { Calc calc = foo(10); System.out.println(calc.incr(1)); System.out.println(calc.incr(1)); System.out.println(calc.incr(1)); } }
14 梦寐以求的编程语言(The Dream Language)
- 一种免费的实现,一本相关书籍,以及语言所依附的计算机系统。
- 简洁,最重要的方面就是要使得语言更抽象。单个的语法单位也应该很简短。
- 可编程性(Hackability)。优秀程序员经常想做一些既危险又令人恼火的事情。
- 一次性程序。它必须很适合开发一次性程序。
- 函数库。未来的函数库将像语言内核一样精心设计。
- 效率。编程时提高代码运行速度的关键是使用好的性能分析器(profiler),而不是使用其他方法。
- 时间。一种编程语言要想变得流行,最后一关就是要经受住时间的考验。新技术被市场接纳的方式有两种,一种是自然成长式,另一种是大爆炸式。
- 再设计。设计一样东西,最重要的一点就是要经常"再设计",编程尤其如此,再多的修改都不过分。
15 设计与研究(Design and Research)
- 设计与研究的区别看来就在于,前者追求"好"(good),后者追求"新"(new)。
- 让用户满意并不等于迎合用户的一切要求。用户不了解所有可能的选择,也经常弄错自己真正想要的东西。
- 如果目标用户群体涵盖了设计师本人,那么最有可能诞生优秀设计。
- 为了做出优秀的设计,你必须贴近用户,始终寸步不离,永远站在用户的角度调整自己的构想。
- 在软件领域,贴近用户的设计思想被归纳为"弱即是强"(Worse is Better)模式。软件功能的增加并不必然带来质量的提高。有时候,更少的功能("弱")反而是更好的选择("强"),因为这会使得软件的可用性提高。
- 如果你正在设计某种新东西,就应该尽快拿出原型,听取用户的意见。
- 先做出原型(prototype),再逐步加工做出成品,这种方式有利于鼓舞士气,因为它使得你随时都可以看到工作的成效。开发软件的时候,我有一条规则:任何时候,代码都必须能够运行。