各行各业都在使用和开发不同的软件,可以说软件无处不在,从分类上说,软件是一种最复杂的人造产品之一,是人们为了让机器实现一些功能,而去设计,分析并实现的产品。

我们先对典型的软件开发过程进行分析,一般从计划阶段的需求收集和需求分析,到实际的编码开发,测试和维护,是大多数软件项目的生命周期。但是我们可以看到的成本,是从分析,设计到编码测试过程中项目合同的成本,是水面上的一小部分,但是我们看不到的巨大隐藏冰山,是在系统维护过程中所耗费的巨大的成本,尽管我们在软件开发过程中,采取了一些质量保障手段,但可能还是会遇到软件危机。

1968年,北大西洋公约组织(NATO)在联邦德国的国际学术会议提出软件危机(Software crisis)一词。而1960年代中期开始爆发众所周知的软件危机,为了解决问题,在1968、1969年连续召开两次著名的NATO会议(北约峰会),并同时提出软件工程的概念。软件危机一般产生的后果是:

1.开发成本高,投资一再追加,往往是实际成本比预算成本高出一个数量级。而为了赶进度和节约成本所采取的一些权宜之计又往往损害了软件产品的质量。

2进度难控制,拖延工期几个月甚至几年的现象并不罕见,这种现象降低了软件开发组织的信誉,也会耽误软件使用者的工作。

3质量无法保证,软件是逻辑产品,质量问题很难以统一的标准度量,因而造成质量控制上的困难。软件产品并不是没有错误,而是盲目检测很难发现错误,而隐藏下来的错误往往是造成重大事故的隐患。

我们以一组属性来描述评价产品质量,软件质量通常包括以下特性:功能正确、可靠、易用、效率、可维护、可测试等,质量属性相互之间也并不是独立的,而是有相关关系的,+表示行属性对列属性是正向相关的,—则是相反,因此软件架构设计对质量属性进行衡量和取舍,同时也要充分考虑软件在不同用户的核心要求。

对于不同用户来说,核心的质量方面的需求是不同的,但是重叠的部分有三点,其中最最重要的软件质量是软件的可靠性,是其他质量保证的基础,也是不可替代的基石。

软件为什么会失效呢,为什么不能按照要求完成最初设计的功能呢?人在设计软件时候,其实就存在一些错误Error,是指实际值偏离你最初的期望,往往是由人为造成的;error导致代码存在一些fault,fault通常是由于程序中不正确的步骤,过程或者数据定义,导致程序出现了非故意的、不可预料的行为。fault又会导致出现failure,是一个系统或者组件不能完成它被要求的功能。用比较流畅的话来说呢,一些人为的error,使得程序中产生了不正确的步骤、过程和数据定义,从而使程序出现了一些不可预料的fualt,这些 fault最终又致使系统或者组件不能完成了最初要求的功能,也就是failure。

那我们明白了失效的机理之后,如何去更好的设计,才能在实践中提高软件的质量呢?

形式化方法是一系列用于描述和分析系统的符号表示法及相关技术,它们以一些数学理论为基础,如逻辑、自动机和图论等,且都致力于提高软件系统的质量。针对软件系统的的形式化方法,包括软件系统的形式化规约(specification)和形式化验证(verification)例如:时序逻辑、有限自动机、Petri网、进程代数等。建模的过程就是对模型的抽象过程,既然是抽象的话,就不可能保留所有细节,需要对重要细节进行抽象,对不重要细节进行忽略,就像论文的摘要,可以概括地表达目的,内容和效果,忽略了方法实现的细节。

实际上,形式化方法是从硬件设计开始普及的。一个著名的例子是:当年Intel的Pentium CPU浮点运算单元出错(FDIV Bug),数以万计的CPU不得不回收和替换,给Intel造成了巨大损失(475M $)。此后Intel开始在其芯片设计中广泛采用形式化方法。计算机硬件巨头如IBM,AMD, NVIDIA 和 CADENCE[2]等等也都是形式化方法的使用者。1996年,欧洲航天局首次发射的阿丽亚娜5型火箭,由于惯性导航系统发送的错误指令(浮点数转换为整数造成溢出),导致火箭在发射仅仅37秒后便偏离了预定轨道,最终坠毁。此后EADS公司开发阿丽亚娜火箭的任务调度模型就开始使用形式化方法。此外我国的玉兔号月球车控制系统和我国第一个自主研发的空间飞行器嵌入式实时操作系统SpaceOS[5],也都是通过形式化方法验证其正确性。

