软件工程模型

你在工作中, 软件的开发流程是怎样的? 你是否想过, 除了你当前使用的流程, 还存在其他怎样的流程? 现在的流程有哪些问题, 又能够如何解决? 别说, 前辈们已经给出了一些项目流程的模型, 既软件工程. 可以简单了解一下, 带动一下我这生了锈的脑子.

在很久以前, 一个软件的从想法到落地, 还没有什么可供参考的流程, 基本上就是边提需求边开发, 毫无章法. 对于当时的项目来说, 因为规模不大, 这种方式就已经 OK 了. 但随着后面功能越来越复杂, 项目越来越大, 就逐渐暴露出了一些问题, 整个项目开发流程不可控, 无法进行有效的计划, 同时项目没有分工合作, 也不利于大型项目的开发等等.

为了解决这些问题, 前辈们提出了软件工程. 一个项目由想法到发布, 大概可以划分为这么几个步骤(这几个步骤可能并不准确, 我自己想的…):

  1. 构思
  2. 将构思进行书面表达
  3. 对构思进行功能的细化
  4. 设计产品的展示(某些无界面的产品不用)
  5. 进行开发
  6. 测试
  7. 发布
  8. 后期维护

根据这些步骤, 发明了瀑布模型.

瀑布模型

瀑布模型, 顾名思义, 像一个瀑布一样, 将流程分为若干个阶段, 完成一个阶段之后, 流向下一个阶段. 瀑布模型包括如下几个阶段:

  1. 提出问题
  2. 需求分析
  3. 软件设计
  4. 编码
  5. 测试
  6. 后期维护

使用瀑布模型来管理软件之后, 效果立竿见影, 项目的管理流程化了, 同时也可以针对各个阶段进行评估, 来估算项目的整体进度.

瀑布模型和装修有些类似, 先确认需求, 然后进行设计, 最后具体实施. 但是毕竟是两个不同的领域, 在盖房子的过程中, 基本不会有需求变更的时候, 而在软件开发中, 变更需求简直就是家常便饭. 而瀑布模型又无法快速的对需求的变更进行响应.

简单总结一下瀑布模型的优缺点.

优点: 可以按照阶段进行检查, 在前一阶段无误后, 全力开启下一个阶段. 同时项目总体进度可控, 可以有计划的进行.

缺点:

  • 难以及时响应需求的变化
  • 工作分布不均衡, 前期开发人员无法参与, 后期又完全靠开发测试
  • 任何一环的出现问题导致时间过长, 会导致连锁反应, 后面环节的时间都要压缩.

虽然瀑布模型存在这一些缺点, 但也比之前的游击队要好的多了.

快速原型模型

在需求分析阶段, 为了进行需求的确认, 可以简单快速的搭一个demo, 用户需求变化之后, 可以快速进行响应并将其添加到软件中. 当然, 为了追求速度是需要牺牲质量的.

在需求确认之后, 对于原型可以选择丢弃, 因为他已经完成了它的使命.

不过建造原型不一定需要开发, 对于一些界面应用, 有简单可行的工具, 进行简单的拖拽就能实现简单的界面与交互, 同样可以达到确认需求的目的.

小瀑布模型

瀑布模型因为周期比较长, 所以无法及时响应需求的变动, 如果将一个大瀑布拆分成多个小瀑布, 就可以分阶段交付.

那么问题来了, 如果将一个瀑布拆分成多个呢?

  1. 按照模块进行划分, 划分为多个模块, 可以并行开发多个模块来提高效率. 同样无法及时响应需求变动.
  2. 简化需求, 先实现一个版本一, 然后再进行下一个阶段, 直至达到最终效果. 想了想, 产品上线后的更新迭代不就是了.

其中每个小瀑布都包含瀑布模型的完整流程.

敏捷开发

以上几种模型, 都是基于瀑布模型进行的改进, 传统的瀑布模型周期长, 难以响应变化, 针对这些问题, 提出了敏捷开发.

你一定听说过一个东西: 敏捷宣言. 就是下面这个:

image-20210501153721518

链接: http://agilemanifesto.org/

敏捷宣言中并没有给出具体的实施步骤, 只是提出了一些思想.

不难发现, 敏捷宣言中右侧的内容, 都是传统的瀑布模型中强调的内容. 其大概就是通过不断的快速交付软件, 收集新的需求, 不断进行完善. 其强调拥抱需求的变化.

打个比方, 我们开始一个新的项目, 按照传统的瀑布模型, 在开发过程中是不会轻易修改需求的, 而这明显违背了敏捷开发的价值观: 客户合作高于合同谈判, 响应变化高于遵循计划.

而为了达到以上的目的, 也提出了一些方法.

1. 需求就是一个小故事

