精选文章 复杂是技术系统根本属性:为什么代码会变得难以维护

复杂是技术系统根本属性:为什么代码会变得难以维护

作者:IT徐胖子 时间: 2021-02-05 09:43:39
IT徐胖子 2021-02-05 09:43:39
【摘要】欢迎关注公众号【IT徐胖子】获取更多互联网和技术干货,感谢各位支持 
 
1 遗留代码 
程序员应该都有这样的经历,当接手一份遗留代码时会为此感到苦恼。不仅代码复杂和嵌套结构令人迷惑,而且没有文档和架构图更让人无从维护。当代码维护性几乎为零时,能采用的技术方案只有重构,说白了就是重写。 
这种情况到底是必然发生,还是仅仅是因为代码不规范导致的?我们先不着急给出答案,这里为大家介绍一本书:《为...

欢迎关注公众号【IT徐胖子】获取更多互联网和技术干货,感谢各位支持

1 遗留代码

程序员应该都有这样的经历,当接手一份遗留代码时会为此感到苦恼。不仅代码复杂和嵌套结构令人迷惑,而且没有文档和架构图更让人无从维护。当代码维护性几乎为零时,能采用的技术方案只有重构,说白了就是重写。

这种情况到底是必然发生,还是仅仅是因为代码不规范导致的?我们先不着急给出答案,这里为大家介绍一本书:《为什么需要生物学思维》,作者是阿贝斯曼。本文谈谈我对这本书的理解,希望可以回答刚才提出的问题。

 

2 复杂系统形成的四个原因

这四个原因导致并加剧了技术系统的复杂性:吸积、交互、必须处理意外情况、普遍的稀有事物。

 

2.1 吸积

从字面上我们可以理解为吸附和积累。每次加一点,每次加一点,最后就有了一大堆。这句话来描述吸积效应最好不过,出自1975年出版的《人月神话》。

无论一次代码迭代和升级看上去是多么独立,客观上导致的结果就是代码量从一点点变成一大堆,遗留代码和遗留系统就是这样形成的。

遗留代码到底有什么问题?吸积效应导致代码十分庞大,没有人可以完全了解这个系统。当系统出现问题时,最了解这部分代码的人可能已经离职而杳无音讯。

所以只能小心翼翼增加一段兼容逻辑,这更加剧了吸积效应。甚至在一些无奈的情况下,可以采用的方式只能是容忍这个错误,因为容忍这个错误的代价小于修复这个错误的代价。

 

2.2 交互

当吸积效应导致的大规模系统,结合了交互这个特性,会使技术系统更加复杂。

一个技术系统除了作用于自身,还会与其它大量系统产生交互。比如下单购买一件商品,那么订单系统,商品系统,支付系统,物流系统,卡券系统就会交互协作。这样吸积的复杂性,由于交互特性的出现,会呈现几何级数上升。

交互带来两种特性:第一是互操作性。在搜索引擎上查询去某地怎么走,搜索引擎会告诉你打车需要多长时间,并提供一个打车按钮。第二是相互依赖性。比如下订单时需要使用优惠券,那么当卡券系统出现问题时就会影响订单系统。

 

2.3 必须处理的意外情况

这里意外情况指的是边界情况。测试人员在测试工作中,专门有一项测试被称为边界测试:尝试输入边界条件,看看输出结果会不会有异常。比如一段逻辑是对5分钟内的订单进行业务处理,那么就要对5分01秒,4分59秒,5分钟进行边界测试,看看数据是否会有遗漏或者多余。

边界情况看似特殊,实际上非常普遍,这就引出了第四点:普遍的稀有事物。

 

2.4 普遍的稀有事物

当一个语料库拥有近乎全部文本时,那么罕见词会比想象中更加普遍。词汇使用频率符合幂律分布,这些罕见词使用频率如同一条长长的尾巴,分布在坐标轴上,延伸到很远的区域,也被称为长尾分布。计算机语言学家必须处理这些长长的尾巴,这样势必增加系统复杂度。

 

