作者:尼尔·福特(Neal Ford)
根本复杂性(essential complexity)指的是问题与生俱来的,无法避免的困难。比如,协调全国的空中交通就是一个“天生的”复杂问题,必须实时跟踪每架飞机的位置(包括飞行高度)、航速、航向和目的地,才能预防空中和地面上的冲突。像天气骤变这样的情况会令航班计划全盘失效,航班时刻表必须适应不断变化的环境才能避免乘客滞留。
与之相反,偶发复杂性(accidental complexity)是人们解决根本复杂性的过程中衍生的。目前陈旧的空中交管系统,就是一个偶发复杂性例子。系统设计的初衷是管理数以千计的飞机参与的交通活动,即解决根本复杂性,但是解决方案本身带来了新的问题。事实上,目前正在服役的空中交管系统,其复杂臃肿己经到了难以改善的地步。在全球多数地区,空中交管系统仍然使用三十多年前的技术。
许多软件框架和厂商提供的“解决方案”都表现出偶发复杂性的症状。解决特定问题的框架很管用,但设计过度的框架增加的复杂性反而超过了它应该缓解的复杂性。
开发人员痴迷于复杂的问题,好比飞蛾喜欢扑火。谁能拒绝迅速解决复杂问题带来的快感?消除偶发复杂性,抽丝剥茧制订解决方案,才是真正的挑战。
该怎么做呢?应该尽量选择源自实际项目的框架,警惕那些象牙塔里的产品;分析方案中有多少代码直接用来解决业务问题,有多少只是用来实现用户与应用之间的交互;谨慎使用软件厂商在幕后推动的方案,它们并非一无是处,但是往往包含偶发复杂性;要量体裁衣,为问题制订“合身”的解决方案。
架构师的责任在于解决问题的根本复杂性,同时避免引入偶发复杂性。