什么是软件工程?⚓︎
好了,我们终于进入正题了:什么是软件工程?
在公式1.1~1.8中,我们看到了一系列在“软件”这个名词之外的概念,这些概念的组合就是软件工程所涵盖的范围,但还不止于此。
软件工程简史⚓︎
我们用一张表简单地说明一下^{[1]}:
年代 | 关键词 | 事件 |
---|---|---|
1945~1965 | 初创 | 软件工程被提出并命名 |
1965~1985 | 危机 | 超预算、引发财产损失和生命危险,从关注生产力到关注质量 |
1985~1989 | 银弹 | 从业者从各个角度寻找“银弹”来解决危机,但是每一种方案只能带动局部的改进 |
1990~1999 | 互联网 | 建立在HTML基础上的互联网技术促进了软件行业的发展,出现了浏览器、电子邮件、搜索引擎、多语言系统等等,适用于大型软件的软件工程方法逐步成熟 |
2000~2015 | 轻量 | 出现了很多轻量级的软件工程方法,适用于中小型软件的开发 |
软件工程 vs. 计算机科学⚓︎
我们先看一下计算机科学所涵盖的学科^{[2]}:
- 理论计算科学(Theoretical computer science)
- 理论计算(Theory of computation)
- 信息编码(Information and coding theory)
- 数据机构与算法(Data structures and algorithms)
- 编程语言(Programming language theory)
- 形式化方法(Formal methods)
- 计算机系统(Computer systems)
- 计算机体系结构与计算机工程(Computer architecture and computer engineering)
- 计算机性能分析(Computer performance analysis)
- 并行和分布计算(Concurrent, parallel and distributed systems)
- 计算机网络(Computer networks)
- 计算机安全与密码学(Computer security and cryptography)
- 数据库(Databases)
- 计算机应用(Computer applications)
- 计算机图形学与可视化(Computer graphics and visualization)
- 人机交互(Human-computer interaction)
- 科学计算与仿真(Scientific computing and simulation)
- 人工智能(Artificial intelligence)
- 软件工程(Software engineering)
- 软件需求(Software requirements)
- 软件设计(Software design)
- 软件开发(Software development)
- 软件测试(Software testing)
- 软件维护(Software maintenance)
请注意:计算机科学的最后一个子类就是软件工程!我们通常所听说的“二者是并列关系”的说法是不正确的。
造成误解的原因是,在我国大学教育体系的本科生培养层次,与计算机相关的专业有:软件工程、计算机科学、物联网工程、信息安全、数字媒体技术等专业。其中,计算机科学专业是为了培养硕士或博士打基础,搞理论研究;而软件工程最高到工学硕士,没有博士。
计算机科学 | 软件工程 | |
---|---|---|
本科生 | 理学或工学学士 | 工学学士 |
研究生 | 理学硕士 | 工学硕士(较少) |
博士生 | 理学博士 | 无 |
侧重 | 原创理论研究 | 成熟应用实践 |
策略 | 效果影响力优先 | 成本与效果的折中 |
成果 | 论文 | 项目、产品 |
简单的说,计算机科学是科学家、研究员们,发现规律、研究理论,并试图从根本上把规律理论化、公式化,不太在意成本,只在意效果。
软件工程发展了这么多年,早已经形成了一套科学的、成熟的方法做理论指导,当然可以算作计算机科学的一部分。工程师和程序员们,侧重于用成熟的方法解决实际问题,要折中成本和效果。
现实中的计算机科学与软件工程⚓︎
一个很现实的问题是,计算机科学的本科和硕士毕业生在毕业后找工作比较难,除非一直学到博士毕业,才有可能加入一些大公司的研究机构当研究员,如 MSRA(Microsoft Research Asia,微软亚洲研究院)、阿里达摩院、百度研究院等等;而软件工程专业毕业的学生很容易找到程序员、工程师的职位,如 STCA(Search Technology Center Asia,微软亚洲互联网工程院)、BAT(百度、阿里、腾讯)以及很多中小型软件公司。
但是对于另外一种论调,即“软件工程独立于计算机科学之外”,是因为近些年软件工程发展非常快,处于不确定性,要学习的知识和技能非常多,而计算机科学的理论基础成熟稳定,研究方向相对固定。
在 MSRA,最开始建立时都是科学家和研究员;而在 STCA,都是工程师和程序员。从组织结构上就可以看出两种学科的“并列”关系。但是到了后来,MSRA 里也会有 15% 左右的工程师,叫做 RSDE(Research Software Development Engineer,软件研发工程师),而 STCA 里也有会 5% 以下的 Data Scientist(数据科学家),实际上和研究员类似,也会发表论文,但更偏重为本组的工程项目服务。
无论哪个研究院,都会为企业的商业目标服务。如 MSRA,强调研究成果的产品转化率越高越好,被称为“黑科技”,实际上就是计算机科学与软件工程结合的产物。可以看到软件工程确实属于计算机科学的一部分,是架设在天(理论研究)与地(应用实践)之间的桥梁。
参考资料⚓︎
[1] https://en.wikipedia.org/wiki/History_of_software_engineering
[2] https://en.wikipedia.org/wiki/Computer_science