架构设计91-闲聊01-论代码之熵

简介: 架构设计91-闲聊01-论代码之熵

架构设计系列文章,请参见连接。

前言:

本文为2013年3月写的一篇文章。现在看还是有意义的,所以转载到这里。几十年前的《人月神话》中说的焦油坑,现在还在不断的重复出现。

原文:

1850年,德国物理学家鲁道夫克劳修斯首次提出熵的概念,用来表示任何一种能量在空间中分布的均匀程度,能量分布的越均匀,熵就越大。在克劳修斯看来,在一个系统中,如果听任它自然发展,那么能量差总是倾向于消除。

以上所说的熵的定义可能让大家有点不知所谓。其实代码的混乱程度可以认为是一种熵。代码某一处在书写过程中没有清晰的层次,代码的简洁度不够。会影响周边的代码趋向于混乱。

如果做一件事情总喜欢绕过来绕过去然后再以别扭的处理方式处理整件事情。往往这类代码会出更多的问题。因为如果每千行代码平均出50个BUG,那么实现同样的功能混乱代码所用的行数远超过结构清晰的代码。所以,代码多,BUG就会多。最好的代码就是清晰代码结构降低代码量。

举个栗子:

把货物放到该位置(货物,位置) 
{ 
    将货物从仓库门口搬到位置 
    把货物放进去位置
    看看有没有空位
    将货物信息提交到仓库记录中 
} 

存储货物(货物) 
{ 
    位置 = 找个适合货物的位置(货物) 
    看看临时仓库上有没有位置
    看看临时仓库上都是什么货物
    把货物放到该位置(货物,位置) 
    获取放到临时仓库上了吗?
    这个货位上都存了什么货物?
} 

这只是一个简单的例子,突出了结构混乱代码。其实在现实中比例子里面的混乱程度更甚的代码者比比皆是的。写这样代码的人,能说他办错了事吗?不能,因为程序把该做的事情都做了。而且还需要鼓励这些程序员,因为他们再最快的时间内为你出了功能,满足了系统上线、Bug修复等等问题。

那在这种情况下怎么进行代码维护? 怎么保证系统的可用性?怎么在团队间进行知识传递?

从各种角度思考后,你会发现没有任何一种方法能够约束程序员写出直截了当,结构清晰的程序。所以,程序员写代码的时候除了“高压线”不敢碰,剩下的什么都敢做。对于要求一个程序员自觉的学习逻辑学,并系统化的认识整个项目、对系统架构有完整理解再去写代码是几乎是不可能的。 更不用提优雅的处理整个过程。

问题后果:

  • 不断地传染其他代码:

我们在分析一下这种类型的代码会带来的后果。根据熵的方式,这种代码会传遍整个项目。例如:我现在要维护这段代码。需要新加一个将货物通过某种方式可以移动到仓库门口的方法也记录到仓库记录中。

  1. 我需要先读懂这段代码。因为代码结构问题,读懂代码是比较费筋的。花了很大功夫读懂代码后发现其实功能很简单。
  2. 了解了代码的处理过程后,就是确定修改位置。由于各种原因(主要是不愿意承担由于修改代码结构造成故障的责任)是不会修改原有代码的结果的。也就是前例中应该将“将货物信息提交到仓库记录中”这个处理过程移动到“存储货物”的处理中。然后就会修改成:
把货物放到该位置(货物,位置) 
{ 
    将货物从仓库门口搬到位置 
    把货物放进去位置
    《do something》 
    看看有没有空位
    将货物信息提交到仓库记录中 
} 
  1. 将代码添加到上一步确定的位置。

通过以上三步的维护过程,可以看到一个开发过程的缩影。在实际的项目开发与维护阶段进行着一遍遍重复着,随着这一遍一遍的重复代码就会陷入了无休止的混乱中。说句不好听的最终这些代码只能按坨算,一坨根本没有层次,混乱的代码。好多年前有一个高人除了一本叫做《人月神话》的书,里面描述的焦油坑真是异曲同工。

  • 伴随着混乱上线:

对项目的业务处理过程思路不清晰导致代码多,代码多就BUG多。但是,上线时间、交付计划等都会是Deadline。各种各样的计划在催促着尽快上线,尽快抢占市场。所以,在某种妥协下系统就会带着这些代码上线。

这些代码都出现在模块内部。因为在模块间有强制性的接口约束。所以模块间关系还是比较清晰的,但是在多次添加新功能后模块间也会出现关系混乱的情况。比如在项目中要新加一个功能,其中A模块可以将消息M发送给B模块或者C模块,在架构的层次结构中是ABC,就有架构不清晰的程序员,三个负责人商量后,A直接将消息M发送给C。原因是B收到消息后不做操作直接传给C。这样更好就可以一月省个好几万去请架构师了。

总结:

