程序员到架构师
机会牵引人才,人才牵引技术,技术牵引产品,产品牵引更大的机会。 —— 张利华
1. 引言
一个程序员,第一次看到团队架构师熟练划分模块,会不免地心生敬礼,架构是软件的灵魂,而架构师则是背后的”造物主“。
而他(她)即是系统架构师,是一个最终确认和评估系统需求,给出开发规范,搭建系统实现的核心构架,并澄清技术细节、扫清主要难点的技术人员。从程序员到架构师的转型必要经历“思维方式的突破”。
图片摘自软件架构设计(第2版)
2. 基础概念
软件架构分为两大派系。——组成派和决策派。组成派(Mary Shaw定义架构:软件系统的架构将系统描述为计算机及组件之间的交互。)组成派是关注架构实践的客体——软件。决策派给出的核心思想非常明确:软件架构是在一些重要的方面做出决策的集合,如软件系统的组织,选择系统结构的元素和接口,如何组织这些元素形成更大的系统,用于指导这个系统组织的架构风格。
在组成派中认为,软件架构不仅注重软件本身的结构和行为,还注重其他特性:使用、功能性、性能、弹性、重用发、可理解性、经济和技术限制。
软件架构是一系列设计决策,如果做了不正确的决策,你的项目可能会被取消。
软件架构包括:组件(Component)、连接件(Connector)和约束(Constrain)。
架构设计是一颗决策树。
3. 架构设计视图
架构为谁而设计?
3.1. 为用户设计
3.2. 为客户设计
如一家小型超市设计软件,客户是超市老板,会考虑成本因素。
3.3. 为开发人员设计
软件的可拓展性、可重用性、可移植性、易理解性和易测试性。
3.4. 为管理人员设计
随着软件的复杂程度增加,开发的团队协作变得更加需要,为团队管理员理清开发的“模块+交互”,
架构是开发管理的核心基础。
4. 架构设计具体内容
成功的架构是相似的,失败的架构是各有原因。
架构设计6个步骤:
一、需求分析:做不到追根溯源的需求分析,往往会失败,可考虑现有功能、可拓展功能、质量、约束;
二、领域建模:透过问题领域的重要现象,捕捉背后最为稳固的领域概念,以及概念之间的关系;
三、确定关键需求;
四、概念架构:1个决定4个选型,即:如何划分顶级子系统;
1、架构风格选型;
2、开发技术选型;
3、集成技术选型;
4、二次开发技术选型;
五、细化架构设计;
六、架构验证。
细化架构设计:分为逻辑架构、开发架构、运行架构、物理架构和数据架构;
架构验证。
4.1. 运用“逻辑视图+物理视图”设计架构
区分逻辑视角和物理视角。设计逻辑架构的核心任务是,全面识别模块、规划接口,进一步明确模块之间的关系和使用机制。物理架构规定组成软件系统的物理元素,物理元素之间的关系,以及部署到硬件上的策略。
图片摘自软件架构设计(第2版)
概念架构
架构大方向正确,先设计概念架构。划分顶级子系统、架构风格选择、开发技术选择、集成技术选择、二次开发技术选择。
利用好多视图设计方法,5种视图推荐如:逻辑视图、开发视图、物理视图、运行视图、数据视图。
细化架构设计的15个技能项如图:
图片摘自软件架构设计(第2版)
5. 从需求到架构的产生——需求分析
5.1.需求开发
大多数架构师都认为需求决定架构… 不同需求影响架构的不同原理,采烧架构设计思维的基础。 ——温昱《一线架构师实践指南》
需求分析关键思维是功能、质量和约束。
需求怎么来?(愿景分析+需求分析)
怎样判断需求全不全?(功能、质量、约束)
软件研发与交付流程:
1. 概念化阶段
2. 需求分析阶段
3. 架构设计阶段
4. 并行开发与测试阶段
5. 验收与交付阶段
概念化阶段考虑的内容:
愿景分析、风险评估、可行性分析、项目进度、成本粗略估算。
5.1.1. 上下文(Context Diagram)
上下文是一种辅助说明需求范围(Scope)的方式,清晰描述了待开发系统与所有事物之间的界限与联系。
从软件过程全局看,按照需求捕获、需求分析、系统分析,但是在做需求分析、系统分析时也要继续做需求捕获的补充。
5.1.2. 突破需求分析列表这一关
很多时候被项目经理提供的需求列表所约束,无法实现“二维关需求观”。必须注意,需求是分层的。
功能需求 | 质量属性 | 约束 | |
---|---|---|---|
组织级 | 需求空间 | … | … |
用户级 | … | … | … |
开发级 | … | … | … |
软件质量属性分类模型如下:
6. 用例
7. 领域行话——领域建模
8. 确定关键需求
关键需求决定架构。
9. 概念架构设计
概念架构是界定系统高层组件,以及它们之间的关系。
10. 细化架构设计
架构设计能力,因掌握起来困难而显得珍贵。——温昱
系统思考从需求到设计,如:重大需求、特色需求和高风险需求。
11. 架构验证
好的策略需经经受求证、测试和发现瑕疵的过程
12. 模块划分
系统设计中的一个重要的和最具挑战性的任务就是将系统所要执行的功能分到各个组件上。——Daniel D. Gajski
自顶向下、自底向上、垂直切分和水平切分。
13. 如何分层
14. 优秀架构案例
感谢阅读,祝君成功!
-by aiziyou