Melhores práticas em gerenciamento de complexidade componentes / visualizando em seu software?

StackOverflow https://stackoverflow.com/questions/304054

  •  08-07-2019
  •  | 
  •  

Pergunta

Estamos construindo ferramentas para informações mina a partir da web. Temos várias peças, como

  • dados de rastreamento da web
  • informações Extract com base em modelos e regras de negócio
  • Resultados da Parse em banco de dados
  • Aplicar normalização e regras de filtragem
  • Etc, etc.

O problema é a resolução de problemas e ter uma boa imagem de "alto nível" do que está acontecendo em cada etapa.

O que técnicas têm ajudado a compreender e gerir processos complexos?

  • Use o fluxo de trabalho ferramentas como o Windows Workflow Foundation
  • funções separadas Encapsular em ferramentas de linha de comando e ferramentas de uso de script para ligá-los juntos
  • Escrever um Domain-Specific Language (DSL) para especificar o que ordem as coisas devem acontecer em um nível superior.

Apenas curioso como você obter uma alça em um sistema com muitos componentes que interagem. Gostaríamos documento / entender como o sistema funciona em um nível mais elevado do que o rastreamento através do código-fonte.

Foi útil?

Solução

O código diz que o que acontece em cada etapa. Usando um DSL seria um benefício, mas possivelmente não se ele vem com o custo de escrever seu próprio script de linguagem e / ou compilador.

documentação nível superior não deve incluir detalhes sobre o que acontece em cada etapa; ele deve fornecer uma visão geral das etapas e como se relacionam juntos.

Boas dicas:

  • Visualize as suas relações de esquema de banco de dados.
  • Use visio ou outras ferramentas. (Como o que você mencionou - não tê-lo usado) para uma visão geral do processo (imho ele pertence à especificação do seu projeto)
  • Verifique se o seu código é bem estruturado / compartimentada / etc.
  • Certifique-se de que você tem algum tipo de especificação do projeto (ou alguma outra documentação "geral", que explica que o sistema faz em um nível abstrato).

Eu não recomendaria a construção de ferramentas de linha de comando, a menos que você realmente tem um uso para eles. Não há necessidade em manter ferramentas que você não usa. (Isso não é o mesmo que dizer que não pode ser útil, mas a maioria do que você faz soa mais como ele pertence a uma biblioteca em vez de executar processos externos).

Outras dicas

Eu uso da AT & T famoso Graphviz , a sua simples e faz o trabalho muito bem. É a mesma biblioteca Doxygen usa também.

Além disso, se você fizer um pouco de esforço você pode obter muito agradáveis ??olhando gráficos.

esqueci de mencionar, a forma como eu usá-lo é a seguinte (porque Graphviz analisa scripts de graphviz), eu uso um sistema alternativo para eventos em formato Graphviz log, então eu então apenas analisar o arquivo de Logs e obter um gráfico agradável.

I encontrar um href="http://en.wikipedia.org/wiki/Dependency_Structure_Matrix" rel="nofollow noreferrer"> matriz de estrutura de dependência uma maneira útil para analisar a estrutura de um aplicativo. Uma ferramenta como Lattix poderia ajudar.

Dependendo da sua plataforma e conjunto de ferramentas existem muitos pacotes de análise estática realmente úteis que podem ajudá-lo a documentar as relações entre subsistemas ou componentes de sua aplicação. Para a plataforma .NET, NDepend é um exemplo bom. Há muitos outros para outras plataformas embora.

Ter um bom projeto ou modelo antes de construir o sistema é a melhor maneira de ter um entendimento para a equipe de como o aplicativo deve ser estruturado, mas ferramentas como aqueles que mencionei pode ajudar a impor regras arquitectónicas e muitas vezes vai lhe dar insights sobre o design que apenas arrasto através do código não pode.

Eu não usaria qualquer uma das ferramentas que você mencionou.

Você precisa desenhar um diagrama de alto nível (I como lápis e papel).

Gostaria de projetar um sistema que possui módulos diferentes fazendo coisas diferentes, que valeria a pena fazer projetar isso para que você pode ter várias instâncias de cada módulo correndo em paralelo.

Gostaria de pensar sobre o uso de várias filas para

  • URLs para rastrear
  • páginas rastreadas a partir da web
  • A informação extraída com base em modelos e regras de negócio
  • Parsed resultados
  • Resultados normalizationed & filtradas

Você teria simples (provavelmente de linha de comando sem UI) programas que lêem dados das filas e inserir dados em uma ou mais filas (A Crawler iria alimentar ambos os "URLs para rastrear" e "páginas rastreadas a partir da web" ), você pode usar:

  • A web crawler
  • Um extractor de dados
  • Um analisador
  • A normalizador e Filterer

Estes se encaixam entre as filas, e você pode executar muitas cópias destes em PCs separados, permitindo que isso escala.

A última fila poderia ser alimentado para outro programa que realmente mensagens tudo em um banco de dados para uso real.

Minha empresa escreve especificações funcionais para cada componente principal. Cada especificação segue um formato comum, e usa diversos diagramas e fotos conforme o caso. Nossas especificações têm uma parte funcional e uma parte técnica. A parte funcional descreve o que o componente faz em um alto nível (por que, o que os objetivos que resolve, o que não fazer, o que ele interage com, documentos externos que estão relacionados, etc.). A parte técnica descreve as classes mais importantes padrões de projeto de componentes e qualquer alto nível.

Nós preferimos texto, porque é o mais versátil e fácil de atualização. Este é um grande negócio - nem todo mundo é um especialista (ou mesmo decente) no Visio ou Dia, e que pode ser um obstáculo para manter os documentos up-to-date. Nós escrevemos as especificações em um wiki para que possamos facilmente ligação entre cada especificação (bem como mudanças de trilha) e permite um passeio não-linear embora o sistema.

Para um argumento de autoridade, Joel recomenda Funcional Specs aqui e aqui .

O projeto de cima para baixo ajuda muito. Um erro que eu vejo está fazendo a parte superior para baixo projeto sagrado. Suas principais necessidades de design nível para ser revisto e atualização como qualquer outra seção do código.

É importante particionar esses componentes em todo o seu software ciclo de vida de desenvolvimento - tempo de design, o tempo de desenvolvimento, testes, lançamento e tempo de execução. Apenas desenhar um diagrama não é suficiente.

Eu descobri que a adoção de uma arquitetura microkernel pode realmente ajudar "dividir e conqure" essa complexidade. A essência da arquitetura microkernel é:

  • Processos (cada componente é executado em um espaço de memória isolado)
  • Threads (cada componente é executado em um segmento separado)
  • Comunicação (componentes comunicam através de um único, simples mensagem do canal de passagem)

Eu escrevi um bastante complexos sistemas de processamento em lote que soam parecido com o seu sistema usando:

Cada componente mapeia para .NET executável vidas executáveis ??são geridos através Autosys (todos na mesma máquina) A comunicação é realizada através TIBCO Rendezvous

Se você pode usar um kit de ferramentas que fornece alguma introspecção tempo de execução, ainda melhor. Por exemplo, Autosys me permite ver os processos que estão em execução, o que erros ocorreram enquanto TIBCO me permite inspecionar filas de mensagens em tempo de execução.

Eu gosto de usar NDepend a complexa base de código .NET engenharia reversa. A ferramenta vem com vários recursos grandes de visualização como:

gráfico de dependência: text alt

Dependência Matrix: text alt

visualização métrica Código através treemaping: text alt

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top