软件工程:到底应该怎么理解软件工程
由来
当软件的规模越来越大,复杂度不断增加,软件项目开发维护过程中的问题就逐步暴露出来:软件产品质量低劣、软件维护工作量大、成本不断上升、进度不可控、程序人员无限度地增加。所以在 60 年代,“软件危机”的概念被提出来。
为解决软件危机,由此出现了一门新兴的工程学科:软件工程。软件工程就是要用工程化的方法去规范软件开发,让项目可以按时完成,成本可控,指令有保证
演化史
开发软件本质上也是像盖房子一样,是从无到有创造的过程。工程化的方式,就是你分步骤(过程),采用科学的方法,借助工具来做产品。
于是参考建筑工程,整个软件开发过程也被分成了几个阶段:需求定义与分析、设计、实现、测试、交付和维护,这也就是我们常说的软件项目生命周期。
当然,各个阶段都会有人的参与,于是产生了软件项目里的各种角色:项目经理、产品经理、架构师、程序员、测试工程师、运维工程师。而对这整个过程的管理,我们通常称之为“项目管理”。
同时,也很自然就衍生出一套最基础的过程模型:瀑布模型。
瀑布模型的诞生,在当时是有非常重大的意义的,让软件开发从无序到有序,让大家更好的分工协作,同时每个阶段又衍生出各自的方法学和工具,例如需求分析、软件测试等等。
然而瀑布的特性决定了它只能从上往下流,而且从上到下走完整个周期很长,所以一旦出现了需求的变更,将会非常痛苦,很多事情需要重头再来。
于是基于瀑布模型,又衍生出 V 模型、原型设计、增量模型、螺旋模型等模型,试图改善瀑布模型存在的一些缺陷。这些改进模型的发展趋势上就是缩短项目周期,快速迭代。
这样到了 90 年代,各种轻量级开发方法例如 Scrum、极限编程等也不断被提出。到了2001 年,这些轻量级开发方法一起组成了敏捷联盟,其后敏捷开发如同星星之火,逐渐形成燎原之势
近些年,云计算、微服务这些新技术的产生,也对软件工程产生了影响。云服务让分工更细,很多企业可以将运维、服务器维护、DBA、甚至某些独立服务交给云服务商;微服务让大团队变成小团队,每个小团队可以更专注于细分领域,减少相互之间的依赖。
一个公式
当你大致了解整个软件工程的演变发展史,你会发现,软件工程的知识,都是建立在软件项目的过程,或者说软件项目生命周期之上的。
基于软件过程,我们有了角色分工,有了对过程的管理和工具,对过程中每个阶段细分的方法学和工具。
如果用一个简单的公式表达,那就是:软件工程 = 过程 + 方法 + 工具。
由图可见,“质量焦点”在最底层,这不难理解软件工程是为了应对软件危机诞生的学科,其目标就是为了要聚焦于质量,构建和维护高质量的软件。可以说,聚焦于质量就是软件工程的基石。
那“过程”指的是什么呢?
要构建高质量软件,则要解决软件工程中的混乱,则将软件开发过程中的沟通、计划、建模、构建和部署等活动有效地组织起来。而软件工程,就是在软件项目的生命周期内,也就是软件从诞生到结束这期间,在开发与构建系统时要遵循的步骤。
有两种过程框架你一定经常听到,那就是瀑布模型和敏捷开发。这是在软件工程多年的发展中,逐步形成的两种主流的软件过程指导框架。
那“方法”指的是什么呢?
方法是指在整个过程中,如何构建系统的方法学。比如说,如何分析用户需求;如何对产品进行测试验收;如何进行系统架构设计等。
知道了过程,掌握了方法,那么具体落到操作层面,就会涉及到工具的使用。
我们需要工具来辅助方法的执行,提高效率。通过工具,可以把一些手动的工作自动化,比如自动化测试工具,自动构建部署工具;通过工具,可以帮助把一些流程规范起来,比如Bug 跟踪、源代码管理;还可以通过工具,帮助提高编码效率,比如各种编辑器 IDE、各种高级语言。
软件工程的核心,就是围绕软件项目开发,对开发过程的组织,对方法的运用,对工具的使用。
到底应该怎么理解软件工程
对于大型系统的建设,可否用敏捷方法来实现,一直是个问题。
- 敏捷方法,适合于小团队(比如两个披萨团队)、小架构。对于大型单体应用的开发,至少在架构设计上是不适合用敏捷迭代方式的。
- 为了解决大型系统建设的迭代开发、快速交付问题,业内不断在探索。随着微服务架构的提出,以及容器技术的成熟,和 cicd 的实现,单体巨石应用被拆解成分布式的微服务应用,此时,敏捷方法也就开始真正大行其到了。
所以,微服务、容器、devops 这三剑客和敏捷方法一起,互为依存、互相促进,成为了软件工程中最有生命力的技术工具和流程,使软件开发在质量和效率上得到极大提升。
学习自动化测试其实不等于一定能缩短测试周期,“测试周期”的定义如果是测试独占的项目时间段的话,可以通过测试前移,加强自测,契约优先的接口自动化测试等来缩短独占时间。没有系统或者不够工程化的自动化测试脚本,反而会增加测试时间。
软件工程:到底应该怎么理解软件工程相关推荐
- 《软件工程之美》—— 理解软件工程
文章目录 1.什么是软件工程 1.1.定义 1.2.演化史 1.3.软件工程的核心 2.Everything is a project 2.1.什么是工程方法 2.2.使用工程方法的好处 3.软件工程 ...
- “软件工程”到底学什么(一)
"软件工程"到底学什么? 学弟或者准学弟是不是有这样的疑问?然后我会以我大学个人经历开始写,废话会比较多,就当看故事吧. (题外话,不喜欢看的略过)其实我当初选择软件工程是因为我从 ...
- 软件工程到底是学啥的?就业前景咋样?
软件工程到底是学啥的? 件工程专业主要学C++程序设计.java.python.高等数学.数据结构.算法设计与分析.汇编语言程序设计.数据库系统.软件工程等.就业方向方向包括:编写程序,做软件开发:做 ...
- 【软件工程之美笔记】软件工程之美01基础篇
软件工程之美-极客时间 时间安排 基础篇理论9讲(2022年9月18日完成3讲内容) 项目规划篇8讲(未开始) 需求分析篇(未开始) 系统设计篇(未开始) - 软件工程 如何全面提升软件工程能力和实践 ...
- 《软件工程》第一章——初始软件工程
1.1 软件无处不在 软件是软件工程的研究对象,也是软件工程的产品形态于客观存在. 工程是理论知识应用于实践的科学,其目的是经济有效地解决实际问题. →软件工程是为了解决开发成本效益和软件质量的问题而 ...
- 软件工程开发模型以及在软件工程中的作用
软件工程开发模型以及在软件工程中的作用: 传统模型: 瀑布模型(water fall model): 规定了各项软件工程活动,包括制定开发计划.需求分析说明.软件设计.程序编码.测试和运行维护,并且规 ...
- 软件工程- 第3章 传统软件工程方法学
文章目录 软件工程 第3章 传统软件工程方法学 3.1 结构化设计 结构化设计的概念与原理 模块化 抽象 逐步求精 信息隐蔽 模块独立 3.2 模块独立 耦合 内聚 3.3 启发规则 3.4 面向数据 ...
- 『软件工程2』详解软件工程和软件过程模型
文章目录 一.软件工程的定义 1.Fritz Bauer在NATO上给出的定义 2.Barry Boehm 3.IEEE在软件工程术语汇编中的定义 二.软件工程的层次 1.软件工程三个要素 2.软件工 ...
- 到底该如何理解DevOps这个词
炒了8年的概念,到底该如何理解DevOps这个词? 转载本文需注明出处:EAII企业架构创新研究院,违者必究.如需加入微信群参与微课堂.架构设计与讨论直播请直接回复公众号:"EAII企业架构 ...
最新文章
- 数据结构——四大查找算法(工作必备)
- 合理估算线程池线程数量
- 漫谈分布式事务的那些解决方案
- struts2的注入参数,获取值
- C++与类型转换相关的四个关键字
- Linux clear指令
- java框内的值怎么同步_java并发编程使用锁进行数据同步操作一
- 算法 --- 判断某个值是否在二叉搜索树中
- js foreach 跳出循环_VUE.js
- [学习笔记] Cordova+AmazeUI+React 做个通讯录 - 使用 SQLite
- 【论文笔记】Joint Cascade Face Detection and Alignment
- 数据系统架构-3.数据仓库设计
- vba 定义类_类接口的实现及应用
- ASO优化图标篇:App图标优化的几点建议
- matlab 怎么打开.p文件,matlab p文件肿么打开 或者 运行
- nginx代理安装ssl证书
- 超级短信 handcent sms v4.4.1 android,超级短信(Handcent SMS)
- java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解
- 国内外php主流开源cms、商城、点评、SNS、DIGG、RSS、分类信息、Wiki汇总
- linux+gps测试流程图,GPS测试标准与测试项目简介
热门文章
- 遇到“word在试图打开文件时遇到错误”怎么办?
- 计算机主机启动不了系统怎么办,电脑开机进不了系统怎么办?
- 蛮力法C语言选择排序,2016年法国欧洲杯 -官方网站
- 一小时上手昇思MindSpore
- python 123 io网站答题如果最小化会有提示吗_爬虫进阶教程:百万英雄答题辅助系统...
- 韩山师范学院计算机专插本,2019年韩山师范学院专插本各专业录取情况
- 一些小方法诸如:交换值,排序,查找等等
- AIQ - deeplearning.ai 全套吴恩达老师的深度学习课程笔记及资源在线
- 批量调整WPS中插入的图片大小
- 我国各省单位GDP能耗(2005-2020)