Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.
left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Prévia do material em texto

ENGENHARIA DE SOFTWARE 
Silvio Bogsan 
 
 
 
 
 
 
 
 
 
, 
 
 
2 
 
 
SUMÁRIO 
 
1 NATUREZA E ENGENHARIA DE SOFTWARE .............................................. 3 
2 PROCESSO DE DESENVOLVIMENTO DE SOFTWARE ............................... 15 
3 ENGENHARIA DE SOFTWARE E MODELAGEM ........................................ 28 
4 REQUISITOS DE SOFTWARE ................................................................... 42 
5 GESTÃO DE QUALIDADE DE SOFTWARE ................................................ 55 
6 TÓPICOS AVANÇADOS EM ENGENHARIA DE SOFTWARE ....................... 66 
 
 
, 
 
 
3 
 
 
1 NATUREZA E ENGENHARIA DE SOFTWARE 
Apresentação 
Este bloco tem como principal objetivo contextualizar a disciplina Engenharia de 
Software e pavimentar os conceitos mais importantes relacionados ao Software. 
Vamos definir o que é Software, o que é Engenharia de Software e quais suas 
principais aplicações. Também vamos entender o cenário do desenvolvimento de 
software, as diferentes classes de software, que formas de executar os softwares e 
como nós, humanos, interagimos com eles. Vamos contextualizar a Arquitetura de 
Software e estabelecer a diferença entre a Arquitetura e a Engenharia de Software. 
1.1 Natureza e Engenharia de Software 
Talvez você não saiba disso, mas “computador” já foi uma profissão, feita por uma 
pessoa, um ser humano. Talvez hoje chamaríamos essa pessoa de Contador, uma 
pessoa que faz contas. Contudo, o contador moderno faz mais do que contas. Essa 
profissão de computador se tornou extinta quando surgiu o software. Assim como a 
profissão de “acendedor de lampião” ficou extinta quando surgiu a luz elétrica nas 
ruas. 
Se seu carro lhe diz que você se esqueceu de colocar o cinto de segurança, ou que está 
na hora de trocar o óleo, é graças ao software. Seu celular lhe despertou de manhã? É 
ação do software. Seu micro-ondas preparou pipoca? Mais uma vez, há a presença do 
software. Seu fone de ouvido neutralizou ruídos externos? Software. Mandou aquela 
planilha para seu chefe por e-mail? Software e software. A vida hoje é baseada em 
software. Seja para comprar comida ou para pedir uma carona, se comunicar com as 
pessoas, ler, estudar. Você não estaria lendo este texto se não fosse por diferentes 
softwares usados na preparação desta apostila, armazenamento, transmissão e 
apresentação no seu dispositivo, seja um celular ou tela de computador. 
Software é o conjunto de instruções usado para fazer com que máquinas e dispositivos 
variados executem uma determinada rotina. Quando você liga seu celular, um 
, 
 
 
4 
 
software pré-gravado faz com que o sistema operacional seja carregado e comece a 
executar. Esse software controla tudo que seu celular faz. Inclusive executa todos os 
seus pedidos. Seja mandar uma mensagem, seja tocar uma música. Cada aplicativo 
baixado no seu celular é um software diferente. Calculadora, mensagens, fotos. 
Normalmente, o produto final que um software produz é informação. O software 
normalmente transforma uma informação recebida em outra informação desejada. 
Ao pisar no freio, o sistema ABS recebe como informação a força que foi aplicada no 
pedal, a velocidade que a roda está girando e então calcula quanto dessa força deve 
ser devolvida para o pedal, evitando assim o travamento da roda e a derrapagem 
resultante, o que diminui consideravelmente a chance de acidente. Quando você abre 
o aplicativo de câmera do seu celular, o sensor CCD é ativado e na tela aparece o que a 
lente do seu celular está captando e um botão é colocado na tela para que você 
escolha o que quer capturar e em que momento, e essa informação é salva na forma 
de um arquivo digital na memória do dispositivo. É possível fazer o mesmo num jogo 
no videogame, num website na Internet, no caixa eletrônico. 
A complexidade do desenvolvimento de software fez surgir uma disciplina para lidar 
com essa complexidade: a Engenharia de Software. Você a essa altura deve estar se 
perguntando o que engenharia tem a ver com software. Engenharia tem a ver com 
ferramentas e técnicas para lidar com coisas complexas. O desenvolvimento de 
software é bastante complexo. Daí, precisamos de ferramental e de técnicas para 
transformar essa complexidade em coisas mais simples, que podemos fazer de forma 
mais fácil, mais eficiente. 
Você nunca parou para pensar em como é complexo construir uma estação de metrô? 
Ou um prédio de 30 andares? Uma ponte sobre um rio? 
1.2 Software e Classes de Software 
Acreditamos que você agora está dentro do contexto do que seja software e qual seja 
o propósito desta disciplina. Então, vamos ver algumas definições do que é software. 
Software é o objeto de estudo que nos interessa aqui, então temos que compreender 
esse conceito. 
, 
 
 
5 
 
Segundo o dicionário do Google, a primeira definição de Software é “conjunto de 
componentes lógicos de um computador ou sistema de processamento de dados”. [1] 
Mas o que significa isso exatamente? Dentro do processador, existe um conjunto 
variado de componentes lógicos, lidando com informações binárias e que podem ser 
combinados de várias formas para executarem as operações mais complexas de que 
precisamos. Por exemplo, matematicamente, 2 x 3 é igual a 2 + 2 + 2, então, 
poderíamos combinar circuitos lógicos de soma para fazer uma multiplicação. Era 
assim que os primeiros computadores funcionavam. Hoje em dia, nos processadores 
modernos, existem milhares de conjuntos lógicos disponíveis. Quando escrevemos um 
software, usamos diferentes combinações desses componentes lógicos. 
Já segundo outro dicionário, o Michaelis, Software é “Qualquer programa ou grupo de 
programas que instrui o hardware sobre a maneira como ele deve executar uma 
tarefa, inclusive sistemas operacionais, processadores de texto e programas de 
aplicação”. [2] Essa definição nos diz exatamente o que faz o software. Quando 
apertamos o botão “Pipoca” do micro-ondas, está programado quanto tempo e quanta 
potência o aparelho vai usar para preparar sua pipoca. Se apertarmos o botão 
“Frango”, a programação será diferente. 
Uma definição pensada na Engenharia de Software vem de Pressman e Maxim [4]: 
Software consiste em: (1) instruções (programas de computador) que, 
quando executadas, fornecem características, funções e desempenho 
desejados; (2) estruturas de dados que possibilitam aos programas 
manipular informações adequadamente; e (3) informação descritiva, 
tanto na forma impressa quanto na virtual, descrevendo a operação e o 
uso dos programas. 
Perceba que aqui está incluída a estrutura de dados para dar ao software condições de 
produzir informações desejadas por nós, humanos, para manipular informações 
adequadamente através de funções e desempenho desejados. O que garante que essa 
manipulação está bem feita? Que os critérios foram seguidos? Sim, claro, a Engenharia 
de Software. Hoje em dia, o desenvolvimento de software é bem complexo. 
, 
 
 
6 
 
E uma definição mais ampla é feita por Fernandes [3], em seu artigo “Qual a prática do 
desenvolvimento de software?” e diz que: 
O termo “programa” significa o programa original e todas as cópias 
completas ou parciais do mesmo. Um programa consiste em instruções 
legíveis por máquina, seus componentes, dados, conteúdo audiovisual (tal 
como imagens, texto, gravações ou figuras) e materiais licenciados 
relacionados. [Licença de software da IBM apud Fernandes] 
Conforme esta definição, em geral adotada pela indústria de software, um 
software é mais do que as instruções interpretáveis por uma máquina. 
Digno de nota é a indicação de que conteúdo audiovisual (tal como imagens, 
texto, gravações ou figuras) também é parte do software ‒ este aspecto 
extrapola o conceito de software inicialmente apresentado como meta-
máquina, à medida que torna explícito o fato de que qualquer material 
escrito, impresso, apresentável em qualquer mídia de comunicação,de 
natureza textual, gráfica, audível etc., que tem por objetivo descrever algo 
para o usuário ou sua máquina, também é parte do software. 
As telas, os sons, a embalagem, os manuais. Tudo isso é parte integrante do software. 
É claro que nesta disciplina não vamos falar nisso, mas um projeto de software hoje 
em dia precisa considerar a parte comercial também. E hoje é muito mais comum o 
download feito direto no dispositivo a partir da “lojinha” e o manual é on-line e não 
físico, mas precisamos entender que fazem parte do software num sentido amplo. 
Agora, software é um conceito que deve ter ficado mais claro, mas ainda temos que 
ver as categorias de software para definir melhor o conceito. Segundo a TechNet[5], 
base de dados da Microsoft, a maior empresa de Software do mundo, a AIS 
(Association for Information Systems) usa 8 grandes categorias e 40 categorias 
menores para organizar inventário de software. Isso dá uma ideia da grandeza e da 
complexidade quando falamos em classificar os softwares. Pressman e Maxim [4] 
apresenta uma lista com 7 grandes categorias. Então, vamos fazer uma coletânea 
dessas diferentes classificações e apresentar aqui um resumo: 
 Software Básico: é aquele usado para funções mais operacionais e ligadas ao 
funcionamento do hardware. É o caso do sistema operacional do seu celular, 
, 
 
 
7 
 
por exemplo. Também aqui entram os utilitários como os antivírus, por 
exemplo, e os drivers, que fazem os dispositivos funcionarem adequadamente. 
 Software de Produtividade: aquele que permite a você fazer coisas do dia a dia 
como mandar um e-mail, navegar na Internet, digitar textos, fazer 
apresentações, mandar mensagens e montar uma planilha de gastos. 
 Software de Operações Comerciais: este grupo engloba os grandes softwares 
usados por empresas no mundo todo. Fazem a contabilidade, a folha de 
pagamento, o planejamento da produção, organizam a cadeia de suprimentos, 
facilitam a interação com clientes e gerenciam as informações corporativas. 
 Software de Entretenimento: feito para uso doméstico e recreativo. Diz 
respeito aos diferentes jogos de que tanto gostamos. 
 Software Educacional: é o que permite estudar e aprender usando os 
dispositivos computacionais, como o que garante que esta apostila chegue até 
você. 
 Softwares para Plataformas: são aqueles que garantem que a infraestrutura 
funcione adequadamente. Softwares que controlam as centrais telefônicas, a 
distribuição de energia elétrica, as redes de computador e as rotas de Internet, 
incluindo o software que existe no roteador wi-fi em casa e nas torres de 
telefonia celular. 
 Softwares para Desenvolvimento: são os softwares que permitem ou auxiliam 
no desenvolvimento de outros softwares. As linguagens de programação, os 
compiladores e os interpretadores de comando. Alguns autores os colocam na 
categoria de Softwares de Operações Comerciais. 
 Softwares Embarcados: são os pequenos softwares embutidos em aparelhos 
domésticos, carros e máquinas pesadas, como robôs industriais. Seu aparelho 
de TV, a máquina de lavar e o micro-ondas possuem software para funcionar. 
Esta aqui seria uma subcategoria dos Softwares Básicos, se formos ficar com 
uma classificação mais ampla. 
Essas classificações não são unanimidade. Dependendo do autor, da pessoa com quem 
se está falando, e até do momento, a classificação pode mudar. Outra coisa que se 
, 
 
 
8 
 
precisa pensar é que talvez essas divisões tenham limites pouco definidos. Usamos 
softwares de produtividade para produzir o conteúdo que você está acessando através 
de softwares de plataformas e que estão dentro do software educacional da 
Universidade. Onde exatamente termina um e começa o outro? 
1.3 Propósito ou Domínio de Uso e Domínio de Execução 
Se olharmos de forma diferente e pensarmos apenas no propósito, ou seja, em como 
vamos usar o software, poderíamos dizer que existem duas grandes categorias apenas. 
Os Softwares Básicos e os Softwares Aplicativos. 
O Básico está mais ligado a fazer os equipamentos funcionarem adequadamente, e os 
Aplicativos fariam todo o resto. É uma forma diferente de classificação que parte 
apenas do domínio de uso e tudo fica dentro dessas duas abordagens: ou o software 
faz um equipamento funcionar ou o software é para o ser humano executar suas 
tarefas. 
Há uma terceira categoria que são os Softwares Maliciosos, ou Malware, que são 
programas usados para roubar dados, os vírus de computador e outros. 
Quando olhamos onde o software é executado, a classificação pode ser feita de forma 
diferente. Os softwares precisam de ambientes diferentes para poderem executar de 
forma adequada. Vejamos: 
 Softwares Desktop: são os softwares que executam no dispositivo 
computacional (computadores, tablets, smartphones) e que permitem 
fazermos nossas atividades do dia a dia. 
 Softwares de Servidor: são os softwares que executam em grandes 
computadores e que permitem armazenar grandes quantidades de informação 
e fazem milhares de operações por segundo. 
 Softwares Embutidos: são os que executam dentro de aparelhos domésticos, 
automóveis e robôs. Normalmente, esses softwares têm apenas uma finalidade 
e uma funcionalidade. 
, 
 
 
9 
 
 Software de Microcódigo: é um tipo de software que fica gravado no próprio 
processador e que permite ao próprio processador saber como executar código 
de máquina. Normalmente, apenas o fabricante tem acesso. 
1.4 Engenharia de Software 
Vamos partir da definição de Engenharia de Software, segundo a ISO 24765:2017[6]: 
Engenharia de Software é: (1) a aplicação sistemática de conhecimento, métodos e 
experiência científicos e tecnológicos para o projeto, implementação, teste e 
documentação de software; (2) a aplicação de uma abordagem sistemática, 
disciplinada e quantificável no desenvolvimento, operação e manutenção de software; 
ou seja, a aplicação da engenharia ao software. 
Vamos entender essa definição. Aplicação sistemática de conhecimento científico e 
experiência significa que a princípio precisamos saber o que estamos fazendo. A 
definição também fala em métodos, o que significa que não podemos fazer as coisas 
de qualquer jeito. A segunda parte da definição fala especificamente do porquê usar 
engenharia. Abordagem disciplinada e quantificável no desenvolvimento, operação e 
manutenção. Software dá manutenção. Em muitos casos, muita manutenção. E 
abordagem disciplinada na operação quer dizer que não adianta operar o software de 
qualquer jeito porque ele pode deixar de funcionar ou apresentar resultados 
inesperados. É o que acontece se o usuário digitar o número de seu telefone no lugar 
do CEP, por exemplo. 
Já de acordo com Summerville [7], a engenharia de software é uma disciplina da 
engenharia que se preocupa com todos os aspectos da produção de software, desde a 
especificação até depois que entrou em uso. É uma definição mais ampla e aberta, mas 
que remete à engenharia. É uma disciplina da engenharia, ou seja, é parte da 
engenharia, o que pressupõe uso de método e controles para a produção de software. 
E o dicionário Merriam-Webster [8] traz o termo como um ramo da ciência da 
computação que lida com projeto, implantação e manutenção de programas de 
computador complexos. Aqui também é interessante notar a referência a uma ciência 
, 
 
 
10 
 
e o fato de citar programas de computador complexos. É claro que programas 
complexos precisam de mais detalhamento e muito mais cuidado no projeto, na 
implantação e vão dar muito mais manutenção do que o aplicativo “Calculadora” do 
seu celular ou o botão “Pipoca” do micro-ondas. Mas os fundamentos da Engenharia 
de Software podem e devem ser usados em qualquer tamanho ou natureza de 
software. 
A Engenharia de Software possui uma espécie de manual, de guia de referência, 
chamado SWEBOK. 
O SWEBOK – Software Engineering Base of Knowledge – ou Base de Conhecimento em 
Engenhariade Software é um guia de referência desenvolvido por um comitê técnico 
conjunto do IEEE (Institute of Eletric and Eletronic Engineering) e a ISO (International 
Organization for Standardization) que compilou num único volume muitas das normas 
e referências existentes na área da Engenharia de Software. A versão mais recente é a 
chamada SWEBOK v3, de 2013. Em 2016, foi criado um comitê chamado SWEBOK 
Evolution, para cuidar do desenvolvimento do corpo de conhecimento. 
 
Fonte: ROCHA, Felipe Lira. Modelos de Desenvolvimento de Software. Blog do Felipe Lira Rocha, 15 abr. 
2012. Disponível em: <https://felipelirarocha.wordpress.com/2012/04/15/diversos-modelos-de-
desenvolvimento-de-software-resumo/>. Acesso em: 10 jan. 2020. 
https://felipelirarocha.wordpress.com/2012/04/15/diversos-modelos-de-desenvolvimento-de-software-resumo/
https://felipelirarocha.wordpress.com/2012/04/15/diversos-modelos-de-desenvolvimento-de-software-resumo/
, 
 
 
11 
 
