仓库源文

.. Kenneth Lee 版权所有 2017-2019

:Authors: Kenneth Lee :Version: 1.0

道法自然v2


本文是这个文档的重写版本:

    :doc:`../软件构架设计/道法自然`

重写的动机是最近工作中对这个问题有更清楚的认识,觉得逻辑可以建得更清晰。

道法自然整句话是这样的:

    | 人法地 地法天 天法道 道法自然

我们要理解它,不是解释它,所以,我们必须保证它在解决问题,这一点是我们讨论的基 础。

在我们的定义中,人、地、天,都可见名,道不可见名。但“道”驱动“名”。所以,人,我 ,你,我们,他们,受限于我们身边的环境。这个靠近我们的环境,当然是“地”。所以, 人法地。

地的形态——至少在古人的感觉中——受限于天。天离我们很远,但它表现出来的阳光雨露, 雷鸣电掣,看来是改变地貌的原因。所以,地法天。

天法道,这不用解释,因为这是“道”的定义——我们能感知的东西背后那个事实,是道。既 然“天”是我们感受中的名,它背后的驱动力当然是道。

道法自然。最后这句猜测道的规律了。老子说“自然”,这说出来当然是个名,但老子对这 个名的感受到底是什么?我的判断是:“自然”,自然而然,自己是这样,它就是这样。强 调的是:不在我的控制范围之内。

这个如果你没有全局感,很容易觉得:这不废话吗?建了一串逻辑链,最后说不在控制范 围内。——这是非常微妙的思维陷阱,和“知不知上”这个陷阱一样的。你很容易觉得知知是 上,然后反过来,得到“不知”,是下。然后把范围扩大,正好认为“知不知”,也下。所以 我们拼命抵抗“不知”,要不骗自己或者别人,把不知当做知。要不拼命研究,希望把不知 转化为知,但其出弥远,其知弥少。在特定的问题上,你脱离你原来的事情为了这个不见 得在逻辑链上的“知”消耗了太多的时间,逻辑链上的“知”反而更少了。

正确的做法是,我基于我所“知”的“知”和“不知”决定我下一步的动作,把“填平不知”和“执 行策略”,两者都看做是进行决策的目标。我们才能保持在最容易接近目标的逻辑链上。

    .. figure:: _static/知与不知.jpg

道法自然的逻辑是一样的,如果我们要的是“自然”的力量,我们就必须把自己的投入看做 是外力,而不能看做是主力。你教你家的小孩吃饭,你要的是“小孩学会自己吃饭”,但很 多父母很自然忘掉了这一点,把目标变成了“小孩吃饭”了。结果追着喂,桌子保证干干净 净,不让小孩碰一下,为了让他高兴,还让他一边吃一边玩手机,最后确实实现了“小孩吃 饭”这个目的了,但“小孩学会自己吃饭”这个目的就失败了。

你看,很简单的道理,但就是一点点的反直觉,就让千万人掉陷阱里了。

好了,最后还是看我们工作中的例子。

最近和一个内部改革小组的人讨论如何提高软件开发能力。有一派的意见是:强调软件开 发文化,尊重开发规范,尊重开发流程,这样就能提高我们的开发水平了。

抱这种观点的人非常多(估计知乎上就很多),我表示强烈反对,我认为所谓的严格的开 发规范,开发流程,都阻碍了工程师的能力发挥。然后他们就有一个说辞,说:Kenneth, 如果人人都有你这样的开发经验,当然不需要开发规范,但我们的工程师没有那么强的开 发经验啊,没有规矩怎么行?

不知道读者从我前面说的例子中是否已经看到这种说法的破绽?我认为他们都掉进前面说 的思维陷阱里面去了。软件是一种创造性劳动,你要的是工程师的脑子,而不是他们的体 力。既然如此,你怎么会想到用你脑子的“完善的规范和流程”,来取代他们的脑力劳动呢 ?

你要的是“万物芸芸,各位其根”,你是在种田,单棵麦子的力量当然不如你,但你要的就 是他们一同慢慢生长而得到的力量,不是你自己的体力,你去拔它,它是高了一点,有什 么用呢?你要的是它的“自然”,不是“你然”。你然(你这样),只能得到“名”,对你想得 到的东西一点意义都没有,这不是一个很简单的逻辑吗?

换句话说,如果开发规范和流程就能解决开发的问题,你要工程师干什么?你基于开发规 范做一个软件工具,让它自己生成代码不就好了?

开发规范并没有解决开发的基本问题啊。我就不说你规范的过度执行导致的那些毁灭性的 后果了。我就说,你一个改革小组,不把改革的重心放到开发的主要问题上,却去追求非 关键问题,你是不是失职?

我在我的架构设计专栏中,给出很多设计和编码需要做什么的例子了: https://zhuanlan.zhihu.com/kls-software-arch-world。一个消息发进来,你的模块的 状态机应该怎么变化,是不是需要动脑才是判断得出来?是不是应该鼓励工程师去想办法 想清楚这个状态机怎么变化的?

你在一个流程中分配了资源,释放是随机的,怎么控制这个资源的分配不会超过水线。是 不是要建立逻辑链进行分析?

你用了两把锁,上锁的顺序决定了是否会死锁,你是不是要设计锁使用的原则?

你有96个CPU核,面对单个Socket的大业务流,如何提高处理能力,你是不是要决定队列怎 么分配,在哪个位置开始进行Hash?

……

然后你给我来一句:“我们的工程师水平不够,不能搞这个,我们要搞编码规范和开发流程 ,培养‘尊重软件’的氛围”。你“尊重软件”了吗?你的编码规范和开发流程能解决前面哪个 问题了吗?

还是你要告诉我,那些问题不需要解决?表演你“代码覆盖率指标”,“PCLint Warning清除 率”这些样子货,证明你“改革委员会”有良好的绩效才是最重要的?

自然,自然,不自然就必然是怪胎。

天下神器,为者败之,执者失之。