读”学习C++:实践者的方法”

非常庆幸在寒假中读了有关C++方面的书,假如没有读这本书(郑莉,清华大学出版社)的话,我想我也永远不会了解C++的魅力,只沉浸在c语言的迷潭中, 尽管,现在我对它只是最浅薄的了解,但是C++的美让我魂不守舍!于是,找了很多有关方面的书和资料,下面我找到一篇觉得最有价值的指导性的文章,感谢作 者刘未鹏为我们初学者做了这么好的介绍,指导!文章讲了很多 关于C++学习的方方面面,如何学习,如何避过陷阱和缺陷…

摆脱自我服务偏见–理性的思考前提

为什么要要摆脱自我服务偏见呢?说小了,是为了成为一个更优秀的程序员。说大了是节省生命(因为偏见可能导致越陷越深,浪费时间)。如果你能够理性的思考我们将要讨论的问题,避免自我服务偏见(就当你从来没有花时间在C++上一样),那么我们便可以开始讨论真正的问题了。

为什么要学习并使用C++?

公认的事实是:

1.C++在工业界仍有稳定的核心市场。

2.C++程序员玩玩能享受到有竞争力的薪酬。

3. C++的整个生态圈这么些年来在学习C++的哲学上,是在没有多少改善。

4.市面上的绝大多数C++书籍(包括很多被人们广泛称为“必读经典”的)

原因:书中充斥的是介绍C++中的陷阱和对于C++的缺陷的各种workarounds(好听一点叫Idioms(惯用法)或techniques(技术))。这些书中列出来的缺陷和陷阱根本不区分常见程度。最最关键的是:这些书当中介绍的内容与成为一个好程序员根本毫无关系,它们顶多只能告诉你——嗨,小心跌入这个陷阱。

5.就算记住一门语言的所有细节也不能让你称为一个合格的程序员。

6.了解语言实现固然有其实践意义(在极端场合的hack手法,以及出现底层bug的时候迅速定位问题),然而如果为了了解语言机制而去了解语言机制便脱离了学习语言的本意了。

7. 80%的C++书籍(包括一些“经典”)只涉及到20%(或者更少)的场景。
建议:有辨别力地阅读(包括那些被广泛称为”经典“的)C++书籍。
养成随时查阅资料和文档的习惯(RTFM)。
8.每个人都喜欢戴着脚镣跳舞。
9.我知道它们很有趣,但实际上它们只是补丁方案。
C++的复杂性
C++的复杂性有两种分类办法,一是分为非本质复杂性和本质复杂性;其中非本质复杂性分为缺陷和陷阱两类。另一种分类办法是按照场景分类:库开发场景下的 复杂性和日常编码的复杂性。从从事日常编码的实践者的角度来说,采用后一种分类可以让我们迅速掌握80%场景下的复杂性。

二八法则

以下通过列举一些常见的例子来解释这种分类标准:

80%场景下的复杂性:

1. 资源管理(C++日常复杂性的最主要来源):深拷贝&浅拷贝;类的四个特殊成员函数;使用STL;RAII惯用法;智能指针等等。

2. 对象生命期:局部&全局对象生存期;临时对象销毁;对象构造&析构顺序等等。

3. 多态

4. 重载决议

5. 异常(除非你不用异常):栈开解(stack-unwinding)的过程;什么时候抛出异常;在什么抽象层面上抛出异常等等。

6. undefined&unspecified&implementation defined三种行为的区别:i++ + ++i是undefined behavior(未定义行为——即“有问题的,坏的行为,理论上什么事情都可能发生”);参数的求值顺序是unspecified(未指定的——即“你 不能依赖某个特定顺序,但其行为是良好定义的”);当一个double转换至一个float时,如果double变量的值不能精确表达在一个float 中,那么选取下一个接近的离散值还是上一个接近的离散值是implementation defined(实现定义的——即“你可以在实现商的编译器文档中找到说明”)。这些问题会影响到你编写可移植的代码。 (注:以上只是一个不完全列表,用于演示该分类标准的意义——实际上,如果我们只考虑“80%场景下的复杂性”,记忆和学习的负担便会大大减小。)