Quando olhamos o SWEBOK, encontramos os capítulos para Requisitos de Software, 
Projeto de Software, Construção de Software, Testes de Software, Manutenção de 
Software, Gerenciamento de Configuração, Gerenciamento da Engenharia de 
Software, Modelos e Métodos de Engenharia de Software, Qualidade do Software, 
Prática Profissional, Modelo Econômico da Engenharia de Software, Fundamentos 
Computacionais, Matemáticos e de Engenharia. São 15 capítulos em 335 páginas e é 
uma leitura que faz referência a diversas fontes. Então, esse guia, ou corpo de 
conhecimento precisa ser complementado com muita leitura extra e muito estudo. No 
entanto, os princípios estão compilados num único volume. 
1.5 Arquitetura de Software 
A Arquitetura de Software se refere às estruturas fundamentais de um sistema de 
software e a criação dessas estruturas fundamentais. É uma analogia com a 
arquitetura de um prédio, em que o arquiteto projeta um edifício e diz que material 
vai revestir as escadas, onde vai ficar o elevador e as garagens, e qual será o tipo de 
janela. Na Arquitetura do Software, dizemos o que o software vai fazer, como serão as 
telas, em que plataforma tecnológica ele vai funcionar. 
Contudo, é a Engenharia de Software que vai cuidar de todo o detalhamento. Assim 
como é o Engenheiro Civil que vai dizer quanto concreto será usado nas escadas que 
depois serão revestidas tal qual projetou o arquiteto. A Engenharia de Software vai 
cuidar dos requisitos, do projeto, do desenvolvimento, testes e manutenção. Essas 
duas áreas trabalham de forma integrada. Entretanto, o objetivo delas é diferente. A 
Arquitetura de Software cuida mais da concepção do produto desejado, enquanto a 
Engenharia de Software cuida da construção do produto desejado. 
A Arquitetura de Software nos faz adotar certas estruturas que são muito difíceis e 
muito caras para mudar depois. Por exemplo, se o arquiteto de software decidiu usar 
um banco de dados de um determinado fabricante, será muito difícil mudar para um 
banco de dados de outro fabricante, pois embora os sistemas de banco de dados 
sejam parecidos e sigam uma padronização (pelo menos os relacionais, mais comuns 
, 
 
 
12 
 
hoje), existem especificidades que podem gerar comportamentos indesejados e 
inesperados (chamados “bugs”, ou erros). 
A ISO 42010 [9] é quem define a Arquitetura de Software como o processo de 
conceber, definir, expressar, documentar, comunicar, certificar a implementação 
apropriada, manter e melhorar uma arquitetura através do ciclo de vida de um 
sistema. E ainda diz que os conceitos fundamentais ou propriedades de um sistema 
levam em consideração seu ambiente, seus elementos, relacionamentos e a evolução 
do seu projeto. 
Podemos perceber uma interação clara com a Engenharia quando a definição diz que a 
arquitetura tem o processo de certificar a implementação. Ou seja, depois que a 
Engenharia construiu o produto de software, a Arquitetura valida o que foi feito para 
ver se atende o conceito, se o software faz aquilo que foi proposto e concebido pela 
Arquitetura de Software. 
E ainda a mesma norma ISO 42010 [9] traz o conceito de “Framework” da Arquitetura 
de Software, que seriam as convenções, os princípios e as práticas para a descrição das 
arquiteturas estabelecidas dentro de um domínio específico de aplicação. 
“Framework” tem a ver com forma de fazer, um modelo de como as coisas devem ser 
feitas. Isso para que os conceitos e a concepção fundamental do software possam ser 
bem definidas e documentadas para o processo de construção do software, que será 
feito por outro conjunto de pessoas. Documentação é fundamental dentro de todos 
esses processos, tanto de Arquitetura de Software, quanto de Engenharia. Grupos de 
pessoas diferentes fazem coisas diferentes para a produção de um resultado esperado. 
Pense num jogo de videogame. Alguém vai desenhar o jogo, os personagens. Outro 
grupo de pessoas vai programar o jogo. Há ainda música e animação de tudo isso. 
Também haverá pessoas pensando no produto final, venda e distribuição. Sem se 
esquecer da equipe de testes. Se esses diferentes grupos não documentarem o que 
estão fazendo, a integração dessas áreas será muito difícil, podendo resultar num 
produto de software de qualidade inferior, cheio de erros e comportamentos 
inesperados, caracterizando uma falha de projeto que custará caro para recuperar. 
, 
 
 
13 
 
 
Conclusão 
Neste bloco, você viu a definição de software e suas diferentes classificações. Software 
é um produto intangível. Não podemos tocá-lo, segurá-lo na mão. Você teve a 
oportunidade de entender como diferentes tipos de software vão precisar de 
diferentes ferramentas e técnicas para serem construídos. O processo de construção é 
complexo, demanda várias fases, e cada fase vai ter métodos próprios e características 
próprias, fazendo com que a disciplina da Engenharia de Software se torne muito 
importante nos dias de hoje, em que empregamos software em aparelhos domésticos, 
automóveis, educação, entretenimento; e muitas coisas que fazemos atualmente 
dependem muito dos softwares que utilizamos e da integração entre softwares 
diferentes. 
Vamos pensar um pouco no processo de compra pela Internet. Existe software que 
permite que a Internet exista. Existe software sendo executado no servidor da 
empresa de quem você está comprando. Existe o processamento do pagamento, que é 
via software. Depois a emissão dos documentos legais é feita por software. 
Finalmente, a entrega é controlada por software, estabelecendo até a melhor rota de 
entrega para o entregador. Se não existisse software, como seria esse processo? 
Antigamente, era muito difícil e demorado comprar qualquer coisa que não fosse 
numa loja física. 
O software permeia tudo o que fazemos. Está em todos os lugares e controla as 
operações mais fundamentais da vida cotidiana. Isso faz com que o desenvolvimento 
de software tenha se tornado uma tarefa complexa, com diversas implicações. Por 
isso, precisamos aplicar os conceitos da Engenharia na produção de software. 
A Engenharia de Software está definida através de organismos internacionais. A ISO, o 
IEEE e outros órgãos governamentais e associações profissionais produziram normas e 
conjuntos de conhecimento que definem o que é e como se faz para seguir os 
conceitos da Engenharia de Software. A Engenharia de Software cuida dos Requisitos, 
da Qualidade, da Construção, dos Testes e vários outros princípios importantes para 
, 
 
 
14 
 
garantir que o software atenda aos seus propósitos, definidos antes pela Arquitetura 
de Software, sem apresentar falhas e comportamentos indesejados, e que funcione 
por muito tempo, passando por procedimentos adequados de manutenção, de acordo 
com toda a documentação que foi produzida. 
 
 
REFERÊNCIAS 
[1] SOFTWARE . Dicionário online do Google. Disponível em: 
<https://bit.ly/39MDRhz>. Acesso em: 8 jan. 2020. 
[2] SOFTWARE. Michaelis DicionárioBrasileiro da Língua Portuguesa. Disponível em: 
<michaelis.uol.com.br>. Acesso em: 8 jan. 2020. 
[3] FERNANDES, Jorge Henrique Cabral. Qual a prática do desenvolvimento do 
software. Ciência e Cultura, 2003. Disponível em: 
<http://cienciaecultura.bvs.br/pdf/cic/v55n2/15526.pdf>. Acesso em: 8 jan. 2020. 
[4] PRESSMAN, Roger S; MAXIM, Bruce R. Engenharia de Software: uma abordagem 
profissional. 8. ed. Porto Alegre: AMGH, 2016. 
[5] MICROSOFT CORPORATION, SOFTWARE CATEGORIES. Microsoft TechNet (2010). 
Disponível em: 
<https://web.archive.org/web/20080921072543/http://technet.microsoft.com/en-
us/library/bb852143.aspx>. Acesso em: 25 nov. 2019. 
[6] INTERNATIONAL ORGANIZATION FOR STANDARDIZATION. ISO 24765 Systems and 
Software Engineering – Vocabulary. 2. ed. Genebra, 2017. 
[7] SOMMERVILLE, Ian. Software Engineering. 8. ed. Harlow, England: Pearson 
Education, 2007. 
[8] SOFTWARE ENGINEERING. Dicionário Merriam-Webster. Disponível em: 
<www.merriam-webster.com>. Acesso em: 25 nov. 2019. 
[9] INTERNATIONAL ORGANIZATION FOR STANDARDIZATION. ISO 42010 Systems and 
Software Engineering – Architecture Description. 1. ed. Genebra, 2007. 
 
http://cienciaecultura.bvs.br/pdf/cic/v55n2/15526.pdf
https://web.archive.org/web/20080921072543/http:/technet.microsoft.com/en-us/library/bb852143.aspx
https://web.archive.org/web/20080921072543/http:/technet.microsoft.com/en-us/library/bb852143.aspx
, 
 
 
15 
 
 
2 PROCESSO DE DESENVOLVIMENTO DE SOFTWARE 
Neste bloco, falaremos sobre o projeto de software e seu ciclo de vida, a construção 
do software, o processo de desenvolvimento de software, os testes de software e a 
manutenção de software. Vamos lá? 
 
2.1 Projeto de Software e Ciclo de Vida 
Bom, você já deve ter entendido como o cenário do desenvolvimento de software é 
complexo, e já tem uma ideia do que seja software e Engenharia de Software. Para 
uma iniciativa dar certo e se chegar ao produto de software desejado, com qualidade, 
e principalmente, que atenda as necessidades e expectativas dos usuários, é 
necessário estabelecer as bases do projeto e controlar as atividades necessárias, para 
que tudo seja de acordo com o especificado. 
Precisamos pensar o projeto como o termo em inglês “design”. Esse termo tem a ver 
com concepção, com definição de características básicas e importantes, que vão servir 
como definição e determinação de como o software deve se comportar e quais são as 
principais funcionalidades que o software precisa atender, servindo plenamente às 
necessidades dos usuários, com eficiência e com qualidade. Depois de documentarmos 
esse processo de concepção, precisamos definir os requisitos do software, as 
especificações do projeto e iremos ver a parte de requisitos em um bloco separado, 
devido à importância desse tópico para o desenvolvimento do software. 
Imagine a frustração de todos os envolvidos (stakeholders) num projeto de software 
quando ao final de meses de trabalho, o produto não atende o que foi especificado. É 
como se você comprasse uma bicicleta na caixa, e ao abrir, não tivesse os pedais. O 
que fazer? Retrabalho do software? Começar todo o processo de novo? E se houvesse 
requerimentos legais a serem cumpridos, como por exemplo, uma reforma tributária e 
o novo software estivesse calculando tudo errado? Quais as implicações? A empresa 
que não entrega seus impostos corretamente é considerada como atividade suspeita 
de sonegação. Haverá processos, multas e punições para seus dirigentes. Por isso, é 
importante entender o projeto como um todo, e a necessidade de organizar o trabalho 
, 
 
 
16 
 
a ser feito, dividindo as atividades em tarefas menores, distribuindo essas tarefas para 
cada pessoa envolvida, alocar os custos e definir os critérios de qualidade. 
Para gerenciar o projeto do software em si, podem ser usados os conhecimentos 
contidos no PMBOK, o Guia de Gerenciamento de Projetos do PMI (Project 
Management Institute). Esse corpo de conhecimentos contém uma compilação de 
várias melhoras práticas em gestão de projetos, que podem ser usados em conjunto 
com as práticas de Engenharia de Software. 
Gestão de projetos é uma das áreas de preocupação da Engenharia de Software. 
Afinal, os produtos precisam chegar a quem vai usar, o mais rápido possível, 
atendendo todos os requisitos e com um preço razoável. A área de Engenharia tem 
suas práticas de gestão de projetos. Aliás, o PMI nasceu com um grupo de engenheiros 
em 1969. Nesses mais de 50 anos, essa experiência foi sendo compilada. Quando a 
área de Tecnologia começou a adotar essas práticas, já compiladas, o PMBOK ficou 
popular rapidamente e o PMI se tornou a referência mundial em projetos. Assim 
sendo, para que inventar a roda quando ela já foi inventada? Vamos gerenciar projetos 
usando o PMBOK. 
O PMI recentemente fez acordo com a Agile Alliance e adotou a metodologia Scrum 
para gerenciar projetos de forma ágil. A partir da 6ª edição do PMBOK, o manual de 
práticas de Scrum passa a ser uma parte integrante dos conhecimentos em gestão de 
projetos, como uma alternativa que segue os padrões definidos no Manifesto Agile. 
Uma abordagem Agile não significa fazer as coisas sem controle e de forma 
descuidada. Pelo contrário, é uma forma de trabalhar mais ágil, voltada a entregar 
resultados rapidamente aos clientes e usuários, estabelecendo critérios de aceitação 
dos requisitos e de performance da equipe de programadores. Uma espécie de “jeito 
para colocar ordem na bagunça”. E tem se tornado a forma de trabalho mais comum 
nas equipes de criação de software. Scrum é uma forma de gerenciar projetos, 
excelente para projetos de software, na qual muitas vezes não sabemos exatamente o 
que precisa ser feito e novas necessidades vão aparecendo conforme o 
desenvolvimento acontece. 
, 
 
 
17 
 
O tripé da gestão de projetos é Prazo, Custo e Qualidade. Sempre que vamos pensar 
num projeto de software, não podemos nos esquecer dessas três coisas que interagem 
entre si sempre de forma mutuamente exclusiva. Isso significa que não é possível 
melhorar a qualidade sem aumentar o custo e/ou o prazo. Porque, para melhorar a 
qualidade, custará mais caro, se precisará de mais tempo. De forma semelhante, não 
se pode fazer mais barato sem perder qualidade e/ou prazo. Para que o software fique 
mais barato, contratam-se menos programadores ou programadores inexperientes. 
Isso significa que o software vai perder qualidade e/ou levar mais tempo para ficar 
pronto. Com o prazo é a mesma coisa. Para fazer mais rápido, são necessários mais 
programadores (custo) e pode haver perda de qualidade no produto de software que 
será entregue ao final. Compreender esse tripé é muito importante para entender 
como será um projeto de software. 
Outro conceito importante para ser compreendido é o ciclo de vida do software. 
Segundo a norma ISO 12207:2017 [1], ciclo de vida é a evolução de um sistema, 
produto, serviço, projeto ou outra entidade feita por humanos, desde a concepção até 
ser aposentada. Quando falamos do ciclo de vida do software, ainda a mesma norma 
diz que esse ciclo inclui várias fases. Uma fase de requisitos, uma fase de projeto ou 
design, a fase de implementação, a fase de testes e algumas vezes uma fase de 
instalação é necessária. Depois disso, o software entra na fase de operação, que é 
quando ele precisa de manutenção. 
Esse ciclo de vida pode ser mais longo ou mais curto em função de vários fatores. 
Imagine um videogame. É um mercado ávido por novidades. Assim, a tendência é o 
jogo ser aposentado mais cedo, substituído por um novo e normalmente melhorado. 
Por outro lado, um sistema que controle todas as reservas de uma companhia aérea 
tende a ser deixado em operação por muitos anos, sofrendo manutenção constante 
para que sempre funcione adequadamente e seguindo as novas tendências do 
mercado, como reservas online, confirmação por celular e outras funcionalidades. 
Novas funcionalidadespodem ser acrescentadas ao software, mas na essência é o 
mesmo software de anos atrás que passou por manutenção e renovação. 
, 
 
 
18 
 
Na Engenharia de Software, é importante notar que o desenvolvimento de um projeto 
inclui vários processos, seguindo o ciclo de vida: 
 Elicitação de Requisitos; 
 Análise dos Requisitos do Sistema; 
 Projeto Arquitetural do Sistema; 
 Análise dos Requisitos de Software; 
 Projeto de Software; 
 Construção do Software; 
 Teste do Software; 
 Integração do Sistema; 
 Teste do Sistema; 
 Instalação do Software; 
 Manutenção do Software e do Sistema. 
2.2 Construção do Software 
O termo construção do software se refere ao trabalho de criação do produto de 
software em si, através da combinação de codificação, verificação, teste unitário, teste 
integrado e correção do software [2]. Existem 5 princípios fundamentais relacionados 
à construção do software, sendo que os 4 primeiros são aplicados desde o projeto do 
Software. 
O primeiro princípio está ligado à incapacidade do ser humano em lidar com estruturas 
e informações complexas, especialmente por longos períodos de tempo. Esse fato 
influencia demais a construção de software e leva ao primeiro princípio, que é 
minimizar a complexidade [2]. 
Para conseguir minimizar a complexidade, é preferível implementar código simples e 
fácil de entender em vez de um código enxuto e mais “fácil” de escrever. Uma das 
grandes dificuldades da indústria de software tem sido a manutenção depois que o 
produto está em operação e é usado pelas pessoas. Qualquer alteração posterior, 
vamos dizer que poucos meses após a entrada em operação, exige que se consiga 
entender o que foi codificado antes. Isso já é difícil quando o próprio programador vai 
, 
 
 
19 
 
entender seu código. Imagine se outra equipe estiver responsável pela manutenção? É 
por isso que existem tantos paradigmas de programação e padronizações de técnicas 
de programação. Quanto mais fácil de entender o código, melhor. Mesmo se o código 
não ficar tão “elegante”, ou “técnico”, e às vezes, prefere-se perder eficiência. 
O segundo princípio é o de se antecipar à mudança. E está ligado com o primeiro. O 
software vai passar por mudanças ao longo do tempo, principalmente se estivermos 
falando de um software que tem vida longa, como um sistema integrado ou um 
software de CRM. A ideia por trás de antecipar a mudança é estender a vida útil do 
software, permitindo que se implementem melhorias sem afetar a estrutura principal 
[2]. 
Construir para verificação significa construir o software de forma que qualquer erro 
seja encontrado prontamente pelos engenheiros de software e pelos testadores e 
usuários, tanto durante a fase de testes, quanto na operação [2]. Para atingir esse 
terceiro princípio, são empregadas técnicas que permitam a automação de testes, a 
organização do código de forma a facilitar os testes e as auditorias, além do uso de 
padrões conhecidos e evitar as estruturas mais complexas das linguagens de 
programação, como foi mencionado anteriormente. 
O quarto princípio é o reúso. Reúso de código significa usar rotinas pré-programadas 
para fazer as tarefas básicas ao invés de se recriar as rotinas de código [2]. Por 
exemplo, a verificação de CPF. Sempre que se digita um CPF é feita uma validação para 
evitar que um código inválido tenha sido digitado. É um número de documento 
importante no Brasil, é um número longo e pode estar sujeito a erro pelos usuários. 
Então, existe uma rotina para verificar o CPF através dos dígitos finais. A ideia do reúso 
é usar sempre a mesma rotina para isso, chamando essa rotina sempre que necessário, 
em vez de reescrever esse código de programação todas as vezes. Se for necessário 
mudar alguma coisa, basta mudar uma rotina. Todo o software usa a mesma rotina, 
então está corrigido em todo o produto de software. Esse princípio pode ser usado 
para cadastros, endereços, números de telefone, senhas e uma série de rotinas 
comuns ao software como um todo. 
, 
 
 
20 
 
E finalmente, o quinto princípio é o de padronização da construção. Usar a mesma 
linguagem de programação em todo o projeto (ou um pequeno conjunto de 
linguagens), linguagens conhecidas no mercado, com facilidade de obtenção de 
especialistas no mercado, criar convenções de uso de nomes de arquivo e de variáveis, 
métodos e formas de comunicação e mensageria, ferramentas de programação e de 
modelagem (UML, por exemplo) e sempre se basear em padrões internacionalmente 
aceitos pelo mercado. Padrões de desenvolvimento na construção do software ajudam 
a atingir os objetivos de qualidade, eficiência e custo do projeto [2]. 
 
