白话架构设计为你阐述什么是架构设计,架构设计的三大原则是什么 (3)

业界领先的很多方案,其实并不是一堆天才某个时期灵机一动,然后加班加点就做出来的,而是经过几年时间的发展才逐步完善和初具规模的。阿里中间件团队 2008 年成立,发展到现在已经有十年了。我们只知道他们抗住了多少次“双 11”,做了多少优秀的系统,但经历了什么样的挑战、踩了什么样的坑,只有他们自己知道!这些挑战和踩坑,都是架构设计非常关键的促进因素,单纯靠拍脑袋或者头脑风暴,是不可能和真正实战相比的。

没有那么多积累,却想一步登天,是失败的第二个主要原因。

冰山下面才是关键

可能有人认为,业界领先的方案都是天才创造出来的,所以自己也要造一个业界领先的方案,以此来证明自己也是天才。确实有这样的天才,但更多的时候,业界领先的方案其实都是“逼”出来的!简单来说,“业务”发展到一定阶段,量变导致了质变,出现了新的问题,已有的方式已经不能应对这些问题,需要用一种新的方案来解决,通过创新和尝试,才有了业界领先的方案。GFS 为何在 Google 诞生,而不是在 Microsoft 诞生?我认为 Google 有那么庞大的数据是一个主要的因素,而不是因为 Google 的工程师比 Microsoft 的工程师更加聪明。

没有那么卓越的业务场景,却幻想灵光一闪成为天才,是失败的第三个主要原因。

所以,真正优秀的架构都是在企业当前人力、条件、业务等各种约束下设计出来的,能够合理地将资源整合在一起并发挥出最大功效,并且能够快速落地。这也是很多 BAT 出来的架构师到了小公司或者创业团队反而做不出成绩的原因,因为没有了大公司的平台、资源、积累,只是生搬硬套大公司的做法,失败的概率非常高。

简单原则

简单原则宣言:“简单优于复杂”。

软件架构设计是一门技术活。所谓技术活,从历史上看,无论是瑞士的钟表,还是瓦特的蒸汽机;无论是莱特兄弟发明的飞机,还是摩托罗拉发明的手机,无一不是越来越精细、越来越复杂。因此当我们进行架构设计时,会自然而然地想把架构做精美、做复杂,这样才能体现我们的技术实力,也才能够将架构做成一件艺术品。

由于软件架构和建筑架构表面上的相似性,我们也会潜意识地将对建筑的审美观点移植到软件架构上面。我们惊叹于长城的宏伟、泰姬陵的精美、悉尼歌剧院的艺术感、迪拜帆船酒店的豪华感,因此,对于我们自己亲手打造的软件架构,我们也希望它宏伟、精美、艺术、豪华……总之就是不能寒酸、不能简单。

团队的压力有时也会有意无意地促进我们走向复杂的方向,因为大部分人在评价一个方案水平高低的时候,复杂性是其中一个重要的参考指标。例如设计一个主备方案,如果你用心跳来实现,可能大家都认为这太简单了。但如果你引入 ZooKeeper 来做主备决策,可能很多人会认为这个方案更加“高大上”一些,毕竟 ZooKeeper 使用的是 ZAB 协议,而 ZAB 协议本身就很复杂。其实,真正理解 ZAB 协议的人很少(我也不懂),但并不妨碍我们都知道 ZAB 协议很优秀。

刚才我聊的这些原因,会在潜意识层面促使初出茅庐的架构师,不自觉地追求架构的复杂性。然而,“复杂”在制造领域代表先进,在建筑领域代表领先,但在软件领域,却恰恰相反,代表的是“问题”。

软件领域的复杂性体现在两个方面:

结构的复杂性

结构复杂的系统几乎毫无例外具备两个特点:

组成复杂系统的组件数量更多;

同时这些组件之间的关系也更加复杂。

结构上的复杂性存在的第一个问题是,组件越多,就越有可能其中某个组件出现故障,从而导致系统故障。这个概率可以算出来,假设组件的故障率是 10%(有 10% 的时间不可用),那么有 3 个组件的系统可用性是(1-10%)×(1-10%)×(1-10%)= 72.9%,有 5 个组件的系统可用性是(1-10%)×(1-10%)×(1-10%)×(1-10%)×(1-10%)=59%,两者的可用性相差 13%。

结构上的复杂性存在的第二个问题是,某个组件改动,会影响关联的所有组件,这些被影响的组件同样会继续递归影响更多的组件。这个问题会影响整个系统的开发效率,因为一旦变更涉及外部系统,需要协调各方统一进行方案评估、资源协调、上线配合。

结构上的复杂性存在的第三个问题是,定位一个复杂系统中的问题总是比简单系统更加困难。首先是组件多,每个组件都有嫌疑,因此要逐一排查;其次组件间的关系复杂,有可能表现故障的组件并不是真正问题的根源。

逻辑的复杂性

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsspfg.html