《黑客与画家》

这是作者的一部博客文集,我觉得其中很多观点是我从没切换角度去思考过的,这里只是把这些观点散列在这,无论对错。

# 自我实现

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

对莎士比亚的评价

他的影响远远超过了他的时代,时间就是对他文学成就的检验,不管他的作品从那时的暗语,风俗,政治局势之中得到过怎样的优势。这些优势都已经消失多年了。他在每一幕戏剧中,通过模拟那时的生活所产生的每一个欢乐的主题或悲伤的动机,都已趋于平淡,而不再是戏剧的亮点。贵族的宠爱和对手的竞争都不再产生效果;朋友和敌人都走进了坟墓;他的作品再不是支持乙方打击另一方的舆论工具;它们既不能产生虚名,也不会带来带来恶意的攻击。人们阅读这些作品,只有一个理由,那就是欣赏作品本身。因此,只有人们真正欣赏它们,才会发出赞美

做事打草稿是一个号习惯

专业化 Specialization

如果你觉得人生糟透了,那不是因为体内激素分泌失调(你的父母相信这种说法)。也不是因为人生真的糟透了(你本人相信这种说法)。那是因为你对成年人不再具有经济价值(与工业社会以前时期相比),所以他们把你扔在学校里,一关就是好几年,根本没有真正的事情可做。任何这种类型的组织都是可怕的生存环境。你根本不需要寻找其他原因就能解释为什么青少年是不快乐的。

机制:观察禁忌是如何产生的

道德禁忌最大的制造者是那些权力斗争中略占上风的一方。这一方有实力推行禁忌,同时又软弱到需要禁忌保护自己的利益


# 寻找不能说的话

我们需要的不能说的话需要满足一下两个条件

a. 这些话不能说出口
b. 它们是正确的,或者看起来很可能正确。值得进一步讨论

如果伽利略说帕多瓦城的人身高三米,他只会被当做一个古怪的疯狂科学家。但是他说地球围绕太阳转,性质就不一样了。教廷知道,这种话会让人们开始思考

method 1: 真话,判断言论的真伪
method 2: 异端学说,暂时关闭自我审查,潜伏在我们脑海思维深处的 “异端学说” 就会浮现出来
method 3: 时空差异,回顾过去,我们可以去找那些过去被认为理所当然,如今却被认为不可思议的事情,古今中外的变化往往不是因为对错,而是因为社会观念变了
method 4: 道貌岸然,寻找那些一本正经的卫道者,看看他们到底在捍卫什么
eg: 大人不想让小孩接触到脏话。隐瞒关于圣诞老人的真相
method 5: 机制,观察禁忌是如何产生的
eg: 某种道德观念到底是怎么出现的,又是怎么被其他人接受的

道德禁忌的最大制造者是那些权力斗争中略占上风的一方。你会发现,这一方有实力推行禁忌,同时又软弱到需要禁忌保护自己的利益。

# 为什么要寻找不能说的话

  1. 好奇心
  2. 不喜欢犯错
  3. 这是很好的脑力训练。想要做出优秀作品,你需要一个什么问题都能思考的大脑。尤其是那些不应该思考的问题,你的大脑也要养成思考他们的习惯。

优秀作品往往来自于其他人忽视的想法,而最被忽视的想法就是那些被禁止的思想观点。

守口如瓶:一旦发现 “不能说的话”,我的建议就是别说,知道要挑选合适的场合再说,只打那些值得打的仗

永远质疑:各种各样的标签是外部线索的最大来源,帮助你发现这个时代流行的是什么。如果一个命题错了,这就是它所能得到的最坏评价,足够批判它了,根本不用再加上任何其他标签。


# 财富

大饼谬论:世界上的财富总额是固定不变的 (x% 人口占有了 y% 的财富)

局部来讲是这样的(家庭的总收入,某年的政府税收),但是只要是制作或者修补产品就是在创造财富

财富不同于金钱,金钱是流动的财富

允许赚到大钱的人保住自己的财富

冷战、第二次世界大战、近代大多数战争都说明了这个道理。要鼓励大家去创业。只要懂得藏富于民,国家就会变得强大。让书呆子保住他们的血汗钱,你就会无敌于天下。

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

(贫富分化是无法避免的)

现代社会的收入差距扩大是一种健康的信号。技术使得生产率的差异加速扩大。如果这种扩大没有反应到收入上面,只有三种可能的解释:a. 技术革新停顿了 b. 那些创造大部分财富的人停止工作了 c. 创造财富的人没有获得报酬

# 为什么书呆子不受欢迎

他们不想让自己受欢迎,只想做伟大的事

