组件和依赖管理

简介: 组件和依赖管理

《持续交付 发布可靠软件的系统方法》读书笔记

当我们说起组件时,是指应用程序中的一个规模相当大的代码结构,它具有一套定义良好的 API,而且可以被另一种实现方式代替。 对于一个基于组件的软件系统来说,通常其代码库被分成多个相互分离的部分,每个部分通过个数有限的定义良好的接口提供一些服务行为,与其他组件进行有限的交互。基于组件的设计通常被认为是一种良好的架构,具有松耦合性,是一种鼓励重用的设计。事实也确实如此。但它还有另外一个重要的好处:对于大型软件开发团队的协作来说,它是最有效的方法之一。

保持应用程序可发布

为了在变更的同时还能保持应用程序的可发布,有如下四种应对策略:

  1. 将新功能隐蔽起来,直到它完成为止。
  2. 将所有的变更都变成一系列的增量式小修改,而且每次小的修改都是可发布的。
  3. 使用通过抽象来模拟分支(branch by abstraction)的方式对代码库进行大范围的变更。
  4. 使用组件,根据不同部分修改的频率对应用程序进行解耦。

依赖

在构建或运行软件时,软件的一部分要依赖于另一部分,就产生了依赖关系。组件(component)和库(library)之间的差异,库是指团队除了选择权以外,没有控制权的那些软件包,它们通常很少更新。相反,组件是指应用程序所依赖的部分软件块,但它通常是由你自己的团队或你公司中的其他团队开发的。组件通常更新频繁。这种区别非常重要,因为当设计构建流程时,处理组件要比处理库所需考虑的事情多一些。构建时依赖与运行时依赖之间的差异,构建时依赖会出现在应用程序编译和链接时(如果需要编译和链接的话);而运行时依赖会出现在应用程序运行并完成它的某些操作时。

组件

几乎所有的现代软件系统都是由组件组成的。为什么说组件开发方式让软件开发流程更高效:

  1. 它将问题分成更小且更达意的代码块。
  2. 组件常常表示出系统不同部分代码的变化率不同,并且有不同的生命周期。
  3. 它鼓励我们使用清晰的职责描述来设计并维护软件,反过来也限制了因修改产生的影响,并使理解和修改代码库变得更容易。
  4. 它给我们提供了额外的自由度来优化构建和部署过程。

并不建议让每个团队各自负责一个独立的组件。因为在大多数情况下,需求不会按组件的边界来分。根据我们的经验,那些有能力开发端到端功能的跨功能团队更加高效。尽管一个团队负责一个组件看上去好像更高效,但事实并非如此。常常很难只修改一个单独的组件就能实现和测试某个需求,因为通常实现一个功能需要修改多个组件。如果你按组件划分团队的话,就需要两个或以上的团队合作才能完成一个功能,自然会增加更多且非必要的沟通成本。而且,在围绕组件组成的团队中,大家倾向于形成“筒仓”(silo),并进行局部优化,从而失去从全局观点出发来评判项目的最佳利益的能力。最好划分多个团队,以便每个团队都可以拿到一系列的用户故事(这些故事可能属于同一主题)。为了完成这些需求,每个团队都可以修改任何组件的代码。一个团队为了实现某个业务特性可以自由修改任何组件是一种更高效的工作方式。依据功能领域而不是组件来组建团队确保了每个人都有权力修改代码库的任何部分,同时在团队之间定期交换人员,确保团队之间有良好的沟通。

小结

讨论了既能让应用程序一直处于可发布状态,又能尽可能让团队高效开发的技术。原则就是确保团队尽快得到代码修改后所产生的影响。达到这一目标的一种策略就是确保将每次修改都分解成小且增量式的步骤,并小步提交。还有一种策略是将应用程序分解成多个组件。将应用程序分解成一组松耦合且具有良好封闭性的协作组件不只是一种好的设计。而且,对于一个大系统的开发来说,还可以提高工作效率,得到更快的反馈。直到应用程序变得足够大时,才需要对组件进行分别构建。

