软件工程概论
文章目录
- 软件的定义
- 软件的特点
- 软件的种类
- 软件工程的起源
- 软件工程的三个阶段
- 软件工程概念的提出
- 软件开发的本质
- 软件工程框架
- 软件工程的目标
- 软件工程的原则
- 软件工程的活动
软件的定义
计算机系统中的程序及其文档。
-
程序是计算任务的处理对象和处理规则的描述;
-
文档是为了便于了解程序所需的阐明性资料
软件的特点
- 软件是无形的、不可见的逻辑实体
- 它的正确与否,一直到程序在机器上运行才能知道
- 这给设计、生产和管理带来许多困难
- 软件是设计开发的,而不是生产制造的
- 软件在使用过程中没有磨损、老化的问题
- 软件是定制开发的
- 虽然这弓工业想着基于构建的构造模式发展
- 然而大多数软件仍是根据实际的顾客需求定制的
- 软件开发是复杂的
- 软件涉及人类社会的各行各业
- 软件开发常常涉及其他领域的专业知识,这对软件工程师提出了很高的要求
- 软件开发的成本高
- 软件易于复制
- 软件质量要求较高
- 软件的开发与运行都离不开相关的计算机系统环境
- 软件开发工作牵涉到很多社会因素
- 不同于一 般工程项目的是,在软件项目开发过程中,实际开发(编写代码)的成本只是整个工程成本的一小部分,甚至可以说是“ 冰山一角 ”。而软件测试、系统维护等任务将占据工程的很大一 部分成本 。
软件的种类
按照软件的功能划分,软件一 般可以分 为系统软件、支撑软件和应用软件三类:
-
系统软件
- 居于计算机系统中最靠近硬件的一层。
- 其他软件一般都通过系统软件发挥作用。它与具体的应用领域无关,如编译程序和操作系统等
- 编译程序把程序人员用高级语言书写的程序翻译成与之等价的、可执行的低级语言程序
- 操作系统则负责管理系统的各种资源、控制程序的执行
-
支撑软件
- 支撑软件的开发、维护与运行的软件。
- 70年代后期发展起来的软件开发环境以及后来的中间件则可被看成现代支撑软件的代表
- 软件开发环境主要包括环境数据库、各种接口软件和工具组。三者形成整体,协同支撑软件的开发与维护
- 中间件是一种软件,它处于系统软件(操作系统和网络软件)与应用软件之间,它能使远距离相隔的应用软件可协同工作( 互操作)
-
应用软件
- 特定应用领域专用的软件
软件工程的起源
早期计算机程序
- 在1946年计算机刚诞生时,人们采用机器码编制程序,根本没有独立的软件的概念
- 机器码指令只是为了驱动计算机硬件工作,就象人们调节电视机、录像机、洗衣机等家用电器的按钮一样
- 1947年,冯·诺依曼首先提出用流程图描述计算机的运行过程,才使人们认识到程序设计是完全不同于硬件研制的另一项工作。从此以后,软件的开发和研究才逐渐开始独立地进行。
现在的信息产业
- 微电子是基础,计算机和网络是载体,软件是核心。
软件工程的三个阶段
- 个人程序时期:这个时期大致可追溯到计算机的早期历史,特别是在上世纪50年代和60年代。在这个时期,计算机科学家和程序员通常是个人从事软件开发的主要从业者。他们独立编写和维护程序,通常是为了满足个人或特定组织的需求。由于硬件资源和开发工具的有限性,软件开发通常是一项相对较小规模和个人驱动的活动。
- 个人驱动:软件开发主要由个人程序员完成,通常是计算机科学家或爱好者。
- 缺乏规范:开发过程相对非正式,缺乏严格的方法和流程。
- 小规模项目:项目通常较小,目标是解决特定问题或需求。
- 有限的硬件资源:开发受到计算机硬件性能的限制。
- 缺乏大规模协作:通常缺乏多人协作和团队合作。
- 软件作坊时期:软件作坊时期大致涵盖了上世纪70年代和80年代。在这个时期,软件开发开始逐渐从个人领域扩展到小型团队和组织。软件开发变得更加专业化,团队协作变得更为普遍。然而,开发过程仍然相对不够规范化,通常缺乏严格的项目管理和质量控制方法。
- 小型团队:软件开发逐渐转向小型团队和组织,而不仅仅是个人。
- 专业化:出现了更多专业的软件开发人员和团队,开发逐渐成为职业。
- 有限的流程控制:项目管理和质量控制仍然不够严格。
- 多样性的项目:软件应用范围扩大,包括商业应用、科学计算等。
- 有限的工程化:虽然有更多的团队参与,但开发过程仍然不够规范化。
- 软件工程时期:软件工程时期可以追溯到上世纪80年代末至今。在这个时期,对软件开发过程进行了深入的研究和发展,出现了更多的开发方法和最佳实践。软件工程强调了系统化的方法,包括需求分析、系统设计、编码、测试、维护等方面的严格流程。这一时期还引入了面向对象编程、设计模式和软件开发生命周期等概念,旨在提高软件质量、可维护性和可重用性。软件工程方法也导致了更多的工程化和团队合作。
- 工程化方法:引入了系统化的软件开发方法,强调需求分析、系统设计、编码、测试和维护等阶段的重要性。
- 严格的项目管理:引入了项目管理技术,如进度追踪和资源分配。
- 质量和可维护性:注重软件质量、可维护性和可重用性,采用更严格的测试和验证方法。
- 面向对象编程:引入了面向对象编程思想和设计模式,提高了代码的组织和可扩展性。
- 团队合作:强调多人协作,开发团队中有各种不同的专业角色,如开发人员、测试人员和项目经理。
软件工程概念的提出
随着计算机应用领域的进一步扩大,软件的规模和复杂性也在不断增加
在软件开发的领域出现了一些现象(所谓的软件危机):
- 软件质量差,可靠性难以保证
- 成本难以控制,很少有在预算内完成的
- 开发进度难以把握,周期拖得很长
- 可维护性较差,维护人员和费用不断增加
1968年,NATO(North Atlantic Treaty Organization,北大西洋公约组织)在联邦德国Garmisch-Partenkirchen举行的关于软件开发的会议上,首次提出了软件工程的术语,标志着软件工程作为一门学科的正式出现,至今已有40年的历史了。软件工程概念软件工程概念的提出其目的是倡导以工程的原理、 原则和方法进行软件开发,以解决软件危机。
软件开发的本质
-
问题域到不同抽象之间概念和计算逻辑的映射
-
实现问题域中的概念和处理逻辑到运行平台的概念和处理逻辑的映射
当我们得到一个问题域并且想要用软件开发来解决这个问题,我们必须一层一层向下抽象,抽象成软件层面可以理解的东西。所以建模是解决问题的一般途径:运用所掌握的知识, 通过抽象,给出该问题的一个结构
- 模型是在特定意图下所确定的角度和抽象层次上对物理系统的描述,通常包含对该系统边界的描述, 给出系统内各模型元素 以及它们之间的语义关系
之所以要一层一层的向下抽象,是为了控制开发的的复杂性。一个抽象层是一组确定的术语定义的。
软件工程框架
软件工程可以被定义为一个包含三个主要元素的三元组,这些元素是目标、原则和活动。下面是对这三个元素的简要说明:
软件工程的目标
目标是指在软件工程过程中所期望实现的结果或成果。这些目标通常与开发和维护高质量、可靠、安全、可维护和可扩展的软件系统有关。软件工程的目标可以根据项目的特定需求和约束而变化,但通常包括以下方面:
- 交付高质量的软件产品。
- 提高开发效率和生产力。
- 减少软件开发和维护的成本。
- 确保软件的安全性和可靠性。
- 使软件易于维护和扩展。
软件工程的原则
原则是指软件工程的基本准则和指导原则,用于指导软件开发和维护过程,以实现上述目标。这些原则通常代表着最佳实践和经验教训,可以帮助开发团队在整个软件生命周期中做出明智的决策。一些常见的软件工程原则包括:
- 模块化原则:将软件分解为小的可管理的模块。
- 高内聚低耦合原则:模块应该具有高内聚性(相关功能放在一起)和低耦合性(模块之间的依赖关系最小化)。
- 单一责任原则:每个模块或类应该只有一个单一的责任。
- 开放封闭原则:软件应该对扩展开放,但对修改封闭。
- 面向对象原则:使用面向对象的方法进行软件设计和开发。
软件工程的活动
活动是指在软件工程过程中执行的具体任务和活动,以实现上述目标和遵循原则。软件工程的活动包括项目计划、需求分析、系统设计、编码、测试、部署、维护等一系列步骤和阶段。这些活动通常根据软件开发生命周期模型(如瀑布模型、敏捷开发等)进行组织和管理。
综合起来,软件工程的三元组概念强调了实现高质量软件的目标、遵循基本原则以及执行一系列活动来实现这些目标的重要性。这个三元组为软件开发提供了一个结构化的方法,有助于项目团队在整个软件生命周期中取得成功。
相关文章:

