Qual é a melhor maneira de se familiarizar com uma grande base de código? [fechadas]

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

  •  03-07-2019
  •  | 
  •  

Pergunta

Unir uma equipe existente com uma grande base de código já existente pode ser assustador. Qual é a melhor abordagem;

  • Broad; tentar obter uma visão geral de como tudo laços juntos, a partir do código
  • Limite; se concentrar em pequenas seções de código de cada vez, entender como eles funcionam plenamente
  • Escolha um recurso para desenvolver e aprender como você ir junto
  • Tente ter uma visão de diagramas de classe e uml, se disponível (e até à data)
  • algo totalmente diferente?

Eu estou trabalhando no que é atualmente um app aproximadamente 20k linha C ++ & biblioteca (Edit: pequeno no grande esquema das coisas). Na indústria Imagino que você deseja obter uma introdução por um programador experiente. No entanto, se este não for o caso, o que você pode fazer para começar a adicionar valor tão rapidamente quanto possível?

-
Resumo das respostas:

  • Passo através do código no modo de depuração para ver como ele funciona
  • Par-se com alguém mais familiarizado com a base de código do que você, revezando-se para ser a pessoa de codificação ea pessoa assistindo / discutindo. parceiros de rotação entre os membros da equipe para que o conhecimento se espalhou ao redor.
  • testes Write unidade. Comece com uma afirmação de como você pensa código irá funcionar. Se ele sair como o esperado, provavelmente você já entendeu o código. Se não, você tem um quebra-cabeças para resolver e ou um inquérito para fazer. (Graças Donal, esta é uma grande resposta)
  • Vá até testes de unidade existentes para código funcional, de uma forma semelhante ao anterior
  • Leia UML, Doxygen diagramas de classe gerada e outra documentação para obter uma ampla sensação do código.
  • Faça pequenas edições ou correções de bugs, então gradualmente construir
  • Mantenha notas, e não no salto e começar a desenvolver; que é mais valioso para gastar tempo a compreensão do que para gerar confuso ou código inadequada.

este post é uma duplicata parcial de the-best-way-to-familiarizar-se-com-um-herdou-base de código

Foi útil?

Solução

Comece com uma pequena tarefa, se possível, depurar o código em torno de seu problema. Percorrendo o código no modo de depuração é a maneira mais fácil de aprender alguma coisa funciona.

Outras dicas

Outra opção é escrever testes para o que você apresenta está em interessado. Configurando o equipamento de teste é uma boa maneira de estabelecer quais dependências o sistema tem e onde seus reside estaduais. Cada teste começa com uma afirmação sobre a maneira de pensar o sistema deve funcionar. Se ele sair para trabalhar dessa forma, você conseguiu alguma coisa e você tem um código de exemplo trabalhando para reproduzi-lo. Se ele não funciona dessa maneira, você tem um quebra-cabeças para resolver e uma linha de investigação a seguir.

Uma coisa que eu costumo sugerir para as pessoas que ainda não foi mencionado é que é importante para se tornar um usuário competente da base de código existente antes de poder ser um desenvolvedor. Quando novos desenvolvedores entrar em nosso projeto de software grande, eu sugiro que eles passam o tempo tornando-se usuários experientes antes de mergulhar na tentativa de trabalho no código.

Talvez isso é óbvio, mas eu vi um monte de pessoas tentam saltar para o código muito rapidamente, porque eles estão ansiosos para começar a fazer progresso.

Este é bastante dependente de que tipo de aluno e que tipo de programador que você é, mas:

  • Broad primeiro - você precisa de uma idéia do alcance e tamanho. Isto pode incluir desnatação docs / uml se eles são bons. Se é um projeto de longo prazo e você vai precisar de uma compreensão completa de tudo, eu poderia realmente ler os documentos corretamente. Mais uma vez, se Eles são bons.
  • Limite - escolher algo administrável e tentar compreendê-lo. Obter um "gosto" para o código.
  • Escolha uma característica -. Possivelmente um diferente ao que apenas olhou para se você está se sentindo confiante, e começar a fazer algumas pequenas mudanças
  • Iterate -. Avaliar como as coisas têm corrido e veja se você poderia beneficiar de repetir um passo inicial em mais profundidade