2.3 Processo de Desenvolvimento de Software 
Muito se fala de Usabilidade, UX (User eXperience) ou experiência do usuário. Tem 
estado “na moda” desde 2007. Contudo, muito antes já se falava em Ergonomia. São 
conceitos diferentes, mas todos fortemente interligados e tem a ver em como a pessoa 
que está usando um produto pode obter a melhor performance, com qualidade e 
eficiência. 
A altura da mesa, a posição do teclado, a distância da cadeira, a iluminação. Todas 
essas características fazem parte da Ergonomia. Quando falamos de software, ele 
também tem uma ergonomia. Para idiomas baseados no alfabeto latino, onde se lê da 
esquerda para a direita, os menus na tela deveriam ficar à esquerda. Observe os sites 
da Internet que você costuma navegar. A maioria tem o logo e o nome no canto 
superior esquerdo, porque é onde começamos a ler o website, o menu no topo, a 
barra de tarefas do lado esquerdo. Nesse ponto, estamos falando de Ergonomia. 
Usabilidade tem a ver com facilidade de aprendizagem, eficiência de uso, capacidade 
de memorização dos componentes, quantidade de erros cometidos e satisfação de 
utilização. A capacidade de um usuário específico em obter um resultado específico 
dentro de um contexto predeterminado [3]. Isso tudo está definido na norma ISO 
16982. 
Já a UX tem mais a ver com sentimento e percepção. A pessoa que está usando 
determinado software gostou da experiência? E está definido em outra norma da ISO, 
, 
 
 
21 
 
a ISSO 9241-210, que define UX como a percepção e a resposta que resultam do uso 
de um produto, sistema ou serviço [4]. 
Essas decisões são muito importantes na hora de construir o software porque afetam a 
maneira como as pessoas vão perceber o produto. Imagine alguém que tenha que ficar 
a maior parte do seu dia digitando numa tela com tons de vermelho. Com certeza em 
poucas horas sua vista estaria cansada, e consequentemente sua produtividade 
diminuiria, fazendo com que o software não fosse o mais eficiente que ele poderia ser; 
da mesma forma, um cadastro com muitos itens feito numa única tela com letras 
pequenas. O melhor é dividir o cadastro em duas ou mais telas, para facilitar a vida da 
pessoa que vai passar horas com essa tela aberta. 
Imagine outras situações, como falta de conexão para consultar o estoque, um jogo no 
qual todos os itens na tela sejam tons de cinza, menus não responsivos em telas de 
tamanho diferente. Já reparou que todos os teclados seguem um padrão? Isso não é 
por acaso. São definições pensadas durante a fase de design (projeto) do software e 
cuidadosamente implementadas e testadas na construção do software, seguindo as 
normas e boas práticas da Usabilidade, Interação Humano-Computador e UX. 
 
2.4 Testes de Software 
Teste de software consiste em uma verificação dinâmica em que um programa provê 
os comportamentos esperados num conjunto finito de casos de teste, devidamente 
selecionados de um domínio de execução usualmente infinito [2]. 
Difícil? Vamos ver os conceitos básicos dessa definição para entendermos exatamente 
do que estamos falando. Dinâmica significa que o teste vai depender sempre do 
estado em que o software está. Num determinado momento, os dados têm um 
determinado valor, mas no momento seguinteos valores podem mudar, definindo um 
estado diferente do software. 
Na definição, comportamento esperado significa que sabemos qual é a resposta 
desejada que queremos que o software forneça. Imagine a calculadora do seu celular. 
É um software cujo comportamento esperado nós sabemos. Digitamos números e as 
, 
 
 
22 
 
operações, e esperamos um resultado dessa operação matemática que desejamos. É o 
comportamento esperado de um software de calculadora. 
Agora, conjunto finito de testes significa que testamos o software dentro de 
determinados parâmetros. Imagine se fôssemos testar todos os parâmetros de uma 
calculadora. Poderíamos levar anos testando, mesmo os softwares mais simples. 
Somamos dois números simples, fáceis de conferir o resultado e esperamos que 
operações de soma mais complexas também estejam certas. Fazemos um número 
finito de testes de soma, subtração, multiplicação, divisão. Conferimos os resultados e 
avaliamos se o software acertou as operações e consideramos como testado. 
Finalmente, devidamente selecionado significa que escolhemos determinados 
conjuntos de valores para tentar simular um bom número de casos. Num cadastro de 
clientes, é muito comum os programadores cadastrarem a si próprios no sistema, para 
avaliar se os dados de endereço, telefone e números de documentos sejam 
corretamente armazenados. Mas é comum que os programadores se esqueçam de 
testar o cadastro de uma empresa, baseado em CNPJ e não no CPF, potencialmente 
deixando de avaliar a funcionalidade de cadastro num bom número de situações. 
Então, nos testes precisamos pensar quais são as situações desejadas, as mais 
esperadas e escolher um domínio de execução apropriado para a maior parte das 
situações. 
O teste de software tem diferentes objetivos e dependendo da complexidade do 
produto de software que estamos construindo, diversos testes podem ser necessários, 
o que toma bastante tempo da equipe de desenvolvimento. Vejamos alguns exemplos. 
Teste unitário é aquele que testa uma determinada funcionalidade ou componente do 
software. Em oposição ao teste integrado, em que se testam como o software se 
comporta interagindo com seus diferentes componentes. Um jogo não fica bom sem a 
música, ou com um pedaço da tela em branco. Há vários diferentes testes que 
devemos levar em consideração na construção do software. Teste de instalação, teste 
de segurança, teste de estresse, que tenta estabelecer se o software se comporta bem 
quando está sobrecarregado. Temos ainda teste de recuperação, que procura 
, 
 
 
23 
 
determinar se o software volta a funcionar adequadamente após um problema, como 
falta de energia no computador, por exemplo. Teste de performance, e teste da 
interface, quando pedimos ao usuário para que diga como foi a experiência da 
interação com o software. 
Também existem diferentes técnicas para teste de software. O teste exploratório tem 
ficado popular e consiste em se acompanhar o usuário enquanto ele navega pelo 
software, faz entrar dados, clica e usa o software. As dificuldades são registradas e 
passadas ao time de desenvolvimento. É uma boa técnica para teste de interface e 
usabilidade. 
A maioria dos testes é feita de forma “ad hoc”, ou seja, é o próprio desenvolvedor que 
testa o básico, seguindo sua experiência e intuição. É um teste relativamente 
ineficiente porque fica dependendo do entendimento do desenvolvedor. 
E finalmente vale a pena saber que há diferentes ferramentas de testes, que auxiliam 
em encontrar erros e comportamentos inesperados, com base nos parâmetros 
especificados. Nem sempre as ferramentas são eficientes, porque dependem se o 
código está preparado para testes automatizados e dependem da parametrização feita 
na ferramenta de teste. Entretanto, testes de performance e de estresse são bastante 
comuns com emprego de ferramentas para colocar o sistema sobrecarregado e medir 
tanto a performance quanto à capacidade de recuperação. 
2.5 Manutenção de Software 
Há uma quantidade grande de razões que levam o software a passar por manutenção. 
Corrigir falhas, melhorias de processo, baixa performance, atualização de plataforma 
tecnológica, fazer integração com outros softwares e até a segurança do software [2]. 
Existem três diferentes categorias de manutenção que precisamos considerar: a 
manutenção adaptativa, que ajusta o software a novas condições de operação e que 
normalmente advêm de fatores externos; as manutenções de aperfeiçoamento, que 
visam corrigir algum erro ou melhorar a eficiência do software ou da operação, que 
normalmente advém de fatores internos do próprio software; e as manutenções 
preventivas, que visam evitar que algum problema aconteça num futuro próximo. 
, 
 
 
24 
 
Ao contrário do que se acredita, manutenção não pode ser feita de forma rápida, sem 
controle ou planejamento. Alguns cuidados são necessários para que tudo ocorra de 
forma eficiente. O principal motivo é a possibilidade de uma manutenção numa 
determinada rotina do software, causar comportamentos inesperados em outra rotina 
do software. 
Sendo assim, é necessário implementar ferramentas e técnicas de controle na 
operação do dia a dia do software, para saber como o software está operando, se está 
tendo comportamentos fora do esperado, se está atendendo as especificações e um 
registro de problemas deve ser analisado. Também encontrar soluções para os 
problemas de forma que nada mais pare de funcionar é extremamente importante. 
Muitas vezes, é melhor gastar um tempo maior analisando uma falha do que sair 
mudando o software sem um planejamento adequado. 
Outra preocupação necessária é a documentação atualizada do software. Se for feita 
uma manutenção, mudando alguma rotina, é necessário documentar a mudança, 
como ela foi feita, qual o motivo, qual foi o erro ou comportamento inesperado que 
gerou a necessidade de mudança e muito importante, o código original, antes da 
mudança, precisa ser preservado. É importante documentar as diferentes versões de 
código. 
O software também precisa evoluir naturalmente. Algumas vezes, o usuário faz 
sugestões de melhoria, após o uso continuado do software. Outras vezes, o 
desenvolvedor percebe uma forma melhor de uma rotina ser executada, ou uma 
forma mais rápida de executar uma certa operação. Essas evoluções são muito comuns 
e necessárias e fazem parte do processo de manutenção. 
Ameaças externas ao software também podem exigir manutenção. Uma nova forma 
de ataque na segurança pode ser descoberta ou desenvolvida e para não 
comprometer a segurança das informações, uma manutenção pode ser obrigatória. 
Outra razão comum para desejarmos fazer manutenção é a performance. Logo que o 
software entra em operação, existem poucos dados, poucos usuários e a performance 
é bastante agradável para os usuários. Mas com o passar do tempo, pode ser 
, 
 
 
25 
 
necessário mudar algumas técnicas de programação que foram empregadas, por 
outras mais eficientes. Existem diferentes razões para isso, desde o volume de dados 
maior, até inovações ou mudanças na plataforma onde o software está instalado que 
passe a prejudicar a performance, obrigando uma manutenção para ajustar o software 
às novas condições da plataforma. 
Existem vários fatores que podem acontecer e que prejudicam a manutenção do 
software. Talvez a principal delas seja a falta de entendimento. Muitas vezes, o 
desenvolvedor do software pode não estar disponível na hora da manutenção e outro 
engenheiro de software precise assumir a tarefa. É necessário ter certeza que esse 
novo especialista compreenda o que o software faz, qual o comportamento desejado e 
qual o problema pelo qual o software está passando que impede que se chegue ao 
resultado desejado ANTES que a manutenção comece. Senão corre-se o risco de que o 
software deixe de atender as necessidades do usuário. 
É necessária muitas vezes uma análise de impacto, para determinaro que a rotina que 
entrará em manutenção faz, com quais rotinas ela se relaciona e quais os potenciais 
problemas podem acontecer. Situações podem acontecer de modo que a 
complexidade da manutenção, ou ainda a necessidade de testar de novo todas as 
funcionalidades, forcem o custo dessa manutenção para cima, precisando de uma 
análise maior, para determinar se não seria melhor retirar esse software e substituir 
por um novo. 
 
Conclusão 
Neste bloco, você pôde ver todo o processo de desenvolvimento do software, bem 
como seu ciclo de vida, desde a fase de projeto até a manutenção, que acontece 
depois que o software está em operação. Não necessariamente o software entra em 
operação completo. Apesar disso, ele tem um ciclo de vida próprio e bem definido, 
mesmo que em módulos. 
Foram apresentadas as principais considerações a respeito de um projeto de software, 
quais são as necessidades na hora de gerenciar o projeto, definir o que precisa ser 
, 
 
 
26 
 
feito e definir quais são os requisitos. Vimos também que requisitos são uma parte 
fundamental para a Engenharia de Software. 
Falamos sobre a construção do software em si, e dos 5 princípios que a construção do 
software deveria seguir. O princípio de reduzir a complexidade, o de antecipar a 
mudança, o princípio de construir para facilitar a verificação, o reúso de partes do 
código e a importância de se seguir os padrões da indústria e da empresa. 
Falamos da interface do usuário e de interação entre o homem e o computador. Como 
as questões de usabilidade e experiência do usuário são importantes e podem, 
inclusive, determinar o sucesso de um software, tanto em termos comerciais quanto 
em termos de qualidade. 
Em seguida, abordamos o teste de software. Outra fase bastante importante, que 
consome tempo e recursos da equipe de desenvolvimento e que não pode ser 
negligenciada como uma atividade sem importância. Falamos sobre os diferentes tipos 
de testes e as ferramentas e técnicas para obtermos maior taxa de sucesso. 
Finalmente, falamos também da manutenção de software, fase que acontece depois 
que o software entra em operação, suas características, os diferentes tipos de 
manutenção e abordamos os principais problemas e preocupações que devemos ter 
quando falamos em manutenção de software. 
O processo de desenvolvimento de software é importante para compreender a 
Engenharia de Software como um todo, a abrangência dos conhecimentos e das 
habilidades de um profissional dessa área e como cada parte do ciclo de vida afeta as 
demais e pode comprometer o produto de software que se pretende construir. 
 
REFERÊNCIAS 
 [1] INTERNATIONAL ORGANIZATION FOR STANDARDIZATION. ISO 12207:2017 
Systems and software engineering – Software life cycle processes. 3. ed. Genebra, 
2018. 
[2] BOURQUE, Pierre; FAIRLEY, Richard E. (ed.). SWEBOK – Software Engineering Base 
Of Knowledge. 3. ed. IEEE Computer Society, Piscataway, NJ, 2014. 
, 
 
 
27 
 
[3] INTERNATIONAL ORGANIZATION FOR STANDARDIZATION. ISO 16982 Ergonomics of 
human-system interaction — Usability methods supporting human-centred design. 
Genebra, 2002. 
[4] INTERNATIONAL ORGANIZATION FOR STANDARDIZATION. ISO 9241-100 
Ergonomics of human-system interaction. 2. ed. Genebra, 2006. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
, 
 
 
28 
 
 
3 ENGENHARIA DE SOFTWARE E MODELAGEM 
Apresentação 
Este bloco falará sobre modelagem. Modelagem de um software consiste em criar um 
modelo da situação real com o objetivo de ajudar a entender o problema, quando e 
como ele ocorre e propor uma solução. Modelos conceituais são configurados para 
refletir a situação real, com seus relacionamentos e dependências. A partir desse 
modelo é que se pode especificar o que será necessário fazer, estabelecendo os 
objetivos de cada requisito, para criar um software com qualidade. 
Entender as principais ferramentas e técnicas de modelagem permite ao Engenheiro 
de Software ter uma visão geral de como o software precisa funcionar, quando e como 
acontece a comunicação do software com outras entidades, sejam pessoas ou outros 
softwares. Também se consegue uma ideia clara das dificuldades e do tamanho do 
esforço necessário para a construção do software, melhorando a qualidade do produto 
final e a qualidade do projeto. 
3.1 Modelagem de Software 
A modelagem de software está cada vez mais disseminada na cultura da criação de 
software e é uma técnica para ajudar engenheiros de software entender, engenheirar 
(aplicar os conceitos de engenharia) e comunicar aspectos do software para os 
stakeholders. Stakeholders são todas as entidades (pessoas, empresas, departamentos 
etc.) que possuem algum interesse no software, como por exemplo, os usuários, os 
desenvolvedores, o presidente da empresa, a área de Tecnologia da empresa e outros. 
[1] 
A modelagem provê uma abordagem sistemática e organizada que permite 
representar aspectos significantes do software em estudo, facilitando as decisões 
sobre o software, ou elementos dele, e comunicar essas decisões e sua importância 
para todas as partes envolvidas [1]. 
Existem muitas técnicas e formas de fazer, tanto no ambiente acadêmico quanto na 
prática. Isso tem sido uma dificuldade para a área de Engenharia de Software por 
, 
 
 
29 
 
décadas, mas alguns princípios são comuns a essas várias ferramentas e técnicas. 
Também se está padronizando e alguns modelos têm se tornado mais comuns e 
conquistado vários seguidores. Vamos começar com os três princípios básicos: 
1. Modele o essencial sobre o software. Aqueles aspectos que precisam de uma 
resposta específica, abstraindo os aspectos que não sejam essenciais. Bons modelos, 
os mais úteis e significativos, são aqueles que não consideram todos os detalhes do 
que o software vai fazer. 
2. Forneça perspectiva ao software em estudo. Diferentes visões sobre o software sob 
diferentes pontos de vista fornecem dimensionalidade ao modelo. Por exemplo, criar 
uma visão estrutural, uma visão comportamental, uma visão organizacional, uma visão 
temporal e outras visões que forem necessárias, pode criar um foco relevante para a 
construção do entendimento do problema e facilitar a tomada de decisão sobre a 
solução desse problema. 
3. Estabeleça uma comunicação efetiva pensando nas pessoas. A modelagem usa um 
vocabulário do software, uma linguagem de modelagem e expressões semânticas que 
são próprias do projeto. As palavras e seu significado dentro de um contexto, quando 
usadas regularmente e sistematicamente no projeto do software, criam uma facilidade 
de entendimento para todos os envolvidos. Essa facilidade de entendimento aumenta 
a efetividade da comunicação, evitando mal-entendimentos e confusão a respeito do 
software objeto de estudo. 
Um modelo é uma abstração, ou seja, uma simplificação de um componente de 
software. Uma consequência do uso de abstrações é que nenhuma sozinha representa 
muito bem aquele componente. O modelo do software passa a ser, então, um 
conjunto de diferentes abstrações que quando olhadas em conjunto traduzem um 
aspecto, perspectivas e visões selecionados, necessários para tomar uma decisão bem 
informada sobre a melhor solução para o problema sendo analisado [1]. 
As propriedades de um bom modelo incluem: Completude, ou seja, abordam todos os 
aspectos que se deseja contemplar no software; Consistência, que é a ausência de 
conflito entre os requisitos e demais componentes do modelo; e também Correção, 
, 
 
 
30 
 
