Existem muitas perguntas com boas respostas sobre o papel de um arquiteto de software (SA) no StackOverflow e Programmers SE . Estou tentando fazer uma pergunta um pouco mais focada do que essas. A própria definição de uma SA é ampla, portanto, para fins desta pergunta, vamos definir uma SA da seguinte maneira:
Um arquiteto de software orienta o design geral de um projeto, envolve-se nos esforços de codificação, realiza revisões de código e seleciona as tecnologias a serem usadas.
Em outras palavras, não estou falando de descanso gerencial e colete nos tipos de SAs (mais palavras que rimam com elides). Se eu perseguir qualquer tipo de posição de SA, não quero ficar longe da codificação. Posso sacrificar algum tempo para interagir com clientes e analistas de negócios etc., mas ainda estou tecnicamente envolvido e não estou apenas ciente do que está acontecendo nas reuniões.
Com esses pontos em mente, o que uma SA deve trazer para a mesa? Deveriam entrar com a mentalidade de "impor a lei" (por assim dizer) e impor o uso de certas ferramentas para se ajustarem "a seu caminho", isto é, diretrizes de codificação, controle de origem, padrões, documentação UML, etc.? Ou eles devem especificar a direção e a estratégia iniciais e depois recuar e pular conforme necessário para corrigir a direção do navio?
Dependendo da organização, isso pode não funcionar. Uma SA que depende do TFS para fazer cumprir tudo pode ter dificuldade para implementar seu plano em um empregador que usa apenas o StarTeam. Da mesma forma, uma SA precisa ser flexível, dependendo do estágio do projeto. Se for um projeto novo, eles têm mais opções, enquanto que podem ter menos para projetos existentes.
Aqui estão algumas histórias de SA que experimentei como forma de compartilhar alguns antecedentes, na esperança de que as respostas às minhas perguntas também possam lançar alguma luz sobre esses problemas:
Trabalhei com uma SA que revisou literalmente todas as linhas de código da equipe. A SA faria isso não apenas pelo nosso projeto, mas por outros projetos da organização (imagine o tempo gasto nisso). A princípio, foi útil impor certos padrões, mas depois se tornou incapacitante. FxCop era como a SA encontraria problemas. Não me interpretem mal, era uma boa maneira de ensinar desenvolvedores juniores e forçá-los a pensar nas consequências de sua abordagem escolhida, mas para desenvolvedores seniores isso era visto como algo draconiano.
Uma SA em particular foi contra o uso de uma determinada biblioteca, alegando que era lenta. Isso nos forçou a escrever toneladas de código para realizar as coisas de maneira diferente, enquanto a outra biblioteca nos pouparia muito tempo. Avanço rápido para o último mês do projeto e os clientes estavam reclamando sobre o desempenho. A única solução foi alterar determinadas funcionalidades para usar a abordagem originalmente ignorada, apesar dos avisos iniciais dos desenvolvedores. Nesse ponto, muito código foi jogado fora e não reutilizável, levando a horas extras e estresse. Infelizmente, as estimativas usadas para o projeto foram baseadas na abordagem antiga que meu projeto foi proibido de usar, por isso não era um indicador apropriado para a estimativa. Eu ouvia o PM dizer "já fizemos isso antes"
A SA que aplicaria o uso de DTOs, DOs, BOs, camadas de Serviço e assim por diante em todos os projetos. Os novos desenvolvedores tiveram que aprender essa arquitetura e as diretrizes de uso aplicadas de forma inflexível pela SA. Exceções às diretrizes de uso foram feitas quando era absolutamente difícil segui-las. A SA foi fundamentada em sua abordagem. Classes para DTOs e todas as operações CRUD foram geradas via CodeSmith e os esquemas de banco de dados foram outra bola de cera semelhante. No entanto, tendo usado essa configuração em qualquer lugar, o SA não estava aberto a novas tecnologias, como LINQ to SQL ou Entity Framework.
Não estou usando este post como uma plataforma para ventilação. Havia aspectos positivos e negativos em minhas experiências com as histórias da SA mencionadas acima. Minhas perguntas se resumem a:
- O que uma SA deve trazer para a mesa?
- Como eles podem encontrar um equilíbrio na tomada de decisões?
- Deve-se abordar um trabalho de SA (conforme definido anteriormente) com a mentalidade de que eles devem aplicar certas regras básicas?
- Mais alguma coisa a considerar?
Obrigado! Tenho certeza de que essas tarefas são facilmente estendidas a pessoas que são desenvolvedores seniores ou líderes técnicos, portanto, fique à vontade para responder nessa capacidade também.