再结合软件过程说说混乱代码必定会出现在发布版本中的原因:

  1. 大家习惯在没有详细设计的情况下写代码,然后再从代码推导出详细设计。也就是说写代码的人根本就没有想过那些处理可以归类到一起,那些纯粹就不是一类。
  2. 写完代码之后不管是组织review还是同行评审。那个会提出代码结构有问题。不提出代码结构问题的原因有1.以一句没时间改结构为由拒绝了这个建议。2.他还在为他那一坨混乱代码发愁呢。还想不要被你提出代码结构有问题要他改结构呢。
  3. 客户 and 领导要的只不过就是一个可以完成任务并且少出bug的代码,没人会花费时间去重构。
  4. 对项目的业务处理过程思路不清晰导致代码多,代码多就BUG多,BUG多的人就得天天加班。加班多就被领导看见的多,领导看见多就认为BUG多的人勤劳,然后就BUG多的人就加薪升值了。然后思路清晰的就被催了。然后思路清晰的就会向“该”发展的方向发展。然后所有的人都会向着BUG满天飞的境界去努力。这样必然形成恶性循环。

综上,说明了混乱代码的出现原因,以及它是必然出现的原因。结果就是陷入混乱代码的泥沼,无法自拔。因为时间都被修复混乱代码带来BUG全部沾满。没有时间思考,学习,休息。

提出解决办法以供参考:

  1. 程序员必须学习设计模式,有助于代码结构清晰。
  2. 先写设计(哪怕只有一页纸),然后编码。让你想清楚每一步该怎么做之后再去做。也可以边写设计边写代码。如果没有设计就写代码,那就需要想清楚模块的输入是什么,输出是什么,处理过程是什么。将它们各自封成不同的函数,然后再一个函数内调用这三个函数。这样就清晰的告诉读代码的人,你的过程是什么样的。
  3. 进行公司文化导向。奖励做出高质量review的人,而不是处罚写错代码的人。这样会鼓励做review的人,并形成一种对立关系。只有有了对立关系才能形成高质量的产品。
目录
相关文章
|
5月前
|
存储 测试技术 数据库
谈谈代码:降低复杂度,从放弃三层架构到DDD入门
最近我发现团队某项目的复杂度越来越高(典型的三层架构),具体表现为: - 代码可读性较差:各个服务之间调用复杂,流程不清晰 - 修改某服务业务代码导致大量无关服务的测试用例失败,单个功能开发者很难迅速定位相关问题 - 测试用例特别难编写,需要mock大量数据来拉起整块服务
107 4
谈谈代码:降低复杂度,从放弃三层架构到DDD入门
|
7月前
|
数据采集 存储 数据挖掘
BDCC - 闲聊数据仓库的架构
BDCC - 闲聊数据仓库的架构
53 0
|
3月前
|
机器学习/深度学习 测试技术 Ruby
YOLOv5改进 | 主干篇 | 反向残差块网络EMO一种轻量级的CNN架构(附完整代码 + 修改教程)
YOLOv5改进 | 主干篇 | 反向残差块网络EMO一种轻量级的CNN架构(附完整代码 + 修改教程)
138 2
|
18天前
|
缓存 监控 算法
Python性能优化面试:代码级、架构级与系统级优化
【4月更文挑战第19天】本文探讨了Python性能优化面试的重点,包括代码级、架构级和系统级优化。代码级优化涉及时间复杂度、空间复杂度分析,使用内置数据结构和性能分析工具。易错点包括过度优化和滥用全局变量。架构级优化关注异步编程、缓存策略和分布式系统,强调合理利用异步和缓存。系统级优化则涵盖操作系统原理、Python虚拟机优化和服务器调优,需注意监控系统资源和使用编译器加速。面试者应全面理解这些层面,以提高程序性能和面试竞争力。
17 1
Python性能优化面试:代码级、架构级与系统级优化
|
2月前
|
程序员 Python
类的设计奥秘:从代码到架构的科普全解
类的设计奥秘:从代码到架构的科普全解
14 2
|
2月前
|
消息中间件 并行计算 网络协议
探秘高效Linux C/C++项目架构:让进程、线程和通信方式助力你的代码飞跃
探秘高效Linux C/C++项目架构:让进程、线程和通信方式助力你的代码飞跃
41 0
|
3月前
|
设计模式 微服务
从代码到架构,我的技术成长之路
【2月更文挑战第5天】技术是一门不断进步的艺术,我在不断的实践中,通过学习和思考,逐渐领悟到了代码、架构等方面的知识和技能。在这个过程中,我发现技术并不仅仅是一种工具,更是一种思维方式和生活态度。本文将分享我的技术成长历程和所获得的思考。
28 2
|
7月前
|
存储 监控 API
每日一博 - 闲聊经典微服务架构
每日一博 - 闲聊经典微服务架构
38 0
|
7月前
|
运维 架构师 网络架构
公司架构师说不写代码,我直接怼他了!
公司架构师说不写代码,我直接怼他了!
46 2
|
7月前
|
Cloud Native 安全 关系型数据库
一起架构-某实时分析项目云原生 serverless 架构的设计思路和poc代码实现
一起架构-某实时分析项目云原生 serverless 架构的设计思路和poc代码实现