Entregar valor com qualidade no desenvolvimento de software parece algo fácil de entender e explicar. Mas no dia a dia de muitos projetos tem sido algo difícil de aplicar na prática.

Tudo começa na compreensão sobre o que é qualidade do software, entrega de valor e qualidade no desenvolvimento de software.

Qualidade do software é comumente associado pelo seus utilizadores às características e usabilidade da interface com a qual interagem. Em alguns aspectos ela se confunde com a visão de entrega de valor.

Mas para devs, quando citamos qualidade no desenvolvimento de software, estamos direcionando o olhar para a forma com a qual o software é desenvolvido, o que interfere na entrega de valor. Estas duas questões são o foco do artigo.

São questões polêmicas e demandam uma resposta elaborada, então vamos lá!

Em mais de 20 anos participei de muitos projetos, em diversas stacks e arquiteturas, entregando software para diversos domínios de negócio.

Ao olhar para todas entregas, percebo que algumas facilitaram muito o dia a dia dos clientes, alavancaram negócios ou até transformaram o processo da época.

Foram entregas que fazem sentido ao termo entrega de valor.

Percebo também que em outras entregas não havia clareza sobre como ajudariam os clientes. Algumas faziam sentido, mas não resolveram os reais problemas. Outras os clientes utilizaram por “imposição” ou sequer utilizaram.

Em todas aprendi muito e amadureci como profissional, e mesmo as que não entregaram valor contribuíram muito para o entendimento do que é entrega de valor!

Entrega de valor está associada a como influenciamos positivamente a vida dos clientes!
As soluções precisam facilitar algo, simplificar e/ou alavancar negócios ou até revolucionar segmentos.

O sucesso real de uma entrega acontece quando ela contribui para o sucesso do cliente.

Entrega de valor parece então ser o primeiro e mais importante quesito de qualidade.

Mas… como fica a qualidade no desenvolvimento de software?

Lembrando das entregas citadas, houveram softwares aplicando boas práticas, código legível, padrões de projeto, testes automatizados, usando tecnologias e metodologias atuais na época! Alguns softwares estão em uso mesmo depois de 10, 15 anos de sua implementação.

Esses podem ser exemplos de qualidade no desenvolvimento de software.

Mas também houveram softwares ignorando tudo isso chegando ao ponto de serem totalmente refatorados ou até descartados.

O fato é que nem sempre foi possível conciliar qualidade no desenvolvimento de software com entrega de valor. Algumas vezes houve a percepção de que essas duas questões estavam em lados opostos!

Mas… porque temos essa percepção?

Desenvolver ou produzir algo com qualidade normalmente requer o conhecimento e tempo apropriado de conclusão. Entrega de valor, requer atender as expectativas do negócio e cliente, e considerando o “timing de mercado”, pode-se acrescentar o termo “o quanto antes”, já que a concorrência é cada vez mais feroz.

Acredito que é nesse ponto que surge a percepção de que entrega de valor e qualidade no desenvolvimento de software não convergem. Porque na primeira há cada vez mais uma busca para acontecer no menor tempo, e esse menor tempo parece ser o dificultador para ter qualidade ao construir o software.

Atualmente, em muitos projetos há pouco tempo para aprender e executar. Há muitos times ainda buscando conhecimento e maturidade. Mas todos tem muita vontade e energia, e fazem o negócio acontecer. Isso pode gerar códigos difíceis de manter, integrações difíceis de evoluir ou alterar, processos manuais que viram problemas operacionais, dentre outros.

Em algum momento isso pesa, e só vontade e energia não são mais suficientes.

Mas, esse problema geralmente ocorre por uma questão positiva, significa que a ideia e negócio estão dando certo. O que pode gerar maior poder de investimento, e isso será revertido em revisão do software, refatoração, estudo, aspectos de qualidade! E é nessa hora que tudo fica incerto, entregar valor agora parece levar muito tempo, e o timing de mercado continua a assombrar.

Bem… como resolver isso? Como conciliar as duas questões?

Precisamos ser realistas, não há uma resposta trivial, não há uma fórmula mágica.

Equilibrar as duas questões é possível, mas isso ocorre através de vários detalhes.

Pense em um investidor na bolsa de valores, no mundo ideal ele deseja fazer um investimento que contenha risco zero e o lucro máximo. Mas o sucesso não vem por encontrar uma opção de investimento perfeita, e sim equilibrar risco e lucro.

Na bolsa de valores é necessário conhecer todos os detalhes, e no desenvolvimento de software também.

