Blog

飞轮学习法

Content #

总的来说,这个方法可以概括为两个步骤:

  1. 熟读经典,来完成你对某个领域知识的“原始资本积累”;
  2. 在第一步的基础之上,再去广泛涉猎更多相关书籍,并进一步查缺补漏,加深理解。

对于某一个特定的知识领域,当你阅读的相关书籍越来越多时,你能从每一本书中获得的新知识可能会越来越少,因此,你阅读整本书所花费的时间也会越来越短。而在阅读“新书”的过程中,里面涉及到的“旧知识”又会刺激你大脑中先前已经构建好的,与这块知识相关的神经元,从而让你对这部分知识的记忆变得更加牢固。随着你掌握的知识越来越多,新知识逐渐变为旧知识,而旧知识又不断变得更加深刻,你对新书的“消化”速度也会越来越快。长此以往,便会形成我们常说的“飞轮效应”。

书籍作为某个特定领域知识内容的集合,提供了网络碎片化知识通常无法提供的知识“网”。而如果我们想对网中的某个知识点再进行更加深入的了解,仍需要借助互联网的帮助,从博客、论文等相对碎片化的载体中汲取知识。总之,要在已构建的“面”的基础上加深“点”,让知识网中的各个点互通有无。

对大部分人来说,实行这个方法时最困难也最关键的,便是完成原始知识积累的过程。因此,抛开方法本身,我们首先要做到的是坚持不懈地认真看完一本书,这才是你决胜的关键点。

Viewpoints #

From #

春节策划一 | 构建自己的知识体系,让学习的“飞轮”持续转动

Cond基本用法(百米赛跑开始)

Content #

我们再通过一个百米赛跑开始时的例子,来学习下 Cond 的使用方法。10 个运动员进入赛场之后需要先做拉伸活动活动筋骨,向观众和粉丝招手致敬,在自己的赛道上做好准备;等所有的运动员都准备好之后,裁判员才会打响发令枪。

每个运动员做好准备之后,将 ready 加一,表明自己做好准备了,同时调用 Broadcast 方法通知裁判员。因为裁判员只有一个,所以这里可以直接替换成 Signal 方法调用。调用 Broadcast 方法的时候,我们并没有请求 c.L 锁,只是在更改等待变量的时候才使用到了锁。

裁判员会等待运动员都准备好(第 22 行)。虽然每个运动员准备好之后都唤醒了裁判员,但是裁判员被唤醒之后需要检查等待条件是否满足(运动员都准备好了)。可以看到,裁判员被唤醒之后一定要检查等待条件,如果条件不满足还是要继续等待。

func main() {
    c := sync.NewCond(&sync.Mutex{})
    var ready int

    for i := 0; i < 10; i++ {
        go func(i int) {
            time.Sleep(time.Duration(rand.Int63n(10)) * time.Second)

            // 加锁更改等待条件
            c.L.Lock()
            ready++
            c.L.Unlock()

            log.Printf("运动员#%d 已准备就绪\n", i)
            // 广播唤醒所有的等待者
            c.Broadcast()
        }(i)
    }

    c.L.Lock()
    for ready != 10 {
        c.Wait()
        log.Println("裁判员被唤醒一次")
    }
    c.L.Unlock()

    //所有的运动员是否就绪
    log.Println("所有运动员都准备就绪。比赛开始,3,2,1, ......")
}

Cond 的使用其实没那么简单。它的复杂在于:

  1. 这段代码有时候需要加锁,有时候可以不加;
  2. Wait 唤醒后需要检查条件;
  3. 条件变量的更改,其实是需要原子操作或者互斥锁保护的。

所以,有的开发者会认为,Cond 是唯一难以掌握的 Go 并发原语。

...

达夫设备 Duff's Device

Content #

send(to, from, count)
register short *to, *from;
register count;
{
    register n = (count + 7) / 8;
    switch (count % 8) {
    case 0: do { *to = *from++;
    case 7:      *to = *from++;
    case 6:      *to = *from++;
    case 5:      *to = *from++;
    case 4:      *to = *from++;
    case 3:      *to = *from++;
    case 2:      *to = *from++;
    case 1:      *to = *from++;
            } while (--n > 0);
    }
}

达夫把正常情况下分开写的 switch 语句和 while 语句整合在了一起,形成了令人疑惑的 switch 和 while 交错在一起的代码,但是代码量减少了将近一半。正常情况下我们会将 case 语句的作用域视作一个单独的代码块(block),而达夫设备表明实际上并不是这样。所以为什么可以这样写呢?

