做一个有说服力的程序员:用数学与逻辑完成沟通这件小事儿

1,036 阅读8分钟

本文来源于公众号:勾勾的Java宇宙(微信号:Javagogo),莫得推广,全是干货!

原文链接:mp.weixin.qq.com/s/b8BfWCdb9… 作者:公瑾

MECE 原则

MECE 原则(Mutually Exclusive Collectively Exhaustive)的中文意思是“相互独立,完全穷尽”,简而言之,能够做到不重叠、不遗漏,兼顾排他性和完整性。

就像切比萨一样,一个大比萨,用 4 刀切成了 8 份,每一份之间彼此不重叠(排他),合在一起又能还原大比萨。

MECE 原则是麦肯锡提出的一种结构化思考方式,无论对报告撰写,提案演讲,业务分析,都是一种很好的思维方式。

我们来看个例子。

公园的票价问题。公园的门票价格是 20 元,优惠票包括了老人票和儿童票。价格制度为:

  • 不到 10 岁的儿童免费;
  • 10 岁以上的未成年人半价;
  • 60 岁及以上的老人免费;
  • 其他成年人无折扣。

用 MECE 原则来看一下这里的定价制度,就会发现这个制度“有遗漏”“不完整”。比如,10 岁的小琳到底是算在不到 10 岁免费的范围,还是算在 10 岁以上未成年的半价范围呢?

用程序语言来看,上面价格对应的代码就是:

org_price = 20
age = 10
if age < 10:
    discount = 0.0
if age > 10 and age < 18:
    discount = 0.5
if age > 60:
    discount = 0.0
if age >= 18 and age < 60:
    discount = 1.0
final_price = discount * price

显然,当 age10 的时候,程序不会走任何一个策略分支,于是代码会出现错误。

在解决类似的逻辑问题时,一定要注意所有边界值的可能性。原则上,每个可行值(尤其是边界值)能且只能落在一个策略分支中。

一个常用的分析方法就是画线法,如下图所示。画一根数轴,代表所有的可行值,再使用 if 语句分解问题,空心点表示开区间,实心点表示闭区间。

画线法

逻辑计算:“与”“或”“非”“异或”

命题是一个描述客观事物的陈述,它包含了正确或错误两个可能性。

  • 如果命题正确,我们一般用 true1 来表示;
  • 如果命题错误,我们一般用 false0 来表示。

有了命题,我们就可以对命题和命题进行逻辑计算。就像有了数字之后,就有了加减法。

逻辑的运算,通常有“与”“或”“非”,以及叠加在这之上的“异或”。

最基础的“与”“或”“非”。

  • 逻辑 “与”

A 并且 B,只有命题 A 和命题 B 同时为真的时候,A and B 才是真,否则都是假;

  • 逻辑 “或”

A 或者 B,命题 A 或者命题 B 有一个为真的时候,A or B 就是真,否则为假;

  • 逻辑 “非”

不是 A,命题 A 为假的时候,not A 就是真,否则为假。

从文氏图看“异或”

“异或”在 Python 语言中也记作 A^B。命题 A 和命题 B 的真假不同时,则 A^B 为真,否则为假。

用文氏图演示“与”“或”“非”的运算过程。

  • “与” A and B

根据逻辑运算的定义,如下图所示,A and B 为真的区域就是,椭圆 A 和椭圆 B的交集(蓝色区域)。

A and B 文氏图

  • “或” A or B

如下图所示,A or B 为真的区域,便是椭圆 A 和椭圆 B 的并集(蓝色区域)。

A or B 文氏图

  • “非” not A

如下图所示,not A 为真的区域,便是椭圆 A 以外的部分(蓝色区域):

not A 文氏图

  • “异或” A^B

A^B,表示 命题 A 和命题 B 的真假不同,也就是真假相异,故是下方文氏图的蓝色区域。

A^B 文氏图

你会发现,A^B 的蓝色区域,就是上面 A or B 区域减去 A and B 区域,即A^B = (A or B) - (A and B)

从逻辑回归到沟通

我们日常沟通常用关联词语,例如 “而且” “或者” “但是” “如果...那么...” “因为...所以...”,它们跟 “与” “或” “非” 有什么关系呢?我们结合逻辑运算和文氏图来分析。

1. 而且、或者