3 人类为什么无法理解复杂系统

说完了系统复杂性的原因,我们还要进一步探讨,为什么人类无法理解复杂系统。其中原因有两个,第一是人类对嵌套有认知极限,第二是人类对分支有认知极限。

先来说嵌套。作者在本书中使用计算机的概念称之为递归。看三个句子:

  • 他说狗是棕色的
  • 她认为他说狗是棕色的
  • 我记得她认为他说狗是棕色的

三个句子的嵌套结构依次递进,变得越来越难理解。当进入主句的子句足够多时,人类根本无法理解这样的句子。递归作为一种算法在程序中非常常见。

再来说分支。分支是指如果满足条件A则执行业务A,如果满足条件B则执行业务B。分支在计算机程序中也非常常见。

一旦某个计算机程序包含了多个分叉点,那么该程序运行路径的数量会倍增。据保守计算,一个只有1000行代码的程序,当分叉点以正常频率出现时,就会有10的30次方个潜在路径可供遍历,这是一个天文数字,超过了1亿亿亿。因此要检查所有可能的路径,理解每个路径的含义,并确定其准确性,这是非常困难的。

嵌套和分支带来的变量错综复杂,远远超出了人类大脑认识的极限。

 

4 面对复杂性应该怎么办

复杂性无法避免,而且超出人类的认知极限,我们应该怎么应对?

 

4.1 生物系统和技术系统

作者提出了物理学思维和生物学思维两个维度,并建议我们采用生物学思维来面对复杂性。因为复杂的技术系统需要生物学思维有以下三个原因。

第一,生物系统通常比物理系统更复杂。物理系统的组成部分一般都是相同的:由相同气体分子组成封闭系统,或是由同一种原子组成单质比如钻石。而且在整个系统中,各部分之间相互作用方式往往是统一的,比如卫星围绕行星运行的方式。

但是生物学中,系统的组成部分不仅类型繁多,而且涉及很多层级:生物体组织器官功能各异;细胞中蛋白质具有多样性;生物系统各个部分很难被拆解,进行单独分析,而是要放在整体之中考虑。

第二,生物系统有别于物理系统的一个重要因素是生物系统是有历史的。生物系统更容易受到进化的影响,这是生物系统的根本特性之一。

进化的新功能通常叠加在旧功能上,生物系统的进化也会留下遗留代码,科学家认为基因中存在有些物质,在进化进程中被保存下来,然而已经过时不再发挥作用。技术系统同样存在许多这样的功能。

第三,生物系统与技术系统的相似性可以通过高度最优化容限模型来进行分析。所谓最优化容限模型告诉我们,一个强大的技术系统,因为一个很小的故障也会崩溃。

 

4.2 当物理学遇到生物学

物理学思维侧重于关注系统运行的一般规律。比如分析一家公司的运营情况,我们会绘制一张图表。假设这个图表拟合了某种曲线,但拟合这条曲线的原因有很多,所以这种方式得到的问题多于答案。

生物学思维侧重于关注系统的组成部分细节和多样性,在思考一个系统的不同交互层级时,那些看上去毫不起眼的底层细节有可能会升至顶层,从而变得对整个系统至关重要,有助于我们理解这个互联性越来越强,但是可解释性越来越弱的世界。对细节的修修补补是构建和理解系统的重要方法。

作者建议将物理思维和生物思维结合起来,这样有助于我们更好理解复杂技术系统。用物理学思维去分析事物复杂性后的规律,用生物学思维关注繁杂的细节。

 

5 文章总结

复杂是技术系统的根本属性,技术系统演化出来的性质和特质也许永远不可言说。我们用作者的话做一个结尾:认识复杂系统的正确态度是,对于难以理解的事物,要努力克服我们的无知;一旦理解了某个事物,也不会认为它是理所当然的。谦卑之心加上生物学思维,才是洞悉复杂世界的正确方式。

