热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

如何理解软件系统中的热力学第二定律

本篇内容主要讲解“如何理解软件系统中的热力学第二定律”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大

本篇内容主要讲解“如何理解软件系统中的热力学第二定律”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解软件系统中的热力学第二定律”吧!

1.破窗理论

设想下有两个团队正在同时进展同样的项目。团队A,在项目开发过程中,尽管制定了详细和周全的计划,拥有能力最强的工程师,项目的最终结果也不尽人意,随着项目时间推移,代码变得很差。

而另外一个团队B,在开发项目时,尽管也遇到了很大的困难和接二连三的问题,但是却能保持良好的代码状态,圆满的完成了项目任务。

是什么原因造成了这个差异呢?

在城市中,我们总能发现事物相反面,例如:有整洁漂亮的建筑,而另一些却是破烂不堪的房子。是什么造成了这么强烈的冲击感呢?

这两个现象的原因是一致的,就是“破窗理论”。

以一幢有少许破窗的建筑为例,如果那些窗不被修理好,可能将会有破坏者破坏更多的窗户。最终破坏者甚至会闯入建筑内,如果发现无人居住,甚至就在里面定居或者纵火。在相当短的一段时间内,建筑就会以惊人的速度被破坏掉,而且业主也不愿意去修理这个破烂的房子了。

对应到软件开发领域时,这个”破窗户“,可能是工程师不经意间留下,可能是考虑不周导致,可能是低劣的设计遗留,也可能是错误的需求导致。

之前我们团队内部重构过代码架构,很多业务都进行了重新设计,但是随着时间的推移,破窗开始出现,后面就迅速就变得难以维护,臃肿。当然还有其他原因,但是最重要的原因就是对有问题代码置之不理。

不要留着“破窗户”,见到一个就就修一个。如果没有足够多的时间去修复,最好就加上注释或者是打个bug标记,表示这部分代码需要进行修复,防止窗户破的越来越多。

2.温水煮青蛙

美国康奈尔大学的科学家做过的一个温水煮蛙实验:将一只青蛙放进沸水中,青蛙一碰沸腾的热水会立即奋力一跃从锅中跳出逃生;

又尝试把这只青蛙放进装有冷水的锅里,青蛙如常在水中畅游,然后慢慢将锅里的水加温,直到水烫得无法忍受时,青蛙再想跃出水面逃离危险的环境却已四肢无力,最终死在热水中。

实验说明的是由于对渐变的适应性和习惯性,失去了警惕和反抗力的道理。

在程序系统中也是适用的,程序员们工作时间久了,就会进入一种安逸的状态,称之为“舒适区”。在舒适区中,程序员往往是一种麻痹的状态,对外界的变化感知麻木。

软件代码在时间的长河中,慢慢地、悄无声息的发生着变化,这个变化最终将会失去控制。

大多数的软件系统都会从微不足道的小bug开始,慢性死亡。

软件项目被各种各样的小bug折腾,只能一天天的延期。

软件项目中的每一个需求,就像是衣服上破的洞,被打上一个个的补丁,最后已经无法看清软件架构本身的模样,就像已经无法看清衣服本身的颜色。

最可怕的是,每一个程序员都承认这是正常、可以接受的状态,每天乐此不疲的进行bugfix,他们就像温水里的青蛙,享受着这种状态。丝毫没有感受到整个软件系统正在变成垃圾,变的满目全非。最后迎接他们的是臃肿的、难以维护的代码。

水煮蛙和破窗效应是不同的,他们的不同点在于是否有主观意愿。

破窗问题上,软件系统变得杂乱无章,是程序员们在看到“破窗”时,并没有及时阻止这种事情发生,从而认为没有人会注意到这个问题。

而煮蛙问题上,重点是“慢”,如果放在热水中或者是快速升温,青蛙是会奋力的一跳,逃出生天的。所以程序员真的只是没有察觉,软件系统就在慢慢的走向死亡。

3.自我为中心

下图是一副非常有名的画作,名为『从主教花园望见的索尔兹伯里大教堂』,作者康斯太勃尔,英国的著名油画家。

有一天,康斯太勃尔去他的金主大教堂的主教Fisher先生家里玩。

Fisher主教跟画家先生说:“亲爱的画家,你帮我画一幅画吧。把我和我美丽的妻子以及我这大教堂一起画到画里。我要把画留在教堂,成为镇堂之宝。”于是康斯太勃尔先生很高兴的接下这个项目。

画家开始了辛苦的工作,经过一段时间终于把这幅画完成了。

画家画这幅画时可能心情不好,所以在教堂塔尖上方的天空有一片乌云。Fisher主教看到这幅画后,很不满意。虽然画家把主教大人、主教夫人和教堂都画进去了,但是两口子只在左下角露了个背影,这也就忍了。“下面那几头牛是怎么回事,为什么比我们占的镜头还多?”主教问。画家说:“你没看懂?我是在恭维您呢,是说您和您夫人好牛!”。Fisher先生没什么话说了,然后又找到了新的吐槽点:“为什么天空的云都是乌云?”。

他邀请画家再去他家做客,重新观察,以便于修改画作。画家很不高兴了,就单独把画展出了。展出之后得到很多好评,于是回信给Fisher主教:“你看,大家都说很好看,不用改了。”,Fisher主教收到信后也怒了,回信就说了一句话:“给我改!!!”。