20%场景下的复杂性:

1. 对象内存布局

2. 模板:偏特化;非类型模板参数;模板参数推导规则;实例化;二段式名字查找;元编程等等

3. 名字查找&绑定规则

4. 各种缺陷以及缺陷衍生的workarounds(C++书中把这些叫做“技术”):不支持concepts(boost.concept_check 库);类型透明的typedef(true-typedef惯用法);弱类型的枚举(强枚举惯用法);隐式bool转换(safe-bool惯用法);自 定义类型不支持初始化列表(boost.assign库);孱弱的元编程支持(type-traits惯用法;tag-dispatch惯用 法;boost.enable_if库;boost.static_assert库);右值缺陷(loki.mojo库);不支持可变数目的模板参数列表 (type-list惯用法);不支持native的alignment指定。 (注:以上只是一个不完全列表。你会发现,这些细节或技术在日常编程中极少用到,尤其是各种语言缺陷衍生出来的workarounds,构成了一个巨大的 长尾,在无论是C++的书还是文献中都占有了很大的比重,作者们称它们为技术,然而实际上这些“技术”绝大多数只在库开发当中需要用到。)

非本质复杂性&本质复杂性

此外,考虑另一种分类办法也是有帮助的,即分为非本质复杂性和本质复杂性。

非本质复杂性(不完全列表)

1. 缺陷(指能够克服的问题,但解决方案很笨拙;C++的书里面把克服缺陷的workarounds称作技术,我觉得非常误导):例子在前面已经列了一堆了。

2. 陷阱(指无法克服的问题,只能小心绕过;如果跌进去,那就意味着你不知道这个陷阱,那么很大可能性你也不知道从哪去解决这个问题):一般来说,作为一个合 格的程序员(不管是不是C++程序员),80%场景下的语言陷阱是需要记住才行的。比如深拷贝&浅拷贝;基类的析构函数应当为虚;缺省生成的类成 员函数;求值顺序&序列点;类成员初始化顺序&声明顺序;导致不可移植代码的实现相关问题等。

本质复杂性(不完全列表)

1. 内存管理

2. 对象生命期

3. 重载决议

4. 名字查找

5. 模板参数推导规则

6. 异常

7. OO(动态)和GP(静态)两种范式的应用场景和交互

总而言之,要告诉你从一个较高的层次去把握C++中的复杂性。其中最重要的一个指导思想就是在学习的过程中注意你正学习的技术或细节到底是80%场景下的还是20%场景下的。

说了这么多,还是列书一个书单来:

第一本

如果你是一个C++程序员,那么很大的可能性你会需要用到底层知识(硬件平台架构、缓存、指令流水线、硬件优化、内存、整数&浮点数运算等);这 是因为两个主要原因:一,了解底层知识有利于写出高效的代码。二,C++这样的接近硬件的语言为了降低语言抽象的效率惩罚,在语言设计上作了很多折衷,比 如内建的有限精度整型和浮点型,比如指针。这就意味着,用这类语言编程容易掉进Joel所谓的“抽象漏洞”,需要你在语言提供的抽象层面之下去思考并解决 遇到的问题,此时的底层知识便能帮上大忙。因此,一本从程序员(而不是电子工程师)的角度去介绍底层知识的书会非常有帮助——这就是推荐 《Computer Systems:A Programmers Perspective》(以下简称CSAPP)(中译本《深入理解计算机系统》)的原因。

第三本(是的,第三本)

另一方面,C++不同于C的一个关键地方就在于,C++在完全保留有C的高效的基础上,增添了抽象机
制。而所谓的“ 现代C++风格”便是倡导正确利用C++的抽象机制和这些机制构建出来的现代C++库(以STL为代表)的,Bjarne也很早就倡导将C++当作一门不 同于C的新语言来学习(就拿内存管理来说,使用现代C++的内存管理技术,几乎可以完全避免new和delete),因此,一本从这个思路来介绍C++的 入门书籍是非常必要的——这就是推荐《Accelerated C++》的原因(以下简称AC++)。《Accelerated C++》的作者Andrew Koenig是C++标准化过程中的核心人物之一。