软件工程概论
文章目录 软件的定义软件的特点软件的种类软件工程的起源软件工程的三个阶段软件工程概念的提出软件开发的本质软件工程框架软件工程的目标软件工程的原则软件工程的活动 软件的定义 计算机系统中的程序及其文档。 程序是计算任务的处理对象和处理规则的描述; 文档…...

仅个人记录:复现dotspatialdemo、打包、
复现dotspatialdemo 原始文件 一、新建项目、工具箱设置,项目引用等看上一篇 二、根据Form1.Designer.cs设计界面Form1.cs[设计] SplitContainer控件:将容器的显示区域分成两个大小可调的、可以向其中添加控件的面板。 legend控件:图例 map控…...

华为云云耀云服务器L实例评测|Elasticsearch的springboot整合 Kibana进行全查询和模糊查询
前言 最近华为云云耀云服务器L实例上新,也搞了一台来玩,期间遇到各种问题,在解决问题的过程中学到不少和运维相关的知识。 在前几期的博客中,介绍了Elasticsearch的Docker版本的安装,Elasticsearch的可视化Kibana工具…...
C++统一初始化和初始化列表
一直对C初始化使用圆括号和花括号的区别有所疑惑,参考书籍和博客简单总结一下 文章目录 常见的初始化操作统一初始化(Uniform Initialization)初始化列表(Initializer Lists) 常见的初始化操作 对于一个基础数据类型进行初始化,比如 int: i…...

