不管是做一个新的系统,还是重构优化老的系统,需求整理是第一位的。 我们可以通过一系列的问题来厘清需求,分清主次,比如:

– 这个需求一定要做么?不做会怎么样?

– 这个需求带来的系统代价有多大,是否值得,能否有变通的方法

– 这个需求可以下次做么?

特别要提到,如果是重构系统,很多以前的需求可能都不存在了,这样可以减少很多设计的时候的限制,甩掉这些负担,新设计能够轻装上阵

放眼外部架构

基于一个原则:世界上大部分的问题,别人已经遇到过,并且已经有了方案,虽然可能不是最优的,但也是可以学习的。学习的来源,主要有以下几个:

– 公开的论文、文章,特别是一些著名公司的系统设计论文,很有参考价值。

– 对类似系统熟悉的同事朋友

– 经典的书籍

平时对外部架构的学习积累是很重要的,这样在你需要设计一个新系统的时候,就会源源不断的有灵感,遇到类似的问题,想想别人是怎么抉择的,从而得出比较好的设计。

架构设计的原则

系统越简单越好

简单不是简陋,是通过对需求的深刻理解,精心设计,从而保持系统的简单。简单,能带来很多好处:

– 实现起来不容易出错,是一个可控的系统

– 可理解程度更高,维护简单

– 容易扩展

这个原则被很多架构设计者熟知,但要做到并不容易,很多系统设计之初是一个简单优雅的系统,到后来越来越臃肿。主要的原因,在我看来,有可能一开始对需求没有深入理解,漏掉了一些需求,或者是对系统的考虑不全面,导致有重大缺陷,后来为了补坑,让系统越来越复杂。

复杂的系统拆分成简洁的子系统,并保持子系统间交互越清晰越好

复杂的系统总是容易出错、脆弱的,如果能够拆分就尽量拆分,并保持系统间的交互越清晰越好。模块之间常见的一种接口是数据,在我看来这是很强壮的。Unix系统一个突出的优点:工具之间输入输出的就是通过管道来进行,用多个小的工具就拼成灵活而强大的系统:

svn status|egrep ".cc|.h" |egrep "A|M" | awk '{print $2}' |xargs python cpplint.py

利用所有可利用的成熟系统

一个新系统设计的时候的周边生态系统和老系统设计的时候,一般都有较大的不同。业界有很多非常成熟的开源框架系统,把设计建立在这些成熟系统上,是站在巨人肩膀上,可以站的更高,做出更先进稳定的系统。

利用这些系统,新架构会更简单,可靠,强大。

架构中要留下扩展演进的能力

系统架构所满足的需求有可能经常变动,所用的资源也是如此。因此在系统设计的时候,需要考虑架构扩展演进的能力,留下满足未来空间的可能,但也是要平衡好,不要太多地增加现有系统的复杂性。

架构要有监控运营

当你实现的系统最终跑起来的时候,你需要了解他的运行情况是否符合你的预期,是否存在缺陷,哪里可以优化,内置的监控运行模块会帮你的大忙。而且在设计之初就需要考虑这一点,如果后来系统已经实现好了,再回头来加,难度要大很多,而且可能让系统比较丑陋。

《UNIX编程艺术》这本书里一些重要的原则非常值得借鉴:

– 使用简洁的接口拼合简单的部件

– 清晰胜于机巧

– 设计时考虑拼接组合

– 设计要简洁,复杂度能低则低

– 除非确无它法,不要编写庞大的程序

互联网架构优化-风君雪科技博客