第二本

C++是在C语言大行其道的历史背景下发展起来的,在一开始以及后来的相当长一段时间内,C++是C的超集,所有C 的特性在C++里面都有,因此导致了大量后来的C++入门书籍都从C讲起,实际上,这是一个误导,因为C++虽然是C的超集,然而用抽象机制扩展C语言的 重大意义就在于用抽象去覆盖C当中裸露的种种语言特性,让程序员能够在一个更自然的抽象层面上编程,比如你不是用int*加一个数组大小n来表示一个数 组,而是用可自动增长的vector;比如你不是用malloc/free,而是用智能指针和RAII技术来管理资源;比如你不是用一个只包含数据的结构 体加上一组函数来做一个暴露的类,而是使用真正的ADT。比如你不是使用second-class的返回值来表达错误,而是利用first-class的 语言级异常机制等等。然而,C毕竟是C++的源头,剥开C++的抽象外衣,底层仍然还是C;而且,更关键的是,在实际编码当中,有时候还的确要“C”一 把,比如在模块级的二进制接口封装上。Bjarne也说过,OO/GP这些抽象机制只有用在合适的地方才是合适的。当人们手头有的是锤子的时候,很容易把 所有的目标都当成钉子,有时候C的确能够提供简洁高效的解决方案,比如C标准库里面的printf和fopen(此例受云风的启发)的使用界面就是典型的 例子。简而言之,理解C语言的精神不仅有助于更好地理解C++,更理性地使用C++,而且也有其实践意义——这就是推荐《The C Programming Language》(以下简称TCPL)的原因。此外,建议在阅读《Accelerated C++》之前先阅读《The C Programming Language》。因为,一,《The C Programming Language》非常薄。二,如果你带着比较的眼光去看问题,看完《The C Programming Language》再看《Accelerated C++》,你便会更深刻的理解C++语言引入抽象机制的意义和实际作用。

第四本

《Accelerated C++》固然写得非常漂亮,但正如所有漂亮的入门书一样,它的优点和弱点都在于它的轻薄短小。短短3百页,对现代C++的运用精神作了极好的概述。然而要 熟练运用C++,我们还需要更多的讲解,这个时候一本全面但又不钻语言牛角尖,从“语言是如何支持抽象设计”的角度而不是“为了讲语言特性而讲语言特性” 的角度来介绍一门语言的书便至关重要,在C++里面,我还没有见到比C++之父本人的《The C++ Programming Language》(以下简称TC++PL)做得更好的,C++之父本人既有大规模C++运用的经验又有语言设计思想的最本质把握,因此TC++PL才能 做到高屋建瓴,不为细节所累;同时又能做到实践导向,不落于为介绍语言而介绍语言的巢臼。最后有一个需要提醒的地方,TC++PL其实没有它看起来那么 厚,因为真正介绍语言的内容只有区区500页(第一部分:基础;第二部分:抽象机制;以及第四部分:用C++设计),剩下的是介绍标准库的,可以当作 Manual(参考手册)。

参考文档:
第二本

《C++ Coding Standard》。无需多作介绍,这是一本浓缩了C++社群多年来宝贵的经验结晶的书,贴近实践,处处以80%场景为主导,不钻语言旮旯,用本为主…总 之,非常值得放在手边时时参阅。因为书薄所以也不妨先往脑袋里面装一遍。书中的101条建议的介绍都很简略,并且指出了详细介绍的延伸阅读,在阅读的时候 还是要注意不要陷入无关的细节和不必要的技巧中,时时抬头看一看你需要解决的问题。在C++编码标准方面,Bjarne也有一些建议。

第一本

《The Pragmatic Programmer》,用本程序员的杰作;虽然不是一本C++的书,但其介绍的实践理念却是所有程序员都需要的。

第三本

