2009年12月25日星期五
2009年12月25日:寒流将至
2009年12月24日星期四
Booklist to Read
"Life is like a snowball. The important thing is finding wet snow and a really long hill."--Warren Buffert
Reason:
a. learn from Mr. Buffett, and get something from this book;
b. the writer Alice Schroeder is the former CEO of Morgan Stanley, absolutely professional.
P.S. The book is about 900 pages. really takes time. If possible read in English.
2. Hacker's Delight
2. 《Programming Pearls》
2.《Linux Cookbook》3.《Linux Networking Cookbook》
4.《Unix/Linux编程实践教程》
5.

6. 
7. Prentice Hall PTR出版的《Linux® 核心入门:面向x86和PowerPC体系的自上而下学习方法》
8.
2009年12月22日星期二
黑客与画家(翻译) Paul Graham
)是一本散文体的科普书,在台湾被译作《骇客和画家》,大陆没有卖的,豆瓣里也没有。不知道哪儿可以搞到?
关于作者:我不知道怎么介绍他,根据他的简历http://www.paulgraham.com/bio.html,他是一个计算机博士,一个程序员,一个风险投资家。但是,在我眼里,他其实是一个思想家。他的很多观点深刻地启发了我。
"写有趣的软件, 和写赚钱的软件, 经常是没多少共同之处。"
我读完计算机本科以后,去艺术学校学习绘画。许多人感到奇怪,喜欢计算机的人也会喜欢
美术吗?他们大概认为编程序和画画是两种完全不同的工作,编程需要冷静,精密,和正确
的方法,而画画是表达某种狂热的情感。
这种印象是不对的,编程和画画有很多共同之处,实际上,在我认识的不同类型的人中间,
画家和黑客是最相似的。
画家和黑客的相似之处在于:他们都是创造者,就好像作曲家,建筑师,以及作家一样。黑
客和画家类似,他们的目的是创造某种美好的事物。尽管在创造的过程中,也许会发现新技
术,但他们的根本目的并不是研究技术。
我从来都不喜欢"计算机科学"这个词,因为这种东西根本就不存在。这门学科的内容,不过
是由于历史原因偶然凑合到一起的大杂烩,就好像南斯拉夫国的形成一样。一头是数学家们,
他们摆弄计算机是为了得到国防部的资金赞助,中间部分,一伙人在研究仿佛是计算机自然
史之类的东西--比如网络上数据流算法的行为特征等等。在另一个极端上,是黑客们,他
们编写有趣的软件。对他们来说,计算机是表达的工具,如同水泥之于建筑师,颜料之于画
家。这三种人凑在一块的群体,就好像是数学家,物理学家和建筑师被分到一个专业里。
有时候黑客们干的事被称为"软件工程",这个词也是一种误会。比起建筑师来,软件设计师
离工程师的距离更远。建筑师和工程师的分界并不十分精确,但却是实实在在存在的。其分
界在于做什么和如何做:建筑师决定做什么,工程师考虑如何做出来。
这两件事情也不能分得太开,如果你不懂得如何做,那么你设计的时候就会陷入难局。但是
编程当然不是仅仅决定如何实现某种特性那么简单,在最好的情况下,编程实际上就是设计
软件的特性--往往最好的设计方式就是实现它。
说不定哪一天,"计算机科学"会分裂成几个专业,就好像南斯拉夫最终分裂成几个国家那
样。这也许是件好事。尤其是这意味着我所擅长的编程,会变成独立的专业。
这些不同类型的工作绑到一个专业里,当然有利于行政管理,但是却会引起智力上的困惑。
这也是我不喜欢这个名词的另一个原因。处于中间部分的那伙人所干的,和经验科学差不多,
但是另外两头的人,数学家和黑客,可不太象是在干真正的科学。
数学家好像并不为这个问题发愁,他们就象数学系的同行一样,很高兴地做着理论研究,不
久就忘了办公大楼的牌子写的是"计算机科学系"。但是对黑客们来说,这个牌子就很成问题。
既然他们干的事被称作科学,他们就会感到好歹要象那么回事,于是大学和研究所的黑客们
觉得应该写论文,而不是写优美的程序。但是不幸得很,
后者才是他们真正应该干的。
论文充其量不过是一个手续。黑客写出很棒的程序,然后再做一篇论文,论文表示软件上的
成绩。但是两者之间的不协调引起了问题:好的软件比起糟糕的软件来,更加不适合做论文
的题材。
好的软件不适合作论文的题材。首先,论文要有独创性的,写过博士论文的都知道,要想
保证你开垦的那片地是处女地,就等于说是你划出一片别人都不想要的地来。第二,论文
必须言之有物。糟糕的软件使论文材料充足,你有很多事实可以描述你是如何克服那些困
难的。糟糕的假设总是会产生大量问题。大部分AI研究就是好例子。比如,你假定,以抽
象概念为参量的逻辑表达式列表可以用来表示知识,那你要论证的内容可就多了。就像
Ricky Ricardo说的,Lucy,这下可够你解释了。
创造美好事物的过程,常常是对已有事物的细微调整,或者是把已有概念用新方式组合起来。
这种事情,恐怕不太好做研究论文吧。
那么为什么大学和研究所还要用论文来衡量黑客呢? 同样的,
为什么要用标准化考试来衡量
学术才能呢?为什么要用代码行数来衡量程序员的工作量呢?这些考试的好处是容易实施,
而且有一点效果, 因此才会引诱我们继续采用这些措施。
真正的黑客能够写出优雅的代码,
但是识别这种黑客的方法,真的很不容易找到。要有好的
嗅觉才可能识别出真正优秀的设计。是否真的有这种嗅觉,和是否自信有这种嗅觉,这两者
之间没什么关联,即使有,也是负面的。
真正的考验是时间。经过时间的考验,好的东西会发展壮大,坏的东西会丢弃。不幸的是,
需要的时间往往太长, 以至超过人的寿命。Samuel
Johnson说,需要一百年的时间,才能形
成一个作家的真正声誉。你得等到这个作家有影响的朋友都死了,他的追随者也都死了才行。
我想黑客不得不接受名声上的不确定性,这一点上,
他们和其他创造者没什么不同。实际上
比较起来还要幸运一些。在编程领域,一时的流行风气虽然也有影响,但没有绘画领域那么
大。
还有比别人的误解更糟的事情。更糟的危险是你可能自己误解自己。你通常在相关领域寻找
灵感。如果你在计算机系,很自然地会以为,编程的本质就是实现计算机理论。我读本科的
时候有一种令我很不舒服的感觉,我觉得自己应当多学一点计算机理论,可是期末考试完了
不到三个礼拜,我就把那些东西全忘光了。这让我觉得自己不够尽责。
现在我认识到我那时的想法都是错误的。黑客对计算机理论的了解程度,只要达到画家对颜
料化学所了解的程度就够了。你应当知道怎样计算时间和空间复杂度,知道图灵机模型。也
许应当知道状态机,至少知道这个概念,如果要写语法解析或者正则表达式库的时候会用得
到。画家对颜料的学问上,要记的东西比这还要多一些呢。
对我来说,灵感的源泉不是来自于那些挂着计算机招牌的地方,而是那些聚集着创造者的地
方。我从绘画方面得到的灵感比我从计算机理论上得到的,要多得多。
打个比方。我上学的时候,学生在上机之前,要把整个程序先用纸笔写出来。可是我觉得这
不是我写程序的方式。我喜欢坐在计算机前面写程序,根本不用纸笔。我并不先在纸上写出
程序并检验其正确性,我喜欢先敲一段代码,当然好多毛病,然后慢慢敲打成型。我受到的
教育告诉我,调试应当是检查输入错误的最后一关,而按照我的方式,程序基本上就是调试
出来的。
好长一段时间我都感到很沮丧,念小学的时候,我捉铅笔的方式和老师教的不一样,那时
我也感到同此刻一样的沮丧。如果我那会知道别的创造者-比如画家和建筑师-的做法的
话,我就早该知道这种方法的名字,那就是:打草稿。我可以告诉你,他们在大学时教我
的方法是错的。你应当是一边写程序一边来确定程序的走向, 这和画家,
作家以及建筑师
的做法完全一样。
这里蕴涵着软件设计的真义, 认识到这一点,
就意味着程序语言应当首先要具有延展性。
语言要有助于在编程中思考, 而不是仅仅表达思考的结果。它应该象铅笔,
而不是象钢笔。
如果程序员真的象大学里教的那样写程序,
那么静态类型语言就是不错的选择。但是我所
知道的黑客都不是那样子编程序的。我们需要这样一种语言,
我们用它来随意涂抹。而使
用静态类型语言编程序的感觉, 就好象手放在膝盖上, 小心翼翼握着茶杯,
正襟危坐着和
一个严肃的老太太谈话。
谈论静态类型, 以及创造者这种话题, 我们除去了另外一个困扰的科学的问题:
数学嫉妒。
科学界的每个人暗地里都认为数学家比自己聪明。我想数学家们自己大概也这么认为。反正
科学家们总是把自己的作品弄得象数学论文一样。这对物理学倒还没什么大害,
但是你要是
在自然科学上走得越远, 就越发现这个问题的严重性。
印上一整页的公式, 看上去很让人敬畏的样子,
用上希腊字母就更加不得了。这种倾向可能
诱惑你去研究那些可以公式化的问题, 结果是忽略了真正重要的东西。
如果黑客认同创作者的身份, 像是画家和作家一样,
他们就不会受此诱惑。作家和画家才不
理会数学呢, 根本就是不相干的事情。我认为, 黑客也应当这样看。
如果大学和研究所不让黑客做自己想做的事情, 他们还可以去公司, 可惜,
公司和大学的做
法是一丘之貉。大学和研究所要求黑客当科学家, 而公司要求黑客当工程师。
我也是最近才发现这问题的。Yahoo买了Viaweb之后, 他们问我的意向,
我一向就不喜欢商业
公司, 我就说我还是想编程序。进了Yahoo以后, 我发现在他们那里,
编程序的意思就是代码
实现, 和设计没关系。程序员就是代码工人, 他们把产品经理的愿望,
以代码形式记录下来。
看起来这是大公司的一贯的做法。这样做的目的是减低工作的偏差。只有少数程序员真正懂
得设计软件,
而且这些有才能的人很不容易一下子识别出来。所以与其把软件的未来寄托在
少数聪明人身上, 不如把软件设计让一个委员会来作, 程序员只管编码实现。
如果你想赚钱, 那么记住我的话, 因为我讲的,
正是小公司取胜的机会。大公司采取保险的
做法, 意图规避风险。但是试图限制这种工作效果上的震荡的时候,
固然避免了最坏的可能,
但也失去了最好的。这对大公司当然不是问题,
大公司取胜的原因不是因为发明了伟大的产
品, 而是因为犯的错误比其他大公司少而已。
如果你有办法和一个大公司竞争某种产品, 这个公司的产品是产品经理们设计的,
那么, 他
们永远赶不上你。不过这样的机会很不容易找到。你很难和大公司卷入软件竞争,
就好比你
很难和对手在城堡里徒手搏斗一样。写一个比微软的word还要好的字处理器是可能的,
但是
在操作系统这个微软独占的堡垒里, 他们对你根本就不屑一顾。
软件竞争只能在全新的市场中展开,
因为在那里还没有谁建立起防御工事。你有可能采取大
胆的策略, 集合那些既做设计又做编码的人, 来赢得竞争。微软最初就是这样做的,
苹果,
HP也莫不如此。我想任何成功的创业公司都是走的这条路。
所以, 创造伟大软件的一个办法就是创业开公司。不过这里面还有两个问题。第一,
开公司
以后, 除了编程序, 你需要做好多其他事情。在Viaweb的时候,
我真的希望自己能挤出四分
之一的时间编程就好了。实际上我四分之三的时间都是在做很讨厌甚至很麻烦的事情。对此
我深有体会, 有一次当我开完董事会去补牙, 坐在诊所的椅子上,
我觉得简直抵得上度假了。
还有另一个问题。写有趣的软件, 和写赚钱的软件,
经常是没多少共同之处。设计语言是很
有趣的工作,
微软的第一个产品就是。但是现在没人会花钱买语言。要想赚钱就得写那种很
麻烦的, 没人会免费干的软件。
所有的创造者都会面临这个问题。价格是供求关系决定的,
对有趣软件的需求总是比较少,
而解决一般用户的平凡问题的需求, 总是多一些。在高速公路边上演出,
观众一定少, 在庙
会搭个台子演出, 观众一定多。写长篇小说的收入, 比不上写广告词的收入,
虽然那些广告
最后的归宿是垃圾箱。设计一种语言的回报一定不多,
而搞定某些公司的老掉牙的数据库和
web server的连接问题, 回报会丰厚得多。
我认为这个难题的答案,
是创造者们应当找一个养家糊口的"日常工作"。这个名词最初是惯
于晚上演出的音乐家们使用的。它的意思是: 你做一个工作是为了赚钱,
另一个工作是因为
你喜欢。
几乎所有的创造者在他们职业生涯的早期,
都有日常工作。其中最为人所知的就是画家和作
家。如果能赚钱的日常工作刚好是你所喜爱的工作,
那你就太幸运了。音乐家就经常在唱片
店工作。正在用某种语言或者操作系统的黑客,
也应当找个相近的系统管理或维护的工作。
[1]
黑客应当找个日常工作糊口,
业余时间做自己喜爱的程序。我的这个说法并不是独出心裁。
所有的开源社区的黑客都是这样做的。我要说的是,
开源社区的模型也许是正确的模型, 因
为这种模型被其他创造者分别独立地验证过。
一般的雇主都不太愿意雇员参与开源项目, 这让我有一点惊奇。在Viaweb则相反,
我们不愿
意雇佣没有做过开源项目的人。面试程序员的时候, 我们考虑的一个首要问题就是,
他们业
余时间写什么软件。你要不是真的热爱这个工作,
就不可能干的出色。如果你热爱编程, 就
必然会有自己热爱的业余项目。[2]
黑客是创造者, 不太象是科学家。黑客寻找灵感的地方, 不应当是科学领域,
而是其他创造
者工作的领域。那么, 我们从绘画上, 能够得到什么启示呢?
第一件可以从绘画领域学习的, 或者说可以验证的,
就是怎样学习编程。绘画都是在实践中
学会的,
编程亦然。大部分黑客都不是因为念大学计算机课才走上编程之路的。他们13岁年
纪就开始学着写程序。即使是上了大学计算机课, 你真正学会编程,
大多也是通过自己实际
写程序。[3]
画家通常会留下一系列作品,
你可以从中观察到他们在实践中学习的过程。如果你按年代顺
序观察一个画家的作品,
你会发现后一个作品在前一个作品基础上的提高。如果一幅画中的
某样东西特别出色, 你多半会在更早的作品中发现其发展成熟的轨迹。
我认为大多数创造者都是这样工作的。作家和建筑设计师也不例外。对于黑客而言,
我觉得
这样的做法大概比较好: 从一个大概的草稿开始起步, 不断尝试采纳新的想法,
做修订版,
而不是连续几年埋头做一个题目。
这种工作模式是区别黑客和科学家的另一个显著标志。科学家并不通过干活来学习科学,
他
们通过做实验和解题来学习科学。科学家总是从完美的东西开始,
也就是说他们重复前人已
经做过的工作, 最后达到某种高度, 才开始做自己创造性的工作。而黑客呢,
一开始就是做
创造性的工作--当然这时候作品还不成样子。黑客从创造开始,
最终达到完美。而科学家从
完美开始, 最终达到创造。
创造者学习的另一种方法是观摩杰作。对画家来说,
美术馆是技巧的宝库。几百年来, 美术
馆都是画家学习和借鉴大师作品的地方,
它成为传统教育方式的一个部分。观摩杰作强迫画
家仔细观察那幅画是如何画成的。
作家也是如此。本杰明-富兰克林曾经总结Addison和Steel的散文的特点,
并加以模仿。
Raymond Chandler也是这样学写侦探小说的。
同样, 黑客也是通过看优秀的程序来学习编程--不仅看它的外在表现,
而且要看源码。开源
软件有一个少人提及的优点就是: 你很容易从中学习编程。我学编程的时候,
不得不依赖书
里的例子。其中有一大堆代码是属于Unix的, 但Unix也不开源。大部分人是读John
Lions的
书里的源代码, 而这些内容是不合法的。这本写于1977年的书,
直到1996年都还被禁止出版。
绘画的过程就是不断改进的过程,
这是值得我们学习的另一个地方。绘画通常从草图开始,
逐渐地添上细节,
但又不仅仅是添上细节那么简单。有时候会发现最初的想法是错的。无数
的人像作品, 在x光照射之下, 会发现面部轮廓修改过, 嘴的位置也移动过,
诸如此类。
这就是我们应当学习的榜样,
编程也应当遵循同样的做法。想要假设软件的规格设计完美
无缺, 这显然是不切实际的。预先接受这种现实对你有好处,
写程序的时候就会有所准备,
随时应对可能发生的设计规格上的改变。
(大公司很难做到这一点, 这又是一个小公司可以发挥优势的地方。)
现在差不多每个人都知道过早优化的危险。我认为我们也同样应当顾虑另外一个问题,
就是
过迟确定软件的设计规格。
好的工具可以帮助我们避免这个危险。好的语言也可以帮助你较容易地改变主意。动态类型
语言就有这个优点, 你用不着预先就指定数据的表现形式。不过,
我认为弹性的关键之处在
于, 它使语言具有较高的抽象度, 如果一个程序比较短, 那它就比较容易修改。
这似乎听起来让人迷惑。但是伟大的作品总是精益求精。例如,
达芬奇在国家美术馆画
Genevra de Benci像的时候, 头像后面是桧柏树丛,
他仔细地描绘每一片叶子。许多画家也
许认为,这些东西是衬托头像的, 没人会仔细看。
达芬奇并不这样认为。他绘画的认真程度,
并不取决于看画的人的认真程度如何。达芬奇和
米开朗琪罗一样, 都是一丝不苟。从总体看去,
那些似乎看不见的细节也会变得显著。这是
一丝不苟的重要之处。观众经过这幅画的时候, 注意力一下子就被吸引过去,
那些原本不易
觉察的细节, 综合在一起产生了惊人的效果,
就好像一千个细微的声音唱出的和声一样。
伟大的软件对于美的追求, 也需要超人的投入。当你仔细查看好软件的时候,
会发现那些不
为人注意的部分同样优美。我不是说我自己写的软件是伟大的, 但我知道,
写代码的时候,
要尽量写得清晰易读。有的程序变量名取得丑陋极了, 有的程序行缩进乱七八糟,
读这样的
代码真能让我发疯。
如果把黑客仅仅当作代码工人的话,
那他会像工人挖水沟一样从一头干到另一头。但是如果
把黑客当作创造者的话, 我们就必须考虑灵感的因素。
编程序的过程和绘画的过程类似, 也会有起有落。上新项目的时候,
一天干16个小时不知道
累, 也有时候, 无论如何都提不起兴致。
这种状况也必须考虑在内, 你应对的方法不同,
效果也会不一样。当你开着手动档汽车过山
的时候, 有时候为了防止抛锚,
不得不松开离合器。松开离合器可以防止抛锚。在绘画和编
程之中, 有一些是关键的东西, 另外一些是常规的工作, 留下一些容易作的工作,
等你厌倦
的时候, 就做这些较轻松的工作。
比如说, 在编程时可以故意留一些bug, 我比较喜欢找bug。这时候,
黑客这个词的含义可
以说恰当极了。你面临的问题总体上是有限制的,
你要做的就是解决掉它。假定你的程序
应该做x, 结果却做了y, 哪里出了问题?
你可以断定最终一定是可以解决的。这个活跟刷
墙一样, 是不错的调剂。
绘画不仅可以教我们如何处理自己的工作,
还教我们如何协同工作。过去很多伟大的作品都
是由一群人共同完成的, 尽管在美术馆的标签上可能只写着一个人的名字。达芬奇在
Verrocchio的工作室当学徒时,
就参与绘制<<基督受洗>>中的天使。这样的事情当时很常见。
当米开朗其罗坚持要自己一人绘制西斯廷教堂屋顶的人像时,
就被认为是很不得体的事情。
就我所知, 画家们一起作画时, 他们并不是一起画一个共同的部分,
而是一个主要画家画主
题人物, 他的副手画背景和其他部分, 绝对不会有人掺和别人正在画的东西。
我认为这种模式也适用于软件开发,
不过别走得太远。如果一段代码有三四个程序员分别写
过, 那么没人真正对它负责。结果就会变成公用房间一样没人收拾,
又冷清又灰暗。正确的
做法是把程序分成严格定义的模块, 每个模块有专人负责,
仔细设计模块之间的接口, 使之
尽可能像程序语言本身那样, 精确地表达出来。
软件和绘画一样, 都是为人而做的。黑客也应当像画家一样,
努力创作出伟大的作品。你必
须为用户的立场着想。
我小时候, 就听人讲要学会从别人的立场来设想。意思就是做别人想要你做的事情,
而不是
做你自己想做的事情。这当然给"换位思考"这个词带来了坏名声。因此我一直不愿意这样做。
可是, 我错了。换位思考确实是成功的秘密,
这并不意味着放弃自我。理解别人的观点, 并
不是说你要按别人的兴趣办事。在某种情况下刚好相反, 举个例子, 打仗的时候,
理解敌人
观点, 其目的恰好是要反其道而行之。[4]
大多数创作是为人的, 你得理解人的需要。差不多所有伟大的作品主题都是人,
因为人最感
兴趣的, 就是人类自身。
好程序员和伟大的程序员之间的唯一的差别,
就是体察别人的能力。有些程序员很聪明, 但
论到"换位思考", 则是完全的自我主义者。这样的人不可能设计出伟大的软件[5],
他们从来
不懂得理解别人的观点。
判断一个人换位思考的能力如何,
最好的办法是看他怎样向那些不懂技术的人讲解技术问题。
我们大概都见过那样一些人, 不管多么聪明, 这件事情上却是糟得很。如果有人问,
什么是
编程语言, 他们会说, 呃, 就是一种高级语言,
能经过编译器处理产生目标码。高级语言?
编译器? 目标码? 不知道编程语言的人, 难道会知道这些东西?
软件的目标之一, 就是解释自己。你要写出好程序,
就应当知道用户对软件了解甚少。他们
用软件时, 全无思想准备。如果软件的行为刚好合乎他们的设想,
那就最好了。别指望用户
会去读操作手册。这方面, 我见过的最好系统是早期的苹果,
那时候还是1985年。苹果干了
所有软件都做不了的事情, 那就是能正常运行。[6]
源码同样也应当解释自己。如果让人回忆关于编程的名言,
经常提到的是结构化和解释语言
初期的一句话:
程序写出来是给人看的, 碰巧机器也能运行。
你不但要为用户设身处地地着想, 对读者也是一样,
因为读者可能就是你自己。好多程序员
写了程序, 过半年再看,
简直看不懂究竟是怎么回事。我就见过有几个人因为这原因放弃了
perl。[7]
缺乏换位思考的能力仿佛是高智商的特征, 尤其在某些地方,
这都成了一种风尚。但我不
觉得真的有什么关联。数学和自然科学和人类感情无关,
这些领域的人显然都很聪明, 于
是乎高智商就和"不通世故人情"挂起构来。事实上好多平常智商的人在这方面也不行。看
看脱口秀节目里那些站起来发问的人, 那些问题问的, 真叫拐弯抹角,
主持人得重新梳理
一遍, 才能搞得清是啥意思。
如果编程和绘画写作一样的话, 它也一样酷吗? 毕竟, 人只有一次生命,
最好是做有意义
的事情。
这问题真难回答。在赢得名气上总是有很大的滞后。这就好像遥远的星星发出的亮光,
要
经过好多年才能到达我们眼里。绘画行业光芒四射是因为500年前就产生的杰作。那时候,
没人会象我们现在这样看重这些作品。我们现在所知的Urbino公爵Federico da
Montafeltro先生的形象, 是从Piero della
Francesca的作品里的高鼻子男人哪里得来的。
这在当时的人眼里看来, 一定是非常奇特的。
所以当我说编程没有绘画那么酷的时候, 我们应当记住绘画在它古老的光辉年代,
同样也不
见得那么酷。
我们可以自信地说, 现在正是黑客事业的光辉年代, 在大部分领域,
伟大的作品诞生很早。
1430-1500年代的绘画现在仍难以超越, 莎士比亚彷佛生来就是戏剧家,
把这门艺术推进到如
此之高的程度, 以致于后来的剧作家都生活在他的阴影里。Albrecht
Durer之于雕刻, 奥斯丁
之于小说, 也是如此。
一次又一次, 我们看到同样的模式。新的媒体诞生了, 人们热情高涨,
短短几代人就把它的
能量发挥到极至。黑客事业似乎也正处于这样的时期。
达芬奇时代的绘画行业并不酷, 是他的杰作造就了绘画行业的酷。黑客事业之未来,
全依赖
我们今日之创造。
作者注:
[1] 照相术的出现, 毁掉了画家的日常工作。历史上很多画家靠替人画像维持生计。
[2] 我听说微软不鼓励员工从事开源项目,
业余搞也不行。不过现在有那么多黑客都在做开
源项目, 这种政策也许会令他们难以招募到很多一流程序员。
[3] 大学所能学到的编程技术, 其状况相当于你学到的关于读书,
打扮或者约会的知识: 你
上高中那时候的品味多差啊。
[4] 这里有一个"换位思考"的例子。在Viaweb的时候,
如果在两个选择之间下不了决心, 我
们就会问: 我们的对手最恨什么? 当一个对手在软件里加了个没用的特性,
这个特性我们没
有, 他们就在媒体上大作文章。我们当然也可以解释说这个特性根本是废物,
但是我们还是
决定也实现它, 因为这样的话,
对手会更生气。于是当天下午我们就加上了这个特性。
[5] 不包括文本编辑器和编译器。因为这两样东西黑客自己也天天用,
自己就是典型用户,
所以用不着了解别人的观点。
[6] 差不多如此。他们在内存使用上弄巧成拙,
产生好多很麻烦的磁盘交换。几个月后, 我
买了个新驱动器加上, 这问题就解决了。
[7] 给程序加注释,
并不是增加易读性的好办法。我把Abelson和Sussman的话再发挥一下:
程序语言是用来表达算法的, 碰巧也能在机器上运行。好的编程语言,
表达软件的能力比英
语更好。只有在代码含义复杂难解的地方, 才有必要加注释,
就好像高速公路上急转弯的地
方才会有警告标志。
感谢Trevor Blackwell, Robert Morris, Dan Giffin, 和Lisa
Randall阅读本文的草稿, 感
谢Henry Leitner和Larry Finkelstei邀请我讲话。
本文收在<<黑客与画家>>一书中。
马云十年
12月18日,在第二届网商大会成都论坛开幕式上,回顾十年电子商务发展历程,马云这样说道。当天,阿里巴巴与成都市一起主办了第三届网货交易会。今年5月和9月,阿里巴巴已经分别在广州和杭州举办了两届网货交易会。
1997年,中国电子商务元年,马云从杭州北漂京城。十二年之后,2009年,中国网商销售超过2300亿人民币,淘宝网则超过2000亿。马云预测,淘宝明年交易额将超过4000亿人民币,仍将保持100%的年增长率。
回首十年,马云感慨万千。9月10日,黄龙体育中心,阿里巴巴十周年庆典现场,马云说,为了今天晚上,我大概准备了十年,十年以前我曾想过,十年以后我会如何对我们的员工讲话,如何对我们的客户讲话,如何对我的朋友讲话,讲些什么?
10年来,马云和他的同事做成了一件事:证明互联网与电子商务能有所为,证明中国能够诞生一个新群体——网商。10年间,阿里巴巴努力实现了一家公司和一个商帮的崛起。10年后,阿里巴巴退居幕后,成为服务于网商的公司,成为网商生态群中的一分子。
新十年
从一家电子商务公司,变成整个电子商帮的后台与支持者。
十周年前夕,从晚上到凌晨,阿里巴巴集团收到了18位创始人的辞职信,其中包括马云。阿里巴巴创业18罗汉集体辞职。马云用这种仪式表明阿里巴巴进入新时代的决心。
9月11日早上,创业十八罗汉到阿里巴巴应聘,求职,跟任何普通员工一样。马云说:我们的过去一切归零,未来十年我们从零开始。马云说,过去十年来,9月10日晚睡得最香。这一晚,他不需要想,我是创始人,我必须更努力。
当晚,马云说:过去十年,阿里巴巴是创业者时代,未来十年,阿里巴巴将步入一个新的时代,合伙人时代。
十年前,杭州市委书记王国平在马云家里,马云对他说:十年后,阿里巴巴会成为一家市值50亿美元的公司。马云看见王国平兴奋地直点头。但马云知道,坐在王国平旁很多人都觉得不靠谱。那时候,18个创始人刚刚凑了50万元,成立阿里巴巴。
9月10日,很多员工在内部论坛上留言,说阿里巴巴从"西湖时代"进入"钱江时代"。十周年前,阿里巴巴将自己的办公室从杭州市文三路搬到了钱江新区的新大厦。
在文三路,阿里巴巴一驻就是十年。当天,一位出租车司机不无担忧,他对本报记者说:文三路上的饭馆的生意将趋冷清。
出租车司机的担忧不无道理。当年那个在马云家里成立的,仅18人的小公司,如今全球员工已经超过17000人,旗下公司包括阿里巴巴、淘宝网、支付宝、雅虎中国四家公司。文三路上的杭州本部接近万人。除了阿里巴巴集团及其属下公司外,还有数百家电子商务公司。
回顾十年,马云阿里人"很傻很天真",在电子商务的道路上孤独的狂奔。一如《阿甘正传》中的阿甘。他预言,孤独的日子已经远去,未来十年、二十年,会有更多的人、更多的公司加入阿里巴巴的队伍,掘金电子商务。
十年过去了,阿里巴巴上市,上市当天,市值接近300亿美元,成为全球第三大互联网公司,业务遍及全球200多个国家与地区。
十周年庆典,马云当着27000名听众讲述阿里巴巴的未来,包括阿里巴巴员工、客户,以及亲朋好友。马云描绘的未来是这样的,阿里巴巴将成为支撑1000万家小企业的电子商务平台,为全世界创造1亿的就业机会,成为一个为全世界10亿人提供消费的平台。
在新的十年里,阿里巴巴不是与众多电子商务企业竞争,而是为1000万家小企业,为1亿电子商务从业者,为10亿消费者打造一个平台,在这个平台,阿里巴巴提供他们通过软件、服务以及IT基础设施,让他们与全球任何一家大公司对抗。
下一个十年,马云的阿里巴巴要完成一次艰难的蜕变:从一家电子商务公司,变成整个电子商帮的后台与支持者。
比尔·盖茨一直说自己关注中国的马云,他认为在中国,阿里巴巴最有机会成为一家伟大的企业。伟大不用营收、利润率来衡量,标准是:是否改造了世界。
新商业
2009年,电子商务开始进入第四个阶段:主流人群购买主流产品。
互联网正在由浅入深地改变这个世界,马云相信,接下来的十年是电子商务的时代,这个新时代必将催生出新的商业形态。
马云认为,互联网有四个核心领域的应用,这四个应用由浅入深的改变着这个世界。第一项应用是通讯,包括邮件、即时通讯;第二个应用是媒体,包括门户网站、搜索引擎;第三项应用是娱乐,包括网络游戏、视频、社区;第四项应用则是电子商务。
上述四项应用有时间上的先后,因而,其获得资源市场的认同,即成功IPO也有时间上的先后关系。目前,前三项应用都已经成为互联网主流应用,正改变着人们工作的效率、沟通的方式、娱乐的时空分布、获取资讯的速度。
而马云认为,无论深度,还是广度,上述三项应用对人类的影响都不能与电子商务相比。因此,阿里巴巴过去十年只坚持做新商务,从不涉足新通讯、新媒体、新娱乐,专注新商务。
而新商务又分为四个阶段。一个是非主流人群采购非主流产品,最初的阿里巴巴会员是很边缘化的企业,规模小,产品不为人知,最初的淘宝用户多是18到20岁的人群,买非常边缘化、非主流的产品。第二阶段是非主流人群采购主流产品,比如十七八岁的人群在淘宝购买手机、买衣服,手机、衣服是主流产品。在阿里巴巴平台上,一些小企业购买机械产品、化工产品,这些是属于主流产品。第三个阶段是主流人群采购非主流产品,比如沃尔玛,到中国采购围裙、溜冰鞋等产品,主流人群开始在淘宝上购买烟斗等小玩意。第四个阶段则是主流人群购买主流产品。09年,电子商务开始进入第四个阶段
进入第四个阶段,是按不同的行业进行的,最先进入的是服装。马云透露,今年在淘宝网上,服装销售额达350亿元,销售量达2亿多件。09年,阿里巴巴网络批发平台,每天帮助外贸企业卖10万件衣服。服装行业将成为最先彻底被电子商务的行业。
正是在这样的背景下,诞生了一大批服装垂直电子商务企业,比如凡客、PPG等。
12月18日,阿里巴巴CEO卫哲接受本报记者采访时预言,家居用品、家用电器、化妆品接下来将成为被彻底电子商务化的行业。卫哲说:当这个行业被彻底电子商务化之后,再也没有人提电子商务了,因为每个商人都是网商,所有都通过网络消费了。
新模式
马云认为,新的商业模式是CBBS:C(消费者);小B(渠道商);大B(制造商);S(服务)
在新的商业环境中,阿里巴巴将修正自己的商业模式,目前电子商务的商业模式主要包括C2C,B2B、B2C三种。马云认为,新的商业模式是CBBS。
其中,C(消费者);小B(渠道商);大B(制造商);S(服务),消费者和渠道商在淘宝上交易,由B2B不断为渠道商供货,然后渠道商再把消费者个性需求反馈至制造商,并加以引导。S是一种服务,即对B的服务或者对C的服务。而所有的交易模式均离不开支付宝。
通过CBBS商业模式,阿里巴巴集团就打通了旗下阿里巴巴、淘宝网、支付宝等公司的资源。更有意义的是,打通了整个电子商务产业链。在这个系统中,信息流、资金流通过互联网流动,这样可产生两个优势,一是信息透明,二是便捷的监督。
马云则这样表述:有新的电子商务链条中,所有参与者是平等的。企业与企业之间的起跑线是一样的,结果不同,缘于努力程度,产品质量,服务水平的区别,而不是缘于对资源、关系的占有。小企业可以通过努力,获得大企业拿不到的订单。消费者与企业之间是平等的,消费者可以有效的监督企业,消费者决定产品的类别,服务的方式。
2009年12月21日星期一
Opera 字体设置
的字体选择机制进步是有目共睹的!如今选择自己想要的中文字体,或者中英文不同字体,已经非常容易方便了。
设置很快!
0. opera:config 里搜索 fonts,去掉 Enable Core X Fonts 的勾;
1. 使用你心爱的编辑器打开 $OPPATH/share/opera/ini/font.ini
这个文件,注意权限;
如果觉得权限麻烦,就复制一份font.ini到~/.opera,然后就直接修改吧。
2. 找到第 35 行,把 family: 到 =
中间的字段改成你想要的,系统中存在的中文字体,比如我的改成
family:Vera Sans YuanTi=chinese-s try-first ;
3. 保存退出,重新启动 Opera 就可以看到你选择的中文字体的显示效果了;
scim在opera中偶尔失去响应的解决方法
And the problem showed up from version 1.4.6. Current transitional
solution is changing the value of \"/FrontEnd/X11/Dynamic\" in
/etc/scim/config or ~/.scim/config from \"false\" to \"true\", which is
known to unfortunately break deadkeys usage in European keyboard layouts.
So this walk around is only recommend when such problem shows up. Seems
further investigation is required.
于是打开编辑~/.scim/config
gedit ~/.scim/config
找到:/FrontEnd/X11/Dynamic = false
改为:/FrontEnd/X11/Dynamic = true
然后重新启动X,在opera中肆意蹂躏了下键盘,暂时没有出现和以前一样突然不能输入的情况。
(不过注意哦,这个方法有个问题上面也说到了:" which is known to
unfortunately break deadkeys usage in European keyboard layouts. ")
-------------------------
还在网上搜索到下面几种解决方法:(本人未测试,不知道可行否,直接转过来给大家参考)
Ubuntu 7.10下scim/libx11的bug及解决方法
在7.10版本的Ubuntu中,默认的scim模式改成了XIM。造成在有些程序中无法输入文字,即使是英文字母也不行的bug。我多次在nautilus里遇到该bug。该bug很早就被报告了,只是最近才由于默认设置的改变而更加容易出现了。不过这似乎是libx11库的bug。
launchpad上给出了两种解决办法:
1. 如果不需要使用依赖 libstdc++5库的程序。可以执行
im-switch -s scim-immodule
把scim模式改掉。但是我需要用到java6,acroread这些依赖stdc++5的程序,所以该方法不适合我。
2. 如果不需要使用deadkeys,可以按以下步骤修改:
a. 执行im-switch -s none,使得scim默认不会启动,退出并重登录
b. 修改 ~/.scim/config 文件, 将 /FrontEnd/X11/Dynamic 改为 true
c. 执行im-switch -s scim,使得scim默认启动。
但是我要用deadkeys来输入法文音标字母,所以该方法也不适合我。
于是有人给出了第三种方法,
a. 按照方法2修改设定
b. 安装 scim-uim以及 uim-latin
c. 设置一个复合键(在gnome的键盘选项中)
d. 启动scim,把输入法改为 UIM-Latin
voila!
还有个更简单的方法。既然是libx11的问题,那就应该从源头上解决,治标治本。
添加源
deb http://ppa.launchpad.net/arnegoetje/ubuntu gutsy main restricted
universe multiverse
deb-src http://ppa.launchpad.net/arnegoetje/ubuntu gutsy main restricted
universe multiverse
把libx11库更新即可。
上面那个是参照debian的bug报告:对于ubuntu用户见https://bugs.launchpad.net/ubuntu/+source/scim/+bug/66104
这里还提到了别的方法:
Bug description
In gutsy, the default mode of scim (detemined by im-switch\'s settings
\"scim\") uses XIM mode. This may cause problems in some applications and
make it impossible to input anything, even if you choose the
English/Keyboard input method. This happens most often in nautilus, but is
also seen in gedit, gnome-terminal, etc.
This bug has been around for a long time, it only became more visible
because of the change in the default settings of scim and the Ubuntu
package.
There are two work arounds for this problem:
1. If you do not use any programs linked to libstdc++5 (very few of the
Ubuntu official packages do, one know exception is the fglrx video driver
for ATi cards; but plenty of third-party programs do, such as firefox
downloaded from http://www.mozilla.com, and Adobe\'s PDF reader), you can
use the scim-immodule setting in im-switch. To change the im-switch
setting, just run \"im-switch -s scim-immodule\" command.
2. If you do not use the deadkeys (often seen on European keyboards, and
if you don\'t know what a deadkey is, you are not using it), you can
change scim\'s \"/FrontEnd/X11/Dynamic\" setting. The procedure to change
this setting is:
(a) Set scim not to start automatically (because it\'s useless to change
the configuration file when scim is running) using the command \"im-switch
-s none\". Log out and re-login.
(b) Edit your ~/.scim/config configuration file, change the
/FrontEnd/X11/Dynamic option to true.
(c) Reset scim to start automatically with command \"im-switch -s scim\".
Log out and re-login.
If you are using programs linked to libstdc++5 as well as deadkeys, there
is no known workaround for you. You may try the scim-bridge settings (you
need to install scim-bridge-* packages first), but it\'s not clear whether
it works or not (and I don\'t even know if there is a written scim-bridge
setting for im-switch of not).
This description was updated. View original description.
其实有个很简单的方法,在网页空白地方点右键打开菜单就又可以继续输入啦
按一下alt-tab切换一下,再按alt-tab切换回来也能解决问题。
2009年12月20日星期日
暗时间
大脑也是如此。
善于利用思维时间的人,可以无形中比别人多出很多时间和生命,从而实际意义上能比别人多活很多年。我们经常听说"心理年龄"这个词,思考得多的人,往往心理年龄更大。有人用10年才能领悟一个道理,因为他们是被动领悟——只有在现实撞到他脸上的时候才感到疼,疼完了之后还是不记得时时提醒自己,结果很快时过境迁抛之脑后,等到第二次遇到同一个坑的时候早忘了曾经跌过跟头了,像这样的效率,除非天天摔坑里,否则遗忘的效率总是大过吃亏长的记性。善于利用思维时间的人则能够在重要的事情上时时主动提醒自己,将临时的记忆变成硬编码的行为习惯。
每个人的手表都走得一样快,但每个人的生命却不是。衡量一个人生活了多少年,应该用思维时间来计算。举一个极端的例子,如果一个人从生下来开始就呆在一个为他特殊建造的无菌保护室里,没有社会交往,没有知识获取,度过了18年,你会不会认为他成年了?
认为时间对每个人是均等的是一个错觉,认为别人有一天,我也有一天,其实根本不是这样。如果你正在学习一门专业,你使用自己所投入的天数来衡量,很容易会产生一种错觉,认为投入了不少时间,然而其实,"投入时间"这个说法本身就是荒唐的,实际投入的是时间和效率的乘积。你可以"投入"很多时间在一件事情上面,却发现毫无进展,因为你没有整天把你要做的事情,要学习的东西常驻在你的大脑中,时刻给予它最高的优先级。你走路的时候吃饭的时候,做梦的时候心心念念想的就是这件事情,你的CPU总是分配给它,这个时候你的思维时间就被利用到了极致,你投入的时间就真正等于了实际流逝的时间,因为你的CPU是满载的。
如果你有做总结的习惯,你在度过一段时间之后总结自己在某某领域投入了多少时间,建议千万不要粗略地去计算有多少天下班后拿起书来翻看过,因为这样你也许会发现书倒是常翻,但领悟却不见得多深,表面上花的时间不少,收益却不见得那么大。因为看书并记住书中的东西只是记忆,并没有涉及推理,只有靠推理才能深入理解一个事物,看到别人看不到的地方,这部分推理的过程就是你的思维时间,也是人一生中占据一个显著比例的"暗时间",你走路、买菜、洗脸洗手、坐公车、逛街、出游、吃饭、睡觉,所有这些时间都可以成为"暗时间",你可以充分利用这些时间进行思考,反刍和消化平时看和读的东西,让你的认识能够脱离照本宣科的层面。这段时间看起来微不足道,但日积月累将会产生庞大的效应。
能够充分利用暗时间的人将无形中多出一大块生命,你也许会发现这样的人似乎玩得不比你少,看得不比你多,但不知怎么的就是比你走得更远。比如我就经常发现一些国外的牛人们为什么不仅学习牛逼,连"业余"玩儿的东东也都搞得特牛逼,一点都不业余(上次在《How
We
Decide》上看到斯坦福的一个牛人,粒子物理教授,同时是世界扑克大赛的前六名保持者,迄今累计奖金拿了6百多万刀),你会奇怪,这些家伙到底哪来的时间,居然可以在不止一个领域做到卓越?
程序员们都知道,任务切换需要耗费许多额外的花销,通俗地来讲,首先需要保存当前上下文以便下次能够顺利切换回来,然后要加载目标任务的上下文。如果一个系统不停地在多个任务之间来回倒腾,就会耗费大量的时间在上下文切换上,无形中浪费很多的时间。
相比之下,如果只做一件任务,就不会有此损失。这就是为什么专注的人比不专注的人时间利用效率高得多的原因。任务切换的暗时间看似非常不明显,甚至很多人认为"多任务"是件很好的事情(有时候的确是),但日积月累起来就会发现,消耗在切换上的时间越来越多。
另外,大脑开始一件任务的时候必须要有一定时间来"热身",这个时间因人而异,并且可以通过练习来改变。举个例子,你看了一会书之后,忽然感到一阵无聊,忍不住打开浏览器,十分钟后你想起来还要继续看书,但要回复到当时理想的状态,却需要一段时间来努力去集中精力,把记忆中相关的知识全都激活起来,从而才能进入"状态",因为你上了十分钟网之后这些记忆已经被抑制了。如果这个"热身"状态需要一刻钟,那么看似十分钟的上网闲逛其实就花费了二十五分钟。
如果阅读的例子还不够生动,对于程序员来说其实有更好的例子:你写程序写得正high,忽然被叫去开了一通会,写到一半的代码搁在那儿。等你开完会回来你需要多久能够重新进入状态?又或者,你正在调试程序,你已经花了二十分钟的时间把与这个bug可能相关的代码前前后后都理解了一遍,心中构建了一个大致的地图,就在这时,呃,你又被叫去开了个会(:D),开完会回来,可想而知,得花上一些时间来回想一下刚刚弄清的东西了。
迅速进入状态的能力是可以锻炼的,根据我个人的经验,至少可以缩短到3-5分钟。但要想完全进入状态,却是很难在这么短的时间实现的。所谓完全进入状态,举个例子:你看了3个小时的书,或者调试了半个小时的程序之后,往往满脑子都是相关的东西,所有这些知识都处在活跃状态,换言之你大脑中所有相关的记忆神经网络都被激活了,要达到这样一种忘记时间流逝的"沉浸"状态(心理学上叫做"流体验"),不是三两分钟的事情。而一旦这种状态被破坏,无形间效率就会大打折扣。这也是为什么我总是倾向于创造大块的时间来阅读重要的东西,因为这样有利于"沉浸"进去,使得新知识可以和大脑中与其相关的各种既有的知识充分融合,关联起来,后者对于深刻的记忆非常有帮助。
要充分利用暗时间,不仅要能够迅速进入状态,另一个很重要的习惯就是能够保持状态多久(思维体力)。《The
Psychology of Invention in the Mathematical
Field》上有一段关于庞加莱的思考习惯的介绍,很有代表性。庞加莱经常在去海边休假或者在路上走的时候在脑海中思索数学问题,很多时候解答就在这些时候忽然闪现。虽然我和庞加莱是没法比的,但是常常也在路上想出答案,这是一种愉悦的体验。
能够迅速进入专注状态,以及能够长期保持专注状态,是高效学习的两个最重要习惯。
很多人都有这样的体验(包括我自己),工作了之后,要处理的事情一下多出了很多,不像在校园,环境简单,生活单纯,能够心无旁骛地做一件事情而不被打扰。工作之后的状况就是,首先需要处理的事情变多,导致时不时需要在多个任务之间切换;另一方面,即便能够把任务的优先级分配得比较合理,也难免在做一件事情的时候心中忽然想起另一件事还没做的焦虑来,因为没做完的事情会在大脑中留下一个"隐藏的进程",时不时地发个消息提醒你一下,中断你正在做的事情。
因此这里就涉及到最后一个高效的习惯:抗干扰。只有具备超强的抗干扰能力,才能有效地利用起前面提到的种种暗时间。抗干扰能力也是可以练习出来的,上本科那会经常坐车,所以我就常常拿着本大部头在车上看,坐着看或者站着看都可,事实证明在有干扰的环境中看书是非常锻炼专注能力的一个办法:D
另外,经常利用各种碎片时间阅读和思考,对迅速集中注意力和保持注意力都非常有帮助。记得很久以前TopLanguage上大伙曾经有次饶有兴趣地讨论"马桶时间"的利用,包括在卫生间放个小书柜。(估计很多同学心有戚戚焉吧:D)