Cada detalhe possui sua própria complexidade, o que torna inviável apresentá-las por completo em um único artigo. Mas abaixo, segue 15 destes “detalhes” que devs e outros profissionais de tecnologia podem atuar.

1. Compreensão do domínio de negócio

Conhecer superficialmente o negócio limita a capacidade de desenvolver soluções de maior impacto. Uma compreensão verdadeira irá refletir em melhores soluções para os problemas e também possibilitará maior qualidade nas conversas, definições e implementações de software.

2. Desenho da solução de negócio

Ser capaz de desenhar a solução de negócio explicita o nível de conhecimento sobre o mesmo, assim como compartilha com os demais a mesma visão, na qual certamente será possível identificar com antecedência pontos de atenção com relação às entregas e também a qualidade na implementação. Não é necessário diagramas complexos ou metodologias burocráticas, um quadro branco é um bom início e pode ser o suficiente!

3. Priorização das entregas

Pequenas entregas bem feitas é melhor que entregar coisas grandes demais ou um pouco de tudo e que não gera valor. Priorize as entregas de acordo com o valor a ser gerado ao cliente, analise os aspectos de qualidade na implementação intercalando quando necessário momentos onde desenvolvedores(as) poderão dedicar o tempo adequado ao assunto.

4. Validação antes de codificação

Valide se a solução planejada vai entregar valor ao cliente, se atenderá suas necessidades. Isso será mais barato do que codificar e descobrir posteriormente que não foi gerado valor ao cliente. O custo para refatoração normalmente será alto e impactará diretamente na qualidade da implementação.

5. Organização das tarefas a serem feitas

As tarefas nas quais o time de desenvolvimento trabalhará devem estar organizadas conforme a priorização das entregas, contendo detalhamento suficiente com relação ao que é esperado quando pronto. Desorganização nessa etapa é um grande responsável por entregas “sem valor” e podem sacrificar a qualidade na implementação do software.

6. Desenho da arquitetura

Desenhar a arquitetura do software influencia diretamente na qualidade com a qual ele será desenvolvido. Ao desenhar será possível debater ideias, confrontar decisões e melhorar as escolhas.

Ao não desenhar normalmente o time irá codificar e depois de pronto perceber questões inadequadas, que provavelmente irão virar dívidas técnicas difíceis de encaixar no cronograma, obrigando o time a conviver com elas por longos períodos, o que compromete a qualidade como um todo e inclusive pode dificultar novas entregas de valor.

7. Modelagem clara

A modelagem de componentes, entidades, atributos, precisa estar clara a todos para que aspectos de qualidade possam ser aplicados. Um software cuja codificação seja feita sem clareza da modelagem está muito próximo de problemas de manutenção e evolução.

8. Documentação útil

Documentação é muitas vezes confundida com burocracia, e em muitos casos de fato à gera. Porém em qualquer outra área, processos relacionados a qualidade de produção possuem as informações úteis documentadas. Foque em documentações curtas e objetivas, registre aquilo que é repetido a todos muitas vezes porque já se esqueceram. Evite ter informações vitais apenas na cabeça das pessoas.

9. Código legível

Um código legível não é aquele feito com menos linhas, mas sim que os colegas possam abrir e compreender facilmente o que ele faz. Clean Code é a referência para código legível, e há ainda uma ação muito simples, questionar se “o próximo dev vai entender o que eu queria com esse código?”. Revisão de código é outra estratégia excelente para ajudar na implementação de códigos com maior qualidade.

10. Padronização

Liberdade para cada dev fazer do “seu jeito” é legal, tem valor, mas não escala e interfere diretamente na qualidade do software. Não deve-se ter medo de definir e cobrar o uso de padrões, deve-se ter medo de um software com código escrito de várias formas diferentes a gosto de cada desenvolvedor.

11. Redução de dependência

A nível de software, reduzir dependências entre componentes e o próprio código sempre facilitará o desenvolvimento com maior qualidade. É preciso mapear as dependências e torná-las visíveis para que desenvolvedores(as) busquem sempre reduzi-las. Há ferramentas nas mais diversas linguagens que ajudam nesta tarefa.

A nível de pessoas, qualidade não pode depender do olhar de uma ou outra pessoa. Desenvolver com qualidade deve ser uma premissa do time.

12. Testes automatizados

Executar um comando e através do resultado saber que tudo continua funcionando ou que há algo errado no software, será inevitavelmente mais barato do que executar manualmente os testes. Quanto mais complexo o negócio, maior o software e o time, mais caro será testar manualmente. No começo testes automatizados podem parecer que “custam tempo”, mas apenas no começo, depois que os times aprendem a trabalhar com testes automatizados, isso passa a ser algo natural no dia a dia sem acrescentar tempo.

