写点什么

面向复杂度架构设计的思考

用户头像
Simon
关注
发布于: 2021 年 03 月 31 日

-- 学习消化华仔的课程


何为复杂度

  • 需要解决的问题,才具有复杂度,不需要解决的问题,自然没有复杂度。所以我们需要聚焦需求,不要凭空去制造复杂度

  • 复杂度的外部原因:

  • 业务变化快:互联网项目业务日新月异,软件需求的迅速变化会对系统带来很大的不确定性;甚至项目还没有上线,需求就变了;所以要求代码和架构具有可扩展性

  • 需求不明确:新的业务场景,往往需求不明确,需要投石问路,软件产品要能够聚焦 MVP,采用迭代的方式,迅速得到市场和用户的反馈;所以,敏捷软件开发又迎来了新一轮的高潮

  • 用户规模大:移动互联网的兴起,用户规模迅速壮大;大数据量高并发的访问,软件的复杂度会直线上升

  • 用户体验要求增加:用户的体验需求越来越高,前端需求很明显在增加;同时,后端服务的响应时间,也有了越来越高的要求

  • 复杂度内部原因:

  • 复杂度转移:随着云平台的兴起,复杂度从基础设施的维护转移到服务的治理。我们不需要花费大量的精力耗费在硬件的维护;但是服务规模的增大,微服务的治理难度正在迅速提升

  • 团队人员的技术能力,团队的流动,团队的培养也时刻带来挑战

  • 业务的迅速变动,需要业务团队与开发团队的沟通频率加大

  • 架构和代码质量的要求与项目上线的时间的冲突

  • 架构和代码质量的要求与预算的冲突

  • 系统安全:为了保证系统安全,会带来复杂度,而且也只能做到相对安全,没有绝对安全

  • 复杂度是可拆解的,任何复杂的问题都可以拆分为多个相对复杂度变低的问题

  • 架构设计的无标准性,也是一种复杂。架构设计没有唯一标准,所以有人称:架构设计是一种艺术设计


何为简单

  • 简单不是简陋,不是功能的缺失

  • 简单就是要让人容易看懂:例如代码简单易读,就是要职责单一,分层清晰,代码能够体现出来业务逻辑,变量命名清晰;反例就是:if else 一堆,看不懂;所以简单,并不会减少时间

  • 简单就是耦合小,功能边界明确,调用简单:所以就是高内聚,低耦合,DDD 可以解决这类问题

  • 简单就是不过度设计,不耍酷

  • 简单就是适合即可,不要想着以后 10 年的需求(例如:现在用户 10w,却想着设计 1 亿用户的系统),先做出来,持续迭代

何为面向复杂度架构设计

  • 面向需求进行架构设计:首先需要申明:只有需求范围内的问题,才是我们需要解决的问题;不要凭空创建需求,架构需要紧贴公司业务

  • 面向系统核心进行架构设计:系统的核心功能,需要更多的考虑,考虑的因素多,架构设计自然会复杂;所以要能够分辨系统的哪些部分是核心功能,需要重点设计

  • 面向拆解复杂度的方式进行架构设计:架构师的职责是将复杂问题进行分层和拆解,让问题变得简单

  • 面向系统复杂部分架构设计:架构师需要分辨系统哪些部分比较复杂,哪些部分风险比较大;需要将复杂的部分重点考虑


架构设计环

  • 判断:

  • 架构师需要理解需求,分析需求,澄清需求

  • 架构师需要从需求判断出系统的核心,找到复杂度

  • 如果需求无法实现,架构师需要尽快反馈给业务,减少项目的风险

  • 拆解:

  • 复杂的问题是可以拆解为简单的问题,架构师需要将复杂问题拆解为简单问题

  • 架构方案没有绝对,需要提出多种方案

  • 取舍:

  • 选择其中一个方案,需要结合项目背景、团队背景、技术背景等综合考虑

  • 取舍是一个协作的过程,需要与其他架构师、leader、boos 进行沟通,他们会有不一样的视野

  • 取舍的过程,是一个学习的过程,根据获取的信息,可以返回对方案进行进一步优化

  • 实现:

  • 架构师的产出是实现,而不是架构图,所以架构一定要是可实现的

  • 架构师需要参与到实现过程,根据实现过程中遇到的具体情况,对架构进行调整

  • 架构师需要积累实现经验,以便于设计出可实现的架构


架构设计三原则

  • 合适原则

  • 合适优于业界领先

  • 需要考虑的背景:资源、时间、业务背景、公司技术风格和背景、技术能力等

  • 简单原则

  • 简单优于复杂

  • 简单易懂,边界清晰

  • 简单容易运维和扩展

  • 简单是门艺术

  • 演进原则

  • 演化优于一步到位

  • 需求可变和环境可变

  • 合不合适,试了才知道

用户头像

Simon

关注

还未添加个人签名 2018.08.11 加入

还未添加个人简介

评论

发布
暂无评论
面向复杂度架构设计的思考