O emparelhamento com rotação estrita.

Se possível, ao atravessar a documentação / base de código, tente emparelhamento emprego com rotação estrita. Ou seja, dois de você se sentar juntos por um período fixo de tempo (digamos, uma sessão de 2 horas), então você alternar pares, uma pessoa vai continuar a trabalhar nessa tarefa, enquanto os outros se move para outra tarefa com outro parceiro.

Em pares você ambos pegar um pedaço de conhecimento, que pode então ser transmitido para outros membros da equipe quando a rotação ocorre. O que é bom sobre isso também, é que quando um novo par é reunida, aquele que trabalhou na tarefa (neste caso, investigando o código) pode então resumir e explicar os conceitos de uma maneira mais fácil de entender. Enquanto o tempo avança todos devem estar a um nível semelhante de entender, e esperemos que evitar o "Oh, somente João sabe que pouco do código" síndrome.

De que eu posso dizer sobre o seu cenário, você tem um número bom para isso (3 pares), no entanto, se você está distribuída, ou não trabalhando para a mesma escala temporal, é pouco provável que seja possível.

Eu sugeriria executando Doxygen sobre ele para obter um diagrama de classes up-to-date, em seguida, indo de largo por um tempo. Isto dá-lhe uma rapidinha imagem grande que você pode usar como você levantar-se perto e sujo com o código.

Eu concordo que depende inteiramente de que tipo de aluno você é. Tendo dito isso, eu estive em duas empresas que tinham muito grandes de código-bases para começar. Normalmente, eu trabalho como este:

Se possível, antes de olhar para qualquer código funcional, eu passar por testes de unidade que já estão escritos. Estes geralmente pode ajudar bastante. Se eles não estiverem disponíveis, então eu faço o seguinte.

Primeiro, em grande parte ignorar implementação e olhar apenas para arquivos de cabeçalho, ou apenas as interfaces de classe. Eu tento ter uma idéia de qual é o propósito de cada classe é. Em segundo lugar, eu vou um profundo nível para a implementação começando com o que parece ser a área de maior importância. Isso é difícil de calibre, então, ocasionalmente, eu só começar no topo e trabalhar o meu caminho para baixo na lista de arquivos. Eu chamo isso de aprendizagem em largura. Após esta etapa inicial, eu geralmente ir profundidade sábio através do resto do código. O olhar inicial em largura ajuda a solidificar / corrigir quaisquer ideias que eu tenho do nível de interface, e então a profundidade-wise olhar me mostra os padrões que têm sido utilizados para implementar o sistema, bem como as diferentes idéias de design. Por em profundidade, quero dizer que, basicamente, passo através do programa usando o depurador, pisar em cada função para ver como ele funciona, e assim por diante. Isto, obviamente, não é possível com sistemas realmente grandes, mas 20k LOC não é que muitos. :)

Trabalhar com outro programador que está mais familiarizado com o sistema para desenvolver um novo recurso ou para corrigir um bug. Este é o método que eu vi trabalhar o melhor.

Eu acho que você precisa amarrar isso para uma determinada tarefa. Quando você tem tempo em suas mãos, ir para qualquer abordagem que você está no modo para.

Quando você tem algo que precisa ser feito, dar-se um foco estreito e fazê-lo.

Obter a equipe para colocá-lo na correção de bugs por duas semanas (se você tem duas semanas). Eles ficarão felizes de arranjar alguém para assumir a responsabilidade por isso, e até o final do período você vai ter gasto tanto tempo de resolução de problemas com a biblioteca que você provavelmente saberá muito bem.

Se ele tem testes de unidade (eu estou apostando que não faz). Comece pequeno e certifique-se os testes de unidade não falhar. Se você olhar para toda a base de código ao mesmo tempo seus olhos vidrados e você vai sentir-se oprimido.

Se não houver testes de unidade, você precisa se concentrar sobre o recurso que você deseja. Execute o aplicativo e olhar para os resultados das coisas que o seu recurso deve afetar. Em seguida, começar a olhar através do código tentando descobrir como o aplicativo cria as coisas que você deseja alterar. Finalmente alterá-lo e verificar se os resultados saem da maneira que quiser.

