后端面试38讲_10_08丨软件设计的方法论软件为什么要建模
你好,我是李智慧。
我们开发的绝大多数软件呢都是用来解决现实问题的。
通过计算机软件,可以用高效自动化的方式去解决现实中低效的手工的业务过程。
因此,软件开发的本质啊就是在计算机的虚拟空间中,根据现实需求创建一个新世界。
阿里的工程师呢是在创造一个五百平方公里的交易市场。
百度的工程师呢是在创造一个一万层楼的棋书馆。
新浪微博的工程师呢是在创造两亿份报纸,而腾讯的工程师呢在创造十几亿个聊天茶室和棋牌室。
现实世界纷繁复杂,庞大的软件系统呢也需要很多人合作开发出众多的模块和代码。
如何使软件系统准确反映现实世界的业务逻辑和需求呢?这个的软件建模就何能在开发支出,就是各个相关方对未来的软件蓝图有清晰的认知和认可,以便在开发过程中是不同的工程师能够有效建作这个让软件的各个模块边界清晰,易于维护和部署呢?这个由软件工程师创造出来的虚拟世界,是一个恢弘大气的罗马都城,还是一片垃圾遍地的棚户区,就看软件工程师如何设计它了。
而软件设计的主要过程就是软件建模。
所谓软件建模,就是为要开发的软件建造模型。
模型是对客观存在的抽象。
我们常说的数学模型,就是用数学公式作为模型抽象表达事物的本质规律。
比如著名的一等于MC方,就是质量能量转换的物理规律的数学模型。
除了数学模型是模型外啊,还有一些东西也是模型。
比如地图就是对地理空间的建模,各种图纸、机械装置的图纸啊,电子电路的图纸啊、建筑设计的图纸啊,也是对物理实体的建模。
而软件呢也可以通过各种图进行建模。
通过建模,我们可以把握事物的本质规律和主要特征,通确建造模型和使用模型,以避免在各种细节中迷失方向、软件系统庞大、复杂。
通过软件建模,我们可以抽象软件系统的主要特征和组成部分,梳理这些关键组成部分的关系。
在软件开发过程中,依照模型的约束开发系统,整体的格局和关系就会可控。
相关人员从始至终都能清晰了解软件的蓝图和当前的进展。
不同的开发工程师呢也会清楚自己开发的模块和其他同事工作内容的关系与依赖,并按照这些模型开发代码。
这软件开发中呢有两个客观存在,一个呢就是我们要解决的领域问题。
比如我们要开发一个电子商务网站,那么客观的领域问题就是如何做生意,卖家如何管理商品管理、订单服务用户,买家如何挑选商品,如何下订单、如何支付等等。
对这些客观领域问题的抽象,就是各种功能及其关系,各种模型对象及其关系、各种业务处理流程。
另一个客观存在呢就是最终开发出来的软件系统。
这个软件系统也是客观存在的。
软件有哪些类组成?这些类如何组成一个个的组件?这些类和组件之间的依赖关系,如何运行器,如何调用,需要部署多少台服务器,服务器之间如何通信等等。
所有这两方面客观存在的抽象,就是我们的软件模统一方面呢,我们要对领域问题和软件系统进行分析设计抽象。
另一方面呢,我们根据抽象出来的模型开发,实现出最终的软件系统,这就是软件开发的主要过程呢。
而对领域问题和软件系统进行分析设计和抽象。
这个过程呢,我们专门划分出来就是软件建模与设计。
软件建模比较知名的是四加一视图模型,准确的说四加一视图模型不是一种软件建模工具和方法,而是一种软件建模方法的方法,也就是建模方法论。
四加一视图模型认为啊一个完整的软件模型应该包括五部分的内容。
首先呢是逻辑视图,它描述软件的功能,逻辑有哪些模块组成啦,模块中包含哪些类啦,其依赖关系是怎样的呢?第二个呢是开发视图,它包括系统架构层面的层次划分,包的依赖、依赖的系统与第三方的程序包。
开发视图,某些方面和逻辑视图有一定的重复性,不同视角看到的可能是同一个东西。
开发视图中的一个程序包,可能啊正好对应逻辑视图中的一个功能模块。
第三个是过程视图,应述程序运行器的进程,现程对象模例,以及与此相关的程发包不通信等等问题。
第四个呢是物理视图,描述软件如何安装并部署到物理的服务上,以及不同的服务器之间如何关联通信。
最后一个呢是场景视图,针对具体的用例场景,将上面四个视图关联起来。
一方面呢从业务角度描述,功能流程如何完成?一方面呢从软件角度描述相关组成部分,如何依赖调用。
在机械制图领域呢,一个立体的零件进行制图设计,必须要画三视图。
正视图侧视图、俯视图每张图都是平面的,但是组合起来就完整的描述了一个立体的机械零件。
四加一视图模型呢也是通过多个角度针对软件系统的某个方面的抽象模型,最终组合起来啊,就构成了一个软件完整的模型。
三视图中有些部分是重复的,而这是这些重复的部分呢,可以将机械零件不同视角的细节关联起来,让看图者准确了解一个机械零件的完整结构。
软件建模的时候呢也是如此。
作为设计者,也许你会觉得用多个视图描述软件模型会有很多重复。
但是阅读你的设计文档的人,这是通过这些重复才将软件的各个部分关联起来,形成对软件整体的认识。
我在前面说四加一视图模型是一种方法论的原因呢就在于这五种视图模型主要指导我们应该从哪些方面去对我们的业务和软件建模,而具体如何去建模。
如何画模型呢?是可以用各种建模工具去完成的。
最重要的是,这些模型能够构成一个整体,从多视角、完整抽象软件系统的各个方面。
实践中啊通常用来进行软件建模,画图的工具是UML,建模的时候,也不一定要把五种模型都画出来。
因为不同的软件类型,其特点和设计关注点各不相同,只要能向相关人员准确传递出自己的设计意图就可以了。
Uml统一建模语言是目前最常用的建模工具,使用UML可以实现四加一视图模型。
这个名字的叫法也很有意思。
所谓统一呢是在UML之前,软件建模工具和方法就有很多种。
最后业界达成共识,用UML统一软件建模工具。
所谓建模,前面已经说过,就是用UML对领域业务问题和软件系统进行设计,抽象一个工具完成软件开发过程中的两个客观存在的建模。
所谓语言呢,这个比较有意思,为什么一个建模工具被称为语言?我们先看一下语言的时候,或者一个是用来沟通的,通过语言才能够进行交流。
二呢是用来思考,就算我们不需要和别人交流,仅仅一个人进行思考的时候,其实我们头脑中还是默默的在使用语言。
有时候甚至不知不觉的说出来,UML也符合语言的两个特点。
一方面啊满足设计阶段和各个相关方沟通的目的,一方面呢可以用来思考,就算软件开发过程不需要跟其他人沟通,或者还没到沟通的时候,依然可以使用UML建模画图,帮助自己进行设计思考。
此外啊,语言还有个点点是有方方。
而对UML呢?据我观察,不同公司、不同团队使用UML都有自己的特点,并不需要特别拘泥于UML的语法规范呢。
该不引起提议在使用UMLL程程由如MLLU的工作程构呢会在UML的最佳实践。
这也正是UML的方言。
具体如何使用UML的图建构。
如何在不同的软件设计阶段,用最合适的UML图形进行软件设计与建模,以及如何将这些模型图整合起来,构成一个完整的设计文档。
我会在下一篇文章中为你讲述很多做软件开发同学的职业规划,都是架构师。
那该设想这样一个场景,你如公司安开展你架构构应该在项项开开前期进进软软架构构设计应该如何开开展?你作程呢呢?该如如何输出你的工作成果?你如何何确定你的设计,是否满足用户需求呢?是否有把握让团队每个工程师清晰了解自己的职责范围,并有效的完成开发工作呢?架构式的核心工作就是做好软件设计。
软件设计是软件开发过程中的一个重要环节,如何进行软件设计?软件设计的输出是什么?软件设计过程中,如何和各个相关方沟通,使软件设计既能满足用户的功能需求,又能满足用户的非功能需求,也能满足用户的成本要求。
此外,还要使开发工程师、测试工程师运维工程师能够理解软件的整体架构,主要模块划分关键技术,实现核心领域模型,使他们能够做好自己的工作,使软件在开发之初就对软件未来蓝图有个清晰的认识,从而使整个软件开发过程处于可控的范围之内。
回上这些诉求,可以说是软件开发管理与技术的核心诉求了。
这些问题搞定了软件的开发过程和结果也就得到了保证。
而要实现这些诉求,主要的手段就是软件建模,以及将这些软件模型组织成一篇有价值的设计文档。
回到我们上面描述的场景。
如果公司安排你做架构师,你该如何开展你的工作?你向客户或者上司呈现的第一份工作成果是什么?使如何向团队开发人员呈现你的设计方案?如果你暂时没有思路,也不要紧像再见,我会为你完整呈现一个解决思路。
欢迎你在评论区写下你的思考,也欢迎把这篇文章分享给你的朋友,或者同事一起交流一下。