【软件工程】第一章软件工程引论
文章目录
- 【软件工程】第一章软件工程引论
-
- [1. 什么是软件](#1. 什么是软件)
-
- [1.1 软件的定义](#1.1 软件的定义)
- [1.2 软件特征](#1.2 软件特征)
- [1.3 挑战与危机](#1.3 挑战与危机)
- [2. 什么是工程](#2. 什么是工程)
-
- [2.1 什么是工程](#2.1 什么是工程)
- [2.2 怎么做工程](#2.2 怎么做工程)
- [3. 什么是软件工程](#3. 什么是软件工程)
-
- [3.1 软件工程的提出](#3.1 软件工程的提出)
- [3.2 软件工程的经典定义](#3.2 软件工程的经典定义)
- [3.3 软件工程设计的知识域](#3.3 软件工程设计的知识域)
- [3.4 系统工程](#3.4 系统工程)
- [3.5 软件工程的全流程](#3.5 软件工程的全流程)
- [4. AI时代的软件工程](#4. AI时代的软件工程)
-
- [4.1 智能软件工程](#4.1 智能软件工程)
- [4.2 大模型的崛起](#4.2 大模型的崛起)
- [4.3 如何控制软件开发的复杂性](#4.3 如何控制软件开发的复杂性)
1. 什么是软件
1.1 软件的定义
平台和应用是软件发展的外在驱动力
1.2 软件特征
-
软件开发不同于硬件设计
与硬件设计相比,软件更依赖于开发人员的业务素质、智力以及人员的组织、合作和管理;同时对硬件而言,设计成本往往只占整个产品成本的一小部分,而软件设计占整个产品成本的大部分。
-
软件开发不同于硬件制造
硬件设计完成后就投入批量制造,制造也是一个复杂的过程,期间仍可能引入质量问题;而软件成为产品之后,其制造只是简单的拷贝而已,软件的存储和运输也非常简单。
-
软件开发不同于硬件维护
硬件在运行初期有较高的故障率,在缺陷修正后的一段时间中,故障率会降到一个较低的稳定的水平上,随着时间的改变,故障率将再次升高,这是因为硬件会受到磨损等损害,达到一定程度后只能报废。软件是逻辑的而不是物理的,虽然不会磨损和老化,但在使用过程中的维护却比硬件复杂得多;如果软件的内部逻辑关系比较复杂,在维护过程中还可能产生新的错误。
1.3 挑战与危机
-
软件面临的挑战
- 软件复杂性挑战
- 软件大规模挑战
- 软件高质量挑战
- 不确定性挑战
- 进度和敏捷开发的挑战
- 遗留系统(Legacy System)的挑战
- 分散团队的协同挑战
-
软件危机
-
当前软件实践的问题
- 软件直到测试前仅仅是忽略质量的现代技术。典型地说,软件工程师
- 没有计划他们的工作
- 匆匆地走过需求和设计
- 在编码时再进行设计
- 这些实践引入了大量的缺陷
- 有经验的工程师每7-10行代码就引入了一个缺陷
- 平均中等规模的系统存在着上千个缺陷
- 这些缺陷的大多必须靠测试发现
- 通常要花去一倍以上的开发时间
- 目前大多数的工作方式还像40年前一样
- 软件直到测试前仅仅是忽略质量的现代技术。典型地说,软件工程师
-
什么是有价值的软件
- 满足用户需求
- 解决用户的痛点
- 点燃用户的兴奋点
- 和竞争产品相比,具有创新和竞争优势
- 业务创新和技术创新
- 技术、政策和资源的优势
- 满足用户需求
2. 什么是工程
2.1 什么是工程
- 工程是对技术(或社会)实体的分析、设计、建造、验证和管理。
- 工程是一种组织良好、管理严密、各类人员协同配合、共同完成工作的学科。
- 它具有以下特征:
- 以价值为目标
- 高度的组织管理性
- 多种学科的综合
- 高度的实践性
2.2 怎么做工程
四个核心步骤:
- 理解问题:在软件工程领域,就是软件需求分析
- 设计方案:在软件工程领域,就是软件设计
- 实施方案:在软件工程领域,就是软件编码
- 监控方案的效能:在软件工程领域,就是软件测试和质量保障
3. 什么是软件工程
3.1 软件工程的提出
1968年,NATO会议上首次提出了"软件工程"的概念,标志着软件开发开始转向工程化。
3.2 软件工程的经典定义
软将工程就是为了经济地获得可靠的且能在实际机器上高效运行的软件而建立和使用的工程原理。
软件工程是将系统的、规范的、可量化的方法应用于软件的开发、运行和维护,即将工程化应用于软件。
软件工程就是应用计算机科学和数学的原理来经济有效地解决软件问题的一种工程。
3.3 软件工程设计的知识域
- 软件工程专业知识域
- 软件需求、软件架构、软件设计、软件架构
- 软件测试、软件运营、软件维护、软件配置管理
- 软件工程管理、软件工程过程
- 软件工程模型与方法、软件质量、软件安全
- 软件工程经济、软件工程职业实践
- 软件工程通用知识域
- 工程经济基础、计算基础
- 数学和工程基础
3.4 系统工程
- 在软件开发之前,必须了解该软件所处的外部"系统"
- 计算机系统包括计算机硬件、软件、人员、数据库、文档、规程等系统元素
- 系统工程的任务:
- 系统建模---系统模型
- 系统仿真
- 系统工程的表现形式
- 信息系统,关注企业,业务过程工程---业务模型
- 嵌入式系统,关注产品,产品工程---产品模型
- 多媒体系统,关注内容,内容工程---剧本
3.5 软件工程的全流程
4. AI时代的软件工程
4.1 智能软件工程
4.2 大模型的崛起
- 背景
- DeepMind的代码生成工具AlphaCode
- 采用Transformer模型,用大规模代码语料进行预训练
- 2021年底参加了Codeforces竞赛平台组织的10场实时编程比赛,总体排名位于前54.3%,击败了46%的人类参赛者
- 微软的AI结构对编程助手Github Copilot
- 采用OpenAI的Codex模型,一个基于GPT-3的代码预训练模型
- 2022年8月份结束了公测,开始商业化运作
- OpenAI的对话式大型语言模型Chat GPT和GPT-4
- Chat GPT最擅长的就是回答用户提出的问题
- ChatGPT通过了2022年的AP computer science A考试,得分32分,满分36,这门考试的难度等同于大学CS专业课第一学期难度
- DeepMind的代码生成工具AlphaCode
- 对软件工程的影响
- LLM的作用
- 开发的局部辅助,提升局部效率
- 有利于控制研发团队规模,保持小团队的优势
- 软件工程的内在复杂性和可变性等待性并没有发生本质上的变化
- 需求和设计的重要性变得更为重要
- LLM的作用
- 对软件工程师的影响:更需要从以下方面来强化自己的能力
- 抓住问题本质的能力
- 需求理解和需求分析的能力
- 架构设计和设计取舍的能力
- 代码审查的能力
4.3 如何控制软件开发的复杂性
- 软件开发常常是相当复杂、不可预测、难以计划的
- 软件开发的复杂性主要来源于:
- 技术的复杂性
- 技术不断发展
- 使用多项技术
- 需求的复杂性
- 需求模糊
- 需求不断变化
- 人的复杂性
- 技术的复杂性
- 虽然有了LLM和工具,但是软件开发的复杂性仍需要人去控制
- 如何控制复杂性
- 抽象
- 分解
- 迭代