Digamos que você acabou de começar a trabalhar em uma equipe muito pequena em um projeto {atualmente relativamente pequeno, embora seja maior depois]. Observe que este é um projeto real destinado a ser usado por outros desenvolvedores no mundo real, não algum projeto acadêmico que deve ser descartado no final de um semestre.
No entanto, o código ainda não foi liberado para outras pessoas, portanto, nenhuma decisão foi tomada ainda.
As Metodologias
Um de vocês gosta de começar a codificar e ajustar as peças à medida que avança antes de ter necessariamente uma idéia clara de como exatamente todos os componentes irão interagir (design de baixo para cima). Outro de vocês gosta de fazer o design inteiro primeiro e definir os detalhes de todos os componentes e comunicação antes de codificar uma solução.
Suponha que você esteja trabalhando em um novo sistema em vez de imitar os existentes e, portanto, nem sempre é óbvio como deve ser o design final correto. Portanto, em sua equipe, diferentes membros da equipe às vezes têm idéias diferentes sobre quais requisitos são necessários para o produto final, e muito menos como proceder para projetá-lo.
Quando o desenvolvedor de baixo para cima grava algum código, o desenvolvedor de cima para baixo o rejeita devido a possíveis problemas futuros previstos no design, apesar de o código poder resolver o problema em questão, acreditando que é mais importante corrigir o design. antes de tentar codificar a solução para o problema.
Quando o desenvolvedor de cima para baixo tenta resolver o design completo e os problemas previstos antes de começar a escrever o código, o desenvolvedor de baixo para cima o rejeita porque o desenvolvedor de baixo para cima não acha que alguns dos problemas realmente ocorrerão na prática e acha que o design talvez precise ser alterado no futuro quando os requisitos e restrições ficarem mais claros.
O problema
O problema em que isso resultou é que o desenvolvedor de baixo para cima acaba perdendo tempo porque o desenvolvedor de cima para baixo decide com freqüência a solução que o desenvolvedor de baixo para cima escreveu que deve ser descartada devido a uma falha de design, resultando na necessidade de -escreva o código.
O desenvolvedor de cima para baixo acaba perdendo tempo porque, em vez de paralelizar o trabalho, o desenvolvedor de cima para baixo agora se senta frequentemente para elaborar o design correto com o desenvolvedor de baixo para cima, serializando os dois até o ponto em que pode ser ainda mais rápido para 1 pessoa fazer o trabalho que 2.
Ambos os desenvolvedores querem continuar trabalhando juntos, mas não parece que a combinação esteja ajudando os dois na prática.
Os objetivos
Os objetivos comuns são obviamente maximizar a eficácia da codificação (ou seja, minimizar o desperdício de tempo) e escrever software útil.
A questão
Simplificando, como você resolve esse problema e lida com essa situação?
A única solução eficiente em que consigo pensar que não perde tempo é permitir que cada desenvolvedor siga seu próprio estilo para o design. Mas isso é mais difícil do que parece quando você faz uma revisão de código e realmente precisa aprovar as mudanças uns dos outros, e quando você está tentando criar uma estrutura coerente para os outros usarem.
Existe uma maneira melhor?