《Code Complete, 2nd Edition》,这是一本非常卓越的参考资料,涉及开发过程的全景,有大量宝贵的经验。你未必要一口气读完,但你至少应该知道它里面都写了哪些内容,以便可以回头参阅。

其它

所有优秀的技术书籍都是资料来源。一旦养成了查文档的习惯,所有的电子书、纸书、网络上的资源实际上都是你的财富。不过,查文档的前提是你要从手边的问题分析出应该到什么地方去查资料,这里,分析问题的能力很重要,因此:

第四本:

《你的灯亮着吗?》。不作介绍,自己阅读,这本书只有一百多页,但精彩非常,妙趣横生。
如对本文章干兴趣,可参考作者的原文

一些值得借鉴的学习习惯

看过mind hacks的文章里面有很多很好值得借鉴的学习习惯!

有关学习方法的:

1. Google&Wiki(遇到问题的第一件事情,做学某个东西的功课。 wikipedia

2. 看书挑剔,只看经典

3. 做读书笔记。一是将自己阅读的时候的思考(包括闪念)总结下来,二是将书中的好例子摘抄下来。人与人学习的差距不在资质上,而在花在思考的时间和思考的深度上(后两者常常也是相关的)。

4.将思考成为习惯还有一个很大的好处

5. 重要的事情优先(详见史蒂芬·柯维的《高效能人士的七个习惯》《要事优先》)。

6. 重要的事情营造比较大的时间块来完成。

7. 多看心理学思维的书,因为它们是跨学科的。知识分两种,一是我们通常所谓的知识,即领域知识。二是关于我们的大脑吸收知识的机制的知识,后者不妨称为元知识。

8. 学习一项知识,必须问自己三个重要问题:1. 它的本质是什么。2. 它的第一原则是什么。3. 它的知识结构是怎样的。

9. 获得的多少并不取决于读了多少,而取决于思考了多少、多深。

10. 善于利用小块时间

11. 养成良好的习惯

有关时间管理的:

12.经常要反思

1) 你的问题到底是什么?(提醒自己思考不要偏离问题。)

2) OK,到现在为止,我到底有了什么收获呢?(提醒自己时不时去总结,整理学习的东西)。

3) 设想自己正在将东西讲给别人听(有声思考;能否讲出来是判断是否真正理解的最佳办法)。

4) 时常反省和注意自己的思维过程。

5) 养成反驳自己的想法的习惯

6) 人的思维天生就是极易流于表面来理解事物的

13. 重视知识的本质

14. 重视积累的强大力量,万事提前准备:计划订长一点,自然就可以多获得准备的时间。

15. 抬起头来:人的思维是非常容易只见树木不见森林的

16.杂项

1)        退订RSS

2)        总结总结最近得到的新知识吧

3)        看本书吧。传统的阅读和思考永远优于所谓的在互联网上汲取新知识

4)        制定简要的阅读计划:选出最近认为对你最有价值的书,先总览一下,决定阅读的顺序(哪些章节可以优先阅读)

有关阅读方法:

1. 趁着对一件事情有热情的时候,一股脑儿把万事开头那个最难的阶段熬过去

2. 根据主题来查阅资料,而不是根据资料来查阅主题

3. 好资料,坏资料好资料的特点:从问题出发;重点介绍方法背后的理念( rationale ),注重直观解释,而不是方法的技术细节;按照方法被发明的时间流程来介绍(先是遇到了什么什么问题,然后怎样分析,推理,最后发现目前所使用的方法)。 坏资料的特点是好资料的反面:上来就讲方法细节,丢掉了问题解决背后的思维过程。作者正在尝试在这里试着分析。

4. 学习一个东西之前,首先在大脑中积累充分的“疑惑感”。你对问题的疑惑越大,在之前做的自己的思考越多,当看到解答之后印象就越深刻。在大学里面的 课本总是瀑布式地把整个知识结构一览无余地放在面前,读的过程倒是挺爽,连连点头,读完了很快又忘掉了,为什么?因为没有带着疑问去学习。