“而且”,顾名思义,就是 A and B。例如,小琳很漂亮(A),同时小琳很聪明(B),经过逻辑运算后得到小琳漂亮且聪明(A and B)

“或者”,顾名思义,就是 A or B。例如,这个暑期,小琳打算去海南,否则小琳就打算去辽宁,经过逻辑运算后,得到这个暑假,小琳打算去海南或者辽宁(A or B)

你在使用“而且”和“或者”沟通时,要注意命题 A 和命题 B 是相互独立的,也就是 A 与 B 应符合上文讲的 MECE 中的“不重复”原则。

下面我将通过三个反例说明:

例1,小琳很聪明漂亮(A),而且小琳很聪明(B)

虽然语义上无误,读者也能理解,但从沟通的角度来看,这句话非常不妥帖。

例2,为了保证系统的稳定过渡(A),并且(即“而且”)保证在过渡期内,各个使用方的需求正常迭代(B)

此时,命题 A 显然包括了命题 B。

例3,小琳是东北人(A),或者小琳是北方人(B)

“北方”包含了“东北”,相互重复,在表达上绕了一个大弯,仅表达小琳是北方人。

通过这三个反例我们可看出,缺乏逻辑性的关联词,虽然不会影响语义表达的正误,但却会让沟通变得冗杂,不够直接明了,从而降低了沟通效率。

所以,沟通表达与逻辑思维有着直接关系

2. 因为……所以……

这个关联词组是一种逻辑推理,即由 A 推导出 B。

因为……所以……

在使用“因为……所以……”沟通时,一定要注意命题之间是否具备了充足的因果关系,否则,就会出现让人反感的逻辑错误。

先举一个正例:

因为小琳聪明漂亮(命题 A),所以小琳很漂亮(命题 B)

可以看出命题 A 和 命题 B 两者有充足的包含和被包含的因果关系。

再举一个反例:

因为要保证系统的稳定过渡,并且保证在过渡期内,各个使用方的需求正常迭代,所以系统拟定共分为三期:过渡期、实验期、切换期

因为要保证稳定过渡,所以拆分为三期

那么要保证稳定过渡,就必须拆分为三期吗?显然并不是,拆分为四期、五期,全凭开发者自己的设计方案,都是可以的,显然这两者不具备强烈的因果关系。这样你在陈述方案的时候,就无法让人信服。

3. 虽然……但是……

它表示的是一种转折关系。

比如,努力的人(B),学习成绩不一定很好(非 A),这就构成了转折,于是得到虽然小琳成绩不好(非 A),但是她很努力(B)

如下图所示,你会发现 “虽然(非A)……但是(B)……” 这个关联词与 “因为(A)……所以(B)……” 刚好相反。“因为A,所以B”,也可以描述“虽然非A,但是B”。

虽然……但是……

所以,我们可以通过将其转为因果关系,来验证“虽然……但是……”这个关联词是否使用妥帖时。

例如虽然小琳不是单身(非A),但是她是个东北人(B)。

将这句话转为因果关系,则有因为小琳是单身(A),所以她是东北人(B)。显然,这里就构不成任何的因果关系了,所以原句是有问题的。

虽然小琳成绩不太好(非A),但是她并没有自暴自弃(B)。

将这句话转为因果关系,则有 因为小琳成绩好(A),所以她没有自暴自弃(B)。显然,这里的因果性很强,可以认为原句里的“但是”使用得非常恰当。

虽然小琳不是单身(非A),但是她的成绩依旧很好(B)。

将这句话转为因果关系,则有因为小琳是单身(A),所以她的成绩好(B)。这里的因果性就很弱了,因此“但是”使用得并不完全恰当。

其实我们在日常生活中,有很多时候的“但是”是被误用的。虽然日常沟通中不必过度关注这些瑕疵,但是在书面语的环境下这样的表达就不太妥帖了。

总结

怎样才能讲出有逻辑的话?

当你掌握了很好的逻辑思维方式后,你与人沟通表达时会更有说服力,沟通效率也会大大提升;分析事物问题时,也会更加周密完善、一针见血。

你站在逻辑的视角,尤其是使用了文氏图这一工具之后,来重看上文的例子,就会清晰地分析出这些句子里面有哪些逻辑关系的漏洞。


欢迎大佬们关注公众号 勾勾的Java宇宙(微信号:Javagogo),拒绝水文,收获干货!