fbpx
Uma nova arquitetura não é páreo para velhos hábitos — Parte 1 — Requisitos não funcionais são objetivos estratégicos de negócio
Publicado em: sexta-feira, 27 de out de 2023
Categorias: Arquitetura

Então é hora de remodelar todo o projeto, partindo de uma nova arquitetura.

A nova arquitetura tem sob seus ombros muita responsabilidade. Principalmente a de conduzir o projeto à dias melhores. A partir da nova arquitetura, gerentes, arquitetos, desenvolvedores, testers e clientes, todos serão felizes cumprindo suas demandas.

Será mesmo?

E se eu te dissesse que o tal caos arquitetural, pode não ter nada a ver com a arquitetura em si?

E que, embora uma nova arquitetura seja um marco importante e uma chance de fazer diferente, ela pode não ser o suficiente. De tal forma que se não for dada a atenção para a forma de resolvemos problemas, a nova arquitetura fracassará “igual, só que diferente”.

Será que você já viu isso acontecer em algum lugar?

Todos buscam o sucesso, de formas diferentes

Ninguém acordada de manhã e pensa: — Como vou ferrar essa arquitetura e/ou projeto hoje!

Todos querem fazer o melhor para alcançar os objetivos de negócio.

Você já deve ter escutado a frase: “De boas intenções o inferno está cheio”.

Pois bem, aqui essa frase também se aplica.

Muitas vezes a afobação por atender demandas do cliente no menor prazo e custo, parecem ir de encontro aos anseios imediatos do cliente.

Boas são as chances de que estejamos trocando um benefício imediato, por um débito a ser pago no futuro.

Essa visão equivocada de que prazo e custo importam a qualquer custo, sempre, incondicionalmente, sabota qualquer projeto, qualquer arquitetura.

Esse é um mal conhecido e que já vi diante dos meus olhos em diversos momentos. Considerar que objetivos técnicos, não são objetivos de negócio, gera caos.

Objetivos técnicos são objetivos estratégicos de negócio

Então quando seu cliente quer que o projeto seja fácil de manter, seja escalável, esses são requisitos que não entregam funcionalidades. Entretanto, a cada nova feature, a cada nova evolução precisamos considerar esses aspectos para não comprometer esse objetivo.

Esses requisitos são chamados de requisitos não funcionais. Pois apesar de serem requisitos, eles não entregam funcionalidades em si, em vez disso, dão suporte às funcionalidades.

Requisitos não funcionais — Analogia com a medicina

Requisitos não funcionais se desdobram em protocolos que asseguram que esses requisitos sejam atendidos. São as recomendações (protocolos) que seguimos para cuidar de que o projeto continue atendendo esses requisitos. Neles encontramos estratégias para assegurar alguma característica importante para o projeto.

Esses protocolos podem tocar diretamente e afetar 100% do código que você escreve.

Vamos aos exemplos.

Abaixo trago 2 exemplos que juntos vão assegurar um único objetivo.


Exemplo: Sessão

Então quando o protocolo sobre Sessões do ASP.NET, é proibir seu uso, adotando uma abstração ou o acesso direto ao REDIS, estamos considerando alguns aspectos:

  • O ciclo de vida da sessão prevê leitura obrigatória de toda a sessão no início do request
  • O ciclo de vida da sessão prevê escrita obrigatória de toda a sessão no final do request.
  • O acesso manual a chaves específicas do REDIS é mais otimizado do que obter toda a sessão a todo request.
  • Há requests que precisam de menos dados que outros e outros que não precisam de dado algum.
  • Cada operação saberá lidar com a parte que lhe cabe da sessão, sabendo a hora de lidar com leitura (sem escrita) e escrita, por demanda, sem operações desnecessárias.
  • O uso centralizado do REDIS, permite que sua aplicação trabalha tanto em webgardem (várias instâncias em um mesmo servidor) quando em webfarms (vários servidores), de forma transparente, sem necessidade de refactoring.
  • O uso de sessões no ASP.NET em cenários mais de uma instância da aplicação demandam algum tipo de State Server, podendo inclusive ser o próprio REDIS.
  • Pela natureza genérica do provider de sessão, não é possível determinar se e qual estado da sessão foi alterado ou não, portanto ao fim da execução do request toda a sessão é enviada para o State Server.

O protocolo consiste apenas em negar o uso da session, dando um modelo mais eficiente em sua substituição, enquanto todo o resto no texto é argumento que sustenta a decisão.

Exemplo: Dados em variáveis estáticas

Outro protocolo define que não devemos usar propriedades estáticas que sejam voláteis. Trocamos essa abordagem pelo uso do REDIS novamente.

Objetivo