最受欢迎的孩子并不欺负书呆子,他们不需要靠踩书呆子来垫高自己。大部分的欺负来自处于下一等级的学生,那些焦虑的中间层。
同样,在任何社会等级中,那些对自己没有信心的人就会通过虐待他们眼中的下等人来凸显自己的身份。

在美国社会中底层白人是对待黑人最残酷的群体

# 设计

把品位说成个人的偏好可以有效地杜绝争论,防止人们争执哪一种品位更好。只要你自己开始动手设计东西,就能知道这种说法是不正确的。

至于如何做出用户喜欢的产品,下面是一些通用的规则

从制造简洁的产品着手,首先要保证你自己愿意使用。然后迅速地做出 1.0 版,并且不断加以改进,整个过程中密切倾听用户的反馈。用户总是对的,但是不同用户要求不一样低端用户要求简化操作和清晰易懂,高端用户要求你增加新功能。做到这点的正确方法是正确设置默认值,而不是限制用户选择。要关注竞争对手将来会有什么功能。无论何时你都要使用自己的软件。只有懂得设计的黑客才能设计软件,不能交给对软件一知半解的设计师。如果你不打算自己动手设计和开发,那就不要创业。

  • 好的设计是简单的设计
    当你被迫把东西做得很简单时,你就被迫直接面对真正的问题。当你不能用表面的装饰交差时。你就不得不做好真正的本质部分。
  • 好的设计是永不过时的设计
    以永不过时作为目标是一种帮助自己找到最佳答案的方法。
  • 好的设计是解决主要问题的设计
    传统的新罗马 Times Roman 肢体是一种由衬线的字体,它的小写 g 可以很容易地和小写 y 区分。使得印刷文字易于辨认
  • 好的设计是启发性的设计
  • 好的设计通常是有点趣味性的设计
    幽默一定程度上反映了力量,幽默感是强壮的一种表现。好的设计并非一定要有趣。但是很难想象完全无趣的设计会是好的设计。
  • 好设计是艰苦的设计
    如果你工作的不艰苦,你可能正在浪费时间
  • 好设计是看似容易的设计
  • 好设计是对称的设计
  • 好设计是模仿大自然的设计
  • 好设计是一种再设计
    你应该培养对自己的不满
  • 好设计是能够复制的设计
    等到你逐渐对一件事情产生热情的时候,就不会满足于模仿了,你的品位就进入的第二阶段,开始自觉地进行原创。
  • 好设计常常是奇特的设计
  • 好设计是成批出现的
    推动人才成批涌现的最大因素就是,让有天赋的人聚在一起,共同解决某个难题
    今天的实验性错误就是明天的新理论。如果你想做出伟大的新成果,那就不能对尝试与真理不吻合之处视而不见,反而应该特别注意。
    优秀作品的秘诀就是:非常严格的品位,再加上实现这种品位的能力

艺术在各个领域有着巨大的差别,但我觉得任何一个领域的最佳作品都不可能由对用户言听计从的人做出来,所以我说的是 “用户需要的设计” 而不是 “用户要求的设计”

做一个好的设计是就像做一个医生,你不能头痛医头,脚痛医脚,病人告诉你症状,你必须找到他生病的真正原因,然后针对病因进行治疗。

大多数优秀设计都是这样产生的,他们关注用户,并以用户为中心

如果目标用户群体涵盖设计师本人,那么最有可能诞生优秀设计。如果目标用户与你本人差别很大,你往往会嘉定目标用户的需求比你本人的需求简单,而不是更复杂。

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

关注用户不仅有助于优化程序,还有助于指导你的设计

# 工作和管理

什么事情可以外包,什么事情不可以外包。一个可能的答案是,公司内部所有不直接感受到竞争压力的部门都应该外包出去,让他们暴露在竞争压力之下。

公司不过是一群人在一起工作,共同作出某种人们需要的东西。真正重要的是做出人们需要的东西,而不是加入某个公司。

你想更努力的工作。但是你的工作与其他许多人的工作混杂在一起,这样就产生了问题。在大公司中,个人表现无法单独测量,公司其他人会拖累你。你最好找出色的人合作,因为他们的工作和你一起平均计算

可测量性 * 可放大性 => 财富

职位产生的绩效应该是可测量的 => 可测量的
做出的决定能够产生巨大的效应 => 可放大的

技术就是某种手段,就是我们做事的方式。如果你发现了一种做事的新方式,它的经济价值就取决于有多少人使用这种新方式。

