Como criar a arquitetura / design de um aplicativo no Agile?

8

Se estou prestes a desenvolver um aplicativo corporativo, mas pelo que entendo do processo ágil, divido os recursos em pequenos pedaços e os desenvolvo iterativamente. Eu costumava criar o banco de dados e o núcleo do aplicativo primeiro, depois os estendia iterativamente.

A pergunta é: tenho que manter o que costumava fazer anteriormente (desenvolver o núcleo primeiro) ou tenho que distribuir o desenvolvimento do núcleo pelo desenvolvimento das histórias? Mais tarde, não tenho certeza se o código será flexível o suficiente para futuras extensões!

Qualquer ideia?

Sameh Deabes
fonte
2
As probabilidades são o que você considera "flexível o suficiente" no início, ou é muito flexível ou muito flexível.
OK, existem técnicas para fornecer um bom design / arquitetura enquanto desenvolvemos iterativamente sem desenvolver o núcleo primeiro? desculpe, eu sou novo no ágil: /
Sameh Deabes

Respostas:

11

Não desenvolva o núcleo primeiro . Um princípio fundamental do desenvolvimento Agile é escrever o código mínimo necessário para os recursos concluídos. Dessa forma, você pode entregar a qualquer momento. O código permanece flexível porque você refatora continuamente para eliminar a duplicação. A refatoração é suportada pelos testes automatizados que você escreveu para cada recurso conforme o construiu. O núcleo cresce automaticamente à medida que você considera a duplicação do código de nível superior.

Basicamente, em vez de desenvolver flexibilidade em uma tentativa geralmente fútil de minimizar alterações futuras de código caras, o Agile cria testes automatizados para dar suporte à refatoração, para que as alterações de código sejam relativamente baratas.

A refatoração de Martin Fowler é meu livro favorito sobre técnicas eficazes de refatoração. É muito mais fácil fatorar um núcleo utilizável do que definir um inicial. Definir um núcleo utilizável antes da implementação do recurso é quase impossível, a menos que você esteja apenas reimplementando uma API existente. E não há valor nisso.

Kevin Cline
fonte
Então, a chave aqui é refatoração contínua + testes automatizados. Obrigado!
Sameh Deabes
1
@Girgio: Desculpe, claro. Eu quis dizer que não havia valor em escrever sua própria estrutura de log, ou ORM etc., em vez de apenas adotar uma das muitas alternativas existentes. Parece óbvio, mas vi várias empresas fazer exatamente isso.
kevin Cline
1
@ Kevin: Eu acho que em certos casos, há valor em ir com sua própria solução. Algo como o log, que é relativamente pequeno em escopo, eu provavelmente usaria uma solução existente. Algo como um ORM, posso ver o valor em criar o seu próprio. Algo como o Doctrine tem código para lidar com vários casos e recursos de uso diferentes, mas e se eu precisar de apenas 25 a 30% deles? Se eu criar com os próprios 25 a 30% da funcionalidade necessária, acabarei com algo menor, mais fácil de usar e provavelmente com melhor desempenho.
Ryanzec
2
Você não pode simplesmente refatorar a arquitetura de um sistema. Este é um mito comum de ágil e arquitetura.
Michael
1
@SamehSerag, "O núcleo cresce automagicamente à medida que você [re] fatora ..." implica que a arquitetura não está sendo escolhida ativamente, mas sim autorizada a emergir "automagicamente" por escolhas coincidentes sobre decisões de nível inferior (e não sistêmico). Esse é o problema de tentar "crescer" organicamente a arquitetura através da refatoração.
285 Michael
1

Minha abordagem ao desenvolvimento ágil é criar "fatias verticais". Pego uma história da interface do usuário para armazená-la e implementá-la. Eu tenho algumas ferramentas leves que eu uso para ajudar nesse processo (como uma estrutura simples IRepository / UnitOfWork que possui adaptadores para In Memory (geralmente para teste), Entity Framework e NHibernate. argumento de se deve-se usar um O / RM, mas qual usar.E para mim depende do ambiente.

Descobri que essa abordagem supera os pessimistas em relação ao desenvolvimento ágil porque eles conseguem ver o software em funcionamento mais rapidamente do que se eu gastasse muito tempo na frente criando um núcleo. Combinado com o Design Orientado a Domínio e algumas outras técnicas que eu uso, geralmente sou capaz de obter muitas funcionalidades de trabalho na frente dos usuários muito rapidamente.

O teste de unidade TDD ou mesmo post-hoc é importante porque parte da manutenção da velocidade à medida que seu aplicativo cresce é ter a rede de segurança fornecida por um conjunto abrangente de testes de unidade. "Eu preciso fazer uma alteração nesta aula, como garantir que não quebrei nada?" Com um bom conjunto de testes de unidade, é tão simples quanto executar esse conjunto de testes. Sem, torna-se uma questão de executar manualmente o aplicativo para verificar. Não é nada divertido.

Michael Brown
fonte
-1

Crie a estrutura horizontal mínima que suporta uma fatia vertical de funcionalidade. A estrutura foi criada para ser extensível e é onde o maior esforço é concentrado inicialmente. A fatia vertical da funcionalidade é demonstrar que a estrutura suporta valor real. Nas iterações subsequentes, dedique menos esforço à medida que a estrutura é realizada e mais à criação de recursos usando a estrutura. Continue dessa maneira até que a grande maioria dos esforços se concentre na funcionalidade usando a estrutura desenvolvida nas iterações.

Chris Wolters
fonte