《DDD with TLA+》(3) DEBUG & MODELING
我们在 debug 时,我们实际在干什么?
我们在 debug 的时候,绝对不会考虑这个系统是用面向对象实现的,还是面向过程实现的,也不关注设计模式,设计原则。
反向 modeling
我们关心什么?
我们打 log,查看状态,其实就是在反向 modeling。
我们会发现只关心业务核心变量,如果不够再观察其他关键变量。
我们的日志绝对不是随便加的,为什么加在这里,不加在那里呢?
有价值
真正发生问题的时候,你做的事情才是最有价值的事情
发掘隐藏的模型
![](https://static001.geekbang.org/infoq/cf/cf2ad0369e2c0692ee31048c24c0690e.png)
Debugging 和 Modeling 的相似之处
都不关注具体技术
不关心架构风格、设计模式、设计范型、开发语言
都关注系统的高层行为和期望属性
关注关键数据及其变化
关注变化是否满足属性和约束
关注希望发生的变化有没有发生
不关注所有数据,只关注和问题相关的数据
不关注每一步的变化,只关注和问题相关的关键步骤的变化
需要时增加变量、缩小步骤
这个过程就是可视化、理解系统在各个抽象层次上的行为的过程
Debugging 时会吐槽什么
会吐槽某些数据结构定义层次不清、混杂在一起
会吐槽想看到的东西不容易看到
会吐槽数据的变化不清晰直接,绕来绕去
会吐槽某个关键状态没有显式表达,需要通过其他变量手工计算
这些问题其实都是建模问题。
重构的思路
压缩
很多重构的方法其实是在做压缩。比如抽象一个函数,C 语言换成更高级的语言等。只是把复杂性进行了压缩,看起来代码量直线下降。把 1000 行压缩到了 200 行。
而有时候可能压缩之后,把复杂性隐藏了,反而更难看懂了。
去掉不必要的
还有一种是说我通过对问题的理解,去除掉不必要的行为和计算。
而这是根本性的。
反脆弱
我理解的东西,我要把它做好。我不理解的东西,我要知道最坏的情况是什么,我能不能忍受,然后不让我崩溃。
假设一个分布式系统,节点崩溃其实我是不知道的,那这个节点崩溃了我要不能是我系统失效了。
Hardcore Modeling Technique
Inside every large program, there is a small program trying to get out.
Tony Hoare
But always fail because programmers cann't see it because they only think in terms of code.
leslie Lamport
假象系统已经做出来了,我去 debug。
假想系统已经实现正在运行,出了各种各样的问题,你要去 debug 这个系统,此时,你希望看到的东西就是建模的关键要素。
评论