【重拾C语言】六、批量数据组织(一)数组(数组类型、声明与操作、多维数组;典例:杨辉三角、矩阵乘积、消去法)
目录 前言 六、批量数据组织——数组 6.1 成绩统计——数组类型 6.1.1 数组类型 6.1.2 数组声明与操作 6.1.3 成绩统计 6.2 统计多科成绩——多维数组 6.3 程序设计实例 6.3.1 杨辉三角形 6.3.2 矩阵乘积 6.3.3 消去法 6.4 线性表——分类与检索 前言 ChatGPT C语…...
C++算法:寻找两个正序数组的中位数
题目 寻找两个正序数组的中位数 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 示例 1: 输入:nums1 [1,3], nums2 [2] 输…...

2.1 关系数据结构及形式化定义
思维导图: 2.1.1 关系 笔记: 关系数据库模型是一个简单但强大的方式来表示数据及其之间的关系。下面是这节的关键内容: - **关系模型核心概念** * 关系数据模型的核心是“关系”,它在逻辑上表现为一个二维表。 * 此表中&a…...

“揭秘淘宝店铺所有商品接口:一键获取海量热销宝贝信息!“
淘宝店铺所有商品接口可以通过shop id或店铺主链接获取到整店商品,数据包括:商品ID,图片地址,店铺标题,优惠价,价格,销量,宝贝链接等整个店铺的商品。 要使用这个接口,需…...

