[译]开发者与熵的博弈

news2024/9/23 13:24:27

原文:https://itnext.io/entropy-in-software-development-77ed9110ef28
翻译:我的文章翻译智能体 + 文章润色智能体 + 文章转脑图智能体+ 人工校对
文章脉络:
在这里插入图片描述

文章概括:
文章通过热力学的视角,深入探讨了软件开发中的复杂性管理问题,提醒开发者在面对时间和熵的挑战时,要保持对系统的持续关注和高标准的开发流程。

译文:

在这里插入图片描述

“软件如同熵:难以捉摸、无形无质,并且遵循热力学第二定律——它总是在增长。” ——诺曼·奥古斯丁

熵是一种衡量系统无序、混乱和不确定性的物理量。正是熵的存在,使得沙堡终将崩塌,回归海滩。

  • 它解释了为什么冰块会融化成水。
  • 为什么人类会衰老,而非变得年轻。
  • 为什么代码会腐化、文档会失效。
  • 为什么儿童的房间会变得凌乱,而不会自动保持整洁。

在软件开发中,熵同样无处不在,开发者必须不断努力对抗它,以防文档过时、代码腐化和技术债务的无序积累。每一次代码修复、每一行新增代码,都会不可避免地增加系统的复杂性,逐步侵蚀原有的设计。
若不通过有效的开发流程控制熵,混乱将不可避免地导致系统复杂性的急剧上升,进一步加剧开发过程中的混乱 。

熵的影响

每当我思考熵的作用时,总会联想到热力学第二定律。

热力学第二定律指出,整个宇宙作为一个孤立系统的熵状态将随着时间的推移不断增加。这一过程是不可逆的,宇宙中的熵变化永远不会减少。

开发者们往往本能地意识到熵的危险,却很少在繁忙的开发和紧迫的截止日期中抽出时间去深入思考这一问题。

  • 不断向代码库中添加新代码行会积累技术债务,最终将代码库演变为遗留系统。
  • 文档或缺失,或无法跟上软件的演变。
  • 需求逐渐脱离代码和定制化实现。

在软件开发中,虽然熵不可避免,但我们仍然可以通过精心的设计来减缓其进程。要有效控制技术债务,保持系统秩序,需要投入大量精力。这里的“精力”指的是良好的实践、严格的标准、DevOps流程、测试策略、定义明确的完成标准,以及严格的代码审查。高质量的代码审查是防止熵扩散、确保开发标准执行到位的关键措施之一 。

熵的无处不在

一次,我在生产环境中修复了一个错误,并借机重构了部分代码(试图管理技术债务)。虽然错误修复得很顺利,但重构却引发了新的问题。
一位资深开发者严肃地告诫我:

永远不要修改运行正常的代码。

他接着补充道:

如果它没有 BUG,就不要修。

这让我陷入了矛盾:一方面,我希望通过改进代码来提高其可读性和质量;另一方面,我也明白,每次更改代码时都有可能引入新的问题。
复杂的代码如同“切斯特顿的围栏”,在了解其真正作用之前,不能轻易拆除。这道围栏可能是为了防止入侵,也可能是为了保护某些内部机制。
“在你了解设置原因之前,永远不要拆掉一面围栏。”——G. K. 切斯特顿

在移除或更改代码之前,首先考虑切斯特顿的围栏。代码的存在必然有其原因,可能是功能性的,也可能是为了维持系统的稳定。
开发者们常常会看着代码库中的旧代码嘲笑其作者的愚蠢,直到他们意识到那正是自己几个月前编写的代码——然后迅速将责任归咎于刚离职的同事 。
要真正自信地更改代码,唯一的途径是通过全面的单元测试。修改后运行测试,以确保一切正常。
一个月后,生产环境中再次出现了新问题。这次的问题源于我们使用的DLL库被弃用,导致了兼容性问题。
在软件开发中,即使软件运行良好,你仍然需要主动维护和更新它,因为环境总在变化。系统升级、新功能发布、版本更新、旧版本弃用,这些都会对现有软件产生影响。
因此,必须保持对软件的持续关注,良好的源代码控制、DevOps流程和完善的文档是必不可少的。有一天,总会有人需要维护这个软件,而那时原开发者可能早已不在 。

时间对软件开发的影响

讨论熵时,不可避免地要提到时间之箭,它代表着时间只会向前流动的单向性,且不可逆转。
科学家布莱恩·考克斯描述了时间之箭的不可逆特性:
时间之箭决定了每一个瞬间的变化是不可逆的。我们的人生因而充满了喜悦与悲剧。随着时间流逝,我们逐渐变老——人们出生、生活、然后离去。而在宇宙中,那些宏大而史诗般的循环似乎永恒不变,但那只是一种错觉。正如在我们生活中一样,宇宙的一切也在不可逆转地变化。

