2008-11-20 87 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