
上个月徐宥同学的一篇“编程珠玑番外篇3 — 关于程序优化的八卦”中提到Donald Knuth说的一番话:
We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. (Knuth, Donald. Structured Programming with go to Statements, ACM Journal Computing Surveys, Vol 6, No. 4, Dec. 1974. p.268.)
真知灼见需要很长时间的积累才可以看得清楚、想得明白、说得简单易懂令人醍醐灌顶。爱德华•墨菲提出“墨菲定律”时候也是如此。
所谓“premature optimization”(过早优化)其实并不是只有程序员才能看得懂的概念。生活中“过早优化”的例子比比皆是。我有个朋友生活中就有典型的这种习惯,比如他报名去练太极拳,在第一节课还没上的时候就先跑去把全套装备都买齐——当然包括很多第一节课之后就发现买错了的,以及因为实际上没上过几节课之后就再也不去了所以永远堆在仓房中的剩下的全部。这就叫“过早优化”,几乎每个人或多或少在至少某一方面有这样的习惯,不信看看身边,有多少人是这样的:他们在做什么事儿还没怎么样的时候早已开始憧憬成功之后的结果,比如,“这笔钱赚到手之后我要……”,或者“如果他们肯投资给我就……”。甚至那些在某些领域中颇有成就的人也很难例外:猜一猜就知道有多少人致死也没得过什么大奖,可是“获奖感言”早已练习了无数遍——当然,那些真的得了大奖的人中也有一大部分同样提前练过很多遍。
之所以几乎每个人都无法摆脱“提前优化”的倾向,可能在于我们作为人类,面对必然的死亡,很多的时候只能靠“希望”支撑——父母们常常称自己的孩子为“(未来的)希望”,也是这个道理。然而,在一些情况下,“希望”可能会成为陷阱,也许是很多人没有想到过的事情。所以,Donald Knuth说的其实并非只有程序员才犯的错误,而是几乎所有人都可能一不小心就掉进去的陷阱。
无论在什么领域,解决问题的一个“优势策略”就是“尽量关注当前问题”。未来么,“兵来将挡、水来土掩”。我总觉得教育那些终究要离开象牙塔的孩子们“要有远大理想”是最恶毒的教育——因为象牙塔之外充满了意外。我总是劝诫我的学生,“少想那些没用的,该干嘛干嘛去”,说文绉绉点,就是“但行好事莫问前程”,也是基于这样的认识。
“活在当下”是很少有人真正学会的生活艺术。

Top of this Post

