软件工程形式化方法初学体会

本贴最后更新于 2081 天前,其中的信息可能已经时过境迁

最近在上一门叫做新技术讲座的课,我估计好多同学是看到讲座这两个字感觉这课会很水才选的,但实际上这门课讲的内容是非常硬核的软件工程形式化方法,而且授课老师也是国内第一批研究软件工程形式化方法的教授,现任日本埼玉大学教授,且上课非常认真负责,每节课都有课堂练习。不过了解了软件工程形式化的概念后,发现这个研究方向真的了不得,简直可以颠覆整个软件行业。

在早期的软件开发过程中,开发者们往往拿到问题后就直接开始编码,软件往往会出现各种各样的问题,大部分软件的质量十分低下,被称为“软件危机”。为了解决软件质量低下的问题,人们提出了软件工程化的思想,也就是目前主流的软件开发方式,引入了从需求分析到最后编码实现这一系列的过程,以及需要遵守的一系列规范,并定义了如 CMMI 这样的规范性等级。然而软件工程里面有很多内容的规范是非常主观的,没有一个确定的评定标准,另外很多步骤只能尽量争取正确,但根本无法确保正确,比如对于软件的测试,在软件测试这门课中就了解到全覆盖基本上是不可能完成的,并提出了语句覆盖、判定覆盖、条件覆盖等一系列只能尽量争取正确的测试覆盖。而且在执行的过程中,就算是 CMMI 5 级的开发单位也往往会为了追求进度而省去其中某些甚至很多步骤,导致最后开发出来的软件根本不可用。可以说,软件工程化确实解决了一部分问题,但治标不治本,没有从根本上解决软件质量低下的问题。

有没有一种方法可以从根本上解决问题呢?有,就是软件工程形式化方法。软件工程形式化的目的简单来说就是把要解决的问题先用逻辑学和集合论等数学的方式把它抽象表示出来,也就是形式化,之后就可以自动化的方式完成一些原本需要大量人工完成的步骤。它的效果是可以减少软件开发的成本,同时大大减少软件中的错误。由于数学是稳定的、抽象的,可以应用到各个领域,可以作为一个相对正确性的基础,因此我们就可以将其他事物的正确性建立在数学的正确性之上。另外,形式化方法可以大大减少规格说明的二义性,防止出现客户和开发方对需求理解不一致的情况。我们可以这么理解,在软件工程形式化方法中,只要规格说明(specification) 是正确的,那么最后的软件产品一定是正确的,甚至连测试都不需要做。就如同建筑一样,只要图纸和设计方案正确,那么一个合格的施工队一定能建造出正确的建筑,而且已经建造完毕的建筑也无法像软件产品一样测试之后发现错误再进行修改。

为何建筑工程的精准性和正确性如此之高,其实就是引入了形式化方法的思想。在建筑工程设计中,一定都会首先在图纸上对建筑进行力学分析和计算,确保最终建筑拥有完美的力学结构,或者至少不容易塌。并且设计单位和施工单位往往不是同一家,但最后的施工成果依然能满足设计单位原先的要求。而在软件工程中,对于数学的应用主要在算法、数据结构中,比较少地用来抽象具体事物以及约束它们的关系。从这个角度看软件开发过程的先进性远远不如建筑工程的过程,尽管 IT 被认为是高新技术。

在软件工程形式化方法中,规格说明的重要性大大提高了,同时在规格说明中,如何用数学语言而不是自然语言抽象一个具体的事物是需要重点考虑的问题。可以看一下伦敦地铁线路图的抽象例子。
老图:伦敦地铁原图.PNG
新图:伦敦地铁新图.PNG

可以看到最后抽象的结果十分清晰明了、没有歧义、且具有可维护性,与之相比,老图尽管更精确地反应了真实的地理位置,但却让读者感到混乱。目前几乎所有城市的地铁以及公交线路示意图都模仿了伦敦地铁图。软件工程形式化的规格说明也需要像这样排除无关事物的干扰,并且精准、无二义性。比如,“令 x=3,y=x+1”就比“令 x 为一个存有 3 的内存单元,令 y 为存有 x+1 的值的内存单元”好得多,尽管在计算机中实际运算的过程可能是后一种。

