软件工程是应用计算机科学、数学及管理科学等原理,开发软件的工程。软件工程借鉴传统工程的原则、方法,以提高质量、降低成本。其中,计算机科学、数学用于构建模型与算法,工程科学用于制定规范、设计范型(paradigm)、评估成本及确定权衡,管理科学用于计划、资源、质量、成本等管理。
软件工程是研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件,以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来。
软件工程是一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科。它涉及到程序设计语言、数据库、软件开发工具、系统平台、标准、设计模式等方面。
软件工程的核心知识(SWEBOK)
ACM 与 IEEE Computer Society 联合修定的 SWEBOK[12](Software Engineering Body of Knowledge)提到,软件工程领域中的核心知识包括:
- 软件需求(Software requirements)
- 软件设计(Software design)
- 软件建构(Software construction)
- 软件测试(Software test)
- 软件维护与更新(Software maintenance)
- 软件构型管理(Software Configuration Management, SCM)
- 软件工程管理(Software Engineering Management)
- 软件开发过程(Software Development Process)
- 软件工程工具与方法(Computer-Aided Software Engineering, CASE)
- 软件品质(Software Quality)
软件工程与计算机科学
软件的开发到底是一门科学还是一门工程,这是一个被争论了很久的问题。实际上,软件开发兼有两者的特点。但是这并不意味着它们可以被互相混淆。很多人认为软件工程基于计算机科学和信息科学就如传统意义上的工程学之于物理和化学一样。在美国,大约40%的软件工程师具有计算机科学的学位。在世界其他地方,这个比例也差不多。他们并不一定会每天使用计算机科学方面的知识,但是他们每天都会使用软件工程方面的知识。
软件工程 | 计算机科学 | |
---|---|---|
目标 | 在时间、资源、人员这3个主要限制条件下构建满足用户需求的软件系统。 | 探索正确的计算和建模方法,从而改进计算方法本身。 |
产品 | 软件(比如办公包和编译器)。 | 算法(比如希尔排序法)和抽象的问题(比如哲学家进餐问题)。 |
进度与时间表 | 软件项目都有特定的进度与时间表 | 研究项目一般不具有设置的进度与时间表 |
关注点 | 软件工程关注如何为用户实现价值。 | 软件理论关注的是软件本身运行的原理,比如时间复杂度,空间复杂度,和算法的正确性。 |
变化程度 | 随着技术和用户需求的不断变化,软件开发人员必须时刻调整自己的开发以适应当前的需求。同时软件工程本身也处于不断的发展中。 | 对于某一种特定问题的正确解决方法将永远不会改变。 |
需要的其他知识 | 相关领域的知识。 | 数学。 |
著名的探索者和教育家 | Barry Boehm, David Parnas, and Frederick P. Brooks。 | Edsger Dijkstra, 高德纳, Robert Tarjan, Peter Slater,艾伦·图灵,姚期智。 |
著名的实践者 | John Backus, Dan Bricklin, 蒂姆·伯纳斯-李, 林纳斯·托瓦兹, 理查德·马修·斯托曼。 | 无。 |
例如 Peter McBreen 认为,软件“工程”意味着更高程度的严谨性与经过验证的流程,并不适合现阶段各类型的软件开发。Peter McBreen 在著作《Software Craftsmanship: The New Imperative》提出了所谓“craftsmanship”的说法,认为现阶段软件开发成功的关键因素,是开发者的技能,而不是“manufacturing”软件的流程。