技术方案设计的方法
背景
前段时间接手了一个还处于方案设计阶段的工作,我重新做了设计。觉得新方案比旧方案业务清晰明朗、解决了旧方案的缺陷。我就很高兴,跟同事聊这个事情。同事就问我是怎么想到这些的呢。
我说了一些细节的,但是没有把核心本质讲出来。我觉得这是个很难回答的问题。因为一个方案怎么更合适,主要因素包含业务理解、个人经验、思维逻辑。这3个要素一般都是靠经年累月的积累才获得的。从这些中提取出别人可以学习和使用的方法确实不是一会儿就能想出来的事情。
市面上可以看到的关于技术方案设计的经典的书都没有仔细的去讲这个问题。比如《人月神话》讲的是项目大了怎么办、《架构即未来》讲的是架构扩展性的问题。那对于最普通的CURD(创建更新读取删除)系统究竟怎么去设计。都是做CURD的,架构师和普通开发区别在哪里。本文就来探讨一下这个问题。
CURD系统怎么做出技术含量
我前几年在面试别人的时候,遇到过一些面试者,已经带领别人做过项目了。可能人家的管理能力是不错的。项目管理是个博大精深的学问,可能一个项目在不同的阶段,更上层会找不同的管理者来做。
比如初创团队,会找些善于创业、擅长打造敏捷团队的管理者。这样的管理者可能会比较善于鼓舞团队士气。而到了一定阶段,项目业务量起来之后,不再求快,而是求稳。这时候管理者可能会换人,新的管理者做事并不那么快,但是做决策的路很正。路很正怎么理解,打个比方说:别人提了需求,前一个领导人很好,人家来需求他就接。这个领导不是,他会分析利弊和领域、业务是否合适放在这里。再比如更一层领导提了一个需求,要求什么什么时间做完。这个领导会去分析上层领导更本质的需求,宁可延期,要做稳做好。而项目稳定之后,继续稳定下去已经没有什么业绩了。这时候可能会再换领导,这个领导会带来一些原来积累的规划、方法。
总之,这个面试者可能有这些能力,但是我们要招聘一个技术人员,先考察硬实力,所以很自然的先请他介绍之前的项目做了什么和怎么做的。他自己也很没底气的说就是CURD嘛。给人感觉就是没有想法,在工作过程中思考的少。
拿一个后台管理系统来说,要对重要数据进行添加修改删除,一般需要审核、审计,敏感数据脱敏,甚至需要数据灰度。将这整套流程串联起来,需要一个工作流系统,可能会用到工作流引擎。目前有些数据脱敏已经用上了NLP(自然语言处理)技术。这里面每一步都涉及知识点。
数据模型
有限状态机设计
刚才提到后台管理系统里用到审核、审计、灰度。这三个可以与业务流程分离,做成三个工具组件。审核有审核状态:审核中、审核成功,审核失败。灰度也有待灰度、灰度中、灰度成功、灰度失败四种状态。
假如有一条数据,目前它的状态可以分成数据状态:有效数据和无效数据。另外还有审核状态和灰度状态。这时候数据模型(可以简单理解成数据库的数据表设计)应该设计成三个状态用三个数据字段表示呢,还是用一个数据字段来表示这三种状态呢。
这要看情况,一般来说,如果三种状态之前是相互独立的,比如:审核中是否可以待灰度,也可能是灰度中?对于一个工作流系统来说,一般要先审核通过才会进行灰度流程。就是说各个状态是互斥的。所以设计成三个字段,程序的判断逻辑会很复杂,因为有些组合是不成立的。这时候更合理的一个设计是用一个状态字段表示,通过状态机流转来控制。
设计方案中可以通过类似下面的流转图来体现:
实际方案设计过程中我改造了一下,状态正常从左到右流转,将终态用不同的形状(这里用椭圆)来表示。这样表示秩序感强些,更好理解。
数据表设计
在数据表设计时,要至少考虑数据类型、是否默认、是否为空和索引设计。比如对于钱什么的,需要用decimal(10,2),具体精确到多少位,要根据业务理解来定。对于加密字符什么的,加密如果是md5的,可以用char,而不用varchar来提高效率。
这里面就好像《红楼梦》里的台词一样,每条都很有学问。所以面试时的场景题也经常爱让进行一个数据表设计。
流程设计
我比较建议在一个设计方案开始时先把设计流程图先给出来,便于对方案有个整体认知。
流程图也很有学问,【亿图】软件上把流程图分成了下面的子类。
我个人最常用的是泳道图和BPMN。BPMN可以简单理解为业务流程图和泳道图差别不大。就是在普通流程图基础上增加一个分类,这个分类可以是阶段、也可以是执行者这些。就是给流程图多增加一个维度的信息,理解起来更清晰。
总结
在设计方案里还必须要有里程碑和未来规划。有句废话叫只怕有心人。在工作中,往往工作出色的并不是最聪明的,也不是花时间最长的。而是真正用心做的人。特别是设计方案,建议多用前人和大家总结的设计模板。模板最能代表一种设计思路。自己想到的、设计模板想到的都要考虑清楚,把方案做细。
遇到具体的问题,要做业界调研。之前听过一个实习生做的方案,他说业界调研的时候并没有查到特别相关的方案资料。当时我的领导就说了一句特别值得思考的话:如果没有查到,肯定是你的检索关键词不对。
我后来反复斟酌这句话,发现能想到的检索关键词才是真正体现自己对业务理解的。同时,业界调研的时候不仅要对业务相关做调研,需求可以分解,具体到每个步骤也需要调研。调研过程是个极好的学习机会。
下功夫和不下功夫的区别,想想《红楼梦》,之所以这么多红学者。人家红楼梦的作者设计每句话都是剧透,人物说出的话,都会被啪啪打脸。里面的每道菜谱都是值得专业厨师来研究的。这都是心用到了。优秀架构师也是这样炼成的。之所以说这个废话,因为我就被diss过方案做的不够细,我也看过别人的方案不够细的。时常回想被diss不够细的那句话,觉得真的是金玉良言。心怀感激。