Uma boa comparação é quando uma pessoa aprende a dirigir, no começo ela “gasta” mais tempo a cada decisão e ação, mas depois que aprende, dirigir acontece através de movimentos naturais. Para testes automatizados é semelhante, desenvolvedores(as) poderão “gastar” um tempo até aprender, mas depois não há mais divisão entre tempo para implementar código de negócio e tempo para o código de testes.

Testes automatizados se destacam como um dos maiores contribuidores para qualidade no desenvolvimento de software.

13. Automatização

Todas as tarefas que são realizadas manualmente no escopo de uma solução completa de software estão suscetíveis a erros! Automatizar todas as tarefas possíveis poupa tempo das pessoas que as executam repetitivamente e mais que isso garante que sua execução será realizada sempre da mesma forma.

14. Amadurecimento do time

Para fazer algo com qualidade, é necessário ter o conhecimento adequado para tal, e o tempo utilizado para fazer algo com qualidade diminui através da repetição. Então pode-se afirmar que sem o tempo adequado para adquirir o conhecimento e amadurecimento dos times de desenvolvimento, dificilmente pode-se chegar a qualidade do desenvolvimento de software.

Estimular o time a aprender e dar espaço para amadurecer é essencial.

15. Compartilhamento entre pessoas

Entregar valor e ter qualidade no desenvolvimento de software requer o máximo de compartilhamento de conhecimento, boas práticas, críticas, vitórias e inclusive cobrança entre as pessoas. O que fica represado em uma ou poucas pessoas não tem como ser tratado pelas demais, logo elas estarão vulneráveis a desenvolver sem qualidade ou entregar coisas que não atende o esperado.

Bem… listando assim até parece fácil!

Mas quando olhamos para a realidade do projeto, colocar na prática tantas coisas se torna difícil. E isso acontece porque projetos, produtos, empresas e pessoas estão em momentos diferentes, o que é aplicado e funciona para um pode não funcionar em outro da mesma forma.

É importante identificar quais itens dos citados estão comprometendo mais agora. Por exemplo, selecione os 3 ou 5 itens que mais interferem agora na entrega de valor e qualidade no desenvolvimento.

A prioridade deles pode variar de acordo com o momento do time, negócio, e empresa. Uma das chaves para o equilíbrio pode ser justamente respeitar esse momento, que em geral é:

  • Grande ideia, pouco dinheiro: Cenário inicial de muitas startups, com pouco dinheiro é mais difícil se dedicar a qualidade no desenvolvimento de software, é necessário antes de tudo garantir que a grande ideia de fato é boa e entregará valor ao cliente. Isso faz todo sentido, já que ao ter a mais alta qualidade no desenvolvimento do software mas sem entrega de valor, torna tal qualidade inútil.

  • Ideia já entrega valor, sobra algum dinheiro: Se as entregas de software geram valor, há motivos para investir cada vez mais em qualidade. Certamente haverão dívidas técnicas, e a partir de agora a “falta” de qualidade poderá interferir diretamente na entrega de valor, pouca atenção a isso pode reduzir o valor das próximas entregas.

  • Ideia consolidada, muito dinheiro: Com a ideia consolidada e clientes reconhecendo o valor entregue, as exigências sempre aumentam e a qualidade não é mais uma escolha, não deve ser negociável, falta de qualidade pode custar tudo que foi conquistado. Investir dinheiro na qualidade é investir em manter a evolução do negócio e criar um caminho consistente para lidar com a provável concorrência, que talvez já esteja mais rápida que você, mas que também passará pelo mesmo desafio de qualidade.

É necessário conhecimento e amadurecimento das pessoas para usar a qualidade no desenvolvimento de software à favor!

Como citado no início, equilibrar entrega de valor e qualidade no desenvolvimento de software não é algo trivial! Talvez este seja um dos maiores desafios dos tempos atuais com relação ao desenvolvimento de software.

O segredo está nos detalhes! E há ainda vários critérios associados à qualidade do software como: alcance, profundidade, usabilidade, portabilidade, dentre outros que podem ser aplicados.

Para obter sucesso é necessário respirar fundo e atacar detalhe por detalhe de forma priorizada, com serenidade, determinação e resiliência, medindo cada progresso.

Soluções mágicas e promessas fáceis podem gerar alguma melhoria de curto prazo, mas que dificilmente são sustentáveis, quanto maior o tempo gasto em alternativas vazias, mais a ausência de qualidade no desenvolvimento de software pode comprometer a entrega de valor.

Deseja contribuir com o assunto? Deixe nos comentários!