Você mencionou que é um aplicativo e uma biblioteca. Primeiro altere o aplicativo e vara para usar a biblioteca como um usuário. Em seguida, depois que você aprende a biblioteca será mais fácil a mudança.

A partir de uma abordagem de cima para baixo, o aplicativo provavelmente tem um loop principal ou um gui principal que controla toda a ação. Vale a pena entender o fluxo principal do aplicativo de controle. Vale a pena ler o código para se dar uma visão ampla do fluxo principal do aplicativo. Se ele é um aplicativo GUI, criando um documento que mostra quais telas existem e como ir de uma tela para outra. Se é um aplicativo de linha de comando, como o processamento é feito.

Mesmo em empresas que não é incomum ter esta abordagem. Muitas vezes ninguém entende perfeitamente como um aplicativo funciona. E as pessoas não têm tempo para lhe mostrar. Eles preferem perguntas específicas sobre coisas específicas que você tem que cavar e experiência em seu próprio país. Então uma vez que você começa a sua pergunta específica, você pode tentar isolar a fonte de conhecimento para aquele pedaço da aplicação e pedir-lo.

Comece por compreender o 'domínio do problema' (é um sistema de folha de pagamento? Inventário? Controle em tempo real ou qualquer outro). Se você não entender o jargão os usuários usam, você nunca vai entender o código.

Então olha para o modelo de objeto; já pode ser um diagrama ou você pode ter que uma engenharia reversa (manualmente ou usando uma ferramenta como sugerido por Doug). Nesta fase, você também pode investigar o banco de dados (se houver), se deve seguir o modelo de objeto, mas não pode, e isso é importante saber.

Tenha um olhar para o banco de dados do histórico de alterações ou erro, se há uma área que aparece muito, olhar para aquele bit em primeiro lugar. Isso não significa que ele está mal escrito, mas que é os usos pouco todos.

Por último, manter algumas notas (eu prefiro um wiki).

  • Os caras existentes podem usá-lo para verificação de sanidade seus pressupostos e ajudá-lo.
  • Você precisará referir a ele mais tarde.
  • A próxima cara nova na equipe vai realmente obrigado.

Eu tinha uma situação semelhante. Eu diria que você vá como este:

  • Se seu banco de dados a impulsionado aplicação, inicie a partir do banco de dados e tentar fazer sentido de cada mesa, os seus campos e, em seguida, sua relação com as outras tabelas.
  • Uma vez bem com a loja subjacente, mover-se para a camada ORM. Aqueles tabela deve ter algum tipo de representação em código.
  • Uma vez feito com que, em seguida, passar para como e onde a partir desses objetos são provenientes. Interface? o interface? Qualquer validação? O pré-processamento ocorre sobre eles antes de irem para o armazenamento de dados?

Isto se familiarizar melhor com o sistema. Lembre-se que tentando escrever ou entender testes de unidade só é possível quando você sabe muito bem o está sendo testado e por ele precisa ser testado em única dessa forma.

E no caso de uma grande aplicação que não é orientado para bancos de dados, eu recomendo uma outra abordagem:

  • O que o principal objetivo do sistema?
  • Quais são os principais componentes do sistema, em seguida, para resolver este problema?
  • O que interações cada um dos componentes tem entre eles? Faça um gráfico que mostra as dependências de componentes. Peça a alguém que já trabalham nele. Estes componentns deve ser a troca de algo entre si de modo a tentar descobrir as também (como IO pode estar retornando arquivo objeto de volta para GUI e como)
  • Uma vez confortável com isso, mergulhar componente que é menos dependente entre outros. Agora estudar como esse componente é dividido em classes e como eles interagem econômicos com o outro. Desta forma, você tem um jeito de um único componente no total
  • Mover para a próxima menos dependente componente
  • Para o final, mudança para o componente central que normalmente teria dependências em muitos dos outros componentes que você tem já abordado
  • Ao olhar para o componente do núcleo, você pode estar se referindo volta para os componentes que examinamos anteriormente, portanto, não se preocupe continuar a trabalhar! Dura

