软件|软件分析与设计:分析什么?如何设计?( 三 )



3 1个分析案例
用2.1节中提到的分析方法 , 我当时分析一个分销业务也是用了上面的方法 , 从下面这张图中可以看出业务发展思路是怎样 , 用了几个关键词进行概括:打基础、拓渠道、夯能力、搭体系、数据化 。 当有了这些认识之后 , 再去推导技术侧要做哪些就比较容易 , 以拓展渠道为例 , 当多个渠道接入进来时就暴露了一些问题 , 比如答疑成本比较高 , 因此就有一个重要的方面就是渠道接入保障 , 怎么减少渠道接入成本、答疑成本就是技术侧要思考的问题 。

三 到底要怎样设计 1 设计全景图
如果说分析阶段是把事物打散 , 那么设计就是把打散的事物更好地组合起来 。 设计最为核心的是从分析中提炼出问题 , 即定义技术问题 , 这个是非常难的 , 比如你觉得某个设计不好 , 但又讲不出来为什么不好 , 说明对问题的理解程度还不高 。 常见的技术问题有:性能、扩展性、稳定性、安全、效能、体验、成本、数据一致性等 。
当定义好了技术问题 , 接下来就要调研业界对这个问题有哪些方案 , 每个方案的优缺点是什么 , 比如数据一致性 , 有事务型解决方案 , 也有补偿型解决方案 , 结合业务本身去做选择 , 这个选择就包含了决策 , 决策就意味着取舍和平衡 , 并不是随意的决策 , 而是有决策的依据来支撑 , 比如经验、原则、数据等 。
设计是包含原则的 , 这些原则应该是大家都去遵循的 , 比如分层原则 , 这个在软件设计中非常常见 , 原则是平时大家开发过程经验的结晶 , 以分层原则为例 , 可以深入思考 , 为什么要分层、分层解决了什么问题、要分多少层、如何去分层 , 只有深入思考了这些原则 , 在新的场景中再去做设计时 , 就会得心应手 , 而不是僵硬地去套用分层原则 。

2 设计原则
设计原则 , 每个设计者有自己的理解 , 很难有统一的设计原则 , 只能在局部上达成一致 , 比如分层原则 , 这个大家比较容易达成的 , 设计原则应该是一系列的原则组成集合 , 并非是单一 。 设计原则是在大量实践过程中沉淀出来的 , 我更想说的是如果你对看到的某些原则能结合自己的经历讲得出来 , 说明你是有过真正实践和思考的 , 否则这些设计原则也仅仅是一些文字 , 转化不了设计经验和设计能力 , 这里列出一些常用的设计原则 。
系统性原则 抽象分层原则 领域原则 复用原则 简易原则 成本效率原则 正交原则 扩展原则 演进原则 3 2个设计案例
对于上面提到的9个设计原则 , 这里主要聊的是系统性原则和正交原则 , 系统性原则是站在全局上思考系统之间的交互 , 这个是非常重要的 , 相当于是指明灯 , 当看懂了整个系统未来的样子 , 在当下每一步的执行都清楚知道是为了什么 。 反之没有这个系统性原则 , 所做的事都只是关注点状事情 , 不成体系 。 以2.3节中的例子来讲 , 当分析出来要做的事情后 , 如下图画出系统架构图 。 从系统架构图中可以看出系统之间的交互是怎样的、链路逻辑是怎样的(注:逆向链路没有表达出来) 。

我们在数学中学习过正交 , 最简单的理解是两条线是垂直的 , 在软件中我们看到一些逻辑中包含了很多的逻辑 , 每次修改的时候 , 改了这个逻辑结果影响了另外一个逻辑 , 说明我们的逻辑耦合度比较高 。 正交原则即是分离出不同的变化点 , 让变化自治 , 即每个变化只影响自身 , 不会影响到其它的变化点 。 平时我们写代码中有两种场景影响正交:代码重复和关系依赖 , 对于重复的代码可以抽取出来 , 对于依赖的部分 , 可以抽象一层防腐层出来 。