没有详细的需求文档, 只是提出: 我想要一个 xxx. 开发人员再开发过程中, 不断进行完善并确认细节. 如此就减少了大量需求文档的编写, 但同时, 也会造成需求理解错误, 最终效果差别较大.

可以将所有的故事放到一个列表中, 并标明状态(待办/处理中/已完成等), 开发人员根据优先级去完成列表中的任务即可. 同时也可以追踪哪些任务提了很久都没做, 已经不需要可以直接去掉.

2. 定期重构

因为每次只做部分需求, 所以无法在一开始就将整体架构完善, 迭代次数一多, 架构就跟不上业务了, 所以要进行重构来满足新的业务.

3. 自动化测试

通过单元测试, 集成测试等, 在开发的过程中完成部分测试的任务.

4. 每日站立会议

每天上班时, 先一起开一个站立会议, 目的是同步一下项目进度, 是否需要他人支持, 是否遇到困难等.

5. 小版本发布

每个版本只添加一些小功能, 就可以快速完成并发布. 发布多个版本之后达到一个较复杂的功能. 可以多次发布版本, 及时对业务进行调整.

等等

那么敏捷开发和上面简化需求持续迭代的小瀑布模型有什么区别么? 我是这样理解的, 在瀑布模型中, 需要经过整个从提出问题到测试发布的过程. 而敏捷开发没有这些繁琐的流程, 开发人员直接拿到一个需求的想法, 就可以开始编码发布了.

敏捷开发也有一些提出的具体流程, 比如极限编程/Scrum等(个人觉得极限编程的想法有点扯). 但我觉得主要还是借鉴其思想.


以上几种开发流程, 其实就是2种, 传统的瀑布模型, 和较新的敏捷开发. 瀑布模型基本上就是流水线作业, 项目进度较为直观, 基本上是从传统工业上面借鉴的思路. 而敏捷开发给我的感觉更适合软件行业一些. 倒也不是说那个好那个不好, 甭管黑猫白猫, 能抓到耗子就是好猫. 在具体实施中, 可以将多个模型相结合, 相互借鉴想法, 打造出适合自己的流程.

简单了解一下, 只听说过敏捷开发, 但没有具体了解过.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508383.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于对接需求的思考

产品说想要一个登录注册的功能, 你一想, 好说, 不就是用户名密码嘛, 然后开发完成 产品看到成果后: 我要的是手机验证码登录结果写好的功能基本废了 产品又想要一个登录注册的功能, 这回你学乖了, 确认了一下, 是手机验证码登录, 没问题, 然后开发完成 产品拿到成果: 怎么没有验…

路径.git下的文件

用了这么久的git, 可以毫不谦虚地说对git是一无所知. 每天用来用去的就是commit, add, merge 等几个有限的命令, 这不符合我这刨根问底的性格啊. 不行, 得研究研究, 从哪里下手呢? 别的咱先不说, 所有 git 项目都有这么一个文件夹.git, 不如就从它入手 ? 那咱就看看这个文件夹…

git 操作二进制文件

平常用git进行项目管理已经稀松平常了, 今天咱来点不一样的. 平常管理的都是普通的文本文件, 如果是二进制文件, git能够处理么? 比如word文档. 测试一下. 新建一个项目, 在其中创建test1.docx, test2.txt两个空文件并提交. 之后编辑文件并添加标题, git diff看一下效果: 效…

Go 常量定义

定义常量在各个语言中都是不可或缺的语法了. 而有些语言在常量的基础上, 增加了枚举类型, 比如C. enum Weekday {SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY };上面的枚举, 对应的值依次为0到6. 而在Go中, 是没有提供枚举类型的. 如果实现上面相同的功能, 难…

搭建个人博客

一直都想着搞一个自己的个人博客, 拖着这么久, 最近终于开始动手了. 故留下一篇完整的记录, 若你也刚好有相同的需要, 那这篇文章应该恰好能够帮助到你. 准备 云服务器个人域名 如果没有云服务器, 将应用跑在自己的电脑上, 通过内网穿透大概也能达到效果, 但是个人电脑实在没…

nginx 配置文件的匹配规则

引出 之前在对php-fpm 进行nginx代理时, 为了对后台限定 IP 访问, 添加了如下配置: location ^~ /admin {allow 127.0.0.1;deny all; }结果呢? 所有admin路径下的php文件, 全都没有解析, 变成文件下载了. 当时我不知道是什么问题, 不过将这段配置去掉之后, 问题就消失了. 所…

分库后如何分页

前言 在实际应用中, 为了降低单表的数据量, 会对较大的表进行水平切分, 将单表的数据切分到多表多库中. 既然要切分, 就要有一个切分的依据, 比如说按照 ID 取模等. 那么多张表联合分页是如何做到的呢? 如果分表的依据是字段 A, 但是需要根据字段 B 进行分页查询, 针对这种…

计算机是如何进行时间同步的