definida como estando o modelo livre de defeitos e satisfazendo os requisitos 
definidos no modelo. 
Os principais elementos encontrados em modelos são as Entidades, usadas para 
representar os artefatos concretos, sejam processadores, robôs, outros softwares ou 
protocolos de comunicação. As entidades precisam se conectar, trocar informação e se 
comunicar. Para isso, representamos através do elemento Relacionamento. Essesdois 
elementos não são os únicos, mas são comuns na maioria dos modelos usados no 
mercado, eventualmente com alguma variação. 
3.2 Tipos e Análise de Modelos 
Como vimos, um bom modelo é uma agregação de submodelos. Cada um desses 
submodelos é uma descrição parcial e foi criado para um propósito específico, para dar 
uma dimensão sobre o software. A UML (Unified Modeling Language) reconhece uma 
rica coleção desses modelos e diferentes abstrações, e apresenta na forma de 
diagramas. Existem vários na UML que são agrupados de acordo com 3 grandes tipos: 
modelagem de Informação, modelagem de comportamento e modelagem de 
estrutura. 
3.2.1 Modelagem de Informação 
Modelos de informação têm foco principal nos dados e na informação. Apresentam 
uma representação que identifica e define um conjunto de conceitos, propriedades, 
relações e restrições para as entidades de dados [1]. A abstração de dados serve para 
conceituar uma visão dos dados no mundo real e como serão empregados. Esses 
modelos vão dar origem aos modelos de dados conceituais e físicos que serão 
implementados no software e para construção do Banco de Dados. 
3.2.2 Modelagem de Comportamento 
Modelagem Comportamental identifica e define as funções do software sendo 
modelado [1]. Funções do software ou funcionalidade refere-se àquilo que esperamos 
que o software faça. Tem a ver com atender as necessidades dos usuários e demais 
stakeholders. Imagine o aplicativo de calculadora do seu celular. Qual é o 
comportamento esperado? Que abram na tela os botões para você clicar e fazer 
, 
 
 
31 
 
contas corretamente como as antigas calculadoras físicas? Existem modelos para 
descrever esses comportamentos esperados. O exemplo a seguir é bem simples, você 
provavelmente deve conhecer ou talvez seja fácil de experimentar, mas imagine um 
software que precise emitir a NFe (Nota Fiscal Eletrônica). Nota Fiscal depende de 
várias coisas. Acesso ao estoque, cálculos de impostos, acesso ao sistema do governo 
que valida a NFe, acesso a meio de pagamento (banco ou cartão de crédito) e mais. 
3.2.3 Modelagem de Estrutura 
Modelagem Estrutural ilustra a composição física ou lógica do software sendo 
modelado a partir de seus vários componentes. Essa modelagem serve para identificar 
os vários componentes do software e sua interação com o ambiente no qual o 
software vai operar [1]. Esses diagramas dizem onde ficarão quais componentes. No 
exemplo da NFe, uma parte do software vai precisar de acesso à Internet para trocar 
dados com o banco. Outra parte vai verificar se há os produtos no estoque. Outra 
acessará o cadastro do cliente. Serão necessários diagramas e modelos para entender 
como esses diferentes componentes interagem entre eles e com as entidades externas 
ao software. A UML provê vários diagramas que auxiliam nesse tipo de modelagem 
também: Diagramas como Diagrama de Classe, Diagrama de Objeto, Diagrama de 
Componente etc. 
O desenvolvimento de modelos permite ao Engenheiro de Software uma oportunidade 
para estudar, raciocinar a respeito e entender a estrutura, função, uso operacional e 
considerar aspectos da montagem do software. A análise desses modelos tem que 
garantir que eles estejam completos, consistentes e corretos [1]. 
Existem ferramentas para analisar o grau de completude do software, a partir das 
conexões dos modelos e verificar que estejam vindo e indo para onde devem, além de 
verificar que todos os componentes estejam ligados uns aos outros. E também podem 
ser verificados manualmente, através de uma técnica de revisão e inspeção. 
Também é feita uma análise manual ou automática buscando inconsistências, como 
descrições conflitantes, nomes duplicados ou que estejam faltando. Como na análise 
, 
 
 
32 
 
de completude, a Análise de Consistência pode gerar ações corretivas e algum 
retrabalho. 
A terceira análise, a de Correção, pode ser feita por alguma ferramenta eletrônica ou 
manualmente, e busca erros na modelagem. Existe uma gramática e uma simbologia 
que precisam ser seguidas em cada padrão de modelagem. Na UML, por exemplo, 
existe um símbolo para Repositório de Dados diferente do símbolo para Função de 
Programação. Usar o símbolo errado pode gerar um entendimento completamente 
diferente do que se espera do software, perdendo qualidade, tempo e provocando 
retrabalho nas fases adiantadas do desenvolvimento, o que aumenta o custo de se 
refazer aquela funcionalidade. 
É necessário manter também a Rastreabilidade das diferentes versões e documentos 
da modelagem. Imagine que se uma alteração é feita num determinado modelo, essa 
mudança precisa estar refletida nos demais modelos. Como falamos antes, os modelos 
oferecem diferentes visões do mesmo software. Quando mudamos uma visão, 
podemos precisar mudar outras visões relacionadas àquele componente ou 
funcionalidade. 
Nenhuma análise estaria completa sem analisarmos também as interações entre as 
diferentes entidades e o software, buscando saber como o software vai se comportar 
com o sistema operacional do computador ou computadores, com os softwares de 
gerenciamento de banco de dados, com outros softwares e módulos de software e 
ainda em alguns casos, com elementos da segurança de informação, como antivírus e 
firewalls. 
3.3 UML e DFD 
UML é a sigla para Unified Modeling Language. Diferente de uma linguagem de 
computador, a UML é uma linguagem visual para visualizar, projetar e construir 
software, além de ser capaz de modelar processos de negócio. UML é um padrão de 
como construir diagramas, que modelam diferentes aspectos do software e o 
comportamento que o software precisa apresentar em determinadas situações. 
, 
 
 
33 
 
A primeira versão da UML já tem 20 anos e podemos dizer que é um padrão aceito 
internacionalmente, mantido e controlado pela OMG (Object Management Group), um 
consórcio que reúne empresas, acadêmicos, universidades, profissionais e entidades 
com o objetivo de criar e manter padrões para a indústria de tecnologia como um todo 
e acabou ficando encarregado de vários padrões. Além da UML, também mantém o 
padrão BPM para processos de negócio, CISQ para qualidade do software e até mais 
recentemente, o IoT Consortium que fala de Internet das Coisas [2]. 
Assim, a UML consiste numa série de diagramas que podem modelar o software de 
diferentes visões, como Modelagem Comportamental, Modelagem Estrutural e 
Modelagem de Informação. 
 
Fonte: OBJECT MANAGEMENT GROUP – OMG® Unified Modeling Language – Versão 2.5 [3] 
Figura 3.1−Diagramas e divisões (Structure Diagram = diagrama de estrutura, Behavior 
Diagram – diagrama de comportamento). 
Como podemos ver na Figura 3.1, são 14 diagramas em 3 divisões. A lista de diagramas 
(traduções) é: Diagrama de Atividades, Diagrama de Classes, Diagrama de 
Comunicação, Diagrama de Componentes, Diagrama de Composição de Estrutura, 
Diagrama de Entregas, Diagrama Geral de Interações, Diagrama de Objetos, Diagrama 
, 
 
 
34 
 
de Pacotes, Diagrama de Perfis, Diagramas de Estado de Máquina, Diagrama de 
Sequência, Diagrama de Tempo e Diagrama de Caso de Uso. 
Não é nosso objetivo aqui estudar a UML toda, mas alguns diagramas são 
interessantes para entender a prática da modelagem, parte importante da Engenharia 
de Software. 
Um diagrama de Caso de Uso vai dizer quem são os atores e que relacionamentos eles 
têm com quais atividades do sistema. Não é o caso de entrar em detalhes sobre como 
funciona cada uma das atividades que o sistema irá executar. Esse detalhamento será 
feito através do Diagrama de Atividades. O caso de uso serve para avaliarmos apenas 
quem são as pessoas que usariam o sistema e o que elas gostariam que o sistema 
fizesse. É uma espécie de entendimento de alto nível, uma visão de como o sistema 
precisará se comportar para cada tipo de usuário. Usamos uma simbologia própria 
para identificar os Atores (bonecos), as Atividades (ovais) e osRelacionamentos 
(linhas). O que seriam atividades agrupadas dentro do software fica dentro de um 
retângulo. O interessante aqui é que qualquer Engenheiro de Software sabe 
reconhecer o Diagrama e sabe interpretar seu significado [3]. 
 
Fonte: adaptado de https://sg.com.mx/revista/27/papel-analista-programador 
Figura 3.2 – Representações de atores, atividades e relacionamentos. 
https://sg.com.mx/revista/27/papel-analista-programador
, 
 
 
35 
 
Vamos imaginar um aplicativo simples para que um profissional possa criar um perfil, 
concorrer a uma vaga e que o recrutador possa procurar candidatos a emprego no 
mesmo aplicativo. Representaríamos os atores Profissional e Recrutador como 
bonecos, interagindo com diferentes atividades, que estão encapsuladas dentro de um 
objeto de software, o aplicativo sendo modelado. 
Com base nesse diagrama de Caso de Uso, seriam construídos 3 diagramas de 
atividade: Administrar Perfil, onde o candidato Profissional preencheria suas 
informações; Buscar candidatos, que é usado pelo Recrutador, seria outra atividade e 
teria seu próprio diagrama; e finalmente haveria outro diagrama de atividades para 
Aplicar para vaga, que também seria usado pelo Profissional. 
Já DFD (Data Flow Diagram ou Diagrama de Fluxo de Dados) é outra forma de 
representação de alto nível que foca nos dados e não na interação das pessoas. Não 
faz parte da UML, sendo outra técnica de modelagem, mais antiga (vem sendo usada 
desde a década de 1970), que pode modelar bem uma funcionalidade qualquer do 
software. Um modelo gráfico pode explicar algumas coisas melhor do que palavras. 
Como são fáceis de compreender pelo público técnico e não técnico, ainda são usados 
mesmo depois de tanto tempo. 
Um DFD representa Entidades, Fluxo dos Dados, Processos e Repositórios de dados. 
Um DFD pode ter vários níveis, cada nível detalhando mais cada processo. Mesmo 
assim, não é suficiente para mapear toda a complexidade do software, mas é um 
excelente ponto de partida para a criação de outros modelos, inclusive os diagramas 
propostos na UML [5]. 
Fonte: o autor 
Figura 3.3 – Exemplo de DFD nível 0. 
, 
 
 
36 
 
 
Na Figura 3.3, temos um DFD nível 0 sobre o mesmo exemplo dado antes: um 
Profissional que quer se cadastrar num aplicativo e o Recrutador procurando 
candidatos. Podemos ver que tipo de dados o Profissional precisa informar. Quando 
“descermos” um nível, é detalhado quais dados pessoais devem ser informados e 
como seria o processo para conferir esses dados (verificação do dígito do CPF, apenas 
números no CEP etc.) e que dados sobre as vagas ele receberia. Outro DFD de nível 1 
poderia ser feito para descrever o processo do Recrutador e os dados de candidato 
que ele receberia, só para ficar mais claro. 
 
3.4 Metodologias Ágeis 
Os métodos ágeis nasceram a partir do final dos anos 1990, quando metodologias mais 
leves começaram a ser propostas, tanto para a modelagem quanto para o 
gerenciamento dos processos de software, porque os desenvolvedores estavam 
usando muitas metodologias pesadas e com intensivo trabalho de documentação, 
sobrando menos tempo para a atividade de programação em si [1]. Na nossa opinião, 
surgiram porque fazer documentação é uma tarefa que dá trabalho mesmo, exige 
atenção e cuidado. O desenvolvedor prefere as atividades de programação e 
codificação, que oferecem um nível de desafio bem maior, sendo por isso mais 
“divertidas” do que ficar escrevendo documentos. Desenhar os modelos é desafiador, 
até mais do que a programação em si, já que a solução do problema tem que ser 
pensada e analisada antes de ser codificada para a máquina. 
RAD (Rapid-Application Development) é uma técnica que foca mais numa abordagem 
de processo adaptativo e menos em planejamento. Frequentemente, são empregados 
protótipos ao invés de especificações e modelagem [1]. Dependem de se ter uma boa 
ferramenta de software para a construção dos protótipos e adaptação e controle dos 
erros e ajustes necessários. Imagine o risco de você construir uma casa e depois que a 
casa estiver pronta e com gente morando, ter que aumentar o tamanho dos quartos? 
Por isso, metodologia ágil não pode ser sinônimo de falta de planejamento. No lugar 
da especificação e da modelagem, o protótipo tem que ser feito com cuidado e 
, 
 
 
37 
 
discutido com os stakeholders. Assim, se consegue mais detalhes sobre o que o 
software precisa fazer e quais são as necessidades fundamentais, que diminuem muito 
as chances de erros grosseiros comprometerem o produto de software sendo 
desenvolvido. 
XP (eXtreme Programming) utiliza de outro artefato para substituir a modelagem. Usa 
histórias ou cenários no lugar da modelagem e da especificação. Os usuários passam a 
fazer parte da equipe de desenvolvedores criando os cenários de teste e as situações 
em que o software vai ser usado desde os estágios iniciais do desenvolvimento, sendo 
uma metodologia bastante interativa. 
Scrum é um procedimento mais amigável para gerenciar o projeto como um todo. É a 
reunião dos jogadores de Rúgbi ou Futebol Americano antes de fazerem uma jogada. A 
metodologia tem esse nome porque a equipe se reúne todos os dias, por 15 minutos, 
antes de começarem suas atividades diárias. É criado um Backlog (registro completo) 
de todas as tarefas que precisam ser feitas e ciclos de 2 a 4 semanas são feitos para 
produzirem alguns itens do backlog. Esses ciclos, que são chamados Sprints (corridas 
ou campanhas, como as jogadas do rúgbi), produzem uma parte das funcionalidades, 
que são então testadas pelos usuários e liberadas. Um novo Sprint é então priorizado 
com mais itens do backlog, até que todas as tarefas estejam completas e o software 
aprovado e testado pelos usuários. 
Outra metodologia ágil comum no mercado é a FDD (Feature-Driven Development), 
que significa uma abordagem direcionada para as funcionalidades. São trabalhadas 5 
fases: 
1) Desenvolver um modelo do produto; 
2) Criar a lista de funcionalidades e tarefas; 
3) Construir o plano de implementação; 
4) Desenvolver as funcionalidades de integração e interface com as pessoas; 
5) Codificar e testar de forma integrada o software. 
É uma abordagem que se parece com XP ao criar cenários, mas ao contrário das 
metodologias incrementais que vão detectando falhas e refazendo ao longo do 
, 
 
 
38 
 
processo de desenvolvimento, essa metodologia foca em criar um modelo correto da 
primeira vez e evitar retrabalho e várias interações [1]. 
3.5 Aspectos Humanos e Profissionais 
Além da importância de se pensar no usuário e que tipo de interface o usuário vai ter, 
o dispositivo computacional que ele vai usar e coisas assim, temos que pensar em 
alguns outros aspectos humanos. Fazemos software para pessoas usarem. A tecnologia 
existe para facilitar a vida das pessoas. 
O Engenheiro de Software ou o Desenvolvedor precisa se relacionar com os demais 
stakeholders e obter deles as informações necessárias para a criação de bons modelos, 
aperfeiçoar os requisitos e testar os softwares para que funcionem corretamente. 
Precisamos pensar que o Desenvolvedor e principalmente o Engenheiro de Software 
não deveriam ser focados só em aspectos técnicos e de programação de 
computadores. É necessário desenvolver habilidades ligadas com Pensamento 
Analítico e Solução de Problemas. É necessário assimilar vários tipos de informações 
rapidamente (diagramas, preocupações de stakeholders, feedback de usuários, 
esquemas e planilhas), identificar quais são mais relevantes, apresentar soluções e 
escolhas aos stakeholders as quais ofereçam valor, que sejam apropriadas ao problema 
em questão, resolvam de forma rápida e apresentem ideias complexas de forma 
simplificada. Essa habilidade de Pensamento Analítico e Solução de Problemas é 
composta por pensamento criativo, aprendizagem, tomada de decisão, pensamento 
conceitual e sistêmico [6]. 
Todas são habilidades quepodem ser aprendidas e que melhoram com a experiência e 
a prática. Acho que se você compreende como você aprende melhor, se de forma 
visual, escutando ou lendo, vai desenvolver as suas habilidades rapidamente. 
Também são esperadas características comportamentais do Engenheiro de Software. 
Ética, adaptabilidade, organização, gerenciamento do tempo e ser sempre aquela 
pessoa com quem se pode contar [6]. Essas também são características que melhoram 
com a experiência. 
, 
 
 
39 
 
Seja parceiro dos stakeholders. Aprenda com eles como funcionam o negócio e a 
empresa. Então, quando for criar um software, você já sabe como o negócio opera e 
terá ideias e conceitos do que o software poderá fazer, de forma eficiente. O mesmo 
se aplica para qualquer software. Um jogo de tiro em primeira pessoa tem objetivos e 
jogadores bem diferentes de um RPG, por exemplo. 
Saiba ouvir. Habilidades de comunicação são fundamentais para entender os 
problemas dos stakeholders, mas mais do que comunicar suas soluções de forma clara, 
saber ouvir e entender as preocupações e desejos dos seus usuários é o que fará você 
desenvolver aquela funcionalidade “matadora”, que atende o necessário de forma 
eficiente. Essa é uma habilidade que não é ensinada em lugar nenhum, mas que você 
consegue melhorar e desenvolver sozinho. Lembre-se de que comunicação pode ser 
verbal e não verbal. 
Uma forma efetiva de comunicação consiste em adaptar os estilos e as técnicas para a 
sua audiência, para quem pretende enviar a mensagem. O tom de voz, a linguagem 
corporal, as palavras usadas. E na comunicação escrita ou gráfica, como nos modelos 
também [6]. Pense em quem será sua audiência e como ela gostaria de receber sua 
mensagem. 
 
Conclusão 
Neste bloco, foram abordados os principais tópicos da análise que a Engenharia de 
Software faz para a construção do software. E não chegamos a falar em especificações 
e requisitos ainda. A codificação é uma etapa posterior. Sem entendermos exatamente 
qual a tarefa e o tamanho do esforço antes mesmo de começarmos, não é possível 
estarmos preparados para resolver a situação e entregar um software funcional. 
Falamos da modelagem de software, das técnicas de modelagem, dos diferentes tipos 
de modelo existentes, apresentamos ferramentas de modelagem e técnicas ágeis, 
voltadas a facilitar o desenvolvimento do software e acelerar o processo. Também 
consideramos os aspectos humanos que o profissional de Engenharia de Software 
precisa desenvolver. 
, 
 
 
40 
 