在一个软件项目中,时间越长,潜在的问题就越多。
时间、人员和需求的变化会导致错误、问题、优先级变化、人员流失和技术债务的积累。
在一个软件项目中,如果有可能出错的事情,那么最终它一定会出错。

技术灾难不应让开发者措手不及。虽然无法阻止错误和灾难的发生,但你可以做好准备。良好的实践和开发流程能够确保你在问题发生时迅速恢复。
新冠疫情并非“黑天鹅”事件。类似的全球性大流行曾多次发生,大多数政府都有应对预案,但他们的响应速度过于缓慢。
这不是一个黑天鹅事件,而是一个完全可预测的事件。我们知道它会发生,却未能做好准备。——亚历克斯·塔巴罗克

在软件开发中,有些错误和事件本不应该发生。开发团队必须预见并提前准备,以应对潜在的危机 。

软件开发中的技术债务悖论

软件开发中存在一个悖论:开发者的职责是保持高质量,而他们的开发流程(如标准、代码审查、完成定义等)也旨在确保这一点。然而,管理者、客户和项目计划往往会优先考虑速度,而非质量。他们更关注项目的快速交付,哪怕这意味着技术债务的累积。
管理者和客户的目标与开发者的目标相冲突,最终只能通过折中的方式找到一个既不太慢又勉强可接受的质量平衡。
开发负责人在此过程中扮演着关键角色,他们决定了项目的质量标准并控制技术债务的积累。
格雷欣法则解释了为什么劣质代码会取代高质量代码。如果糟糕的代码与优秀的代码同等受重视,那么开发者将倾向于选择更快、更简单的方式来完成任务 。
在软件项目中,开发者缺乏编写高质量代码的动机,因为他们往往因为快速交付低质量的代码而受到奖励。

相关文章

  • 格雷欣法则——为什么糟糕的开发者会取代优秀的开发者
  • 开发者是软件开发的主要威胁
  • 为什么开发者会编写低质量代码和技术债务?因为他们因此获得了奖励

延伸阅读

  • 熵:复杂化生活的隐藏力量
  • 熵物理学
  • 时间之箭
  • 布莱恩·考克斯用沙堡和冰川解释了熵与时间之箭

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2057255.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GitHub的未来:在微软领导下保持独立与AI发展的平衡

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

企业高性能web服务器----nginx详细知识点+实验

知识点 一、Web 服务介绍 Apache Nginx 1、Apache 经典的 Web 服务端 Apache 起初由美国的伊利诺伊大学香槟分校的国家超级计算机应用中心开发 目前经历了两大版本分别是 1.X 和 2.X 其可以通过编译安装实现特定的功能 2、Apache的三种模型 Apache prefork 模型 预…

4000元亮度最高的投影仪:当贝X5S 3300CVIA流明超高亮度白天也清晰

你购买投影仪的时候一般预算多少?目前市面上的投影仪价位有几百也有上万,品牌和类型都比较多,买投影前比较关注哪些投影仪参数?最近有朋友向我咨询购买投影仪的事项,预算在4000左右,问问4000元哪款投影仪哪…

Ollama Desktop

一、简介 Ollama Desktop是基于Ollama引擎的一个桌面应用解决方案,用于在macOS、Windows和Linux操作系统上运行和管理Ollama模型的GUI工具。 Ollama Desktop提供了丰富的功能,包括但不限于: 可视化的管理界面:用户可以通过图形…

推荐3款免费强大OCR神器,工作必备,总有一款适合你,必须收藏

ShareX ShareX是一款功能强大且免费的开源屏幕捕捉和录屏工具,主要用于Windows操作系统。它不仅可以捕捉任何屏幕区域,还可以录制视频、拍摄屏幕截图,并将其上传到各种在线平台。ShareX的功能非常全面,包括截图、录屏、加水印、裁…

低代码平台:效率与创新的双重引擎

低代码开发在软件开发领域是一种越来越流行的趋势,这是有充分理由的。低代码使专业开发人员和非开发人员能够构建更易于集成、修改和升级的复杂企业解决方案,使企业能够快速轻松地创建软件应用程序无需丰富的编码经验。低代码平台彻底改变了软件开发方式…

LLM应用实战: 产业治理多标签分类

1. 背景 许久未见,甚是想念~ 近期本qiang~换了工作,处于新业务适应期,因此文章有一段时间未更新,理解万岁! 现在正在着手的工作是产业治理方面,主要负责其中一个功能模块,即按照产业治理标准体…

巡检机器人有哪些功能和应用场景

随着科技的飞速发展,巡检机器人作为智能化、自动化的重要代表,已经在多个领域展现出其独特的优势。从工业生产到特殊环境监测,巡检机器人以其高效、准确和安全的特性,逐渐取代了传统的人工巡检方式,极大地提升了巡检效…

spring boot(学习笔记第十八课)

