作者:邓冰寒
在面试软件工程师的时候,通常会问候选人的职业规划,大部分人希望在未来3-5年成为一名架构师。在大多数人开发人员的眼里,架构师是一种令人向往的职位,不过我认为架构师不仅仅是一种职位,更应该是一种角色,这样人人都是架构师。
首先,人人都是架构师,并不是说人人都要做架构师这个职位。如果开发人员具备以下八个核心能力:编程能力、调试能力、编译部署能力、性能优化能力、业务架构能力、在线运维能力、项目管理能力和产品规划能力,就能向上提升成为一名优秀架构师;但那些在象牙塔下绘制大量UML图,以及写了几百页无人问津的Word文档的“伪架构师”,他们不参与代码的编写,被业界戏称为“AaaS(Archtecture as a Service)”--架构即服务。
一直以来,架构设计仍然被很多开发人员所误解,认为架构设计是架构师的工作,自己只是一位写代码的工程师,接过产品经理递过来的原型图就直接撸码单干了。对于业务简单的项目来说,是可以这么做。但随着业务的增长,代码就会堆积成一个“大泥球”。
其次,人人都是架构师,说的是人人都可以担当架构师这个角色。正如在二十年前,汽车司机是一种令人羡慕的职业,随着时代的进步,汽车已经当做普通人的代步工具。是的,当今依然有开大货车、大巴车的专业司机,但是不妨碍我们人人都可以作为司机的角色,自己开车着小汽车代步。作为新时代的开发人员,是否有一种架构设计的“代步工具”?这样的话,人人都能是架构师。C4模型,就能助力开发者快速构建软件架构。
C4模型
C4模型的理念是将系统分为:System Context(系统上下文)、Container(容器)、Component(组件)、Code(代码),每层代表不同的视图架构,每层适用与不同的人员,针对当前的人员角色,找到共同的关注点来形成统一认知。
从上图可知,在使用C4模型来描述组件的软件架构时,可以通过放大进入下一层,把架构从宏观到细节展示出来。正如从地图上地址一样,先总览国家(对应C4的系统上下文),然后到省(对应C4的容器),再到市(对应C4的组件),最后到街(对应C4的代码)。这四种不同的抽象层次让不同的角色都能找到适合自己的内容,并在此基础上进行讨论形成共同认知,即DDD所称的通用语言。
- 第一层:系统上下文(System Context)
在这一层的用户角色主要是业务人员,产品经理,架构师,开发人员,特别是业务人员,他们不关注技术细节,但是对业务领域非常熟悉,也就是DDD所称的领域专家。
一般情况下,会由产品经理或架构师来绘制系统上下文。如果产品经理和业务人员在不了解技术细节的情况下,都能看懂系统上下文,对于要实现这个业务逻辑的开发人员来说,更不在话下。所以开发人员应该以架构师的角色来了解业务逻辑,并绘制出C4架构图中的系统上下文。只有这样,开发人员才能拔高层次,转变传统思维,站在更高的层次来设计软件系统。通过C4模型来设计软件架构,能降低沟通成本,让开发人员在设计之初就和业务人员达成统一的认知,不至于偏离方向。
- 第二层:容器(Container)
这一层是从系统上下文放大进入的效果,我们以出行应用中的高铁票务系统为例,在这里各个服务及存储的职责和依赖关系。这层是给有技术背景的角色看的,描述的应用是进程级别的应用,可以直接部署与运行,通过这层可以了解清楚软件的职责描述。
- 第三层:组件(Component)
这一层是容器层的放大,看到的是一个服务内部的组件,例如我们的出行应用订单服务组件架构,可以清楚的看到服务内部组件之间的关系。同时,还可以通过代码片段来辅助开发人员的理解。
- 第四层:代码(Code)
代码层是组件层的放大,通常是使用UML图来描述组件的细节。在上面提到,实际上绘制UML图的投入产出比比较低,现在大部分开发人员都不会绘制UML图,也就不重点讲解。
C4模型优势
- 使用一致的标准直观地描述软件系统
使用一致的标准降低了沟通成本,意味着你将在会议上花更少的时间,实现降本增效
- 加强图标的创建和维护
用对象创建图标,以便从任何地方同步更改,从而无需在多个地方查找相同的对象
- 通过放大、缩小来呈现不同层次的细节
通过简单地放大更多细节和缩小上下文,为每位用户或观众呈现正确的细节,而不是重复维护多个文档
人人都是架构师,需要开发人员转变思维,以架构师的角色来设计产品架构。当然,要实现人人都是架构师,并不是一件容易的事。但通过C4模型来设计架构,可以大大降低架构设计的门槛。
通过C4模型架构图设计理念,即使是个普通的开发人员,也可以很容易的去设计软件架构。可以预见,在不久的将来,就如现在的汽车司机一样,有专业的架构师,但是不妨碍开发人员都成为架构师的角色,更加贴近业务,设计出符合企业核心业务的架构。
附:C4 模型是一种在不同抽象层次上交流软件架构的简单方法,可以向不同的受众讲述不同的故事。这也是向软件开发团队介绍(通常是重新引入)严谨和轻量级建模的一种方式。有关 C4 模型的更多信息,以及补充图(运行时和部署)的示例、符号清单、常见问题解答、会议讲座视频和工具选项,请参阅c4model.com。