Vimos que um bom modelo precisa ser completo, consistente e correto. Exploramos 
algumas técnicas para obter a completude do modelo, como a revisão e a inspeção, 
que também podem ser aplicadas à consistência do modelo, em que algumas 
ferramentas de software ajudam a encontrar os erros, e vimos que é necessário seguir 
um padrão para que o modelo seja corretamente compreendido por toda a equipe de 
desenvolvimento. 
Falamos das análises dos modelos, de como a rastreabilidade é importante para 
sabermos o que foi alterado, quem pediu a alteração e quando. E também vimos que 
analisar o ambiente do software, que interações ele terá com outros softwares, em 
que momentos e como se darão as interações é fundamental para determinarmos o 
bom comportamento do software e ajudarmos a manter a segurança das informações. 
Conhecemos a importância das diferentes visões que a modelagem propicia, como a 
Modelagem Comportamental, a Modelagem Estrutural e a Modelagem da Informação. 
Modelos diferentes que se integram e criam visões diferentes sobre o mesmo projeto, 
o mesmo produto de software. 
Quando olhamos para duas técnicas de modelagem, o DFD e a UML, vimos pequenos 
exemplos de como a modelagem é criada e como manter o padrão tão necessário para 
que a equipe saiba o que está sendo feito. DFD é uma técnica antiga, mas ainda usada 
pela simplicidade e efetividade ao comunicar conceitos complexos para os 
stakeholders não técnicos. Vimos um exemplo da UML e como as diferentes visões 
propostas são atendidas por essa técnica. 
Conhecemos 4 abordagens chamadas ágeis porque procuram usar menos tempo nos 
processos documentais e mais tempo nos processos mais ligados ao desenvolvimento 
em si, codificação e testes. RAD, XP, Scrum e FDD são metodologias diferentes, mas 
com o mesmo foco, que é colocar o software mais cedo em funcionamento, seguindo 
uma abordagem incremental, em que partes do software ficam prontas e começam a 
ser usadas mesmo antes de o todo estar completo. 
Elencamos os aspectos humanos do profissional de Engenharia de Software e algumas 
habilidades necessárias, que podem muito bem ser desenvolvidas e aprendidas e que 
, 
 
 
41 
 
melhoram com a experiência e a prática. Entre as habilidades, são importantes o 
pensamento analítico, a solução de problemas e a comunicação, fundamental para o 
trabalho com software, já que se está em contato com diferentes stakeholders durante 
todo o processo. 
 
REFERÊNCIAS 
[1] BOURQUE, Pierre; FAIRLEY, Richard E. (ed.). SWEBOK – Software Engineering Base 
of Knowledge. 3. ed. IEEE Computer Society, Piscataway, NJ, 2014. 
[2] OBJECT MANAGEMENT GROUP. About us. Disponível em: <http://www.omg.org>. 
Acesso em: 15 jan. 2020. 
[3] OBJECT MANAGEMENT GROUP – OMG®. Unified Modeling Language – Versão 2.5. 
Dez. 2017. Disponível em: <http://www.omg.org>. Acesso em: 15 jan. 2020. 
[4] RANGEL, Ricardo. Entre lo estático y lo dinámico: el papel del analista y del 
programador. Disponível em: <https://sg.com.mx/revista/27/papel-analista-
programador>. Acesso em: 14 jan. 2020. 
[5] LUCIDCHART. What is a Data Flow Diagram. Disponível em: 
<https://www.lucidchart.com/pages/data-flow-diagram>. Acesso em: 15 jan. 2020. 
[6] INTERNATIONAL INSTITUTE OF BUSINESS ANALYSIS. BABOK Guide to Business 
Analysis Base of Knowledge. 3. ed. Ontario, Canada: IIBA, 2015. 
 
 
 
 
 
 
 
 
http://www.omg.org/
http://www.omg.org/
https://sg.com.mx/revista/27/papel-analista-programador%3e.%20Acesso%20em:%2014%20jan.%202020
https://sg.com.mx/revista/27/papel-analista-programador%3e.%20Acesso%20em:%2014%20jan.%202020
, 
 
 
42 
 
 
4 REQUISITOS DE SOFTWARE 
 
Apresentação 
Neste bloco, vamos ver a importância de uma boa especificação de requisitos para o 
desenvolvimento do software. Junto da modelagem, onde entendemos o problema e 
visualizamos a solução, precisamos especificar o que deverá ser entregue para os 
programadores para que possam então codificar, ou seja, transformar nossas soluções 
em código de máquina, o software propriamente dito. Para que isso aconteça de 
acordo com o planejado, precisamos seguir os passos da modelagem, analisar, 
especificar e validar os requisitos para termos certeza de que o modelo realmente 
representa a realidade. A principal diferença é o nível de detalhamento que a 
especificação tem que trazer. Normalmente, os programadores são especializados em 
código e linguagens de programação e não conhecem as regras de negócio. É um 
conjunto diferente de habilidades. A situação fica ainda mais delicada quando 
precisamos dar manutenção a um software existente. Incluir novos requisitos, alterar 
partes do software existentes que precisam ser mudadas, seja porque há novos 
requerimentos legais, ou seja, porque há novas regras de negócio, é uma tarefa que 
precisa de bem mais detalhamento para que as mudanças que queremos implementar 
não afetem outras partes do código que não queremos mexer. 
 
4.1 Fundamentos de Requisitos 
O termo “engenharia de requisitos” é amplamente usado no mercado para mostrar o 
tratamento e a importância dessa área da Engenharia de Software. Algumas vezes, um 
Engenheiro de Software se torna especialista em requisitos e, outras vezes, é 
necessário um Engenheiro de Software experiente para que a construção dos 
requisitos seja feita de forma adequada. Imagine que um software pode levar vários 
meses para ficar pronto e se os requisitosnão forem bem especificados no início, após 
todo esse tempo e todos esses gastos, o resultado pode ser insatisfatório ou até 
desastroso. 
, 
 
 
43 
 
Requisitos de software expressam as necessidades e restrições colocadas em um 
produto de software que contribuem para a solução de algum problema da vida real 
[1]. Pode ser desde a automação de uma tarefa feita num processo de negócios, 
integração entre processos de negócio, como pagamento por cartão, até a operação 
de um dispositivo ou máquina, só para exemplificar os tipos de coisas da vida real onde 
pode ser empregado um software. Se um software for empregado, é necessário que se 
diga quais são os requisitos para que a operação do software seja considerada bem-
sucedida. 
O modo como as pessoas trabalham, como os processos de negócio acontecem e 
como os dispositivos funcionam podem ser bastante complexos, e por extensão, os 
requisitos também podem ser bem complexos. Por isso, pode ser necessário o 
envolvimento de várias pessoas, em diferentes áreas da empresa, com conjuntos de 
habilidades diferentes e vários níveis diferentes de especialização. Imagine um 
software que vai fazer triangulação fiscal, no qual um produto é comprado pela 
Internet em um estado, para ser pago por outra pessoa em outro estado e deverá ser 
entregue ainda em outro estado. A emissão da NFe, a apuração dos impostos e os 
registros bancários para cobrança e a contabilização de toda a operação podem gerar 
muitos requisitos para o software. Um robô soldador que precisa montar o chassi de 
um veículo na linha de montagem pode ter requisitos mais complexos se ele for 
responsável por verificar se o material está adequado, na posição certa, virar a peça ou 
peças para a montagem, e ainda a verificação de qualidade para procurar rachaduras 
depois de montado o chassi. 
Também temos que entender que existem vários tipos de requisitos. Requisitos de 
processo, de produto, de performance, de qualidade. Eles podem ser agrupados em 
duas categorias principais: os requisitos funcionais e os requisitos não funcionais. 
Requisitos funcionais descrevem as funções que o software precisa executar e são 
chamados também de funcionalidades ou capacidades [1]. Requisitos não funcionais 
são aqueles que agem para restringir ou limitar a solução, e podem ser chamados de 
restrições, ou às vezes, de requisitos de qualidade [1], como por exemplo, quando 
, 
 
 
44 
 
especificamos que uma transação de pagamento por cartão tem que executar em até 
30 segundos. Esse tipo de requisito impõe um limite para o software cumprir. 
O processo para trabalhar com requisitos envolve o planejamento de como vamos 
lidar com eles naquele projeto em particular. Cada projeto de software tem 
características únicas e as atividades de elicitação, análise, especificação, validação e 
testes devem ser projetadas de acordo com as especificidades de cada projeto. Além 
disso, precisamos entender o papel que as diferentes pessoas irão exercer no projeto. 
Temos que lidar com os usuários, que irão dizer quais são os problemas que eles têm e 
que necessitam de uma solução. Às vezes, os usuários são máquinas e precisamos 
entender como elas precisam interagir com o software que estamos criando. Há ainda 
os clientes, que são os que encomendaram o produto e não necessariamente vão 
operar o software, como os usuários. Também no projeto, teremos os Engenheiros de 
Software, Gerentes de Projeto, Programadores e outras pessoas exercendo as funções 
técnicas. Muitas vezes, as funções técnicas entram em conflito com as funções de 
negócio. O programador ou o engenheiro podem querer aproveitar uma 
funcionalidade criada antes em outro produto (reúso de componentes) e o cliente ou 
usuário querem um novo cadastro. É papel do Engenheiro de Software pesar o que é 
mais vantajoso para o projeto como um todo. 
4.2 Elicitação de Requisitos 
Elicitação de requisitos tem a ver com as origens dos requisitos de software e como o 
engenheiro de software pode capturar esses requisitos [1]. Elicitar significa “fazer 
aparecer”. Esse é o primeiro estágio no entendimento do problema, e é 
essencialmente uma atividade humana, porque envolve muita comunicação. Significa 
estabelecer o relacionamento entre a equipe de desenvolvimento de software e a 
equipe do cliente, junto aos usuários. Se esse relacionamento não funcionar, não se 
consegue resolver o problema através de um software. Como exemplo, um problema 
vivido em equipe de desenvolvimento, relacionado aos impostos no Brasil, que são 
complicados. Após reunião com uma usuária, a equipe acreditava que não seria tão 
complicado. Com o tempo, ao se fazer o levantamento de requisitos, foi descoberto 
que só 30% dos impostos estavam sendo contemplados. Ao se verificar com a usuária, 
, 
 
 
45 
 
ela disse que não quis passar todos os detalhes de uma vez porque eram muito 
complicados. Só após uma segunda reunião, mais detalhes foram descobertos e a 
equipe de desenvolvimento pôde finalmente perceber toda a complexidade e o 
tamanho do esforço necessário para que o software pudesse calcular os impostos 
corretamente. Imagine se só fosse descoberto isso ao final do projeto, com o software 
todo praticamente pronto. A quantidade de retrabalho que precisaria ser feito poderia 
encarecer demais o software, além de provocar um atraso significativo, sem falar em 
desdobramentos que poderiam afetar a qualidade final do produto de software. 
A comunicação entre os técnicos e os usuários é fundamental para que os requisitos 
possam ser elicitados corretamente desde o princípio. É com base nesses 
levantamentos que a modelagem será feita, que os requisitos serão especificados e 
que o código de máquina será criado. Provavelmente, essa é a atividade mais 
importante em toda a Engenharia de Software. 
Alguns termos são fundamentais na compreensão do software como um todo e para 
os requisitos em particular, e o engenheiro de software deveria estar familiarizado 
com esses termos: 
 Metas: também chamadas de fatores críticos de sucesso, se referem aos 
objetivos gerais que o software precisa atender. A partir daí, um estudo de 
viabilidade pode determinar se vale a pena atender esse objetivo geral ou não. 
 Conhecimento da área: o engenheiro de software ou alguém na equipe deveria 
ter um conhecimento prévio do assunto tratado pelo software. Um software 
para controle de estoque fica mais bem projetado por alguém que entenda de 
logística. 
 Stakeholders: são as pessoas envolvidas. Não podemos deixar de ouvir todas as 
pessoas envolvidas com o software e sua futura operação. Às vezes, um grupo 
de pessoas não representa todo o conjunto de possibilidades, todos os pontos 
de vista. 
 Regras de Negócio: essas são afirmações que definem ou restringem algum 
aspecto da estrutura ou do comportamento do negócio em si [1]. “O cliente 
, 
 
 
46 
 
pode pagar com cartão de crédito à vista ou parcelado ou com boleto à vista e 
5% de desconto”. Essa é uma regra de negócio clara sobre o tipo de 
pagamentos com que o software terá que lidar. A partir dela, serão criados os 
requisitos para atender a regra de negócio. 
 Ambiente Operacional: vai determinar em que condições o software irá 
operar. Um software hospedado na nuvem terá requisitos não funcionais que 
irão especificar como se dará a conectividade e como proceder na falta de 
conexão. Bem diferente de um ambiente operacional de um aplicativo 
instalado num tablet. 
 Ambiente Organizacional: é o ambiente da empresa ou da organização que irá 
usar o software. Entre empresas ou organizações e até de uma pessoa para 
outra, há diferenças de valores, conhecimento, procedimentos, estrutura, 
política interna e cultura, principalmente a cultura organizacional. Pense numa 
empresa pequena com 3 funcionários e uma multinacional com 3.000. O 
ambiente organizacional de cada uma é bem diferente. 
Depois de identificada afonte dos requisitos, eles podem começar a ser levantados. 
Alguns são facilmente determinados, como por exemplo, um requisito legal. Está na 
lei, existe uma portaria a respeito e basta seguir o que está escrito. Mas para lidar com 
humanos é melhor empregar técnicas de facilitação para garantir que se obtenham os 
requisitos da melhor forma possível. 
Entrevistas são boas para obter requisitos de uma ou bem poucas pessoas. É uma 
técnica direta, mas algumas perguntas importantes precisam ser feitas e é bom terem 
sido pensadas antes de a entrevista começar. 
Para situações mais complexas ou que envolvam mais pessoas, é interessante pensar 
na construção de cenários. Cenários são ótimos para o Engenheiro de Software 
construir um entendimento da situação e fazer perguntas tipo “como isso é feito” ou 
“o que acontece se”. Uma ferramenta bastante usada para a construção de cenários é 
o diagrama de caso de uso, proposta pela UML. 
, 
 
 
47 
 
Uma técnica usada para esclarecer requisitos é a técnica de prototipagem, na qual um 
protótipo é construído e pode prover aos usuários um contexto para que digam 
exatamente o que precisa ser feito e como. Os tipos de protótipo vão desde o 
rascunho de uma tela no papel, até a construção de uma tela com funcionalidade 
limitada, mas dentro do contexto que se busca compreender e esclarecer. 
As reuniões facilitadas podem trazer os “insights” do grupo para os requisitos do 
software em construção. Uma discussão em grupo pode trazer melhores resultados do 
que as pessoas trabalhando individualmente. Quando bem executada, essa técnica 
pode trazer resultados mais ricos e mais consistentes, e os requisitos conflitantes 
aparecem mais cedo no projeto e podem ser discutidos pelo grupo para ser 
encontrada uma solução. 
A equipe de desenvolvimento também pode conseguir entender melhor o problema 
através da observação. Nessa técnica, o Engenheiro de Software faz uma imersão no 
ambiente do usuário e acompanha como suas tarefas são executadas e como ele 
interage com outras pessoas e de quais ferramentas ele faz uso para completar seu 
trabalho. É uma verificação “in loco” do que acontece e quais resultados são os 
desejados. 
Já User Stories (Estórias de Usuário) é uma técnica muito usada com metodologias 
ágeis, que são mais adaptativas e vão sendo construídas com a participação do 
usuário. São descrições curtas e sem muito detalhamento daquilo que o usuário 
precisa que o software faça para ele. Nessa técnica, deve-se ter informação suficiente 
para que seja estimado o esforço necessário para que o software atenda a expectativa. 
Essas são as mais comuns, mas para elicitação de requisitos existem muitas outras 
técnicas, que vão desde analisar produtos concorrentes até mineração de dados para 
compreender o mercado que o cliente opera e tentar saber com que dados o software 
vai operar. É uma fase de muita importância, então quanto mais se souber logo no 
início do desenvolvimento, melhor a qualidade do produto final, com menos custos 
envolvidos e sem muitas “surpresas” durante o desenvolvimento, que geram 
retrabalho e por isso mais custos. 
, 
 
 
48 
 
4.3 Análise de Requisitos 
A visão tradicional da análise de requisitos tem sido a abordagem da modelagem 
conceitual, feita por uma técnica como análise estruturada ou UML. No entanto, a 
análise de requisitos se preocupa muito com muitos outros aspectos do que só 
modelar o problema. 
Entender como os requisitos são classificados, quais são requisitos funcionais e quais 
são não funcionais é essencial, bem como saber quais requisitos são derivados de uma 
ou mais solicitações, quais são os requisitos que vêm de requerimentos legais, para 
atender plenamente a legislação, quais requisitos são propriedades emergentes, ou 
seja, surgem a partir da integração entre os vários componentes do software e/ou 
integração entre as pessoas e os dispositivos com os componentes do software. 
Também é importante diferenciar requisitos de produto e requisitos de processo, que 
podem restringir a escolha da empresa contratada, da equipe de desenvolvimento, do 
processo de engenharia de software adotado ou o padrão a que se adere. 
A análise também envolve determinar a prioridade dos requisitos. Alguns requisitos 
precisam ficar prontos antes de outros para que o software apresente a funcionalidade 
desejada. Outras vezes, o cliente pede por certas funcionalidades antes de outras, e 
ainda o processo de trabalho pode fazer com que alguns requisitos sejam atendidos 
com prioridade. Isso pode levar a escopo de requisito maior ou menor. O escopo 
determina a extensão na qual um determinado requisito afeta o software como um 
todo ou seu componente de software. 
Alguns requisitos podem ser voláteis, ou seja, podem mudar durante o ciclo de vida de 
desenvolvimento do software. Enquanto outros requisitos podem ser mais estáveis e 
permanecerem do mesmo jeito do começo ao fim. Um requisito que peça que o 
software aumente o desconto na semana depois do Natal pode mudar se o cliente não 
desejar mais conceder descontos, enquanto o requisito para processar o meio de 
pagamento “cartão de crédito” pode ser mais estável porque o negócio não vê motivo 
para deixar de aceitar cartão de crédito. 
, 
 
 
49 
 