跟着播客学英语-Why I use vim ? part two
在上一期作者讲到了他使用 Vim 的主要原因是提高效率,不需要再去使用鼠标,今天我们继续上次未听完的内容: if you type Vi, thats going to be alias to Vim anyway by default theres, not really a good reason for you to use vi that I c…...

【网络通信三要素】TCP与UDP快速入门
网络通信三要素 1.什么是网络编程? 可以让设备中的程序,与网络上其他设备中的程序进行数据交互,从而实现网络通信的手段,java.net.*包下提供了网络编程的解决方案 2.基本的通信架构 基本的通信架构有2种形式:CS架构…...
k8s集群的简单搭建
K8S简单集群搭建 前提条件 windos11电脑,内存16g以上安装vmware虚拟机软件安装三个centos7虚拟机,分配硬盘40g,内存4g,CPU4核心网络均采用NAT模式(新建虚拟机默认的模式) centos7镜像下载:https://mirrors.tuna.tsi…...

语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
文章目录 mask图像介绍步骤代码 mask图像介绍 根据 mask 图像来画分割对象的外接椭圆是一种常见的图像分割任务。Mask 图像通常是一个二值图像,其中包含了感兴趣对象的像素。通常情况下,白色像素表示对象,黑色像素表示背景。 步骤 以下是一…...

Nosql redis高可用和持久化
Nosql redis高可用和持久化 1、redis高可用2、redis持久化2.1redis持久化2.2Redis 持久化方法2.3RDB 持久化2.3.1RDB持久化工作原理2.3.2触发条件2.3.3其他自动触发机制2.3.4执行流程2.3.5启动时加载 2.4AOF 持久化2.4.1AOF持久化原理2.4.2开启AOF2.4.3执行流程2.4.4文件重写的…...
软件工程(1、2;5~7小测参考答案)
目录 软件工程第1、2章小测 需求工程第5-7章小测 软件工程第1、2章小测 一 单项选择题(12分) 1、下列关于软件开发的描述不正确的是()。(1分) 软件是独立于计算机硬件的一部分,但它又依赖于计算机硬件。 软件既是一种复杂的逻辑实体,又是一种工具。 软件的核心是程序,…...
服务器存储面临的两大难题
服务器存储面临的两大难题 服务器存储为核心的IT系统承受着业务发展带来的巨大压力: 随着业务发展,IT应用数量不断增多,当前数据中心的IT基础设施愈加复杂,服务器、存储等设备的数量不断增加。服务器与存储管理更加复杂:随着业务应用对IT基础…...
Blind Signature盲签名与fabric区块链结合的应用
盲签名的概念 首先由 David Chaum 于1982年提出,盲签名实现了签名者对发送者的消息进行签名,却不能知道签名者消息的具体内容。 相当于将文件放入信封,签名者在信封上对文件进行签名,而不知道具体的文件内容。 盲签名的实现方式…...

ueditor
下载文件 文档 UEditor入门部署 入门部署和体验 1.1 下载编辑器 到官网下载 UEditor 最新版:http://ueditor.baidu.com/website/download.html#ueditor 1.2 创建demo文件 解压下载的包,在解压后的目录创建 demo.html 文件,填入下面的…...

2023年台州市第三届网络安全技能大赛(MISC)—Black Mamba
前言:当时比赛没有做出来现在来复现一下 就当记录一下(这个思路没想到) Black Mamba: 一张图片 常规得分离,属性,LSB,盲水印等都尝试过 无果! 考点:异或解密࿰…...

这道面试题工作中经常碰到,但 99% 的程序员都答不上来
小时候都被问过一个脑筋急转弯,把大象放进冰箱有几个步骤?我们一开始都会抓耳挠腮,去想着该如何把大象塞进冰箱。最终揭晓的答案却根本不关心具体的操作方法,只是提供了 3 个步骤组成的流程,「把冰箱打开,把…...
Linux安装单机PostgreSQL15.4
1. 联网rpm安装 1.1.关闭服务 ## 关闭防火墙 systemctl stop firewalld.service systemctl disable firewalld.service ## 关闭 selinux cat /etc/selinux/config SELINUXdisabled1.2.安装yum源 yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...