选择公司要解决什么问题应该以问题的难度作为指引,而且此后的各种决策都应该以此为原则。假定软件有两个候选的新功能,他们创造的商业价值完全相同,那么我们总选择较困难的那个功能。- 进入壁垒。复制你的模式是否困难。

一开始就选择较难的问题,此后的各种决策都选择较难的那个选项。(不可替代性)

大多数时候,促成买方掏钱的最好办法不是让买家看到有获利的可能,而是让他们感到失去机会的恐惧。

风险投资商的清单首要的危险信号之一是公司由技术顽童掌控,指向解决有趣的技术问题,不考虑用户的需要。你开办创业公司不是单纯地为了解决问题,而是为了解决那些用户关心的问题。

将公司管理视同软件优化还能帮你避免 VC 担心的另一个陷阱 - 开发某种商品时间过长。现在,黑客都已熟知这一点,并总结出一个术语 “过早优化”。尽快拿出 1.0 版本,然后根据用户反映而不是自己的猜测优化软件

人类喜欢工作,在世界上大多数地方,你的工作就是你身份的证明

几乎在任何团体中都存在等级关系,成年人在真实世界中形成团体,一般来说,都存在某个共同目标。团体的领导者往往由最善于实现目标的人担任。

# 技术

“订报纸模式” 是互联网软件天然的收费模式

避免过早优化

Lisp 语言的黑客早就明白数据结构灵活性的价值,我们写程序第一版时,往往会把所有事情都用列表形式处理。所以,这些最初版本可能效率低下得惊人,你必须努力克制自己才能忍住不动手优化他们。

效率低下的软件并不等于很烂的软件。一种让程序员做无用功的语言才真正称得上烂。浪费程序员的时间而不是浪费机器的时间才是真正无效率。

实现程序的逻辑越短,就更容易发现错误,也容易修改

解释器是实时将代码解释为相应的机器语言,然后一行一行执行,编译器则是先将整个程序全部翻译成机器语言,然后再运行。这是两种高级语言的实现方式

应用软件运行速度提升的关键在于有一个好的性能分析器帮助指导程序开发,而不在于开发出能够生成更快速代码的编译器

编程语言的进化速度更像数学符号的进化速度,而不像真正的技术(比如交通或通信技术)的进化速度。与其说它是技术,还不如说它是程序员的思考模式

采用程序的长度作为它耗费工作量的近似指标是个很有用的技巧。这里的长度指的不是字符的长度,而是各种句法元素的总长度,基本上就是整个解析树的大小。也许不能说最短的程序就是写起来最省力的程序,但是当你一心想把程序写得简洁而不是松松垮垮时,你就更接近省力这个目标,你的日子就会变得好过的多。所以设计语言的正确做法就变成了,看看一段程序,然后问自己是不是能把它写得更短一点。

没事想想一百年后的事情,确立设计目标,并现在就动手去做。

对于这个市场来说,快速开发出产品是很重要的,所以能够快速开发出新功能的公司就会取得巨大的竞争优势。
使用抽象层次高的语言就不需要非常庞大的开发团队,这会降低成本。如果我们的设想是正确的,那我们就能用更少的钱做出一个更好的产品,从而获得利润。最终,我们将独占市场,竞争对手什么也得不到,到头来只能退出这个行业,我们当时心里就是这么想的

有了 LISP 语言的帮助,我们的开发周期很短。有时候,竞争对手刚刚发布新闻稿宣布将引入新功能。我们就能在一两天内做出自己的版本,

我们使用一种奇特的人工智能语言开发软件,它的语法非常古怪,大量使用括号。多年来,要是听到别人这样描述 Lisp 语言,我会勃然大怒。但是现在,这却成了我们的优势。在竞争中,你的对手无法理解你的技术优势,这可是再宝贵不过的了。商场如战场,对手摸不透你,你的胜算就增加了。

如果你的程序只是要做一些很简单的事(比如整数运算或者位操作),那就不妨使用一种比较靠近机器的低层次语言。主要原因是这样运行起来会更快一些。如果你的程序很短,只是为了滕丁场合一次性使用,那么你最好根据你要解决的问题选择具有最强大函数库的语言。不过,总的来看对于应用程序来说,还是应该选择总体最强大,效率也在可接受范围内的编程语言,否则都不是正确选择。就好像你选择机器语言编程一样,只是程度上的差异而已。

如果 A 语言有一个运算符,可以移除字符串中的空格,而 B 语言没有这个运算符,这可能不足以证明 A 语言要比 B 语言强大,因为你可以在 B 语言里写一个函数实现这个功能。但是,如果 A 语言支持某种高级功能(假定是递归)而 B 语言不支持,你就不可能通过自己编写函数库解决了,所以这就代表 A 语言比 B 语言强大。

