前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一周技术学习笔记(第75期)-通过代码的认知成本可以衡量复杂度吗

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

作者头像
王新栋
发布2022-12-01 15:22:51
3570
发布2022-12-01 15:22:51
举报
文章被收录于专栏:程序架道

本周有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----

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

参考资料:

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序架道 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档