我们可以查阅最新的 C17 草案 PDF 版本,直接跳转到在 6.8 Statements and blocks,可以看到 case 语句属于 Labeled statements(带标签的语句:

labeled-statement:
    identifier : statement
    case constant-expression : statement
    default : statement

并且任何一条语句都能在自己前面声明一个标识符作为标签名称,标签本身并不会改变控制流,控制流在它们之间执行不受阻碍: Any statement may be preceded by a prefix that declares an identifier as a label name. Labels in themselves do not alter the flow of control, which continues unimpeded across them.

...

镜像神经元什么情况下会关闭

Content #

镜像神经元能够产生同理心,但一定不能保证:当人们看到自己不喜欢的人或比自己拥有更少权力和地位的人时,它们便会关闭。

From #

制度的正当性

Content #

举个极端的例子,想象一下你生活在这样一个社会中,其中许多孩子是黑人和拉美裔,他们享受不到一流公立学校的教育。相反,他们接受的是二流的,往往是乏味的教育。结果,这些孩子的受教育程度和活跃度都不如中产阶级和上流社会的白人孩子,最终他们在成绩测试中表现不佳。这种情形为民间领袖提供了一个为现状进行辩护的最佳理由,由此而减少了失调。“你看,”他们可能会说,“那些孩子是愚蠢的和不可教导的(因为他们在成绩测试中表现不佳);当我们决定不浪费我们纳税人辛辛苦苦赚来的钱为他们提供高质量的教育时,你看我们有多么聪明。”这个自证预言,为进一步忽视弱势群体提供了一个完美的理由。

约翰·乔斯特(John Jost)和他的同事们研究了这一现象,他们称之为制度的正当性:许多出生在社会最高阶层、拥有最大财富和权力的人,通过相信他们的优越能力和天生才能来证明这个职位的正当性,而所有那些贫穷和疲于奔命的人都没有能力或者没有动力获得成功。正如足球教练巴里·斯威策(Barry Switzer)曾经说过的那样:“有些人出生在三垒,他们毕其一生认定自己要打三垒。”

From #

通过改变你所拥有的,来得到你希望得到的

Content #

在迈克尔·康威(Michael Conway)和迈克尔·罗斯(Michael Ross)所做的一项实验中,一组学生参加了一门技能学习课程,这门课程所做出的承诺要远远超过它所能够提供的;另一组学生报了名,但没有参加。不管他们是否参加了这门课程,所有的学生都被要求对他们自己的学习技能进行评估。

经过三个星期无用的训练之后,学生们希望相信自己的技能已经提高了,但是客观的数据显示他们没有任何提高,他们在课程中的表现仍然很差。他们怎样才能减少“我在努力提高”和“我没有任何提高”之间的失调呢?

他们是通过错误地记住自己的技能在参加课程之前是多么糟糕、并低估了他们在入学之前所拥有的技能来做到的。报名但没有参加的学生没有出现这种自我辩护的行为;他们对之前自我评估的回忆是准确的。

这项研究可以解释:为什么那些花费了时间和金钱来锻炼身体的人,即使没有完全成功也会感到满意。他们可能无法让自己相信他们已经达到了目标,但他们可能高估了他们的进步,因为他们扭曲了自己的记忆,在开始训练之前,他们是多么的不健康。

康威和罗斯将这种自我辩护的技巧称为“通过改变你所拥有的,来得到你希望得到的”。

From #

社会性动物

失调和自我概念的一般原则

Content #

我们现在可以概括一下关于失调和自我概念的一般原则。当出现以下四种情况时:(1)人们觉得自己要对个人的行为负责;(2)人的行为与自我概念的核心成分相冲突;(3)个人的行为造成了严重后果的;(4)个人的行为不可挽回,难以更改。人们会感受到最大的失调。他们感受到的失调越大,态度就越容易发生改变。

From #

社会性动物

怎样让小男孩不打自己的妹妹

Content #

想象一下这样的场景:你是一位喜欢打自己3岁妹妹的5岁男孩的父亲。你试图跟男孩讲道理,但是没有效果。所以,为了维护你小女儿的幸福,让你的儿子成为一个更好的人,你开始对他的攻击行为加以惩罚。作为家长,你可以自由选择一些惩罚形式:从极其轻微(严厉的表情)到极其严厉(揍屁股、强迫男孩在角落里罚站两个小时、让他一个月不看电视)。受到的威胁越严重,这个男孩就越有可能在你的监视下收手。但你一转身,他便可能又会去打他的妹妹。

当然你也可以采取一种轻度威胁。在两种情况下(严重威胁或轻度威胁),孩子都会体验到失调。他知道他没有在打他的小妹妹,他也知道他真的喜欢打她。当他有冲动打她但又没有这么做时,他会问自己:“我为什么没有打我的小妹妹?”在严重威胁情况下,他有一个现成的答案,一种充分的外部辩护的形式:“我没打她是因为,如果我这样做,那边的野兽(我父亲)会揍我屁屁,罚我站在墙角,一个月不让我看电视。”严重威胁给了男孩足够的外部理由,从而不会在监视状态中打他的小妹妹。

处于轻度威胁状态的孩子也会感受到失调。但是当他问自己“我为什么没有打我的小妹妹”时,他没有一个好的答案,因为威胁是如此轻微,它所提供的理由并不充分。孩子没有做成他想做的事——虽然他有理由不去做,但他缺乏充分的理由。在这种情况下,他会继续体验到失调,但是他不能仅仅通过抱怨受到严重威胁来减少失调。男孩必须为他没有攻击自己的小妹妹找到某种理由,最好的方法就是努力说服他自己:他真的不喜欢打自己的妹妹,他一开始就不想这么做,而且打小孩子也不好玩。威胁越不严重,外部理由就越少;外部理由越少,对内部理由的需要也就越大。允许人们有机会形成自己的内部理由,可以帮助他们形成一套永久的价值观。

From #

社会性动物

登门槛(foot in the door)技术

Content #

乔纳森·弗里德曼(Jonathan Freedman)和斯科特·弗雷泽(Scott Fraser)的研究。他们试图劝导一些房主在自家的前院竖起一块写有“谨慎驾驶”的巨大招牌。由于这块招牌很难看而且很惹眼,大多数居民拒绝了这一做法,只有17%的人表示同意。但是,对另外一组居民,则首先由实验者对他们加以“软化”——让他们签署一份赞同安全驾驶的请愿书。由于签署请愿书是一件轻而易举的事情,所有受到邀请的人都签署了。几周后,另外一位实验者带着写有“谨慎驾驶”的那块很难看的招牌,找到了每一位居民。这一次,超过55%的居民允许在自家的土地上竖起这块招牌。因此,当个人作出较小的承诺时,他们就更有可能在这方面进一步作出承诺。

这种通过要求帮小忙来促使人们同意提供更大帮助的做事方法,被称之为登门槛技术。这种技术之所以有效,是因为它通过请人们帮小忙,而获得了让人们同意提供更大帮助的理由。

帕特丽夏·普利纳(Patricia Pliner)和她的同事们也得出了类似的结果。当他们直接要求一些人向美国癌症协会捐款时,46%的人表示同意;但是,当他们要求这些人提前一天戴上领针宣传募捐活动,然后在第二天向他们寻求捐款时,大约有两倍的人同意了。通过自我辩护来诱发人们的行为,可能导向利他主义和社会赞许的目标,但也可能导向破坏性的、不利的目标,我们将在本章的结尾看到这一点。

实验表明,如果想要别人帮你一个大忙,一个有效的策略是先请他们帮一个小忙。这一登门槛现象(foot-in-the-door phenomenon)被证实十分有效。

From #

社会性动物

诱设(entrapment)

诱设(entrapment)

Content #

金字塔比喻也有助于帮助我们理解诱设(entrapment)过程中的态度和行为是如何变化的,或者人们如何从一开始做出某个很小的、冲动性的决策,而随着时间的推移,发现自己的行为与最初的目标和意图已经相去甚远。

诱设过程可以通过可控的实验条件来进行考察。

假设你想寻求某人对你所从事的一项宏大事业进行帮助,但你很清楚要让这个人做到这一点是极为困难的,需要付出相当多的时间和努力,这个人肯定会拒绝。你应该如何去做呢?

一种可能是让这个人参与到工作中的某个细微的环节——某个十分简单以至于他(她)根本不会想到要拒绝它,迈出这一步有助于使这个人投入到你的“事业”之中。一旦人们这样去做了,他们满足你更大要求的可能性便会增加。

From #

在金字塔的不同方向之间变换