# Introduction

## 什么是软件工程

软件工程 (Software Engineering) 是**系统化**、**规范化**、**量化的**方法在软件开发、操作和维护中的应用。

* 敏捷开发方法 (Agile) &#x20;
* 软件生命周期各个阶段所要用的工具 &#x20;
  * 例如，单元测试、Bug诊断 &#x20;
* 技能和方法论 &#x20;
  * 能够熟练的使用几种程序设计语言 (C++、C#...) &#x20;
  * 结对编程 (Pair Programming) &#x20;
  * 极限编程 (XP)/SCRUM &#x20;
  * 测试驱动软件开发 (TDD) &#x20;
  * 连续重构 (Continuous Refactoring) &#x20;
* 能力培养：通过**团队协作**使用**软件开发工具**按照**软件工程方法**开发**高质量**并且**可用**的**复杂软件系统**的能力 &#x20;

![](https://2161500321-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M0bSIkrSKJhpcDpbSbW%2F-M1JIS15ZMiTATWipjp2%2F-M1JIXQN62_LT61muPF1%2F2020-02-28-10-18-45.png?generation=1583036134029959\&alt=media)

## 参考书

* 构建之法第三版 邹欣 &#x20;
* 快速软件开发 (Rapid Development) Steve McConnell (ISBN 1-55615-900-5) &#x20;
* 代码大全 (Code Complete (2nd Ed))  Steve McConnell &#x20;
* 移山之道 – VSTS 软件开发指南 &#x20;
* Dreaming in Code 《梦断代码》 &#x20;

## 程序 vs 软件

程序 = 算法 + 数据结构\
软件 = 程序 + 软件工程\
软件企业 = 软件 + 商业模式

**测验**：如果在某个商业产品中，一个功能只有百万分之一的使用概率，那么你是否希望实现它并且每次客户使用你的产品是不厌其烦的教他们如何使用？\
A. 根本就不打算做它\
B. 如果我们没有时间就把它砍掉\
C. 实现它，但是不需要告诉用户\
D. 实现它，并且告诉用户

答案：![](https://2161500321-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M0bSIkrSKJhpcDpbSbW%2F-M1JIS15ZMiTATWipjp2%2F-M1JIXQTU3vcEmIXxez-%2F2020-02-28-10-27-28.png?generation=1583036134171619\&alt=media)

## 软件工程的目标

* 创造“足够好”的软件 &#x20;
  * 用户满意度 &#x20;
  * 可靠性 &#x20;
  * 软件流程的质量 &#x20;
  * 可维护性 &#x20;

## 计算机科学与软件工程

|      计算机科学      |         软件工程        |
| :-------------: | :-----------------: |
|  发现和研究长期的、客观的真理 |  短期的实际结果（具体的软件会过时）  |
|       理想化的      |       对各种因素的折衷      |
|       确定性       |     对不确定性和风险的管理     |
|        完美       |         足够好         |
|       通用性       |        具体的应用        |
| 各个学科独立深入研究，做出成果 | 关注和应用各个相关学科的知识，解决问题 |
|      理论的统一      |      百花齐放的实践方法      |
|      强调原创性      |     最好的、成熟的实践方法     |
|   形式化，追求简明的公式   |    在实践中建立起来的灵感和直觉   |
|       正确性       |         可靠性         |