软件开发的形式化方法(Formal Method)之前世今生~相关推荐

  1. 《敏捷软件开发-原则、方法与实践》-Robert C. Martin

    Review of Agile Software Development: Principles, Patterns, and Practices 本书主要包含4部分内容,这些内容对于今天的软件工程师 ...

  2. 最优视频监控软件开发的实现方法

    在开发视频监控系统应用软件时,大家往往把关注的焦点集中于数字音/视频的编解码的实现上,而忽略了视频监控系统应用软件的整体架构.当然视频监控的核心也是在于音视频编解码上,佰锐的Anychat SDK 主 ...

  3. 提高软件开发效率的方法

    一个开发任务下达以后,我们希望尽快的实现的,对软件开发工程师的要求是:多快好省 多--单位时间产量高 快--同样的产量所需的时间少 好--质量高 省--省钱,省时,省资源 这四个目标中最主要的又是&q ...

  4. 什么是软件形式化方法

    软件形式化方法(Formal Method)在软件开发中一直都受到多方面的争议.持肯定态度的拥护者认为形式化方法会引起软件开发的革命,另一些持否定态度者则怀疑甚至反对将数学引入软件开发过程中. 形式化 ...

  5. 形式化方法(Formal Methods)

    形式化方法是基于严密的.数学上的形式机制的计算机系统研究方法. 形式化方法(FM-Formal Method)知识体系中的6个知识领域为: ① 基础(Foundations); ② 形式化规格(For ...

  6. sdlc 瀑布式 生命周期_SDLC指南–软件开发生命周期的阶段和方法

    sdlc 瀑布式 生命周期 When I decided to teach myself how to code almost four years ago I had never heard of, ...

  7. 在软件开发中如何将看板方法与 Scrum 集合使用?

    什么是看板和 Scrum 的混合模式?适合在哪些场景使用?有哪些成功的案例可参考?本文将围绕以上问题展开. 敏捷实践是一个团队过程,选择适合团队的敏捷框架时并没有什么技巧,无论您是使用看板方法.Scr ...

  8. ChinaSoft 论坛巡礼 | CCF-华为胡杨林基金-形式化方法专项论坛

    2022年CCF中国软件大会(CCF ChinaSoft 2022)将于2022年11月25-27日在线上举行.预期将有林惠民.陈左宁.邬江兴.何积丰.梅宏.吕建.柴洪峰.廖湘科.王怀民.郑纬民.蒋昌 ...

  9. 软件开发依据的标准或法律法规_第178篇丨直真科技:官宣!定制软件开发不应该采用完工百分比法确认收入...

    小兵评析 1.对于软件开发企业,如果按照基础的标准来区分,我们可以简单划分为:通用型软件开发和定制化软件开发. 2.对于通用型的软件来说,一般可以简单理解为传统的工业产品,一般就前期的研发铺垫.技术储 ...

最新文章

  1. 避免死锁的一些注意事项
  2. 加州理工华人博士提出傅里叶神经算子,偏微分方程提速1000倍,告别超算!
  3. 刚学GDI+和.Net WinForm控件开发时做的Training Project
  4. linux查询字段排序,Linux 操作命令 sort
  5. Java并发(二十一):线程池实现原理
  6. LeetCode动态规划 跳跃游戏II
  7. C++ limits头文件的用法numeric_limits
  8. 从拿到班车手册.xls到搜索附近班车地点
  9. 【华为云技术分享】云小课 | 灵活配置权限,满足存储安全(OBS权限管理介绍上篇)
  10. 九大最新热门IT技术 把把都是双刃剑
  11. editplus3 关联鼠标右键
  12. 在python如何调用三角函数_Python中计算三角函数之cos()方法的使用简介
  13. 中国广电即将放号,感受到压力的中国移动率先推出19元5G套餐
  14. 不同时区时间换算_时区换算-如何计算时区? 爱问知识人
  15. 【阶段二】Python数据分析Pandas工具使用07篇:探索性数据分析:数据的描述:数据的集中趋势
  16. 服务器2003蓝屏A5修复,win2003文件服务器蓝屏修复全过程分享第2/2页
  17. 成大事必备的九种办法与能力
  18. 镭速介绍关于高速数据传输!
  19. Office2013出现”停止工作“问题的解决
  20. 如何在互联网公司求职成功

热门文章

  1. OpenCV中CV_RGB2GRAY和CV_BGR2GRAY的区别
  2. 做虾皮跨境电商前期需要投入多少资金?详细介绍
  3. HackRF 代码讲解 (一)
  4. 【基础课程】计算机组成原理
  5. 哈工大《机器学习理论与算法》课程总结
  6. ARTS-9(回溯法的组合总和系列,泛型总结、人生的意义在于体验)
  7. php mysql 显示数据库连接失败_php mysql_connect 连接数据库失败解决方案
  8. adb 常用命令记录
  9. VSCode使用详细教程
  10. RPC接口测试技术-websocket 自动化测试实践