一周技术学习笔记(第75期)-通过代码的认知成本可以衡量复杂度吗

2022-12-01 15:22:51 浏览数 (1)

本周有4个话题。

话题1:

你怎么来评判一段代码,一个功能,一个工程的复杂性?是呀,在生产过程中,我们经常会说,也经常听说,某某工程复杂,某某功能的代码复杂,那么到底是怎么一个复杂呢?

能有一个这样的“公式”么,可以告诉我们代码的复杂性。一套软件代码,终归是由模块来构成的,这里我们暂且不论这些模块设计的合理性,因为那是另外一个方向要讨论的事情。模块的粒度可以是一个方法,可以是一个包。那么,我们看待软件代码复杂性的问题,就回归到我们看这个模块是不是复杂。如果一名程序员要对一个模块进行更改,他首先要能够读懂原先的代码,这个读懂的耗时需要记录下来:T1。接着他要在这个模块代码里面增加代码来完成一次需求,这个完成需求的耗时也需要记录下来:T2。

T1代表的是认知成本,T2代表的是开发成本,把两者相乘即可代表某一个模块的复杂度高低。

TIP:请忽略程序员水平的差异。当然你也可以质疑上面这种判断复杂性方法的可行性,不过确实是为大家提供了一种思路。

在《复杂软件设计之道》这本书里面也有类似的代码复杂性的描述,不过它是从具体的条件分析的角度来看的,大家可以参考一下。

1)系统是否有类似于CRUD的接口,是否由领域专家以CRUD术语描述?

如果是,则代表简单。

2)业务逻辑是否围绕输入验证?

如果业务规则只是对输入进行验证,没有自己独特的业务规则验证,则属于简单。

3)有复杂的算法和计算吗?

很显然,如果有,就属于复杂了。

4)是否有应该执行的业务规则和不变量?

拥有系统自己的业务规则,这种业务规则是为了实现业务战略的,并且通过复杂的流程来保证,很显然比较复杂。

5)是否有复杂的If…else判断?结果代码的条件复杂度是什么?它有许多不同的执行方案吗?

如果是,则属于复杂;如果这种判断影响全局,那就属于更复杂了

话题2:

你可听过这几个词?业务策略、业务规则、业务流程。

业务规则和业务流程,倒是经常会在讨论需求的时候谈及,但业务策略这个词汇出现的频率就相对少了很多,同时,这三个词汇之间的联系,恐怕大家也不太经常会对其思考。

“业务流程为了实现业务规则,因此可以通过业务流程去发现业务规则。业务流程是每个企业管理和运作中最复杂的部分,也是进行信息化的主要目标”。

“业务流程是表面的、显式的,而业务规则是隐含在业务流程中的,都是业务策略的具体实现”。

那么,从上面这两段描述来看,我们在业务开发过程中经常接触到的是业务流程和业务规则,因为业务策略实际上是属于企业战略的范畴,大多数时候我们来实现一个业务功能,或者做一个较大型的业务项目,不会经常把企业战略挂在嘴边的。反而是业务策略的具体实现,业务流程和业务规则是我们需要通过编码来实现的。

“业务策略属于顶层,决定了领域方向,是核心竞争力的体现,而业务规则是贯彻执行业务策略的细化层,起承上启下的作用,能够指导运作逻辑层进行实操,是业务流程实现所在,也是软件具体介入的地方,是计算机语言代码运行的层”。

话题3:

我们一直说业务建模这个动作,那么建模建出来的是个什么东西呢?肯定是一个模型,那模型都长成什么样呢?

那比如我们要对【人】进行建模,下面这个算一个模型吗?

代码语言:javascript复制
class Person {
    private String id; //工号    
    private String name;//姓名    
    private String title ;//职位头衔    
    void changeTitle(String newTitle){        
      this.title = newTitle;    
    }    
    ……
}

其实问题的本质是,模型到底是一个什么样的表现形式。

在我们日常的业务系统开发中,模型可以是流程图、UML图、Java类、数据表结构,甚至Excel图表等等,这些都是模型的表现形式。

模型最大的作用之一是起到可视化沟通的效果。

话题4:

一个人的感官有视觉、听觉、嗅觉、味觉和触觉共五种,我们应该均衡的来使用它们。可是呢,现如今的科技发展使得我们大部分人过度的依赖了视觉,每人一部手机,地铁上,餐桌上,床头上,甚至马桶上,那个屏幕一直盯着你,因为你也正盯着那个屏幕。

这肯定是不太健康的。

一顿美味的午餐,小区里沸声的蝉鸣,这才是生活的充盈。

可好像真的不大容易做到呢。

本周翻阅了《纳瓦尔宝典:财富与幸福指南》,上面这段文字是读这本书的时候触及到的一点感悟,更多内容大家可以找来一读,目前得到上有电子书。

此类书籍不可不读,也不可多读,找来2-3本就好了。

下面是书中作者总结的一些人生感悟,分享给大家。

纳瓦尔的个人原则(2016年)

→人生要义:活在当下。

→欲望即痛苦。(佛陀)

→执怒就像握了一把丢向他人的热煤炭,被烫伤的人反而是你。(佛陀)

→如果不想跟一个人共事一生,那就一天都不要和他共事。

→阅读(学习)是终极元技能,可以换来其他任何东西。

→生活中所有的回报都来自复利。

→用头脑赚钱,而不是用时间赚钱。

→99%的努力终将白费。

→任何时候都要完全诚实。诚实待人、积极向上,这是我们几乎在任何时候都可以做到的。

→具体地表扬,泛泛地批评。(沃伦·巴菲特)

→真理是具有预测能力的理论。

→观察每一个想法。(自问:“为什么我会有这个想法?”)

→生命的伟大在很大程度上源于苦难。

→爱是给予,不是接受。

→思考的间隙即开悟。(埃克哈特·托利)

→数学是自然的语言。

→每一刻都自成一体,自有意义。

健康、爱和使命,以此为序,其他的都不重要。

----END----

这里记录,我每周碰到的,或想到的,引起触动,或感动的,事物的思考及笔记。不见得都对,但开始思考记录总是好的。

参考资料:

《复杂软件设计之道:领域驱动设计全面解析与实战》

0 人点赞