话说软件工程

维基百科,自由的百科全书 1

软件工程(英语:software engineering),是软件开发领域里对工程方法的系统应用。

1968 年秋季,NATO(北约)的科技委员会召集了近50名一流的编程人员、计算机科学家和工业界巨头,讨论和制定摆脱“软件危机”的对策。在那次会议上第一次提出了软件工程(software engineering)这个概念,研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件,以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来的学科。它涉及到程序设计语言、数据库、软件开发工具、系统平台、标准、设计模式等方面。其后的几十年里,各种有关软件工程的技术、思想、方法和概念不断被提出,软件工程逐步发展为一门独立的科学。

1993年,电气电子工程师学会(IEEE)给出了一个更加综合的定义:"将系统化的、规范的、可度量的方法用于软件的开发、运行和维护的过程,即将工程化应用于软件开发中"。此后,IEEE多次给出软件工程的定义。

在现代社会中,软件应用于多个方面。典型的软件比如有电子邮件、嵌入式系统、人机界面、办公包、操作系统、网页、编译器、数据库、游戏等。同时,各个行业几乎都有计算机软件的应用,比如工业、农业、银行、航空、政府部门等。这些应用促进了经济和社会的发展,提高人们的工作效率,同时提升了生活质量。

软件工程师是对应用软件创造软件的人们的统称,软件工程师按照所处的领域不同可以分为系统分析师、系统架构师、前端和后端工程师、程序员、测试工程师、用户界面设计师等等。各种软件工程师人们俗称程序员。

定义

关于软件工程的定义,在GB/T11457-2006《信息技术 软件工程术语》中将其定义为

"应用计算机科学理论和技术以及工程管理原则和方法,按预算和进度,实现满足用户要求的软件产品的定义、开发、和维护的工程或进行研究的学科"。

包括:
1. 创立与使用健全的工程原则,以便经济地获得可靠且高效率的软件。
1. 应用系统化,遵从原则,可被计量的方法来发展、操作及维护软件;也就是把工程应用到软件上。
1. 与开发、管理及更新软件产品有关的理论、方法及工具。
1. 一种知识或学科,目标是生产质量良好、准时交货、符合预算,并满足用户所需的软件。
1. 实际应用科学知识在设计、建构计算机程序,与相伴而来所产生的文件,以及后续的操作和维护上。
1. 使用与系统化生产和维护软件产品有关之技术与管理的知识,使软件开发与修改可在有限的时间与费用下进行。
1. 建造由工程师团队所开发之大型软件系统有关的知识学科。
1. 对软件分析、设计、实施及维护的一种系统化方法。
1. 系统化地应用工具和技术于开发以计算机为主的应用。
1. 软件工程是关于设计和开发优质软件。

没有银弹与人月神话

在1986年,IBM大型机之父佛瑞德·布鲁克斯发表了他的著名论文《没有银弹》,在这篇著名的论文中他断言:“在10年内无法找到解决软件危机的灵丹妙药”。从软件危机被提出以来。人们一直在查找解决它的方法。于是一系列的方法被提出并且加以应用。比如结构化程序设计,面向对象的开发,CMM,UML等等。佛瑞德·布鲁克斯著名作品还有《人月神话》。

布鲁克斯在《人月神话:软件项目管理之道(The Mythical Man-Month)》提到,将没有灵丹妙药(silver bullet)可以一蹴而就,开发软件的困难是内生的,只能渐进式的改善。整体环境没有改变以前,唯一可能的解,是依靠人的素质,培养优秀的工程师。

软件工程的发展方向

“敏捷开发”(Agile Development)被认为是软件工程的一个重要的发展。它强调软件开发应当是能够对未来可能出现的变化和不确定性作出全面反应的。
敏捷开发被认为是一种“轻量级”的方法。在轻量级方法中最负盛名的应该是“极限编程”(Extreme Programming,简称为XP)。而与轻量级方法相对应的是“重量级方法”的存在。重量级方法强调以开发过程为中心,而不是以人为中心。重量级方法的例子比如CMM/PSP/TSP。

面向方面的程序设计(Aspect Oriented Programming,简称AOP)被认为是近年来软件工程的另外一个重要发展。这里的方面指的是完成一个功能的对象和函数的集合。在这一方面相关的内容有泛型编程(Generic Programming)和模板。

软件工程之美2

软件工程学让我知道,软件项目的开发其实是一个工程,整个开发过程是可以有效组织起来的;对于开发过程的各个阶段,已经有很多解决问题的最佳实践,有很多方法来帮助我们高效完成任务;我们还可以借助工具来协助管理,提升开发效率。

  1. “器”就是软件工程中的各种工具。
  2. “术”就是软件工程中的各种方法。
    • 例如如何做需求分析?
    • 如何对需求变更做变更管理?
  3. “道”就是软件工程知识的核心思想、本质规律。
    • 例如为什么要有需求分析?
    • 需求变更产生的深层次原因是什么?
    • 项目中决策的依据是什么?