5. 有选择地阅读。这里的选择体现在两个地方,一是选择 一本书中感兴趣的章节优先阅读。二是对一本书中技术性较弱或信息密度较低的部分快速地略读。一般来说在阅读的时候应该这样来切分内容:1. 问题是什么?2. 方案是什么?3. 例子是什么?

6. 为什么看不懂?如果看不懂一个知识,一般有如下几个可能的原因:

1)      你看得不够使劲。

2)      其中涉及到了你不懂的概念。这种情况就需要 Cross Reference 。如果一句话中用到了你不懂的概念,那就去查,

3)      作者讲述的顺序不对,你接着往下看,也许看到后面就明白了前面的了。

杂项

7. 如何在阅读之前就能获得对一本书质量的大致评估

基本上有几个线索:

1)      看作者。牛作者写的书一般都不错。

2)      看目录和简介。一份好的目录和简介能够透露这本书质量的相当一部分信息。目录结构是否清晰,是否直白(而不是装神弄鬼),都是衡量的线索。

3)      看 Amazon 上的评价,这里要注意的是,除了看整体打分之外,更要看打分最低的人是怎么说的,因为小众意见往往有可能来自那些真正懂行的人(除了来踢馆的),如果在打 分最低的意见里面看不到真正有价值的反驳意见的话就相当肯定书是不错的了。

4)      看样章。Amazon 上一般都可以随机浏览一些章节的,表达是否清晰,论证是否严谨,内容是否深刻,基本是几页纸就能看出来的。

8. 如何搜寻到好书

几个线索:

1)      同作者的著作。

2)      Amazon 相关推荐和主题相关的书列(类似豆瓣的豆列)。

3)      一本好的著作(或一份好的资料——不管是书还是网页)在参考资料里面重点提到的其他著作。

4)      有时对于一个主题,可以搜索到好心人总结的参考资源导引,那是最好不过的。

有关知识结构:

抓住不变量

1)      根据Joel Spolsky同学的说法(原文), 编程语言技术是对底层设备的封装,然而封装总是会出现漏洞的,于是程序员被迫下到“下水道”当中去解决问题,一旦往下走,漂亮的OO、N层抽象就不复存在 了,这时候不具备坚硬的底层知识就会无法解决问题。简而言之就是这些底层知识会无可避免的需要用到,既然肯定会被用到那还是预先掌握的好,否则一来用到的 时候再查是来不及的,因为essential的知识也往往正是那些需要较长时间消化掌握的东西,不像Ruby的mixin或closure这种翻一下 manual就能掌握的东西。

2)      如果你不知道某个工具的存在,遇到问题的时候是很难想到需要使用这么样一个工具的,essential knowldge就是使用最为广泛的工具,编程当中遇到某些问题之后,如果缺乏底层知识,你甚至都不知道需要去补充哪些底层知识才能解决这个问题。

3)      你必须首先熟悉你的工具,才能有效地使用它(须知工具的强是无敌的,但这一切得以“了解你的工具”为前提,甚至得以“了解目前可能有哪些工具适合你的问题”为前提)。

4)      分析问题解决问题的思维方法(这个东西很难读一两本书就掌握,需要很长时间的锻炼和反思)、判断与决策的方法(生活中需要进行判断与决策的地方远远多于我们的想象)

5)      学习一个小领域的时候,时时把“最终能够写出一篇漂亮的Survey”放在大脑中提醒自己,就能有助于在阅读和实践的时候有意无意地整理知识的结构、本质和重点,经过整理之后的知识理解更深刻,更不容易忘记,更容易被提取。

如果您对此感兴趣,可参考原文,这里这里这里,还有这里

读”读书写是为了更好的思考”

书写是为了更好的思考,这篇文章很好的诠释了书写的重要,如果不想为博客而博客,那么赶快找个博客写下自己的心路旅行吧。

书写是对思维的备忘

我们的工作记忆资源是有限的,认知负荷也是一样,将思维过程记录下来,让我们可以完全的回溯自己的思维轨迹。

书写是对思维的缓存