这就是关于需求的故事,我们再看上图,看看教主和教主夫人被画到了哪里?您能找到吗?

大鱼教主想要一幅画,画里有他们夫妻二人和教堂,需求表达完后,并没有再对需求进行更具体的说明。

更深入的思考,为何总是会存在描述不清的情况呢?

读者们肯定也遇到过类似问题,究其更深层次原因,就是“自我中心”。

人的成长过程就是一个“去中心化的”的过程。大约6岁之后,儿童的自我去中心化的能力得到了发展。开始能够认识到别人的感受、观点,但是每个人在社会化过程中,会呈现出不同的去自我中心化的状态。

可以说是每一个成年人都有自我中心,我们的感受,想法,认识不可能做到完全的客观。所以我们需要利用结构化思维,(可以参考我的另一篇文章《程序员必备能力——结构化思维》)和系统化思考(可以参考我的一篇文章《程序员必备能力——深度思考》)。

在软件开发过程中,同样适用这个结论,我认为至少表现如下几点:

  • 程序员在设计、开发时,如果没有做到完全的按照产品经理的需求进行,难免对代码的设计进行反复修改,导致熵增

  • 程序员正在开发时,随意变更、打乱架构框架,导致代码耦合增大,难以维护

4.业务

代码熵增的常见的客观原因是主要是业务压力大,导致没有时间或意愿讲究代码质量。因为向业务压力妥协而生产烂代码之后,开发效率会随之下降,导致业务压力更大,形成一种典型的恶性循环。

到此,相信大家对“如何理解软件系统中的热力学第二定律”有了更深的了解,不妨来实际操作一番吧!这里是编程笔记网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


推荐阅读
  • Java高级工程师学习路径及面试准备指南
    本文基于一位朋友的PDF面试经验整理,涵盖了Java高级工程师所需掌握的核心知识点,包括数据结构与算法、计算机网络、数据库、操作系统等多个方面,并提供了详细的参考资料和学习建议。 ... [详细]
  • 本文详细记录了一位Java程序员在Lazada的面试经历,涵盖同步机制、JVM调优、Redis应用、线程池配置、Spring框架特性等多个技术点,以及高级面试中的设计问题和解决方案。 ... [详细]
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • 知识图谱与图神经网络在金融科技中的应用探讨
    本文详细介绍了融慧金科AI Lab负责人张凯博士在2020爱分析·中国人工智能高峰论坛上的演讲,探讨了知识图谱与图神经网络模型如何在金融科技领域发挥重要作用。 ... [详细]
  • 本文详细介绍了Python的multiprocessing模块,该模块不仅支持本地并发操作,还支持远程操作。通过使用multiprocessing模块,开发者可以利用多核处理器的优势,提高程序的执行效率。 ... [详细]
  • 本文详细介绍了Python中的流程控制与条件判断技术,包括数据导入、数据变换、统计描述、假设检验、可视化以及自定义函数的创建等方面的内容。 ... [详细]
  • 【Java数据结构和算法】008栈
    目录0、警醒自己一、栈的应用场景和介绍1、栈的应用场景一个实际的场景:我的思考:2、栈的介绍入栈演示图:出栈演示图 ... [详细]
  • 面对日益竞争激烈的就业市场,合理的职业规划对于在校大学生尤为重要。本文旨在探讨如何通过有效的自我认知、技能提升及目标设定,帮助计算机专业的学生构建清晰的职业路径,以增强就业竞争力。 ... [详细]
  • Golang与微服务架构:构建高效微服务
    本文探讨了Golang在微服务架构中的应用,包括Golang的基本概念、微服务开发的优势、常用开发工具以及具体实践案例。 ... [详细]
  • 本文旨在介绍一系列提升工作效率的浏览器插件和实用小工具,帮助用户在日常工作中更加便捷高效。内容由原作者授权发布。 ... [详细]
  • 优雅地记录API调用时长
    本文旨在探讨如何高效且优雅地记录API接口的调用时长,通过实际案例和代码示例,帮助开发者理解并实施这一技术,提高系统的可观测性和调试效率。 ... [详细]
  • 深入解析C++ Atomic编程中的内存顺序
    在多线程环境中,为了防止多个线程同时修改同一数据导致的竞争条件,通常会使用内核级同步对象,如事件、互斥锁和信号量等。然而,这些方法往往伴随着高昂的上下文切换成本。本文将探讨如何利用C++11中的原子操作和内存顺序来优化多线程编程,减少不必要的开销。 ... [详细]
  • 本文提供了多个关键点来帮助开发者提高Java编程能力,包括代码规范、性能优化和最佳实践等方面,旨在指导读者成为更加优秀的Java程序员。 ... [详细]
  • java datarow_DataSet  DataTable DataRow 深入浅出
    本篇文章适合有一定的基础的人去查看,最好学习过一定net编程基础在来查看此文章。1.概念DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据 ... [详细]
  • 汇编语言标识符和表达式(四)(表达式与符号定义语句)
    7、表达式表达式是程序设计课程里的一个重要的基本概念,它可由运算符、操作符、括号、常量和一些符号连在一起的式子。在汇编语言中,表达式分为:数值表达式和地址表达式。(1)进制伪指令R ... [详细]
author-avatar
心情爱心_634
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有