Hi, 我是潘深练,一名大龄程序员,坚定不移热爱技术,平时喜欢捣鼓一些小创意,有很多理想,也有点理想主义,同时也是一名读瘾晚期患者。
❤️做了一款阅读工具叫 竹白百科
初看《暗时间》,以为是一本探讨时间聚焦的书籍。细读之后方才发现,暗时间的提法只是全书的起点,而后作者通过亲身经历和自己总结的大量专业领域知识,跨界结合自身对心理学、认知科学以及数学的研究,对思维、学习、工作、时间、习惯等方面进行了深度思考和深入探讨。本文摘抄《暗时间》,主要片段系关于学习思考、时间效率、阅读方法以及个人核心竞争力。
Google 与 Wikipedia。 遇到问题最先想到的,也是学习某样东西做功课(homework)最先用到的工具。
看书挑剔,只看经典。 如何选择经典,可以到网上做做功课,看看评价,综合分析一下。书籍是我们知识的主要来源,在选择书籍的时候做足功课是对我们自己的时间负责。 这和在超市里买东西时对比各个品牌是一个道理,只不过奇怪的是,我很少见到有人对书籍像买衣服那样精挑细选的。
做读书笔记。 一是将自己阅读时候的思考(包括闪念)总结下来,而是将书中的好例子摘抄下来。有了 Evernote 之类的工具来管理笔记,非常便于回顾,加深理解。很多时候,仅仅是用自己的语言重新表述一下就能够极大地加深印象和理解。 我觉得,人与人学习的差距不在资质上,而在花在思考的时间和思考的深度上(后两者常常也是相关的)。获得多少并不取决于读了多少,而取决于思考了多少、多深。
提到思考,我有一个小习惯。 利用走路和吃饭的时候思考,还有睡觉前必然要弄一个问题放在脑子里,在思考中迷糊入睡。发现这样一来往往在不知不觉中多出来大量的思考时间。
多看心理学与思维的书,因为它们是跨学科的。 知识分两种,一是我们通常所谓的知识,即领域知识。而是关于我们的大脑吸收知识的机制的知识,后者不妨称为元知识。虽说这也是领域知识,但跟其他领域知识不同的是,它指导着我们学习其他所有的领域知识。
学习一项知识,必须问自己三个重要问题:
趁着对一件事情有热情的时候,一股脑儿把万事开头那个最难的阶段熬过去。 万事开头难,因为从不了解到了解基本的一些事实,是一个新知识暴涨的阶段,这个时候的困难是最大的。有人熬不过去,觉得困难太大就放弃了。不过,狂热的兴趣可以抵消对困难的感觉,所以趁着对一件事情有热情的时候,开一个好头是很重要的。(当然,这并不是说持之以恒就不重要了)。当然,也许这个是因人而异的,对我来说我会在对一件事情有浓厚兴趣的时候非常专注地学习,把很多 groundworks 做掉。后面就会顺利一些了。
重要的事情优先(详见史蒂芬·柯维的《高效能人士的七个习惯》或《要事优先》)。尽量避免琐事骚扰,不重要的事情能不做就不做。有时候,紧急的事情往往只是当事人觉得必须马上做完才显得紧急或者干脆就是紧他人之急,最糟糕的就是纯属性格上原因觉得每件事情都得第一时间完成,很多看上去紧急的事情实际上并不是真的”不能再拖了”,有的干脆就并不需要或值得去做。有很多事情都是可以先放一放甚至完全let go的,否则的话就整天被所谓”紧急”的事情牵着鼻子走了。
重要的事情营造比较大的时间块来完成。 比如一本好书,或者一个重要的知识点,最好不要切得太琐碎了看,否则看了后面忘了前面,不利于知识的组织与联系。
同时也要善于利用小块时间。 也就是《奇特的一生》中所说的“时间下脚料”,如何利用前面有几个方法。同时,也善于创造整块时间(如通过要事优先)。
重视知识的本质。 对于程序员来说这一点尤其重要,程序员行业的知识芜杂海量,而且总是在增长变化。很多人感叹跟不上新技术。应对这个问题的办法只能是:抓住不变量。大量的新技术其实只是一层皮,背后的支撑技术其实都是十来年不变的东西。底层知识永远都不过时。算法数据结构永远都不过时。基本的程序设计理论永远都不过时。良好的编码习惯永远都不过时。分析问题和解决问题的能力永远都不过时。强大的学习能力和旺盛的求知欲永远都不过时。你大脑的思维方式永远都不过时。
重视提前积累的强大力量。 计划订长一点,自然就可以多获得准备的时间。设想你若干年后会在做什么事情,需要哪些技能,现在就开始准备。你比别人往后多看一年,你就比别人领先一年的时间来准备,这个差别是绝大的。一个5年计划便可以让你获得从现在开始的5年准备时间。5年中每天腾出半个到一个小时专心于某一件事情,认准一个方向,每次走一点,其实不要说5年,两年就会发现会起到宏大的效应。长期订阅我的Blog的朋友们也一定注意到我基本上不写东西,一般一个月写上2篇就算多的了。但总结一段时间的学习和思考的习惯却一直都没有停止(博客文章对我来说是学习和思考的副产品,我并不为写文章而写文章),所以5年下来竟也写了不少东西。所以这就是一个简单的例子。你大致还可以从我的Blog看出来我一段时间关注的东西,一般来说,一段比较长的时间(少则半年至一年——譬如对心理学与思维的关注;多则几年——譬如对编程技术的关注),在这段时间内,我的业余时间会被一个主题所充斥。反之,如果不知道目的是什么,就不知道往哪个方向上使劲,就容易产生无用功。
抬起头来。 人的思维是非常容易只见树木不见森林的(否则这个成语从哪来的呢?)。时不时抬起头来审视一下自己正在做的事情,问一问它(对现在或未来)有什么价值,是不是你真正希望做的。你学到的东西到底是什么?它们重要吗?你需要在这个时候学习这些吗?(见第2条)。你的时间就是你的资源,你投入这些资源来掌握知识,所以到底用来掌握哪些知识是一个很重要的问题。仅仅遵循兴趣是不够的,人会对很多次要的东西产生兴趣,并一头钻进去浪费好多时间。所以判断一个东西值不值得学习是很重要的。
退订RSS。 RSS Reader 是个时间黑洞。就算 mark all as read,在有大量feed的情况下,也会无形中消耗掉大量的时间。我们一旦订阅了某个RSS之后就会倾向于不肯退订它,心想也许某天有个重要的信息会从那里得到。这其实是源于人不肯”关上一扇门(即便门内的收益概率极小)”的心理(参见《Predictably Irrational》);而实际上,关上一扇门,有时能够增大收益期望。仔细观察一下reader里面的feeds,有哪些是真正有价值的,把那些没价值的或者价值很小乃至于不值得每天被它骚扰的,全都退订掉。不要舍不得,那些一个星期都没出现让你眼睛一亮的内容的feed,很大的可能是永远也不会出现。就算可能,也别担心你会漏掉什么宝贵信息,真正宝贵的信息,在其他来源你也会接触到的。一开始我的Greader里面每天都有大量的新内容,每天都是1000+,但一段时间之后发现除了信息焦虑,实际上有价值的内容不多,现在,我很高兴地发现自己摆脱了这种状况,我持续不断地退订feeds,留下的内容越来越少,也越来越精,带来的阅读焦虑也越来越少。(顺便推荐一个东西,aideRSS,初步使用,感觉对订阅reddit这样的每天更新大量内容的feed很有用)。
有时间吗?总结总结最近得到的新知识吧。 一般来说,我在一段时间内学习的一些东西总是会在这段时间内一直在脑子里打转,一有时间空隙(譬如走路,吃饭)它们就会自己蹦出来,促使我去进一步思考和总结。永远不要认为对一个知识的把握足够深刻,“理解”的感觉很多时候只是假象。学会反问自己对知识到底把握了多少,是很有价值的。(如何反问,前面的总结中有提到)。
有时间吗?看本书吧。 (传统的)阅读和思考永远优于所谓的在互联网上汲取新知识,后者往往浅表、不系统、乃至根本没价值。
制定简要的阅读计划。 选出最近认为对你最有价值的书,先总览一下,决定阅读的顺序(哪些章节可以优先阅读)。然后每天看一点。并利用走路、吃饭、乘车或其他不适合带着书和笔的时间来总结看过的内容,建立知识结构,抽取知识本质,与以往的大脑中的知识建立联系。(参见《奇特的一生》)
根据主题来查阅资料,而不是根据资料来查阅主题。 以前读书的时候是一本一本的读,眼里看到的是一本一本的书,现在则是一章、甚至一节一节的读,眼中看到的不是一本一本的书,而是一堆一堆的章节,一个一个的知识主题,按照主题来阅读,你会发现读的时候不再是老老实实地一本书看完看另一本,而是非常频繁地从一本书跳到另一本书,从一处资料跳到另一处资料,从而来获得多个不同的人对同一个主题是如何讲解的。比如最近我发现在看蒙特卡罗算法时就查了十来处资料,其中有三四篇 paper 和六七本书;这是因为即便是经典的书,你也不能指望它对其中每一个主题的介绍都是尽善尽美的,有些书对某个主题(知识点)的介绍比较到位,有些书则对另一些知识点介绍得比较到位。而有时候一篇紧凑的 paper 比一本书上讲得还要好。我硬盘里面的书按主题分类,每个主题下面都有一堆书,当我需要学习某个主题的知识时(譬如贝叶斯学习或者神经网络),我会把里面涉及这个主题的书都翻开来,索引到相关章节,然后挑讲得好的看。那么,如何判断一个资料是好资料还是坏资料呢?
好资料,坏资料。 好资料的特点:从问题出发;重点介绍方法背后的理念( rationale ),注重直观解释,而不是方法的技术细节;按照方法被发明的时间流程来介绍(先是遇到了什么什么问题,然后怎样分析,推理,最后发现目前所使用的方法)。坏资料的特点是好资料的反面:上来就讲方法细节,仿佛某方法是从天上掉下来的,他们往往这样写“我们定义… 我们称… 我们进行以下几个步骤… ”。根本不讲为什么要用这个方法,人们最初是因为面对什么问题才想到这个方法的,其间又是怎样才想出了这么个方法的,方法背后的直观思想又是什么。实际上一个方法如果将其最终最简洁的形式直接表达出来往往丢失掉了绝大多数信息,这个丢掉的信息就是问题解决背后的思维过程。至于为什么大多数书做不到这一点,我在这里试着分析过。
学习一个东西之前,首先在大脑中积累充分的“疑惑感”。 即弄清面临的问题到底是什么,在浏览方法本身之前,最好先使劲问问自己能想到什么方法。一个公认的事实是,你对问题的疑惑越大,在之前做的自己的思考越多,当看到解答之后印象就越深刻。记得大学里面的课本总是瀑布式地把整个知识结构一览无余地放在面前,读的过程倒是挺爽,连连点头,读完了很快又忘掉了,为什么?因为没有带着疑问去学习。
有选择地阅读。很多人觉得我读书速度很快,其实我只是有选择地阅读。 这里的选择体现在两个地方,一是选择一本书中感兴趣的章节优先阅读。二是对一本书中技术性较弱或信息密度较低的部分快速地略读。一般来说,除了技术性非常强的书之外,大多数书的信息密度很低,有很多废话。一般来说在阅读的时候应该这样来切分内容:
如果是需要解释一个现象的(譬如《黑天鹅》),那么
一般来说,这一二三四用不了多少字就可以写完了(如果假设只举一到两个精到的例子的话),这样的无废话著作的典型是《合作的进化》;那为什么有些书,明明核心观点就那点东西(顶多加上几个精要的例子罢了)却写得长得要命呢?因为人的思维都有一个“联想”的特点,写着写着就容易旁逸斜出,而且作者自己也往往觉得引申出去挺牛逼,有时候很多与主题无关的废话就掺和进来了;那么,阅读的时候就应该有选择性地滤掉这些不相干的废话;此外还有一种可能性就是大量冗余的例子。一般来说组织得比较好的书会有详细且一目了然的目录和索引,根据目录首先就可以滤掉一部分(比如某个子章节的内容你以前是看过的),然后有时候作者还会举很多冗余的例子,如果你已经觉得印象够深刻了这些例子完全可以不看(一些书就非常厚道地对每个观点只辅以一两个最最经典的例子,譬如《与众不同的心理学——如何正视心理学》,这样的书我最是喜欢)。
阅读的分类。我一般把书分为两类,一类是知识的。一类是思维的。(当然,还有第三类,就是娱乐的,不作讨论:-) )
一般来说我更倾向于阅读培养思维的,譬如《你的灯亮着吗?》、《决策与判断》、《别做正常的傻瓜》、《How to Think Straight about Psychology》、《数学与猜想》、《Ask the Right Questions》…… 因为思维方面的东西是跨学科的,任何时候都用得上。并且,反之如果思维没有培养好的话,学习东西也容易走错方向或者事倍功半。 当然,话说回来,光看思维方面的书,不去选择一门或几门领域知识,也是思而不学则殆。所以这里所谓“更倾向于”是指时间分配方面的。
利用时间碎片:任何一点时间都可以用于阅读。
为什么看不懂? 如果看不懂一个知识,一般有如下几个可能的原因:
我喜欢把知识分为本质的和非本质的。对于前者采取提前深入掌握牢靠的办法,对于后者采取待用到时查手册的方法。
如何区分本质的和非本质的知识想必绝大多数时候大家心里都有数,我举几个例子:对程序员来说,硬件体系结构是本质的,操作系统的一些重要的实现机制是本质的,主流编程范式(OO、FP)是为了满足什么需求出现的(出现是为了解决什么问题),是怎么解决的,自身又引入了哪些新的问题,从而适用哪些场景)。这些我认为都是本质的。我想补充一点的是,并不是说硬件体系结构就要了解到逻辑门、晶体管层面才行(其实要了解到这个层面代价也很小,一两本好书就行了),也并不是说就要通读《Computer Architecture: Quantitative Approach》(中译名《计算机系统结构:一种定量的方法》)才行。而是关键要了解那些重要的思想(很长时间不变的东西),而不是很细的技术细节(易变的东西)。《Computer Systems: A Programmer’s Perspective》(中译名《深入理解计算机系统》)就是为此目的,针对程序员的需求总结出那些本质知识的好书。
再来说一下为什么需要预先牢靠掌握这些本质的知识:
1)、根据Joel Spolsky同学的说法(原文),编程语言技术是对底层设备的封装,然而封装总是会出现漏洞的,于是程序员被迫下到“下水道”当中去解决问题,一旦往下走,漂亮的OO、N层抽象就不复存在了,这时候不具备坚硬的底层知识就会无法解决问题。简而言之就是这些底层知识会无可避免的需要用到,既然肯定会被用到那还是预先掌握的好,否则一来用到的时候再查是来不及的,因为本质的知识也往往正是那些需要较长时间消化掌握的东西,不像Ruby的mixin或closure这种翻一下manual就能掌握的东西。(英语也是这样的本质知识——上次在PyCN上看到一个招Python开发人员的帖子将英语列为必备技能,却并不将自然语言处理列为必备技能,正是因为英语不是可以临阵磨枪的东西,而且作为知识的主要载体,任何时候都少不了它,如果不具备英语能力,这个就会成为个人知识结构的短板或瓶颈,而且由于需要长时间才能获得这项能力,所以这个瓶颈将持续很长时间存在。我们曾经在 TopLanguage 上讨论过如何花最少的时间掌握英语)另一方面,在问题解决当中,如果不具备必要的知识,是根本无从思考的,再好的分析能力也并不是每个问题都能分析出该用哪些知识然后再去查手册的,很多时候是在工具和问题之间比较,联想,试探性的拼凑来解决问题;这就使得一个好的既有知识基变得至关重要。(实际上以上这个是一个较大的话题,希望有一天我能够把它详细展开说清:))
2)、如果你不知道某个工具的存在,遇到问题的时候是很难想到需要使用这么样一个工具的,本质 knowldge就是使用最为广泛的工具,编程当中遇到某些问题之后,如果缺乏底层知识,你甚至都不知道需要去补充哪些底层知识才能解决这个问题。
3)、你必须首先熟悉你的工具,才能有效地使用它(须知工具的强是无敌的,但这一切得以“了解你的工具”为前提,甚至得以“了解目前可能有哪些工具适合你的问题”为前提)。一门语言,你必须了解它的适用场景,不适用场景(比如继承能解决你的问题不代表继承就是解决你的问题的最适合的方案,须知问题是一个复杂系统,解决方案总是常常引入新的问题)。你必须了解它支持的主要编程范式,此外你还必须了解它的traps和pitfalls(缺陷和陷阱,如果不知道陷阱的存在,掉进去也不知道怎么掉的。)这些都是本质知识,如果不事先掌握,指望用的时候查manual,是很浪费时间的,而且正如第2点所说,正因为你不知道这些知识(如适用场景),从而用sub-optimal的方式使用了一门语言自己可能还不知道(最小白的例子是,如果你不知道语言支持foreach,那么可能每次都要写一个冗长的循环,较常见的例子是不知道有很方便的库设施可以解决手头的问题所以傻乎乎的自己写了一堆代码),因为人的评价标准常常是:只要解决了最醒目的问题并且引入的新问题尚能忍受,就行。注意,熟悉并非指熟悉所有细节,而是那些重要的,或者无法在需要用到的时候按需查找的知识。比如上面提到的:适用场景不适用场景,编程范式,主要语言特性,缺陷和陷阱。
当然,以上作为程序员的本质知识列表并不完备,关键是自己在学习新知识的时候带着第三只眼来敏锐地判断这个知识是否是不变量,或不易变的量,是否完全可以在用的时候查手册即可,还是需要提前掌握(一些判断方法在上文也有所提及)。并且学会在纷繁的知识中抽象出那些重要的,本质的,不变的东西。我在之前的part里面也提到我在学习新知识的时候常常问自己三个问题:该知识的(体系或层次)结构是什么、本质是什么、第一原则是什么。
另外还有一些我认为是本质知识的例子:分析问题解决问题的思维方法(这个东西很难读一两本书就掌握,需要很长时间的锻炼和反思)、判断与决策的方法(生活中需要进行判断与决策的地方远远多于我们的想象),波普尔曾经说过:All Life is Problem-Solving。而判断与决策又是其中最常见的一类Problem Solving。尽管生活中面临重大决策的时候并不多,但另一方面我们时时刻刻都在进行最重大的决策:如:决定自己的日常时间到底投入到什么地方去。如:你能想象有人宁可天天花时间剪报纸上的优惠券,却对于房价的1%的优惠无动于衷吗?(《别做正常的傻瓜》、《Predictably Irrational》)如:你知道为什么当手头股票的股价不可抑止地滑向深渊时我们却一边揪着头发一边愣是不肯撤出吗?(是的,我们适应远古时代的心理机制根本不适应金融市场。)糟糕的判断与决策令我们的生活变得糟糕,这还不是最关键的,最关键的是我们从来不会去质疑自己的判断,而是总是能“找到”其他为自己辩护的理由(《错不在我(Mistakes were made, but not by me)》)又,现在是一个信息泛滥的时代,于是另一个问题也出现:如何在海洋中有效筛选好的信息,以及避免被不好的信息左右我们的大脑(Critical Thinking)关于以上提到的几点我在豆瓣上有一个专门的豆列(“学会思考”)。
一个学习小Tip:学习一个小领域的时候,时时把“最终能够写出一篇漂亮的Survey”放在大脑中提醒自己,就能有助于在阅读和实践的时候有意无意地整理知识的结构、本质和重点,经过整理之后的知识理解更深刻,更不容易忘记,更容易被提取。
我虽不是经济学专业,但是翻开任何一本经济学的教材,或者直接翻开 wikipedia 的 economics 条目,都会看到物以稀为贵这条铁律。人才作为资源的一种,也是同样的道理。而稀缺性,换种说法也可以叫做不可替代性。一种资源越是稀缺,不可替代性就越强。再加上如果这种资源是一种具有实实在在使用价值的东西(而不是荷兰的郁金香泡沫),那么其价格就会越高。
问题是,如何构筑你的个人知识体系,使得你的知识技能集尽可能成为不可替代的呢?
CSDN 的孟岩先生前段时间发表了一篇博客“技术路线的选择重要但不具有决定性”,用有说服力的数据阐述了技术路线的选择对于个人知识体系的不可替代性并非一个关键因素,文中也提到了这样一段话:
那么核心竞争力是什么?我观察圈子里很多成功和不成功的技术人,提出一个观点,那就是个人的核心竞争力是是他独特的个性知识经验组合。这个行业里拥挤着上百万聪明人,彼此之间真正的不同在哪里?不在于你学的是什么技术,学得多深,IQ多少,而在于你身上有别人没有的独特的个性、背景、知识和经验的组合。如果这种组合,1,绝无仅有;2,在实践中有价值,3,具有可持续发展性,那你就具备核心竞争力。因此,当设计自己的发展路线时,应当最大限度地加强和发挥自己独特的组合,而不是寻求单项的超越。而构建自己独特组合的方式,主要是通过实践,其次是要有意识地构造。关于这个观点,话题太大,我不打算赘述。
孟岩先生在文中没有对这个问题展开叙述。但我一直也在寻思这个问题,后来在 TopLanguage 上一次讨论的时候,把一些想法整理成形。
长话短说,我相信以下的知识技能组合是具有相当程度的不可替代性的:
专业领域技能: 成为一个专业领域的专家,你的专业技能越强,在这个领域的不可替代性就越高。这个自是不用多说的。
跨领域的技能: 解决问题的能力,创新思维,判断与决策能力,Critical-Thinking,表达沟通能力,Open Mind 等等。
学习能力: 严格来说学习能力也属于跨领域的技能,但由于实在太重要,并且跨任何领域,所以独立出来。如何培养学习能力,到目前为止我所知道的最有效的办法就是持续学习和思考新知识。
性格要素: 严格来说这也属于跨领域技能,理由同上。一些我相信很重要的性格要素包括:专注、持之以恒、自省(意识到自己的问题所在的能力,这是改进自身的大前提)、好奇心、自信、谦卑(自信和谦卑是不悖的,前者是相信别人能够做到的自己也能够做到,后者是不要总认为自己确信正确的就一定是正确的,Keep an open mind)等等。
(本篇完)