如果你为创业公司工作,那么这里有一个评估竞争对手的妙招 —— 关注他们的招聘职位,他们网掌上的其他内容无非是一些陈腐的照片和夸夸奇谈的文字,但是招聘职位却不得不写得很明确,反映出他们到底想干什么,否则就会引来一大批不合适的求职者。

在 viaweb 创业期间,我读过大量竞争对手的招聘职位,扎不多每个月都有一个新的竞争对手浮出水面,我首先会看他们的产品有没有一个试用版,然后就会去找他们的招聘职位。这样过了几年,我就知道哪些公司值得关注,哪些公司不用在意。这些公司的职位描述使用了大量 IT 词汇,这样的内容越多,这家公司就越构不成威胁。最不用担心的竞争对手是那些要求应聘者具有 Oracle 数据库经验的公司,你永远不必担心他们。如果是招聘 C++ 或 java 程序员的公司,对你也不会构成威胁。如果他们招 Perl 或 Python 程序员,就稍微有点威胁了,至少这听起来像一家技术公司,并且由黑客控制。如果我有幸见到一家招聘 Lisp 黑客的公司,就会真的感受到如临大敌。

为什么 Lisp 语言很特别:

  1. 条件结构
  2. 函数也是一种数据类型
  3. 递归(第一个实现)
  4. 变量的动态类型
  5. 垃圾回收机制
  6. 程序由表达式组成,其他很多语言由表达式和语句组成
  7. 符号类型
  8. 代码使用符号和常量组成树形表达式
  9. 无论什么时候语言都是可用的

一般来说条件苛刻的项目,强大的编程语言就越能发挥作用。

使用一种不常见的语言会出现的问题我想到了三个:

  1. 你的程序可能无法与使用其他语言写的程序协同工作,
  2. 你可能找不到很多函数库
  3. 你可能不容易雇佣到程序员

选择更强大语言会减少所需要的开发人员数量。因为 a. 如果你使用的语言很强大,可能会减少一些编程的工作量,也就不需要那么多黑客了;b. 使用更高级语言的黑客可能比别的程序员更聪明

程序员使用某种语言能做到的事情是有极限的。如果你想用一种低层次的语言解决一个很难的问题,那么你将会面临各种情况及其复杂乃至想不清楚的窘境

我承认上面的例子太极端,ITA 似乎有一批非常聪明的黑客,而 C 语言又是一种很低层次的语言。但是,在一个高度竞争的市场中,即使开发速度只相差两三倍,也足以使得你永远处于落后的位置

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

你必须对解决难题的可能性保持乐观,同时对当前解法的合理性保持怀疑。让这两股相反的力量保持平衡是很难的,初出茅庐的年轻黑客都很乐观,自以为做出了伟大的产品,从不反思改进。上了年纪的黑客又太不自信,甚至故意回避一些挑战性很强的项目。

所谓一次性程序,就是指为了完成某些简单的临时性任务而在很短时间内些出来的程序。eg: 自动完成某些系统管理任务的程序。自动生成测试数据的程序,以及在不同格式之间转化数据的程序
什么样的语言时候写一次性程序。
容易装备,不仅仅指容易安装或者已经安装,还指很容易与使用者互动,有一种命令行界面,可以实时反馈的语言就具有互动性,

技术本来就应该是尖端的,正如伊拉恩・加内特所说,编程语言的所谓 “业界最佳实践”,实际上不会让你变成最佳,只会让你变得平常。

第一:不用语言的编程能力不一样。第二:大多数经历故意忽视这一点

强大的编程语言如何让你写出更短的程序?一个技巧就是(语言允许的情况下)使用 “自下而上” 的编程方法,不是用基础语言开发程序,而是在基础语言之上构建一种你自己的语言(?中间层,引擎),然后再用后者开发应用程序。


语言---中间层---业务
          |
         抽象 eg:函数库,模式,行为

但是我认识的黑客,没有一个人喜欢用静态类型语言编程。我们需要的是一种可以随意涂抹,擦擦改改的语言,我们不想正襟危坐,把一个盛满各种变量的茶杯,小心翼翼放在自己的膝盖上,为了与一丝不苟的编译器大婶交谈努力地挑选词语,确保变量类型的匹配,好让自己显得礼貌而周到

关于编程语言

编程语言的首要的特性应该是允许动态扩展

贝叶斯方法的过滤方法可以随着垃圾邮件一起进化

“”

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

不会游泳 微信支付

微信支付

不会游泳 支付宝

支付宝

不会游泳 贝宝

贝宝