02-历史与演变

Charlie

1. 软件开发三大阶段

  1. 软硬件一体化阶段(50年代~70年代)
    1. 软件完全依附于硬件
    2. 软件作坊
  2. 软件成为独立的产品(70年代~90年代)
  3. 网络化和服务化(90年代中期迄今)

软件开发方法=软件过程

2. 软硬件一体化

2.1. 典型特征

  • 软件应用典型特征
    1. 软件支持硬件完成计算任务
    2. 功能单一
    3. 复杂度有限
    4. 几乎不需要需求变更
  • 软件开发典型特征
    1. 硬件太贵
    2. 团队以硬件工程师和数学家为主

2.2. 典型的软件过程和实践

  1. Measure twice, cut once“:对应代码审查,因为早期开发过程中机器很贵/人力资源便宜

image.png

3. 软件作坊/软硬件一体化后期

3.1. 典型特征

  • 软件应用典型特征
    1. 功能简单
    2. 规模小
  • 软件开发的典型特征
    1. 很多非专业领域的人员涌入软件开发领域
    2. 高级程序设计语言的出现
    3. 质疑权威文化的盛行

3.2. 典型软件过程和实践

  1. code and fix:非常适合小规模团队
  2. 软件工程和软件危机:code and fix不适合大型软件开发

4. 软件成为独立产品

4.1. 典型特征

  1. 摆脱了硬件束缚(OS)
  2. 功能强大
  3. 规模和复杂度剧增
  4. 个人电脑出现 => 普通人成为软件用户
    1. 需求多变
    2. 兼容性要求
  5. 来自市场的压力

4.2. 典型软件过程和实践

  1. 形式化方法
  2. 结构化程序设计和瀑布模型

4.2.1. 瀑布模型

  • 最早期的瀑布模型(Royce Waterfall Model)其实可以回溯,有试错过程。瀑布模型是一个家族,由简单的瀑布模型也有复杂的瀑布模型
  • 问题和不足
    1. 形式化在扩展和可用性方面存在不足
    2. 瀑布模型重文档、慢节奏
  • 左边才是真正的瀑布模型
    • image.png

4.2.2. 成熟度模型

  • 成熟度模型:列出很多最佳实践,划分为5个等级,123低等级(眼前),45高等级(未来)

    • 几乎可以描述所有“可以用过程描述”的事情
    • level 1 开发相对混乱,依赖个人英雄主义,没有过程概念,救火文化盛行
    • level 2 项目小组体现出项目管理特征,有项目计划和跟踪、需求管理、配置管理等
    • level 3 公司层面有规范,项目小组可裁剪组织的规范
    • level 4 构建预测模型,以统计过程控制的手段来管理过程
    • level 5 继续应用统计方法识别过程偏差,找到问题根源并消除,避免未来继续发生类似问题
  • “项目进度落后20%,就要加班”是 level1/2/3, 只根据已经发生的事情来决策,没有模型只有数据,属于低等级的管理

    • 这里的20%是指团队整体觉得进度整体落后,只是感觉
  • 分析

    1. CMMI是过程改进模型而不是软件过程或软件过程模型
    2. CMMI不是过程优劣的标准,也不适合用作公司之间的能力比较。CMMI表示的不是公司的绝对能力,刻画的是公司再满足它自己的业务目标的能力。
      • 一线大公司很可能是CMMI一级。而初创公司可能比起大公司更能满足自己的商业目标。
      • 虽然可以为了提高等级降低商业目标,但是招标时CMMI等级不是唯一标准。
      • 商业目标相同时,可以使用等级比较,如选择供应商
    3. 为什么CMMI VS. Agile 是个伪命题?
      • CMMI是软件过程改进模型,描述一个组织的过程管理从不成熟到成熟的路线图;大部分敏捷方法是软件开发方法,两者是不同性质的事物,说两者对立是不合适的。

Characteristics_of_Capability_Maturity_Model.svg

PDCA模型

  • 步骤
    1. 分析问题。找出问题
    2. 分析影响质量的原因
    3. 找出措施
    4. 拟定措施计划
    5. 执行措施,执行计划
    6. 检查效果,发现问题
    7. 总结经验,纳入标准
    8. 遗留问题转入下期PDCA循环
      image.png

IDEAL模型

解决了软件组织在各种质量改进环境下的需要,包括软件过程改进周期中的五个阶段。

  1. I: Initiating 初始
  2. D: Diagnosing 诊断
  3. E: Establishing 建立
  4. A: Acting 执行
  5. L: Leveraging 调整

image.png

5. 服务化和网格化

5.1. 典型特征

  • 软件应用特征
    1. 功能复杂,规模更大
    2. 用户数量急剧增加(这会带来什么问题)
    3. 快速演化和需求不确定
    4. 分发方式的变化(SaaS)
      • 功能上线到发布时间很短,对质量要求更高

5.2. 典型软件过程和实践

5.2.1. 迭代式开发

  • 迭代式开发:大型软件开发系统的开发过程也是一个逐步学习和交流的过程,软件系统的交付不是一次完成,而是通过多个迭代周期,逐步完成交付。
    • 学习和交流:甲方迭代开发的过程中越来越熟悉软件系统,乙方越来越理解甲方的需求

迭代和增量的区别:迭代重点在学习和交流

TDD:测试驱动开发

5.2.2. 敏捷开发

  • 雪鸟会议和敏捷宣言

    1. 个体和互动胜过流程和工具
    2. 可以工作的软件胜过详尽的文档
    3. 客户合作胜过合同谈判
    4. 响应变化胜过遵循计划
    5. 尽管右项有其价值, 我们更重视左项的价值
      • 没有第五项就是错的
  • 代表方法

    • XP(eXtreme Programing)
      • 偏重与一些工程实践的描述,每周工作时间不超过40h,连续加班不超过两周;结对编程;测试驱动开发;持续集成
    • Scrum
      • 管理框架和管理实践
      • 只有管理,没有技术
    • Kanban
      • 精益生产的具体体验
      • 典型实践:可视化工作流,限定WIP,管理周期时间
  • 敏捷方法具有的特征

    1. 小周期迭代
    2. 快速响应变更
    3. 价值交付
    4. 自动化

5.3. 开源软件开发方法

  • 一种基于并行开发模式的软件开发的组织与管理方式

  • Linus定律:只要有足够的开发者和测试者,几乎所有问题都会被发现

  • 代码管理:严格的代码提供社区审核制度

    • 真正能对系统建立信心的是评审而不是测试
  • 演化

    • 内部开源:早期公司项目没那么多,时间没那么紧张
    • 众包

6. 当前软件应用的典型特征

  • 应用特征
    1. 进一步服务化和网格化(移动是主流)
    2. 用户需求的多样性进一步凸显
    3. 软件产品和服务的地位变化
    4. 错综复杂的部署环境
      • 解决了数量的问题,但是有新的困难如容量预测
    5. 近乎苛刻的用户期望
  • 开发特征
    1. 空前强大的开发和部署环境
    2. 盛行分享和开源
    3. 潜在支持获得长足进步(AI,大数据,云计算)

7. 问题

  1. 不属于软件开发的本质难题?

    • 不可见性、复杂性、一致性、可变性
    • 没有质量
  2. 软硬件一体化阶段的典型实践

    • Code and fix
  • 标题: 02-历史与演变
  • 作者: Charlie
  • 创建于 : 2024-03-05 10:03:00
  • 更新于 : 2024-07-05 12:55:04
  • 链接: https://chillcharlie357.github.io/posts/5e3ee645/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论