我们在头脑中思考问题的时候就往往只能将几个最重要的核心概念保持在工作记忆中!人类的理性之光能够走得如此之远正是因为用纸笔缓存思考的中间结果!

书写是与自己的对话

用黑底白字书写自己的思想,将空出来的思维精力用于反思你自己的观点。

这样就可以在思考一个问题的同时对自己的思考进行反思!

书写是与别人的交流

每个人的的思维都有一些盲点,写下来, 与别人交流,每个人的盲点不一样,你的盲点可以在别人那里得到补充,别人的盲点也可以被你纠正,最重要的价值就在于此。除了盲点之外,我们对于自己的知识 体系中的缺口一般是很难觉知的,而把自己的思考写出来让别人发现漏洞,则是对自己知识体系的善莫大焉。

语言自己也会思考

你会因为用了某个特定的词语从而想到另一个词语,你写着写着就会发现一些词语就像本身有灵性一样,将其他的词语都带出来了。

我知道很多人不书写的原因是因为觉得没有什么可写的,其实这是一个怪圈,你越是不开始书写,总是拿有限的思维缓存去默想一个问题,就越是没有内容可以写,如果你逼着自己将一些不成熟的想法写下来,看着自己写的内容,试着进一步拓展它们,就有可能在理性的道路上走得很远,很远。祝大家书写快乐!

如果对本文章感兴趣请看原文

读“逃出你的肖申克”(下)

接着读“逃出你的肖申克”(上)来继续摘录:
12.很傻很天真的反射条件
条件反射是一个很傻很天真的系统–我们碰一鼻子灰后,往往会选择放弃自己的做法。没有好的结果并不代表你的过程就错了。同样,结果正确,也并不代表方法一定正确。客观的做法是:看重过程,而不是看重单次的结果――因为再好的过程也可能会偶尔失利,但从长远来统计,好的过程总体上必然导致更好的结果

13. 认知偏差
我们有着各种各样系统的认知偏见:我们经常对事物作出错误的解释和归因(即便自己是亲历者),有时甚至反而是“当局者迷,旁观者清”。人们都习惯将失败归因于外界因素,将成功归因于自己的能耐。(心理学把这个称为自我服务偏差)。

14.情绪系统
一概而论地听取直觉的意见或者一概而论地不听取,而是将它当成一个启发式的判断,然后利用自己的理性大脑对其进行进一步的客观的、逻辑的检验我们是一定程度上能够驾驭情绪系统的,情绪系统毕竟只是我们的进化工具箱中的决策系统之一,,而不是全部。另外始终别忘了情绪系统只是一个比较粗糙的判断决策系统,并且它很多时候是为了适应远古社会而非现代社会的!

15.理性的力量
普通人从自己的错误中学习,聪明人从别人的错误中学习。 人类最强大的另一个能力则是归纳和推理--我们可以仔细地,理性地思考、权衡各个选择的利弊,而不仅仅满足于情绪上的判断。我们在大脑中走得越远,在现实中就走得越稳。我们在大脑中失败的次数越多,在现实中失败的次数就越少。 直到实在没法在事先知道答案(你所面临的问题是任何前人都没有探索过的),才必须亲自探险,那个时候,我们就不再是在重复别人走过的老路,而是探索者,创新者,因为我们站在了别人的肩膀上。

15.忠告
事实上,现代社会人最重要的能力之一就是能否从别人的错误中学习,往往是这类人能够迅速走在别人的前面,在别人跌倒的地方跳过去。 如果我们事必躬亲,那么历史绝对不会进步,我们只会每个人从生下来开始都将别人犯过的错误再犯一遍,将别人趟过的泥潭再趟一遍,阳光底下就真的没有新鲜事 了,历史就真的永远重复他自己了。然而历史告诉我们绝非如此,虽然很多人都会甚至需要自己犯一犯某些错误,但同样也有很多人能够在别人的错误中学习。

