Xhacker’s Base

《黑客与画家》

这本书刚出来的时候就想看,然后从闫铮那借来一本,最后也没看。说来惭愧,我的「2013 必须读完」一本也没有看掉。于是我开始填坑了。

iBooks for iOS 更新以后简直完全没法看中文 EPUB。又试了其他几个阅读器,也都不尽如人意。最后用了 Kindle for iOS,算是唯一能用的一个吧。(其实下次可以把 EPUB 扔到唐茶里试试。但是唐茶不能 highlight。)

这本书是个文集,其中一些文章非常扯淡,而另一些文章又很值得一读。有时候就刷刷刷刷往后翻,发现还在不知所云。所以就这样翻起来还是挺快的。

以下是摘抄时间。

〈黑客与画家〉

黑客搞懂「计算理论」的必要性,与画家搞懂颜料化学成分的必要性差不多大。

创业和财富

Hotmail 于 1996 年 7 月 4 日上线,是第一批浏览器界面的电子邮件服务提供商。它首创了用户可以在邮件中使用 HTML 标记语言(因此 Hotmail 的原始写法是 HoTMaiL)。

如果一个优秀黑客在大公司里的身价是每年 8 万美元,那么一个勤奋工作、摆脱杂事干扰的聪明黑客,他的工作相当于每年新创造 300 万美元的价值。

程序员坐在电脑前就能创造财富。优秀软件本身就是一件有价值的东西。……如果某人坐在电脑前,写出了一个不那么糟糕的浏览器,世界就会变得富有得多。……所以,在程序员看来,事情再明显不过,财富就是被做出来的,而不是某个想象出来的神秘人物分发的大饼。

如果你有一个新点子去找 VC,问他是否投资,他首先就会问你几个问题,其中之一就是其他人复制你的模式是否很困难。也就是说,你为竞争对手设置的壁垒有多高。

你努力 30 倍,最后得到的回报在现实中并不是 30 倍,而是 0 到 1000 倍之间的一个随机数。假定所有创业者都努力 30 倍,最后他们得到的总体平均回报是 30 倍,但中位数却是 0。

我们宁愿以百分之百的把握去赚 100 万美元,也不愿以 20% 的把握去赚 1000 万美元,尽管后者理论上的期望值比前者高出一倍。很不幸的事,如今的商界不存在以百分之百把握赚到 100 万美元的可能。
保险的做法就是在早期卖掉自己的创业公司,放弃未来发展壮大(但风险也随之增大)的机会,只求数量较少但是更有把握的回报。

他们宁愿花大钱做更安全的选择,所以向他们出售一家已经成功的创业公司要比出售还处在早期阶段的创业公司更容易,即使会让他们付出多得多的价码。

大多数时候,促成买方掏钱的最好办法不是让买家看到有获利的可能,而是让他们感到失去机会的恐惧。对于买家来说,最强的收购动机就是看到竞争对手可能收购你。我们发现这会使得 CEO 们连夜行动。次强的动机则是让他们担心如果现在不买你,你的高速成长将使得未来的收购耗资巨大,甚至你本身可能变成一个他们的竞争对手。
在这两种收购动机中,归根结底的因素都是用户数量。你以为买家在收购前会做很多研究,搞清楚你的公司到底值多少钱,其实根本不是这么回事。他们真正在意的只是你拥有的用户数量。

在美国,一些大型上市公司的 CEO 的收入大概是普通人的 100 倍。职业棒球选手的年收入是普通人的 72 倍,职业篮球选手的年收入则是普通人的 128 倍。……第一眼看上去,你可能会觉得难以接受,人与人之间创造财富能力的差别真的会这么巨大吗?理解这一点的关键就在于重新思考我们上面提过的那个问题,他一个人的价值真的等于我们 100 个人的价值吗?你想一想,一个篮球队会同意用一个运动员交换 100 个普通人吗?如果苹果公司不是由乔布斯掌管,而是由一个 100 人组成的委员会掌管,那么这家公司的下一代产品会是什么样?

在自由竞争的市场经济中,价格由买家的需求决定。如果人们喜欢棒球甚于喜欢诗歌,那么棒球运动员的收入就是要比诗人的收入高。

〈设计者的品味〉

就像别的工作一样,只要你不断地从事设计工作,你就会做得越来越好。你的品味会出现变化,你会像别人一样有所提高。

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

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

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

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