推荐阅读

目录
相关文章
|
6月前
|
传感器 人工智能 JavaScript
鸿蒙开发:DevEcoTesting中的稳定性测试
DevEcoTesting主要的目的也是用于软件的测试,可以让开发者无需复杂的配置,即可一键执行测试任务,同时提供了测试报告和分析,无论是对于开发者还是测试同学来说,都是一个非常方便的工具。
232 3
鸿蒙开发:DevEcoTesting中的稳定性测试
|
存储 监控 安全
深入解析Sysmon日志:增强网络安全与威胁应对的关键一环
在不断演进的网络安全领域中,保持对威胁的及时了解至关重要。Sysmon日志在这方面发挥了至关重要的作用,通过提供有价值的见解,使组织能够加强其安全姿态。Windows在企业环境中是主导的操作系统,因此深入了解Windows事件日志、它们的独特特性和局限性,并通过Sysmon进行增强,变得至关重要。
367 1
|
安全 网络安全 开发工具
入职必会-开发环境搭建55-GitLab使用
本文详细介绍了GitLab使用, 包括管理员和普通开发人员的使用
270 4
入职必会-开发环境搭建55-GitLab使用
stm32f407探索者开发板(十九)——外部中断实验-EXIT
stm32f407探索者开发板(十九)——外部中断实验-EXIT
1150 0
|
开发者 图形学 iOS开发
掌握Unity的跨平台部署与发布秘籍,让你的游戏作品在多个平台上大放异彩——从基础设置到高级优化,深入解析一站式游戏开发解决方案的每一个细节,带你领略高效发布流程的魅力所在
【8月更文挑战第31天】跨平台游戏开发是当今游戏产业的热点,尤其在移动设备普及的背景下更为重要。作为领先的游戏开发引擎,Unity以其卓越的跨平台支持能力脱颖而出,能够将游戏轻松部署至iOS、Android、PC、Mac、Web及游戏主机等多个平台。本文通过杂文形式探讨Unity在各平台的部署与发布策略,并提供具体实例,涵盖项目设置、性能优化、打包流程及发布前准备等关键环节,助力开发者充分利用Unity的强大功能,实现多平台游戏开发。
810 0
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
本文旨在通过深入浅出的方式,为读者揭示卷积神经网络(CNN)的神秘面纱,并展示其在图像识别领域的实际应用。我们将从CNN的基本概念出发,逐步深入到网络结构、工作原理以及训练过程,最后通过一个实际的代码示例,带领读者体验CNN的强大功能。无论你是深度学习的初学者,还是希望进一步了解CNN的专业人士,这篇文章都将为你提供有价值的信息和启发。
|
运维 安全 网络安全
什么是数据库防火墙
什么是数据库防火墙
492 3
|
UED
Qt侧边栏的动态展示:隐藏与呈现技术详解
在现代用户界面设计中,侧边栏(Sidebar)是一个常见的组件,它为用户提供了便捷的导航和操作入口。在Qt框架中,实现侧边栏的隐藏与呈现不仅能够提升应用的美观度,还能增强用户体验。本文将详细介绍如何在Qt中实现侧边栏的动态隐藏与呈现,包括技术要点和代码实现。
1162 0
ly~
|
网络协议 应用服务中间件 Apache
如何在 DNS 记录中设置反向代理服务器?
要设置反向代理服务器,首先需安装配置软件(如 Nginx 或 Apache),并确保域名正确指向服务器 IP。接着,在 DNS 中设置 A 或 CNAME 记录,将域名指向反向代理服务器。然后编辑 Nginx 或 Apache 的配置文件,将请求转发至后端服务器。最后,通过浏览器访问域名测试配置是否成功,并使用工具检查请求流向和响应情况。
ly~
1240 3
|
监控 安全 Cloud Native
【云原生之Docker实战】使用Docker部署Ward服务器监控工具
【5月更文挑战第11天】使用Docker部署Ward服务器监控工具
425 4