这是一个信息社会,所有人的经验教训,所有人的知识以前所未有的速度,以互联网为媒介传播开来,不管我们关注什么主题,总能迅速找到一堆书,论坛,网页,然而能否从中获取知识,避免做别人做过的俯卧撑,就看你有没有一双能够辨识的眼睛,和善于思考的心智(见《如何清晰地思考》),否则在海量的信息面前就永远只能是来打酱油的。

如果对本文章感兴趣请看原文

读“逃出你的肖申克”(上)

看mind hecks的这篇文章,我就像哥布伦发现新大陆一般欣喜若狂,它让我进入到了一个新的世界,以前的那些无法解释的问题,突然矛塞顿开。为什么有的人想法出会跟你不一样?为什么明明同样的事情在不同的人看来却有两种截然不同的看法?

这些种种让人百思不得其解的现象,只不过是大脑的两个区域在做怪,一个理性区域和原始区域!所谓原始区域在几十万年的进化中适应特定的社会背景才遗传下来 的心理机制,判断,决策,然而,我们的天性还没有为此准备好,我们才进入到现代社会几百年,想比之下,想对数十万年来说,只不过弹指一挥间,进化的齿轮, 要经过一代代繁殖淘汰,事实上根本还没来不及跟上,所以我们还是使用的适应远古社会的心理和生理机制。这样导致的结果,就是你看到的现象:)

文章中还有很多有趣的地方,现做了一些摘录:

1.切身体验
亲身经历一个负性事情所带来的记忆要比看着或者听说别人遭受同样的事情所感受到的要强烈的多,形成的负性条件反射要迟久的多。

2.别人口中的故事
别人的故事也许只是他们的想法,你自己亲身经历同样的事情也许完全会是另外一种想法了。

3.为什么
别人在告诉你一个道理时往往只能告诉你怎么做(how),而很难说清楚为什么要这么做(why),他们自己也不一定说得清楚!

4.世界是复杂的
人们根本无法确切保证A选项一定优于B选项:比如 ,好好学习并不一定有好的前途;不好好学习也并不一定以后就一塌糊涂。 吸烟不一定短命,不吸烟也不一定长寿。坚持到底不一定胜利,不坚持到底也不一定是失败(要学会放弃)。这个世界太复杂来,各种错综复杂的因素相互影响,单一因果来解释事件几乎总是不恰当的

5.未来是不确定的
你几乎永远也听不到有足够说服力的证据告诉你“只要…,就一定能够….”,因为这个世界有太多因素不确定,除了来自己的因素比较可控,外界因素几乎完全不能够控制和预测。成功不仅仅取决于个人因素,个人因素往往只是成功的一个既非充分又非必要条件。所谓谋事在人,成事在天,就是如此,唯一可以肯定的是改善个人因素的确能够大大增加成功的几率

6.别人的道理,自己的事情。
解决“知识经验跨情境转移失败”的问题?除了多多反省观察自己之外,在面对问题的时候多抽象其本质也是一个有力的办法,正是表面不 相似性阻碍了知识的迁移运用,我们常说有些人善于看到事物的本质,这样的人往往就是那些聪明人,因为他们更能够举一反三,将一个地方领悟的道理推广到另一 个看上去很不一样的地方。

7.认知失调与自我辩护
如果我们在听到别人的道理之前已经有了一个心理上的倾向,那么即便别人给出一个有一定说服力的理由,根据认知失调理论,我们也会竭力为自己辩护;又由于世界是复杂的,所以我们几乎总是能够找到辩护的借口——“上次报纸上说一个英国老太太每天必吸一支烟,活了一百多岁呢。” (《Mistakes were made(but not by me)》)(此段是原话)

8.失败即成功
失败是成功之母。在失败的事情中告诉你的信息一点儿也不比成功时间中的少,或许还能得到更多 的东西。

9. 情绪对照
经历了失败之后,我们在做“正确”的事情的时候便会觉得更理直气壮。如果没有经历失败后的糟糕记忆,我们就算理性地认识到目前的做法是更合适的,也很难从情绪上强烈地感受到这么做的“正确感”

