关键字:需求分析、设计原则、架构与架构图
一、需求分析
(一)分析:边界、用户故事、用户路径(我们和系统的任何触点都是一个用户路径)
分析背后的人性:人性是提出需求的本源
做任何系统都要从用户的诉求出发
(二)伪需求:没有调研、没有目标、没有逻辑的无脑需求
应对:1.用数据化结果否定需求合理性(是否有做PMF)
2.用正反案例来说明需求需要改进的地方
3.用户路径和触点推演需求合理性
(三)权利需求:老板或者是强势业务方的需求
应对:1.先肯定需求价值再提出需求实现的成本
2.给出更好地需求替代方案
3.从数据和案例角度说明需求快速上限危害性
(四)问题的分层
- (本源问题)用户问题:“我想支付”
- (经营视角)业务问题:支持一切可以支付的第三方支付工具
- (体系结构)产品问题:支付需要逆向流程、异常流程、对账模块等
- (架构代码)技术问题:高并发、可用性,实现第三方支付的链路
(五)KISS原则(Keep it simple and smile)
架构的理念是大道至简:解决问题
- 如何让我们的系统有可扩展性和可维护性
- 如何让我们的系统能够恰到好处地解决问题
- 如何让我们的系统能够运行3-5年不重构
(六)DRY原则(Don't Repeat yourself)不重复原则
(七)七大设计原则
共同点:提升软件的可扩展性,可维护性,是抽象思维和归纳思维的集中体现
1.单一职责:
- 高内聚、低耦合;
- 属性和行为向着模块预先定义的功能内聚;
- 模块的名字非常重要
2.里式代换原则:父类能够出现的地方,子类一定能够出现
子类出现的地方,父类若出现了,一般都有问题
3.接口隔离原则
接口的粒度尽可能地小同一接口的方法强内聚于同一特征
4.组合复用原则(可避免接口污染)
- 组合产生的对象,方法暴露的少;
- 继承产生的对象,继承路线上的所有方法全部暴露出来;
5.依赖倒置原则
细节依赖抽象;底层依赖于高层
6.迪米特原则——互相了解的信息,尽可能地少(知识最少原则)
你使用一个接口,你只关注:输入和输出,你不需要关注具体代码实现
7.开闭原则
- 对扩展开放,对修改关闭
- 扩展能力主要是对需求继续变化的适应能力
- 代码最大的稳定性,一旦成功运行,就应该改具体的代码扩展
- 通过依赖倒置,实现增加类,或模块的方式,实现需求的变化
- 任何变化的点,都是需要被隔离出来的
(八)熵增定律
熵减最重要的是形成开放性——开放性设计,开闭原则是熵减
扩展性设计是一种开闭原则的思维
二、架构
(一)什么是架构
- 架构 = 组成 + 决策
- 组成 = 模块结构 + 模块关系
- 决策 = 约束 + 设计原则 + 演化方向
(二)架构的目的
- 确定系统边界,在技术层面上做与不做
- 明确非功能性需求
- 确定系统里各模块之间的依赖关系与模块的宏观输入与输出
- 使后续的子系统或模块设计在一个既定的框架内和技术方向上继续演化
(三)如何画架构图
1.搞清楚要画的架构图的类型
2.确认架构图中的关键要素(比如产品、技术、服务)
3.梳理关键要素之间的关联:包含、支撑、同级并列等
4.输出关联关系清晰的架构图
什么是架构图?——水平层面上的业务模块加垂直层面上的技术依赖形成的逻辑结构图
(四)架构图的好坏
1.布局:图形的上下左右前后6个方向的位置关系
2.颜色:视觉中心在哪里,哪些元素被忽略
3.逻辑:组件之间的依赖,业务实现的可行性
(五)架构图的分类
- 业务架构
- 应用架构
- 数据架构——系统需要什么样的数据?如何存储这些数据?如何进行数据架构设计?
- 技术架构
(六)传统架构图4+1
物理视图、逻辑视图、开发视图、处理视图、
场景视图:需求分析技术,通常采用UML的用例图进行设计
(七)UML(Unified Model Language)统一建模语言
U:说明以前不统一;M:建模往往需要抽象;L:交流,定义共同的协议
分类:
- 静态结构图:类图、对象图、包图、组件图、部署图;
- 动态行为图:状态图、时序图、活动图、协作图
UML类图六大关系:
- 泛化关系:即继承关系
- 实现关系:实现接口
- 聚合关系:业务上整体与部分可以分开,是关联关系的特例
- 组合关系:业务上整体与部分不可以分开,是关联关系的特例(黑色)
- 依赖关系:只要在类中用到了对方,就存在依赖关系
- 关联关系:体现的是业务逻辑的关系,是依赖关系的特例,具有导航性&多重性
架构上为何要区分组合与聚合?原因:组合解耦难;分解任务的时候不要在组合的地方进行分解
组合与聚合的理解与区分例子:
- 人-车是聚合 车-轮子是组合
- 看在业务内独立存在的话有没有价值。
- 生命周期不一样,可以同时存在的,是聚合关系;生命周期一样,同生共死的是组合关系
(八)类图(属性与行为)
(九)时序图——通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作
(不关注逆流程、异常流程)