管理软件中复杂性/可视化组件的最佳实践?

时间:2008-11-20 01:16:55

标签: complexity-theory

我们正在构建从网络挖掘信息的工具。我们有几件,比如

  • 从网络抓取数据
  • 根据模板提取信​​息&业务规则
  • 将结果解析为数据库
  • 应用规范化&过滤规则
  • 等等。

问题在于解决问题&对每个阶段发生的事情有一个很好的“高级图片”。

哪些技术有助于您了解和管理复杂流程?

  • 使用Windows Workflow Foundation等工作流程工具
  • 将单独的功能封装到命令行工具&使用脚本工具将它们链接在一起
  • 编写特定于域的语言(DSL),以指定在更高级别发生的事情。

只是好奇你如何处理具有许多交互组件的系统。我们希望记录/理解系统如何在比追踪源代码更高的层次上工作。

8 个答案:

答案 0 :(得分:3)

我使用AT& T着名的Graphviz,它很简单并且工作得很好。它也是Doxygen使用的相同库。

此外,如果您付出一点努力,您可以获得非常漂亮的图表。

忘记提及,我使用它的方式如下(因为Graphviz解析Graphviz脚本),我使用替代系统以Graphviz格式记录事件,所以我只需解析Logs文件并获得一个漂亮的图形。 / p>

答案 1 :(得分:2)

代码说明每个阶段会发生什么。使用DSL将是一个福音,但如果以编写自己的脚本语言和/或编译器为代价可能不会。

更高级别的文档不应包含每个步骤发生的细节;它应该提供步骤的概述以及它们如何相互关联。

好的提示:

  • 可视化您的数据库架构关系。
  • 使用visio或其他工具(如您提到的那些工具 - 尚未使用它)进行流程概述(imho它属于您项目的规范)。
  • 确保您的代码结构合理/分区/等。
  • 确保您有某种项目规范(或其他一些“一般”文档,解释系统在抽象层面上的作用)。

我不建议构建命令行工具,除非您实际使用它们。无需维护您不使用的工具。 (这与说它无用是不一样的;但你所做的大部分听起来更像是属于一个库,而不是执行外部过程。)

答案 2 :(得分:1)

我的公司为每个主要组件写functional specifications。每个规范都遵循一种通用格式,并根据需要使用各种图表和图片。我们的规格有功能部分和技术部分。功能部分描述了组件在高级别上的作用(为什么,它解决了什么目标,它没有做什么,它与之交互的内容,相关的外部文档等)。技术部分描述了组件中最重要的类和任何高级设计模式。

我们更喜欢文字,因为它是最通用且易于更新的。这是一个大问题 - 并不是每个人都是Visio或Dia的专家(甚至是体面的),这可能成为使文档保持最新的障碍。我们在维基上编写规范,以便我们可以轻松地在每个规范之间进行链接(以及跟踪更改),并允许通过系统进行非线性遍历。

对于权威人士的争论,Joel推荐功能规范herehere

答案 3 :(得分:1)

我发现dependency structure matrix是分析应用程序结构的有用方法。像lattix这样的工具可以提供帮助。

根据您的平台和工具链,有许多非常有用的静态分析包可以帮助您记录应用程序的子系统或组件之间的关系。对于.NET平台,NDepend就是一个很好的例子。其他平台还有很多其他平台。

在构建系统之前拥有一个好的设计或模型是了解团队应该如何构建应用程序的最佳方式,但是我提到的工具可以帮助实施架构规则,并且通常会让您深入了解只是拖拽代码的设计不能。

答案 4 :(得分:1)

我不会使用你提到的任何工具。

你需要绘制一个高级图表(我喜欢铅笔和纸)。

我会设计一个系统,让不同的模块做不同的事情,这样做是值得的,这样你就可以让每个模块的许多实例并行运行。

我会考虑使用多个队列

  • 要抓取的网址
  • 网页抓取的网页
  • 基于模板提取的信息&业务规则
  • 解析结果
  • normalizationed&过滤结果

您可以使用简单的(可能是没有UI的命令行)程序,这些程序可以从队列中读取数据并将数据插入一个或多个队列(Crawler会将“URL同时提供给Crawl”“网页抓取的网页”),您可以使用:

  • 网络抓取工具
  • 数据提取器
  • 解析器
  • 标准化程序和过滤器

这些将适合队列之间,您可以在不同的PC上运行这些副本,从而可以扩展。

最后一个队列可以被送到另一个程序,该程序实际上将所有内容发布到数据库中以供实际使用。

答案 5 :(得分:0)

自上而下的设计有很大帮助。我看到的一个错误就是让自上而下的设计变得神圣。您的顶级设计需要像其他任何代码段一样进行审核和更新。

答案 6 :(得分:0)

在整个软件开发生命周期中对这些组件进行分区非常重要 - 设计时,开发时间,测试,发布和运行时。仅绘制图表是不够的。

我发现采用微内核架构确实可以帮助“分裂和克服”这种复杂性。微内核架构的本质是:

  • 进程(每个组件在隔离的内存空间中运行)
  • 线程(每个组件在单独的线程上运行)
  • 通信(组件通过单个简单的消息传递通道进行通信)

我编写了一个相当复杂的批处理系统,听起来与您的系统类似:

每个组件都映射到.NET可执行文件 可执行的生命周期通过Autosys管理(全部在同一台机器上) 通过TIBCO Rendezvous进行沟通

如果您可以使用提供运行时内省的工具包,那就更好了。例如,Autosys让我看到正在运行的进程,以及TIBCO允许我在运行时检查消息队列时发生了什么错误。

答案 7 :(得分:0)

我喜欢使用NDepend对复杂的.NET代码库进行逆向工程。该工具具有几个出色的可视化功能,如:

依赖图: alt text

依赖矩阵: alt text

通过treemaping进行代码度量标准可视化: alt text