前一篇文章简述了什么是软件。那么什么是软件架构呢?按照惯例,咱们来看看是什么问题,是谁的问题。前端
要解决谁的问题?编程
如前所述,软件实际上就是把现实生活模拟到计算机中,而且软件是须要在计算机的硬件中运行起来的。要作到这一点须要解决两个问题:服务器
1、业务问题架构
具体的现实生活状态下,没有软件的时候,所解决的问题的主体是谁,解决的是什么问题,是如何解决,如何运做的?编程语言
2、计算机问题性能
分别是谁的问题呢?学习
业务的owner须要提高业务的效率,下降业务的成本,这是动机。这个实际上就是业务的问题,因此通常软件开发的出发点就在这里。3d
是软件工程师的问题,要解决业务owner把业务虚拟化的问题,而且要解决软件开发和运营的生命周期的问题。对象
分别有什么问题?blog
业务问题的本质,是业务所服务的对象的利益问题,明白了这个,就很容易搞清业务的概念和组织方式。再次强调一下,有了软件,能够下降业务的成本,没有软件的状况下,业务是同样跑的。若是只是为了跟风要用软件,说不定反而提升了成本,这个是采用软件以前首先要先搞清楚的。咱们常常说软件和技术是业务的enabler,实际就是把原来成本很高的降到到了很低的程度而已,并非有了什么新的业务。另外,软件也不是下降业务成本的惟一方式。
为了可以让软件很好的跑起来,软件工程师必须理解业务所服务的对象,他们的利益所在,即业务问题。业务面对这些问题是如何分拆解决的? 涉及到了哪些概念? 这些概念分别解决了哪些哪些问题? 咱们不能本身按照本身的理解,用本身的一套概念体系来表述。若是这么作的话,会致使两个问题:
1)业务没法和咱们交流,由于他们没法明白咱们所本身建立的概念,因此他们没法确认咱们的理解是否正确。
2)咱们所表述的东西,并无在实际生活中实践过,咱们也不知道这些概念是否可以解决业务的问题。
软件工程师还必需要考虑,用什么样的硬件把软件跑起来,怎样跑得好,跑得快,而且能够随着业务的流量逐渐的长大?
分析问题
对于2,在有限的时间下,软件工程师毫无疑问没法一我的去完成这么多事情,那么咱们须要把所作的事情列出来,进行分析。
1、虚拟化业务须要完成这些事情:
学习业务知识,认识业务所涉及的stakeholders的核心利益述求,以及业务是如何分拆知足这些利益诉求,并经过怎样的组织架构完成整个组织的核心利益的,以及业务运做的流程,涉及到哪些概念,有哪些权利和责任等。
经过对业务知识的学习,针对这些概念所对应的权利和责任以及组织架构,对业务进行建模,并把建模的结果用编程语言实现。这是业务的模型,一般是现实生活中利益斗争的结果,是很是稳定的。
学习业务所参与的stakeholder是如何和业务打交道,并完成每一个人的权利和义务的,并经过编程语言,结合业务模型实现这些打交道的沟统统道。这部分是变化最频繁的,属于组合关系。明白了这一点,对后续的实现很是有帮助。
如何把业务运行的结果持久化,并经过合适的手段把持久化后的数据,在合适的时间合适的地点加载出来。这部分和基础设施有关,变化可能也会比较频繁。
2、代码如何运营,须要完成这些事情:
3、若是分红不一样的角色来完成这些事情,就须要一个组织架构来组织代码的编写和运营,须要作哪些事情:
会生成哪些架构
若是业务足够简单,用户流量够小,时间要求也不急迫,那么一我的,一台机器就够了,这个时候通常不会去讨论架构的问题。当访问的流量愈来愈大,机器就会愈来愈多,代码的部署单元就会拆分的愈来愈多。
一样就会须要愈来愈多的人来完成拆分出来的愈来愈多的部署单元,甚至同一个部署单元也须要分拆为多人合做完成。可是咱们须要注意到一点,整个的概念体系,或者说业务的建模不会有任何的变化,仍是完成一样的这些事情。惟一的区别就是量愈来愈大,超过了单我的和单个机器的容量,不断地增加。这样就会致使如下的架构:
当流量愈来愈大,咱们就会发现,软件所部属的机器就会开始按照树状的结构开始分拆,就会造成硬件的部属架构。这就是为何会造成部署的分层。
为了把业务在软件中实现并落地,须要前端人员、业务代码人员、存储层等不一样技巧的人同时工做,须要切分红代码的架构。这就是为何会造成代码的分层,造成代码的架构。固然,当这些角色由一我的来完成的时候,不必定会有代码架构,每每会比较乱。
当参与的人员愈来愈多,就会造成开发体系的组织架构。由于代码开发的过程是一个连续的过程,会用流程来把不一样的角色串联起来,这就是软件工程。
为了完成业务的工做,须要识别出来业务架构和支撑业务的组织架构,以及业务运做的流程。这是被虚拟化的业务架构和组织架构,也须要体如今代码中,保持和现实生活中一致。
什么是软件架构
这就是软件比较复杂的地方,涉及到软件自己的业务体系,和所虚拟的业务体系。根据以上的分析,所生成的架构,究竟那些算是软件架构呢?
软件由于流量增大而分拆成不一样的运行单元,在不一样的机器上部署所造成的架构,属于软件架构。
每一个运行单元为了让不一样角色的人,好比前端,业务,数据存储等可以并行工做,所分红的代码架构,也属于软件架构。
因此当咱们说软件架构的时候,咱们必定要讲清楚,究竟说的是部署的架构,仍是代码的架构。软件架构的落地,须要软件的组织架构和流程来保障,离开了这个,软件架构是一句空话。
另外不少人讲,架构是进化出来的。架构其实是在量不断的增大,超过了单台服务器的容量,逐渐的分拆,同时致使超过单我的员的能力,工做人员不断的增多,工做内容不断的分拆造成的。这自己就是架构的意义所在。无论怎么分拆,所达到的目标没有任何变化,就是完成业务在计算机中的虚拟化。