架构设计85--闲聊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的人,并形成一种对立关系。只有有了对立关系才能形成高质量的产品。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,894评论 2 89
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,084评论 1 32
  • 罗书萍 焦点网络四期 坚持分享第461天2018.06.11周一 今天升国旗的时候,校长讲到本学期还有一个周就要结...
    L次第花开阅读 233评论 0 1
  • 正均阅读 143评论 0 0
  • 我感觉小可爱的声音越来越好听了。今天国庆兼职结束了,严格意义上来说是国庆节假开始了,今天在店铺跟阿姨聊天时余科长突...
    阿屿阿阅读 259评论 1 1