Fitness Function
Diariamente estamos evoluíndo nossos sistemas (mudanças incrementais) e projetos, seja em termos de arquitetura, design de código, funcionalidades, refatorações, reestruturações, resoluções de bugs, etc… Mas, o que tudo isso tem em comum? Independente da evolução feita, a gente precisa garantir que a qualidade e saúde da arquitetura ainda seja a mesma ou pelo menos saudável.
Mas, o que seria saudável? Como a gente pode medir isso? O que a gente mediria para ter tal informação? A gente pode medir os atributos de qualidade (dimensão da arquitetura) do sistema, por exemplo: Um cenário onde precisamos ter alta disponibilidade, um critério de validação poderia ser o tempo de resposta de uma página web, um endpoint na API, uma consulta no banco, etc…
O que é?
Uma fitness function no contexto de algoritmos vem da ideia de tentar validar se um determinado algoritmo atende algum critério de validação.
No contexto da arquitetura de software podemos utilizá-la para uma motivação semelhante, ou seja, nossas fitness functions serão responsáveis de validar algum atributo de qualidade do sistema (no exemplo anterior ela iria validar os tempos de respostas) através de algum critério.
A ideia é que cada fitness function represente um requisito da arquitetura, dessa forma, elas irão ajudar guiando a evolução do sistema (determinando os impactos das mudanças incrementais).
Mas, nem sempre vai ser possível implementá-las, por causa de complexidade ou restrições.
Na maioria das vezes crie fitness functions que podem ser validadas de forma automatizada (seja com testes, scripts ou outra maneira automática), porém, a realidade é diferente da teoria e em alguns cenários elas precisarão ser validadas e executadas de forma manual (o que não tem problema nenhum).
Tipos
Existem diferentes tipos de fitness functions, sendo:
Atômica
: Rodam constra um único contexto e exercita um particular aspecto da arquitetura (por exemplo: acoplamento modular).Holística
: Rodam constra um contexto compartilhado e exercita uma combinação de aspectos da arquitetura (por exemplo: segurança e escalabilidade).Disparada
: Rodam baseada em um evento particular (por exemplo: testes de unidade, uma pipeline, uma pessoa de QA performando testes exploratórios, etc…).Contínua
: Não rodam de maneira agendada, mas, ao invés, constantemente estão validando aspectos arquiteturais (por exemplo: velocidade de transação do banco de dados)Estática
: Possuem um resultado fixo, um valor predefinido desejável (por exemplo: complexidade ciclomática de médodos na base de código)Dinâmica
: Mudam a definição baseada em um contexto extra, valores podem diferenciar sobre diferente circustâncias (por exemplo: uma empresa escalando pode significar que menos performance é permitida, mas, apenas dentro de um período)Automática
: Rodam de forma automática, ou seja, sem a necessidade de intervenção ou gatilhos manuais feitos por humanos (por exemplo: na pipeline através de testes)Manual
: Rodam de forma manual, uma intervenção humana é necessária para tal execução (por exemplo: aplicações com certificação manual por razões legais)Temporária
: São construídas por um período temporário, até tal problema ser resolvido (por exemplo: um lembrete para verificar se atualizações importantes foram publicadas para alguma dependência crítica)Intencional
: São criadas da forma intencional, ou seja, sabemos/planejamos/pensamos em criá-lasEmergente
: Identificadas conforme a evolução do sistema (o clássico desconhecido)Específica de domínio
: Focam em testar uma parte específico do domínio (por exemplo: uma aplicação bancária pode ter testes de segurança)
Categorias
Além dos tipos também existem categorias, sendo:
Chave
: Essas dimensões são críticas para fazer escolhas de tecnologia ou design do sistema.Relevante
: Essas dimensões precisam ser consideradas no nível de funcionalidades, pouco provável que guiem escolhas arquiteturais.Não relevante
: Escolhas de tecnologia e design do sistema não são impactadas por esses tipos de dimensões.
Conclusão
Nesse post vimos o que são fitness functions, para que elas servem, quais tipos e categorias existem, porque e como devemos utilizá-las.
Abraços, até a próxima.