Prévia do material em texto
1
ENGENHARIA E QUALIDADE DE SOFTWARE
1
SUMÁRIO
1. INTRODUÇÃO ..................................................................................................... 4
1.1 Engenharia de Software ................................................................................. 4
1.1.1 Importância dos métodos de desenvolvimento de software .................... 6
1.2 Ciclo de Vida do Software .............................................................................. 7
1.2.1 Fase de definição ..................................................................................... 8
1.2.2 Fase de desenvolvimento ........................................................................ 8
1.2.3 Fase de operação .................................................................................... 9
1.2.4 Fase de retirada ..................................................................................... 10
2. A ESTRUTURA DO PROCESSO DE SOFTWARE ........................................... 10
2.1 Modelos de Processo ................................................................................... 11
2.1.1 O modelo cascata .................................................................................. 12
2.1.2 Modelo Incremental ............................................................................... 13
2.1.3 Prototipação evolutiva ............................................................................ 14
2.1.4 Modelo espiral ....................................................................................... 14
2.1.5 Modelo V................................................................................................ 15
2.2 Desenvolvimento Ágil ................................................................................... 16
2.3 Agilidade e Custo das Mudanças ................................................................. 16
2.4 Processo Ágil ............................................................................................... 17
2.4.1 Princípios da agilidade ............................................................................... 17
2.5 Aspectos Humanos da Engenharia de Software e Características .............. 18
2.6 Psicologia da Engenharia de Software ........................................................ 19
3. QUALIDADE DE SOFTWARE E GESTÃO DE PROJETOS ............................. 20
3.1. O Espectro de Gerenciamento ..................................................................... 20
3.1.1 Pessoas ..................................................................................................... 20
3.1.2 Produtos .................................................................................................... 21
3.1.3 Processo .................................................................................................... 21
3.1.4 Projeto ....................................................................................................... 21
3.2 Métricas de Processo ................................................................................... 22
3.2.1 Aperfeiçoamento do processo de software ............................................ 22
3.3 Estimativas de Projeto de Software .............................................................. 23
3.3.1 Escopo ....................................................................................................... 24
3.4 Recursos ...................................................................................................... 24
3.5 Técnicas de Decomposição ......................................................................... 25
2
3.5.1 Estimativa baseada em linhas de código (LOC) .................................... 26
3.5.2 Estimativa baseada em pontos de função (FP) ..................................... 26
3.6 Método COCOMO(Constructive Cost Model)............................................... 28
3.7 Cronograma de Projetos .............................................................................. 29
CONSIDERAÇÕES FINAIS ...................................................................................... 31
REFERÊNCIAS BIBLIOGRÁFICAS ......................................................................... 32
3
NOSSA HISTÓRIA
A nossa história inicia com a realização do sonho de um grupo de empresários, em
atender à crescente demanda de alunos para cursos de Graduação e Pós-Graduação. Com
isso foi criado a nossa instituição, como entidade oferecendo serviços educacionais em nível
superior.
A instituição tem por objetivo formar diplomados nas diferentes áreas de
conhecimento, aptos para a inserção em setores profissionais e para a participação no
desenvolvimento da sociedade brasileira, e colaborar na sua formação contínua. Além de
promover a divulgação de conhecimentos culturais, científicos e técnicos que constituem
patrimônio da humanidade e comunicar o saber através do ensino, de publicação ou outras
normas de comunicação.
A nossa missão é oferecer qualidade em conhecimento e cultura de forma confiável e
eficiente para que o aluno tenha oportunidade de construir uma base profissional e ética.
Dessa forma, conquistando o espaço de uma das instituições modelo no país na oferta de
cursos, primando sempre pela inovação tecnológica, excelência no atendimento e valor do
serviço oferecido.
4
1. INTRODUÇÃO
O software desempenha um papel fundamental em várias áreas de negócios
seja para controle e segurança de informações, controle de processos, apoio a
decisões como, também, entretenimento. Há 40 anos, o software começava a se
tornar complexo e com isso, problemas de qualidade e atendimento de prazos e
custos já eram apontados. Assim, nasceu a Engenharia de Software tratando o
software como um produto de engenharia para fazer frente aos novos desafios.
A Engenharia de Software abrange ferramentas de apoio para as atividades,
métodos para orientar a realização das atividades, processo para definir as atividades
e os produtos e a qualidade de processo e de produto de software. Dessa maneira o
desenvolvimento de software pode obter produtos com qualidade e produtividade.
1.1 Engenharia de Software
O conceito “Engenharia de Software” foi cunhado em 1969 por Fritz Bauer em
uma conferência patrocinada por um Comitê de Ciência da Organização do Tratado
do Atlântico Norte (Otan), no momento em que a chamada crise do software precisava
de uma solução para a demanda crescente por software, dentro de custo e prazo
adequados.
Nessa época, a crise foi identificada pela preocupação crescente na
comunidade de software com a quantidade de defeitos, entregas fora de prazo e altos
custos do software. De acordo com vários relatos, Fritz Bauer teria dito:
“A Engenharia de Software é o estabelecimento e uso de sólidos princípios de
engenharia a fim de obter um software que seja confiável e que funcione de forma
econômica e eficiente em máquinas reais.”
É importante notar que a Engenharia de Software segue os mesmos princípios
de uma disciplina de engenharia tradicional, baseada em uma relação adequada de
custo/benefício do produto, que não falhe e que seja eficiente. Outras definições
podem ser encontradas nas normas da IEEE (Institute of Electrical and Electronics
Engineers) dos Estados Unidos, onde a Engenharia de Software é:
a) a aplicação de uma abordagem sistemática, disciplinada e quantificável
para o desenvolvimento, a operação e manutenção de software;
5
b) o estudo de abordagens como descrito em (a).
Fritz Bauer também declarou que os sistemas deveriam ser construídos em
níveis e em módulos, que formam uma estrutura matemática. De certa maneira, a
Engenharia de Software tem evoluído nesta linha e, atualmente, segundo Pressman,
ela pode ser maisbem entendida como uma tecnologia em camadas ou níveis,
conforme pode ser vista na Figura 1.1.
FIGURA 1.1 Camadas da Engenharia de Software
A engenharia de software é uma tecnologia em camadas. Como ilustra a
Figura 1.1, qualquer abordagem de engenharia (inclusive engenharia de software)
deve estar fundamentada em um comprometimento organizacional com a qualidade.
A gestão da qualidade total promove uma cultura de aperfeiçoamentos contínuo de
processos, e é essa cultura que, no final das contas, leva ao desenvolvimento de
abordagens cada vez mais eficazes na engenharia de software. A pedra fundamental
que sustenta a engenharia de software é o foco na qualidade.
A base da engenharia de software é a camada de processos. O processo de
engenharia de software é a liga que mantém as camadas de tecnologia coesas e
possibilita o desenvolvimento de software de forma racional e dentro do prazo. O
processo define uma metodologia que deve ser estabelecida para a entrega efetiva
de tecnologia de engenharia de software. O processo de software constitui a base
para o controle do gerenciamento de projetos de software e estabelece o contexto no
qual são aplicados métodos técnicos, são produzidos artefatos (modelos,
documentos, dados, relatórios, formulários etc.), são estabelecidos marcos, a
qualidade é garantida e mudanças são geridas de forma apropriada.
6
Os métodos da engenharia de software fornecem as informações técnicas
para desenvolver softwares. Os métodos envolvem uma ampla variedade de tarefas,
que incluem: comunicação, análise de requisitos, modelagem de projeto, construção
de programa, testes e suporte. Os métodos da engenharia de software se baseiam
em um conjunto de princípios básicos que governam cada área da tecnologia e
incluem atividades de modelagem e outras técnicas descritivas.
As ferramentas da engenharia de software fornecem suporte automatizado ou
semiautomatizado para o processo e para os métodos. Quando as ferramentas são
integradas, de modo que as informações criadas por uma ferramenta possam ser
utilizadas por outra, é estabelecido um sistema para o suporte ao desenvolvimento de
software, denominado engenharia de software com o auxílio do computador.
1.1.1 Importância dos métodos de desenvolvimento de software
A importância dos métodos de desenvolvimento de software advém do fato de
que eles definem, por meio de suas notações, um canal de comunicação uniforme
entre os membros da equipe de desenvolvimento. Também, os métodos estabelecem
produtos de trabalho padronizados que facilitam as atividades de manutenção de
software. Além disso, permitem que novos colaboradores sejam treinados melhorando
a qualidade do software. Os métodos podem ser usados como referência para a
escolha e aquisição de ferramentas CASE (do inglês Computer-Aided Software
Engineering, é uma classificação que abrange todas as ferramentas baseadas em
computadores que auxiliam atividades de engenharia de software, desde análise de
requisitos e modelagem até programação e testes) que podem dar maior
produtividade ao processo de desenvolvimento de software.
INFORMATIVO
A disciplina de Engenharia de Software é muito abrangente. Processos,
métodos, técnicas e ferramentas têm sido propostos com frequência. Esta
contínua evolução da Engenharia de Software aponta para a necessidade
de melhorar as abordagens atuais para produzir softwares cada vez mais
complexos com qualidade e produtividade.
7
Tais métodos vêm sendo desenvolvidos desde o início da definição da
Engenharia de Software e, atualmente, muitos desses métodos estão consolidados
na comunidade de software. Atualmente, duas abordagens são reconhecidas:
Estruturada e Orientada a Objetos, que são discutidas no próximo tópico.
1.2 Ciclo de Vida do Software
Todo projeto de software começa por alguma necessidade do negócio, a
necessidade de corrigir um defeito em uma aplicação existente. Para entender de
software precisamos analisar as características do software que o tornam diferente de
outras coisas produzidas. O software é um elemento de um sistema lógico e não de
um sistema físico. Assim ele possui características que são consideravelmente
diferentes daquelas do hardware:
O Software é desenvolvido ou passa por um processo de engenharia; não é
fabricado no sentido clássico;
Software não se desgasta;
Apesar de a indústria estar se movendo em direção à montagem baseada em
componentes, a maior parte dos softwares continua a ser construída sob encomenda.
O ciclo de vida de um software descreve as fases pelas quais o software passa
desde a sua concepção até ficar sem uso algum. O conceito de ciclo de vida de um
software é muitas vezes confundido com o de modelo de processo. Existem várias
propostas e denominações para as fases do ciclo de vida de um software. Cada fase
inclui um conjunto de atividades ou disciplinas que devem ser realizadas pelas partes
envolvidas. Essas fases são:
SUGESTÃO DE LEITURA
BOURQUE Pierre, DUPUIS Robert, TRIPP Leonard L. Guide to the
software engineering body of knowledge – SWEBOK. USA: IEEE
Computer Society Press; 2004.
PFLEEGER Shari L. Software engineering: theory and practice. 2 New
Jersey: Prentice Hall; 2001.
8
Definição
Desenvolvimento
Operação
Retirada
1.2.1 Fase de definição
A fase de definição do software ocorre em conjunto com outras atividades como
a modelagem de processos de negócios e análise de sistemas. Nesta atividade, se
concentra a busca pelo conhecimento da situação atual e a identificação de problemas
para a elaboração de propostas de solução de sistemas computacionais que resolvam
tais problemas.
Profissionais de engenharia de software atuam nesta atividade com o objetivo
de identificar os requisitos de software e modelos de domínio que serão utilizados na
fase de desenvolvimento.
1.2.2 Fase de desenvolvimento
A fase de desenvolvimento ou de produção do software inclui todas as
atividades que tem por objetivo a construção do produto. Ela inclui principalmente o
design, a implementação e a verificação e validação do software.
A atividade de design compreende todo o esforço de concepção e modelagem
que têm por objetivo descrever como o software será implementado.
A implementação envolve as atividades de codificação, compilação, integração
e testes. A codificação visa traduzir o design num programa, utilizando linguagens e
ferramentas adequadas. A codificação deve refletir a estrutura e o comportamento
descrito no design. Os componentes arquiteturais devem ser codificados de forma
independente e depois integrados. Os testes podem ser iniciados durante a fase de
implementação. A depuração de erros ocorre durante a programação utilizando
algumas técnicas e ferramentas. É fundamental um controle e gerenciamento de
versões para que se tenha um controle correto de tudo o que está sendo codificado.
Verificação e validação destinam-se a mostrar que o sistema está de acordo
com a especificação e que ele atende às expectativas de clientes e usuários. A
9
validação visa assegurar se o programa está fazendo aquilo que foi definido na sua
especificação (fazendo a coisa certa).
Existem diferentes formas de verificação e validação. Inspeção analítica e
revisão de modelos, documentos e código fonte são formas que podem ser usadas
antes mesmo que o programa seja completamente codificado. Os testes de correção,
desempenho, confiabilidade, robustez, usabilidade, dentre outros, visam avaliar
diversos fatores de qualidade a partir da execução do software.
1.2.3 Fase de operação
A fase de operação envolve diferentes tipos de atividades:
Distribuição e entrega
Instalação e configuração
Utilização
Manutenção
A distribuição e entrega pode ser feita diretamente pelo desenvolvedor(em
caso de software personalizado), ou em um pacote a ser vendido em prateleiras de
lojas ou para ser baixado pela Internet (em caso de softwares genéricos).
O processo de instalação e configuração, normalmente, pode ser feito com a
ajuda de software de instalação disponibilizados pelos fabricantes dos ambientes
operacionais.
A atividade de utilização é o objeto do desenvolvimento do software. A
qualidade da utilização é a usabilidade do software.
A manutenção normalmente ocorre de duas formas: corretiva e evolutiva. A
manutenção corretiva visa a resolução de problemas referentes a qualidade do
software (falhas, baixo desempenho, baixa usabilidade, falta de confiabilidade, etc.).
A manutenção evolutiva ou adaptativa visa a produção de novas versões do software
de forma a atender a novos requisitos dos clientes, ou adaptar-se às novas tecnologias
que surgem (hardware, plataformas operacionais, linguagens, etc.). Mudanças no
domínio de aplicação implicam em novos requisitos e incorporação de novas
funcionalidades. Surgimento de novas tecnologias de software e hardware e
mudanças para uma plataforma mais avançada também requerem evolução.
10
1.2.4 Fase de retirada
A fase de retirada é um grande desafio para os tempos atuais. Diversos
softwares que estão em funcionamento em empresas possuem excelentes níveis de
confiabilidade e de correção. No entanto, eles precisam evoluir para novas
plataformas operacionais ou para a incorporação de novos requisitos. A retirada desse
software legado em uma empresa é sempre uma decisão difícil: como abrir mão
daquilo que é confiável e ao qual os funcionários estão acostumados, após anos de
treinamento e utilização?
Processos de reengenharia podem ser aplicados para viabilizar a transição ou
migração de um software legado para um novo software de forma a proporcionar uma
retirada mais suave.
2. A ESTRUTURA DO PROCESSO DE SOFTWARE
O processo de software está́ representado esquematicamente na Figura 2. De
acordo com a figura, cada atividade metodológica é composta por um conjunto de
ações de engenharia de software. Cada ação é definida por um conjunto de tarefas, o
qual identifica as tarefas de trabalho a ser completadas, os artefatos de software que
serão produzidos, os fatores de garantia da qualidade que serão exigidos e os marcos
utilizados para indicar progresso.
Uma metodologia de processo genérica para engenharia de software
estabelece cinco atividades metodológicas: comunicação, planejamento,
modelagem, construção e entrega. Além disso, um conjunto de atividades de apoio
é aplicado ao longo do processo, como o acompanhamento e controle do projeto, a
administração de riscos, a garantia da qualidade, o gerenciamento das configurações,
as revisões técnicas, entre outras.
11
Figura 2 - Uma metodologia do processo de software
2.1 Modelos de Processo
Um modelo de processo prescritivo concentra-se em estruturar e ordenar o
desenvolvimento de software. As atividades e tarefas ocorrem sequencialmente, com
diretrizes de progresso definidas. Mas os modelos prescritivos são adequados para o
mundo do software que se alimenta de mudanças? Se rejeitarmos os modelos de
processo tradicionais (e a ordem implícita) e os substituirmos por algo menos
estruturado, tornaremos impossível atingir a coordenação e a coerência no trabalho
de software?
12
Não há respostas fáceis para essas questões, mas existem alternativas
disponíveis para os engenheiros de software. Nas próximas seções, examinamos a
abordagem dos processos prescritivos, nos quais a ordem e a consistência do projeto
são questões predominantes. Chamamos esses processos de “prescritivos” porque
prescrevem um conjunto de elementos de processo: atividades metodológicas, ações
de engenharia de software, tarefas, artefatos, garantia da qualidade e mecanismos de
controle de mudanças para cada projeto. Cada modelo de processo também
prescreve um fluxo de processo (também denominado fluxo de trabalho) ou seja, a
forma pela qual os elementos do processo estão relacionados.
2.1.1 O modelo cascata
Há casos em que os requisitos de um problema são bem compreendidos,
quando o trabalho flui da comunicação à disponibilização de modo relativamente
linear. O modelo cascata, algumas vezes chamado ciclo de vida clássico, sugere uma
abordagem sequencial e sistemática para o desenvolvimento de software, começando
com a especificação dos requisitos do cliente, avançando pelas fases de
planejamento, modelagem, construção e disponibilização, e culminando no suporte
continuo do software concluído.
Figura 2.1.1 – Modelo Cascata
O modelo cascata é o paradigma mais antigo da engenharia de software.
Entretanto, ao longo das últimas quatro décadas, as críticas a este modelo de
processo fizeram até mesmo seus mais árduos defensores questionarem sua eficácia.
Entre os problemas às vezes encontrados quando se aplica o modelo cascata, temos:
13
Projetos reais raramente seguem o fluxo sequencial proposto pelo modelo.
Embora o modelo linear possa conter iterações, ele o faz indiretamente. Como
consequência, mudanças podem provocar confusão à medida que a equipe de projeto
prossegue.
Frequentemente, é difícil para o cliente estabelecer explicitamente todas as
necessidades. O modelo cascata exige isso e tem dificuldade para adequar a
incerteza natural existente no início de muitos projetos.
O cliente deve ter paciência. Uma versão operacional do(s) programa(s) não
estará disponível antes de estarmos próximos ao final do projeto. Um erro grave, se
não detectado até o programa operacional ser revisto, pode ser desastroso.
2.1.2 Modelo Incremental
Há várias situações em que os requisitos iniciais do software são
razoavelmente bem definidos; entretanto, o escopo geral do trabalho de
desenvolvimento, impede o uso de um processo puramente linear. Pode ser
necessário o rápido fornecimento de determinado conjunto funcional aos usuários
para, somente após esse fornecimento, refinar e expandir sua funcionalidade em
versões de software posteriores. Em tais casos, pode-se optar por um modelo de
processo projetado para desenvolver o software de forma incremental.
O modelo incremental combina os fluxos de processo linear e paralelo dos
elementos. Na Figura 2.1.2, o modelo incremental aplica sequências lineares de forma
escalonada, à medida que o tempo vai avançando.
Figura 2.1.2 – Modelo incremental
14
2.1.3 Prototipação evolutiva
Frequentemente, o cliente define uma série de objetivos gerais para o
software, mas não identifica, detalhadamente, os requisitos para funções e recursos.
Em outros casos, o desenvolvedor se encontra inseguro quanto à eficiência de um
algoritmo, quanto à adaptabilidade de um sistema operacional ou quanto à forma em
que deve ocorrer a interação homem máquina. Em situações como essas, e em muitas
outras, o paradigma da prototipação pode ser a melhor abordagem.
Na sua forma ideal, o protótipo atua como um mecanismo para identificar os
requisitos do software. Caso seja necessário desenvolver um protótipo operacional,
pode-se utilizar partes de programas existentes ou aplicar ferramentas que
possibilitem gerar rapidamente tais programas operacionais.
Figura 2.1.3 – Modelo de prototipação evolutiva
2.1.4 Modelo espiral
O modelo espiral é um modelo de processo de software evolucionário que une
a natureza iterativa da prototipação aos aspectos sistemáticos e controlados do
modelo cascata. Tem potencial para o rápido desenvolvimento de versões cada vez
mais completas do software.
O primeiro circuito em volta da espiral pode resultar no desenvolvimento de
uma especificação de produto; passagens subsequentes em torno da espiral podem
ser usadas para desenvolver um protótipo e, então,progressivamente, versões cada
vez mais sofisticadas do software. Cada passagem pela região de planejamento
resulta em ajustes no planejamento do projeto. Custo e cronograma são ajustados de
15
acordo com o feedback (a realimentação) obtido do cliente após a entrega. Além disso,
o gerente de projeto faz um ajuste no número de iterações planejadas para concluir o
software.
Figura 2.1.4 – Modelo espiral
2.1.5 Modelo V
O Modelo V é similar ao processo Cascata, com a diferença de que este
modelo está preocupado com o planejamento dos testes nas fases de
desenvolvimento. Cada tipo de teste é realizado seguindo um plano de testes
correspondente, verificando e validando se as especificações definidas nas fases de
desenvolvimento estão sendo atendidas. Seguindo a característica sequencial do
processo Cascata, um teste de mais alto nível é realizado somente se o teste atual for
bem-sucedido. De forma geral, o Modelo V não é tão conhecido como o processo
Cascata, mas pela sua simplicidade e melhor organização das atividades de teste ele
se torna um processo bastante interessante para disseminar a importância dos testes
no processo de desenvolvimento de software.
16
Figura 2.1.5 – Modelo V
2.2 Desenvolvimento Ágil
Em 2001, Kent Beck e outros 16 renomados desenvolvedores, autores e
consultores da área de software (batizados de “Agile Alliance” – “Aliança dos Ágeis”)
assinaram o “Manifesto para o Desenvolvimento Ágil de Software” (“Manifesto for
Agile Software Development”). Ele declarava:
Ao desenvolver e ajudar outros a desenvolver softwares, desvendamos formas
melhores de desenvolvimento. Por meio deste trabalho passamos a valorizar:
Indivíduos e interações acima de processos e ferramentas.
Software operacional acima de documentação completa.
Colaboração dos clientes acima de negociação contratual.
Respostas a mudanças acima de seguir um plano.
Ou seja, embora haja valor nos itens à direita, valorizaremos os da esquerda
mais ainda.
2.3 Agilidade e Custo das Mudanças
O pensamento convencional em desenvolvimento de software (baseada em
décadas de experiência) é que os custos de mudanças aumentam de forma não linear
conforme o projeto avança.
Os proponentes da agilidade argumentam que um processo ágil bem
elaborado “achata” o custo da curva de mudança (Figura 2.3 curva em linha azul),
17
permitindo que uma equipe de software assimile as alterações, realizadas
posteriormente em um projeto de software, sem um impacto significativo nos custos
ou no tempo.
Figura 2.3 – Custos de alterações como uma função do tempo em desenvolvimento
2.4 Processo Ágil
Processo ágil de software é caracterizado de uma forma que trate de uma
série de preceitos chaves acerca da maioria dos projetos de software. Adaptação
continua sem progressos, entretanto, de pouco adianta. Um processo ágil de software
deve adaptar de modo incremental. Para conseguir uma adaptação incremental, a
equipe ágil precisa de feedback do cliente (de modo que as adaptações apropriadas
possam ser feitas).
2.4.1 Princípios da agilidade
A Agile Alliance estabelece 12 princípios para alcançar a agilidade:
1. A maior prioridade é satisfazer o cliente com entrega adiantada e continua de
software funcionando.
2. Aceite bem os pedidos de alterações, mesmo com o desenvolvimento
adiantado. Os processos ágeis se aproveitam das mudanças para a vantagem
competitiva do cliente.
3. Entregue software em funcionamento frequentemente, de algumas sema- nas
a alguns meses, dando preferência a intervalos mais curtos.
18
4. O pessoal do comercial e os desenvolvedores devem trabalhar em con- junto
diariamente ao longo de todo o projeto.
5. Construa projetos em torno de pessoas motivadas. Dê a elas o ambiente e o
apoio necessários e acredite que elas farão o trabalho corretamente.
6. O método mais eficiente e efetivo de transmitir informações para e dentro de
uma equipe de desenvolvimento é uma conversa aberta, presencial.
7. Software em funcionamento é a principal medida de progresso.
8. Os processos ágeis promovem desenvolvimento sustentável. Proponentes,
desenvolvedores e usuários devem estar aptos a manter um ritmo constante
indefinidamente.
9. Atenção contínua para com a excelência técnica e para com bons projetos
aumenta a agilidade.
10. Simplicidade, a arte de maximizar o volume de trabalho não realizado é
essencial.
11. As melhores arquiteturas, requisitos e projetos surgem de equipes auto-
organizadas.
12. Em intervalos regulares, a equipe se avalia para ver como pode se tornar
mais eficiente, então, sintoniza e ajusta seu comportamento de acordo.
2.5 Aspectos Humanos da Engenharia de Software e Características
Então você quer ser engenheiro de software? Obviamente, precisa dominar o
material técnico, aprender e aplicar as habilidades exigidas para entender o problema,
projetar uma solução eficaz, construir o software e testá-lo com a finalidade de
produzir a mais alta qualidade possível. Você̂ precisa gerenciar mudanças, comunicar-
se com os envolvidos e usar ferramentas adequadas nas situações apropriadas.
Um engenheiro de software competente tem um senso de responsabilidade
individual. Significa que ele fará o que precisar ser feito, quando for necessário,
executando um esforço adicional para a obtenção de um resultado bem-sucedido.
Um engenheiro de software competente tem elevado senso de lealdade. De
boa vontade, compartilha os créditos com seus colegas. Tenta evitar conflitos de
interesse e nunca age no sentido de sabotar o trabalho dos outros.
Um engenheiro de software competente mostra atenção aos detalhes. Isso
não significa obsessão com a perfeição, mas sugere que ele considera atentamente
19
as decisões técnicas que toma diariamente, em comparação com critérios mais
amplos (por exemplo, desempenho, custo, qualidade) que foram estabelecidos para
o produto e para o projeto.
Por último, um engenheiro de software competente é pragmático. Reconhece
que a engenharia de software não é uma religião na qual devem ser seguidas regras
dogmáticas, mas sim uma disciplina que pode ser adaptada de acordo com as
circunstâncias.
2.6 Psicologia da Engenharia de Software
Nos níveis da equipe e do projeto, dinâmicas de grupo se tornam o fator
dominante. Aqui, a estrutura da equipe e fatores sociais governam o sucesso. A
comunicação, a colaboração e a coordenação do grupo são tão importantes quanto
as habilidades dos membros individuais da equipe. Nas camadas externas, o
comportamento organizacional governa as ações da empresa e sua resposta para o
meio empresarial.
Figura 2.6 – Modelo comportamental em camadas
20
3. QUALIDADE DE SOFTWARE E GESTÃO DE PROJETOS
A gestão de projetos define quem, o que, quando e o porquê dos projetos. Ela
faz uso de processos e ferramentas de gestão os quais servem para ajudar o gerente
de projetos e equipe a organizar, documentar, rastrear e relatar as atividades e
progresso de um projeto. Dentro desse contexto, o plano de projeto compreende:
Escopo de projeto bem definido;
Documentação e responsabilidades dos participantes;
Uma linguagem comum para comunicação das atividades do projeto, bem
como a rastreabilidade e relatórios dessas atividades;
Mecanismos de resolução de conflitos e mitigação ou atenuação de riscos.
3.1. O Espectro de Gerenciamento
O gerenciamento eficiente do desenvolvimento de software se concentra nos 4
Ps: pessoas, produto, processo e projeto. Essa ordem não é arbitrária. O gerente que
se esquecer de que o trabalho do engenheiro de software consiste em esforço humano
nunca terá́ sucesso no gerenciamento de projeto. Da mesma forma, o que não
estimula a ampla comunicação entre os envolvidos no início da evolução de um
produtocorre o risco de desenvolver uma solução elegante para o problema errado.
Um gerente que preste pouca atenção ao processo se arrisca a inserir métodos e
ferramentas técnicas competentes em um vácuo. Aquele que embarca sem um plano
de projeto sólido compromete o sucesso do projeto.
3.1.1 Pessoas
Desde os anos 1960, debate-se a valorização da cultura de ter pessoal de
desenvolvimento motivado e de alto nível. Realmente, recursos humanos é um fator
de tal importância que o Software Engineering Institute (SEI) desenvolveu um Modelo
de Maturidade de Capacitação de Pessoas, o People-CMM (People Capability
Maturity Model) - em reconhecimento ao fato de que: “Toda organização precisa
aprimorar continuamente sua habilidade de atrair, desenvolver, motivar, organizar e
reter a forca de trabalho necessária para atingir os objetivos estratégicos de seus
negócios”
21
3.1.2 Produtos
Antes de traçarmos um plano de projeto, devemos estabelecer os objetivos
do produto e seu escopo, considerar as soluções alternativas e identificar as restrições
técnicas e de gerenciamento. Sem essas informações, é impossível definir de modo
razoável (e preciso) a estimativa de custo, a avaliação efetiva dos riscos, a análise
realista das tarefas do projeto ou um cronograma gerenciável do projeto que forneça
a indicação significativa de progresso das atividades.
3.1.3 Processo
Um processo de software fornece a metodologia por meio da qual pode ser
estabelecido um plano de projeto abrangente para o desenvolvimento de software.
Uma quantidade de diferentes conjuntos de atividades e tarefas, pontos de controle,
artefatos de software e pontos de garantia de qualidade possibilitam que as atividades
metodológicas sejam adaptadas às características do projeto de software e aos
requisitos de equipe.
3.1.4 Projeto
Conduzimos projetos com planejamento e com controle por uma única e
principal razão: é a única maneira de administrar a complexidade. E, mesmo assim,
as equipes de software têm de se esforçar. Em um estudo de 250 grandes projetos
de software entre 1998 e 2004, Carpe Jones constatou que “perto de 25 obtiveram
sucesso em cumprir cronograma, custos e objetivos quanto à qualidade. Em torno de
50 apresentaram atrasos ou retardamentos abaixo de 35%, enquanto 175 projetos
tiveram atrasos e retardamentos sérios ou não foram concluídos”.
Em um trabalho sobre processo e projetos de software, Barry Boehm, sugere
uma abordagem com foco nos objetivos do projeto, marcos e cronogramas,
responsabilidades, abordagens gerenciais e técnicas, e recursos necessários. Ele
denomina o princípio W5HH:
22
Figura 3.1.4 – W5HH
3.2 Métricas de Processo
A medição é uma ferramenta de gerenciamento. Se for usada adequada-
mente, ela aumenta o conhecimento do gerente de projeto. E, consequentemente,
ajuda o gerente de projeto e a equipe de software a tomarem decisões que levarão a
um projeto bem-sucedido.
3.2.1 Aperfeiçoamento do processo de software
Métricas de processo são coletadas em todos os projetos e no decorrer de
longos períodos de tempo. Sua finalidade é proporcionar um conjunto de indicadores
de processo que levam à melhoria do processo de software no longo prazo. A única
maneira lógica de melhorar qualquer processo é medir atributos específicos do
processo, desenvolver um conjunto de métricas significativas com base nesses
atributos e então usar as métricas para fornecer indicadores que levem a uma
estratégia de aperfeiçoamento.
23
Figura 3.2.1 – Determinantes para a qualidade do software
O processo está́ no centro do triângulo que conecta três fatores de profunda
influência sobre a qualidade do software e do desempenho organizacional. A
complexidade do produto pode ter um impacto significativo sobre a qualidade e o
desempenho da equipe. A tecnologia (isto é, os métodos e ferramentas de engenharia
de software) que preenche o processo também tem um impacto.
3.3 Estimativas de Projeto de Software
O gerenciamento do projeto de software começa com um conjunto de
atividades chamadas coletivamente de planejamento de projeto. Antes de iniciar o
projeto, a equipe de software deve fazer uma estimativa do trabalho, dos recursos que
serão necessários e do tempo necessário para a sua conclusão. Uma vez cumpridas
essas atividades, a equipe de projeto deve estabelecer um cronograma que defina as
tarefas e as metas de engenharia de software, deve identificar os responsáveis pela
execução de cada tarefa e deve especificar as dependências entre tarefas que podem
ter forte influência no progresso do trabalho.
24
3.3.1 Escopo
O escopo do software descreve as funções e características que devem ser
fornecidas aos usuários; os dados que entram e saem, o “conteúdo” que é
apresentado aos usuários como consequência do uso do software e o desempenho,
restrições, interfaces e confiabilidade que limitam o sistema. O escopo é definido por
meio de uma das duas técnicas:
Uma descrição narrativa do escopo do software é desenvolvida após
comunicação com todos os envolvidos.
Um conjunto de casos de uso é desenvolvido pelos usuários.
Funções descritas na definição do escopo (ou nos casos de uso) são avaliadas
e, em algumas situações, refinadas para fornecer mais detalhes, antes de iniciar as
estimativas. Como as estimativas de custo e cronograma são ambas funcionalmente
orientadas, muitas vezes é aconselhável certo grau de separação. As considerações
de desempenho abrangem requisitos de processamento e tempo de resposta. As
restrições identificam limites colocados no software por hardware externo, memória
disponível ou outros sistemas existentes.
3.4 Recursos
O planejador começa avaliando o escopo do software e selecionando as
habilidades necessárias para concluir o desenvolvimento. São especificados o cargo
(por exemplo, gerente, engenheiro de software sênior) e a especialização (por
exemplo, telecomunicações, banco de dados, cliente-servidor). Para projetos
relativamente pequenos (poucas pessoas/mês), um só profissional pode executar
todas as tarefas de engenharia de software, consultando os especialistas quando
necessário. Para projetos maiores, a equipe pode estar geograficamente dispersa em
diferentes locais. Portanto, é especificada a localização de cada recurso humano.
25
Figura 3.4 – Recursos de projeto
3.5 Técnicas de Decomposição
Desenvolver uma estimativa de custo e esforço para um projeto de software
é muito complexo para ser considerado como um todo. Por essa razão devemos
decompor o problema, caracterizando-o como um conjunto de problemas menores.
No contexto do planejamento de projeto, o tamanho refere-se ao resultado
quantificável do projeto de software. Se uma abordagem direta é adotada, o tamanho
pode ser medido em linhas de código (LOC). Se uma abordagem indireta é escolhida,
o tamanho é representado como pontos por função (FP). Dados de LOC e FP são
usados de dois modos durante a estimativa de projetos de software:
1. Como variável de estimativa para “dimensionar” cada elemento de
software;
2. Como métricas referenciais coletadas de projetos anteriores e usadas
juntamente com variáveis de estimativa para desenvolver projeções de custo e
esforço.
Quando um novo projeto é estimado, deve ser primeiro classificado em um
domínio (tamanho de equipe, área de aplicação, complexidade e outros parâmetros
relevantes) e depois a média de produtividade do domínio adequado deve ser usada
para gerar a estimativa.
26
3.5.1 Estimativa baseada em linhas de código (LOC)
A medida mais simples para tamanho de um programa é a contagem de linhas
de código. Existem algumas variantes para ela, como LOC (Lines Of Code), SLOC
(Source Lines Of Code) lógico e SLOC físico.
O método mais simplese também o mais impreciso: utilizando-se LOC não se
distingue linhas de código de linhas em branco ou de comentários. Essa métrica é,
em princípio, o padrão indicado para uso no PSP (Personal Software Process). Pode
ser suficientemente precisa quando se comparam grandes volumes de código:
naturalmente, um programa de 4 KLOC (milhares de linhas) deve ser mais complexo
e levar mais tempo para ser desenvolvido que outro de 2 KLOC. Para aumentar a
precisão da medida, sugeriu-se o uso do SLOC, onde linhas em branco ou com
comentários não são consideradas. As variantes “lógica” e “física” não têm definições
amplamente padronizadas. O exemplo abaixo seria medido como três LOCs, dois
SLOCs físicos e três SLOCs lógicos:
//uma verificação
IF (a > b) {a++; var (“ok”);
}
3.5.2 Estimativa baseada em pontos de função (FP)
Como vimos, a medida LOC é simples e por esse motivo também é imprecisa.
Um programador gastaria no máximo alguns minutos para juntar os arquivos-fonte de
um projeto e obter do editor a contagem total de linhas. Entretanto o número obtido
não revelaria nada a propósito da estrutura de tal sistema.
Para determinar o número de FPs, deve-se considerar a contagem de dados e
de transações. Na contagem de dados, consideram-se arquivos lógicos internos ou
arquivos de interface externos. Entre as transações têm-se entradas externas, saídas
externas ou consultas externas.
O termo arquivo refere-se a um grupo de dados logicamente relacionados:
Arquivos lógicos internos (ALI): São relativos às funcionalidades do software,
como, por exemplo, cadastro de clientes e alteração de produtos. Não são ALI, por
exemplo, arquivos temporários e de classificação;
27
Arquivos de interface externos (ALE): Os dados são mantidos e/ou alimentados
por outros programas. As transações representam as funcionalidades providas ao usuário
pelo processamento dos dados em um software;
Entradas externas (EE): Processo lógico onde dados são introduzidos no sistema.
Os dados podem ser informações de controle ou de negócios. Por exemplo, exclusão,
alteração e inclusão de registros;
Saídas externas (SE): Processo lógico em que dados são enviados ao exterior das
fronteiras do sistema. Por exemplo, um relatório ou mesmo a apresentação dos dados em
tela;
Consulta Externa (CE): Os dados são recuperados exclusivamente de arquivos
internos e interfaces externas (nada é computado). Por exemplo, consulta ao cadastro de
cliente.
Após terem sidos identificados e contados, esses cinco fatores devem ter sua
complexidade classificada como baixa, média ou alta. Essa classificação depende de
uma análise dos elementos de dados que compõe cada fator. Cada organização deve
padronizar seu método de classificação de complexidade.
Dois programas distintos podem ter a mesma contagem de pontos de função.
Aspectos como complexidade dos cálculos ou requisitos como tempo real não entram
no cálculo, até então. Para resolver isso pode ser utilizada uma técnica conhecida
como Fator de Ajuste, que é baseada em 14 características gerais do sistema:
1. Comunicação de Dados;
2. Funções distribuídas;
3. Desempenho;
4. Configuração do equipamento;
5. Volume de transações;
6. Entrada de dados on-line;
7. Interface com o usuário;
8. Atualização on-line;
9. Processamento complexo;
10. Reusabilidade;
11. Facilidade de implantação;
12. Facilidade operacional
13. Múltiplos locais;
14. Flexibilidade de mudanças.
28
Cada CGS possui um nível de influência de 0 a 5, e é calculado por: FA = 0.65
+ 0.01 X (n1 + n2 + ... + n14).
Onde cada ni representa um dos 14 níveis de influência. A partir do valor do
FA, pode-se calcular o número de pontos de função ajustados (PFA): PFA = FA x PF
Algumas métricas podem ser derivadas a partir do cálculo de pontos de função,
como o número de homens/hora para produzir 1PF (ou 1PFA, Ponto de Função
Ajustado) ou, ainda, dada a produtividade média da equipe, o tempo necessário para
implementar um projeto.
Por exemplo, se uma equipe produz em média 10 PFs por dia, um projeto cujo
tamanho é 300 PFs deve ser implementado em um mês. De maneira semelhante
pode-se aproximar valores para o preço de um produto, a partir do custo de
desenvolvimento de 1PF dentro da organização.
3.6 Método COCOMO(Constructive Cost Model)
Uma das tarefas mais difíceis de um projeto é a correta aplicação dos recursos
(humanos) durante seu desenvolvimento, ou seja, em que momento precisarei de
mais ou menos programadores/analistas.
O método COCOMO nada mais é do que uma pesquisa feita em centenas de
empresas norte-americanas que mapeou a distribuição do esforço durante as fases
de um projeto. Os principais números são:
Figura 3.6 – Método COCOMO
29
Um tempo total de 875h aplicados ao método, ficaria:
Figura 3.6.1 – Método COCOMO aplicado
Assim sendo distribui-se essas horas nos recursos, em um cronograma,
conforme estratégia da gerência e também levando em conta os prazos finais
estabelecidos pelo usuário.
3.7 Cronograma de Projetos
O cronograma de projeto de software é uma atividade que distribui o esforço
estimado pela duração planejada do projeto, partilhando esse esforço por tarefas
específicas de engenharia de software. É importante notar que o cronograma evolui
com o tempo. Durante os primeiros estágios do planejamento do projeto, um
cronograma macro é desenvolvido. Esse cronograma identifica todas as principais
atividades do processo e as funções do produto a que se aplicam à medida que o
projeto avança, cada entrada nesse cronograma é refinada em um cronograma
detalhado.
O exemplo a seguir refere-se a um cronograma de desenvolvimento de um
projeto novo. Informações como atividades macro, atividades refinadas e suas
respectivas datas são exibidas. Em um cronograma é importante que para cada
atividade sejam definidas datas inicial e final.
30
Figura 3.7 - Cronograma de projetos
31
CONSIDERAÇÕES FINAIS
As tecnologias de software e de sistemas continuam a ser um desafio para
todo profissional de software e toda empresa que constrói sistemas de computador.
Uma coisa que aprendemos durante muitos anos nesse campo é que os profissionais
de engenharia de software são “conscientes de sua situação”. O caminho à frente
estará entulhado de carcaças de novas e excitantes tecnologias (a última moda) que
nunca tiveram sucesso (apesar da quantidade de “novidades”). O futuro será formado
por tecnologias mais modestas que, de certa forma, modificam a direção e a amplitude
do caminho.
As aplicações das técnicas em estudo visam a melhora contínua do software
e sua adaptabilidade dentro do que foi planejado e como profissionais, os engenheiros
de software devem se orientar por um código de ética que rege o trabalho que fazem
e os produtos que criam, garantindo um planejamento adequado, minimizando os
riscos e potencializando as chances de sucesso.
32
REFERÊNCIAS BIBLIOGRÁFICAS
ENGENHARIA DE SOFTWARE: revista de engenharia de software. Rio de Janeiro:
Grupo Devmedia, 2008.
EVELEENS J Laurenz, VERHOEF Chris. The rise and fall of the chaos report figures.
IEEE Software. 2010.
FILHO, Wilson de Pádua Paula. Engenharia de Software, Fundamentos, Métodos
e Padrões. Rio de Janeiro: LTC – Livros Técnicos e Científicos Editora S.A. 2003.
OLIVEIRA, Jayr Figueiredo de. Metodologia para Desenvolvimento de Projetos de
Sistemas – Guia prático. 3. Edição revisada em ampliada. São Paulo : Érica, 1999.
PRESSMANN, Roger S. Engenharia de Software São Paulo : Makron Books, 6. Ed.
2006 : McGraw-Hill 2006.
SOMMERVILLE, I. Engenharia de Software. 8a Edição. Addison Wesley. 2007.
PRESSMAN Roger S. Software engineering – a practitioner’s approach. 6 New York:
McGraw Hill; 2007.