如果要问架构设计中哪种思维最重要,我会毫不犹豫的说:抽象思维。
反面案例
我们先从两个反面的数据结构设计案例来反思,如果没有抽象,将是如何糟糕的设计!
案例一:在设计一个医师咨询和药师咨询相关产品时,对于医院内的两个重要参与者的信息内容的设计
问题反思:
-
医师表和药师表是否几乎一样?
-
为何不能合并?
-
如果后面有护师、技师甚至行政人员加进来,怎么办?
统一抽象成为员工或者机构用户,通过类型区分是否更好?
案例二:在业务出现区域个性化字段的时候
当我们的业务拓展到甘肃省,在我们的业务平台上,需要增加甘肃就诊卡卡号的信息,在技术评审环境出现的设计问题:
-
后续如果我们拓展到其他省份呢?
-
每个省都建一个类似的字段?
如果拆分成:就诊人省份+就诊卡号,或者单独设计一个扩展表,保存各种卡号的信息,是否:
-
拓展到其他省份是否结构不用再调整?
-
随之而来的一些程序逻辑是否也不变?
什么是抽象?
武侠小说中,武功的最高境界都是“无招胜有招”,一切有具象的招式都是下乘。金庸小说中描写剑魔独孤求败,其武功修为有四个阶段。第四个阶段臻至化境,“四十岁之后不滞于物,草木竹石均可为剑。自此精进,渐入无剑胜有剑之境。” 从利剑,到软剑,再到无锋重剑,最后是草木竹石皆可为剑,其实就是一个将具体事物不断抽象的过程。所以武侠中的万剑归宗其实就是极致的抽象思维的体现。
抽象的定义:
抽象是指为了某种目的,对一个概念或一种现象包含的信息进行过滤,移除不相关的信息,只保留与某种最终目的相关的信息.从另外一个角度看,抽象就是简化事物,抓住事物本质的过程。
宋代禅宗大师青原行思提出参禅的三重境界:参禅之初,看山是山,看水是水;禅有悟时,看山不是山,看水不是水;禅中彻悟,看山仍然山,看水仍然是水。
这恰恰反映了我们看待问题,解决问题的过程,同时也体现了抽象在这个过程中的重要作用。“看山是山”,即分析具体问题;“看山不是山”,就是将具体的问题进行提炼,抽象,形成一套架构设计和解决方案,可以适用于所有类似的具体问题;“看山还是山”,就是一个验证解决方案的过程。将抽象出的架构用于解决具体的问题,根据效果来不断改进,优化原有的设计。这是一个从具象思维到抽象思维再回到具象思维的过程,我认为任何架构的设计都是基本符合这个过程的,抽象分析和具体分析,二者缺一不可。
架构设计的过程其实是从简单到复杂再回归到简单的过程。架构设计往往从简单的需求开始,不断的分析需求背后隐含的其他内容,由点及面,举一反三,探讨该需求可能延伸的场景从而带来的变化,然后全局化的思考,系统化的设计,这是架构设计从简单到复杂的过程。但是架构设计的目的不是把简单的事情搞的很复杂,而是要让复杂的设计回归到简单,而回归简单的过程就是抽象的过程,从复杂的系统中找到核心的、稳定的、共性的因素加以抽象,抓住问题的本质,简化模型和过程。
在系统架构和设计中,抽象帮助我们从大处着眼,隐藏细节。抽象能力的强弱,直接决定我们所能解决问题的复杂性和规模大小。就像上图这三个医疗产品的功能架构图,每个产品都有抽象化的设计,而如果将三个产品功能放在一起再去设计开发,我们发现依然有很多的共性,依然可以继续抽象。现在大热的中台架构其实就是对多个产品在同一个业务及需求场景下的极度抽象。
所以,抽象是复用的基础,越是具象的东西越是难以复用。同样抽象也是做扩展性设计的基础,因为没有抽象何来扩展。
如何锻炼我们的抽象思维?
抽象能力不仅对软件系统架构设计重要,对建筑、商业、管理等人类其它领域活动同样非常重要。其实可以这样认为,我们生存的世界都是在抽象的基础上构建起来的,离开抽象人类将寸步难行。所以修炼我们的抽象思维是非常重要的,如何修炼我们的抽象思维,提供以下几点建议:
-
反复的进行“简单->复杂->简单”的设计过程,举一反三,而后发现共同规律。
-
编程的时候要灵活的使用设计模式,大部分设计模式都蕴含着抽象的思维。
-
多学习优秀开源软件的源码,特别是开发框架,多领悟其中设计的思路。
-
开发的时候不要着急动手开发具体功能,而是要先做模型设计或者流程设计,设计的过程也是不断抽象、扩展的过程。
《程序员的思维修炼》是菜根老谭结合自己的工作经历和对这个岗位发展的认知而专门开辟的一个专栏,旨在分析程序员的职业发展的过程中我们应该锻炼哪些思维意识,如何去合理正确的看待事物,如何形成适合自己发展的思维体系。本专栏既是对过去思考的总结,也是对自己发展所具备的能力的思考,希望这些内容能陪我成长,帮大家解疑答惑。
同时,微信为菜根老谭开通了视频号,配合着一些短视频,讲讲产品研发的那点事,分析产品研发过程中出现的问题以及思考。
菜根老谭,微信公众号:CGLT_TAN,人人都是产品经理专栏作家。经历程序员、技术Leader、研发Leader等多种岗位。关注医疗,早教领域,擅长企业IT架构及互联网产品架构。