——《软件工程——实践者的研究方法》Roger S.Pressman

聚焦于质量,构建和维护高质量的软件

软件工程 = 工具 + 方法 + 过程

学习软件工程的四重境界

  1. 用器:工具
    • 原型设计工具
    • 持续集成工具
  2. 学术:方法
    • 需求分析方法
  3. 悟道:本源
    • 核心思想
    • 本质规律
  4. 传道
    • 教学

基础理论

从宏观的角度建立起软件工程的知识结构,展现软件工程学的全景图,让你掌握从软件工程的基础概念到主流的软件过程方法论。

去尝试用工程化的思维模式,去分析和解决工作和生活中的问题。

工程

有人参与、有计划、有步骤地造一件产品,我们通常称为“工程”。

软件危机

软件产品质量低劣、软件维护工作量大、成本不断上升、进度不可控、程序人员无限度地增加。

软件工程,它是为研究和克服软件危机而生。

要用工程化方法去规范软件开发,让项目可以按时完成、成本可控、质量有保证。

工程方法

Engineering Method3

工程方法通常会分成六个阶段:想法、概念、计划、设计、开发和发布。

  1. 想法:想法阶段通常是想要解决问题。最开始问题通常是模糊的,所以需要清晰地定义好问题,研究其可行性,检查是否有可行的解决方案。
  2. 概念:概念阶段就是用图纸、草图、模型等方式,提出一些概念性的解决方案。这些方案可能有多个,最终会确定一个解决方案。
  3. 计划:计划阶段是关于如何实施的计划,通常会包含人员、任务、任务持续时间、任务的依赖关系,以及完成项目所需要的预算。
  4. 设计:设计阶段就是要针对产品需求,将解决方案进一步细化,设计整体架构和划分功能模块,作为分工合作和开发实施的一个依据和参考。
  5. 开发:开发阶段就是根据设计方案,将解决方案构建实施。开发阶段通常是一个迭代的过程,这个阶段通常会有构建、测试、调试和重新设计的迭代。
  6. 发布:将最终结果包括文档发布。

瀑布模型

V 模型

螺旋模型

统一软件开发过程(Rational Unified Process,RUP)-《构建之法》

框架或指南:敏捷开发


Jira4

每日站立会议

重点是要高效沟通反馈

项目过程

软件生命周期,把知识点拆成:规划、需求分析、设计、编码、测试、运行维护这六个阶段,了解每个阶段要侧重做哪些事;分析每个阶段常见的问题,找到解决方法;了解各个阶段有哪些工具可以对项目有帮助,从而学会应用它们。

案例分析

大公司是怎么应用软件工程的。

参考书目

  • 《构建之法》

作者邹欣是微软的研发总监,同时在多所高校进行了软件工程的教学实践,在此基础上对软件工程的各个知识点和技能要求进行了系统性整理,形成教材。也是本专栏很多很好的补充。
* 《人月神话》

这是软件工程历史上的经典著作,内容发人深省,40 年来一直畅销不衰,里面的观点即使到现在也不过时。这本书即使你以前看过,隔一段时间再翻看一遍,可能都会有新的感悟。

  • 《人件》

如果说《人月神话》关注“软件开发”本身,《人件》则关注软件开发中的“人”。作者指出知识型企业的核心是人,而不是技术。

  • 《知行合一: 实现价值驱动的敏捷和精益开发》

作者丛斌有二十多年从事软件工程教学、咨询和研究的经验,所以书写的特别接地气,文章有很多真实案例,对敏捷开发和 CMMI 都有很深入描述。

  • 《软件工程——实践者的研究方法》

这是大部分高校采用的软件工程标准教材,可以作为一个参考。《持续交付》讲述如何实现更快、更可靠、低成本的自动化软件交付,描述了如何通过增加反馈,并改进开发人员、测试人员、运维人员和项目经理之间的协作来达到这个目标。

  • 《走出软件作坊》

这本书生动的描述了国内小型 IT 企业在发展过程中遇到的一系列项目管理问题,以及作者是如何去解决这些问题的。


  1. https://zh.wikipedia.org/zh-cn/软件工程↩︎

  2. https://time.geekbang.org/column/intro/158↩︎

  3. http://sites.tufts.edu/eeseniordesignhandbook/2013/engineering-method/↩︎

  4. https://www.atlassian.com/zh/software/jira/features↩︎