O objetivo desses protocolos é assegurar que em caso de necessidade, possamos subir uma segunda instância da aplicação, sem nos preocuparmos com refactoring.

Ambos atendem aos requisitos de escalabilidade.

Escalabilidade é a capacidade de sua aplicação escalar horizontalmente (com mais instâncias). É algo muito falado há anos, e essencial para muitas aplicações.

Há um paralelo bem interessante e podemos usar a medicina para explicar com uma analogia.

E se fosse um médico?

Da mesma forma que esperamos que um médico-cirurgião siga os protocolos clínicos e as medidas de higienização em uma cirurgia.

Nós não questionamos se ele usará ou não o protocolo médico!

O médico não nos dá a opção de não seguir o protocolo, e, em contrapartida, nós também pouco pensamos a respeito. Presumimos e partimos do princípio que seguirá o protocolo.

Tudo que negociarmos com o médico a respeito de tipo de cirurgia, duração, período de cicatrização, etc etc toda a negociação, seja ela qualquer, parte do pressuposto de que o médico seguirá um procololo seguro.

Com software, o cliente parte do mesmo princípio. (Ou deveria partir)

O cliente não tem noção de que a ausência de testes unitários, gera um risco alto de bugs. Ele simplesmente quer o mais rápido possível, com a menor quantidade de bugs possível. E dependendo do nível de interação com o detalhe das tarefas.

O cliente não sabe se nós vamos adotar session ou não, ele quer que um dado selecionado no Login influencie o resto do comportamento da aplição para aquele usuário naquela sessão.

E se olhamos para o cliente como alguém com o mesmo nível de clareza técnica que nós, estariamos em apuros.

Lembre-se de que a relação do seu cliente com você é muito parecida com a sua relação de uma pessoa com um médico.

Acho que assim tudo fica mais claro.

O cliente pode e, em geral, pedirá o que é contraditório para o bem da empresa, se for feito exatamente, milimetricamente, da forma como foi dita por ele.

É importante digerir e entender o que é o melhor para o projeto, com base em premissas de requisitos não funcionais. Essas premissas são nossos protocolos.

Solicitações possuem expectativas implícitas

Meu ponto, nessa parte 1 (primeiro post da série) é lembrar que requisitos não funcionais, são estratégicos.

Ao mesmo tempo quando abraçamos um requisito não funcional como essencial para o projeto, tudo que fazemos no projeto deve considerar todos os requisitos que não se perderam pelo caminho.

Há momentos em que uma solicitação entra em contradição com um desses requisitos. Nós devemos fazer essa avaliação e voltar com um feedback claro sobre isso, a decisão não é sua, é do cliente.

Se um requisito cai, é o cliente quem tem de aceitar que caia.

E você, enquanto não recebe um Ok para a queda do requisito, precisa assegurar que cada implementação nova considerará tal obrigação.

Continuamos no próximo post

Esse é um assunto complexo, que preciso dividir em partes para dar atenção a cada um dos assuntos que envolvem essa dinâmica.

O Cloud Native .NET é meu principal projeto.

Onde empenho energia para ajudar, acompanhar, direcionar Desenvolvedores, Líderes Técnicos e jovens Arquitetos na jornada Cloud Native.

Conduzo entregando a maior e mais completa stack de tecnologias do mercado.

Ao trabalhar com desenvolvedores experientes, eu consigo usar seu aprendizado com .NET, banco de dados, e arquitetura para encurtar a jornada.

Ao restringir à desenvolvedores .NET eu consigo usar do contexto de tecnologias e problemas do seu dia-a-dia, coisas que você conhece hoje, como WCF, WebForms, IIS e MVC, por exemplo, para mostrar a comparação entre o que você conhece e o que está sendo apresentado.

É assim que construímos fundamentos sólidos, digerindo a complexidade com didática, tornando o complexo, simples.

É assim que conseguimos tornar uma jornada densa, em um pacote de ~4 meses.

Eu não acredito que um desenvolvedor possa entender uma tecnologia sem compreender seus fundamentos. Ele no máximo consegue ser produtivo, mas isso não faz desse desenvolvedor um bom tomador de decisões técnicas.

É preciso entender os fundamentos para conseguir tomar boas decisões.

0 comentários

Enviar um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

Luiz Carlos Faria

Mensagem do Autor

Espero que goste desse post. Não deixe de comentar e falar o que achou.

Se acha que esse post pode ajudar alguém que você conheça, compartilhe!

 

Lives

Fique de olho nas lives

Fique de olho nas lives no meu canal do Youtube, no Canal .NET e nos Grupos do Facebook e Instagram.

Aceleradores

Existem diversas formas de viabilizar o suporte ao teu projeto. Seja com os treinamentos, consultoria, mentorias em grupo.