2008-11-20 75 views
7

我们正在构建用于从网上挖掘信息的工具。我们有几件,从网络如在软件中管理复杂性/可视化组件的最佳实践?

  • 抓取数据基于模板&业务规则
  • 解析结果到数据库
  • 应用规范化&过滤规则
  • 等,等
  • 提取信息

问题是排除故障问题&对每个阶段发生的事情都有很好的“高层次图片”。

什么技术帮助您理解和管理复杂的过程?

  • 使用的工作流程工具,如Windows工作流基础
  • 封装功能分割为命令行工具&使用脚本工具将它们连接在一起
  • 写域特定语言(DSL)来指定什么样的顺序东西应该发生在更高层次上。

只是好奇你如何得到一个系统与许多交互组件的句柄。我们希望文档/了解系统如何在比追溯源代码更高的层次上工作。

+0

如果你想给的答案你,如果你投他们的话就不会受伤。 ;) – Till 2008-11-23 17:58:58

+0

完成并完成:) – Kalid 2008-11-24 22:16:54

回答

2

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

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

很好的提示:

  • 可视化你的数据库架构关系。
  • 使用visio或其他工具(如你所提到的 - 没有使用它)用于过程概述(它属于你的项目的规范)。
  • 请确保您的代码结构合理/划分等。
  • 确保您有某种项目规范(或其他“通用”文档,说明系统在抽象层次上执行的操作)。

我不会推荐构建命令行工具,除非您实际上已经使用它们。无需维护您不使用的工具。 (这不同于说它不可用;但是你所做的大部分听起来更像是属于图书馆,而不是执行外部过程)。

+0

感谢您的提示 - 我喜欢visio/specs,但不可避免地他们似乎过时了。理想情况下,可视化可能来自代码本身(如db模式关系)。 同意 - 命令行工具本身没用,但有时脚本比代码更容易扫描。 – Kalid 2008-11-20 01:57:17

3

我使用AT & T的着名Graphviz,它的简单和很好地工作。它与Doxygen也使用相同的库。

此外,如果你做了一点努力,你可以得到非常漂亮的图表。忘记提及,我使用它的方式如下(因为Graphviz分析Graphviz脚本),我使用替代系统以Graphviz格式记录事件,所以我然后只是解析日志文件并得到一个很好的图。

+0

将日志记录到Graphviz格式是一个非常酷的主意 - 谢谢! – Kalid 2008-11-20 01:55:04

1

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

我们更喜欢文字,因为它是最通用和最容易更新的。这是一件大事 - 并不是每个人都是Visio或Dia的专家(或者甚至是像样的),这可能会阻碍文档的更新。我们在维基上编写规范,以便我们可以轻松地链接每个规范(以及跟踪更改),并允许通过系统进行非线性漫游。

对于来自权威机构的争论,Joel建议使用功能规格herehere

1

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

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

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

0

自上而下的设计帮助了很多。我看到的一个错误是使顶级设计成为神圣的。您的顶级设计需要像任何其他代码部分一样进行审查和更新。

1

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

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

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

我会考虑使用多个队列

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

你必须简单,将来自队列中读取数据以及将数据插入一个或多个队列(爬网将同时并行“要抓取的网址”“爬程序(可能是没有用户界面的命令行)从网上”)页面,您可以使用:

  • 网络爬虫
  • 数据提取
  • 解析器
  • 规范器和filterer

这些将适合队列之间,你可以在单独的PC上运行这些的许多副本,这可以扩展。

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

0

在整个软件开发生命周期中划分这些组件非常重要 - 设计时间,开发时间,测试,发布和运行时间。仅画一张图是不够的。

我发现采用微内核体系结构真的可以帮助“分而治之”这种复杂性。微内核结构的实质是:

  • 进程(在分离的存储器空间中的各部件运行)
  • 线(各成分在单独的线程中运行)
  • 通信(部件通过一个单一的,简单的通信消息传递信道)

我写使用哪个音质类似于系统相当复杂的批处理系统:

EAC H分量映射到.NET可执行 可执行寿命是通过Autosys(全部在同一台机器上)管理 通信是通过TIBCO交会

如果你可以使用一个工具包,提供一些运行时的自省,甚至更好。例如,Autosys让我看到正在运行的进程,在TIBCO允许我在运行时检查消息队列时发生了什么错误。

0

我喜欢使用NDepend来逆向设计复杂的.NET代码库。该工具提供了几个巨大的可视化功能,如:

依赖图: alt text

相关性矩阵:通过treemaping alt text

代码度量可视化: alt text