WHY 在网络世界中, 各个计算机之间要想协同工作, 时间同步是一个十分重要的基础. 在计算机内部是有自己的时间的, 这个时间通过内部的晶体振荡器差生的固定频率, 来模拟时间流逝进行计算. 虽然频率十分稳定, 但也是有误差的, 虽然现在的工艺水平误差已经十分小了. (关于震荡的…

WordPress架构简单剖析

前言 最近在搭建自己的博客站点时, 选择了网站使用较多的WordPress, 随着慢慢的使用, 它灵活的插件和主题令我折服. 基本上任何想要实现的功能, 都可以在上面通过插件的形式进行添加. 无论是在访问前的缓存、访问后的统计、访问中的过滤、各种流程的修改等等, 几乎都能够以插件…

Gale-Shapley算法

前言 最近看了一档综艺《心动的信号》(唉, 单身久了, 开始喜欢看别人谈恋爱了) 节目中共有n男n女, 他们会在节目的最后进行表白, 如果我喜欢你, 恰好你也喜欢我, 那么便就会在一起, 自此传为一段佳话. 于是, 我就在想, 如何用算法来实现这个匹配的过程呢? 单一匹配 将信息…

阿里云定时任务并自动释放

前言 最近写了一个爬虫脚本, 脚本跑在一台北京的 ecs 上. 但奈何因某种未知力量, 需要连接代理才能访问目标网站. 本来想着自己搭代理, 但是太贵了, 就暂时搁置了. 直到我发现了这个: 阿里云香港的服务器, 一个小时才5分钱. 如果脚本直接跑在香港服务器上不就可以了咩, 按照这…

智能优化算法应用:基于金豺算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于金豺算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于金豺算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.金豺算法4.实验参数设定5.算法结果6.参考文献7.MA…

pixiv小控件

前言 最近看到一个大佬, 开源了一款博客小插件, 地址. 可以将pixiv网站的日榜放到博客侧边栏. 看上去很炫酷. 于是我也引入到了自己的博客中. 在此向大佬表示感谢. 但是在使用过程中, 经常遇到访问很慢的情况, 查看之后才发现, 大佬的服务器架设在韩国, 难怪访问比较慢, 都走…

PHP-PDO参数绑定问题

前言 今天在执行这样一段代码: $data [username > hujingnb,address > beijing, ]; $dbh new PDO("mysql:host{$host};dbname{$dbname}", $username, $password); $statement $dbh->prepare(INSERT INTO test_user (username, address) VALUES (:usern…

Python 的协程

前言 最近在看部分Python源码时, 发现了async 这个关键字. 查了一下发现了Python中的协程. 协程这玩意, 在GO中我用过啊, 简单说, 就是一个轻量级的线程嘛, 由语言自己来实现不同协程的调度. 想着Python中可能也是差不多的东西吧. 但是我Google搜了一下, 前面的说明都给出了下…

PHP脚本调用命令获取实时输出

在写脚本的时候, 经常会有需要调用其他命令. 而在调用一些耗时命令的时候, 我们是需要能够实时掌握脚本进度的. 一般来说, 脚本的进度通常是通过脚本的输出来获得. 如果是一个bash脚本, 那么直接调用命令 A就可以将执行权交出去, 然后命令 A的输出就可以实时显示出来了. 如果…

如何使用git管理crontab任务

前言 在Linux系统上执行定时任务, 使用crontab还是很方便的(有关crontab的使用可看crontab指令笔记). 只需要一行命令就完成了. 但是, 美中不足的是, crontab通过命令行管理任务, 无法通过代码库对任务进行管理. 若要更换机器, 所有任务都要重新增加一遍. 更糟的是若服务器突…

Golang 反射操作整理

前言 反射是什么? 我们平常也是经常用到, 而且这名词都用烂了, 这里就不再详细介绍了. 简单说, 就是有一个不知道是什么类型的变量, 通过反射可以获取其类型, 并可操作属性和方法. 反射的用途一般是用作生成工具方法, 比如你需要一个ToString方法, 要将变量转为字符串类型,…

Wordpress不同页面显示不同小工具

问题 想做一个在右侧显示的文章目录, 使用文章目录的插件 Easy Table of Contents, 将其添加到右侧的侧边栏中, 很轻松做到了这点. 但是, 一个新的问题出现了. 这个目录的工具, 需要在文章页面显示, 而在其他页面不显示. 那么问题来了, 如何让不同的页面显示不同的侧边栏工具…

虚拟内存分页机制的地址映射

概述 在之前的文章虚拟内存对分页机制做了简单的介绍. 还有一个疑问, 那就是如何将虚存中的逻辑地址映射为物理地址呢? 今天就来简单分析一下. 对于一个分页的地址来说, 一般包含两个元素: 页号: 第几页偏移量: 当前页的第几个字节 以下以 addr_virtual(p, o)表示一个逻辑…