了解如何生成软件
现代软件开发已经从根本上改变了,以前是从头开始构建所有内容,现在是从现有组件中组装应用程序。 了解此基于组件的方法对于在当代开发环境中有效实施和管理软件至关重要。
基于组件的软件模型
现在的应用程序是通过 将原始代码与可重用组件组合生成的。 开发团队不是编写每一部分功能,而是从以下位置组装解决方案:
- 原始业务逻辑代码: 实现特定业务需求、工作流和独特功能的自定义代码,以区分应用程序。
- 开源库和框架: 社区创建和维护的可重用组件,提供数据处理、身份验证、用户界面和通信协议等常见功能。
- 商业组件: 供应商提供的第三方库,通常提供专用功能、支持和保证。
- 集成代码:用于连接组件、调整接口以及协调系统不同部分之间交互的“粘合”代码。
研究表明, 新式应用程序由大约 80 个% 项目外部维护的现有组件组成 ,只有 20% 是开发团队编写的原始代码。 此组合反映了软件的创建方式(从构建到组装)的基本转变。
为什么以这种方式构建软件
基于组件的方法具有显著优势:
开发速度
重用现有组件极大地加速了开发:
- 经过验证的解决方案: 团队没有解决其他人已经解决的问题,而是整合了可靠工作的经过战斗测试的组件。
- 缩短开发时间: 从头开始构建 Web 应用程序框架、数据库驱动程序或身份验证系统需要数月或数年的时间。 使用现有组件可将这一点减少到数天或小时。
- 专注于业务价值: 开发人员专注于独特的业务逻辑,而不是重塑通用基础结构。
- 缩短上市时间: 应用程序更快地达到生产,因为团队不会从头开始构建每一层。
质量和可靠性
维护良好的开源组件通常超过自定义代码的质量:
- 社区审查: 常用的开源项目有成千上万的用户识别和报告问题,从而导致可靠的可靠代码。
- 专家开发: 许多开源项目由专门从事特定问题领域的专家创建和维护。
- 持续改进: 活动项目接收来自全球参与者的定期更新、bug 修复和增强功能。
- 生产测试: 成千上万的应用程序使用的组件已在不同的环境和方案中进行测试。
成本效益
使用开源组件可降低开发和维护成本:
- 不收取许可费: 大多数开源组件是免费的,避免每个席位或每部署许可成本。
- 共享维护负担: 社区会提供 Bug 修复和改进,从而减少组织的维护成本。
- 减少了人员配备需求: 团队不需要每个技术层的专家,因为它们可以通过组件整合现有专业知识。
- 降低总拥有成本: 虽然商业组件具有直接成本,但开源替代方法通常提供类似的功能,无需许可费用。
获取创新
开源社区推动技术创新:
- 前沿功能: 许多新技术和方法首先出现在开源项目中。
- 生态系统效果: 常用框架创建兼容组件、工具和知识的生态系统。
- 灵活的采用: 组织可以在没有巨额财务承诺的情况下试验新技术。
- 社区知识: 广泛的文档、教程和社区支持使采用更加轻松。
开源组件与闭源组件
组件基于源代码可用性分为两个基本类别:
开源组件
公开源代码 可供任何人检查、使用、修改和经常参与:
- 源代码可见性: 可以检查实际实现,了解组件的工作原理,并验证安全做法。
- 社区参与: 许多人可以改进、修复 bug 和添加功能。
- 受许可证管理的使用情况: 开放源代码许可证指定允许的使用,范围从不受限制的用途到派生作品共享同一许可证的要求。
- 透明度: 安全研究人员、开发人员和用户可以审核代码是否存在漏洞、后门或质量问题。
常用的开源组件包括:
- 编程语言和运行时: Python、Node.js、.NET Core、Go、Rust。
- Web 框架: React、Angular、Vue.js、Express、Django、Spring Boot。
- 数据库: PostgreSQL、MySQL、MongoDB、Redis、Elasticsearch。
- 开发工具: Visual Studio Code、Git、Docker、Kubernetes。
- 图书馆: Lodash、Moment.js、NumPy、Pandas、TensorFlow。
闭源组件
闭源(专有)组件 提供的功能,而无需提供源代码:
- 二进制分布: 组件作为编译的二进制文件或打包的库提供,无需源代码。
- 供应商控制: 创建组织控制更新、功能和许可条款。
- 商业支持: 许多闭源组件包括专业支持、服务级别协议和有保证的维护。
- 透明度有限: 用户无法检查实现详细信息,使安全和质量评估更加困难。
示例包括许多商业数据库驱动程序、专有 SDK、特定于供应商的工具和专用行业特定的库。
如何分发组件
包 提供用于分发和管理组件的正式机制:
包结构
- 二进制代码: 已编译的库已准备好在应用程序中使用。
- 元数据: 有关包的信息,包括名称、版本、作者和说明。
- 依赖: 组件正常运行所需的其他包的列表。
- 许可证信息: 有关如何使用包的法律条款。
- 文档: 用法说明、API 参考和示例。
包生态系统
不同的编程语言已经建立了包生态系统:
- npm (节点包管理器): JavaScript 和 TypeScript 包,世界上最大的包注册表,超过 200 万个包。
- PyPI (Python 包索引): Python 包,为数据科学、Web 开发、自动化等提供库。
- NuGet: 适用于 C#、F# 和 Visual Basic 应用程序的 .NET 包。
- Maven Central: 用于企业和 Android 开发的 Java 包。
- RubyGems: 用于 Web 应用程序和自动化的 Ruby 包。
- Crates.io: 用于系统编程的 Rust 包。
包管理工具
包管理器 自动下载、安装和更新依赖项:
- 依赖项解析: 自动确定并安装所需的依赖项。
- 版本管理: 跟踪应用程序使用的包版本。
- 更新通知: 当有较新版本可用时通知开发人员。
- 漏洞扫描: 某些包管理器集成安全扫描来识别已知漏洞。
基于组件的开发的影响
虽然基于组件的方法提供了巨大的优势,但它也带来了挑战:
依赖项管理复杂性
- 依赖项树: 应用程序可能直接依赖于 20 个包,但这些包依赖于其他包,创建成百上千个依赖项的树。
- 版本冲突: 不同的组件可能需要不兼容的共享依赖项版本。
- 更新级联: 更新一个组件可能需要更新许多其他组件。
安全注意事项
- 继承的漏洞: 任何依赖项中的安全漏洞都会影响应用程序。
- 供应链攻击: 恶意参与者可能会泄露常用包,以攻击依赖于它们的应用程序。
- 不再维护的依赖项: 不再维护的组件不会收到安全更新。
许可证合规性
- 许可证义务: 每个开放源代码许可证都有要求 - 一些许可证不受限制的商业用途,另一些许可证需要共享源代码。
- 许可证激增: 应用程序可能包含数百个不同许可证的包。
- 合规性负担: 组织必须跟踪许可证义务并确保合规性。
运行依赖关系
- 外部托管: 许多应用程序依赖于托管在公共注册表上的包,这些包可能会遇到服务中断。
- 注册表可用性: 如果公共注册表不可用,生成和部署可能会失败。
- 包删除: 作者有时可以从公共注册表中删除包,从而中断依赖于它们的应用程序。
了解现代软件在组件基础上构建的方式,为组织在实现开源软件时必须解决的安全、法律和运营问题提供了重要背景信息。 本模块中的其余单元探讨这些关注点和有效管理策略。