我应该在我的软件项目中使用正式方法吗?

时间:2009-04-09 19:32:22

标签: web-applications modeling requirements formal-methods formal-verification

我们的客户希望我们构建一个基于Web的富Internet应用程序来收集软件需求。基本上,它是一个基于Web的案例工具,遵循从利益相关者那里获取需求的特定流程。我是项目经理,我们还处于项目的早期阶段。

我一直在考虑使用正式方法来帮助我的客户和开发人员澄清该工具的要求。通过形式方法,我的意思是某种形式的建模,可能是基于数学的。我已经阅读并正在考虑的一些内容包括Z(http://en.wikipedia.org/wiki/Z_notation),状态机,UML 2.0(可能包含诸如OCL的扩展名),Petri nets以及一些编码 - 合同以及前后条件等级别的东西。还有什么我应该考虑的吗?

开发人员经验丰富,但根据使用的形式主义,他们可能需要学习一些数学。

我正在尝试确定是否值得我在这个项目中使用正式方法,如果是这样,在多大程度上。我知道“这取决于”所以对我来说最有帮助的答案是肯定/否定和支持论证。

如果您参与此项目,您会使用正式方法吗?

8 个答案:

答案 0 :(得分:9)

  

我一直在考虑使用正式方法来帮助我的客户和开发人员澄清该工具的要求。

很少有开发人员有正式的方法经验。当我们将CADiZ移植到Windows时,我唯一一次看到正式方法培训的客户是ZUG的成员。

  

通过形式方法,我指的是某种形式的建模,可能是基于数学的。我已经阅读并正在考虑的一些事情包括Z(http://en.wikipedia.org/wiki/Z_notation),状态机,UML 2.0(可能带有OCL等扩展),Petri网以及一些编码级的东西,比如合同和pre和发布条件。还有什么我应该考虑的吗?

Z是一种非常大的差距,它是一种形式化的方法,以集合论为基础,而UML是一种非正式的符号,带有一些标记的半正式符号(状态机)。

一些技术客户,例如您希望使用软件需求工具,对UML非常熟悉。

创建域名的Z模型可能有价值,在客户端和服务器(或者petri网)之间创建消息传递的pi-calculus模型可能很有价值,但我发现pi更简单,功能更强大)。

您的域的Z模型将给出一个独立于实现的类型约束集,表示比任何常见实现语言的类型系统更强大。

您的消息传递的正式模型可以提供运行分析的工具,以确保您不会丢失更新或发生冲突或死锁。

UML模型给你的是一个用于将大型系统分解为功能区域(包图)的表示法,用于显示这些区域中的类如何静态地相互关联(类图),以及如何显示这些类的实例动态关联(序列,活动和交互图),并显示如何部署包(组件和部署图)。这些对于团队中的沟通很有用,并且可以稍微充实一些想法,但是没有正式定义的语义,这允许非常复杂的分析。

我在90年代与之合作的Z专家考虑过在Z中指定一个CASE GUI的想法。为这样的GUI创建UML模型很常见。

我没有使用正式的合同设计前后条件,虽然我有时会在评论中添加它们,并经常在断言中添加它们,并且我会测试可能违反它们的测试条件。

答案 1 :(得分:1)

这里要问的真正问题不是是否使用它们,而是获得和失去了什么。

生产力和结果是否会超过所需的复杂性和学习效果?

答案 2 :(得分:1)

一般来说,您应该使用团队所熟悉的内容。对于新项目,将会有一个学习曲线,这意味着会对过程和错误产生疑问。您的开发时间表的一部分将用于纠正这些问题,如果您不打算将来在这个团队中使用它们,那么通过引入新的东西,您将无法获得长期收益。改变过程需要很长时间和很多工作。

如果你有足够的时间来处理这些问题,你可能会没事......如果你的估计是正确的。考虑到你没有和这些人一起工作(至少这是你的帖子听起来像),你的时间表可能不会像它应该那样准确,这意味着你可能没有足够的时间来完成项目更不用说引入新流程了。

你要问自己的另一个问题是“你对你想要实施的过程有多满意?”我从不尝试在项目上引入新流程,除非我知道如果必须的话我可以让团队通过它。不时尝试新事物是件好事,但是你需要有一个你熟悉的团队才能知道如何在紧张的情况下航行。

答案 3 :(得分:1)

我一直在研究“轻量级”形式方法的几种方法,适用于可能对关键任务而非生命/安全至关重要的应用程序。一些想法:

答案 4 :(得分:1)

在游戏的后期,你可能会考虑testable architecture through Savara这样的东西,我们将这些东西用于许多项目,其中组件之间的沟通或互动占主导地位。这通常出现在任何SOA后端到Web前端。

它正式以pi演算为基础,你不需要理解pi演算来使用它。

答案 5 :(得分:1)

使用ACSL(ANSI C规范语言)有一些成功的例子,它们拥有成熟的工具集,其中大部分都是开源的,例如Why平台,Frama-C。对于Java类似的技术称为JML(Java Modeling Language)。我认为它们都用于嵌入式应用程序的中小型项目,它们有助于为代码添加一些保证,但不是为了验证规范。 Z绝对不是用户友好的,缺乏足够的工具支持恕我直言。

在可以在规范阶段使用的商业工具中,我将研究基于B方法的Rodin平台。

答案 6 :(得分:0)

我完全赞同汤姆并提出同样的问题,

生产力和结果是否会超过所需的复杂性和学习效果?

在我看来,除非系统/软件可以被识别为“安全关键”,否则不需要正式方法。

什么是安全至关重要的意思:

当计算机系统的故障可能导致灾难性后果,例如人命损失,环境破坏或系统本身受损时,这种系统被称为“安全关键”。

答案 7 :(得分:0)

我同意Tom和Abufardeh的意见 - 生产力和结果是否会超过所需的复杂性和学习?

此外,这种方法更适合在开发之前获得所有要求(并确保这些要求既定义明确又可测试)?首先获得所有要求似乎是常识,但是很大一部分程序并行处理并认为以后获得某些要求没有问题。要求蔓延是一场噩梦!电影“五角大楼战争”让所有不同意的人大开眼界。