我们接着上一篇聊聊架构(1)来聊软件中的架构。
什么是软件
软件的历史,可以说是用机器模拟人的历史的进一步发展。软件是提升生产力的一种手段,它让人们能够节省大量的工作时间,有更充足的时间去关注并推进自身的核心生命周期。
从冯诺依曼结构开始,程序逻辑开始脱离硬件,采用二进制编码。加上存储,配合输入输出等硬件,一个简化的大脑就出现了。图灵机则是模拟大脑的计算,用数学的方式把计算的过程定义了出来。这就是现在我们把计算机称为电脑的原因。
成本为王
限于技术的发展,软件行业的门槛还比较高。企业在采用软件之前,需要先搞清楚软件可以帮助企业做什么,软件的出现,确实可以降低业务的成本,但是在没有软件的情况下,业务也是一样能跑的。如果只是为了跟风而采用软件,说不定反而提高了成本,我们经常说软件或技术是业务的使能者(Enabler),实际就是把业务的成本从原来很高降到了很低的程度而已,并不是有了什么新的业务。另外,软件也不是降低业务成本的唯一方式。
软件的作用
有了软件之后,软件工程师把人们日常生活中所做的事情,虚拟到计算机中。为了操纵计算机中的虚拟人,人们需要把自己本人一起虚拟到计算机中,而人们的日常活动方式则变成:通过计算机的输入输出设备来控制计算机中的自己,完成日常的工作以及与他人的沟通。这样,时间和空间的限制就被打破了,人们不再需要在现实的空间下活动,从而带来了便利。模拟人类的行为始终是软件的一个目标,包括模拟人类的各种感觉以及人类大脑的计算。比如模拟人类社会(互联网社交),模拟交易,包括现在正在流行的VR,人工智能等等。未来不管如何发展,模拟人的所有行为都是一个大的趋势。
软件的生命周期
软件出现之后,人们慢慢开始把自己擅长的事情也交给软件来做,人们可以去做更有价值,或者学习自己不会做的事情,毕竟重复自己已知的事情不会让自己有更大的提高。
一个软件,因为某个业务虚拟化的需要而产生;后续不断更新,修改,推动软件逐渐变异,成长;当该软件不再被需要(因业务的变化),或有更好的软件来替代的时候,该软件就会被废弃,完成使命而消亡。软件的生命周期也会发生切分,从而形成两个子生命周期:软件开发生命周期和软件运行生命周期,很明显软件运行周期是核心生命周期。
软件的开发生命周期
软件不是随便创建的,因为一旦创建,就必须要有资源维护,所以在开发组织的时候,是否需要创建一个软件,要由大家一起来讨论,认证其必要性,确定代价和所获得价值的对比,也就是ROI(Return On Investment)。
软件不是创建好就可以运行的,它需要用代码来编写,以实现对业务的模拟。代码确认无误之后,再把代码编译成机器代码,从而形成一个部署单元,部署到机器上运行。此时软件才真正诞生。
软件开发的增长
随着业务增长,一旦软件工程师进入比较复杂的业务领域,往往就会力不从心,因为业务超出了自己的能力。按照前面说的架构切分原则,软件开发的核心生命周期是编写代码。所以对于软件工程师不熟悉的行业知识,会剥离出来给熟悉业务的人员,如业务分析师(Business Analyzer, BA),来进行行业知识和业务的识别:系统的设计会交给架构师来执行;设计的编码会交给开发人员;编码结果的校验会交给测试人员。
软件开发的迭代
软件上线后,还会不断进行修改,有时是因为要增加新的需求,有时是因为软件本身存在一些问题,比如出现Bug需要修复。
软件的运行生命周期
软件上线之后,运维人员需要把软件在部署的机器上启动,如果是服务器端软件,则需要服务提供者启动。如果是客户端软件,则需要客户自行启动。在这期间,每一个用户对这个软件的访问,都是一个访问生命周期。软件虚拟化的成效就是靠访问来达成的,所以软件的访问生命周期很重要,展示了用户的使用情况。在软件启动之后,运维会对它进行健康监测。业务也会针对该软件做业务监控,看企业业务虚拟化的成效。
软件架构
软件架构要解决两个问题:1. 业务的问题: 在现实状态下,没有软件的时候,解决问题的主体是谁,解决的是什么问题,又是如何解决的、如何运作的? 2. 计算机的问题:a. 在软件开发生命周期中,如何用计算机语言来表达业务的生命周期? b. 在软件运行生命周期中,模拟业务的软件需要哪些硬件设施才能够满足要求,并且当访问量越来越大的时候,软件能否支持硬件的逐渐长大和性能线性扩展? 硬件是有可能失效的,软件如何在硬件失效的情况下,仍然能够保证可用性,让用户能够不中断地访问软件提供的服务? 如何收集软件中产生的数据,为下一阶段的工作提供依据?
分析问题
对于软件开发生命周期,需要完成下面事情:
- 学习业务知识,认识业务的生命周期,以及生命周期中所涉及的利益相关人的核心利益述求。业务是如何拆分生命周期的,拆分出来的核心生命周期是哪个?这些生命周期是如何组织起来,并通过怎样的组织架构完成整个组织的核心利益的?
- 通过对业务知识的学习,确定核心生命周期和非核心生命周期,以及这些生命周期的组织方式,对业务进行建模,并把建模的结果用编程语言实现,这就是虚拟人的组织架构,对应的是现实生活中的组织架构,现实生活是软件思想的最主要来源。
- 理解参与业务的利益相关人是如何和业务打交道,并为每个角色的权利和义务进行代码并落地实现的。
- 考虑如何把业务运行的结果持久化,并通过合适的手段把持久化后的数据,在合适的时间合适的地点加载出来。这部分和基础设施有关,变化也会比较频繁,相当于人类把记忆存储在外部的设备中,如文件柜,并按需快速加载。
对于软件运行周期,需要完成以下这些工作:
- 需要多少硬件设备来满足访问的需求?
- 软件要如何拆分并部署到哪些硬件设备上?
- 这些软件如何通过硬件设备互相连接到一起?
- 当业务流量增大到超过一台机器的容量时,软件能否支持通过部署到新增服务器上的方式,扩大对业务的支撑?
- 当某台或某些硬件设备失效时,软件是否仍然能够不影响用户的访问?
- 软件运行产生的数据,能否提取出来并加以分析,为下一轮的业务决策提供依据?
这篇详细介绍了软件架构,下一篇会详细介绍软件架构师。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/6923.html