应用软件开发的工程化

2023-11-18 10:34:53 浏览数 (2)

应用软件的工程化

应用软件的功能需求、非功能需求和工程化问题是应用软件开发中不可或缺的部分。功能需求是软件必须实现的功能,非功能需求是软件必须满足的属性,工程化问题是软件开发过程中遇到的技术问题。

功能需求

功能需求是软件必须实现的功能,是软件开发的起点。功能需求可以分为两类:基本功能需求和附加功能需求。

  • 基本功能需求是软件必须实现的最基本的功能,是软件能够满足用户需求和业务要求的基础。
  • 附加功能需求是软件可以选择实现的功能,可以提升软件的用户体验和可用性。

非功能需求

非功能需求是软件必须满足的属性,包括性能需求、安全需求、可靠性需求、可扩展性需求和可维护性需求。

  • 性能需求是软件必须满足的性能指标,如响应时间、吞吐量等。
  • 安全需求是软件必须满足的安全性要求,如数据安全、系统安全等。
  • 可靠性需求是软件必须满足的可靠性要求,如容错性、可恢复性等。
  • 可扩展性需求是软件必须满足的可扩展性要求,如支持用户规模的增长等。
  • 可维护性需求是软件必须满足的可维护性要求,如易于理解、维护等。

工程化问题

工程化问题是软件开发过程中遇到的技术问题,包括软件设计问题、软件实现问题和软件部署问题。

  • 软件设计问题是软件的架构设计、算法设计等。
  • 软件实现问题是软件的编程、测试等。
  • 软件部署问题是软件的部署、运维等。

工作量占比

功能需求、非功能需求和工程化问题是应用软件开发中不可或缺的部分。功能需求是软件开发的起点,非功能需求是功能需求的延伸,工程化问题是满足功能需求和非功能需求的手段。在应用软件开发过程中,需要充分考虑这三方面的因素,才能开发出满足用户需求、符合业务要求、可靠安全、易于维护的软件,根据历史的统计经验,各自的占比参考如下:

名称

定义

关联关系

工作量占比

功能需求

软件必须实现的功能

非功能需求是功能需求的延伸

50%

非功能需求

软件必须满足的属性

功能需求是软件开发的起点

30%

工程化问题

软件开发过程中遇到的技术问题

满足功能需求和非功能需求的手段

20%

开发流程

在传统的瀑布模型中,功能需求、非功能需求和工程化问题是分阶段进行的。在需求分析阶段,首先要定义功能需求,然后再定义非功能需求,最后才是工程化问题。在开发阶段,先是设计软件,然后是实现软件,最后是部署软件。这种开发模式的缺点是,在需求分析阶段,很难准确预测软件的非功能需求和工程化问题,这可能会导致软件在开发完成后无法满足用户需求或业务要求。

敏捷开发是一种迭代的开发模式,它将功能需求、非功能需求和工程化问题融入到开发过程中。在敏捷开发中,软件开发团队会在短时间内(通常是两周)交付一个可运行的软件版本,然后根据用户反馈进行迭代开发。这种开发模式的优点是,可以更灵活地满足用户需求和业务要求,同时也能提高软件的可靠性和可维护性。

DevOps 是一种软件开发和运维的协同方法论,它将软件开发和运维融为一体。在 Devops 中,软件开发团队和运维团队会紧密合作,共同确保软件的质量和可靠性。DevOps 可以帮助软件开发团队更好地满足用户需求和业务要求,同时也能提高软件的可靠性和可维护性。

内容

瀑布模型

敏捷开发

DevOps

优点

开发过程清晰、可控,易于管理和跟踪,适合大型、复杂的软件开发项目

灵活,适应变化的需求,开发周期短,成本低,有利于团队协作

提高软件质量和可靠性,缩短软件交付周期,降低软件开发成本

缺点

不灵活,难以满足变化的需求,开发周期长,成本高,不利于团队协作

开发过程不够清晰、可控,难以管理和跟踪,不适合大型、复杂的软件开发项目

需要团队的协作和配合,需要一定的技术和经验

功能需求

软件必须实现的功能

软件必须满足的属性

软件开发过程中遇到的技术问题

建议

在需求分析阶段,要充分考虑用户需求和业务要求,并尽可能准确地定义功能需求和非功能需求

在开发过程中,要采用迭代开发的方式,并根据用户反馈进行调整

要采用 Devops 的方法论,将软件开发和运维融为一体

瀑布模型和敏捷开发是两种截然不同的开发模式,各有优缺点。瀑布模型适合大型、复杂的软件开发项目,而敏捷开发适合小型、快速迭代的软件开发项目。Devops 是一种方法论,可以帮助软件开发团队更好地满足用户需求和业务要求,同时也能提高软件的可靠性和可维护性。在实际的软件开发中,可以根据项目的特点选择合适的开发模式和方法论.

