本周有4个话题。
话题1:
你怎么来评判一段代码,一个功能,一个工程的复杂性?是呀,在生产过程中,我们经常会说,也经常听说,某某工程复杂,某某功能的代码复杂,那么到底是怎么一个复杂呢?
能有一个这样的“公式”么,可以告诉我们代码的复杂性。一套软件代码,终归是由模块来构成的,这里我们暂且不论这些模块设计的合理性,因为那是另外一个方向要讨论的事情。模块的粒度可以是一个方法,可以是一个包。那么,我们看待软件代码复杂性的问题,就回归到我们看这个模块是不是复杂。如果一名程序员要对一个模块进行更改,他首先要能够读懂原先的代码,这个读懂的耗时需要记录下来:T1。接着他要在这个模块代码里面增加代码来完成一次需求,这个完成需求的耗时也需要记录下来:T2。
T1代表的是认知成本,T2代表的是开发成本,把两者相乘即可代表某一个模块的复杂度高低。
TIP:请忽略程序员水平的差异。当然你也可以质疑上面这种判断复杂性方法的可行性,不过确实是为大家提供了一种思路。
在《复杂软件设计之道》这本书里面也有类似的代码复杂性的描述,不过它是从具体的条件分析的角度来看的,大家可以参考一下。
1)系统是否有类似于CRUD的接口,是否由领域专家以CRUD术语描述?
如果是,则代表简单。
2)业务逻辑是否围绕输入验证?
如果业务规则只是对输入进行验证,没有自己独特的业务规则验证,则属于简单。
3)有复杂的算法和计算吗?
很显然,如果有,就属于复杂了。
4)是否有应该执行的业务规则和不变量?
拥有系统自己的业务规则,这种业务规则是为了实现业务战略的,并且通过复杂的流程来保证,很显然比较复杂。
5)是否有复杂的If…else判断?结果代码的条件复杂度是什么?它有许多不同的执行方案吗?
如果是,则属于复杂;如果这种判断影响全局,那就属于更复杂了
话题2:
你可听过这几个词?业务策略、业务规则、业务流程。
业务规则和业务流程,倒是经常会在讨论需求的时候谈及,但业务策略这个词汇出现的频率就相对少了很多,同时,这三个词汇之间的联系,恐怕大家也不太经常会对其思考。
“业务流程为了实现业务规则,因此可以通过业务流程去发现业务规则。业务流程是每个企业管理和运作中最复杂的部分,也是进行信息化的主要目标”。
“业务流程是表面的、显式的,而业务规则是隐含在业务流程中的,都是业务策略的具体实现”。
那么,从上面这两段描述来看,我们在业务开发过程中经常接触到的是业务流程和业务规则,因为业务策略实际上是属于企业战略的范畴,大多数时候我们来实现一个业务功能,或者做一个较大型的业务项目,不会经常把企业战略挂在嘴边的。反而是业务策略的具体实现,业务流程和业务规则是我们需要通过编码来实现的。
“业务策略属于顶层,决定了领域方向,是核心竞争力的体现,而业务规则是贯彻执行业务策略的细化层,起承上启下的作用,能够指导运作逻辑层进行实操,是业务流程实现所在,也是软件具体介入的地方,是计算机语言代码运行的层”。
话题3:
我们一直说业务建模这个动作,那么建模建出来的是个什么东西呢?肯定是一个模型,那模型都长成什么样呢?
那比如我们要对【人】进行建模,下面这个算一个模型吗?
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----
这里记录,我每周碰到的,或想到的,引起触动,或感动的,事物的思考及笔记。不见得都对,但开始思考记录总是好的。
参考资料:
《复杂软件设计之道:领域驱动设计全面解析与实战》