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



举一个正交的例子 , 假如有一个需求是:查找员工名为John的员工 , 这个代码可以很快写出来 , 但细细想想的它的变化点 , 至少可以想到下面3个变化点:
查找的内容会变 , 不一定按照名字来查 , 比如按照员工工号来查; 查找的对象会变 , 不一定查员工 , 还有可能查学生; 查找的规则会变 , 不一定是待值查找 , 还有可能是范围查找 , 比如查找年龄在20至30的员工 。当想到了这些变化 , 重新设计后的效果就会不一样了 , 当面临业务场景变化的时候 , 可以做到最少的改动 , 这也即是设计能够降本增效的原因 。

四 分析与设计的思考 1 衡量标准
衡量分析与设计的标准是比较难的 , 一般是从一些大的原则去看 , 比如复杂性、开放性等 , 但又很难有一个量化的指标去衡量 , 到底复杂度有多高、开放性有多底 。 真正衡量好坏只有通过比较才比较好判断 , 比如多个方案之间的比较 , 这个是比较容易衡量谁好 。 因此我们需要多去看别人是怎么设计的 , 有哪些好的设计思想值得借鉴 , 多吸收好的设计思想、设计案例 。
做设计最怕是闭门造车 , 结果设计出来的东西不能够很好地解决实际问题 。 个人的经验是去看业界的方案 , 看看它们是怎么设计的 , 各自的特点 , 比如数据不一致性的问题 , 有很多种设计方案来解决 , 有的方案对业务入侵比较大 , 需要改造很大 , 能不能无入侵业务呢?阿里提出了TXC解决方案 , 这个设计就非常好 , 使用者只有打上一个注解就ok , 对业务改造没有什么成本 , 这也即是前面提到的简易设计原则 。
2 虚实结合
提到分析与设计 , 很多人觉得很虚 , 的确 , 在我刚工作前3年 , 也觉得这个非常虚 , 这个不就是画画图嘛 , 后面发现还真不是这么一回事 。 印象最深的一件事 , 当时在滴滴 , 我的主管给我们展示了营销系统未来我们要做的事 , 用了一张系统架构图非常体系地讲出来 , 知道未来我们要做成什么样子 , 当前我们处在什么位置上 , 那段时间我们过得非常充实 , 知道我们在做什么、要做什么 , 1年半以后我们把当时那张系统架构图上的事情都完成了 , 回过来头来看 , 如果没有当时的指引 , 每天还是做着需求 , 来一个需求做一个需求 , 这也即是最开始做事没啥动力 , 没看到目标 。
当设计的内容确定之后 , 最为重要的就是落实 , 这个过程是经验的积累 , 在实践的过程中会遇到一些问题 , 比如发放优惠券的过程中怎么扣库存、怎么保持事务一致性 , 技术难度的问题 , 我听一个人讲过一句话:要么没看到问题;要么回避问题 , 在实际中 , 我们会遇到各种各样的问题 , 只是我们把它忽略掉了 , 到最后说这个事技术上没复杂度 。 我经常分享的一个观点是往上抽象看2层 , 或许你的设计方案会变 。 架构设计是需要大量的实实在在的经验 , 不是简单地画画架构图就行了 , 需要在实践中反复检验 , 再去指导下一次更好地设计 , 我欣赏的一句话是:将虚的事情做实 。
3 将经验转化成能力
当我们有一些分析设计经验之后 , 更进一步地要转化成设计能力 , 设计能力是抽象的 , 需要在实际中得到检验 。 就像在第三部分讲到的设计 , 它不像分析那么很好地讲出具体的方法出来 , 设计本身是凝聚了思想、心血在里面 , 同时设计是一种艺术 , 具有高度的灵活性 , 因此很难讲出具体的设计方法 , 也不会有统一的方法 , 有灵活性一定不是具体的 , 所以这部分需要在大量的实践基础上 , 提炼出设计原则 , 将其转化成设计能力 。