架构宝典
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.9 架构与软件开发(软件过程)

架构与软件开发之间是有联系的,架构师需要思考系统开发采用何种架构模型与软件开发模型。微服务是当前主流的架构风格之一,敏捷是很流行的软件开发模型。

我们先来区分两个概念,软件开发方法和软件开发模型。这两个概念在实践中常常被混淆。强调这两个概念是很有必要的。

20世纪60年代中期爆发了软件危机,为了克服这一危机,1968年和1969年连续召开了两次著名的NATO会议,会议上提出了“软件工程”这一术语,之后该术语不断发展、完善。与此同时,软件研究人员也在不断探索新的软件开发方法。我们常用的软件开发方法有Parnas方法、SASD结构化方法、面向对象方法等。

软件开发模型是指软件开发的全部过程、活动和任务的结构框架。软件开发包括需求、设计、编码和测试等阶段,有时也包括维护阶段。软件开发模型能清晰、直观地表达软件开发的全过程,明确规定了要完成的主要活动和任务,用来作为软件项目工作的基础。

典型的软件开发模型有瀑布模型(Waterfall Model)、快速原型模型(Rapid Prototype Model)、增量模型(Incremental Model)、螺旋模型(Spiral Model)、演化模型(Evolution Model)等。

1.9.1 敏捷软件开发

敏捷软件开发(Agile Software Development),又被称为敏捷开发,是一种应对快速变化需求的软件开发能力。它强调程序员团队与业务专家之间的紧密协作和面对面的沟通(认为这样比书面的文档更有效),频繁的新的软件版本交付,紧凑的自我组织型团队,能够很好地适应需求不断变化的代码编写和团队组织方法,也更注重软件开发过程中人的作用。敏捷软件开发是一种软件开发模型,与之对应的是瀑布模型、样机模型等,不是面向对象方法、结构化方法等软件开发方法。

敏捷软件开发开发离不开迭代。使用迭代法进行软件开发,要考虑迭代次数与效率。迭代和敏捷都是有适用范围的,不能用于否定传统方法。

敏捷不等于快,而是更强调灵活(flexible)。因此对于有些术语,不能只看译文,还要参考原文。其实,将Agile翻译成机敏也许更合适,这样才能体现“灵活”。对于不同的项目,要选择适合的方法,而不是把敏捷软件开发作为普适良方。对于需求明确、规模较大的项目,也应该考虑传统方法。

敏捷软件开发支持不断变化的业务需求,通俗来讲就是“小步快走”,与之对应的架构要具有适应变化的能力。

1.9.2 敏捷软件开发与微服务架构

审视敏捷软件开发的特点,会发现其倾向于使用小型、松散耦合的组件/服务,并以协作方式达成最终目标。这种架构风格能够从多种角度带来敏捷的效果。小型、松耦合的组件/服务可以独立进行构建、修改与测试,甚至可以根据要求的变化进行调整或被替换。这类架构还能够很好地提供高灵活性及适应性的部署模式,因为新型组件及服务可以随时根据需求进行添加/移除与规模伸缩。

一个微服务一般会完成某个特定的功能,比如订单管理、客户管理等。每个微服务都是一个微型应用,包括商业逻辑和各种接口。有的微服务通过暴露API被别的微服务或者应用客户端所使用,有的微服务则通过网页UI实现。在运行时,每个实例通常是一个云虚拟机或者Docker容器。

可见,敏捷软件开发和微服务架构有异曲同工之处。微服务架构让敏捷软件开发和复杂的企业应用交付成为可能[12]

敏捷软件开发与微服务架构围绕着同一类目标存在[13]:在尽可能满足客户需求的同时,维持良好的软件质量与系统可用性。