黑客与画家 —— 关于编程和创业

《黑客与画家》是Paul Graham的博文集。出版于2006年。它从一个“黑客”的角度阐述了编程,互联网程序等时兴的概念。深刻新鲜而发人深省。其对工作、语言的认识别具特色,而在学校教育和贫富分化等方面的认识却略显偏颇。

全书大致分为3部分

  • 1-4章解释黑客如何成长以及如何看待世界
  • 5-9章介绍创业、工作的方法论
  • 10-15章讨论编程语言的特点和使用方法

下面仅摘出些句子。个人评注已加粗。

为什么书呆子不受欢迎

  • 在人产生良知前,折磨是种娱乐。
  • 学校的真正目的是把儿童都关在一个地方,以便大人们白天可以腾出手来把事情做完(哈哈哈

黑客与画家

  • 编程语言是用来帮助思考程序的,而不是用来表达你已经想好的程序
  • 大多数黑客不是通过大学课程学会编程的,他们从实践中学习,13岁时就已经自己动手写程序了。
  • debug对我来说属于轻松的工作
  • 软件的部分功能就是解释自身,软件的使用方式最好能符合用户的直觉,源代码应该可以自己解释自己
  • 程序是写出来给人看的,附带能在机器上运行

不能说的话

  • (流行)第一批的接收者总是带有很强的抱负心,他们有自觉的精英意识,想把自己与普通人区分开来
  • 流行趋势确立以后,第二接收者就加入进来了,他们接受流行,不是因为想要与众不同,而是害怕与众不同
  • 与笨蛋辩论,你也会变成笨蛋

良好的坏习惯

  • 在我看来,一个人们拥有言论自由和行动自由的社会,往往最有可能采纳最优方案(真的么?

另一条路

  • (互联网程序)不需要为新版本付出额外的费用,或者做额外的准备,甚至可能你都不知道软件已经升级了
  • 互联网软件则完全不同,修改起来很方便。软件的发布过程可以分解成一系列的渐进式修改(快步小跑
  • 软件应该做到用户认为它可以做到的事情。但是,你不知道用户到底怎么想
  • 没有盗版是一种“优势”,但也是一个问题。一定数量的盗版对软件公司时有好处的。因为不管你的软件定价多少,有些用户永远不会购买
  • 要求用户做得越多,你担的风险就越大
  • 管理企业其实很简单,只要记住两点就可以了:做出用户喜欢的产品,保证开支小于收入
  • 从制造简洁的产品开始着手,首先要保证你自己愿意使用。然后,迅速作出1.0版,并不断加以改进
  • 无论如何,你都要使用自己的软件

如何创造财富

注意:标题不等于“如何致富”
  • 从经济学观点看,你可以把创业想象成一个压缩过程
  • 如果你想赚100万美元,就不得不忍受相当于100万美元的痛苦。创业公司将你所有的压力压缩到三四年
  • 通过创造有价值的东西而致富,优势不仅在于它合法,还在于它更简单,因为你只需要做出别人需要的东西就可以了
  • 金钱不是财富,而只是我们用来转移财富所有权的东西
  • 公司就是许多人聚在一起创造财富的地方,能够制造更多人们需要的东西
  • 人们需要的东西就是财富
  • 上班的日子不如上学的日子有趣,但是有人付钱给你,而不是你付钱给学校
  • 创造财富是大多数公司盈利的手段
  • 上班的日子为什么会差别这么大?不要搞糊涂了,你现在已经从顾客变成了仆人
  • 收入和风险是对称的,所以如果有巨大的获利可能,就必然存在巨大的失败可能。如果你有一个令你感到安全的工作,你是不会致富的
  • 创业的付出和回报虽然总体上是成比例的,但是在个体上是不成比例的
  • 只有在快速获得巨大利益的激励下,你才会去挑战那些困难的问题,否则你根本不愿意去碰它们

关注贫富分化

  • 进入社会以后,你不能总是靠父母养活,如果你需要什么东西,要么你自己做出来,要么做其他东西与需要的人交换金钱,再用金钱去买你想要的东西
  • 技术肯定加剧了有技术者与无技术者之间的生产效率差异
  • 技术在加大收入差距的同时,缩小了大部分的其他差距

防止垃圾邮件的一种方法

  • 我对贝叶斯方法寄予厚望,因为它的过滤能力可以随着垃圾邮件一起进化

设计者的品味

  • 他想要的学生不仅应该技术过硬,还应当能够使用技术做出优美的产品
  • 你需要的是咬牙向前冲刺的痛苦,而不是脚被钉子扎破的痛苦。解决难题的痛苦对设计师有好处,但是对付挑剔的客户的痛苦或者对付质量低劣的建材的痛苦就是另外一回事了
  • 在历史的任何时刻都有一些热点项目,一些团体在这些项目上做出伟大的成绩。如果你远离这些中心,几乎不可能单靠自己就取得伟大成果

编程语言解析

  • 程序员的时间要比计算机的时间昂贵得多
  • 长期使用某种语言,你就会慢慢按照这种语言的思维模式进行思考
  • 有些人认为编程语言应该防止程序员干蠢事,另一些人则认为程序员应该可以用编程语言干一切他们想干的事(即静态类型语言和动态类型语言
  • 事实上,有两种程度的面向对象编程:某些语言允许你以这种风格编程,另一些语言则强迫你一定要这样编程

一百年后的编程语言

  • 当我说Java不会成功时,我的意思是它和Cobol一样,进化之路已经走到了尽头(哦?
  • 一种语言的内核设计越小、越干净,它的生命力就越顽强
  • 用足够灵活的语言,聪明的程序员能写多好,笨的程序员就能写多烂
  • 一百年后的程序员最需要的编程语言就是可以让你毫不费力写出程序第一版的编程语言

拒绝平庸

  • Lisp很值得学习。你掌握它之后,会感动它给你带来的极大启发
  • 大概在1960年,Lisp语言引入了垃圾回收机制。……闭包是20世纪60年代Lisp语言引入的功能……宏也是60年代中期Lisp语言引入的,现在还是一片处女地(这里的“宏”为Lisp中的defmacro
  • 这里有一个评估竞争对手的妙招——关注他们的招聘职位

书呆子的复仇

  • 符号(Symbol)实际上是一种指针,指向存储在散列表中的字符串
  • 列表是Lisp的基本数据结构
  • 让客户感到满意才是你的设计方向。只要赢得用户,其他的事情就会接踵而至
  • JavaScript的写法比Lisp和Ruby稍微长一点,因为JavaScript依然区分语句和表达式
  • 所有这些语言都是图灵等价的
  • “任何C或Fortran程序复杂到一定程度之后,都会包含一个临时开发的、只有一半功能的、不完全符合规格的、到处都是bug的、运行速度很慢的Common Lisp实现。”
  • 想解决一个困难的问题,有三条路:1)使用一种强大的语言,2)为这个难题写一个事实上的解释器,3)你自己变成这个难题的人肉编译器(翻译过来就是语言本身/设计模式/问题抽象

梦寐以求的编程语言

  • 优秀的函数库的重要性将超过语言本身
  • 就算委员会只有两个人,还是会妨碍“再设计”,典型例子就是软件内部的各个接口有不同的人负责。这时除非两个人都同意改变接口,否则接口就无法改变

设计与研究

  • “用户需要的设计”≠“用户要求的设计”
  • 设计必须以人为本
  • 在软件领域,贴近用户的设计思想被归纳为“弱即是强”模式。
  • 一种功能有限但易于使用的软件可能对用户有更大吸引力
  • 先做出原型,在逐步加工做出成品,这种方式有利于鼓舞士气,因为它使得你随时都可以看到工作的成效