10. 天性。(个人最喜欢的是就是这一段)
我们有很多根植在大脑中的进化选择出来的天性(《Mean Genes》《进化心理学》《Predictably Irrational》《别做正常的傻瓜》《摇摆(Sway):难以抗拒的非理性诱惑》Behavioral Economics)。 在判断与决策时这些天性的优先级总是最高的。然而,由于这些天性是在远古社会选择适应的,并不适应短短几百年我们才迈入的现代社会,所以我们总是听到内心 两个声音吵架。比如我们的天性是目光短浅,只看到眼前利益(也许这对物质匮乏的远古社会是适应的)。所以即便有时候别人说服我们应该往长远考虑一些,他自 己就曾经吃过只看眼前的亏,然而你的内心一个声音仍然在高叫着“管他呢!”。

如果在你没有很多钱的时候,有人告诉你,钱多的人并不更加幸福;钱与幸福感几乎不相关。你会相信吗?就算他拿出非常严谨、权威、科学的心理学研究结 果(《撬动幸福》),也许你没法反驳,但你内心仍然还会有另一个声音在高喊:“管他的,还是让我先发了财再来担心这个问题吧”,我们似乎有两个大脑,一个理性区域(很可能定位于进化史上较晚近出现的新皮层(neocortex), 这个皮层被认为是高级认知推理能力的所在),和一个原始区域。这两个区域并不总是合作无间的,很多时候我们面临两难决策的时候仿佛内心有两个声音在争吵, 就是它们在吵架呢——理性的大脑告诉你应该这么做,但是直觉却大喊应该那么做。到底怎么做呢?最终只有一个办法能够弄清楚——实验。但如果别人实验了之后 告诉你幸福与钱并不想干,你会怎么看?在无可辩驳的证据面前你的理性大脑是被说服了,但是你的另一个大脑却根本不买帐,它的工作机制是:没钱就用焦虑来驱 动你,让你寝食不安,等你挣到钱了,就给你短暂的满足感,之后让你迅速习惯于这点满足感,迫使你把目光投向更多的钱(进一步用焦虑来驱使你去赚更多的 钱)。为什么你自己的大脑会跟你过不去呢?为什么它总是不让你开心呢?很简单,如果你总是感到满足的话,就不会去进取,在一个残酷的优胜劣汰的竞争环境 中,你的这种不思进取的基因很快就会被淘汰。经过了漫长的筛选,如今剩下来的基因几乎都是挣钱机器(《Mean Genes》)。

贪婪、嫉妒、短视、投机,这些天性也许在远古社会曾经成功地让我们的祖先占取了生存繁殖优势(并不像某些宗教书籍说的这些是所谓“原罪”,它们只不 过是适应于特定社会背景的进化心理机制、判断的与决策的heuristics而已),然而现代社会的情境已经改变,分享、合作、交流、长远、诚实,这些才 是在现代社会获得成就的方法,但由于我们的天性还没为这个社会准备好(进化是需要时间的,由于人类进入现代社会的时间太短,才区区数百年,和漫长的几十万 年想必只好比一瞬,进化的齿轮——需要经过一代代繁殖淘汰——根本还没来得及跟上,所以我们仍然在使用着适应远古社会的心理和生理机制),因此,我们常常需要用理性的声音去说服内心的原始人。幸运的是,我们可以,前提是我们必须首先了解自身。

11. 习惯。
也许,对付我们强大的习惯的最佳办法是将自己认为正确的(不管是自己经过困难或失败而领悟的,还是看到书上或听到别人说的)写下来,并常 常拿出来翻看。事实上,我的经验是,在写下来的时候我们的大脑会进入到理性分析模块,进一步检验和推理那些道理,我们越是对一个道理审视的详细、深入、全 面,大脑中留下的印象深刻,从记忆加工的角度来说,这叫深度加工,带来的结果就是该记忆与更多的提取线索相关联,于是便能够在更多的场景下被唤起(而不是 被以往的习惯直接覆盖)(《找寻逝去的自我》)。

如果对本文章感兴趣请看原文