O desenvolvimento de modelos que simulem o mundo real é chave para entender os 
requisitos e analisar possíveis soluções. Diversos modelos diferentes podem ser 
usados, bem como diferentes ferramentas, como diagrama de caso de uso ou 
diagrama de fluxo de dados. Muitas dessas ferramentas são parte da UML e bem 
definidas na literatura. Outras formas podem envolver a construção de protótipos ou 
histórias de usuário. A escolha da modelagem vai depender de vários fatores, como a 
natureza do problema, que pode ser mais complexo ou menos complexo. Um 
problema mais complexo pode exigir uma modelagem mais rigorosa, com mais 
detalhes. Para outro menos complexo, pode ser suficiente um protótipo da tela em 
papel ou uma história de usuário. A experiência e o conhecimento da equipe de 
Engenharia de Software podem influenciar a escolha da modelagem, em virtude de 
estarem familiarizados mais com um método que outro. Também o cliente pode exigir 
que se use uma determinada ferramenta ou técnica. 
Muitas vezes, acontece que alguns requisitos são incompatíveis com outros. Alguma 
negociação precisa ser feita entre os stakeholders para resolver os conflitos. Sejam 
problemas entre funcionalidades conflitantes, funcionalidades que exijam muitos 
recursos (de pessoal ou de dinheiro), sejam soluções tecnicamente inviáveis, diversos 
conflitos aparecem durante os projetos de desenvolvimento de software. Melhor que 
sejam resolvidos na fase de análise, na qual as soluções estão sendo propostas e a 
validação, codificação e testes ainda não aconteceram. Isso vai gerar menos retrabalho 
depois. Entenda que depois de codificado, recodificar um software pode ser muito 
difícil, exigindo que partes inteiras tenham que ser refeitas devido às várias 
integrações entre os componentes e entre o software e o ambiente externo. Algumas 
cláusulas contratuais podem impor restrições no produto de software, no tipo de 
solução que se quer empregar, na priorização dos requisitos, e pode levar a conflitos 
entre os stakeholders. 
Na sua análise, procure usar métodos formais, bem definidos, com uma semântica 
conhecida e de domínio pela equipe de desenvolvimento. Especialmente em projetos 
grandes, complexos, com muitas integrações. Seguir um padrão bem definido facilita a 
análise de duas maneiras: oferecer uma linguagem padronizada permite que os 
, 
 
 
50 
 
requisitos sejam expressados de forma clara, sem ambiguidades e mal interpretação, e 
em segundo lugar, permite que as soluções sejam discutidas, entendidas e esclarecidas 
de forma inequívoca, justamente porque os requisitos estão expressados 
formalmente. Só não esqueça que a formalizaçãototal deve ser feita ao final do 
processo, dando mais liberdade no início para a criação de ideias e soluções novas nos 
estágios iniciais da análise. 
4.4 Especificação de Requisitos 
Na Engenharia de Software, o termo “Especificação de Requisitos” se refere à 
produção de um documento que pode ser sistematicamente revisado, avaliado e 
aprovado [1]. Em sistemas muito complexos, especialmente os que têm vários 
componentes que não são software, como aplicações logísticas, com leitores de código 
de barra, headsets, tablets e outros dispositivos, podem ser necessários 3 documentos 
diferentes. 
Um documento é o documento de Definição de Sistema, onde é capturado o conceito 
das operações a serem desenvolvidas, incluindo fluxogramas das atividades e linhas 
gerais sobre o contexto em que o sistema foi idealizado, bem como casos de uso. É um 
documento que não se preocupa em detalhar cada requisito, mas provê um contexto e 
um cenário geral do sistema como um todo. 
Outro documento é chamado de Especificação de Requisitos de Sistema, e possui uma 
descrição dos componentes que não são software. No exemplo de um sistema 
logístico, aqui seria descrito o funcionamento dos leitores de código de barra, sua 
especificação técnica, capacidade e configuração de hardware e qual o tipo de 
integração com o software ele teria. Nesse exemplo, ainda, entrariam os diversos 
componentes de infraestrutura, como roteadores, impressoras, tipo de etiqueta usado 
e diversos detalhes que seria melhor outro tipo de engenheiro para criar essa 
especificação. 
E o terceiro documento é a Especificação de Requisitos de Software, onde sim seriam 
detalhados todos os requisitos para os vários componentes do software, com detalhes 
de modelagem e das soluções imaginadas durante a análise. É o documento que será a 
, 
 
 
51 
 
base para a contratação de serviços, para estipular o esforço necessário para codificar 
o software, sendo a base para determinar o prazo, o custo, os riscos e todos os 
detalhes do projeto de software. 
Os requisitos de software são construídos em linguagem natural, mas por vezes é 
necessário usar descrições formais da modelagem, como diagramas de caso de uso e 
outras ferramentas. Como regra geral, um requisito precisa estar descrito de forma o 
mais precisa possível. 
As organizações usam esse documento como base para estabelecer os critérios de 
qualidade e de aceitação do software. Imagine todos os detalhes da legislação fiscal 
brasileira sendo detalhados na forma de requisitos de software para que um 
desenvolvedor possa então codificar isso num componente de software que emita a 
NFe, faça a apuração dos impostos, os lançamentos contábeis e a baixa de estoque dos 
produtos vendidos, bem como o conhecimento de transporte para que a mercadoria 
possa trafegar pelas estradas sem ser considerada carga roubada. 
Nesses casos, mais de um requisito pode ser necessário para descrever todos os 
detalhes. O nível de detalhamento precisa ser o mais preciso possível porque estamos 
lidando com legalidades. Não cumprir a lei, ou apurar os impostos de forma 
equivocada pode ser considerado sonegação de impostos, e pode levar pessoas à 
prisão. Ou ainda, no caso de um software hospitalar, podemos estar falando de vidas 
humanas perdidas por ter especificações de software pobres, como não levar em 
conta doenças preexistentes no receituário dos pacientes. 
É importante que os requisitos de software possam ser usados para determinar riscos, 
custos, prazos e outros detalhes do projeto de software. Estes, inclusive, são 
considerados indicadores de qualidade para determinar se os requisitos estão bem 
definidos e explicados, para estabelecer a capacidade ou não que a descrição de um 
requisito tem de facilitar a determinação dos detalhes do projeto. 
Os requisitos de software também devem ser uma base bem informada para transferir 
o software para um novo usuário, em outras palavras, têm que fornecer uma 
plataforma para estudo e aprendizagem sobre o próprio software. Isso faz com que os 
, 
 
 
52 
 
requisitos de software sejam usados para outras tarefas, além da construção do 
software, como treinamento, melhorias no software (manutenção) e adoção do 
software para outras plataformas de operação (portabilidade). 
4.5 Validação de Requisitos 
Os documentos de requisitos estão sujeitos a procedimentos de validação e 
verificação. Os requisitos devem ser validados para assegurar que o Engenheiro de 
Software entendeu os requisitos [1]. É importante verificar que o documento esteja 
em conformidade com os padrões da organização, com as práticas do mercado e com 
a legislação ou outro marco regulatório da indústria. Bancos têm padrões elevados de 
segurança. Farmacêuticas devem seguir várias regras da vigilância sanitária, bem como 
a indústria de alimentos. 
Além das obrigações legais, a validação se preocupa em verificar o entendimento dos 
requisitos. Uma das formas de se validar o documento de requisitos de software é 
formar um comitê com vários stakeholders e repassar o documento, discutindo como 
foi o entendimento da equipe de desenvolvedores. Também na fase de validação 
podem ser feitos vários constructos e protótipos para que os usuários validem o 
entendimento através de uma funcionalidade ainda não implementada, e muitas 
vezes, ainda sem logomarcas e outros detalhes do produto final, mas que execute o 
requisito como foi especificado. 
Quanto antes for detectado que o entendimento do software não está de acordo com 
o especificado ou o entendimento não está de acordo com a necessidade do usuário, 
mais rápido e mais barato para fazer os ajustes necessários para que o software 
atenda plenamente às necessidades dos usuários. 
Algumas vezes, é necessário fazer uma prova de conceito. A prova de conceito é uma 
espécie de teste que se faz simulando as condições reais. De volta ao exemplo do 
sistema logístico, um teste com os leitores de códigos de barra, uma análise dos dados 
gerados por esses dispositivos e como capturar esses dados no sistema, impressão dos 
códigos em diferentes impressoras e tipos de papel, testes com a configuração do 
ambiente para evitar surpresas desagradáveis em fases mais avançadas do projeto. 
, 
 
 
53 
 
Será um desastre se o software for desenvolvido, implantado e testado, e na hora de 
utilizar, a etiqueta não fica legível para os leitores, ou o dado capturado pelo leitor não 
está em um formato compatível para ser usado pelo software. Por isso, provas de 
conceito devem ser feitas o mais cedo possível e seus resultados validados o mais cedo 
possível pelos usuários e clientes. Nem sempre aquilo que pensa o desenvolvedor é o 
mesmo que pensam os demais stakeholders. E frequentemente não é. Para o 
desenvolvedor, uma mensagem que fique poucos segundos na tela é suficiente para 
alertar de um problema, mas para o usuário no dia a dia, que nem sempre está todo o 
tempo olhando para a tela, pode não ser suficiente, e uma confirmação de leitura será 
necessária. 
Esse é o tipo de validação que se procura fazer nessa fase. Encontrar o máximo de 
divergências de entendimento entre a equipe de desenvolvimento e os demais 
stakeholders. Já foi falado sobre a importância da comunicação entre esses dois 
públicos diferentes. São tipos de pessoas distintos, com necessidades e visões de 
mundo bem diferentes, então uma validação é importante para assegurar a qualidade 
do produto final. 
 
Conclusão 
Neste bloco, você viu a importância da especificação de requisitos num projeto de 
software, os conceitos fundamentais sobre o que é um requisito, como funciona o 
processo de requisitos e suas fases principais: elicitação, análise, especificação e 
validação. 
Foram analisadas as principais técnicas para elicitação dos requisitos, técnicas e 
ferramentas como entrevistas, reuniões e observações. Com certeza, é uma fase muito 
importante, e acreditamos que sejaa mais importante da Engenharia de Software. 
Na análise de requisitos, vemos a aproximação com a modelagem. Nessa fase, é 
importante ter liberdade criativa para trazer soluções inovadoras e eficientes ao 
problema que o software propõe resolver. 
, 
 
 
54 
 
Especificação de requisitos é onde os requisitos são formalmente registrados e um 
documento de requisitos é produzido. Veja o exemplo: 
 
[RF001] Criar componente 
Descrição do caso de uso: Este caso de uso permite que o usuário crie e armazene um novo registro de 
produto no sistema de controle de estoque, de acordo com o protótipo RF001-P. 
Prioridade:  Essencial  Importante  Desejável 
Entradas e pré-condições: não tem. 
Saídas e pós-condição: um produto é cadastrado no sistema 
 
Aqui vemos um requisito funcional para que seja cadastrado um produto novo no 
estoque. Os dados a serem cadastrados estão no protótipo mencionado no exemplo. 
Tem alta prioridade, não tem nenhum pré-requisito e seu critério de validação é que 
haja um novo registro no sistema. Funcionalidade básica, um exemplo bem simples, 
mas ilustrativo do que seja um documento de requisitos. 
Por fim, a validação de requisitos cuida de revisar e garantir que o entendimento da 
equipe de desenvolvimento tenha sido correto e que não haja interpretações 
duvidosas. Também vimos algumas ferramentas e técnicas empregadas para essa 
finalidade, como a prova de conceito. 
É importante notar que a saída dessa fase é o documento de requisitos funcionais e 
requisitos não funcionais, que pode ser separado, dependendo do projeto e sua 
complexidade, e esse documento de requisitos é o que será a base para determinar 
toda a base do projeto de software, determinar o esforço necessário, quantos e quais 
especialistas serão necessários, custos, prazos e os critérios de aceite e de qualidade 
do produto de software final. 
REFERÊNCIAS 
[1] BOURQUE, Pierre; FAIRLEY, Richard E. (ed.). SWEBOK – Software Engineering Base 
of Knowledge. 3. ed. IEEE Computer Society, Piscataway, NJ, 2014. 
, 
 
 
55 
 
 
5 GESTÃO DE QUALIDADE DE SOFTWARE 
Apresentação 
Outro assunto importante na Engenharia de Software é a garantia da qualidade do 
produto de software criado. Imagine que algumas obras de engenharia civil foram 
feitas para durar muito tempo. Estações de metrô, pontes e viadutos (podemos incluir 
as pirâmides do Egito e a muralha da China). Para garantir a qualidade, alguns 
procedimentos foram criados ao longo do tempo na história humana. Creio que a ISO 
9000 é o termo que todos associam à qualidade. Os princípios fundamentais da norma 
podem ser aplicados ao software, pois, no fim das contas, software também pode ser 
um produto, e a norma atual absorveu suas variantes que tratam de procedimentos e 
projetos, e ficou ISO 9001:2015. Contudo, software também pode ser um serviço. E 
também pode ser parte de um produto e estar “embarcado” como numa Smart TV, 
por exemplo. Então, algumas normas específicas foram desenvolvidas, além de outros 
padrões mundiais. 
O objetivo deste bloco é apresentar os diferentes padrões e normas de qualidade, bem 
como as melhores práticas do mercado de software. Você já ouviu a expressão “está 
bugado”? Normalmente, essa expressão se refere a um “bug” num software. A 
associação de “bug” (inseto) com software remete aos primórdios da computação, 
quando uma mariposa (“bug”) entrou no computador, que na época era bem grande, e 
provocou um curto-circuito, que fez com que os programas não funcionassem mais. Ao 
dar explicações para o chefe, o responsável pela programação colou o pobre inseto 
com fita adesiva no relatório. Bem, é desses erros que estamos falando aqui. E claro, 
como prevenir erros no software. 
Vamos começar definindo qualidade como a conformidade com os requisitos [1]. 
Embora simples, é uma definição que casa bem com a Engenharia de Software, que 
estuda e propõe que se usem os requisitos para a construção do software. Perceba 
que essa definição não fala em atributos. Diz apenas “atenda os requisitos”. 
, 
 
 
56 
 
Outra coisa importante é saber que muitas vezes consertar um erro crítico é tão 
demorado e tão caro, que é preferível começar tudo de novo. Na obtenção dos 
requisitos, as expectativas e as necessidades devem ficar muito claras a todos 
stakeholders (envolvidos no projeto do software). 
 
5.1 Qualidade Funcional e Qualidade Estrutural 
Enquanto Crosby tem uma definição para a qualidade de forma geral, a definição de 
Qualidade de Software é a capacidade do produto de software de satisfazer as 
necessidades implícitas e declaradas dentro de determinadas condições [2]. Essa 
definição abrange a definição de Crosby de que a qualidade é obtida quando se 
atendem os requisitos [1], independentemente do tipo de requisito. 
Existe uma certa ambiguidade na Engenharia de Software quanto à Qualidade do 
Software e a Qualidade dos Requisitos de Software, mas fica claro que quando falamos 
de Qualidade dos Requisitos estamos falando das características funcionais do 
software, ou seja, aquilo que o software se propõe a fazer [3], a resolução dos 
problemas dos usuários. Mas não são apenas esses os requisitos de qualidade. Existem 
outros muito importantes, como seguir um determinado protocolo ou apresentar uma 
determinada performance ou executar num tipo de ambiente. Todas essas outras 
características são questões de Qualidade Estrutural. 
Sendo assim, a Qualidade Funcional pode ser definida como a qualidade aplicada aos 
requisitos funcionais, que são características e restrições diretamente ligadas às 
funcionalidades do software. Qualidade Estrutural seria todo o resto, ou seja, 
performance, ambiente onde o software será executado e outras características não 
funcionais [3]. 
A Qualidade do Software é a soma dessas duas. Sempre que se aborda o assunto 
Qualidade de Software, pense sempre no todo, ou seja, na qualidade dos requisitos 
funcionais e não funcionais, Qualidade Estrutural e Qualidade Funcional. 
É necessário ter em mente que qualidade é valor agregado para os stakeholders. Um 
produto de software que atende todas as expectativas de quem vai se beneficiar pelo 
, 
 
 
57 
 
uso do produto é um produto de qualidade. Como prefere a IBM, a qualidade é 
direcionada pelo cliente, que é o árbitro final que determina se o software tem 
qualidade ou não [4]. 
No processo de definirmos os requisitos, é importante determinarmos quais são as 
expectativas dos stakeholders, que desejos eles têm e talvez o mais importante, que 
necessidades eles têm. Especialmente quando falamos da Qualidade Funcional do 
software, muito frequentemente os stakeholders não têm uma ideia clara do que o 
software pode fazer por eles. É o entendimento do Engenheiro de Software que traduz 
os conceitos vagos dos usuários em requisitos funcionais bem definidos. Nessa hora, é 
importante estabelecer o critério de qualidade daquele requisito. E é baseado nesse 
critério de qualidade que o desenvolvimento do software deve ser feito e o esforço 
estimado. Essa estimativa leva à definição de custo e de prazo de entrega da 
funcionalidade. 
Quando falamos da Qualidade Estrutural, normalmente os requisitos não funcionais 
ficam na mão dos profissionais do desenvolvimento, da infraestrutura de TIC 
necessária para o funcionamento do software e todo um corpo mais técnico, que sabe 
exatamente quais são os requisitos não funcionais e as definições dos critérios de 
qualidade desses requisitos não funcionais ficam mais simples de serem obtidas. Não 
que seja sempre fácil, mas normalmente um conjunto de profissionais que sabe o que 
um recurso computacional pode fazer e como um software deve se comportar está 
envolvido com a obtenção dos requisitos não funcionais. 
 
5.2 Análise de Ponto de Função 
No começo do desenvolvimento de software, as maiores preocupações eram com 
tempo de máquina. Quanto menos tempo um software levava para serexecutado, 
melhor. O computador era um recurso caríssimo, difícil de operar, que exigia muitos 
recursos das organizações. Assim, a primeira métrica para saber se o software era 
bom, ou não, foi a contagem de linhas de código. Entretanto, linha de código trata-se 
de um termo subjetivo, que depende do programador, da linguagem de programação 
usada, da experiência do desenvolvedor e uma série de fatores não muito objetivos. 
, 
 
 
58 
 
