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