spring boot(学习笔记第十八课) Spring boot的定时任务和Quartz 学习内容&#xff1a; Spring boot的定时任务Spring boot的Quartz 1. Spring boot的定时任务 定义定时任务 加入必要的依赖 <dependency><groupId>org.springframework.boot</groupId&g…

STM32 —— TIM(基本定时器)详解_stm32的tim

STM32 —— TIM&#xff08;基本定时器&#xff09;详解_stm32的tim 一、定时器简介 STM32F1 系列中&#xff0c;除了互联型的产品&#xff0c;共有 8 个定时器&#xff0c;分为基本定时器&#xff0c;通用定时器和高级定时器。基本定时器 TIM6 和 TIM7 是一个 16 位的只能向…

ID3算法详解:构建决策树的利器

目录 引言 ID3算法概述 算法基础 信息熵 ​编辑 信息增益 ID3算法步骤 决策树 概念: 核心&#xff1a; 节点 1. 根节点 2. 非叶子节点 3. 叶子节点 引言 在机器学习领域&#xff0c;决策树是一种非常流行的分类和回归方法。其中&#xff0c;ID3算法作为决策树算法…

干货分享 | TSMaster—RP1210模块使用指南

RP1210是由技术和维护委员会&#xff08;TMC&#xff09;编写的一种建议性实践。RP1210用于对重型车辆射频相关的&#xff08;主要针对&#xff09;电子控制单元&#xff08;ECU&#xff09;进行二次编程和分析。本文主要针对TSMaster—RP1210模块的操作进行详细介绍。 本文关…

【CANoe使用大全】——在线回放数据

&#x1f64b;‍♂️【CANoe使用大全】系列&#x1f481;‍♂️点击跳转 文章目录 1.概述2.创建回灌节点3.加载回灌数据 1.概述 在外面测试过程中经常会遇到一些故障场景&#xff0c;需要采集这些时刻的故障场景log&#xff0c; 回灌到程序中复现问题。 下面主要介绍数据的在…

【电子通识】IPC-A-610标准对产品的四种验收条件都是什么意思?

IPC-A-610标准对每个级别产品均给出四种验收条件&#xff1a;目标、可接受、缺陷或制程警示条件。 目标条件 是指近乎完美/首选的情形&#xff0c;然而这是一种理想而非总能达到的情形&#xff0c;且对于保证组件在使用环境下的可靠性并非必要的情形。 比如4.3.2节中连接器插针…

R8;RRRRRRRR;穿膜肽R8;八聚精氨酸;148796-86-5

【穿膜肽R8简介】 穿膜肽R8&#xff0c;也称为八聚精氨酸&#xff08;Octa-arginine&#xff09;&#xff0c;是一种由八个精氨酸残基组成的细胞穿透肽&#xff08;CPP&#xff09;。R8具有正电荷丰富的侧链&#xff0c;能够有效地与细胞膜上的负电荷相互作用&#xff0c;从而促…

优化电商客服满意度与复盘管理:AI质检技术的深度应用与策略

Hi~这里是ProXiao 文章参考&#xff1a;晓观点 《如何利用AI质检提升电商客服满意度&#xff0c;优化分析复盘管理环节&#xff1f;》 在当前电子商务迅猛发展的背景下&#xff0c;客户服务质量作为衡量店铺综合竞争力的重要指标之一&#xff0c;其优劣直接关联到服务类数据评分…

Docker图形化管理工具DockerUI

1、DockerUI 轻量级图形页面管理之DockerUI 2、查看dockerui镜像 [rootlocalhost ~]# docker search dockerui 3、下载dockerui镜像 [rootlocalhost ~]# docker pull abh1nav/dockerui #选择喜欢的dockerui风格镜像下载 4、启动dockerui容器 [rootlocalhost ~]# docker r…

Python经典书籍有哪些?来看看你看过哪几本

Python 基础 1.《Python编程&#xff1a;从入门到实践&#xff08;第2版&#xff09;》 本书是针对所有层次Python读者而作的Python入门书&#xff0c;让你可以快速学会Python编程&#xff0c;通过这本书&#xff0c;你将会学到各种Python库和工具(NumPy&#xff0c;Pygal等)…

C/C++控制台贪吃蛇游戏的实现

&#x1f680;欢迎互三&#x1f449;&#xff1a;程序猿方梓燚 &#x1f48e;&#x1f48e; &#x1f680;关注博主&#xff0c;后期持续更新系列文章 &#x1f680;如果有错误感谢请大家批评指出&#xff0c;及时修改 &#x1f680;感谢大家点赞&#x1f44d;收藏⭐评论✍ 一、…

(第三期)书生大模型实战营——OpenXLab部署InternLM2实践——上传模型

OpenXLab 部署 InternLM2 实践指南 上传模型 初始化git设置 # install git sudo apt-get update sudo apt-get install git# install git lfs sudo apt-get update sudo apt-get install git-lfs# use git install lfs git lfs installOpenXLab 使用你在平台的用户名作为 Git…