No processo de desenvolvimento de software, seja ele tradicional ou ágil, há uma preocupação constante em atender os requisitos funcionais e não funcionais dos sistemas e software que estamos desenvolvendo, visando sempre garantir o seu perfeito funcionamento. Mas você já parou para pensar qual dos dois tipos de requisitos é mais importante? Seriam os requisitos não funcionais mais importantes que os funcionais? Ou o oposto é verdadeiro?

scepitical-baby

Antes de falar qual tipo de requisito de software é mais importante, é necessário entender melhor cada um deles e o que é de fato um requisito.

Requisito - Segundo o dicionário de português online Aurélio, requisito é uma coisa necessária e indispensável, uma exigência. Trazendo isso para o contexto de engenharia de software, um requisito é algo indispensável que um software ou sistema deve exibir a fim de resolver um problema do mundo real, cumprindo assim com o objetivo para o qual foi desenvolvido. Ou seja, objetivos e/ou restrições estabelecidas para o seu correto funcionamento.

Aqui cabe salientar a diferença entre software e sistema, que apesar de muitas vezes serem utilizados como sinônimos, eles de fato são coisas distintas. Software é um conjunto de comandos escritos com o objetivo de executar tarefas especificas. Por sua vez, um sistema é um conjunto de softwares que interagem para atingir um objetivo comum.

Requisitos funcionais - Como o próprio nome sugere, requisitos funcionais são aqueles que se referem às funcionalidades propriamente ditas de um sistema ou software, em outras palavras aquilo que ele deve fazer. Engloba um conjunto de entradas, processamentos, saída, manipulação de dados, cálculos lógicos, entre outros atributos de execução.

Para exemplificar, pense em um software ou sistema qualquer. Pensou? O que ele faz? Chama táxi? Faz buscas na internet? Imprime relatórios? Ou salva contatos? Percebeu que todas as perguntas são relacionadas com ações desse software ou sistema? Logo, todas as perguntas se referem a algum, ou um conjunto, de requisitos funcionais.
Claro que, quando estamos desenvolvendo, devemos ser um pouco mais criteriosos em relação aos requisitos. Pegando o exemplo do software que salva contatos, que provavelmente é uma agenda (:P), ele provavelmente teria algumas funções básicas como: inserir, editar e excluir contatos. Todos esses são requisitos funcionais que provavelmente consideraríamos na hora de desenvolver esse software.

Requisitos não funcionais – Se os requisitos funcionais dizem o que o sistema faz, os requisitos não funcionais dizem como ele deve fazer. Tratando mais diretamente com premissas, restrições técnicas e legais, esses requisitos envolvem as necessidades que não podem ser atendidas através de funcionalidades.

Continuando com o exemplo de nossa agenda, quanto tempo você gostaria de esperar para ela abrir? E para adicionar novos contatos? Ou mesmo exibir detalhes? Você ficaria muito chateado se ela perdesse alguns contatos esporadicamente? Percebeu que dessa vez as perguntas foram mais focadas em comportamentos do software, mais especificamente nos quesitos tempo de resposta e confiabilidade? Isso porque, dessa vez, estamos tratando de seus requisitos não funcionais, logo nos voltamos para como o software faz e não para o que ele faz.

Claro que, como usuários, sempre queremos softwares e sistemas rápidos, confiáveis, seguros, intuitivos, dentro das normas legais e que contemplem vários outros requisitos não funcionais difíceis de definir, como ser amigável e, porque não, ético. Mas quando estamos desenvolvendo, devemos ter em mente que, apesar de serem difíceis de definir, os requisitos não funcionais devem possuir métricas bem definidas para sua avaliação e validação. Logo, não basta dizer apenas que queremos que nossa agenda abra rápido, temos que dizer, por exemplo, que queremos que nossa agenda abra em, no máximo, 2 segundos. Assim teremos como validar se saciamos ou não esse requisito.

Sim, e quem é mais importante?

Agora que sabemos diferenciar os tipos de requisitos de software, podemos responder se requisitos não funcionais são mais importantes que requisitos funcionais. E a resposta é: Não, mas isso também não quer dizer que o oposto é verdadeiro.
confused

Eu sei, essa resposta não leva a conclusão alguma, mas como diria meu tio Jack, vamos por partes :D. Imagine que estamos construindo um software, nossa agenda do exemplo acima, todos os requisitos não funcionais foram atendidos, ela é super-rápida, abre em 0,0000005 segundos, nunca perde um contato, mas nunca mesmo, pois por algum motivo não implementamos a função de apagar contatos.

A princípio isso pode até não parecer um problema grave, contudo imagine que temos um limite de memória muito pequeno. Quando essa memória começa a se esgotar, teremos um grande problema se não tivermos como salvar os contatos em outro lugar. Logo, a ausência de uma funcionalidade pode causar um problema grave. Entretanto a resolução é relativamente simples: basta inserirmos a funcionalidade e tudo está resolvido.

Agora imaginemos o seguinte quadro: temos todas as funcionalidades da nossa agenda implementadas, ou seja, todos os nossos requisitos funcionais foram atingidos, somos capazes de inserir, editar e apagar contatos, e o melhor é que é tudo online agora. Mas, para cada ação dessas, precisamos esperar em média 3 segundos, pois por algum motivo o servidor que usamos em nosso sistema oscila muito, mas muito mesmo (espero realmente que não existam servidores assim).

Assim, apesar de termos todos os nossos requisitos funcionais atendidos, todos eles foram gravemente afetados por apenas um requisito não funcional não atendido, que impacta gravemente a usabilidade de nosso sistema. Além disso, a resolução desse problema pode não ser tão simples; mudar de servidor a depender de como o sistema foi implementado pode impactar em mudanças drásticas em todo o sistema.

Conclusão

Podemos concluir que tanto os requisitos funcionais quanto os não funcionais são de extrema importância para os seus respectivos softwares e sistemas, e que o não atendimento de qualquer um deles pode acarretar em problemas graves. Logo não podemos definir qual é mais importante, ambos têm igual importância no desenvolvimento de software.

Contudo é notório que, o não cumprimento de alguns requisitos não funcionais pode acarretar problemas cuja resolução não é tão simples, ou mesmo muito custosa. Assim é necessário um planejamento cuidadoso de qualquer software ou sistema no tocante a esses requisitos, a fim de evitar graves problemas no futuro.

Usamos aqui um pequeno exemplo para demonstrar o que são requisitos funcionais e não funcionais, como eles afetam o desenvolvimento de software e o quão importante eles são. Mas esse é um tema muito extenso e gera muitos estudos para o meio cientifico, logo não seria possível falar tudo aqui. Então caso queira adicionar algo, criticar algum ponto, ou falar mais do assunto, fique a vontade.