架构设计
复杂的软件项目,通常有两个特点:需求不确定和技术复杂。
技术复杂表现:1. 需求让技术变复杂
如果需求本身很复杂,那么对应的技术也会很复杂。
同时响应需求的变化,也会让技术变复杂。对于明确的需求,相对来说技术实现是容易的。但是,随着需求地不断变化,新的需求可能会破坏原有的代码架构,导致系统越来越臃肿复杂,维护也越来越难。
2. 人员会让技术变复杂
现在软件开发通常不是一个人,而是一个团队。团队成员水平不一样,擅长的技术方向也不一样,让这一群人有效地协作也是很大的考验,简单的技术问题也会变成复杂的技术问题。
3. 技术本身也是复杂的
现在软件项目中选择编程语言、框架、技术组件、数据库等技术或工具,还可能需要应用像微服务、大数据、人工智能技术,这些技术本身就是复杂的,普通人都需要通过一定的学习才能掌握。
4. 要让软件稳定运行是复杂的
软件在开发完成后,要发布运行,但运行时也充满了各种不确定性。比如说明星发布八卦可能会导致微博宕机;阿里云宕机导致很多基于阿里云的系统也跟着一起无法提供服务。
因为技术的这些复杂性,会导致软件开发变得很复杂,开发成本很高。而架构设计恰恰可以在这些方面很好地解决技术复杂的问题。
架构设计理由:
1.架构设计可以降低满足需求和需求变化的开发成本。
对于复杂的需求,架构设计通过对系统抽象和分解,把复杂系统拆分成若干简单的子系统。就像淘宝这样复杂的网站,最终拆分成一个个小的微服务后,单个微服务开发的难度,其实和个人博客网站的难度已经差不太多了,普通程序员都可以完成,降低了人力成本。
对于需求的变化,已经有一些成熟的架构实践,比如说像分层架构这样把 UI 界面和业务逻辑分离,可以让 UI 上的改动,不会影响业务逻辑的代码;像 Wordpress 这样基于插件和定制化的设计,可以满足绝大部分内容类网站的需求,降低了时间成本。
2.其次,架构设计可以帮助组织人员一起高效协作。
通过对系统抽象,再拆分,可以把复杂的系统分拆。分拆后,开发人员可以各自独立完成功能模块,最后通过约定好的接口协议集成。
比如说前后端分拆后,有的开发人员就负责前端 UI 相关的开发,有的开发人员就负责后端服务的开发。根据团队规模还可以进一步细分,比如说前端可以有的程序员负责 iOS,有的程序员负责网站,这样最终各个开发小组规模都不大,既能有效协作,又能各自保证战斗力。
3.架构设计可以帮助组织好各种技术。
架构设计可以用合适的编程语言和协议,把框架、技术组件、数据库等技术或者工具有效的组织起来,一起实现需求目标。
4.架构设计可以保障服务稳定运行。
架构设计的目标,是用最小的人力成本来满足需求的开发和响应需求的变化,用最小的运行成本来保障软件的运行。
做好架构设计:
第一步:分析需求
架构设计,最基本的就是要能满足业务需求,所以搞清楚需求是至关重要一步。而产品需求,只有功能的描述,界面的交互,还需要进一步进行抽象。
一个常用的分析方法就是分析用例,也就是了解主要用户角色和其使用的场景。
第二步:选择相似的成熟的架构设计方案
在了解清楚需求后,就可以从业界成熟的架构设计模式中选取一个或几个。当然,具体选择哪些架构设计模式,需要你根据平时的学习积累来做判断。到这个阶段,同时还要考虑使用的语言和框架。
第三步:自顶向下层层细化
在选择好成熟的架构设计方案后,可以基于方案,层层细化,逐步完善、调整和优化。
按照分层架构的思路,我们可以把系统分成四层。
用户界面层:用户界面,负责展现功能以及和用户交互。
服务层:API 服务和 Web 网站服务。
业务逻辑层:实现业务逻辑,比如说如何读取用户订阅的专栏列表。
数据访问层:对数据库的访问。
数据存储:用数据库保存数据,文件库保存音频文件。
第四步:验证和优化架构设计方案
在技术方案完成后,还需要去验证方案是不是满足设计的目标,能否满足需求和未来需求的变化,能否保障软件有效地运行。