软件系统复杂性应对与混沌工程实践
1. 软件复杂性的本质
在软件开发过程中,复杂性主要分为意外复杂性和本质复杂性。意外复杂性是在编写代码过程中产生的,目前没有可持续的方法来降低它。虽然可以通过暂停新功能开发,对之前编写的软件进行重构来降低意外复杂性,但这存在诸多问题。例如,编写代码时所做的妥协与重构时所做的妥协并没有本质区别,而且编写新软件来降低意外复杂性往往会产生新形式的意外复杂性。大型重构还常受到“第二系统效应”的影响,后续项目本应因首个项目的开发经验而更优,但实际上往往变得更大、更复杂。
本质复杂性则是为了实现软件的新功能而有意增加的开销。以一个简单的键值数据库为例,最初它是运行在笔记本电脑内存中的简单存储系统,只需提供键和值就能进行存储和查询。但当需要提高其可用性时,就需要采取一系列措施,如将其迁移到云端、添加多个节点以实现冗余、使用一致性哈希分布数据、将数据持久化到磁盘、在不同区域复制集群等。然而,若要同时提高其可用性和简化系统,这几乎是不可能完成的任务。这表明,添加新功能或提升软件的安全性、可用性等属性,必然会增加软件的复杂性。
2. 应对复杂性的策略
既然无法消除复杂性,那么我们需要采取相应的策略来应对。首先,要接受复杂性的存在,而不是试图回避它。因为软件中大多数我们期望和优化的属性都需要增加复杂性,过度追求简单往往会导致事与愿违,带来挫败感。我们应该认识到,即使软件在不断改进,复杂性的增加也是不可避免的,这并非坏事。
其次,要学会驾驭复杂性。这可以通过两种模型来实现,即动态安全模型和复杂性经济支柱模型,这两种模型是混沌工程在软件工程中应用的基础。
2.1 动态安全模型
动态安全
超级会员免费看
订阅专栏 解锁全文

83

被折叠的 条评论
为什么被折叠?



