@Lenciel

Why most complex systems failed

本周又是顾问工作比较多的一周,看到的很多问题都让我觉得非常熟悉。

同时,客户非常想要一个从长计议,全新设计的整体架构,解决现有问题的同时,为领先行业做好准备。

这些需求和目标也是,非常熟悉。

我记得有次问涛哥,我们俩加起来看了做了这么多项目,有没有哪个是架构上自己满意的?

这个问题很尴尬。但凡有点工作经历的同学应该都会发现,除开自己那些几千行几万行的 side project,大部分公司里真正的项目,干一段时间之后架构就被腐蚀了。

这是因为复杂系统本身就由很多因素来决定,架构经常让位或者说服务于以下因素:

  • 时间:良好架构带来的收益,只会在有较长生命周期的项目中得到体现,初始阶段,特别是面对竞争的情况下,更重要的往往是让项目得以存活的上线时间;
  • 成本:对架构的投入有很多不会带来立即的回报。能正确权衡成本和架构质量的程序员为什么稀缺就是因为他们可以根据业务的需要做恰当的投入;
  • 可见度:跟系统显性功能和产品界面相关的工作比,架构方面的工作可见度差。甚至有些组织里会出现,架构越差,线上事故越多,老板越觉得团队「很忙碌解决了很多问题」;
  • 经验与技能:即使一个团队有足够的时间和成本,也愿意投入去做好架构,它的能力也可能不到。架构受实施它的组织所局限,在很多企业里面非常明显;
  • 复杂度与变革阻力:架构受现实复杂度的影响,一方面是问题本身的复杂度(Brooks 说的本质的复杂性),一方面是组织的结构往往决定了系统要素的边界(康威定律)。同时,架构在设计上又面向未来的变化,这就增加了更多变量,因为事情的发展往往和我们想象的不一样;

最近我在研究九龙城寨为啥可以住进去那么多人(在其鼎盛时期,每平方米约有 1.3 人,是纽约市居住密度的 115 倍多,马尼拉的 29 倍多,而马尼拉是世界上公认的人口最稠密的城市),突然有一些感想。

这种棚户区看上去很糟糕,但是在世界每个角落都很有生命力的存在着,它做对了什么?

它通常使用廉价而且「接口」简单的材料:塑料布,石棉瓦,不需要建筑工人,居民自己就可以搭建;

每个居住单元建造维护使用到风火水电,都是居住者自己负责,居住者很少关注基础设施,可以解决遇到的相关问题;

没有人进行整体规划或监管。有过剩劳动力的,发展好的人户,自行扩张边界。

太多数系统只不过是棚户区:

对工具和基础设施的投入往往不足,库和框架要么原始要么杂乱;

系统的各个部分不受控制地增长,并且因为缺乏整体设计和管控,系统某一部分中的问题侵蚀和污染相邻部分;

上线截止日期像台风一样迫近,优雅的架构永远没时间去思考和搭建;

如果我们的很多从业者面对现实,也许可以明白,系统设计只有一个核心目标,就是在预算范围内按时保质交付高质量的软件

因此,我往往首先关注特性和功能,然后关注架构和性能。

与此同时,还有一个附带的,需要时时关注的暗坑是组织。

对于较大的项目,文化、流程、边界、资源分配问题可能会压倒工具、语言和架构等技术问题。

就像构建复杂的系统比构建简单的系统更容易一样,复杂的组织也比简单的组织常见得多。

以上。

欢迎留言