软件工程化的重要性可以从以下几个方面概述:

  • 标准化:通过统一的标准和流程,可以提高软件开发和运维的效率和可靠性。例如,Devops 倡导使用统一的代码库、版本控制系统、部署工具等,可以减少重复工作,提高开发和运维人员的协作效率。
  • 流程化:通过建立完善的开发和运维流程,可以确保软件的质量和可靠性。例如,Devops 倡导采用持续集成/持续交付 (CI/CD) 模式,可以快速发现和修复软件中的缺陷。
  • 自动化:通过自动化软件开发和运维的各个环节,可以提高效率和可靠性。例如,Devops 倡导采用自动化测试、自动化部署等工具和技术,可以减少人为错误,提高软件的质量和可靠性。

高效的软件工程化可以帮助开发团队在以下方面取得收益:

  • 提高软件质量和可靠性:通过标准化、流程化和自动化,可以减少软件开发过程中的错误和缺陷,提高软件的质量和可靠性。
  • 缩短软件交付周期:通过 CI/CD 模式,可以快速将软件从开发阶段交付到生产环境,* 缩短软件交付周期。
  • 降低软件开发成本:通过自动化,可以减少人力成本,降低软件开发成本。
  • 提高软件开发和运维团队的协作效率:Devops 通过统一的标准和流程,可以促进软件开发和运维团队的协作,提高效率。

软件工程发展的趋势,可以帮助软件开发团队提高软件的质量、可靠性、交付速度和成本效益。以下表格是列举了不同阶段可以使用到的工具:

阶段

工具类型

工具

功能

需求分析

用户需求收集

问卷调查、访谈、用户反馈等

收集用户需求

需求分析

需求分析

需求文档管理工具、需求分析模型工具等

分析用户需求,生成需求文档,识别潜在的风险和问题

设计

软件设计

UML 建模工具、架构设计工具等

生成设计文档,自动生成代码

编码

代码编辑器

Visual Studio Code、Sublime Text、JetBrains IDE 等

编写代码

测试

自动化测试

Selenium、JUnit、pytest 等

自动生成测试用例,分析测试结果

测试

测试辅助工具

AI 可以自动生成测试用例,并分析测试结果

部署

持续集成/持续交付 (CI/CD)

Jenkins、Travis CI、GitLab CI/CD 等

自动化部署流程,根据需求进行调整

运维

监控工具

Nagios、Zabbix、Prometheus 等

监控软件运行情况

运维

日志分析工具

ELK、ClickHouse、Fluentd、Logstash 等

分析软件运行日志

运维

自动化运维工具

Ansible、Chef、Puppet 等

自动化运维任务

随着人工智能(AI)和机器学习(ML)技术的不断发展,软件工程化也在发生一系列变化和改进

  1. AI 驱动的软件工程:AI 可以用于辅助生成代码、执行测试软件、识别错误和缺陷、优化软件性能等。
  2. ML 驱动的软件工程:例如,ML 可以用于预测软件开发风险、优化软件架构、自动生成文档等。
  3. DevOPS的智能化:DevOPS 可以结合 AI 和 ML 技术,例如,可以快速完成自动化 CI/CD 流程、识别软件安全漏洞、分析软件性能等。

随着AIGC技术的成熟,软件工程化的形态,将可能会进一步巨大的改变,例如:

  • AIGC 生成代码:AI 可以学习软件开发的模式和规律,从而自动生成代码。这可以提高软件开发的效率,并减少人为错误。
  • AIGC 驱动测试:通过对话式的指令,可以自动生成测试用例,生成软件性能分析报告等,
  • AIGC 驱动的软件工程全链路自动化:结合LangChain生态链中的,Agent/Tools,甚至可以像人一样听说读写,甚至能高度自动化完地成从用户需求分析、设计、编码、测试、部署到运维中的大部分基础工作。

相关的部分基于AIGC的软件与服务

软件/服务

功能

应用场景

GitHub Copilot

代码生成

编码

IntelliJ IDEA AI Assistant

智能提示

编码

Google AI Testable AI

自动化测试

测试

Langchain

自动生成代码、测试软件、识别错误和缺陷、优化软件性能等

软件开发的各个环节

以下是一些具体的基于AIGC的软件功能介绍:

  • GitHub Copilot:GitHub Copilot 是一个代码生成工具,可以帮助软件开发人员自动生成代码。
  • IntelliJ IDEA AI Assistant:IntelliJ IDEA AI Assistant 是一个智能提示工具,可以帮助软件开发人员提高编码效率。
  • Google AI Testable AI:Google AI Testable AI 是一个自动化测试工具,可以帮助软件开发人员发现和修复软件中的缺陷。
  • Langchain:Langchain 是一个人工智能软件工程平台,可以帮助软件开发人员自动生成代码、测试软件、识别错误和缺陷、优化软件性能等。 这些软件与服务可以帮助软件开发人员提高软件开发的效率和质量,并降低软件开发的成本。