A evolução natural dessa métrica é a Análise de Pontos de Função. Em vez de contar 
quantas linhas de código tem o software, são medidos quantos Pontos de Função tem 
o software. A Análise de Pontos de Função é uma técnica que mede quantas 
funcionalidades tem o software do ponto de vista do usuário, independentemente da 
tecnologia empregada para o desenvolvimento ou execução do software. É uma 
métrica associada aos requisitos de negócio (requisitos funcionais). E que pode ser 
executada desde o projeto, analisando para isso o documento de requisitos. Assim, se 
você souber logo nas fases iniciais quantos requisitos tem o software, conseguirá 
controlar melhor o projeto, fornecendo estimativas confiáveis de prazo e custo, além 
de assegurar que todos os pontos de função foram implementados, de acordo com os 
requisitos. 
Inicialmente proposto por Allan Albrecht em 1979, os requisitos funcionais definidos 
pelos usuários são identificados e classificados em 4 categorias: saídas, entradas, 
consultas e arquivos mestres. Cada uma dessas categorias tem um peso que é 
multiplicado pela quantidade. E esses pesos podem ainda ser ajustados. Se o tipo de 
consulta é complicado, pode ser acrescentado 5%, por exemplo. O resultado dessa 
soma é a quantidade de pontos de função do software. 
Essa abordagem tem sido desenvolvida e melhorada, e hoje em dia existem vários 
padrões e formas diferentes de cálculo, todas partindo desse mesmo princípio de 
medir as funcionalidades e comparar com os requisitos. O IFPUG (International 
Function Point User Group) assumiu a tarefa de evoluir o padrão criado por Albrecht 
desde 1986 e a norma ISO 20926 é baseada exatamente nesse método de cálculo. 
Existem ainda a ISO 29881, com a métrica criada chamada FiSMA Functional Size 
Measurement, ou Medida de Tamanho Funcional (em tradução livre), que propõe uma 
fórmula diferente para o cálculo. De forma similar, há a ISO 20968 Software 
Engineering – Ml II Function Point Analysis, a ISO 24570 Software Engineering – Nesma 
Functional Size Measurement Method e a ISO 19761 Software Engineering – A 
Functional Size Measurement Method. Também existem padrões desenvolvidos por 
associações profissionais como a OMG (Object Management Group) e outros métodos 
específicos criados por empresas e ainda não padronizados. Todos têm o objetivo de 
, 
 
 
59 
 
medir quantas funções tem o software e assim facilitar o projeto do software nos 
quesitos de qualidade e determinação do esforço necessário para o desenvolvimento. 
5.3 Normas de Qualidade 
Existem diversos padrões de qualidade definidos na ISO. A ISO 90003 oferece um guia 
de como usar a ISO 9001 para a aquisição, desenvolvimento e operação de software. 
Até a nova ISO 41062:2019 que foi recém-publicada e trata de aquisição de software, 
traz uma série de considerações sobre a qualidade de software. Contudo, a principal 
norma de qualidade de Software é a série ISO 25000. 
ISO 25000 é conhecida também como SQuaRE (System and Software Quality 
Requirements and Evaluation) (em tradução livre, Avaliação e Requisitos para a 
Qualidade de Software e Sistemas). Ela é, na verdade, uma série de normas. Vamos ver 
a lista: 
 ISO 25000 – Guia para o SQuaRE, que estabelece a terminologia, explica a série 
de padrões e dá outras definições básicas. 
 ISO 25001 – Planejamento e Gerenciamento, que oferece ajuda para o 
processo de gerenciamento da qualidade de software. 
 ISO 25010 – Modelos e Sistemas de Qualidade de Software, que descreve o 
modelo para a qualidade de software e o uso de software. 
 ISO 25012 – Modelo de qualidade de dados, que fornece um modelo para a 
qualidade dos dados armazenados em um sistema de computador. 
 ISO 25020 – Guia e modelo de referência de métricas, que apresenta uma 
explicação introdutória e um modelo de referência para métricas de qualidade 
de software. 
 ISO 25021 – Elementos de métricas de qualidade, que define um conjunto 
básico de métricas de qualidade para aplicação em todo o ciclo de vida do 
software. 
 ISO 25022 – Métricas para qualidade do software em uso. 
 ISO 25023 – Métricas para a qualidade do projeto de software. 
 ISO 25024 – Métricas para qualidade dos dados. 
, 
 
 
60 
 
 ISO 25030 – Métricas para qualidade dos requisitos, com várias recomendações 
para obtenção de requisitos com qualidade desde o início do desenvolvimento. 
 ISO 25040 – Guia e modelo de referência para auditoria de qualidade do 
software. 
 ISO 25041 – Guia de avaliação para desenvolvedores, compradores e auditores 
independentes. 
 ISO 25042 – Módulo de auditoria, define como serão os documentos 
produzidos no processo de auditoria. 
 ISO 25045 – Avaliação da capacidade de recuperação. Se há uma interrupção 
na execução do software, como o sistema como um todo se recupera. 
E ainda existe uma extensão, a ISO 25099 que compatibiliza a metodologia SQuaRE 
com outras normas e padrões internacionais. 
O SQuaRE prevê 8 características e várias subcaracterísticas. Em resumo, a qualidade 
de um sistema é avaliada pelo grau de satisfação com o produto que os stakeholders 
percebem. Essas necessidades dos stakeholders são representadas no modelo pelas 
várias características e subcaracterísticas. 
Adequação Funcional tem como subitens a completude funcional, a correção funcional 
e a adequação funcional, e representa o grau que as necessidades dos usuários são 
atendidas pelo software, quando este é usado da forma como foi projetado. 
Eficiência de desempenho representa como é o desempenho do software no consumo 
de recursos computacionais necessários para fazê-lo funcionar. Os subitens avaliam o 
quanto o software consome de tempo, de recursos e de capacidade. 
A característica Compatibilidade tem a ver com a capacidade do software de coexistir 
com outros softwares e funcionar adequadamente no hardware que ele estiver 
instalado. Os subitens são coexistência e interoperabilidade. 
A Usabilidade é a característica que atesta a satisfação de uso do software e possui os 
subitens adequabilidade, aprendizagem, operacionalidade, proteção contra erros do 
, 
 
 
61 
 
usuário, estética e acessibilidade, que é a capacidade para ser operado por pessoas 
com os mais variados graus de dificuldade motora, visual ou auditiva. 
Confiabilidade é a avaliação de quanto tempo o sistema opera nas suas condições 
ótimas e seus subitens são: maturidade, disponibilidade, tolerância a falhas e 
recuperabilidade, definida como a capacidade de se recuperar depois de uma falha. 
Já Segurança é a característica para proteção dos dados, tanto para acesso por pessoas 
não autorizadas quanto à permanência dos dados no sistema, e suas subcaracterísticas 
são: confidencialidade, integridade, autenticidade, não repúdio e prestação de contas. 
A característica Manutenibilidade tem a ver com a eficácia com que se pode realizar 
manutenção no sistema, seja para ajustar uma regra de negócio e até mesmo 
implementar novas funcionalidades. Seus subitens são: modularidade, reusabilidade, 
analisabilidade, modificabilidade e testabilidade. 
E, finalmente, Portabilidade é a condição de o sistema ser levado para outra 
plataforma e manter suas especificações funcionando. Seus subitens são: 
adaptabilidade, instalabilidade e substituição. 
 
5.4 Melhores Práticas de Qualidade 
Além dos diferentes padrões e normas, existem conjuntos de melhores práticas 
adotados pelo mercado. Desses conjuntos de melhores práticas, o mais conhecido e 
usadoé o chamado CMMI, mantido pelo CMMI Institute, uma subsidiária da ISACA, a 
associação de auditores de sistemas de informação, que atualmente estabelece vários 
padrões de melhores práticas para auditoria, gestão de risco e governança da área de 
Tecnologia da Informação. 
CMMI é um modelo integrado de capacitação para a maturidade. É um modelo 
evolutivo da sua capacidade de fazer software cada vez melhor. Atualmente, o CMMI 
se concentra em 3 áreas diferentes: CMMI-DEV, para desenvolvimento de aplicações; 
CMMI-SVC, para serviço e suporte técnico; e CMMI-ACQ, para as aquisições de 
software. 
, 
 
 
62 
 
Basicamente, temos 5 níveis de maturidade dos processos. No nível 1, chamado de 
Inicial, os processos são imprevisíveis e pouco controlados. O nível 2 é chamado de 
Gerenciado e aqui os processos são agregados a um projeto e basicamente são 
reativos. O nível 3 é chamado de Definido e os processos são organizados, proativos e 
conhecidos por todos. Já no nível 4, chamado de Quantitativamente Gerenciado, os 
processos são medidos e controlados. Finalmente, o nível 5 é chamado de Otimizado e 
o foco está na melhoria contínua dos processos. 
5 Foco contínuo na 
melhoria dos 
processos. 
 
 
4 Processos são 
medidos e 
controlados. 
 
 
3 Processos são 
caracterizados para 
Organização e são 
proativos. 
 
 
2 Processos são 
caracterizados por 
Projeto e as ações 
frequentemente 
reativas. 
 
 
1 Processos são 
imprevisíveis, 
pouco controlados 
e reativos. 
 
 
Fonte: adaptado de: <http://www.isdbrasil.com.br/o-que-e-cmmi.php>. Acesso em: 21 jan. 2020. 
Figura 5.1 – Níveis de maturidade do CMMI. 
Otimização 
Quantitativamente 
Gerenciado 
Definido 
Gerenciado 
Inicial 
http://www.isdbrasil.com.br/o-que-e-cmmi.php
, 
 
 
63 
 
Há também o padrão ISO 15504, que é também chamado de SPICE, Software Process 
Improvement and Capability Determination, que pode ser traduzido livremente para 
Processo de Determinação da Melhoria e Capacitação de Software, que é basicamente 
a mesma coisa que o CMMI. A diferença entre um conjunto de melhores práticas e 
uma norma ISO é a questão da obrigatoriedade. Quando assumimos uma norma, 
temos que cumprir toda a especificação da norma e a empresa é quem é certificada. 
No caso de melhores práticas, o profissional é certificado e ele é quem aplica o 
conhecimento na área em questão. 
5.5 Modelo CISQ 
Finalmente, o modelo CISQ de qualidade é definido pelo CISQ – Consortium for IT 
Software Quality, uma organização formada por executivos de grandes empresas de 
software, e se baseia em 5 fatores desejáveis para agregar valor para o cliente. 
 Confiabilidade, um atributo de resiliência e solidez. Esse atributo mede a 
probabilidade de uma falha, ou seja, o risco de falha do software em questão. 
 Eficiência é o atributo que garante uma alta performance na execução do 
software, definido como rapidez no processamento do código de máquina com 
o mínimo de consumo de recursos computacionais. 
 Segurança é o atributo que assegura a preservação e a continuidade dos dados 
armazenados pelo software, através de práticas seguras de codificação. 
 Manutenibilidade é o atributo para medir a facilidade em aplicar mudanças no 
software sem afetar o processamento e os dados armazenados e inclui os 
conceitos de portabilidade e adaptabilidade. 
 O Tamanho do Software não é um atributo de qualidade propriamente dito, 
mas estabelece padrões e ajuda a controlar os projetos de desenvolvimento, 
pois ajuda a dimensionar o esforço necessário tanto para o desenvolvimento 
quanto para a manutenção do software. 
O conceito principal do modelo CISQ é a automação do processo. As definições e as 
técnicas utilizadas devem obrigatoriamente facilitar a adoção de software para 
, 
 
 
64 
 
garantia da qualidade, medir a qualidade de um software usando outro software que 
processa e calcula as métricas de cada fator e aponta indicadores para melhoria. 
 
Conclusão 
Você viu neste bloco que o assunto da Qualidade de Software é importante e extenso. 
Viu ainda a diversidade de maneiras e estilos para o controle de qualidade. Uma 
variedade de normas e padrões foi desenvolvida ao longo do tempo e estão todas 
ativas e tentando estabelecer as bases para que se garanta a qualidade do software. 
Porém, como explicado no Bloco 1, devido à natureza do próprio software, é quase 
impossível dizer que um software está completamente livre de erros. Há muitas 
variáveis. O comportamento do software é um sob circunstâncias ideais e outro 
diferente quando alguma coisa não está como se planejou. Senão coisas como 
vazamento de informação, perda de dados, websites lentos e congestionados 
simplesmente não aconteceriam. Você já deve ter visto notícias sobre a entrega do 
imposto de renda, sobre divulgação de notas do ENEM e outros erros mais grosseiros, 
como quando uma atualização do Windows da Microsoft travou máquinas em todo o 
Brasil. 
Essa diversidade sugere que ainda é muito difícil garantir a qualidade do software. 
Portanto, cabe ao Engenheiro de Software se apegar aos princípios básicos da 
qualidade de software: fazer um bom levantamento dos requisitos, desenvolver código 
segundo o que foi especificado e não se esquecer de que um software vai precisar de 
manutenções, seja por fatores externos ou internos ao próprio software. Esteja 
preparado e deixe o código preparado para facilitar a manutenção. 
 
REFERÊNCIAS 
[1] CROSBY, Phillip B. Quality is free: the art of making quality certain. McGraw Hill, 
1979. 
, 
 
 
65 
 
[2] INTERNATIONAL ORGANIZATION OF STANDARDS. ISO/IEC 25010:2011 Systems and 
Software Engineering. Systems and Software Quality Requirements and Evaluation 
(SQuaRE). Systems and Software Quality Models, ISO/IEC, 2011. 
[3] BOURQUE, Pierre; FAIRLEY, Richard E. (ed.). SWEBOK – Software Engineering Base 
of Knowledge. 3 ed. IEEE Computer Society, Piscataway, NJ, 2014. 
[4] KAN, Stephen H. Metrics and Models in Software Quality Engineering. 2. ed. 
Addison-Wesley, 2002. 
[5] ALBRECHT, Allan J. Measuring Application Development Productivity. IBM 
Development Symposium, Monterrey, California, 1979. 
[6] INTERNATIONAL ORGANIZATION FOR STANDARDIZATION. ISO 25000 System and 
Software Quality Requirements and Evaluation (SQuaRE) series of standards. 2. ed. 
Genebra, 2011. 
 
 
 
 
 
 
 
 
 
 
 
 
, 
 
 
66 
 
 
6 TÓPICOS AVANÇADOS EM ENGENHARIA DE SOFTWARE 
Apresentação 
Neste bloco, vamos discutir algumas tendências do século XXI que têm potencial de 
durar por muitos anos ainda. Na tecnologia, os cenários mudam rapidamente, novas 
tendências e novas tecnologias colocam tudo em xeque todo o tempo, e como 
Engenheiros de Software, temos que estar preparados para essas mudanças rápidas, 
adaptar nossos softwares e oferecer sempre a melhor solução disponível aos 
stakeholders. 
Por isso, vamos ver alguns conceitos que já estão consolidados e alguns ainda se 
consolidando rapidamente. Inteligência Artificial e Blockchain são tendências em 
consolidação no momento e afetam nosso modelo de trabalho com Software. SaaS e 
SOA já são tendências consolidadas e devem ficar assim por um tempo ainda, 
enquanto Big Data ainda é uma incógnita se vai se consolidar mesmo como uma 
tendência e quanto tempo vai durar isso, apesar de todos falarem no assunto. Vamos 
ver cada um desses conceitos e tendências. 
6.1 SaaS – Software as a Service 
Vamos contar um pouco de história para contextualizar SaaS (Software como um 
Serviço). Até o final da década de 1950, os computadores eram calculadoras grandes e 
rápidas. Na década seguinte, os mainframes dominavam e sua arquitetura era 
centralizada (óbvio). O software processava no mainframe e o usuário tinha um 
terminal na sua mesa com monitor e teclado apenas. Com a revolução do PC na 
década de 1980 e a arquitetura cliente-servidor da década de 1990, o usuário passou a 
ter um computadorcompleto na sua mesa. E passou a produzir informação, que às 
vezes gerava confusão, porque cada usuário produzia uma informação diferente da 
outra. Nos anos 2000, a Internet virou a plataforma dominante. 
Com o aumento do uso e da confiabilidade da “grande rede”, migrar os softwares para 
a Web passou a ser o paradigma dominante e surgiram várias arquiteturas distribuídas 
e várias implementações distribuídas de software. Só que a grande “sacada” dos 
, 
 
 
67 
 
fabricantes de software foi oferecer a plataforma necessária para processar os grandes 
softwares. Imagine que a empresa não precisa mais ter um (ou dezenas de) 
servidor(es). Com isso, o custo de manter toda essa tecnologia passou a não existir 
mais. E o custo do software? SaaS foi a resposta para isso. Alugar em vez de comprar. 
Temos ainda uma mentalidade de ter as coisas. Achamos melhor ter um carro. Mas 
para que ter um carro se posso alugar um sempre que preciso, e que ainda vem com 
motorista junto? Já ouviu falar em Uber? Em vez de comprar uma licença de software, 
posso pagar uma mensalidade para usar o software de uma empresa. E muitas vezes o 
pagamento não envolve dinheiro. Usamos o Android nos nossos celulares “de graça”. 
Pagamos com informação. Quem somos, onde vamos, o que vemos, o que ouvimos. 
Toda essa informação vai para a Android, divisão do Google. É capaz de o Google saber 
mais sobre você do que você mesmo! 
Existe ainda um modelo de comercialização chamado freemium, onde se usa a 
funcionalidade básica de graça, mas se você quiser mais recursos, tem de pagar pelo 
uso. É mais comum quando há um serviço além do uso do software, como música, por 
exemplo. Spotify é um exemplo. É um software para ouvir música que vem com um 
catálogo de músicas associado. 
No mundo corporativo, os grandes softwares estão indo para a nuvem e se tornando 
SaaS. Ao invés de comprar as licenças, manter um datacenter com vários servidores, 
backups e vários funcionários especializados, a empresa prefere pagar pelo serviço 
prestado. As grandes vantagens são essas. Economia e simplicidade no gerenciamento 
da infraestrutura necessária para o software funcionar. Entretanto, a grande 
desvantagem é que os dados ficam armazenados no prestador do serviço, então 
cancelar e mudar para outro pode ser um transtorno enorme e custar muito caro para 
a migração. Acesso indevido também pode ser um problema, mas com a popularização 
desse modelo de serviço, os provedores de SaaS estão cada vez melhores em manter 
seus dados protegidos. É importante ter um bom contrato com o provedor de serviço, 
com cláusulas de proteção e de propriedade dos dados. 
, 
 
 
68 
 
