4

我是一名对信息检索感兴趣的软件开发人员。目前我正在处理我的第三个搜索引擎项目,并且对一次又一次编写的样板代码数量感到非常沮丧,同样的错误等等。

基本搜索引擎是一个非常简单的野兽,可以用由两个“层”组成的正式语言来描述:

  1. “原语层”(或公理,内核语言 - 不知道如何命名它们)。它们包括几个集合(作为一组资源 - 文件、网站)、集合上的关系(作为“站点 A 链接到站点 B”)和简单的操作,例如“打开资源 A 的流”、“从流中读取记录”、 'merge N 个流','index set of records by field F'等。还有很多数据转换,如'save stream in YAML format','load stream from XML format'等。

  2. “应用层”——构成搜索引擎生命周期的几个非常高级的操作,如“收获新资源”、“抓取收获的资源”、“将抓取的资源合并到数据库”、“索引抓取的资源”、“合并索引”等等。每一个高级操作都可以用从 1 开始的“原语”来表示。

这种高级表示可以很容易地测试,甚至可以正式证明,并用所选的编程语言实现(或代码生成)。

那么问题来了:是否有人以这种方式设计系统——形式上、严格(甚至可能在代数/群论的层面上),在严格的自上而下的方法中?我可以阅读以了解什么?

4

6 回答 6

4

关键系统(核电站、飞机、列车控制系统……)采用自上而下的方法开发,类似于您正在寻找的方法。但是上层甚至根本不是程序化的。它不是关于内核层和应用层,而是关于细化为组件、子组件的高级设计,每个级别都有精确的规范。

规范可以是正式的(旨在在指定组件可用时自动验证)或不是(旨在通过测试、代码审查或任何适当的方法进行验证)。坦率地说,在 2009 年,它们大部分时间都不正式,尽管趋势显然是朝着那个方向发展。

由于您在问题的标签中提到了正式的方法,因此您一定对该主题感兴趣,但目前它只是一个小众市场。我尤其不明白这些方法如何经济地应用于搜索引擎项目。无论如何,如果您想了解更多关于这些方法如何应用于它们工作的领域,这里有几个链接:

有人提到 Z:Z 是规范语言,您在其中细化和细化规范直到它们变得可执行的框架称为B。您可能还对合金感兴趣。最后,现有编程语言有正式的规范语言。这一趋势始于JML for Java,并启发了许多其他人。我在一群人中工作,他们为 C, ACSL定义了这样的规范语言。

于 2009-11-25T19:52:02.893 回答
1

简短的回答是,“是的,在不同程度上。”

不同的组织以不同程度的严谨性来处理软件开发,但是分层设计的概念,其中每一层处理其职责的一个非常受限制的,精确设计的接口,由下一层提供的服务,是很好的-已确立的。我要指出,测试驱动开发、依赖注入和接口设计越来越被接受,这证明这些想法正逐渐成为软件开发的标准。

然而,软件开发的追求范围广泛,用途广泛。正如物理制造中的精密工程水平随着规模和复杂性的增加而增加(例如喷气发动机制造商与图片框架制造商)一样,一些软件开发人员处理的系统的性能和使用规模足够小,以至于他们可以容忍缺乏精度,甚至是长期存在的缺陷(例如,典型的 Web 开发人员与从事航空电子设备或嵌入式医疗设备的开发人员)。

我的观察是,精度和严格的分层通常被认为是只有在缺陷的后果足够高时才会产生的成本。但我看到这种情况正在慢慢好转,至少在互联网规模的关键任务系统的开发中是这样。

于 2009-11-25T13:38:49.867 回答
1

对于我们的大多数项目,我们都有一个基于标准 3 层架构的架构:

  • 用户界面:手动测试
  • 业务:经过模拟测试
  • 代理/数据访问:通过集成测试进行测试

要了解有关架构模式的更多信息,请参阅http://en.wikipedia.org/wiki/Architectural_pattern_(computer_science)

于 2009-11-25T14:45:59.500 回答
0

我建议查看IEEE-1471

于 2009-12-03T20:16:02.963 回答
0

唔。不知道这是否有帮助,但你看过Z 符号吗?我在 uni 听说过它,但没有使用它(我没有参加那个模块)。

于 2009-11-25T12:06:12.367 回答
0

我会挑战你的假设,即需要以这种方式编写可重用代码。

我已经看到工作场所的系统设计有重用代码目标,最终重用 v.很少,而且到处都有额外的复杂性。

我发现坚持 SOLID 中的原则、进行 TDD、牢记 DRY、YAGNI 和 KISS 对实现合理的重用水平大有帮助。

您提到的操作是不同职责的完美示例,不应全部以同一类结束:

open stream to resource A', 'read record from stream', 'merge N 个 streams', 'index set of records by field F' 等等。还有很多数据转换,如'save stream in YAML format' , '从 XML 格式加载流' 等。

我向您推荐这本关于solid的电子书。

在尝试自上而下设计时,小心反复思考“如果 x 会怎么样”、“如果 y 会怎么样”......因为你太容易添加大量你最终不需要的东西 - 或者是没有以可重用的方式建模(即使这是您添加它的原因......)。

于 2009-12-01T07:10:41.120 回答