Blog

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

Content #

贾德森·米尔斯(Judson Mills)所做的一项针对六年级学生的实验。米尔斯首先测量了他们对欺骗的态度。然后,他让孩子们参加竞争性考试,向优胜者颁发奖品。这种情况是预先安排好的,不作弊几乎是不可能取胜的;而且,孩子们很容易作弊,他们会认为自己作弊不会被发现。

正如你所预料的,一些学生作了弊,而另外一些则没有作弊。次日,这些六年级的学生再次被要求说明他们对作弊的看法。总体而言,那些作弊的孩子对欺骗变得更加宽容,那些抵制作弊诱惑的孩子对欺骗采取了更加严厉的态度。

设想一下米尔斯的实验对你而言意味着什么,设想你已经站到了金字塔的顶端。在一生中,你会面临着许多决策,这些决策会引导你在金字塔的不同方向之间变换:主修什么专业?拒绝与做过一些违法或不道德事情的朋友合作,或者不去破坏一切?是保持一段浪漫的关系,还是离开?是相信一些阴谋说,还是去 Snopes.com或Politi Fact寻求真相?无论怎样,当你朝着某个方向迈出一步的时候,你总会感受到失调——现在你会被激励为减少失调而去为自己所做的事情辩护。

反过来,这样的辩护会让你更难改变主意,即便是在你应该做出改变的时候。当你到达金字塔底部的时候,你将与那些面临同样的困境但作出不同决定并从相反的方向滑下金字塔的人相距甚远。你会确信自己的决策是绝对正确的,而那些从另一边溜下来的人都是白痴或骗子。(你觉得他们对你的感觉又会如何?)

From #

社会性动物

改变已经作出的决定也会感受到失调

Content #

尽管决策的不可挽回性总会增加失调,并且会增强人们减少这些失调的动机,但在一些场合,人们即便改变已经作出的决定也会感受到失调。

几年前,罗伯特·西奥迪尼(Robert Cialdini)30通过在一家汽车经销商做临时销售人员,发现了其中的奥妙。这是一种常用且颇为有效的策略,称之为虚报低价,或者用低价来让消费者就范。

它是这样发生作用的:某位顾客找到某位汽车销售人员,准备为他梦寐以求的一款汽车支付19300美元——这个价格被宣传成了难以置信的便宜货。那位销售人员微笑着说:“我卖给你一辆更好的”,然后以18942美元的价格把那辆车卖给顾客。买方对这笔交易感到非常兴奋,于是同意了这笔交易,并开出了首付支票,兴高采烈将那辆新车开回了家。不过,10分钟后,那位销售人员带着一副绝望的表情找到他;说自己在计算上似乎犯了一个错误,而销售经理发现了。这辆汽车的价格实际上是19384美元。这时,买家会怎么做?这位顾客可以在其他地方买到更便宜的车,也就是说,他所作出的购买这辆车的决策并非无可挽回。尽管从这位销售人员那里购买这款车的理由(交易价格)已经不存在了,但是与一开始就报价19384美元相比,更多的人会将交易继续下去。

这到底是怎么回事呢?这里至少有三个重要的问题值得注意。

  1. 虽然客户的购买决定毫无疑问是可逆的,但是签署首付支票的行为却形成了一种潜在的承诺。
  2. 这种承诺引发了对某种快乐体验的期待:开着一辆新车出去。如果因为中止不进行交易而导致预期事件不能发生,将会带来失调和失望。
  3. 尽管最终价格比推销员所说的要高,但只比其他地方的价格略高一点。在这种情况下,顾客往往会说:“哦,管他呢。我已经来了,而且已经填了表格,为什么还要再等呢?”

而今,当人们购买汽车的时候,低价策略已经很少起作用了,因为互联网使人们变得更聪明、对情况更加了解。但这种策略仍然适用于我们不知情的许多其他情况,比如用一个新的合同取代过期的手机合同,这个新的合同便有可能隐含着某种消费陷阱。

From #

不可挽回假设

Content #

丹尼尔·吉尔伯特(Daniel Gilbert)在对一群学习摄影感兴趣的学生进行测试时证实了不可挽回假设。

他让他们拍摄完一卷胶卷,打印出其中的两张照片,让他们对照片评级,并选择了其中的一张。一些学生可以在五天内替换照片,而另一些学生则被告知他们所做的第一选择是不可挽回的。在两天、四天、九天之后,吉尔伯特分别联系了他们,看看他们对照片的感觉是否发生了改变。在第一天做出不可挽回选择的人比那些可以交换照片的人更喜欢他们的选择。

结果再一次显示,一旦某个决定是不可挽回的,人们便会竭力让自己为所作出的选择感到高兴。由此可见,一旦人们感到已经无能为力,他们便会更加确信自己作出了明智的决定。

From #

社会性动物

面对不一致的信息时大脑的推理区域会被关闭

Content #

在一项研究中,人们试图处理与他们所偏爱的总统候选人不一致或一致的信息,德鲁·威斯顿(Drew Westen)和他的同事们24发现,当一个人面对不一致的信息时,大脑的推理区域实际上被关闭了,当恢复一致时,大脑的情感回路会“快乐地”亮起来。正如威斯顿所说的,人们转动“认知万花筒”,直到这些片段进入他们想要看到的模式,然后大脑通过激活与快乐有关的电路来补偿它们,似乎认知失调的感觉确实会让大脑受伤。

From #

认知失调是两种基本动机冲突的结果

Content #