在软件工程形式化方法中,是不需要进行测试的,尽管利用形式化方法产生测试用例同样可以提高效率,而且工业应用上也有相应的工具,但实际上并不推荐这样的用法。因为测试本质上就是效率低下的,前面已经提到,测试根本无法保证所有可能的结果都正确。在软件工程形式化方法中,取代测试地位的是证明(proof)。绝大多数关于软件工程形式化方法的文章中都提到了证明,可见证明在软件工程形式化方法中的重要性。证明可以保证的正确性远远高于测试。工程师在构建抽象模型的过程中,需要通过数学证明的方式逐步验证它。要证明的语句不需要工程师自己定义,而是由一个叫做证明业务生成器的工具自动生成。为了生成证明语句,该工具将不断分析抽象模型的各个精化形式。要做的证明需要关注两方面情况:1.抽象模型里的转换是否保持了不变式的成立。这方面称为不变式保持证明。2.抽象模型的每个更准确的版本是否破坏了前一版中已经证明的性质,这称为精化正确性证明。这些证明中的大多数都由一个叫做证明器的工具自动完成。

当然,任何方法都不是十全十美的,软件工程形式化方法也存在着一些问题以及推广上的障碍。尽管软件形式化方法总体上来说能够节省成本,但它在前期设计规格说明阶段投入较多,传统观念根深蒂固的老板们可能这样做觉得不值得。对于软件工程师来说,习惯了传统的开发方式,而软件形式化方法需要换一种思路去思考问题,可能前期不太适应,而且对于非数学专业的他们来说,对系统构造出清晰的数学关系模型可能稍显困难。另外,则是形式化方法中用到的自动化工具本身可能存在问题,无法保证翻译器能够正确地将数学模型翻译成可执行代码,这样也就无法保证最终的正确性。

尽管如此,但从软件工程形式化目前已有的应用来看,它是相当成功的。最早的软件工程形式化方法应用是在 IBM 的 CICS 系统中。当时 CICS 的复杂程度已经成了一个严重的问题,靠人力已经很难再对这个系统进行维护,因此 IBM 想要重新设计这个系统。当时 CICS 的经理和牛津大学的一名研究形式化方法的教授进行了沟通,并决定使用形式化方法来重新设计 CICS 系统,使用的方法叫做 Z notation。工程师们习惯了使用自然语言来描述 specification,一开始还担心用数学方法来表示 specification 对他们来说很困难。但最后证明这并不是个问题,就连没有一些数学经验的程序员也能够轻松运用。最终开发成本减少了百分之 9,用户报告的错误减少了 2.5 倍,而且都是轻微的错误。巴黎地铁 14 号线和 Roissy 机场穿梭车的无人运行系统也是使用形式化方法开发的。它们使用的方法叫做 B notation,比 Z notation 出现得更晚一些。这两个案例都没有执行单元测试,工程师没有修改任何代码行,然而最终的运行结果仍然非常成功。

软件工程形式化方法的前景十分远大,一旦实现在工业中的广泛应用,将彻底颠覆整个软件行业,大幅度提高生产效率和减少错误。非常有幸能在大学中了解到这么前沿的技术。

  • 软件工程
    29 引用 • 81 回帖
  • 形式化
    1 引用
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    172 引用 • 534 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    8 引用 • 26 回帖 • 1 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    209 引用 • 2040 回帖 • 1 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 273 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    201 引用 • 120 回帖
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖 • 2 关注
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 5 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    730 引用 • 1281 回帖 • 1 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 487 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 3 关注
  • OnlyOffice
    4 引用 • 24 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 78 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    188 引用 • 1057 回帖
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    10 引用 • 54 回帖 • 176 关注
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    117 引用 • 99 回帖 • 200 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    268 引用 • 666 回帖 • 1 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 676 关注
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 98 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    79 引用 • 431 回帖 • 3 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 1 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    92 引用 • 752 回帖
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖 • 1 关注
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    91 引用 • 122 回帖 • 623 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    35 引用 • 468 回帖 • 762 关注