Software Engineering
定义
Software Engineering is the systematic application of engineering approaches to the development of software. --Wikipedia
软件工程是一系列软件开发的工程方法的系统性应用,它强调系统性地、有组织地、标准化地对软件进行开发、演进和运维。 软件工程与计算机科学的区别是,计算机科学着重于学习算法、运算硬件以及运算本身,而软件工程着重于计算机科学知识的实践问题。简单说,计算机科学教我们计算机如何工作,而软件工程教我们怎么用计算机工作。
工程重在实践和交付。对于软件工程来说,低成本、高质量的交付产品是最终目标。因此,软件工程的理论和方法贯穿软件的整个生命周期:
- 需求分析
- 系统设计
- 开发测试
- 部署运维
- 系统维护
软件工程的定义取自IEEE的标准定义,虽然随着技术演进,这个定义有一定争议性,但我们还是取用此标准加以解释
背景
- 1946年,曼哈顿计划孕育了世界上第一台可编程的计算机——ENIAC
- 1948年,世界上第一个软件在曼切斯特大学运行
- 五十年代初期,第一个操作系统在IBM的主机上运行
- 1958年,统计学家 John Tukey 创造了
software
这个词 - 六十年代,软件行业迅速发展,软件质量稂莠不齐,出现 软件危机
- 六十年代末期,为了应对 软件危机 ,软件工程 应运而生
软件危机 主要包括以下问题:
- 没有标准和流程,大量软件项目因预算超支等问题失败
- 大型软件维护成本过高
- 交付的软件不可靠,无法满足需求
- 软件迭代速度跟不上需求变化速度
- 软件开发速度跟不上需求增长速度
工程师们尝试在实践中去制定一套需求分析、软件开发和系统交付的衡量标准,这就是 软件工程。
知识体系
软件工程发展的过程中,产生了许多概念和方法论,我们无暇一一例举,但有一点是清晰的:所有的方法论都是围绕 软件生命周期 展开的。 软件生命周期(SDLC) 是一种软件开发过程的方法论,主要包含以下过程:
- 需求分析
- 规划
- 设计
- 开发
- 测试
- 部署维护
这张图的划分并不严格,实际上我们也没法对所有事物进行严格划分,因为用发展的眼光看事物的话, 定义 是一直在变化的。 横看成岭侧成峰,同一个事物,从不同角度解析,可以得出不同的结论。比如图中的软件架构的三个子项 微服务 、 事件驱动 和 云服务 架构,他们并不是互斥的关系,微服务架构也可以设计为事件驱动型架构。换个角度,软件架构可划分的角度很多,远不止罗列的这三项。这个图之所以画出这一部分,主要还是想和大家呈现,我们用到和经常接触的一部分概念。
从图中的关系可以看到,所有的工程方法都是为提升 软件质量 服务。
软件生命周期
Software Development Life Cycle
工程
软件设计
软件设计8原则:
- Keep It Simple
- Don’t Repeat Yourself
- You Aren’t Gonna Need It
- SOLID
- Single Responsibility Principle
- Open Closed Principle
- Liskov Substitution Principle
- Interface Segregation Principle
- Dependency Inversion Principle
设计模式
过程模型
敏捷模型
敏捷方法:
- SCRUM
- XP
- FDD
- LEAN
- DEVOPS
软件质量
8个指标:
- 代码质量
- 可靠性
- 性能
- 可用性
- 正确性
- 可维护性
- 完整性
- 安全性
通用标准:
- CMMI 软件质量分级
目标和意义
随着硬件水平的进步和市场规模的变化,软件工程的理论也在与时俱进。理论是同行前辈经验的积累,选择有效的理论进行实践,可以有效提升实际生产中的效率。但理论的实践方法不胜枚举,如何在实践环节中,选择适合团队的方法进行组合,最终形成最佳实践,这是我们应该努力探索的。