É preciso considerar também que a manutenção não é feita pela empresa, mas sim 
pelo provedor de serviço, e algumas vezes pode demorar para que alguma 
funcionalidade que você deseja fique disponível. Essa agilidade na manutenção pode 
ser contornada através da contratação de mais serviços do provedor ou criando uma 
API (interface) com o software do prestador que permita que a empresa acesse os 
dados ela mesma, e construa funcionalidades adicionais. Esse tipo de software externo 
ao principal é chamado de Middleware. 
6.2 SOA – Service Oriented Architecture 
Aqui também vamos recorrer à história para entendermos o conceito de SOA 
(Arquitetura Orientada a Serviços). Certamente, já ouviu falar em Orientação a 
Objetos. Programar usando orientação a objetos tornou as tarefas mais simples e 
possibilitou o reúso dos objetos, diminuindo o tempo de programação e a quantidade 
de linhas de código necessárias para criar o software. Imagine que você possa usar 
objetos de forma distribuída! Esse é o conceito de SOA. Pense em digitar o endereço 
no cadastro de cliente! Você pode acessar um serviço dos correios que busca o 
endereço a partir do CEP e só colocar o número da casa e do apartamento, se tiver. Do 
ponto de vista do usuário ficou mais fácil. Do ponto de vista do software também. 
Rotinas de consistência e checagem e verificação dos dados são dispensáveis, já que os 
dados chegam formatados no padrão dos correios, prontos para serem usados. 
Imagine todo o sistema formado por um conjunto de serviços. Cada serviço pode estar 
hospedado em um lugar diferente ou ser fornecido por um provedor diferente. Porém, 
tudo funciona integrado, como um único software. SOA exige novas formas de se 
pensar a criação de software. Ao criar um serviço de verificação do CPF, por exemplo, 
basta colocar o serviço disponível no catálogo e pronto. Está disponível para qualquer 
parte do software que precise desse serviço e até para outros softwares poderem usar 
também. 
É claro que para essa maravilha tecnológica funcionar é necessário que existam 
algumas coisas bem definidas como padronização dos serviços e da troca de dados. 
Isso é conseguido com o uso da tecnologia de Web Services. Foram esses provedores e 
empresas de software que praticamente criaram a SOA, então é natural que a 
, 
 
 
69 
 
implementação de SOA seja mais fácil através dos Web Services. Outro fator que 
impulsiona a adoção de SOA é a própria UML, que, com seus diagramas de 
modelagem, facilita a visualização dos Serviços e da integração entre os serviços. Uma 
outra necessidade dessa arquitetura é a criação e manutenção de um bom catálogo de 
serviços, para evitar duplicidade e saber quais serviços estão disponíveis, quais estão 
em desenvolvimento e quais estão em manutenção ou atualização. 
Aliás, manutenção é muito facilitada porque o software já foi construído em partes. Se 
precisar de manutenção corretiva numa parte, a correção fica imediatamente 
disponível para todos os serviços integrados ao serviço modificado. Isso oferece 
também agilidade ao negócio, porque sempre que surgir uma nova regra de negócio, 
ela vai estar disponível em todo o software, bastando ser implementada num serviço 
novo ou modificar um já existente. 
Os requisitos funcionais podem ser agrupados dentro de um serviço. Assim, um serviço 
oferece um conjunto de capacidades que fazem referência a uma parte do modelo de 
negócio. O conceito de granularidade é interessante nessa nova forma de projetar 
software. Cada problema ou funcionalidade fica dentro de um serviço, que pode ser 
inclusive constituído por serviços menores. Um cadastro de produtos pode ser feito 
buscando as características do produto no servidor do fornecedor, o preço unitário na 
NFe da compra do produto e a quantidade em estoque por leitura de código de barras. 
O cadastro fica decomposto em 3 serviços menores, mas disponível cada vez que se 
precise da funcionalidade cadastrar/atualizar produtos no software [1]. 
Essa implementação é facilitada pelos Web Services porque eles já possuem padrões 
largamente usados na indústria de software, como XML e AJAX e são feitos na forma 
de APIs, ou seja, já são formatados para passar informação e receber informação. Na 
SOA, existem 3 conceitos fundamentais: o provedor do serviço, que vai processar as 
requisições de serviço recebidas, o repositório de serviços, que mantém o catálogo dos 
serviços disponíveis atualizado e o cliente do serviço, que manda uma solicitação e 
recebe a informação que o serviço processou. Usando a tecnologia Web Services, que 
já existe, pode-se implementar SOA mais facilmente porque ela usa desses 3 princípios 
e possui os protocolos padrão para envio e recebimento de dados. 
, 
 
 
70 
 
6.3 Blockchain 
Bom, como o nome já diz, Blockchain é uma cadeia de blocos, onde bloco é um 
registro e a cadeia é a criptografia que liga um bloco no bloco anterior. Como é uma 
tecnologia distribuída, esses blocos estão disponíveis para todos que estão na cadeia, 
ou seja, falsificações são muito improváveis, já que existem várias cópias dos blocos, 
com vários usuários diferentes, com chaves de criptografia independentes. 
O Blockchain é, então, um conjunto de registros contábeis públicos e distribuídos, 
transparentes,imutáveis e sincronizados [2]. A implementação de Blockchain mais 
conhecida é o Bitcoin. Bitcoin é uma criptomoeda, isto é, moeda criptografada e 
descentralizada. Não existe um país e nem mesmo um banco por trás do Bitcoin. Ele é 
composto de 4 elementos: 
 Uma rede peer-to-peer descentralizada (o protocolo bitcoin); 
 Um registro público de transações (o blockchain); 
 Uma emissão de moeda descentralizada, baseada em matemática; 
 Um sistema de validação das transações (o script de transação) [3]. 
A grande novidade é o Blockchain. Vamos ilustrar com um problema da teoria da 
computação chamado de Generais Bizantinos. Imagine que vários generais estejam no 
topo de montanhas e precisam atacar seu inimigo que está no vale. Para o ataque ser 
bem-sucedido, precisa ser feito simultaneamente. O problema está justamente em 
sincronizar o ataque. Seria necessário enviar um mensageiro para cada outro general. 
Os mensageiros precisam ou trazer a informação de volta ou um novo mensageiro 
precisaria ser enviado para saber se o mensageiro anterior chegou. Existe ainda a 
possibilidade de um general (ou mais) trair os demais e passar informações diferentes 
para mensageiros diferentes. O Blockchain resolve esse problema. É um registro 
público, descentralizado, e por isso, disponível para todos ao mesmo tempo. É seguro, 
porque é criptografado e existem várias cópias com usuários diferentes. Quando você 
tenta mudar um registro, ele é invalidado porque a outra cópia não foi alterada e a 
cópia original substitui sua alteração. Sendo assim, o Blockchain pode ser usado para 
uma série de aplicações e não apenas aplicações financeiras. [2] 
, 
 
 
71 
 
Imagine que a empresa tenha uma entrega que precisa ser feita. Um registro através 
de Blockchain pode ser criado. Qualquer caminhoneiro pode baixar esse registro e 
aceitar a tarefa. Após a entrega realizada, o cliente e a empresa recebem um registro 
(blockchain) da hora em que a entrega foi feita, e o caminhoneiro é pago, gerando 
outro registro (blockchain de novo) que finaliza o contrato (temporário) entre a 
empresa e o entregador. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Fonte: adaptado de LYRA [2]. 
Figura 6.1 – Esquematização do funcionamento do Blockchain 
1. Um nodo desbloqueia os fundos de seu 
endereço com a senha única. Cria uma hash de 
transação com dados do endereço receptor e a 
quantidade de tokens a ser enviada. 
5. Sendo consolidada e reconhecida 
pela rede, a transação chega ao 
endereço receptor. 
4. O bloco, ao ser fechado, envia à 
rede as transações validadas e os 
ledgers são atualizados. 
3. A hash de transação válida 
chega ao bloco em formação 
e que consolida a transação. 
2. Os nodos da rede verificam nos 
seus ledgers se há transação 
anterior que valide o envio da 
quantidade de tokens da 
transação atual. 
, 
 
 
72 
 
A emissão de um registro precisa ser verificada por outros usuários e só se for validada 
é que os registros, chamados ledgers (livro contábil), são atualizados para refletir a 
nova transação. 
6.4 Big Data 
Em síntese, Big Data é uma abordagem que analisa e procura extrair informação de um 
conjunto de dados complexo e bem grande, que um software tradicional não é capaz 
de fazer. Quando falamos aqui de um conjunto de dados bem grande, imagine a 
quantidade de posts gerados no Facebook, no ano de 2019, em todo o mundo. É desse 
conjunto de dados que o Big Data se propõe a extrair informação útil para o negócio. 
Esses dados não estão lá organizados, e nem no mesmo idioma. Estão espalhados em 
vários perfis diferentes, possuem formatos diferentes (texto, foto, vídeo, áudio) e não 
existe uma classificação para eles. Até usamos o “#” (hashtag). Contudo, isso não 
significa classificação, pelo menos, não para uma aplicação de software tradicional. 
Para encarar o desafio chamado Big Data, precisamos de uma nova forma de 
engenheirar a aplicação. Big Data não tem só a ver com tamanho. É também 
velocidade. A cada minuto temos 87,5 mil “tweets” gerados. A cada minuto! Some a 
isso 188 milhões de e-mails e 18 milhões de textos no Whatsapp. A cada minuto US$ 1 
milhão é gasto pelas pessoas no comércio eletrônico. Além de muito grande, a base de 
dados atualiza muito rápido. 
E há ainda outra vertente do Big Data que diz respeito à veracidade da informação. Se 
você postar no Twitter dizendo que gosta de amarelo, realmente gosta de amarelo? E 
tudo isso não tem importância se não agregar valor para a empresa, se não alavancar 
novos negócios ou analisar tendências. Senão não há justificativa para os 
investimentos feitos para processar o Big Data. É necessário agregar valor. 
Entretanto, os dados do Big Data não precisam vir necessariamente da Internet. No 
Brasil, um supermercado começou a disponibilizar wi-fi nas suas lojas, através de seu 
aplicativo. Dessa forma, espera não só saber quantos clientes estão na loja, mas quais 
clientes, o que estão comprando, e principalmente, o que não encontraram na loja. 
Com base na análise dessas informações, é possível planejar o estoque e manter 
, 
 
 
73 
 
apenas produtos que vendem. Também é possível mover o estoque de uma loja para a 
outra, aumentando a disponibilidade dos produtos mais vendidos. Imagine que o 
supermercado saiba que fará calor na terça-feira. Produtos gelados, como sorvete, vão 
estar com alta demanda. E se você souber que amarelo é a cor da moda, pode 
aumentar a oferta de produtos nessa cor. 
Uma ferramenta de BI (Business Intelligence) analisa dados históricos dos sistemas 
tradicionais da empresa. Big Data analisa qualquer dado que faça sentido ser analisado 
e possa gerar valor. Porém, como fazer o Big Data acontecer? 
Não bastam ferramentas de captura da informação e grande capacidade de 
processamento. A empresa precisa mudar sua percepção do negócio. Novas regras de 
negócio precisam ser criadas e estar disponíveis. É aí onde entra a Engenharia de 
Software. Mudanças nas aplicações atuais precisam ser feitas de forma ágil. Processos 
de negócio precisam responder a essas novas informações de forma muito rápida, de 
preferência automatizada. Os algoritmos nos softwares precisam tomar decisões em 
conjunto com as pessoas. 
6.5 Inteligência Artificial 
E falando em tomada de decisão, nosso último subtema é Inteligência Artificial. Para 
começar a falar nesse assunto, primeiro queremos que você tire a imagem do robô 
malvado destruindo a humanidade. A realidade é bem diferente dos filmes. A 
Inteligência Artificial (IA) é bem decepcionante nesse ponto. São algoritmos que 
tomam decisões baseadas em estatísticas armazenadas após milhões de tentativas e 
erros em ambiente simulado. 
Inteligência artificial é a capacidade de uma máquina simular a inteligência humana. 
Isso significa aprender com a experiência e se ajustar conforme novas informações. 
Isso vai de sistemas que preveem o comportamento das ações na bolsa de valores até 
carros que dirigem sozinhos. Atualmente, estamos na onda dos sistemas que 
conversam com você. Essa é uma área da IA chamada de processamento de linguagem 
natural, ou seja, a capacidade de entender o que dizemos e reagir de acordo. 
, 
 
 
74 
 
Sistemas especialistas nem são tão novos assim. O conceito da IA também não é 
exatamente uma novidade. A diferença é que o hardware agora ficou bastante 
poderoso. Um smartphone é capaz de processar o que você diz, mas antes essa 
capacidade de processamento só estava disponível em computadores bem grandes. 
Para software de IA, é preciso uma nova abordagem da Engenharia de Software. É 
necessário pensar nos requisitos como se fossem regras para a IA aprender. Quando 
você projeta um software que não tem mais interface gráfica, mas sim uma interface 
de voz, o Software precisa se comportar de maneira diferente. É necessário descrever 
o que está acontecendo e pedir comandos claros para o humano. Talvez a Engenharia 
de Software ainda não tenhapensado em normas para isso. Os monitores estão aí a 50 
anos. Contudo, a interface de voz está chegando agora. 
Aplicações para carros autônomos e aspiradores de pó necessitam de velocidade nas 
decisões, assim como as aplicações de reconhecimento facial e interpretação de 
imagens. Existem hoje sistemas de IA que detectam tumores em estágios iniciais de 
formação antes que os médicos possam perceber a presença deles nas imagens. Isso 
só é possível com muito treino. Uma IA precisa de treinamento. A diferença é que o 
que um humano leva 20 anos para aprender, a IA aprende em 20 dias. 
Para um sistema computacional aprender e entender o mundo como o ser humano faz 
é um desafio muito grande. Imagine uma criança que está aprendendo a andar. Ela 
precisa aprender a controlar sua musculatura e movimentar esses músculos de forma 
sincronizada, para não cair. Aprendemos isso porque temos dentro da cabeça uma 
rede neural, um conjunto enorme de microprocessadores que se comunicam e trocam 
informação entre eles. Nosso cérebro é mais que um computador. O computador é 
milhões de vezes mais rápido, mas nós temos os neurônios. Os desafios para projetar 
software inteligente começam em como representar o conhecimento. Como você 
aprendeu a usar talheres para comer? Como ensinar um robô a fazer isso? 
Imagine ensinar uma máquina a falar. Ela precisa aprender os sotaques, as gírias, as 
ironias e outras figuras de linguagem para se comunicar conosco como uma pessoa 
faria. Isso precisa de treino. Não basta carregar o dicionário na memória. Outro desafio 
, 
 
 
75 
 
é fazer a máquina perceber o ambiente. Nós não colocamos a mão no fogo porque 
percebemos seu calor, sabemos a dor que é uma queimadura. A máquina não sabe 
nem uma coisa e nem outra. Uma série de sensores precisa dar informação para que 
seu aspirador não caia da escada e quebre. O processo de aprendizado envolve lógica, 
modelos estatísticos, classificação de informação, estabelecimento de padrões e 
validação. Um humano precisa dizer para a máquina o que ela acertou e o que ela 
errou. Pelo menos nos estágios iniciais do treino. 
Considere um carro autônomo. Há um conjunto de regras predefinidas e claras. Como 
acelera o carro, como freia e o que fazer se o sinal está vermelho. Para saber se o 
semáforo está fechado ou não, é necessário algum tipo de sensoriamento. Uma 
câmera, por exemplo. Imagine a velocidade que o computador do carro precisa ter 
para, em tempo real, processar as imagens recebidas da câmera. Reconhecer que há 
um semáforo na imagem, reconhecer que o semáforo está fechado. Nós processamos 
imagens muito rapidamente, afinal é um traço evolutivo. Reconhecer ameaças nos faz 
sobreviver. Nós também temos percepção de quando o carro está derrapando, se há 
pedestres atravessando fora da faixa. Um carro que freia de repente nos faz reagir. O 
recurso computacional embarcado precisa ser poderoso o suficiente. O software do 
carro precisa ser bem escrito não para prever cada coisa que pode acontecer, mas para 
evoluir em função das diferentes situações que o carro enfrenta. Se você não dirigiu na 
neve ainda, é uma experiência que você não passou e não aprendeu. O carro a mesma 
coisa. 
Sistemas de IA são ótimos para identificar padrões. Juntando processamento de 
linguagem natural com Big Data e reconhecimento de imagens, temos uma ferramenta 
que pode ser muito interessante para os negócios. Especificamos qual o padrão que 
queremos encontrar e deixamos a IA processar esse volume todo de informação com 
velocidade, e aprender como detectar os padrões de forma mais eficiente. Isso já está 
acontecendo. Vamos começar a criar IAs que farão previsões de venda e com base 
nisso, ajustar o estoque e fazer as compras. 
 
, 
 
 
76 
 
Conclusão 
Como vimos neste bloco, novas tecnologias estão mudando os paradigmas da 
Engenharia de Software, apresentando novos desafios e novas oportunidades. Temos 
que levar em conta toda essa variedade de novas tecnologias e outras mais que não 
abordamos aqui, como IoT, a Internet das Coisas. Desde software distribuído até criar 
softwares que ainda não têm modelagem definida, precisamos pensar na Engenharia 
de Software de forma diferente, mais ampla, mais adaptativa. 
Com certeza, novos padrões e novos modos de trabalhar a Engenharia de Software 
irão aparecer e impulsionar o desenvolvimento da área com mais rapidez. Vamos 
pensar de forma integrada. O que acontece quando a IA passa a ser um serviço, que 
pode ser integrado ao software tradicional da empresa? Temos a oportunidade para 
quebrar os modelos atuais e criar novos. Coisas que ainda não estão sendo feitas. Usar 
Blockchain para validar os padrões encontrados pela IA para aprender o que fazer com 
o Big Data e oferecer a informação resultante como um serviço, através de um modelo 
de assinatura. 
Essas ideias precisam ser pensadas, estruturadas e novos modelos na Engenharia de 
Software precisam surgir para ajudar a se criar softwares mais confiáveis, de 
qualidade, que possam lidar com as novas possibilidades que a tecnologia tem 
apresentado. A Engenharia de Software ainda vai evoluir bastante. 
 
REFERÊNCIAS 
[1] THOMAS, Erl. SOA: princípios de design de serviços. Pearson, 2013. Disponível na 
Biblioteca Virtual. 
[2] LYRA, João G. Blockchain e Organizações Descentralizadas. Brasport, 2019. 
Disponível na biblioteca virtual. 
[3] ANTONOPOULOS, Andreas M. Mastering Bitcoin: unlocking digital 
cryptocurrencies. Sebastopol. CA: O'Reilly Media, 2014. 
[4] TAURION, Cesar. Big Data. Brasport, 2019. Disponível na biblioteca virtual. 
, 
 
 
77 
 
[5] SALESFORCE. O que é SaaS? Disponível em: 
<https://www.salesforce.com/br/saas/>. Acesso em: 22 jan. 2020. 
 
https://www.salesforce.com/br/saas/

Mais conteúdos dessa disciplina