充满自信的人常常像燕子一样,以一种居高临下的姿态轻盈地看待周围的一切,比如希区柯克拍摄的电影、16 世纪画家勃鲁盖尔(Bruegel)的绘画(甚至莎士比亚也是一个这方面的例子)。

好设计是看似容易的设计。

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

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

编程语言

另一种可能是,人们还是希望「缓存区溢出攻击」继续存在下去,以便让大家时时保持警惕。

现在好像每隔一段日子就能听到一种新出现的语言。乔纳森・埃里克森把这种现象称为「编程语言的文艺复兴」。人们有时还会用另一个说法,即「编程语言的战争」。这并不矛盾,文艺复兴时期就是存在很多战争的。

你可能认为只有那些自以为是的人才会去预言一百年后的技术。但是,请不要忘记,软件发展的历史已经走过了 50 年。在这 50 年中,编程语言的进化其实是非常缓慢的,因此展望一百年后的语言并不是虚无缥缈的想法。

无论一百年后的计算机是什么样子,我们基本上可以断定它们的运行速度一定会快得多。如果摩尔定律依然成立,一百年后计算机的运行速度将是现在的 74 乘以 10 的 18 次方倍(准确地说是 73 786 976 294 838 206 464 倍)。

在大型组织内部,有一个专门的术语描述这种跟随大多数人的选择的做法,叫做「业界最佳实践」。这个词出现的原因其实就是为了让你的经理可以推卸责任。既然我选择的是「业界最佳实践」,如果不成功,项目失败了,那么你也无法指责我,因为做出选择的人不是我,而是整个「业界」。

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

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

众所周知,好的编程语言生成的代码有较快的运行速度。但是实际上,我觉得代码的运行速度不是编程语言的设计者能够控制的。高德纳很久以前就指出,运行速度只取决于一些关键的瓶颈。而在编程实践中,许多程序员都已经注意到自己很容易搞错瓶颈到底在哪里。
所以,编程时提高代码运行速度的关键是使用好的性能分析器(profiler),而不是使用其他方法,比如精心选择一种静态类型的编程语言。

帕金森定律(Parkinson’s Law)的一种原始表达形式是「工作总是到最后一刻才会完成」。

大多数人接触新事物时都学会了使用类似的过滤机制。甚至有时要听到别人提起十遍以上他们才会留意。这样做完全是合理的,因为大多数的热门新商品事后被证明都是浪费时间的噱头,没多久就消失得无影无踪。

著名散文家 E.B.怀特说过,「最好的文字来自不停的修改」。所有优秀作家都知道这一点,它对软件开发也适用。设计一样东西,最重要的一点就是要经常「再设计」,编程尤其如此,再多的修改都不过分。

为了写出优秀软件,你必须同时具备两种互相冲突的信念。一方面,你要像初生牛犊一样,对自己的能力信心万丈;另一方面,你又要像历经沧桑的老人一样,对自己的能力抱着怀疑态度。在你的大脑中,有一个声音说「千难万险只等闲」,还有一个声音却说「早岁哪知世事艰」。

发展用户就像一种优化过程,明智的做法就是放慢速度。一般情况下,用户比较少意味着你任何时候都可以加大修改的力度。这时,对语言规格做出改变就像撕绷带,当你感到痛苦的一瞬间,痛苦就已经成为了回忆。如果用户数量庞大,修改语言带来的痛苦就将持续很长时间。

除了一些绝对必要隐藏的东西,这种语言的所有细节对使用者都是透明的。它提供的抽象能力只是为了方便你的开发,而不是为了强迫你按照它的方式行事。

注意,我说的是「用户需要的设计」,而不是「用户要求的设计」。我不想让读者产生一种印象,认为设计师就像厨师一样,顾客点什么菜就一模一样做出来。艺术的各个领域有着巨大的差别,但是我觉得任何一个领域的最佳作品都不可能由对用户言听计从的人做出来。

一种人眼里的优秀设计可能在另一种人眼里却是糟糕无比。这里的重点是你必须选出某些人作为你的目标用户。我觉得,除非设定目标用户,否则一种设计的好坏根本无从谈起。

如今,几乎所有的美术老师都会告诉你准确画出一个事物的方法,不是沿着轮廓慢慢一个部分、一个部分地把它画出来,因为这样的话各个部分的错误会累积起来,最终导致整幅画失真。你真正应该采用的方法是快速地用几根线画出一个大致准确的轮廓,然后再逐步地加工草稿。

呀摘抄太多了。

comments powered by Disqus