《暗时间》读书心得
首先要感谢拜服一下作者,今生有幸得到这本书我非常幸运,它让我的思维水平和认识能力提升了很大一个台阶。这本书是如此的优秀,以至于出版之后的没几天,就蝉联亚马逊计算机类图书榜首数周之久,而且不少IT企业都免费把此书赠与每一位员工。作者刘未鹏现为微软研发人员,84年生,人虽年轻书却不简单。书中所讲的大部分内容与程序员相关,内容虽然是计算机科学,但是书中解决问题的思维方法和管理时间的技巧渗透到了各个行业,任何职业的人都可以读读这本书。其实早在《暗时间》出版之前,我就把它读完了,因为它的内容就是作者刘未鹏的博客摘录(mindhacks.cn),作为作者的死粉之一,他的每一篇文章我都看过,知道作者要出书的时候,只想买一本作为纪念。《暗时间》这本书讲述的是作者对于学习方法和时间管理的一套思维体系,还附带有一部分心理学、算法和数学,从书中可以感受到作者的每一篇文章都是对工作内容的实践—提炼—思考—总结的过程,作者更新博客的周期也都是一个月到三个月,看的出篇篇都是作者的沉淀。还有一点,作者本身也是一名程序员,与我们软开员工非常相似,它的思维方式我们可以拿来借鉴。
总的来说,书中的内容可以概括为四点:时间管理、学习方法、思维习惯、数学与编程,下面一一介绍。
一、时间管理
“每个人的生命就像沙漏,里面装的沙子总量大致相当,不同的是,有的沙漏颈部较细,有的沙漏颈部较粗。 颈部较细的沙漏能够抓住每一粒时间之沙,即使沙子总量一样,也能拥有更长的生命”这是作者的开篇话,什么是暗时间呢?暗时间就是那些我们没有注意到的,偷偷从我们每个人的沙漏中逃走的时间,把握住了这部分时间,你就把握住了生命的价值。
为了把握住你的时间,作者教了我们三个方法:
1、专注
很简单,就是专心地做一件事情。李阳在他的疯狂英语中说过,许多人学了快10年的英语,其开口的时间还不如在集训的七天内开口的时间长。也就是说,尽管学习时间很长,但学习密度极低,结果乘起来还是低。其实这种情况不仅存在于英语学习中,而是一种普遍的现象。人太容易为各种各样的事情分心,要集中注意力做一件事情是非常难的,而正因为难,少有人做到,那些做到的,就都变成了牛人。软件开发,或是其它事情也是如此,作者对“专注”这两字体会非常的清晰、明确:“能够迅速进入专注状态,以及能够长期保持专注状态,是高效学习的两个最重要习惯。”这也是我们管理沙漏最有效的方法之一。
2、潜意识
做到专注以后,潜意识就可以帮我们很大的忙了,为什么呢?按作者的话“这来源于两个方面,一是专注于一件事情能让表层意识全功率运作,这个是显式的效率。第二点,也是更重要的,它还能够使你的潜意识进入一种专注于这件事情的状态。有过连续几天乃至一周或更长时间思考同一个问题的人想必都有一种感觉,就是在这个思考的期间,有时候虽然表层意识因为种种原因不在思考这个问题了(比如睡觉,比如被其它事情中断),但潜意识层面仍然保留着其“惯性”,也就是说,潜意识层面仍然在做思考的努力,从而虽然表层意识被其它事情占据,但潜意识仍然将时间无形中利用起来了。这种无形中的时间利用日积月累可以产生宏大的效应。关于后一点,著名的例子有我们熟知的那个睡觉中想出苯的化学分子式的老大。”为作者补充一个例子,碳60的分子式也是这么来的 ^_^,当我们专注于某一件事时,换句话说,当我们的主观意识和潜意识在同时思考同一件时,潜意识就会在我们买菜、吃饭、去卫生间的时候不由自主地帮我们思考问题。如果常年累月这样做下来,可想而知,你的思辨能力将会有很大进步。但是如果当你的主观意识在工作,潜意识在想皇马进了几个球的时候,潜意识它就会身不由已的干扰你的主观意识了。
3、尽量避免切换任务
“程序员们都知道,任务切换需要耗费许多额外的花销,通俗地来讲,首先需要保存当前上下文以便下次能够顺利切换回来,然后要加载目标任务的上下文。如果一个系统不停地在多个任务之间来回倒腾,就会耗费大量的时间在上下文切换上,无形中浪费很多的时间。相比之下,如果只做一件任务,就不会有此损失。这就是为什么专注的人比不专注的人时间利用效率高得多的原因。任务切换的暗时间看似非常不明显,甚至很多人认为“多任务”是件很好的事情(有时候的确是),但日积月累起来就会发现,消耗在切换上的时间越来越多。“
通常来讲,人脑切换一次任务需要15分钟,这个时间因人而异,但相差不多。举个栗子说明白一点,当你正在写一段程序,这时实然来了一个电话或是一封紧急邮件,你需要马上处理。等你处理完以后想回到刚才的程序思维中,把上下文连接上就需要15分钟,这个15分钟就白白浪费了,如果一封邮件需要3分钟来回复,它的实际时间成本是18分钟。当你每天接几个电话,回几封邮件,再开个小会,实际上浪费的时间难以估计。最好的办法就是每天把需要沟通的事情在早晨或是一个固定时间解决掉,然后专注地解决你的问题。
二、学习方法
看看维基百科上对于达芬奇的评价:“他是意大利文艺复兴时期的一个博学者:除了是画家,他还是雕刻家、建筑师、音乐家、数学家、工程师、发明家、解剖学家、地质学家、制图师,植物学家和作家。他的天赋或许比同时期的其他人物都高,这使他成为文艺复兴时期人文主义的代表人物,也使得他成为文艺复兴时期典型的艺术家,也是历史上最著名的画家之一,与米开朗基罗和拉斐尔并称文艺复兴三杰。”一个人可以在许多个领域成为“家”,而且水平不低,史上无出其右,即使是当代的领袖人物也只能在两三个领域做到专家的水平,如李开复(语音学、管理学、桥牌)。
欲成为达芬奇式的多面专家,有两个切实可行的方法。第一,掌握一套系统的学习方法(书中有详细说明),然后把这套学习方法应用于各门学科,再根据“一万小时定律”,你就可以成为该学科的专家了,如果方法得当,两千小时就足以让你超过该领域内80%的人;第二,是通过心理学和生理学方面的知识,利用交叉学习来降低学习一门学科的门槛。本段主要结合书中的内容来说明第一点。
1、 学习习惯
简要列几条作者总结的学习习惯:
- “Google & Wiki(遇到问题做的第一件事情,也是学习某个东西做功课(homework)最先用到的东西。”技术问题问Google,生活问题问Baidu,用好Google事半功倍,尤其是掌握Google一些常用关键字的用法,如双引号,加号,减号,site,type等。
- “看书挑剔,只看经典。如何选择经典,可以到网上做做功课,看看评价,综合分析一下。”买书前到豆瓣看看书评是不错的选择。
- “做读书笔记。一是将自己阅读的时候的思考(包括闪念)总结下来,二是将书中的好例子摘抄下来。(这个习惯是一年前才养成的,发现受益极大。)有了google note,笔记可以加上tag,非常便于回顾,加深理解。我觉得,人与人学习的差距不在资质上,而在花在思考的时间和思考的深度上(后两者常常也是相关的)。”
- 提到思考,我有一个小习惯。利用走路和吃饭的时候思考,还有睡觉前必然要弄一个问题放在脑子里面,在思考中迷糊入睡。发现这样一来往往在不知不觉中多出来大量的思考时间。将思考成为习惯还有一个很大的好处——避免焦虑。卡耐基用一整本书讲了一个有效的做法来避免焦虑——底线思考。然而实际上还有另一个有效的做法,就是投入地做另一件事情。不去想"喜马拉雅山上的猴子"的方法并不是使劲的告诉自己不去想"喜马拉雅山上的猴子",因为那样等于就是脑袋里想了那只猴子,正确的做法是真的不去想那猴子,而是想别的。用别的东西充满工作记忆,其他的神经活动自然会被抑制(神经科学基本事实)。所以,感到焦虑的时候不妨思考吧,甚至完全可以去理性分析和思考导致焦虑的问题本身,将其拆解,分析来源,在不知不觉中,大脑的工作重心就从情绪模块转向了推理模块了,而且这思考也可能顺带更有效地解决了导致焦虑的问题呢:)
说到思考,最终的目的是为了反馈自己的行为,不断总结自己做过的每一件事情,并把结果反馈给自己。好的结果是正反馈,它告诉你应该怎样去做,不好的结果是负反馈,它告诉你避免这样做。在机器学习领域中有一个著名的boosting算法,它的核心思想就是用正确和错误的训练数据反馈算法本身的数据模型,从而改善模型对未知数据的判断准确性,每一个正面或负面的样本都会让算法本身的数据模型更强大。这个算法也可以应用于我们的日常生活和工作中,杀不死你的只会让你更坚强,不断调整每一次失败给你的反馈,你将越来越优秀。
2、 阅读习惯
- “趁着对一件事情有热情的时候,一股脑儿把万事开头那个最难的阶段熬过去。”万事开头难,因为从不了解到了解基本的一些事实,是一个新知识暴涨的阶段,这个时候的困难是最大的。有人熬不过去,觉得困难太大就放弃了。不过,狂热的兴趣可以抵消对困难的感觉,所以趁着对一件事情有热情的时候,开一个好头是很重要的。(当然,这并不是说持之以恒就不重要了)。当然,也许这个是因人而异的,对我来说我会在对一件事情有浓厚兴趣的时候非常专注地学习,把很多 groundworks 做掉。后面就会顺利一些了。
- “学习一个东西之前,首先在大脑中积累充分的“疑惑感。”没有因就没有果,没有问题就没有答案,有了问题才知道自己应该去学什么。为什么以前学过的课程都不记得了?因为在上课之前对这门学科没有疑问。
- “为什么看不懂?1. 你看得不够使劲。对此古人总结过——书读百遍其义自现。虽然这个规律不是任何时候都成立的,但是从认知科学的角度看是完全可以解释的,我们在阅读的时候,注意力往往会有选择性地关注其中的某一些“点”,而忽略了另一些“点”,于是一遍看下来可能因为某一些忽略导致无法理解整体。或者干脆看的时候就没注意其中一些细节但重要的东西。此外,大脑理解一个东西需要一定的处理时间,人脑的处理速度很慢,神经冲动每秒传输速度不过百米,所以不能指望看到哪懂到哪。最后,我们可能因为思维定势的原因会从某个特定的角度去看一句话而忽略了从不同角度去理解的可能性。对于这类情况,仔仔细细地再多读两遍,多试着去理解两遍,往往会“哦!原来这样。”地恍然大悟。2. 其中涉及到了你不懂的概念。这是技术性的不理解。这种情况就需要 Cross Reference 。如果一句话中用到了你不懂的概念,那就去查,现在很多书都是电子书,直接搜索一下,或者,对于纸书,看一下书后面的索引就行了。奇怪的是很多人看不懂也不分析一下为什么不懂,就直接放弃了。正如解决问题一样,问题卡住解决不了,第一时间要做的就是分析到底为什么解决不了,而不是直接求救。3. 作者讲述的顺序不对,你接着往下看,也许看到后面就明白了前面的了。”这一点作者讲的非常明白,在学习语言类书籍时尤其管用,比如英语,不必学习语法,看一百部英文电影,听英文自然就会了,写一百篇英文文章,写也就自然会了,想想我们每个人学习母语时,谁教过我们语法呢?
3、 抽象问题的能力
书中有这样一个例子,此处稍做演绎:“有一个经常用来面试测试工程师的题目:‘砖头有什么用?列出你能想到的所有用途。’对于我们已知的一样东西,通常每个人都对它有认知偏见,我们对它的认识往往被下意识地锁定在认知偏见当中,于是就很难发现它有什么别的用途,假如我们不认识砖头,那这个问题就变得容易多了。如何逃出认知偏见的陷阱呢?方法之一就是对问题进行抽象:想想砖头有什么特征呢?第一,砖头是方的,方的东西还有什么呢,有桌子、椅子、门、书,这些东西的用途砖头有没有?其次,砖头是红的,想想红的东西还有西红柿、红灯、太阳,这些东西又有什么用?”再次,砖头的特征还有“硬的”、“有棱角的”、“条形的”,每一个特征都可以类比出很多东西,再找出这些东西与砖头的相同点就可以了。除了对已知条件的抽象之外,还可以对已知条件进行改造,比如砖头可以改造成球型、正方体、可以把它雕刻成‘思考者’,可以变成粉末,这些新产生的特征又可以进行类比,从而找到它更多的用途。”
在面对一个新问题时,就可以采用这种策略来解决它:1、抽象问题,2、把抽象出的特征与自己擅长的东西进行类比,如果还不能解决问题,可以把原问题适当改造,再重复这个过程。关于如何改造问题,书中也有一段精彩的例子:“一个原始人站在一条小溪前,他想要越过这条小溪,但溪水经过昨天一夜,已经涨了上来;因此他面临一个问题:如何越过这条小溪。他联想起以前曾经从一棵倒下并横在河上的树木上走过去,于是他的问题变成了如何找到这样一颗倒下并横在溪流上的树木。他环顾四周,发现溪流上没有这样的横着的树木,但他发现周围倒是有不少生长着的树木;于是问题再次变成了:如何使这些树木躺到溪流上。”
回到之前达芬奇的话题上,在学习一门新的学科时,可以把它和我们学过的学科进行抽象类比,从而降低它的难度,当你掌握的学科种类越多时,可以用来类比的知识也就越多,自然学习的难度也就越低。当我们学习人生中的第一门课时,难度系数假定为1.0,学习第二门课时,难度系数就变成了0.9,以此类推,当你的知识量达到一定程度时,这个难度系数会趋近于一个比较小的常数,从这个角度可以部分解释了达芬奇的全才现象。
补充一点,从心理学与生理学的角度也有对这种问题的类似解释:《心理学与生活》中有这样一段说明,具体内容忘了,大意如下:“大脑皮层中的不同区域控制着我们不同的行为,当我们做某一个行为的时候,相对应的大脑皮层区域就会兴奋,如果一个区域长时间兴奋,那就会产生疲劳了。”debug时间太长之后就会有‘力有余而心不足’的感觉,就是这个原因。熟练应用这一法则之后,工作效率会大幅提升。注意到各门学科所对应的大脑皮层区域是完全不同的,即使同一学科内的不同分支,对应的大脑皮层区域也不完全一样,也就是说,当你debug很长一段时间之后,写写周报总结,会顿时有一种轻松感(因为大脑皮层换了一块思考区域),这种感觉就像左侧卧久了,换成右侧卧一样。即使是很类似的各种编程语言之间也适用这一法则,当你写c++或java时间太长之后,换一种逆向思维的语言,比如clojure, Haskell,也会有这种感觉,所以,合理地安排工作内容对于提高工作效率非常重要!(Tips:为什么听音乐能够放松?人脑的磁共震影像显示,在人弹奏乐器时,大脑皮层的所有区域都处于弱兴奋状态,也就是说,弹奏乐器时整个大脑皮层都是放松的,无论你在做什么工作,使用哪一块大脑皮层,玩乐器都能帮你放松,听音乐时也有类似效果但不如亲自弹奏,所以累的时候不妨玩玩乐器~)
三、思维习惯
读过作者的很多文章之后,最大的感受就是自己的思维习惯发生了很大变化,学会了辩证地思考问题,结合我自己的例子说说关于思维方面的体会。我自己有一个缺点,同时也是优点,就是喜欢研究技术,而不去关心产品、需求。
先从反面来说这个问题,书中管这个毛病叫做“程序员的阿喀琉斯之踵”,套用原文中的话:“在程序员眼睛里面,做一个项目,也许首先想到的是用什么语言,什么框架,什么库,在这个方向上那就是什么看上去牛B用什么,恨不能都用 haskell、lisp 来写才爽,用 Java?那多没意思啊,Java 那坨弱智语法我小学的弟弟都能掌握,也没啥牛B的语言特性,忒没成就感(只可惜真正判别弱智与否的并非用什么语言技术,而是做出什么产品满足什么需求)。这就是属于只考虑单个孤立因素的简单(或者说 Naive 的)决策,这个因素就是——只要让我自己感觉爽——只可惜并不是让自己感觉爽的做法就是真正解决问题的做法,始终要弄清问题是什么,在后者意义上,一些对于技术型程序员往往没有吸引力的话题其实有着极其重大的价值——比如什么时候设计,什么时候重构,什么时候集成,再往上一层其实这些又都是次级问题,首要的问题还是这个产品满足什么需求,有什么市场(即这件事情值不值得做),有一句话想必很多人常听说,如果不知道要做什么,套上十二层架构也无济于事,方法永远不是因,而是果。”《编程珠玑》中有一道面试题谈到了程序员的估算能力,大意是“请估算密西西比河一年的流量有多大?”这道题的目的就是让开发人员在动手前对问题有一个清晰的认识,而不是一开始就去考虑技术。然后作者给出了两种估算方法,一是通过当地的年降水量乘以河流表面积,二是通过出海口的截面积乘以水流速度,两种方法成功地估算了密西西比河的流量,而且二者的结果相差不多。估算的作用就是让程序员对项目有一个整体把控。当面对一个新项目时,程序员能够抬起头来,看看森林,估算一下它的难度,代码量,人月等等,而不是一下子就去研究技术。再从正面来说这个问题,好的技术确实能够提升生产力,保罗在《黑客与画家》中讲述了一个他自己带领团队打败了一家大公司的例子,原因就是使用了LISP语言,而他的竞争对手恰恰用Java,LISP的语法与人脑类似,比Java更易读、更易修改,往往Java中的100行代码用LISP只需要十几行就能实现。
四、数学与编程
这部分不细说了,作者对于快速排序、朴素贝叶斯方法等都有相当精彩的介绍。
最后,简要列一下作者推荐的书单
抽象问题的能力:
思维与心理学:
编程:
- Code: The Hidden Language of Computer Hardware and Software (《编码的奥秘》)
- Computer System: A Programmer’s Perspective (《深入理解计算机系统》) / Windows via C/C++ (《Windows核心编程》 / 《程序员的自我修养》
- Code Complete 2(《代码大全》)/ The Pragmatic Programmer (《程序员修炼之道》,我也把这本书称为《代码小全》)
- Programming Pearls (《编程珠玑》) / Algorithms / Algorithm Design / 《编程之美》
- The C Programming Language
- The C++ Programming Language / Programming: Principles and Practice Using C++ / Accelerated C++
- The Structure and Interpretation of Computer Programs (《计算机程序的构造和解释》)
- Clean Code / Implementation Patterns
- Design Patterns (《设计模式》) / Agile Software Development, Principles, Patterns, and Practices
- Refactoring (《重构》)