工程的概念

工程是应用科学知识和技术手段,通过有组织的群体协作活动,建造具有预期使用价值的人造产品的过程。

特征

  • 需要大规模的设计与建造
  • 涉及复杂问题与目标分解
  • 需要团队协作与过程控制

软件工程

概念

软件工程即把工程化的方法应用到软件之中,将系统性的、规范化的、可定量的方法应用于软件的开发、运行和维护即工程化应用到软件上,并且对这些方法进行研究。

软件工程最终实现的目标是最终创造出“足够好”的软件,那么什么是足够好的软件?包含以下条件:

  • 较低的开发成本
  • 按时完成开发任务并及时交付
  • 实现客户要求的功能
  • 具有良好性能、可靠性、可扩展性、可移植性等
  • 软件维护费用低

基本要素

软件开放是个复杂的过程,需要注重过程质量的控制,先进的方法和工具有助于开发高质量的产品,因此过程、方法、工具是软件工程的三个基本要素。

软件过程是一系列开发活动,这些活动将用户的需求转化为用户满意的产品,通过对开发过程中各个活动环节质量的有效控制来保证最终产品的质量。
image.png

软件过一程般包括一系列基本的开发活动,首先要研究和定义用户的问题,确定和分析用户的实际需求,设计整个系统的总体结构,编程实现系统的各个部分,最后将各个部分集成起来进行测试,最终交付出用户满意的产品。此外,还包括一些开发过程管理等支持性的活动。
image.png

软件工程方法

软件工程方法是为开发软件提供技术上的解决方法,在软件开发过程中,先进的开发方法和技术手段是非常重要的,可以提高开发效率,有助于构建出高质量的产品。

软件开发方法的发展经历了面向过程、面向对象、面向构件和面向服务等不同阶段。
image.png
代码封装的力度从函数到类,再到粒度更大的构件,以及再到应用表现层次上的服务,软件的复用程度也在逐步提升,开发效率也越来越高。

软件工程工具

古人云,工欲善其事必先利其器,工匠想要做好自己的工作一定要先让工具锋利,软件开发也不例外。软件开发工具为软件工程方法提供了自动的或半自动的软件支撑环境,现在开源的工具非常多,贯穿于整个开发过程。

image.png
软件建模工具可以支持建立系统的需求和设计模型。
软件构造工具包括程序编辑器、编译器、解释器和调试器。
软件测试工具可以帮助人们分析代码质量,执行软件测试和评价产品的质量。
软件维护阶段,一些代码分析工具和重构工具可以帮助人们理解和维护代码。
此外还有一些软件工程管理工具,帮助人们有效管理开发过程,控制代码的更改,支持团队进行协作开发。

软件开发的基本策略

软件过程的几十年发展,已经积累了许多开发方法,但是仅有好的战术还是不够,还需要在实践中运用良好的开发策略,软件复用、分而治之、逐步演进和优化折中是软件开发的四个基本策略。
image.png

软件复用

构造一个新的系统不必都从零开始,而是可以复用已有的构件。软件复用是利用将已有的软件制品,直接组装或者合理修改形成新的软件系统,从而提高开发效率和产品质量,降低维护成本。

软件复用不仅仅是代码复用,还有以下内容的复用:

  • 库函数、类库
  • 模板(文档、网页等)
  • 设计模式
  • 组件
  • 框架

这些内容将在这门课的后续单元进行讲解。

分而治之

分而治之是人们处理复杂性的一个基本策略,简言之,就是将一个复杂的问题分解成若干个简单的问题,然后逐个进行解决。

逐步演进

微信从一个简单的文字通讯工具,逐渐演变成一个支持人们现代生活的服务平台,可以说软件也像是一个活着的植物,它的生长是一个逐步有序的过程,软件开发应该遵循软件的客观规律,通过不断的迭代式的增量开发,最终发展成符合客户价值的产品。
image.png

优化折中

软件工程师应当把优化当成一种责任,不断改进和提升软件质量,但是优化是一个多目标的最优决策,在不可能使所有目标都得到优化时,需要进行折中实现整体最优。

例如:在编写 C 程序代码时,对文件的访问是影响程序速度的一个重要因素,那么如何提高文件的访问速度呢?一个常见的方法是使用内存缓冲区:
image.png
这个表列出了在不同的缓冲区大小系统资源的消耗情况,显然缓冲区越大,设备的硬件的成本就越高,当缓冲区达到4096字节后,继续加大缓存对系统性能的提升超到的作用不大,因此我们可以选择2048或4096这样的缓存方案,这样可以达到一个兼顾成本和性能的这样一个整体更优结果。

软件工程学科发展

Wasserman 规范给出了对软件工程发展有重大影响的若干技术:
image.png

  • 抽象:是一种降低复杂性的处理方法;
  • 软件建模方法:可以帮助工程师理解和刻画系统的分析和设计结果,便于开发人员进行沟通和交流;
  • 用户界面原型化:可以克服需求难以确定的困难;
  • 软件体系结构:对产品质量是至关重要;
  • 软件过程、复用和度量:都是工程方法的组成部分;
  • 工具和集成环境:对于提高软件开发效率是必不可少的;

上述这些技术,在软件工程中都是非常重要的,我们将在后续的课程学习中会逐步加以深入了解。