Para a primeira estratégia: Tomemos o exemplo deste site stackoverflow por exemplo. Examine o armazenamento de dados, o que está sendo armazenado, como sendo armazenados, o que representações esses itens têm no código, como uma onde aqueles são apresentados na interface do usuário. Onde a partir de eles vêm eo que o processamento ocorre sobre eles, uma vez que vai voltar para o armazenamento de dados.

Para o segundo Tomemos o exemplo de um processador de texto, por exemplo. Que componentes estão lá? IO, UI, a página e afins. Como estes estão interagindo uns com os outros? Mover ao longo como você aprende mais.

Seja relaxado. código escrito é em estilo de mentalidade, a lógica congelou e pensamento de alguém e que levaria tempo para ler a mente.

Em primeiro lugar, se você tem membros da equipe disponíveis que têm experiência com o código que você deve providenciar para que eles façam uma visão geral do código com você. Cada membro da equipe deve lhe fornecer informações sobre a sua área de especialização. Geralmente é valiosa para obter várias pessoas explicando as coisas, porque alguns serão melhores em explicar do que outros e alguns terão uma compreensão melhor do que outros.

Em seguida, você precisa para começar a ler o código por um tempo, sem qualquer tipo de pressão (um par de dias ou uma semana se o seu chefe irá fornecer isso). É muitas vezes ajuda para compilar / construir o projeto de si mesmo e ser capaz de executar o projeto no modo de depuração para que possa percorrer o código. Em seguida, começar a receber seus pés molhados, corrigindo pequenos bugs e fazendo pequenas melhorias. Você vai espero em breve estar pronto para um projeto de médio porte, e mais tarde, um grande projeto. Continuar a apoiar os seus companheiros de equipa como você ir -. Muitas vezes você pode encontrar um em particular que está disposto a orientá-lo

Não seja demasiado duro consigo mesmo se você luta - que é normal. Ele pode levar um longo tempo, talvez anos, para entender uma grande base de código. Na verdade, é frequentemente o caso que mesmo depois de anos ainda existem algumas partes do código que ainda estão um pouco assustador e opaco. Quando você começa o tempo de inatividade entre projetos que você pode cavar para essas áreas e muitas vezes você vai achar que depois de algumas tentativas você pode descobrir até mesmo as partes fora.

Boa sorte!

Você pode querer considerar olhando para código fonte engenharia reversa ferramentas. Existem duas ferramentas que eu saiba:

As duas ferramentas oferecem conjuntos de recursos semelhantes que incluem análise estática que produz gráficos das relações entre os módulos do software.

Esta consiste principalmente de gráficos de chamada e decência tipo / classe. Visualizando esta informação deve dar-lhe uma boa visão de como as partes do código se relacionam entre si. Usando essa informação, você pode cavar a fonte real para as peças que você está mais interessado em e que você precisa entender / modificar em primeiro lugar.

Eu acho que só salto no código pode ser um um pouco esmagadora. Tente ler o máximo de documentação sobre o projeto possível. Esperamos que possa explicar a finalidade e estrutura de cada componente. Sua melhor se um desenvolvedor existente pode levá-lo através dele, mas que nem sempre é possível.

Uma vez que você está confortável com a estrutura de alto nível do código, tentar corrigir um erro ou dois. isso vai ajudá-lo a se familiarizar com o código real.

Eu gosto de todas as respostas que dizem que você deve usar uma ferramenta como o Doxygen para obter um diagrama de classe, e primeiro tentar compreender o retrato grande. Eu concordo totalmente com isso.

Dito isso, isso depende de quão bem consignado o código é para começar. Se a sua uma bagunça gigantesca, que vai ser difícil de aprender. Se a sua limpo e organizado corretamente, ele não deve ser tão ruim assim.

Veja esta resposta sobre como usar as ferramentas de cobertura de teste para localizar o código para uma característica de interesse, sem saber nada sobre onde esse recurso é, ou como ele é espalhado por vários módulos.

(sem vergonha de marketing à frente)

Você deve verificar se nWire . É um plugin do Eclipse para navegar e visualizar grandes bases de código. Muitos de nossos clientes usá-lo para quebrar-in novos desenvolvedores imprimindo visualizações dos principais fluxos.

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