开发环境

根据 Statcounter 的数据,2023年7月,Linux 服务器操作系统市场占有率为 76.4%,Windows 服务器操作系统市场占有率为 22.3%,除了部分传统企业中还存在一些Windows 服务器操作系统,考虑以下常见问题:

  • 开发环境系统与实际线上服务器系统相同的操作系统一致
  • 避免开发环境编码和实际线上系统编码不一致引发的问题
  • 以及Windows 作为一个商业操作系统,在开发环境方面存在以下缺点:系统封闭,安全性较低;命令行工具功能有限,不易管理。虚拟化/容器化运行环境支持有限等问题。因此,不推荐使用 Windows 作为开发环境。如果需要在 Windows 下作为开发调试环境,可以使用 WSL(Windows Subsystem for Linux)来替代,如果条件具备,更推荐使用Linux/MacOS作为开发环境。

DevOPS 实践

概述

推荐使用 git 作为代码仓库版本控制的理由如下:

  • 协作:Git 支持多用户协作,可以方便多个开发人员同时开发同一项目。
  • 版本控制:Git 是目前最流行的版本控制系统,具有强大的版本管理功能。
  • 可扩展性:Git 是开源软件,具有强大的可扩展性,可以根据需要添加新的功能和特性。

GitHub Actions 是 GitHub 提供的持续集成/持续交付 (CI/CD) 服务,可以帮助开发人员自动化代码构建、测试和部署过程。GitHub Actions 具有以下优势:

  • 免费使用:GitHub Actions 是 GitHub 提供的免费服务,个人用户可以无限制地使用。
  • 易于使用:GitHub Actions 使用 YAML 语言编写,语法简单,易于学习和使用。
  • 可扩展性强:GitHub Actions 支持各种 CI/CD 任务,可以根据需要进行扩展和定制。
  • 与 GitHub 集成:GitHub Actions 与 GitHub 深度集成,可以利用 GitHub 的众多功能,例如代码管理、版本控制、协作等。
  • 持续集成 (CI):GitHub Actions 可以自动构建代码,并使用单元测试和集成测试来验证代码质量。
  • 持续交付 (CD):GitHub Actions 可以自动将代码部署到本地、开发环境、测试环境或生产环境。

其他可选的有 Gitlab 以及国内的 CI/CD 服务:腾讯云CodeBuild、阿里云效、华为云 CodeBuild,可以根据需要选择。

除了上述工具之外,软件项目开发还可以使用其他一些工具,例如:

  • 项目管理工具:Jira、Trello 等。
  • 文档管理工具:Confluence、Wiki 等。
  • 协作工具:Slack、Zoom 等。

额外说明

如果是大陆区域使用Github因为GFW策略等原因,访问速度会比较慢,建议使用Xtls等开源项目加速器改善

环境信息

名称

服务

描述

代码仓库

github.com

存储代码、管理版本、协作开发

CI

github action

持续集成、构建、测试

CD

github action

持续交付/持续部署

部署环境

k3s/单机部署

用于部署和运行应用程序

GitHub Actions CICD

在代码仓库中,添加 GitHub Actions 工作流的 YAML 文件 .github/workflows/pipeline.yaml 就可以以触发运行 CICD Pipeline:

详细介绍下这个CICD Pipeline 构建测试和部署流程中的 jobs:

  • build:构建

该 job 负责构建应用程序的二进制文件。它首先克隆代码库,然后安装构建所需的依赖项。最后,它使用 make 命令构建二进制文件。

  • test:测试

该 job 负责运行应用程序的测试用例。它首先克隆代码库,然后安装测试所需的依赖项。最后,它使用 make test 命令运行测试用例。

  • Build Image:构建 Docker 镜像

该 job 负责构建并推送应用程序的 Docker 镜像。它首先克隆代码库,然后使用 Kaniko 工具构建 Docker 镜像。最后,它使用 docker push 命令推送 Docker 镜像到 Artifact Registry。

  • setup-k3s:设置 K3s 集群

该 job 负责设置 K3s 集群。它首先克隆代码库,然后安装 Ansible 工具。最后,它使用 Ansible playbook 创建 K3s 集群。

  • deploy-app: 部署应用程序

该 job 负责部署应用程序到 K3s 集群。它首先克隆代码库,然后使用 Ansible playbook 部署应用程序。

0 人点赞