福尔摩斯与代码

January 22, 2018

“当你办理过一千起案子,那么你不知道第一千零一起案子才是怪事”。

--- 福尔摩斯

一千起案子是“经验”,一千零一起是“总结”。

我从来不相信狄仁杰和包拯式的侦察,用智商所能战胜的也仅限于比你愚蠢的人。更不相信柯南式的小孩子似小技巧,技巧从来不是决定事件发展真正的原因。

福尔摩斯是一个令人有启发性质的人物。

你不可能从全世界的人里面找到凶手。当然你也不能从十几万行代码里面找出问题。

但当看到两只脚印却很容易从“人的步长是眼睛距地面二分之一”的结论中找到一个排除的条件。

当你看到一个键盘的个字母的磨损程度也很容易判断键盘的拥有者是用于玩游戏还是办公,甚至可以细致的推导出玩什么游戏。假如有幸这是一个程序员的键盘的话,也很容易知道该程序员经常使用 var 声明变量,或是 ctrol v c 经常使用拷贝文档,或是经常使用 F6 调试还是 F10 调试。那么就不难判断他是干什么的。

下面我将论证福尔摩斯的找问题的推导学问。

  1. 去情感化

要想解决一个问题,去情感化是首先必须要做到的,多数人基于情感的偏向,会将问题引入到和自己的非亲近面。

福尔摩斯对华生说:“你是在看她的美,而我是在观察她的行为”。

人总是偏向于朋友或亲人是对的,总是觉得美女的品质是好的。毫无疑问这是解决问题的第一个阻碍。

我所遇到的工作中问题,有部分人是先怀疑别人有问题。那么很遗憾,你在最开始的 50%就是猜的。

在案子面前,所有的人都有可能是凶手,包括你自己。

  1. 考察现场

考察案发现场是了解案子的最接近的一环。

福尔摩斯不能因为急于追查凶手而不看凶杀现场一样,

这个环节千万不能节省,一定要获取最大最全的信息量。这个是打怪发育的第一桶也是唯一的一桶金。

我也曾,当得知一个线索后,就急于往深处挖掘,效率当然是有问题的。

出现问题,能够通过反复的执行一个操作,将问题必现。此时一定要掌握最多的线索。

譬如:一个页面无法获取数据,最直接的是获取的接口有问题,你可以选择直接跟踪,那么是否也有必要先考察下它的上游接口,再做线索的深入纠察。

当你已经知道多个条件的时候,那么知道结论就是早晚的问题。

多条线索的交汇处往往有玄机,此时由猜题转向了做题。

  1. 横向差异

格林先生被人谋杀了,但和他住在一起的皮特先生确安然无恙。这属于正常现象吗?

这是第二重间接的线索,我称作横向差异。

那么格林先生和皮特先生的不同点就会成为很有效的二重线索。

代码中也是,A 接口不能获取数据,B 访问同一个服务的接口却可以。那么同时跟踪 A 和 B 将会使问题简化。

  1. 横向相同

《血字的研究》里锥伯先生被杀,两天后斯坦节逊也被杀了。通过比较案子的相关性,很容易发现很多共同点,那么便容易把线索汇聚到他们是从同一个地方来的美国人身上。

横向相同是将多个问题,一起比较。

A 页面获取数据的接口有问题,而 B 页面下载有问题。如果它们都指向一个服务的话。那么两个问题不仅不复杂,反而给你带来了简单。

  1. 纵向差异

里锥伯先生被杀,他是美国人,却在英国被杀了。环境变化引发的凶杀,这是巧合吗?

综合环境变化引发的问题,往往有蝴蝶效应。

这时候追查里锥伯先生的历史就是很好的切入点。

A 页面三天是正常的,今天就资源无法加载。

这个纵向的差异也是很给力的线索。

  1. 猜想

猜想孕育结论。

有了线索,可以解决部分问题,但线索是点分布的,还需要猜想就能将其连成线。

华生给福尔摩斯看价值 50 磅手表,手表有钥匙的磨损,上发条空有划痕。

50 磅手表,会装在口袋里,可以猜想此人生活很随意,发条有划痕孔,最有可能是手对不准发条孔。生活很随意的人手抖,当然可以猜想是喝醉了酒。

关于猜想实际上是连接线索的思维推理,其难度是最考验侦破能力的。

拿我今天解决的问题说下:

某个接口存在问题,我首先观察了它的上下游接口都是好的,通过对比两个接口我发现,有问题的接口请求参数比较大。

我就猜想可能和参数的大小有关。我减少参数的个数,发现问题不存在了。

那么就可以得出猜想:有一个环节设置了参数限制大小的拦截。

关于奥卡姆剃刀原理对猜想也有很多帮助。

奥卡姆剃刀原理说:一条龙在房间里,你看不了,听不见,摸不到,闻不到。等于白说。

  1. 演绎

演绎是对猜想和线索的反作用,加强猜想和线索的关系。把猜想和线索连接成故事。喝醉了酒的人,兜里有块金表。是不是可以说此人曾经境遇还不错,但却很窘迫呢?

例如:文件上传 4M 以上就会有问题,可以猜想某处文件满了。那么是不是可以演绎到所有的大文件夹都有嫌疑?

演绎还有一个关键点,就是将猜想转化为可证伪的论断!

这很重要,不可证伪的猜想不是好猜想!

大文件夹都有嫌疑,而大文件夹是有限的,是可以枚举排除的。

演绎的精髓在于排除或加强猜想。从而得出行之有效的证实或证伪猜想的手段。

  1. 猜想证伪

先证伪,这个是排除逻辑的规律。当你无法证明是谁,就先证明不是谁!

当你排除了一切不可能,剩下的不管有多不可思议,必然是事实。

关于证伪猜想,一定要有耐心,一个一个的证伪。每证伪一个,剩下的可能就越少。

哪怕是大海捞针也要分成五大洋,一个个的捞。

就如福尔摩斯第一天与第二天灰头土脸的带回来了错误,第三天带回的便是真相。

有一个环节设置了参数限制大小的拦截,可能的地方会有五六处,耐心的排除是必经之路。

我有几次定位问题,找了好久,但是时间越久离真相就越近。最终会将问题落在一两个可能身上。

  1. 循环论证

走到猜想证伪结束后,会将凶手锁定在几个少数身上。这时候又结合线索,进行第二轮猜想,再证伪。

当然,福尔摩斯是没有这个过程的,以我微薄的经验来讲,很少用到。

结束:

感谢《福尔摩斯》这本书,确实提升了我不少,除了以上我想说的,当然必不可少的是冷静客观的思考。

写此文,并非酝酿已久,关于福尔摩斯有很多思想和西方近代物理学很雷同。

从光速不变到相对论,牛顿思想的情绪化,论证的不普世,以及奥卡姆剃刀原理不容的以太猜想。除了时间出了问题,还是能是啥。


Profile picture

Written by Vance who lives and works in Shenzhen, China, and is working hard to improve. You should follow them on csdn