学习总结 2020.1.4-1.10
一、怎样理解软件工程
1、什么是软件工程
- 工程的本质是为了做出有用的产品:
- 例如:造房子的建筑工程,造火箭的航天工程。
- 在软件领域对应的就是“软件工程”。
- 软件需要基于软件工程的方法开发、运行和维护。
2、软件危机与软件工程的诞生
- 虽然不需要软件工程,也可以开发简单的软件;
- 但是随着软件的规模越来越大,复杂度不断增加,软件项目开发维护过程中的问题就逐步暴露出来:
- 软件产品质量低劣;
- 软件维护工作量大;
- 成本不断上升;
- 进度不可控;
- 程序人员无限度地增加。
- 为了为了摆脱软件危机,1968 年秋季,北大西洋公约组织的科技委员会召集了近 50 名一流的编程人员、计算机科学家和工业界巨头,讨论和制定对策。
- 会议上第一次提出了“软件工程”(software engineering)的概念。
- 从此诞生了一门新兴的工程学科:软件工程,它是为研究和克服软件危机而生。
- 在这次会议上,同时也提出了“软件工程”的定义:
- 为了经济地获得在真实机器上可靠工作的软件而制定和使用的合理工程原则。(Software engineering is the establishment and use of sound engineering principles in order to obtain economically software that is reliable and works efficiently on real machines.)
- 1993 年,电气电子工程师学会(IEEE)给出了一个更加综合的定义:
- 将系统化的、规范的、可度量的方法用于软件的开发、运行和维护的过程,即将工程化应用于软件开发中。(Software Engineering: (1) The application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software; that is, the application of engineering to software. (2) The study of approaches as in (1).)
- 软件工程的本质:
- 用工程化方法去规范软件开发,让项目可以按时完成、成本可控、质量有保证。
3、软件工程的演化史
- 开发软件本质上是从无到有创造的过程。
- 工程化的方式,就是你分步骤(过程),采用科学的方法,借助工具来做产品。
- 整个软件开发过程也被分成了几个阶段:
- 需求定义与分析;
- 设计;
- 实现;
- 测试;
- 交付;
- 维护。
- 这也就是我们常说的软件项目生命周期。
- 软件项目里的各种角色:项目经理、产品经理、架构师、程序员、测试工程师、运维工程师。
- 整个过程的管理:“项目管理”。
- 整个软件开发过程也被分成了几个阶段:
- 同时,也很自然就衍生出一套最基础的过程模型:瀑布模型。
- 软件概念;
- 需求分析;
- 架构设计;
- 详细分析;
- 编码;
- 测试。
- 瀑布模型的诞生的意义:
- 让软件开发从无序到有序,更好的分工协作,同时每个阶段又衍生出各自的方法学和工具,例如需求分析、软件测试等等。
- 然而瀑布的特性决定了它只能从上往下流,而且从上到下走完整个周期很长,所以一旦出现了需求的变更,将会非常痛苦,很多事情需要重头再来。
- 于是基于瀑布模型,又衍生出 V 模型、原型设计、增量模型、螺旋模型等模型,试图改善瀑布模型存在的一些缺陷。
- 这些改进模型的发展趋势上就是缩短项目周期,快速迭代。
- 这样到了 90 年代,各种轻量级开发方法例如 Scrum、极限编程等也不断被提出。
- 到了 2001 年,这些轻量级开发方法一起组成了敏捷联盟,其后敏捷开发如同星星之火,逐渐形成燎原之势。
- 近些年,云计算、微服务这些新技术的产生,也对软件工程产生了影响。云服务让分工更细,很多企业可以将运维、服务器维护、DBA、甚至某些独立服务交给云服务商;微服务让大团队变成小团队,每个小团队可以更专注于细分领域,减少相互之间的依赖。
4、软件项目生命周期
- 软件工程的知识,都是建立在软件项目的过程,或者说软件项目生命周期之上的。
- 基于软件过程,我们有了角色分工,有了对过程的管理和工具,对过程中每个阶段细分的方法学和工具。
- 软件工程就是用工程化的方法来开发维护软件。也可以说软件工程就是用一定的过程,采用科学的方法,借助工具来开发软件。
- 如果用一个简单的公式表达,那就是:软件工程 = 过程 + 方法 + 工具。
二、工程思维
1、软件工程思维
- 软件工程是一门用工程化方法解决软件项目问题的学科,其本质也是一门工程学科,这门课的知识在学完后,不仅可以应用在软件项目中,还可以应用于日常生活中遇到的一些问题,Everything is a project。
- 日常生活中尝试应用“Everything is a project”的概念,小到做作业,大到完成工作中的复杂项目:
- 解决这些问题的方式,就是参考软件生命周期和瀑布模型,把一件事情分成几个阶段:分析、设计、实施、测试、完成,然后制定相应的计划。
- 工程方法:
- 有目的、有计划、有步骤地解决问题的方法就是工程方法。
- 工程方法通常会分成六个阶段:想法、概念、计划、设计、开发和发布。
- 想法:想法阶段通常是想要解决问题。最开始问题通常是模糊的,所以需要清晰地定义好问题,研究其可行性,检查是否有可行的解决方案。
- 概念:概念阶段就是用图纸、草图、模型等方式,提出一些概念性的解决方案。这些方案可能有多个,最终会确定一个解决方案。
- 计划:计划阶段是关于如何实施的计划,通常会包含人员、任务、任务持续时间、任务的依赖关系,以及完成项目所需要的预算。
- 设计:设计阶段就是要针对产品需求,将解决方案进一步细化,设计整体架构和划分功能模块,作为分工合作和开发实施的一个依据和参考。
- 开发:开发阶段就是根据设计方案,将解决方案构建实施。开发阶段通常是一个迭代的过程,这个阶段通常会有构建、测试、调试和重新设计的迭代。
- 发布:将最终结果包括文档发布。
2、整体思维
- 用工程方法去处理事情,有两点好处:
- 有一个被有效论证过的方法论指导你,可以帮助你提高成功概率,也可以提高效率。
- 当你用工程方法去思考的时候,你会更多的站在整体而非局部去思考,更有大局观。
- 分工带来的好处,就是复杂的任务可以分给不同的人来做,这也有助于技能的专业化,提高工作效率。
- 但如果只站在自己的立场去考虑问题,没有人关注整体价值,就容易相互误解,产生矛盾、增加成本。
- 每个项目成员,如果能多站在项目的角度去考虑,那么这样不仅对项目有利,更对自己有好处。
- 工程思维,本质上是一种思考问题的方式,在解决日常遇到的问题时,尝试从一个项目的角度去看待问题、尝试用工程方法去解决问题、站在一个整体而不是局部的角度去看问题。
三、瀑布模型
- 瀑布模型算是现代软件工程的起源,软件工程的发展,很大部分都是构建于瀑布模型的基础之上的。
- 软件工程的很多内容,都是源自瀑布模型的衍生,或者其中某个阶段的细分。
1、"边写边改(Code And Fix)"模型
- 开发模式:直接写代码,有问题就改。
- 在 1960 年初,软件开发刚开始起步,这时的软件开发是混沌无序的,那时候编程语言还是汇编语言为主,开发模式就是边写边改模型。如果程序员水平高,功能简单,还是可行的。
- 后来软件开发需求越来越多,功能越来越复杂,从事软件开发的人员水平也参差不齐,这种落后的软件生产方式已经无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现一系列严重问题,这个现象也被称之为“软件危机”。
- 像这种边写边改的开发模式,为什么说不能满足复杂软件项目的需要呢?主要是有几方面的原因:
- 整个开发过程不可控,想基于这种开发模式做项目计划太难;
- 项目的人数多了后,无法有效分工协作;
- 项目开始的时候对需求几乎没有进行有效分析,对需求的理解容易出现偏差,后期导致很多返工;
- 项目编码完成后,没有有效测试,运行时 Bug 非常多。
2、瀑布模型
- 为了解决软件危机中的这些问题,在 1970 年,Winston Royce 博士借鉴了其他工程领域的思想,比如建筑工程,提出了瀑布开发模型,指出软件开发应有完整之周期,并将软件开发过程分成了若干阶段。像瀑布一样,从上往下,完成一个阶段继续下一个阶段。
- 瀑布模型把整个项目过程分成了六个主要阶段:
- 一、问题的定义及规划
- 这个阶段是需求方和开发方共同确定软件开发目标,同时还要做可行性研究,以确定项目可行。这个阶段会产生需求文档和可行性研究报告。
- 二、需求分析
- 对需求方提出的所有需求,进行详细的分析。这个阶段一般需要和客户反复确认,以保证能充分理解客户需求。最终会形成需求分析文档。
- 三、软件设计
- 根据需求分析的结果,对整个软件系统进行抽象和设计,如系统框架设计,数据库设计等等。最后会形成架构设计文档。
- 四、程序编码
- 将架构设计和界面设计的结果转换成计算机能运行的程序代码。
- 五、软件测试
- 在编码完成后,对可运行的结果对照需求分析文档进行严密的测试。如果测试发现问题,需要修复。最终测试完成后,形成测试报告。
- 六、运行维护
- 软件开发完成,正式运行投入使用。后续需要继续维护,修复错误和增加功能。交付时需要提供使用说明文档。
- 一、问题的定义及规划
- 瀑布模型在提出后,因为其简单可行,切实有效,马上就在很多软件项目中应用起来,一直到 2000 年前后,都是最主流的软件开发模型,即使到现在,你也能在很多软件项目中看到它的影子。
- 也是从那时开始,有了“软件生命周期”(Software Life Cycle,SLC) 的概念。
- 软件生命周期是软件的产生直到报废或停止使用的生命周期。
- 而像瀑布模型这样,通过把整个软件生命周期划分为若干阶段来管理软件开发过程的方法,叫软件生命周期模型。
- 学习瀑布模型的意义:
- 因为不管什么软件项目,不管采用什么开发模式,有四种活动是必不可少的,那就是需求、设计、编码和测试。
- 而这四项活动,都是起源自瀑布模型,也是瀑布模型中核心的部分。
- 学好瀑布模型,才可以帮助你更好的理解这些内容。
3、瀑布模型的优缺点
- 优点:
- 简单易行;
- 可以按照阶段检查。能及时发现问题;
- 前一个阶段完成后,就可以重点关注下一个阶段;
- 有很好的分工协作;
- 对质量有保障。
- 缺点:
- 难以响应需求的变更,当需求发生改变时,越到后面代价越大;
- 工作量分布不均衡;
- 前期进度受阻,会一直压缩后续阶段时间,导致延期或影响质量;
- 一直到最后阶段才能看到结果。
- 鉴于瀑布模型存在的这些问题,后来又有很多人提出了其他的软件生命周期模型,比如快速原型开发模型、增量模型、迭代模型,以期保留瀑布模型的这些优点,克服瀑布模型中存在的问题。
- 瀑布模型的出现,也解决了软件项目开发中的几个重要问题:
- 让软件开发过程有序可控。瀑布模型的每个阶段都有明确的任务,每个阶段都有明确的交付产物,都有相应的里程碑。这些让整个过程更可控,而且能及早发现问题。
- 让分工协作变成可能。瀑布模型的六个阶段,也让软件开发产生相应的基础分工:项目经理、产品经理、架构师、软件工程师、测试工程师、运维工程师。
- 质量有保障。瀑布模型每个阶段都需要交付相应的文档,而文档的撰写和评审,可以帮助在动手之前把问题沟通清楚,想清楚。瀑布模型在编码结束后,会有严密的测试,只有测试验收通过后,才能上线发布。这些措施都让软件的质量更有保障。