认知失调是两种基本动机冲突的结果:

  1. 我们努力保持正确,这促使我们密切关注他人正在做的事情,听取值得信赖的交流者的建议;

  2. 我们努力相信我们是正确的(明智的、体面的、善良的)。

    有时候,我们的动机是正确的,我们的动机使我们相信自己是在朝正确的方向行事:我们会寻找并注意一些信息(例如,关于吸烟的风险)。

    对失调的理解有助于解释为什么人类的思维是非理性的,而不是理性的。不管多聪明,那些正在减少失调的人都会相信自己是对的,以至于他们经常会做出非理性的行为。我所说的“非理性”,是指他们的不适应行为会阻碍他们了解基本事实,或阻碍他们找到解决问题的真正办法。

From #

社会性动物

自我辩护的本质

Content #

我们的许多行为都会受到一些未知因素的支配。之后,当我们被要求解释自己的行为时,我们试图构建出一个有意义的故事,同时满足我们的愿望,让自己和他人看起来都不错。这便是自我辩护的本质。

From #

社会性动物

蒙古骑兵的战术

Content #

遭遇敌人之后,蒙古骑兵团通常会集中火力,从远处射出迅猛的箭雨,袭扰敌军,甚至破坏敌军阵形。接着,他们骑马冲向敌阵,一边驰骋一边射箭,在距离敌阵 40—50米的地方射出最后一轮箭雨,向右拨转马头退回本阵。这个距离足以射穿甲胄,又不便于敌军发起反突击。蒙古骑兵一边调头,还一边转身向后射箭。这个动作,西方称为“帕提亚射术”,中国称为“抹鞦”。按照每名骑兵携带六十支弓箭计算,蒙古骑兵能够这样反复冲击敌阵长达一小时之久。

南宋人这样描述实战中蒙古骑兵的“半回转战术”:

交锋之始,每以骑队径突敌阵。一冲才动,则不论众寡,长驱直入,敌虽十万,亦不能支。不动则前队横过,次队再冲。再不能入,则后队如之。

方其冲敌之时,乃迁延时刻,为布兵左右与后之计。兵既四合,则最后至者一声姑诡(号角),四方八面响应齐力,一时俱撞。

“一时俱撞”如能摧破敌阵,敌军溃兵还要面对蒙古骑兵几乎无休无止的追杀,直至全军覆没。蒙古人还将“半回转战术”和佯败示弱、虚张声势、拖延疲敌、侧翼包抄等战术结合起来。南宋人总结说,蒙古骑兵作战,“在乎彼纵此横之间,有古法之所未言者”。

From #

防秋与灭丁

Content #

于是,金朝不知不觉沾上了中原王朝的另一个老毛病,那就是“防秋”。

“防秋”之名,大概始于唐代。唐中后期,每年秋天都要征调关东各道的军队,分守长安以西的要害地区,抵御吐蕃侵袭,称为“防秋”。此后,每到秋高马肥的时候,面对呼啸南下的游牧骑兵,弱势的中原王朝大多采取类似的被动防御:北宋防备契丹,南宋防备女真,明朝防备蒙古,一脉相承,统谓之“防秋”。

勇悍的女真人,一度是“防秋”的汉人士兵恐惧的对象。就算迁入中原,面对更北边的游牧民族,金朝也一度保持强势。为了不让蒙古诸部形成威胁,金世宗下令“每三岁遣兵向北剿杀”。这种攻势防御战略,称为“灭丁”。

From #

隳三都

重新封装未决行为逻辑

Content #

Java中有Transaction类定义如下:

public class Transaction {
  // ...fields
  // ...get() methods...
  // ...contructor

  public boolean execute() throws InvalidTransactionException {
    //...
    try {
      //...
      if (status == STATUS.EXECUTED) return true; // double check
      long executionInvokedTimestamp = System.currentTimestamp();
      if (executionInvokedTimestamp - createdTimestap > 14days) {
          this.status = STATUS.EXPIRED;
          return false;
      }
      //...
    }
  }
}

在 Transaction 类的设计中,createTimestamp 是在交易生成时(也就是构造函数中)自动获取的系统时间,并没有暴露修改 createdTimestamp 成员变量的 set 方法(也就是没有定义 setCreatedTimestamp() 函数),我们应如何对其做单元测试?

这是一类比较常见的问题,就是代码中包含跟“时间”有关的“未决行为”逻辑。我们一般的处理方式是将这种未决行为逻辑重新封装。针对 Transaction 类,我们只需要将交易是否过期的逻辑,封装到 isExpired() 函数中即可,具体的代码实现如下所示:

public class Transaction {
  protected boolean isExpired() {
    long executionInvokedTimestamp = System.currentTimestamp();
    return executionInvokedTimestamp - createdTimestamp > 14days;
  }
  public boolean execute() throws InvalidTransactionException {
    //...
      if (isExpired()) {
        this.status = STATUS.EXPIRED;
        return false;
      }
    //...
  }
}

From #

Hash Tag

Content #

Redis中的Hash Tag使用不当,可能会导致数据倾斜,请问什么是Hash Tag?

Hash Tag 是指加在键值对 key 中的一对花括号{}。这对括号会把 key 的一部分括起来,客户端在计算 key 的 CRC16 值时,只对 Hash Tag 花括号中的 key 内容进行计算。如果没用 Hash Tag 的话,客户端计算整个 key 的 CRC16 的值。

假设 key 是 user:profile:3231,我们把其中的 3231 作为 Hash Tag,此时, key 就变成了 user:profile:{3231}。当客户端计算这个 key 的 CRC16 值时,就只会计算 3231 的 CRC16 值。否则,客户端会计算整个“user:profile:3231”的 CRC16 值。

From #