2021-软件质量管理-Lec-2 软件过程的历史演变和经典工作
Lec-2 软件过程的历史演变和经典工作
1. 再读《没有银弹》
- 软件开发有很多困难,但是本质难题是
- 不可见性:软件项目是一个逻辑实体
- 复杂性:实体数量众多
- 可变性
- 一致性
- 进一步分析
- 三个本质难题因项目而异
- 四大本质难题相互促进
- 本质难题变化带动软件方法(过程)演变
- 本质难题无法彻底解决
2. 软件发展三大阶段
- 软硬件一体化阶段(50年代~70年代)
- 软件完全依附于硬件
- 软件作坊
- 软件成为独立的产品(70年代~90年代)
- 网络化和服务化(90年代中期迄今)
2.1. 软件完全依附于硬件
2.1.1. 典型特征
- 软件应用典型特征
- 软件支持硬件完成计算任务
- 功能单一
- 复杂度有限
- 几乎不需要需求变更
- 软件开发典型特征
- 硬件太贵
- 团队以硬件工程师和数学家为主
2.1.2. 典型软件过程和实践
- Measure twice, cut once,相同的软件工程实践:code review & inspection
- specification和参数、代码等部分相关
2.2. 软件作坊
2.2.1. 典型特征
- 软件应用典型特征
- 功能简单
- 规模小
- 软件开发典型特征
- 很多非专业领域的人员涌入软件开发领域
- 高级程序语言出现
- 质疑权威文化盛行
2.2.2. 典型软件过程和实践
- Code And Fix
- 软件危机和软件工程:Code And Fix不适合大型软件项目开发
2.3. 软件成为独立产品
2.3.1. 典型特征
- 软件应用特征
- 摆脱了硬件束缚(OS)
- 功能强大
- 规模和复杂度剧增
- 个人电脑出现 => 普通人成为软件用户
- 需求多变
- 兼容性要求
- 来自市场的压力
2.3.2. 软件典型过程和实践
- 方法之一:形式化方法
- 方法之二:结构化设计和瀑布模型
- 右侧不是生命周期模型
- 瀑布模型是左侧的部分:每个阶段都有一个往回的箭头
- 生命周期模型
- 是什么:一个对软件过程的人为划分
- 主要作用:便于传达,复制成功
- 说法是错误的:lean development说:其实royee提出瀑布生命周期模型的本意是该生命周期模型不适合软件开发
- royee
- 本意是瀑布模型不是一个单一的生命周期模型,是很多的元素的融合,是系列的生命周期模型,包括编码改错、改进等等。
- 软件团队在选择生命周期模型时,应当结合上下文选择生命周期模型,往往越复杂,有越多的元素,自己选择最合适的。
- 大部分的项目团队轻视了项目的复杂和挑战,选择了一个简单的不适用的瀑布模型。
- 问题和不足(效率和质量)
- 形式化存在扩展性和可用性方面存在不足
- 瀑布模型成为一个重文档,慢节奏的过程。
- 成熟度模型(最开始是CMM,现在是CMMI)
- 什么是有管理的:状态获取?
- 管理的是三个要素:目标、状态和纠偏
- CMMI的3级中的标准化目的不是简单的替换
- CMMI从2级升级到3级的原因:固化最佳实践,对小组而言则是能够更快地学习其他的做法
- CMMI 3级的重点是已定义
- CMMI 4级我们希望能够看到一个预测模型
- 4级和5级更多是根据结果(未来)来进行管理
- 2级和3级关注的是当前的状态
- 分级
- 第一级:初始级别
- 第二级:和项目有关
- 第三级:促成共享,来自于团队标准
- 第四级:定量管理,提升对未来结果的一种预测,对偏差的预测
- 一些讨论:https://www.jianshu.com/p/b7407257eedb
- CMMI是过程改进模型而非软件过程或者软件过程模型,说法怎么样?对的,CMMI指导软件过程改进,不指导开发。
- CMMI不是过程优劣的标准,也不适合用作公司之间的能力比较,说法怎么样?对的,CMMI本身是有评级。(美国国防部订单招标要求企业至少达到CMMI的3级。因为公司的能力需要绝对东西,也就是能力强,能力弱,而CMMI衡量的是相对的水平,CMMI仅仅关注在本公司的目标下的等级
- 为什么CMMI VS. Agile是一个伪命题?
2.4. 网络化和服务化
2.4.1. 典型特征
- 软件应用特征
- 功能更复杂,规模更大
- 用户数量急剧增加(这会带来什么问题?)
- 快速演化和需求不确定
- 分发方式的变化(SaaS)
2.4.2. 典型软件过程和实践
- 迭代式:大型软件系统的开发过程也是一个逐步学习和交流的过程,软件系统的交付不是一次完成,而是通过多个迭代周期,逐步来完成交付。
- 雪鸟会议和敏捷宣言
- 个体和互动胜过流程和工具
- 可以工作的软件胜过详尽的文档
- 客户合作胜过合同谈判
- 响应变化胜过遵循计划
- 也就是说,尽管右项有其价值,我们更重视左项的价值。
- 请务必关注最后一句话,非常重要
- XP(eXtreme Programing) 方法
- 偏重于一些工程实践的描述
- SCRUM
- 管理框架和管理实践
- Kanban
- 精益生产(丰田制造法)的具体实现
- 可视化工作流、限定WIP、管理周期时间
- 马丁提出了微服务架构
- 开源软件开发方法:是一种基于并行开发模式的软件开发的组织与管理方式
- Linus 定律:如果有足够多的beta测试者和合作开发者,几乎所有问题都会很快显现,然后自然有人会把它解决。
- 早发布,常发布,倾听用户的反馈 、把你的用户当成开发合作者对待,如果想让代码质量快速提升并有效排错,这是最省心的途径、设计上的完美不是没有东西可以再加,而是没有东西可以再减
- 代码管理:严格的代码提交社区审核制度
- 一些演化
- 内部开源(inner source)
- 众包(Crowdsourcing)
3. 当前软件发展现状
- 软件应用典型特征
- 进一步服务化和网络化(移动是主流)
- 用户需求多样化进一步凸显
- 软件产品和服务的地位变化
- 错综复杂的部署环境
- 近乎苛刻的用户期望
- 多:功能丰富,个性化
- 快:快速使用,及时更新,快速解决问题
- 好:稳定,可靠,安全,可信
- 省:用户的获得成本低,最好免费
- 空前强大的开发和部署环境——XaaS
- IaaS
- PaaS
- SaaS, FaaS
- 盛行共享和开源
- 潜在支撑获得了长足进步(AI,Bigdata, Cloud,etc.)
4. 典型DevOps实践和方法
- 方法论基础是敏捷软件开发、精益思想以及看板Kanban方法。
- 以领域驱动设计为指导的微服务架构方式
- 大量虚拟化技术的使用
- 一切皆服务XaaS(X as a Service)的理念指导
- 构建了强大的工具链,支持高水平自动化
5. 课程小论文
- 从软件发展的三大历史阶段以及软件过程的演变当中,我们可以总结出哪些规律性的东西?
2021-软件质量管理-Lec-2 软件过程的历史演变和经典工作
https://spricoder.github.io/2022/01/09/2021-software-quality-management/2021-software-quality-management-Lec-2%20%E8%BD%AF%E4%BB%B6%E8%BF%87%E7%A8%8B%E7%9A%84%E5%8E%86%E5%8F%B2%E6%BC%94%E5%8F%98%E5%92%8C%E7%BB%8F%E5%85%B8%E5%B7%A5%E4%BD%9C/