扫描二维码关注公众号【IT徐胖子】获取更多互联网和技术干货,感谢各位支持

复杂是技术系统根本属性:为什么代码会变得难以维护1

勿删,copyright占位
分享文章到微博
分享文章到朋友圈

上一篇:【lua基础】lua的string

下一篇:2020/7/27 索引学习总结

您可能感兴趣

  • HTML实体符号代码速查表

    1.特色的 ©©©版权标志| |竖线,常用作菜单或导航中的分隔符···圆点,有时被用来作为菜单分隔符↑↑↑上箭头,常用作网页“返回页面顶部”标识€€€欧元标识²²²上标2,数学中的平方,在数字处理中常用到,例如:1000...

  • 走进Java 7模块系统

    笔者在观看过Devoxx关于Jigsaw的一段演示后,我很兴奋,觉得它应该会是针对复杂类路径版本问题和JAR陷阱等问题的解决方案。开发者最终能够使用他们所期望的任何Xalan版本,而无需被迫使用授权机制。不幸的是,通往更加有效的模块系统的征途并不是很清晰。   在研究确实问题之前,我们先来看一些基本概念:   模块化   模块化   是解决...

  • 对list的中的bean的某属性排序的方法

    对list的中的bean的某属性排序的方法 我们经常会碰到多装到list的bean中的某个属性排序 下面介绍一种简单的方法使用Collections类的sort方法进行排序 先建立一个要排序的bean 要实现Comparable接口 [code] public class JavaBean implements Comparable<JavaBe...

  • Android Studio属性学习(三)——四种基本动画属性

    一、前提 动画属性非常常见,今天来简介四种最常见的动画属性 二、目标 渐变 平移 旋转 放大缩小 三、内容 首先在布局文件中添加一个ImageView组件   1、渐变 首先创建一个新的xml文件 <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http:/...

  • 写好代码的十个秘诀--林斌博士

    如果你是一名软件开发人员,你是不是经常因为程序的性能而受到老板的指责?你是不是经常因为程序的性能而被用户刁难?你是不是经常因为程序的性能而饱受等待之苦?那么怎样才能尽量优化应用程序,提高其性能呢?本章,林斌根据自己多年在微软进行软件开发的实践经验,为我们提供非常棒的提高性能的方法,并列举了具体的案例学习,最后,还为我们详细介绍了令无数软件开发人员...

  • Linux系统NFS故障现象

    一、故障 故障:clnt_create: RPC: Port mapper failure - Unable to receive: errno 111 (Connection refused) 原因:NFS服务端RPC服务没有启动,需要将RPC服务启动 故障:clnt_create: RPC: Program n...

  • 生成新行的javascript 代码

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <script language=JavaScript> function fAddAttach(){ var tdHTML='<input type="text" name="attachf...

  • 从Java到Ruby——我的最近一次技术转型

    这里所涉及到的都是与软件开发有关的技术,感觉很有必要总结一下我从业以来所使用过的开发技术以及所经历过的几次技术转型。 1996年7月-1999年10月3年时间一直使用C语言编写电信协议软件,算作我的C语言时代。其中还使用过一段时间SDL语言和基于SDL的代码自动生成工具(瑞典Telelogic公司的SDT)。 2000年3月-2000年10月7个多...

CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。

华为云40多款云服务产品0元试用活动

免费套餐,马上领取!
复杂是技术系统根本属性:为什么代码会变得难以维护介绍:华为云为您免费提供复杂是技术系统根本属性:为什么代码会变得难以维护在博客、论坛、帮助中心等栏目的相关文章,同时还可以通过 站内搜索 查询更多复杂是技术系统根本属性:为什么代码会变得难以维护的相关内容。| 移动地址: 复杂是技术系统根本属性:为什么代码会变得难以维护 | 写博客