跳转至

什么是软件工程?⚓︎

好了,我们终于进入正题了:什么是软件工程?

在公式1.1~1.8中,我们看到了一系列在“软件”这个名词之外的概念,这些概念的组合就是软件工程所涵盖的范围,但还不止于此。

软件工程简史⚓︎

我们用一张表简单地说明一下^{[1]}

年代 关键词 事件
1945~1965 初创 软件工程被提出并命名
1965~1985 危机 超预算、引发财产损失和生命危险,从关注生产力到关注质量
1985~1989 银弹 从业者从各个角度寻找“银弹”来解决危机,但是每一种方案只能带动局部的改进
1990~1999 互联网 建立在HTML基础上的互联网技术促进了软件行业的发展,出现了浏览器、电子邮件、搜索引擎、多语言系统等等,适用于大型软件的软件工程方法逐步成熟
2000~2015 轻量 出现了很多轻量级的软件工程方法,适用于中小型软件的开发

软件工程 vs. 计算机科学⚓︎

我们先看一下计算机科学所涵盖的学科^{[2]}

  1. 理论计算科学(Theoretical computer science)
    • 理论计算(Theory of computation)
    • 信息编码(Information and coding theory)
    • 数据机构与算法(Data structures and algorithms)
    • 编程语言(Programming language theory)
    • 形式化方法(Formal methods)
  2. 计算机系统(Computer systems)
    • 计算机体系结构与计算机工程(Computer architecture and computer engineering)
    • 计算机性能分析(Computer performance analysis)
    • 并行和分布计算(Concurrent, parallel and distributed systems)
    • 计算机网络(Computer networks)
    • 计算机安全与密码学(Computer security and cryptography)
    • 数据库(Databases)
  3. 计算机应用(Computer applications)
    • 计算机图形学与可视化(Computer graphics and visualization)
    • 人机交互(Human-computer interaction)
    • 科学计算与仿真(Scientific computing and simulation)
    • 人工智能(Artificial intelligence)
  4. 软件工程(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