Colocar na arquitetura o principal ponto de um projeto é uma das principais falhas em projetos de desenvolvimento de sistemas. Quando isso acontece, o primeiro passo dentro do processo interno de desenvolvimento é definir toda a arquitetura de um projeto, ao invés de termos a arquitetura como uma conseqüência de um processo do projeto como um todo. Por mais que a arquitetura pareça e seja essencial, ela jamais pode ser o principal recheio do bolo.
Sabemos muito bem, que essa é uma premissa dentro das “fábricas de softwares”, mas não é missão impossível encontrar o desenvolvimento dirigido pela arquitetura, em várias equipes de desenvolvimento. Talvez essa seja apenas uma conseqüência cultural. Talvez seja um medo empírico de perder o controle sobre o projeto, criando as fronteiras do mesmo, com a diversidade divina de frameworks presentes no mercado.
Quando a arquitetura é o principal ponto de um projeto, podemos ter certeza que correremos sérios riscos de termos um software longe de um design aceitável. Sem contar também, no incrível acoplamento que ganharemos de brinde. Na verdade o brinde é o cliente quem vai ganhar, quando precisar solicitar uma mudança no sistema. Ironia, mas essa é uma estratégia consolidada dentro das benditas fábricas de software.
E o que dizer quando se opta por uma arquitetura-faz-tudo-e-mais-um-pouco sem uma linha de implementação de um estória. Muitos afirmam que a escolha pela arquitetura como elemento chave é a produtividade. Em um primeiro instante isso pode soar muito bem aos ouvidos. Mas, antes de concordamos com essa afirmação, devemos nos perguntar o que é produtividade dentro de um projeto? É a quantidade de linhas de códigos duplicados e muitas vezes mal-escritos? Ou a qualidade de um sistema em ser coeso e incremental?
Pensar na arquitetura antes (e acima de tudo), é como cometer o erro praticado, em um nível gerencial, ao estimar um escopo de duração de dois anos para um determinado projeto. Um tiro no pé. Um salto no escuro. Ou qualquer coisa muito pior que isso. Assim como o mundo muda (e muda muito) em dois anos, a tecnologia evolui de maneira extremamente significante nos mesmos dois anos. Vale lembrar que em um mundo onde hoje gigantes multinacionais estão entrando em concordata, ninguém pode garantir que o seu framework preferido não possa ser descontinuado nos próximos meses.
Uma das conseqüências de desenvolver dirigidos por uma arquitetura é a complexidade demasiada e desnecessária que nosso sistema possuirá. Devemos adotar a simplicidade e adorá-la como um astro-rei. Eu, sinceramente não conheço ninguém e nem tenho idéia como tomar decisões tão complexas como processamento distribuído, a persistência, internacionalização, a segurança, controle transacional do projeto nos seus primeiros dias de existência. Claro, infelizmente, ainda não possuímos a capacidade de definir alguns itens antes de tudo. A linguagem de programação é um desses itens. Não podemos tratar esse ponto de forma incremental. Não por enquanto.
Tudo bem que não podemos deixar de lado o futuro. Devemos exercitar o nosso bom senso diariamente, pois com certeza não podemos deixar de pensar em futuros problemas. Mas não devemos correr o risco de sair implementando tudo o que poderia acontecer e deixar de lado o que precisa acontecer.
Um exemplo simples de um risco é a internacionalização de moedas. Todos nós sabemos o quão custoso é desenvolver em um sistema que necessita de internacionalização. Então, imagine o quão decepcionante é reler uma decisão que definia que o sistema deveria utilizar internacionalização desde o princípio. E na verdade ele jamais sairá de solo nacional. Agora se seu cliente solicitasse em um determinado momento a internacionalização, aí sim ela receberia sua devida atenção. E um refactoring resolveria a situação.
Um dos princípios que devemos adotar para podermos nos preocupar efitivamente com o futuro é limitar os nossos esforços com ele para melhorar o design de nosso projeto. É nele que está a chave de ouro para o nosso projeto. Então devemos fugir dos riscos do desenvolvimento orientado pela arquitetura, e de vez mergulharmos em práticas que focam no design incremental. Desde a nível de código como TDD a nível de processo como programação em par.
A arquitetura de um projeto jamais deixará de ser importante. Só precisamos ter a real idéia de que não é ela quem deve guiar nossos próximos passos dentro do processo de desenvolvimento interno. E sim acreditarmos em uma concepção incremental, e que a cada iteração trará novos avanços, funcionalidades e acima de tudo melhorias no design. Assim você não precisará atrasar nenuma iteração por necessitar desacoplar sua arquitetura da implementação do sistema. Então a toda iteração, a qualidade do software é melhor do que era na iteração anterior. O resultado é um software cada vez mais fácil de manter, ampliar e prazeroso de trabalhar.