哪里遇到问题了,就找个地方加个开关、加个检查、加个条件判断来处理掉。这导致不够系统化,引入了局部的分支点,会造成多流程的耦合交叉,扩展容易遗漏。
现象
我们的代码这种情况非常的多。
就是哪里遇到问题了,好,我们按照这个问题找个地方加一个开关,或加一个检查,或加一个条件判断来处理掉。
这导致的问题,就是不够系统化,引入了局部的分支点,但是对于整体的影响没有分析。
这个分叉会造成后续扩展的问题,扩展的时候压根不会注意到有这个分叉。而且类似的问题可能还会继续分叉。
不够系统化,这样会造成多流程的耦合交叉,扩展容易遗漏。
例子
比如我们关机对于资源的可见性的管理(主要是 image),没有统一的约束和要求。
克隆的时候发现路径不在,报错了,然后加一个 open 修复一下,其他流程也是一样。
哇,这完全是黑盒,完全没法分析和预判,就等错误暴露了修复。
比如 drbd 发现脑裂了,直接操作了 --discard-my-data,这样很有问题,这样上层还在正常的创建资源。
实际需要给 node 抽象状态,当然我们有个 failed 状态,但是这是完全不可用的状态,相当于是宕机状态。
那么你没有准备好的状态,需要独立抽象的。发现了脑裂,其实是需要修复的,标记为未准备好的状态,那么其他流程都根据这个状态决定自己的操作。这是一个解耦的操作。
反常识的组合
包括下面的检查,开启了灾难检查,又开了一个 flag 的情况下跳过检查,很奇怪。
为什么不直接统一为关闭灾难检查呢,或者就统一的 flag 文件。
两个组合在一起,还是相反意思的,非常反常识,非常不结构化、不系统化。
小结
- 打补丁要面向对象,而不是针对流程打补丁;
- 哪里遇到问题就加开关、加检查、加条件判断,会导致不够系统化;
- 不够系统化会造成多流程的耦合交叉,扩展容易遗漏;
- 给 node 抽象状态,其他流程根据状态决定自己的操作,是解耦的操作;
- 两个相反意思的 flag 组合在一起,非常反常识、不系统化。