巧的是, 计算机科学(特别是软件工程)里面, 也有对: 但行好事, 莫问前程 的一些解读. 以做软件为例, 软件的特色就是需求不断的变化, 因此, 为了应对不断变化的需求, 程序员们提供了一整套的方法论, 其中一种被实践检验成功了方法论, 叫做 提供机制, 而不是策略. (Provide mechanism rather than policy).
因为未来是不可预期的变化的, 所以提前对未来做好所有的应付(即对任何情况, 都想好一个固化的策略是不可能的, 而且代价也是高昂的), 因此, 与其把所有的未来情况考虑得滴水不漏(实际上不可能), 不如简单的, 固化一些简单的规则, 工具, 并且允许这些自由组合(比如UNIX shell), 这样, 就能够达到: (对于未来, 简单的情况可以简单的处理, 复杂的情况也有处理的可能). 而如果一开始穷尽脑袋, 准备好未来的每一个变化, 则处于思考范围内的能被简单的处理, 处于思考范围外的, 则一点都不能处理了, 这就是因为心里没有对付问题机制, 只有一套固化的策略造成的.
还有一句话, 叫做 When in doubt, use brute force, 也是说, 先别想太多, 先暴力的把当下问题搞掉再说.
“哈佛大学有一个非常出名的试验,他们对在校生进 行测试,发现有百分之十的人有清晰且短期目标,百分之三的人有清晰且长期的目标,剩下的人要不目标模糊要不就没目标。若干年后,他们发现那百分之十的人成 了律师、医生、教授等成功人士,那百分之三的人成了商业领袖、政坛奇才等各行各业的精英。而剩下的人大都生活在社会的中下层,毫无建树。可见有清晰的目标 对人的一生有多大的影响啊!”
笑来老师听说过这个实验么,“远大理想”和“长期计划”在某种程度上有共同点,但是我看笑来老师的观点都是 主张 先把眼前的事情做好,看这个实验 长期目标比短期目标好,(因为从世俗观点看商业领袖比律师成功),对这个实验应该怎样解读呢?亦或者这个实验就是杜撰的?
让我想起《getting things done》,这本书里讲到的一些东西:
上面说,有些人很聪明,所以有些next action迟迟未实施,
为什么呢?因为他们总是考虑到事情相当相当麻烦,所以一直不愿去做~
有一句外来语被中国文化借用,并改造成一种中国市侩精神,叫做“活在当下”,我们活在当下,我们为当下而活,我们被当下完全地控制了,我们似 乎忘记了,我们的每一个当下都是面向未来的,我们在为未来而工作,我们现在的每一个动作,都与未来相关,甚至决定着我们的未来,而我们的习惯与记忆全部来 自过去,来自历史,我们在当下不懂得自然是如何运作的,是因为我们过去没有在上面下功夫,我们过去就不懂得,我们在当下无法做出创造,当然是因为我们过去 没有全力尝试过,当我们的当下没有使我们达成发展,那么,我们怎能对未来有所期许呢?
--------石康 语录
我仍然认为“过早优化”是件利大于弊的事情
1.有些事情你迟早要做,不如从从容容早做一步。
2.很多时候,人们没有尽心做好当前的事情,是对于缺乏对未来的预期。
如果当他们知道今天做的每一点每一滴都会得到未来的回报,那么当前的某些事情变得比较有乐趣。
肖恩克的救赎里也说:hope is every thing
是很有道理. 我之前一段时间就陷入了过早优化了. 写一个程序总是想研究出最有效率的数据结构和算法, 但总是觉得不满意, 所以一直没有动手写程序. 到后来上手去写的时候才发现原来想得很复杂的问题其实很容易就解决了, 但事实上有更多的问题在过早优化的时候并没有想到, 必须得再调试的时候才能发现. 并且我认为这些问题如果不去真正上手调试是无法意识到的.
我不知道我的行为能否代表一批人, 就是似乎有点回避写程序. 总是希望在写之前分析得很到位, 然后将代码一气呵成. 但是那些问题最后都是在调试的时候发现的, 而在分析所花的时间中只有将近五分之一是取得了实质的进展.
但是有的时候会陷入这样一种困境. 比如对于某些NP问题, 用暴力搜索这辈子都得不到结果, 浪费一点时间过早优化总比一直等死好. 在生活中也一样, 需要进行必要的优化, 不过这种优化仅限于如果你能看到一个大坑, 你可以选择不跳进去.
“猜一猜就知道有多少人致死也没得过什么大奖”
大概应该是“至死”
live for today, 很矛盾啊。我觉得人不能只想现在。我觉得即使能够有意识地活在当下,潜意识里还是会担忧未来。
笑来老师说过早优化是万恶之源,可是我通篇看下来却没发现它“恶”在什么地方——除了那个提前买太极设备的例子证明他浪费钱了之外。
我想,笑来老师是不是因为很多人都因为太过陷于对未来的规划而忘记了最重要的当前,以至于常常规划了一大堆,到最后还是一事无成,才有这个文章的呢?
我个人觉得,提前规划还是好的。就像你指导学生提前为出国做好规划一样。我们要真正实现一个确定的目标,就需要大致了解在某个阶段我们必须达到某种程度,才能从客观上保证我们成功的几率很大。这是离不开提前规划的。
You Xu说的我也很赞同。未来是充满了意外的,我们的提前规划除了制定比较量化的目标外,还应该有一种“应对变化的机制“。所谓知己知彼则百战不殆,在面对非实体化的“彼”——即未来时,我们要想知彼,只有提前规划了。
这样的话题,已经是难以进行深入讨论的了:看得懂的,一下子就知道怎么回事儿了;看不懂的,怎么看都觉得哪哪不对而自己原本的看法会因为自我辩护而变得更加根深蒂固。
Knuth, Donald说,97%的情况下——人家并没说“百分之百”。
有些人喜欢(其实是只能)“纸上谈兵”;另外一些人相信“实践出真知”,他们之间的区别之一,也很可能是对Knuth, Donald的这番话不同见解生成的根源。
to 晓亮:石康先生(我不知道这个人是谁)所说,其实是另外一个问题。“活在当下”是一种态度,但,这不就意味着说要“忘记过去、忽视未来”。石康先生所说,应该是批评有些人(还不少)过分推崇“活在当下”甚至不惜“忘记过去、忽视未来”。——这是个展开说需要很多篇幅的话题……以后再写。
我认为笑来教书匠的意思是说:"在尽量做好大局上的规划时,在去做并解决每一天计划里碰到的问题,不要在每天的计划里先去想好可能会碰到那些问题并想出解决办法".
就拿做技术来说,任何技术都是在项目中练成的,做一个项目,如果开始去想会碰到那些问题,是非常的不切实际的,是自认为想像出来的.只有去做了碰到了问题,在用非常严谨的方式去解决,这样是做一件事情的最快,最好,最有效率的方法.当然也有很多问题是可以想到的,比如跟客户沟通,团队人员素质,后勤保障等.
说白了,就是实际中遇到的问题才是最大的石头,其它的都是小石头,解决小石头是没用的.
当我仔细琢磨了“过早”与“早”的区别后,我发现,Donald Knuth说的是对的。(注:我是程序员)
to jamesni: :)
好吧,辩证法关于“度”的原则……
To linda, yizhizou and Asher:
我觉得,文章里面所谓的“过早优化”并不是指今天制定一个目标就比明天、后天,或者下个礼拜再制定显得“过早”了。这不是什么“度”的事儿。
评判优化是否过早,应该看你试图优化时,所依赖的条件或利用的工具是否实际存在。如果那些条件和工具根本就是发梦,那么你的优化根本不可能成功。如 果那些条件和工具才是你真正需要达到的目标,那么你越过它们进行的优化,会造成很大的浪费和压力。踩着棉花糖练举重,如果当中还发生任何自己无法掌控的外 界打击(有相当大一部分人连自己都无法掌控),那个中滋味,真是试过才知道苦啊。
举个前两年犯过的错误:曾经一个朋友(我觉得他是个特别靠谱的人)应承我说,欠我的设计费下礼拜一铁定到帐。于是我就在礼拜五开心的交了买房子的定金,说好一周 交齐全款,那么礼拜一等我收到钱,就可以交钱得到喜欢的小公寓了,时间十分充裕。结果,礼拜一那哥们打电话说他那里发生了意外,必须延后两个礼拜,很抱歉 之类的。这下我疯了,不按时交钱的话,我的定金就拿不回来了。东拼西凑一整个礼拜,连压箱底的钱都刮出来,还不得不再跟人借(最恨借钱),才勉强够数交上了全款。当时我出了那家售楼部,拿着合同,感觉自己被扒了一层皮。
事后,事实证明那个朋友仍旧是个靠谱的人:意外的确是意外,不到两个礼拜钱也的确到帐了。不靠谱的是我自己。老天对我的惩罚只持续了不到半个月,但这半个月实在难过呀!
肖恩克的救赎里那家伙,19年来做的只有一件事情——出去(并不一定非得越狱,他尝试过正常途径,计划不得不变,目标没有动过)。在成为一个自由的人,和自由后有没有钱、到底去哪儿之中,什么是前提,时间应该花在那儿,我想他分得清清楚楚。
“活在当下”,是教人脚踏实地,看清现有的状况。把虚幻剥掉,看清实际的目标吧。
过早优化和有目标有计划不是一回事,它们也不矛盾。它不是提倡你没目标没计划,而是提醒你不要为未来的不确定性做过多的准备,因为未来是不确定的、不可测的。今天的准备可能是徒劳的,也可能对事情未来的发展和走向造成不好的影响。
博主这个坑弄得太专业了...
同意楼上Reborn 和TK 的意见。我本来对live for today 没啥意见。只是对《功夫熊猫》之后铺天盖地的
"Yesterday is history Tomorrow is a mystery But today is a gift That is why it’s called the present"
有点习惯性的抵触而已。
Kunth 所说的PreMature是“过早”的意思吗,我一直理解为“不成熟”。
徐侑的那片博客我也看过,当时就有这个疑问。
心中有疑惑,就提出来了。
下面是Google翻译的:
premature
[美] [ ˌpriməˈtjur ] [英] [ ˌpriːməˈtjuə ]
形容词
比预期早的,过早的
This disease produces premature aging of the brain. 这种疾病使大脑过早衰老。
不成熟的,仓促的,草率的
She was a bit too premature in giving up this job. 她放弃这份工作似嫌太草率。
He ventured a premature opinion at the meeting. 他在会上大胆发表了一个不成熟的意见。
早产的;早产儿的
Premature babies are kept alive in incubators. 早产婴儿放在保育箱里保育。
规避 大而无当 过分理想
是这个意思吗