Escolar Documentos
Profissional Documentos
Cultura Documentos
CADERNO 1
INTRODUÇÃO À ENGENHARIA DE
SOFTWARE
1º Edição - 2021
NOTA SOBRE ESTA EDIÇÃO
O conhecimento recolhido neste caderno origina-se dos livros clássicos e introdutórios de Engenharia
de Software, de publicações científicas produzidas pela comunidade nacional e internacional de
computação, de publicações técnicas oriundas de empresas e associações de software, das pesquisas
em Engenharia de Software conduzidas na própria UTFPR e da experiência do autor atuando no
mercado de desenvolvimento software e como pesquisador. Destaca-se, como fonte de informação,
o SWEBOK V3.0 – Guide to the Software Engineering Body of Knowledge (Swebok, 2014).
Trata-se de um documento produzido pelo IEEE Computer Society com uma grande reputação na
definição dos conhecimentos fundamentais e consolidados da área de engenharia de software.
Neste primeiro caderno, aborda-se uma introdução à Engenharia de Software. O objetivo é apresentar
ao leitor uma visão precisa do que representa esta área de conhecimento, sua importância e problemas
existentes, de forma a desenvolver no leitor uma capacidade crítica sobre o tema. Uma atenção
especial é dada pelo autor a este caderno pelo fato de que a Engenharia de Software é, frequentemente,
mal entendida por profissionais de outras áreas, levando a um mal aproveitamento de seu potencial
em empreendimentos de desenvolvimento de sistemas de computação.
CADERNO 1
INTRODUÇÃO À ENGENHARIA
DE SOFTWARE
“Bill Curtis has said that in a room full of expert software designers,
if any two agree, that’s a majority!” (Glass, 2001).
Em 2018 comemoramos o 50o aniversário da Engenharia de Software, demonstrando que essa não é,
exatamente, uma nova área de conhecimento. Mesmo com esta história de décadas, a compreensão
sobre seu real significado e papel nem sempre estão claros para todos os profissionais de computação
e de outras áreas relacionadas, levando a um mal uso de suas potencialidades.
Neste caderno, busca-se apresentar os conceitos fundamentais de Engenharia de Software para que o
leitor adquira uma clareza sobre o tema, podendo tirar o melhor proveito desta área de conhecimento,
mas, também, tendo ciência das limitações existentes. Leituras complementares são recomendadas ao
longo do texto para os leitores que desejem esclarecer ou estender o estudo.
O termo “software” foi cunhado por um dos mais renomados estatísticos americanos,
chamado John Wilder Tukey, em 1958. Ele foi professor na Universidade de Princeton e
pesquisador nos Laboratórios Bell da AT&T, tendo desenvolvido teorias sobre análise de
dados e computação de séries de dados. Já neste ano, Tukey afirmava que “Hoje, é (o
software) no mínimo tão importante quanto o hardware de válvulas, transistores, fios, fitas e
similares.”, destacando o papel determinando que o software já representava.
Nos dez anos a seguir, a computação continuou a evoluir rapidamente e a demanda por
software se acelerou ainda mais. As empresas passaram a buscar cada vez mais softwares e
com funções cada vez mais extensas e complexas. Criou-se, assim, uma grande pressão sobre
a jovem indústria de software, o que revelou graves problemas na capacidade de produzir
software na época. A esta dificuldade em escrever programas computacionais úteis e
eficientes dentro dos prazos e orçamentos requeridos deu-se o nome de “Crise de Software”
ou, ainda, “Software Gap”. Este termo foi cunhado pelos participantes da primeira NATO
Software Engineering Conference ocorrida em 1968 na Alemanha (Report NATO, 1968)
(ilustração na figura a seguir).
Todos estes problemas mostram que se estava um momento grave no final dos anos 60. Além
das tecnologias terem muitas limitações, a indústria de software era pouco profissional e,
assim, tinha dificuldade em atender as demandas de um marcado em franco crescimento.
Além dos problemas citados, surgia um outro grave problema ou, na verdade, se agravava
um problema existente, que era consequência dos demais: a industrial de software não era
capaz de gerar uma oferta de software que atendesse a demanda existente e crescente.
Para fazer frente às dificuldades existentes e que caracterizaram a “crise de software”, foi
idealizada a Engenharia de Software. Esta nova engenharia foi “oficializada” na conferência
da NATO realizada em 1968, citada anteriormente.
Embora alguns cursos de graduação incluam a Engenharia de Software como uma ou mais
matérias de sua grade curricular, ela não é meramente uma disciplina. A existência destas
matérias em cursos de computação é justificada, uma vez que todo desenvolvedor de software
deveria ter conhecimento dos fundamentos de Engenharia de Software para poder aplicá-los
em suas atividades. A Engenharia de Software também não deve ser confundida com uma
“atividade” que é realizada durante um desenvolvimento de software. Inclusive, não é
incomum ouvir-se, inapropriadamente, referências como “na primeira fase do projeto vamos
fazer a engenharia de software e depois ...”. Este tipo de interpretação, possivelmente, vem
de uma visão fragmentada da Engenharia de Software, focando algumas atividades
características com a modelagem e especificação, e entendendo que ela se limita a isso.
Na verdade, a Engenharia de Software é bem mais do que uma matéria ou atividade. Ela é
uma área inteira de conhecimento, ou seja, ela existe por si própria, como um condensado
coeso de conhecimentos, uma formação e atividade profissional específicas.
• Área de conhecimento
Até os anos 90, Engenharia de Software ainda era considerada um conjunto de técnicas
recomendadas para enfrentar os problemas encontrados pelos desenvolvedores. Na década
de 90, começou-se a enxergar a Engenharia de Software como uma área de conhecimento
• Engenheiro de software
O profissional que exerce a Engenharia de Software, pois seguiu uma formação específica
nesta área de conhecimento, denomina-se “Engenheiro de Software”. Entretanto, não é
incomum que empresas e outras instituições façam um uso mais “popular” desta
denominação, fazendo referência a desenvolvedores com outras formações em computação
(ou até sem formação superior) como se fossem engenheiros de software também ou como
se esse fosse um cargo (e não uma formação). Talvez, elas procurem, com isso, valorizar ou
modernizar determinado cargo ou função em computação. Entretanto, dado que existe
oficialmente a formação superior em Engenharia de Software no Brasil (reconhecida pelo
MEC, SBC e CREA), esse uso popular da denominação de engenheiro de software é
incorreto e deveria ser evitado, inclusive para se evitar o mal entendimento desta
denominação e confusão com relação às atribuições deste profissional.
O valor do software está diretamente relacionado como sua importância ou impacto para
quem o utiliza ou dele se beneficia. Na esfera de uso pessoal, é flagrante o quanto o uso de
diferentes softwares faz parte do cotidiano atual de uma grande parte da humanidade. Por
meio do uso de PCs, notebooks, tablets e smartphones, usuários pessoais utilizam dezenas de
softwares no seu cotidiano agilizando atividades (e.g. movimentações bancárias, acesso a
serviços como transporte e compras), controlando tarefas ou obrigações (e.g., contas a pagar,
finanças e agenda), interagindo com outras pessoas (e.g., troca de mensagens, inter-
relacionamentos, bate-papo, posts) e se entretendo (e.g., games, músicas, vídeos). No âmbito
empresarial, as aplicações de software são incontáveis abrangendo a gestão da empresa,
atividades de marketing e comercial, além das ferramentas ligadas às atividades produtivas,
de todos os tipos e nas mais diversas áreas de atividade comercial, de serviços e industrial.
Pode-se afirmar que empresas deficitárias de software são empresas em desvantagem
marcante frente a seus concorrentes, pois não conseguem alcançar o mesmo desempenho,
qualidade e agilidade. Destacam-se, também, no setor empresarial, as instituições financeiras
que desde cedo buscaram a informatização de seus serviços. Estas instituições operam,
basicamente, com informações em grandes volumes e, atualmente, elas são completamente
inviáveis sem o uso maciço de software. No setor governamental, vê-se, também, grandes
investimentos em desenvolvimento contínuo de novos softwares para melhorar o controle e
eficiência dos serviços públicos. A maior parte das operações tributárias, por exemplo, é
informatizada no Brasil, desde a emissão de notas e cupons fiscais interligados em tempo
real com os servidores da receita estadual e federal, até os controles de declarações de
BAIXA PRODUTIVIDADE
Apesar dos avanços, o desenvolvimento de software continua a ser uma atividade difícil
intelectualmente para o ser humano e que exige grande esforço, concentração e talento dos
profissionais. A concepção de soluções, a criação de arquiteturas para as soluções que
otimizem a estrutura e forma de operação do software, a elaboração da lógica e, por
consequência, dos algoritmos necessários à realização das tarefas desejadas e a codificação
dos programas continuam a ser atividades árduas que exigem um tempo considerável de
reflexão e síntese. Cada novo componente, função ou instrução afeta o conjunto do software,
criando interdependências e alterando a dinâmica do software. Assim, o profissional de
desenvolvimento precisar continuamente atento à medida que constrói a solução e define sua
estrutura e lógica de operação. Como consequência destas dificuldades, o desenvolvimento
de software é lento, levando a uma baixa produtividade pois cada desenvolvedor produz
poucas dezenas de linhas de código (i.e., linhas especificadas, projetadas, programadas e
testadas) por dia.
PRAZOS LONGOS
Dado que o desenvolvimento de software é uma tarefa relativamente lenta (i.e., de baixa
produtividade), o tempo de desenvolvimento tende a ser, naturalmente, longo. Se um
desenvolvedor produz poucas dezenas de linhas por dia e se o software pretendido possuirá
dezenas ou centenas de milhares de linhas, é fácil perceber que os empreendimentos
facilmente se estendem por muitos meses ou anos. Uma alternativa, visando encurtar os
prazos, seria aumentar o número de profissionais na equipe, de forma que mais pessoas,
produzindo pouco cada uma, gerem muitas linhas de código ao final. Na verdade, essa é a
única alternativa para enfrentar este problema de prazos longos. Porém, esta estratégia
merece atenção, pois o incremento de mais profissionais não aumenta proporcionalmente a
produção de software. Há, inclusive, uma frase ilustrativa que diz que “Nove mulheres não
fazem um bebê em um mês.”. O fato é que aumento da equipe gera dificuldades crescentes
de comunicação, sincronização e gerenciamento dos trabalhos das pessoas, reduzindo a
produtividade de cada indivíduo. A tabela a seguir ilustra, com dados de um estudo feito pela
IBM, o impacto da ampliação da equipe de desenvolvimento na produtividade dos
desenvolvedores. Embora a ampliação da equipe seja uma alternativa possível para redução
de prazo, deve-se cuidar de bem balancear o tamanho máximo da equipe e bem organizar a
distribuição e controle das atividades realizadas por todos para que a produtividade média
seja razoável.
ALTOS CUSTOS
Embora altos preços possam representar um grande atrativo para a indústria de software e
profissionais envolvidos, há consequências muito negativas nesta questão. Quanto maior o
custo de um software, mais difícil se torna a aquisição pelos consumidores e, por
consequência, menos consumidores são capazes de adquirir o software. Assim, softwares
mais caros são limitados a consumidores com maior poder aquisitivo, como grandes
empresas, criando uma espécie de “elitização de software”. Empresas menores, com menor
capacidade de investimento, tendem a não serem capazes de se equipar com software de
gestão, de produção e, mesmo, softwares embarcados em seus produtos, dos quais
precisariam para crescer ou competir em boas condições no mercado. De forma análoga, na
esfera governamental, cidades, estados e nações com menor capacidade de investimento,
também, sofrem com a falta de software, incapazes de adquirirem ou desenvolverem
softwares que agilizem e deem confiabilidade e eficiência aos serviços públicos realizados.
Desta forma, pode-se afirmar que o alto custo de software tem sido um impeditivo para
acelerar a modernização, ampliar a eficiência e melhorar a qualidade de vida na sociedade
atual.
No passado, a existência de falhas (ou seja, baixa qualidade) nos softwares utilizados pelas
pessoas e empresas era, até certo ponto, tolerada, dada a “urgência” que se tinha em utilizá-
los. Também, o senso crítico não era tão bem desenvolvido nos consumidores, que
consideravam que algumas falhas de software seriam “normais”, pois software era algo ainda
recente e se entendia que em novas versões dos produtos as falhas seriam corrigidas.
Gradualmente, os consumidores foram se tornando mais exigentes e críticos com relação à
qualidade dos softwares entregues. Atualmente, falhas de software não mais toleradas,
criando grande irritação nos usuários.
Desta forma, é fácil constatar que um software de maior qualidade significa um software cujo
desenvolvimento é mais longo e cujo custo é maior. Ou seja, o consumidor que deseja
qualidade deverá pagar por esta qualidade. Existe uma relação não proporcional entre a
qualidade desejada para o software e o esforço de desenvolvimento (e, consequentemente,
seu custo), pois quanto maior o nível de qualidade desejado, muito maior será o custo do
produto. Como exemplo, no desenvolvimento de software aeronáutico considera-se que o
desenvolvimento de um software com qualidade máxima (em termos de segurança às
pessoas) exige um esforço (ou seja, tempo e custo) de oito vezes o que seria exigido para o
mesmo software com exigência mínima de qualidade (em termos de segurança). Neste setor,
a prática demonstrou que para garantir certo nível de qualidade é necessário investir o dobro,
triplo ou até oito vezes mais esforço no desenvolvimento pois o aumento do nível de
qualidade para um software reduz muito sua produtividade.
AUMENTO DA COMPLEXIDADE
Esta falta de mão de obra qualificada, não é exclusividade no Brasil. Países desenvolvidos
têm uma falta ainda maior de recursos humanos, pois eles possuem um rol ainda maior de
empresas de tecnologia e de desenvolvimento de software.
Dado que o crescimento demográfico está estagnado na maioria dos países desenvolvidos,
uma alternativa para fazer frente a falta de mão de obra no setor seria atrair pessoas de outras
áreas para atuar com tecnologias e, mais especificamente, com o desenvolvimento de
software. Outra alternativa, seria importar pessoas de outros países ou regiões.
A computação não nasceu como uma descoberta a partir de algum novo princípio. Na
verdade, ela foi construída, com os meios que se pode encontrar na época, visando atender a
uma necessidade muito significativa da época e que estava sobre grande pressão. Entre outras
necessidades de modernização de governos e grandes empresas, havia também a pressão do
pós-guerra nos anos 40. O conflito mundial mostrou o grande valor estratégico de se poder
dispor de informações de forma rápida para a tomada de decisões e do grande valor
operacional de se poder automatizar diferentes tipos de máquinas.
Um balanço feito em 1968 (The Crisis Report) mostrou que a oferta era muito deficitária
frente à demanda crescente e que o “problema” de não se conseguir ofertar software na
proporção da demanda existente no início da computação só se agravou nos anos 50 e 60,
levando a uma situação de crise. Podemos entender por “crise” uma situação em que um
“problema” persiste e só aumenta ao longo de um certo período de tempo.
Nos anos 2000, a situação geral se manteve com a demanda crescendo continuamente e de
forma mais acelerada do que a oferta, ampliando, ainda mais, o gap existente. Os avanços
em Engenharia de Software e nas tecnologias de computação não conseguiram apresentar
maneiras substancialmente mais eficientes de se produzir software em grande escala. Pode-
se, inclusive, afirmar que esta “corrida” está perdida, pois não se vê algum caminho viável
para aumentar a oferta de software por meio de um aumento expressivo da produtividade de
desenvolvimento. Talvez estejamos enfrentando hoje uma consequência de decisões do
Como mostra a figura 4, a perspectiva é que o gap continue a avançar gerando mais pressão
sobre a indústria de software. Sem uma solução à vista, poderíamos dizer que estamos em
uma situação de “a espera de um milagre” na computação e Engenharia de Software. Por
“milagre” quer-se dizer encontrar uma outra forma de computação e de desenvolvimento de
software que permite altíssima produtividade dos profissionais.
Em uma visão simplista, costuma-se considerar software como sendo apenas o código ou
programa que comanda a execução de tarefas em um computador. Muitas vezes, inclusive,
“software” e “programa” são usados como sinônimos. Podemos nos questionar, de imediato,
se estamos falando de código fonte ou código objeto. Qual dos dois é o software? Na verdade,
ambos, pois trata-se do mesmo conhecimento, mas em duas linguagens diferentes e um está
diretamente relacionado ao outro. Entretanto, o código fonte é uma propriedade da empresa
produtora e costuma ficar resguardado de acesso por terceiro pois representa um capital
intelectual da empresa, enquanto, em geral, o código executável é licenciado para uso pelos
clientes mediante algum contrato. Assim, em uma visão de sua composição, um software
pode ser definido como um conjunto de programas fonte e seus respectivos programas
executáveis. Porém, esta é uma muito limitada. Em uma visão mais ampla (i.e., em uma visão
de produto), um software pode ser composto por outros componentes (também denominados
artefatos), além de seus programas, conforme listado a seguir.
• Especificações
Em todo desenvolvimento de software existe um conhecimento crítico a ser
construído que é a análise e especificação dos propósitos do software. Este
conhecimento pode ser documentado de diferentes formas como em documentos de
visão do produto e de especificação de requisitos. Estes documentos são parte
integrante de um software, pois, sem eles, o entendimento, a justificativa e parte da
existência do software se perde.
• Registros de PI e Marcas
Dado que um software pode representar um bem e pode ser inovador, é possível haver
registros de propriedade ou marcas associados diretamente a ele e que fazem parte do
produto.
Uma outra forma de definir o que é um software seria explicar qual é seu papel ou sua
natureza em vez de citar sua composição. O termo software foi criado especificamente para
se referir aos programas que comandam as ações em um computador (ou seja, em um
equipamento eletrônico programável). Esse termo em inglês foi escolhido para fazer
oposição ao termo mais antigo “hardware” e que foi adotado em computação para se referir
à parte elétrica e eletrônica dos computadores. O prefixo “soft” em software se refere às
características de maleabilidade, flexibilidade ou remodelagem que se tem na programação
de computadores, pois softwares podem ser alterados ou substituídos mais facilmente se
comparados com o hardware de computadores. Assim, software seria a parte “maleável” dos
computadores, enquanto hardware representa a parte mais estável ou material de um
computador.
Os termos “logiciário” em português e “logiciel” em francês têm uma raiz interessante que é
o “logic”. Nas duas línguas desejou-se destacar essa correlação de software com lógica ou
com a parte lógica dos computadores. A lógica em computação pode ser entendida como o
raciocínio que governa alguma atividade e, portanto, pode-se entender que o software é quem
determinar esse raciocínio. Dizer que o software corresponde à parte lógica que define o que
um computador deve fazer se mostra como uma boa definição (melhor do dizer que é parte
maleável de computador). Além disso, deve-se lembrar que nem sempre a lógica que
comanda um computador é construída na forma de programas (i.e., conjunto de instruções
usando alguma linguagem de programação). Por exemplo, a tecnologia de lógica
configurável (e.g., FPGA) permite definir circuitos que comandam a lógica de
funcionamento de computadores (sem haver programas). Porém esse circuito seria
equivalente ao que um software faria se fosse utilizado um microprocessador e programas.