Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
UNIVERSIDADE DO VALE DO ITAJAÍ
Oswaldo Cavalcanti Dantas Júnior
MODELO EVOLUTIVO PARA OTIMIZAÇÃO DE ESTIMATIVA DE ESFORÇO EM PROJETOS DE
SOFTWARE
São José
2006
UNIVERSIDADE DO VALE DO ITAJAÍ
MODELO EVOLUTIVO PARA OTIMIZAÇÃO DE ESTIMATIVA DE ESFORÇO EM PROJETOS DE
SOFTWARE
Oswaldo Cavalcanti Dantas JúniorAcadêmico
Trabalho de Conclusão de Curso apresentado como requisito parcial para obtenção do título de Bacharel em Ciência da Computação na Universidade do Vale do Itajaí, Centro de Educação São José.
São José
2006
Oswaldo Cavalcanti Dantas Júnior
MODELO EVOLUTIVO PARA OTIMIZAÇÃO DE ESTIMATIVA DE ESFORÇO EM PROJETOS DE
SOFTWARE
Este Trabalho de Conclusão de Curso foi julgado adequado para obtenção do título de Bacharel
em Ciência da Computação e aprovado pelo Curso de Ciência da Computação, da Universidade do
Vale do Itajaí (SC), Centro de Educação São José.
São José, 29 de Janeiro de 2007.
Apresentada à Banca Examinadora formada pelos professores:
Prof. Dr. Marcello Thiry
UNIVALI - São José
Orientador
Prof. Dr. rer. nat. Eros Comunello, membro da banca examinadora
Profa. MSc. Fernanda dos Santos Cunha, membro da banca examinadora
DEDICATÓRIA
À minha esposa Estela, cujo carinho, compreensão e apoio foram
essenciais para a conclusão deste trabalho, aos meus pais, que sempre
foram fonte de incentivo e inspiração, às minhas irmãs, aos familiares
e a todos que direta ou indiretamente contribuíram para formar quem
sou hoje.
AGRADECIMENTOS
Aos professores das instituições UniCEUB, onde iniciei meu Curso, e UNIVALI, onde concluí.
Em especial ao professor Marcello Thiry, por seu apoio e ajuda a manter as idéias em foco.
RESUMO
Devido a características específicas de projetos de software, modelos matemáticos complexos
podem ser utilizados para estimar a duração das atividades. Porém, para se modificar ou calibrar
um modelo é necessário coletar um grande volume de dados históricos de sua aplicação em
diferentes projetos. Estes ajustes podem tomar anos e normalmente não são realizados por
outras organizações além da responsável por dar manutenção ao modelo. Por não serem
naturais, características específicas dos softwares afetam a forma de gerenciar. Se estas não
forem corretamente observadas podem levar a problemas que se manifestam como a dificuldade
de entregar o produto no prazo acordado. Os cálculos necessários para criar um modelo
envolvem um grande número de variáveis e interações, tornando praticamente inviável a
criação ou ajuste de um modelo com muitas variáveis durante o andamento de um projeto. Este
trabalho analisa características da gerência de projetos de software, o uso das estimativas, como
os modelos são criados. Além disso, apresenta como resultados a especificação de um modelo
evolutivo capaz de automatizar este processo, realizando de forma autônoma todos os processos
de cálculo, retornando um modelo já calibrado com base nos dados e variáveis fornecidas
inicialmente ao mesmo, e um protótipo da funcionalidade básica da especificação, validado
contra uma massa de dados simulados.
Palavras Chaves: Modelos matemáticos de estimativa, estimativas em projetos de software,
algoritmos genéticos, programação evolutiva, sistemas de descoberta de equações.
ABSTRACT
Due to specific characteristics in software projects, complex mathematical models can be used
to estimate the duration of the activities. But, to modify or calibrate a model, a big amount of
historical data of it's aplication in different projects is needed. The adjustments can take years
and usually aren't done by other organizations besides the one responsible for giving
maintenance to the model. Because they are not natural, softwares have specific characteristics
that affect the way the project is managed. If this characteristics aren't correctly observed, they
can lead to problems that manifest like difficulty in delivering the product on time. A
collaborator needs knowledge in management and statistics to be able to create a estimation
model. The necessary calculations involve a large number of variables and iterations, turning
the creation or adjustment of a model during the execution of a project not viable in most cases.
This work analyses the characteristics of software project management, the use of estimates and
how the models are created. Besides, it specifies an evolutionary model that can automate this
process, autonomously working all the calculations and returning a calibrated model based on
the data and variables initially given to it.
SUMÁRIO
1 INTRODUÇÃO..........................................................................................................................7
1.1 CONTEXTUALIZAÇÃO.......................................................................................................7
1.2 PROBLEMA...........................................................................................................................8
1.3 OBJETIVOS............................................................................................................................9
1.3.1 OBJETIVO GERAL.............................................................................................................9
1.3.2 OBJETIVOS ESPECÍFICOS...............................................................................................9
1.3.3 ESCOPO E DELIMITAÇÃO DO TRABALHO..................................................................9
1.4 RESULTADOS ESPERADOS..............................................................................................10
1.5 JUSTIFICATIVA...................................................................................................................10
1.6 ASPECTOS METODOLÓGICOS.........................................................................................11
1.6.1 METODOLOGIA...............................................................................................................11
1.6.2 PLANO DE TRABALHO..................................................................................................11
1.7 ESTRUTURA DO TRABALHO...........................................................................................13
2 ESTIMATIVAS EM PROJETOS DE SOFTWARE.................................................................14
2.1 INTRODUÇÃO.....................................................................................................................14
2.2 GERÊNCIA DE PROJETOS.................................................................................................14
2.3 CARACTERÍSTICAS DE PROJETOS DE SOFTWARE....................................................18
2.4 FORMAS DE ESTIMAR UM PROJETO DE SOFTWARE................................................22
3 CRIAÇÃO DE MODELOS MATEMÁTICOS........................................................................27
3.1 INTRODUÇÃO.....................................................................................................................27
3.2 COLETA DE DADOS...........................................................................................................28
3.3 SELEÇÃO DE VARIÁVEIS.................................................................................................28
3.4 NORMALIZAÇÃO...............................................................................................................31
3.5 IDENTIFICAÇÃO DE RELAÇÕES MATEMÁTICAS.......................................................34
3.6 VALIDAÇÃO E CALIBRAÇÃO..........................................................................................37
3.7 ALGORITMOS GENÉTICOS..............................................................................................37
3.8 PROGRAMAÇÃO EVOLUTIVA.........................................................................................40
4 ESPECIFICAÇÃO DO SISTEMA PROPOSTO......................................................................42
4.1 INTRODUÇÃO.....................................................................................................................42
4.2 ARQUITETURA GERAL.....................................................................................................42
4.3 EXPERIMENTOS COM JGAP............................................................................................43
4.4 CLASSES E PACOTES........................................................................................................48
5 CONCLUSÕES E PERSPECTIVAS FUTURAS....................................................................53
5.1 CONCLUSÕES.....................................................................................................................53
5.2 PERSPECTIVAS FUTURAS................................................................................................54
6 REFERÊNCIAS BIBLIOGRÁFICAS.....................................................................................55
7
1 INTRODUÇÃO
1.1 CONTEXTUALIZAÇÃO
Qualquer erro de estimativa pode custar muito em termos de recursos alocados ao projeto. (PETERS;
PEDRYCZ, 2001, p. 480). Métodos de estimativa formais permitem a redução dos possíveis erros de
estimativa e um melhor acompanhamento do progresso do projeto. Com o histórico de projetos
desenvolvidos é possível constatar que não há método perfeito, que se aplique a qualquer organização.
Os métodos levam em consideração elementos que se relacionam, variáveis que afetam o
desenvolvimento de um projeto e conseqüentemente o seu prazo. O COCOMO, modelo criado por
Bohem no fim da década de 70 com base em um estudo feito sobre 63 projetos (HUGHES;
COTTERELL, 1999, p. 97), e em uma de suas versões chamada COCOMO81, o modelo
intermediário envolve desde complexidade do produto e tamanho da base de dados, atributos de
produto, até a capacidade de análise e experiência na linguagem de programação, atributos de pessoal.
Mesmo quando é usado o método de Delphi, técnica onde a estimativa é dada pelo consenso entre
especialistas (WU, 1997), e um especialista relata suas estimativas baseando-se em sua experiência,
sem ter utilizado um modelo matemático, são avaliados de forma consciente ou não, diversas
variáveis que levam a um valor estimado. Apesar da existência de modelos matemáticos como a
Análise de Ponto de Função, método de estimativa top-down que permite quantificar o tamanho de
um programa independente da linguagem de programação usada (HUGHES; COTTERELL, 1999, p.
89), ou o COCOMO, divulgados principalmente em meio acadêmico, “Em muitos casos, estimativas
são feitas usando-se a experiência passada como único guia.”(PRESSMAN, 1995, p. 57).
Com a experiência, gerentes de projetos, analistas e desenvolvedores criam métodos de estimativa
próprios. As variáveis visíveis no momento são selecionadas e arranjadas de forma a produzir
resultados que se aproximem de casos anteriores. Com a experiência e acúmulo de dados históricos da
aplicação do método em projetos anteriores, surge a possibilidade ou até mesmo a necessidade de se
fazerem ajustes às fórmulas.
O propósito deste trabalho é contribuir com a comunidade científica, mais especificamente na área de
8
projetos de software, permitindo melhor previsibilidade do prazo por meio do uso de uma ferramenta
capaz de ajustar o modelo matemático com o mínimo de interação com o usuário.
1.2 PROBLEMA
Pesquisa feita pelo Standish Group em 1994 mostra que os projetos de software estavam
ultrapassando o prazo estimado 200% em média e apenas 16,2% dos projetos de software estudados
foram concluídos com sucesso, dentro dos limites de prazo e custo. Ainda segundo a pesquisa, 52,7%
dos projetos foram concluídos depois do prazo, acima do custo e com menos funcionalidades do que o
originalmente especificado. Os 31,1% são projetos que foram cancelados em algum ponto do seu
ciclo de desenvolvimento.
Estes dados são reflexos da dificuldade que existe para se fazer uma estimativa com precisão aceitável
na área de desenvolvimento de software. Um projeto que ultrapassa a data de entrega, aumenta o risco
de ser cancelado, pois gera falta de confiança em novas estimativas.
É virtualmente impossível criar manualmente um modelo matemático genérico e perfeito, que inclua
todas as variáveis possíveis, visto que este deveria envolver desde fatores técnicos até condições
climáticas da região onde a equipe está. Isto seria inviável do ponto de vista prático, pois requer o
monitoramento de uma grande quantidade de elementos para alimentar o modelo, como probabilidade
de quedas de energia durante o projeto ou o número de defeitos bloqueantes encontrados por mês nas
tecnologias utilizadas. Ele teria um custo computacional alto para chegar à solução, nem sendo
cogitada a sua aplicação de forma manual.
Para criar um modelo viável, seleciona-se dentre as variáveis disponíveis, aquelas que tem maior
impacto sobre o esforço necessário para completar uma tarefa. As variáveis são arranjadas em uma
função que descreva a relação do que deve ser feito e o tempo necessário para fazê-lo. O histórico
acumulado permite que o modelo tenha suas constantes ajustadas, reduzindo sua imprecisão.
O ajuste do modelo por meio de constantes não altera a forma básica da curva descrita. Para isso, é
necessário modificar a relação das variáveis, mudando entre uma equação de reta ou uma parábola
por exemplo. Mesmo assim, o ganho de precisão do modelo pode não ser significativo. A inclusão de
uma nova variável pode levar a resultados melhores, mas como ela não fazia parte do modelo, ela
provavelmente não era monitorada. Portanto, alguns projetos deverão ser executados para se acumular
histórico sobre a nova variável.
Softwares de apoio à gerência de projetos normalmente possuem uma grande quantidade de variáveis
que poderiam ser utilizadas para formar o histórico que seria usado para o ajuste do modelo. Porém,
9
por exigir um grande volume de cálculos e tentativa e erro sobre massa de dados, todo esse processo é
muito custoso para ser realizado manualmente e de forma controlada.
Neste trabalho foi desenvolvida a especificação de um componente para automatizar o processo de
ajuste de um modelo. Descoberta de equações é uma sub-área do aprendizado de máquina, que por
sua vez é sub-área da inteligência artificial. Aprendizado de máquina é um método para se criar
programas de computador pela análise de um conjunto de dados, sendo fortemente ligado a estatística.
E, de acordo com TODOROVSKI (2001), “a descoberta de equações é a área que desenvolve
métodos para a descoberta automatizada de leis quantitativas, expressas na forma de equações, em
coleções de dados” (tradução livre).
Dessa forma, o diferencial deste trabalho é que o resultado poderá ser adicionado a softwares de
gerência de projetos já existentes, agregando valor. O sistema passaria a contar com um modelo de
estimativa com alta precisão, criado a partir da realidade do projeto e da empresa.
1.3 OBJETIVOS
1.3.1 Objetivo geral
O objetivo geral deste trabalho é desenvolver um modelo evolutivo para otimização de estimativa de
esforço em projetos de software.
1.3.2 Objetivos específicos
a) Fazer um levantamento dos métodos, ferramentas e técnicas utilizadas por um especialista para
criar ou ajustar um modelo matemático de estimativa de esforço em software;
b) Especificar um sistema que seja capaz de realizar ajustes a modelos matemáticos;
c) Desenvolver um protótipo que siga a especificação;
d) Validar os valores gerados pelo protótipo contra uma massa de dados histórica (dados simulados
ou reais fornecidos por empresas).
1.3.3 Escopo e delimitação do trabalho
O escopo deste trabalho se limita a especificar um modelo evolutivo para otimização de estimativa de
esforço em projetos de software, realizando pesquisa suficiente para tal. O trabalho não tem por
objetivo descrever outros assuntos relacionados à gerência de projetos ou engenharia de software nem
10
métodos de estimativas baseados em simulação como o Método de Monte Carlo, que é usado para
solucionar problemas matemáticos com muitas variáveis que não seriam facilmente solucionados por
métodos numéricos como cálculo de integrais por exemplo.
1.4 RESULTADOS ESPERADOS
O principal resultado deste trabalho será a especificação de um modelo evolutivo para otimização de
estimativa de esforço em projetos de software. Outro resultado importante é um protótipo seguindo a
especificação que demonstre capacidade de realizar ajustes que aumentem a precisão em relação ao
modelo original.
1.5 JUSTIFICATIVA
Ao contrário de outros projetos, como os encontrados na engenharia civil, onde é possível estimar
com um grande grau de certeza quanto tempo um trabalhador leva para construir uma parede, as
tarefas de um projeto de software tem apresentam uma dificuldade muito maior para serem estimadas.
Normalmente, além de envolverem um número maior de artefatos, as tarefas tem uma duração menor
e são afetadas por fatores externos além de fatores humanos.
Os modelos matemáticos de estimativa divulgados no meio acadêmico acabam sendo pouco
utilizados nas organizações ou por serem tão genéricos que não conseguem apresentar resultados com
uma precisão aceitável pela organização ou por exigirem um esforço tão grande que torne inviável a
sua utilização durante todo o projeto. Isso faz com que os responsáveis por estimar uma tarefa criem
fórmulas simplificadas, envolvendo as variáveis que em sua visão tem mais relevância.
Uma vez criados, os modelos podem levar anos para serem ajustados ou simplesmente não serem
ajustados de forma alguma, devido ao esforço necessário para tal sem o apoio de uma ferramenta que
automatize o processo. O processo de ajuste de um modelo matemático requer um especialista com
grande conhecimento tanto sobre o negócio onde a tarefa está inserida quanto sobre a matemática
necessária para criar um modelo mais preciso.
Um sistema de inteligência artificial que tivesse acesso ao modelo atual, dados históricos e todas as
variáveis que tiverem relação com as tarefas (que podem vir de uma ferramenta de apoio a gerência
de projetos por exemplo) mesmo que estes não façam parte do modelo atual, teria dados suficientes
para automatizar os ajustes. O novo modelo poderia ser utilizado então para se ter estimativas mais
precisas durante a execução de um projeto, sem esperar por seu pos-mortem.
11
Segundo LUGER (in DURKIN, 1994, p. iii), inteligência artificial é tanto uma disciplina de
engenharia quanto uma ciência no sentido que busca explicação da natureza do conhecimento,
entendimento e habilidade. É proposto nesse trabalho a especificação de um modelo evolutivo para
otimização de estimativa de esforço em projetos de software.
1.6 ASPECTOS METODOLÓGICOS
1.6.1 Metodologia
A pesquisa desenvolvida para este trabalho se enquadra na classe de pesquisa exploratória aplicada,
pois gera conhecimentos de aplicação prática e envolve levantamento bibliográfico e entrevista a
especialistas da área. Gerentes de projetos serão entrevistados para verificar a utilização de modelos
matemáticos de estimativa em seus projetos. Os que possuírem modelos de criação própria serão
questionados quanto ao processo que levou à construção do mesmo.
Com base na bibliografia e entrevistas, será criada uma especificação e um protótipo que será
validado contra uma massa de dados históricos. A massa de dados poderá ser real, cedida por
empresas, ou gerada por simulação. A especificação será feita na linguagem UML e o protótipo será
escrito sobre a plataforma Java.
1.6.2 Plano de trabalho
Primeira Fase: Pesquisa e Análise (Atividades que atendem ao objetivo específico “a”):
1. pesquisar sobre o uso de modelos matemáticos para estimar esforço em tarefas de
desenvolvimento de software;
2. pesquisar sobre os métodos ferramentas e técnicas utilizadas para a criação de um modelo
matemático a partir de uma massa de dados;
3. documentar técnica e algoritmos a serem utilizados no protótipo.
Segunda Fase: Especificação (Atividades que atendem ao objetivo específico “b”):
1. realizar de levantamento de requisitos funcionais e não funcionais do sistema;
2. projetar o sistema segundo o paradigma da orientação a objetos, utilizando diagramas de classe,
caso de uso e diagramas de seqüência.
Terceira Fase: Codificação (Atividades que atendem ao objetivo específico “c”):
12
1. codificar protótipo segundo a especificação criada;
2. codificar testes de unidade;
3. realizar prováveis correções.
Quarta Fase: Validação (Atividades que atendem ao objetivo específico “d”):
1. Desenvolver gerador de massa de dados*;
2. validar funcionamento do protótipo contra uma massa de dados;
3. validar funcionamento do protótipo na visão de especialistas.
*Ao longo da primeira, segunda e terceira fase, gerentes de projetos serão questionados quanto a
possibilidade de cederem os dados das estimativas de seus projetos e quais modelos estão utilizando
para formar a massa a ser usada na tarefa 2 da quarta fase. Caso os dados não sejam disponibilizados,
a massa será gerada por meio de simulação. Nesse caso, o desenvolvimento de um sistema que gere a
massa ocorrerá na tarefa 1 na quarta fase. Caso contrário, a tarefa 1 não será realizada, aumentando o
tempo disponível para utilização na tarefa 3.
13
1.7 ESTRUTURA DO TRABALHO
Este é o capítulo de introdução, onde pode-se destacar a contextualização, definição do
problema e objetivos, que darão base para os capítulos seguintes.
No capítulo 2, são introduzidos conceitos de gerência de projetos, a importância das estimativas
em projetos de software e explorará o cenário atual, indicando que métodos estão sendo
utilizados pelas organizações. O levantamento do cenário atual será realizado por meio de
entrevistas e enquetes on-line.
O capítulo 3 aborda os métodos, ferramentas e técnicas disponíveis para a criação de um
modelo matemático. Será descrita também a lógica usada por um especialista quando cria um
novo modelo, detalhando os passos e os motivos que levaram a eles.
No capítulo 4 é apresentada a modelagem do sistema, segundo o paradigma da orientação a
objetos. Neste capítulo constam os diagramas de classe e caso de uso que descrevam por meio
de UML o componente proposto pelo trabalho. São apresentados também, resultados de alguns
experimentos realizados para melhor embasar o modelo.
São apresentadas no capítulo 5 as conclusões encontradas com o desenvolvimento do trabalho e
perspectivas futuras, discutindo tanto a aplicação dos seus resultados na área de gestão de
projetos, auxiliando na criação de métodos de estimativa mais preciso, quanto em outras áreas
que possuam a mesma característica de possuir grande volume de dados que possam ser
descritos por uma equação.
Por fim, o capítulo 6 apresenta a bibliografia utilizada para a confecção deste trabalho.
14
2 ESTIMATIVAS EM PROJETOS DE SOFTWARE
2.1 INTRODUÇÃO
Um projeto é uma seqüência de atividades compondo um conjunto não rotineiro, visando um
objetivo, que pode ser desde a implantação de um serviço à criação de um novo produto. Uma
característica de um projeto é ter um fim definido, tendo atendido ao seu objetivo ou não. A
linha divisória entre rotina e projeto é muito tênue pois, se uma atividade é realizada repetidas
vezes ela não é um projeto. Porém, em um projeto de desenvolvimento de um sistema muito
similar a sistemas anteriores haverão muitas atividades de rotina (HUGHES; COTTERELL,
1999, p.2).
Este capítulo não pretende se aprofundar em todas as questões inerentes à gerência de projetos,
mas apresentar os conceitos relacionados, características comuns a projetos de software e como
são feitas as estimativas. Desta forma, este capítulo oferece a base necessária para a execução
do trabalho.
2.2 GERÊNCIA DE PROJETOS
Na gerência de projetos, é necessário aplicar conhecimentos técnicos e habilidades específicas,
na criação e acompanhamento de tarefas que envolvem diferentes tipos de recursos, como
financeiros e materiais, mas principalmente recursos humanos. A gerência chega a ser
considerada como sendo a arte de conseguir que as coisas sejam feitas através das pessoas.
Por motivos como participação em concorrências públicas ou obter maior controle e
previsibilidade em seus projetos, organizações buscam consultorias, treinamentos e
certificações na área de gerência de projetos. Reflexo disso é a forte aceitação do que é proposto
pelo PMI (Project Management Institute) no PMBOK Guide (A Guide to the Project
Management Body of Knowledge, 2004). O PMBOK não é considerado uma metodologia, pois
15
identifica os processos e suas áreas de conhecimento de uma forma genérica, sem definir
modelos de documentos a preencher nem peculiaridades de tipos de projetos.
As áreas de conhecimento definidas no PMBOK são os aspectos que devem ser observados na
gerência de um projeto. Cada área é formada por um conjunto de processos que interagem entre
si para permitir que o projeto transcorra de forma controlada. As áreas são: Gerência de
Aquisição, Gerência de Comunicação, Gerência de Custo, Gerência de Escopo, Gerência de
Integração, Gerência de Qualidade, Gerência de Recursos Humanos, Gerência de Risco e
Gerência de Tempo.
Figura 1: Visão geral das áreas de conhecimento em gerenciamento de projetos e os processos de gerenciamento
de projetos
16
Os processos são divididos em cinco grupos, que contém processos de diferentes áreas de
conhecimento. Estes grupos possuem forte dependência e são encontrados no ciclo de vida de
qualquer projeto, independente da área de aplicação ou do foco do setor. Por ter um
comportamento finito, os projetos passam por processos de iniciação e de encerramento,
delimitando seu ciclo de vida. Após iniciado, o projeto entra numa alternância entre processos
de planejamento e execução até que possa ser encerrado. Durante toda a sua vida, são
executados processos de monitoramento e controle, para permitir uma gestão efetiva. Por isso,
na figura abaixo retirada do PMBOK (PMI, 2004), a área representando monitoração e controle
envolve os outros grupos de processos.
Dentre todos os processos existentes em cada área de conhecimento, o que terá maior benefício
dos resultados deste trabalho será o de estimar a duração das atividades, processo 6.4 da
gerência de tempo. Este processo consiste em determinar a duração de cada atividade com base
na quantidade de esforço, recursos e jornadas de trabalho necessárias para completá-las. (PMI,
2004).
Os processos de iniciação, são aqueles que definem ou autorizam o início do projeto ou de uma
fase do mesmo. Estes processos geram documentação sobre os requisitos ou necessidades de
negócio, as alternativas para atendê-los, a alternativa selecionada e o escopo da solução.
No grupo de processos de planejamento, os objetivos e o escopo são refinados e as atividades
Figura 2: Grupos de processos de gerenciamento de projetos (PMI, 2004, p.40)
17
necessárias para atende-los são agendadas. As atividades são distribuídas pelo tempo
respeitando uma série de fatores, como dependências entre as mesmas, disponibilidade de
recursos e restrições de custo ou prazo. A medida que o projeto segue, o melhor entendimento
do escopo, das atividades e dos riscos envolvidos podem levar a uma repetição dos processos de
planejamento ou até dos de iniciação.
Processos de execução são os que envolvem a coordenação de pessoas e recursos para realizar
as atividades previstas no plano de gerenciamento do projeto desenvolvido no grupo de
processos de planejamento. Durante estes processos, podem ser encontradas situações que
levam a algum esforço de replanejamento, como detecção ou realização de um risco que não
havia sido identificado anteriormente.
Delimitando e formalizando o término de um projeto o grupo de processos de encerramento.
Nele são encerradas todas as atividades do projeto ou fase, desalocados os recursos e entregues
os resultados, caso o projeto não esteja sendo encerrado por ter sido cancelado.
Envolvendo todos os outros, o grupo de processos de monitoramento e controle observam o
desenvolver do projeto, identificando possíveis problemas no tempo adequado para que ações
corretivas possam ser tomadas. Por exemplo, um atraso identificado na execução de uma
atividade pode fazer com que seja revisada parte do planejamento para que não haja um atraso
na entrega do projeto, conseqüentemente provocando uma mudança nas atividades a serem
executadas. Esse ciclo entre processos de planejamento e execução devido a eventos nos
processos de monitoramento e controle podem ser visualizados na figura 2 apresentada
anteriormente.
Normalmente, um dos principais objetivos de se gerenciar um projeto é garantir a entrega dos
seus resultados dentro do prazo. Produtos para datas comemorativas por exemplo, dão ainda
mais importância para o fator prazo pois, não seria um grave problema entregar um produto
criado especificamente para o natal com um mês de atraso. Por esta razão, as estimativas são de
importância vital para a gerência de projetos. Com base nelas, os gestores podem verificar o
andamento do projeto e tomar ações corretivas ou preventivas. Com estimativas confiáveis
pode-se chegar até mesmo a concluir que um projeto é inviável para um determinado prazo,
evitando grandes prejuízos e problemas judiciais.
Apesar de ter uma seção de ferramentas e técnicas para cada processo, o PMBOK não
determina especificamente quais métodos devem ser utilizados na prática. Alguns métodos de
18
estimativa serão discutidos no item 2.3 deste capítulo. Como o PMBOK reúne um conjunto de
conhecimentos genéricos e, na prática é necessário conhecimento específico do tipo de projeto,
serão expostas algumas das peculiaridades que devem ser consideradas no gerenciamento de um
projeto de software.
2.3 CARACTERÍSTICAS DE PROJETOS DE SOFTWARE
Os projetos de software tem muitas características em comum com os de outras indústrias,
porém, algumas de suas peculiaridades requerem técnicas específicas para possibilitar uma
gestão efetiva. Hughes e Cotterell (1999, p.3) indicaram três características que afetam a forma
de gerenciar um projeto de software: invisibilidade (pois um software não apresenta resultados
que possam ser visualmente acompanhados dando um indicativo de seu progresso),
complexidade (para cada valor gasto, um produto de software possui mais complexidade do que
outros artefatos de engenharia) e flexibilidade (por serem mais facilmente modificados do que
um sistema físico ou organizacional, artefatos de software normalmente devem se adaptar às
necessidades destes outros componentes, ficando expostos a um alto grau de mudança).
Como exemplo, se um projeto de um software prevê a implementação de 10 interfaces gráficas,
ter implementado 5 não implica em dizer que o projeto está 50% concluído, pois as interfaces
podem ter apenas os componentes visuais posicionados e alguns controles sobre os mesmos, o
que não é suficiente para a utilização do software. A não ser que o planejamento do projeto
divida as tarefas de forma a ter uma tela totalmente funcional após a outra, as interfaces gráficas
não são indicativo do andamento do projeto.
Os softwares não só são utilizados em computadores, mas numa crescente variedade de
dispositivos com os mais diferentes fins, e nestes as características de invisibilidade,
complexidade e flexibilidade se tornam ainda mais evidentes. Os telefones celulares por
exemplo, são dispositivos criados para permitir mobilidade ao usuário, que pode fazer e receber
chamadas onde estiver (estando ao alcance de uma antena que possa completar a chamada) mas
que podem ser integrados a grandes sistemas.
Os softwares embarcados nos primeiros celulares, não permitiam ao usuário armazenar nome e
número para cada pessoa por motivos como a inexistência de memória para persistir as
informações ou devido aos visores disponíveis serem projetados apenas para a exibição de
números. Com a evolução de tecnologias como armazenamento, processamento e
19
miniaturização, é possível desenvolver celulares com muito mais funcionalidades. O próprio
mercado começa a rejeitar telefones que sirvam apenas para telefonar.
Os celulares se tornaram semelhantes aos computadores pessoais em muitos aspectos,
possuindo até mesmo sistema operacional, como o Windows Mobile da Microsoft ou o
Symbian OS, que é desenvolvido por um consórcio pertencente à Nokia, Motorola, Panasonic,
Sony Ericsson, Psion e Siemens. Projetos de software para celulares devem levar em
consideração quais aparelhos serão suportados.
Caso seja específico para um cliente com aparelhos do mesmo modelo, pode-se optar por
desenvolver na tecnologia nativa do mesmo. Mas se o projeto tiver como objetivo atender a um
público mais amplo, é indicado optar por uma tecnologia multi plataforma como o Java ME,
onde a mesma implementação pode ser instalada em qualquer sistema que tiver suporte à
máquina virtual Java.
A tendência de que todos os dispositivos se comuniquem, utilizando redes com ou sem fio,
permite a criação de projetos de sistemas que possam interagir com os usuários em seu
computador, celular ou até mesmo por meio de seu aparelho de televisão. Parte dos novos
televisores fabricados com suporte à tecnologia de TV digital, também possuem uma máquina
virtual Java, de forma que podem ser obtidos e instalados softwares na mesma. Essa tecnologia
está sendo conhecida como Xlets e foi introduzida pela Sun na especificação JavaTV.
Com a possibilidade de criar sistemas multiplataforma, o escopo do projeto deve estar bem
definido para se possa verificar que artefatos devem ser produzidos, que atividades serão
necessárias para produzi-los, aumentando a importância de se estabelecer um cronograma que
permita acompanhar o projeto sem que as características de invisibilidade complexidade e
flexibilidade se tornem problemas. Bechtold (1999) destaca outras dez características comuns
aos projetos de software:
• Software não é natural: Leis da natureza, usadas em outras engenharias, não se aplicam ao
software pois, não sendo natural, ele não envelhece, quebra, derrete, evapora, vibra ou
flutua.
• Sem limites de complexidade: Em software, é comum a atitude de que nada é complicado
demais, levando a decisões que envolvem uma complexidade que seria considerada
exagerada se fosse em outra área.
20
• Os principais tomadores de decisão sobre o problema praticamente não tem
entendimento ou experiência no domínio do problema: Em um projeto de software de
contabilidade por exemplo, o domínio do problema incluiria contas a pagar, contas a
receber, folha de pagamento, gerenciamento de ordens de compra e pagamento, entre
outros.
• Os principais tomadores de decisão sobre a solução praticamente não tem
entendimento ou experiência no domínio de solução: O domínio de solução de um
problema pode, por exemplo, incluir desenvolvimento usando JavaScript e PERL.
• Técnicos ou especialistas em ferramentas entendem muito pouco além de sua
especialidade: Com o tempo, um mesmo desenvolvedor pode ser alocado a diferentes
projetos que requerem o uso de uma ferramenta conhecida por ele, e aos poucos ele vai se
tornando super especializado na ferramenta, tendo pouca ou nenhuma exposição a outras.
• Os responsáveis por montar a equipe confiam excessivamente em especialistas
(especialmente com relação a ferramentas de desenvolvimento): Um dos motivos para
isso é que é mais fácil para os setores de recursos humanos e para os gerentes de projetos
determinar se um profissional tem dois anos de experiência com uma ferramenta do que
determinar se ele é um “engenheiro de software sênior”.
• Teoricamente, não há virtualmente nada “impossível” de ser implementado em
software: Em desenvolvimento de software, se algo parece ser possível, então acredita-se
que é possível, mas sem se perguntar para quando ou quanto custara com a complexidade
associada. Observando alguns projetos que resultaram grandes fracassos, a combinação de
características como alta complexidade, magnitude, duração, mostram que alguns projetos
são sim impossíveis.
• As necessidades do cliente mudam mais rápido que as ferramentas de
desenvolvimento: Os desenvolvedores de ferramentas de desenvolvimento de software
estão sempre buscando atender as crescentes necessidades de seus clientes desenvolvedores,
que por sua vez estão tentando atender as ainda maiores necessidades de seus clientes
compradores de software.
• Ferramentas de desenvolvimento de software mudam mais rápido do que os métodos
de desenvolvimento: Novas ferramentas permitem executar processos e métodos de
engenharia de software de novas formas, de forma otimizada ou até mesmo ser
21
incompatível com o antigo processo.
• Os métodos de desenvolvimento de software mudam mais rápido que as disciplinas de
gerência: Para tentar atender aos problemas decorrentes das outras características citadas,
os princípios de gerência de software também estão mudando. Porém, historicamente essa
evolução tem sido mais lenta que a dos métodos de desenvolvimento. Em parte, isso é
devido à crença de que um bom gerente gerencia qualquer grupo fazendo qualquer coisa,
mas as taxas de fracasso são evidência de que essa crença pode ser fatal para projetos de
desenvolvimento de software.
Pode-se dizer que todas as características apresentadas tem algum grau de impacto sobre a
estimativa de duração de um projeto. Mudanças de escopo devido a crescentes necessidades do
cliente, diferenças entre habilidades entre membros da equipe, invisibilidade que leva a falsas
percepções sobre a real dimensão do software, e várias outras dificuldades acabam
determinando se o projeto utilizará uma forma mais ou menos formal para realizar suas
estimativas.
Por exemplo, uma organização pode estar desenvolvendo um sistema monousuário para
cadastro de tarefas com base em análise feita em momento anterior com o cliente. Para acertar
um prazo e preço, foram identificadas atividades com base nessa análise inicial e estimadas as
suas durações e custos, que levaram ao preço informado. Durante o desenvolvimento, riscos vão
sendo realizados e o monitoramento constante do andamento das atividades permite ao gerente
tomar decisões como aumentar a equipe para recuperar o tempo tomado pelos riscos. O
aumento da equipe faz com que todo o planejamento daquele ponto em diante seja refeito,
redistribuindo as atividades e refazendo as estimativas, já que os novos integrantes da equipe
provavelmente terão produtividade diferente dos que já estavam no projeto.
Ainda no mesmo exemplo, o cliente pode informar que é imperativo que o sistema final deve
poder ser acessado em qualquer computador conectado à web, modificando totalmente o escopo
original. A equipe montada pode não ter conhecimento suficiente sobre as tecnologias
envolvidas para que a solução se adapte ao novo escopo e, dependendo da forma utilizada pela
organização para realizar as estimativas, as incertezas levarão a estimativas menos precisas.
Constantes erros de estimativas fazem com que a organização perca a credibilidade do cliente,
que pode pedir o cancelamento do projeto, principalmente se as estimativas sempre são para
menos tempo que o realizado.
22
Com isso, pode se observar que existe uma forte ligação entre a estimativa e a “vida” do
projeto. Todas as características apresentadas afetam o projeto direta ou indiretamente desde seu
início até seu encerramento e podem representar problemas dependendo das formas utilizadas
pela organização gerar as estimativas.
2.4 FORMAS DE ESTIMAR UM PROJETO DE SOFTWARE
A criação de estimativas de esforço ou custo em projetos de software dependem diretamente de
se conhecer o domínio do problema e da solução. O estudo aprofundado do problema ao qual o
software se propõe a solucionar e a definição dos recursos, ferramentas e técnicas a serem
utilizados, permitem dividir o projeto em partes menores. Isto normalmente é feito nas fases
iniciais do projeto e é necessário para que ele possa ser gerenciado e para que fiquem claras as
atividades necessárias para sua conclusão.
Como partes menores tem menor complexidade, as estimativas tendem a ser mais precisas.
Porém, esta divisão deve ocorrer até um nível de detalhe em que os executores e coordenadores
das atividades compreendam o que deve ser feito, evitando chegar a níveis de detalhamento
excessivos, que podem levar a um esforço de gerenciamento desnecessário.
Uma técnica amplamente utilizada para dividir um projeto em partes é o WBS (Work
Breakdown Structure). Um WBS é usado para definir os deliverables (produtos e resultados) de
um projeto e fazer a decomposição destes em componentes, sendo base para estabelecer o
necessário em esforço, custo, e a responsabilidade associada para cumprir e coordenar o
trabalho (PMI, 2001, p. 1). Por exemplo, um projeto de desenvolvimento de um software de
calculadora, sem entrar em detalhes específicos e sabendo que a estrutura pode mudar bastante
de organização para organização, pode ser representado pelo seguinte WBS:
1 Projeto Calculadora
1.1 Análise
1.1.1 Analisar funções necessárias
1.1.2 Avaliar necessidades do cliente
1.1.3 Definir escopo da solução
1.1.4 Aprovar escopo com cliente
23
1.2 Projeto
1.2.1 Prototipar telas
1.2.2 Criar diagramas de classe
1.2.3 Criar diagramas de seqüência
1.2.4 Validar modelagem com o analista
1.2.5 Realizar ajustes
1.3 Codificação
1.4 Testes
Além de identificar as atividades, é necessário associar os recursos necessários a cada uma. No
exemplo anterior poderia ser identificado que para realizar a atividade 1.2.2 seria necessário
alocar um colaborador com bons conhecimentos de orientação a objetos e adquirir um software
de diagramação caso a organização não o tenha. As durações variam de acordo com a
produtividade dos recursos alocados. Suas datas de início podem estar condicionadas à outros
fatores como a disponibilidade de um recurso ou ao calendário de feriados locais. Uma vez
feitas estas definições, pode-se iniciar o processo de estimar as durações das atividades.
Como pode ser visto na figura 3, o PMBOK indica cinco técnicas que podem ser utilizadas no
processo de estimativa de duração de atividade: Opinião especializada, estimativa análoga,
estimativa paramétrica, estimativa de três pontos e análise das reservas (PMI, 2004). As
abordagens para estimativa de esforço e prazo podem também ser divididas em: modelos
paramétricos, modelos baseados em atividades, analogia e relações simples de estimativas
(McGarry, apud AGUIAR, 2004).
24
Figura 3: Estimativa de duração da atividade: Entradas, ferramentas e técnicas, e saídas
Os modelos baseados em atividades, também são conhecidos como bottom-up, consistem em
estimar o esforço de cada uma que compõe o projeto. As outras formas de estimativa podem ser
combinadas com esta ou não. Por exemplo, um projeto pode aparecer como uma atividade de
um projeto maior, e ser estimado por um modelo paramétrico, enquanto outro projeto tem todas
as suas atividades estimadas individualmente por meio de opinião de especialistas, chegando à
duração total do projeto a partir da criação de um cronograma com as estimativas feitas.
Com a experiência, os profissionais se especializam, acumulam conhecimento e histórico. Isso
permite que eles tenham a capacidade de estimar a duração das tarefas com uma precisão
melhor do que alguém sem experiência prévia com atividades similares àquela que se pretende
estimar. Por isso, a falta de uma opinião especializada pode levar a estimativas com maior grau
de incerteza.
No caso de haverem dados históricos armazenados sobre a duração de tarefas anteriores, estes
podem ser utilizados para a estimativa análoga. Nela, dados de atividades similares às que estão
sendo estimadas fornecem um indicador de sua provável duração, identificando também as
diferenças que implicam em ajustes na estimativa. Esta técnica de estimativa se torna ainda
mais confiável se for utilizada em conjunto com a opinião de especialistas, ou seja, quando a
equipe realizando as estimativas tem experiência atividades similares às envolvidas no novo
projeto.
Para aumentar ainda mais a precisão das estimativas, pode se utilizar a estimativa de três
pontos. Esta técnica consiste em estimar o cenário otimista, pessimista e mais provável. A
média entre as três estimativas normalmente será um valor com maior possibilidade de se
aproximar da duração real que a atividade terá.
25
Quando uma atividade apresenta fatores que dificultem a sua estimativa, como maior
complexidade, risco ou incerteza, pode ser usada a opinião de mais de um especialista. Uma
forma de se obter isso é utilizando o método Delphi, “técnica para a busca de um consenso de
opiniões de um grupo de especialistas a respeito de eventos futuros” (WRIGHT;
GIOVINAZZO, 2000).
As organizações que utilizam o método Delphi normalmente fazem adaptações para suas
necessidades, mas a sua forma básica pode ser descrita da seguinte forma: Primeiro é marcada
uma reunião para discussão das estimativas. Cada participante prepara suas estimativas, listando
as tarefas que achar necessárias para a realização da atividade e anotando as estimativas, riscos
e qualquer premissa que foi imaginada como condição para aquela estimativa. No dia da
reunião, todas as estimativas são analisadas e comparadas de maneira anônima e imparcial.
Depois das discussões podem ocorrer outras rodadas de estimativas até se encontrar uma
condição de parada.
A condição para se encerrar uma reunião no método Delphi também varia a cada organização.
Pode-se por exemplo optar por encerrar quando as estimativas começarem a convergir a um
valor ou o moderador pode encerrar a reunião após um número fixo de rodadas, cabendo a um
estimador criar um documento final com base no que foi discutido.
Dependendo do grau de incerteza e riscos associados às atividades, pode-se usar a técnica de
análise das reservas. São acrescentadas ao projeto tempos comumente chamados de reservas de
contingência ou buffers. Estes tempos podem ser parcial ou totalmente consumidos, mas, com o
aumento do entendimento das atividades e dos riscos, existe a possibilidade de que eles sejam
reduzidos ou até eliminados.
A estimativa paramétrica é aquela que se utiliza de modelos matemáticos que descrevem
relações entre tamanho, esforço e prazo considerando a produtividade associada. A
produtividade pode ser considerada a quantidade produzida por unidade de trabalho, como por
exemplo a quantidade de linhas de código que um programador produz por hora. As relações
podem ser encontradas por meio de suposições teóricas ou a partir de dados históricos. Um dos
modelos nessa categoria muito aplicado pela indústria de software é o COCOMO II. É possível
encontrar implementações on-line do modelo, onde o usuário fornece os parâmetros e o
resultado é demonstrado na tela.
Os modelos paramétricos são criados para se aplicar a diferentes cenários. Para isso, levam em
26
consideração um grande número de parâmetros e constantes de ajuste, relativos à equipe, à
empresa e ao produto. Os modelos e suas constantes de ajuste são modificados a medida que o
grupo responsável pelo modelo recebe feedback dos usuários, dados do valor estimado e
realizado para cada atividade. Mesmo assim, os ajustes podem não ser suficientes para que o
modelo se aplique com precisão aceitável em 100% dos projetos.
Por isso, os responsáveis por estimar a duração das atividades podem ainda optar por criar seus
próprios modelos com base em dados históricos da própria organização, identificando relações
simples de estimativas. Estes modelos podem produzir estimativas mais precisas do que os
paramétricos, porém, esta simplificação normalmente não permite que os modelos sejam
utilizados em cenários diferentes daqueles para onde foram criados.
O sistema proposto por este trabalho poderá ser utilizado tanto para otimizar modelos
paramétricos quanto relações simples de estimativa. A partir do estudo sobre a criação de
modelos matemáticos, que será detalhado no capítulo 3, será feita a especificação do sistema
proposto, foco dos capítulos seguintes.
27
3 CRIAÇÃO DE MODELOS MATEMÁTICOS
3.1 INTRODUÇÃO
O conteúdo desse capítulo servirá de base para a especificação do sistema proposto. Nele será
discutida a criação de modelos matemáticos, como identificar as variáveis e suas relações
matemáticas. Discutirá também as alternativas existentes dentro da área de inteligência artificial
que poderiam ser utilizadas, definindo qual será utilizada na especificação.
Estimativa paramétrica é a técnica que desenvolve estimativas baseadas no exame e validação dos relacionamentos que existem entre as características técnicas, programáticas, de custo e de recursos consumidos de um projeto, durante seu desenvolvimento, manufatura, manutenção e/ou modificação (International Society of Parametric Analysts, 2003, p.1, tradução livre).
O processo de criação de um modelo requer do responsável, experiência com a matemática
necessária e, preferivelmente, experiência com a questão sendo modelada. Independente da área
fim, é possível identificar algumas atividades básicas que ocorrem nesse processo, como pode
ser visto na figura 4.
Figura 4: Atividades básicas no processo de criação de um modelo matemático
28
3.2 COLETA DE DADOS
A criação de um modelo matemático depende fortemente da disponibilidade de dados
históricos. Sistemas de informação como ERPs (Enterprise Resource Planning), sistemas de
apoio a gerência de projetos, formulários preenchidos por membros da equipe, documentação
sobre os projetos, equipe e recursos utilizados são exemplos de possíveis fontes de dados para
um modelo de estimativa de esforço de atividades.
Pouco histórico pode levar a conclusões incorretas. Por exemplo, caso seja monitorada uma
variável que está em um momento de comportamento anormal, como a produtividade dos
programadores em uma época em que parte da equipe está se recuperando de uma virose, os
valores coletados podem estar abaixo da média real.
Além disso, manter histórico de poucas variáveis pode deixar alguma de grande impacto sem
monitoramento. Por exemplo, ter os dados de produtividade de uma equipe de programação
sem verificar a experiência da mesma com a tecnologia usada. Caso a equipe seja monitorada
em projetos onde foi obtida alta produtividade, mas as tecnologias envolvidas eram bem
conhecidas, um modelo baseado nesse cenário pode criar estimativas de esforço insuficientes
para a mesma equipe realizar um projeto onde tecnologias pouco conhecidas estejam
envolvidas.
Para se obter um modelo mais genérico, é necessário coletar dados de diferentes cenários. Isso
permite identificar por exemplo se o peso de uma variável muda em determinadas condições.
No COCOMO por exemplo, em sua versão de 1981 foram utilizados dados de 63 projetos, e
para o COCOMO II foram 83 projetos (DEVNANI-CHULANI et al, 1998).
3.3 SELEÇÃO DE VARIÁVEIS
Muitos sistemas computacionais necessitam de um grande número de variáveis fornecidas pelo
usuário para o seu funcionamento. Muitas delas poderiam ser utilizados para a criação de um
modelo paramétrico. Sistemas que incluem gráfico de Gantt, como por exemplo o Microsoft
Project (MICROSOFT) ou o ODYSSEA PMS (SENSYS), demonstram graficamente tarefas
distribuídas no tempo, indicando sua data de início, data de fim e recursos alocados, como pode
ser visto na figura 5. Estas variáveis já seriam suficientes para criar um modelo simples que
estimasse a duração das tarefas de acordo com os recursos alocados.
29
No universo de desenvolvimento de software, existe um elevado número de fatores que
exercem efeito direta ou indiretamente na duração das tarefas, e monitorar todos eles seria
inviável, tanto com relação ao custo em armazenamento quanto em esforço necessário para
alimentar e dar manutenção a uma base de dados tão complexa. Selecionar quais variáveis
devem ser monitoradas para futuro uso na criação de um modelo requer experiência e bom
senso do estimador. No modelo COCOMO II é utilizada a seguinte fórmula para estimativa de
esforço:
(1)
Algumas variáveis dessa fórmula são resultado de outras fórmulas, como Fre-eng e Ci. A variável
Ci por exemplo, representa o produto dos níveis de influência encontrados para os
“direcionadores de custo”, que são calibrados e divulgados pelo Centro de Pesquisas da
Universidade do Sul da Califórnia. Cada publicação é conhecida pelo seu ano e um número
seqüencial, com zero sendo a primeira publicação do ano. Para exemplificar, publicação 1999.0
os direcionadores de custo assumem os seguintes valores:
Figura 5: Gráfico de Gantt
EHM
=aTamanhob CiF re-eng
30
Sigla Descrição Nível de Influência
Atributos do produto
RELY Confiabilidade requerida pelo software de muito baixo (0,82) a muito alto (1,26)
DATA Tamanho da base de dados de baixo (0,90) a muito alto (1,28)
CPLX Complexidade do software de muito baixo (0,73) a extra alto (1,74)
DOCU Documentação de muito baixo (0,81) a muito alto (1,23)
RUSE Reusabilidade requerida de baixo (0,95) a extra alto (1,24)
RCPX Confiabilidade e complexidade do software de extra baixo (0,73) a extra alto (2,38)
Atributos da plataforma
TIME Restrições relativas ao tempo de maquina de nominal (1,00) a extra alto (1,63)
STOR Restrições quanto ao uso de memória de nominal (1,00) a extra alto (1,46)
PVOL Mudanças de plataforma de baixo (0,87) a muito alto (1,30)
PDIF Dificuldades com a plataforma de baixo (0,87) a extra alto (2,61)
Atributos da equipe de desenvolvimento
ACAP Capacidade dos analistas de muito baixo (1,42) a muito alto (0,71)
AEXP Experiência na aplicação de muito baixo (1,22) a muito alto (0,81)
PCAP Capacidade dos programadores de muito baixo (1,34) a muito alto (0,76)
PEXP Experiência com a plataforma de muito baixo (1,19) a muito alto (0,85)
LTEX Experiência com a linguagem e ferramental
de muito baixo (1,20) a muito alto (0,84)
PCON Continuidade do pessoal de muito baixo (1,29) a muito alto (0,81)
PERS Capacidade do pessoal de extra baixo (2,12) a extra alto (0,50)
PREX Experiência profissional de extra baixo (1,59) a extra alto (0,62)
Atributos do projeto
TOOL Uso de ferramentas de software de muito baixo (1,17) a muito alto (0,78)
SITE Desenvolvimento multi-local de muito baixo (1,22) a extra alto (0,80)
SCED Prazo requerido para o desenvolvimento de muito baixo (1,43) a muito alto (1,00)
FCIL Instalações de extra baixo (1,43) a extra alto (0,62)
Quadro 1: Direcionadores do COCOMO II
31
A quantidade de parâmetros utilizados no modelo COCOMO II permite que ele gere estimativas
com precisão aceitável numa grande variedade de cenários. Existem outros modelos porém que
envolvem um número menor de parâmetros, limitando assim sua aplicação. O modelo Walston-
Felix por exemplo possui como variável apenas o KSLOC (milhares de linhas de código) como
pode ser visto na fórmula:
(2)
Supondo que uma mesma equipe realizou, em diferentes projetos, algumas atividades muito
semelhantes. No segundo projeto o tempo das atividades foi, em média, três quartos do tempo
do primeiro. No terceiro, o tempo se reduziu a quatro quintos do segundo. Um modelo que leve
em consideração apenas o número de linhas de código e ser produzido não apresentaria
diferença no resultado a medida que a equipe ganha experiência.
A dimensão de um software, seja medida por linhas de código ou por pontos de função, é
visivelmente a variável de maior impacto para se estimar a duração das atividades do projeto.
Mas percebe-se que outros parâmetros podem afetar as estimativas. Estes parâmetros podem ser
até mesmo questões qualitativas como o grau de experiência profissional da equipe.
3.4 NORMALIZAÇÃO
Os dados coletados para cada variável devem passar por um processo de normalização. Isto é
necessário pois podem haver dados redundantes, inconsistentes, corrompidos, em escalas
diferentes e outros problemas que impedem a correta construção de um modelo. O intuito da
normalização seria então tornar o conjunto de dados homogêneo ou consistente (International
Society of Parametric Analysts, 2003, p.5).
Primeiro deve ser feita uma limpeza dos dados, eliminando registros inconsistentes,
corrompidos ou valores anormais. Um valor muito distante do padrão que pode ser visto ao
desenhar os dados em um gráfico, pode indicar um valor incorretamente coletado ou coletado
em uma situação anormal que dificilmente se repetirá e deve ser desconsiderada para não levar
a distorções no modelo.
E=5,2 KSLOC0,91
32
As unidades de cada variável também deve ser verificada. Por exemplo, a duração das tarefas
de um projeto pode ter vindo medida em dias a partir de uma fonte, e um projeto de outra fonte
pode ter a duração das tarefas medida em meses. As unidades deverão ser convertidas para a
que for mais conveniente para o objetivo do modelo.
Podem ser feitos outros ajustes nos dados como remover variáveis inteiras por serem
irrelevantes ao modelo ou serem correlacionadas a outras. Um dos métodos para verificar a
correlação linear entre duas variáveis é o coeficiente de correlação de Pearson. O coeficiente
varia entre -1 e 1, onde 0 representa a inexistência de associação linear entre as variáveis e 1 ou
-1 indicam que todos os pontos caem em uma linha reta (RIBEIRO JR). Porém, um alto valor
do coeficiente não necessariamente indica uma relação de causa e efeito, podendo ser apenas a
tendência que aquelas variáveis apresentam quanto a sua variação conjunta (COSTA NETO,
1977, p.183).
(3)
Onde :
• n: Número de pares.
• r: Coeficiente de correlação de Pearson
Durante a normalização, valores contínuos podem ser discretizados para serem utilizados como
r=n∑ xi yi−∑ xi∑ y i
[n∑ x i2−∑ xi ² ]⋅[n∑ yi
2−∑ y i ² ]
0 0,5 1 1,5 2 2,5 3 3,5 4 4,5 5
0
0,5
1
1,5
2
2,5
3
3,5
4
4,5
5
5,5
6
6,5
7
7,5
8
Figura 6: Valor isolado a ser descartado
33
parâmetros do modelo, como pode ser observado por exemplo nos direcionadores de custo do
COCOMO. Eles possuem nomes que vão do “extra baixo” ao “extra alto”, mas cada nome tem
um valor associado.
Por fim pode ser executado o processo matemático chamado normalização. A normalização
permite regularizar a importância relativa de cada variável, transformando-as de forma a
garantir que todas sejam equivalentes em termos de magnitude (LOPES). Mean centering,
auto-scaling, sigmoidal, zscore e amplitude são algumas das formas de normalização. A
normalização de amplitude é uma das mais comuns sendo utilizada por exemplo em redes
neurais. Ela é feita com a seguinte fórmula:
(4)
Onde:
• m: Valor mínimo escolhido
• M: Valor máximo escolhido
• mx: Valor mínimo no vetor x
• Mx: Valor máximo no vetor x
• zi: Variável normalizada
Para o caso especial de normalização de amplitude para m=0 e M=1, a fórmula é simplificada
para:
(5)
Após estas verificações e ajustes nos dados coletados para as variáveis, elas estão prontas para
serem usadas na criação do modelo. Dados de melhor qualidade possibilitam a criação de
modelos mais precisos. Em teoria, utilizar dados que venham de outras aplicações, como um
ERP, tem a vantagem de ter passado pelas validações do mesmo.
zi= M−m x i−mx
M x−m x
+m
zi=x i−mx
M x−m x
34
3.5 IDENTIFICAÇÃO DE RELAÇÕES MATEMÁTICAS
A relação matemática entre duas variáveis pode se linear ou não linear. Por meio de análise de
regressão é possível identificar a relação entre duas ou mais variáveis, caracterizando-a como
uma expressão matemática. Além de descrever, a expressão permite predizer o valor de uma
variável (variável dependente) a partir das outras (variáveis independentes).
A seguir, serão apresentadas algumas fórmulas utilizadas na regressão linear simples,
polinomial e múltipla (COSTA NETO, 1977, p. 191-209). Com a regressão linear simples,
obtém-se uma linha reta teórica, na forma:
(6)
Onde α e β são estimados com base nos dados, obtendo a reta estimativa na forma:
(7)
Sendo:
a: estimativa do parâmetro α
b: Também conhecido como coeficiente de regressão linear, é estimativa do parâmetro β
ŷ: Valores dados pela reta estimativa
O procedimento chamado mínimos quadrados, determina o valor das variáveis a e b de forma a
tornar mínima a soma dos quadrados das diferenças entre os valores na reta estimativa e os
valores nos dados. Isso é feito usando o seguinte sistema:
(8)
A regressão polinomial segue o mesmo princípio dos mínimos quadrado s, porém são estimados
k + 1 coeficientes. Por exemplo, os parâmetros de uma parábola com valores igualmente
espaçados por exemplo, são estimados resolvendo o sistema:
(9)
Para que sejam consideradas duas ou mais variáveis independentes para estimar uma variável
y= x
y=ab x
{b=∑ xi−x y i
∑ xi−x 2 =
S xy
S xx
a=y−bx
{∑ y i=nac∑ x i−x
2
∑ xi−x y i=b∑ xi−x 2
∑ xi−x 2 y i=a∑ x i−x
2c∑ x i−x
4
35
dependente é usada a regressão múltipla. Para simplificar o sistema de equações pode-se utilizar
os dados normalizados por mean centering, onde a média de um vetor é subtraída de cada um
de seus valores. Isso permite a utilização do seguinte sistema:
(10)
Que pode ser condensado como:
(11)
Sendo:
(12)
(13)
Por exemplo, é possível imaginar criar um modelo que estime o valor de um veículo de acordo
com o seu comprimento e motor. Para esta demonstração da aplicação da regressão múltipla,
foram selecionadas estatísticas de alguns carros nacionais conforme tabela abaixo:
Observando os gráficos percebe-se uma relação entre as variáveis:
{S 1y=b1 S11b2 S 12⋯bk S 1k
S 2y=b1 S 21b2 S 22⋯bk S 2k
⋮
S ky=b1 S k1b2 S k2⋯bk S kk
S iy=∑l
k
bl S il i=1,2 , , k
S iy=∑j
n
x ij y j−
∑j
n
x ij∑j
n
y j
n
S il=∑j
n
x ij xlj−
∑j
n
x ij∑j
n
xlj
n
Tabela 1: Estatísticas sobre veículos (Fonte: Folha de S. Paulo, 14/03/1999, apud BUSSAB; MORETTIN, 2003, p. 489)
Veículo Comprimento (m) Motor (CV) Preço (US$)4,11 110 10.532,004,6 106 16.346,00
3,73 60 6.176,004,47 110 13.140,004,16 76 6.700,004,39 127 12.923,003,64 57 5.257,003,73 61 6.260,00
Chevrolet AstraChevrolet BlazerChevrolet CorsaChevrolet VectraFiat FiorinoFiat MareaFiat Uno MilleFiat Palio
36
Considerando o preço como y, o motor como x1 e o comprimento como x2, tem-se o coeficiente
de correlação de Pearson (fórmula 3) entre y e x1 sendo 0,93 e entre y e x2 sendo 0,87,
confirmando a relevância das variáveis selecionadas. Por meio da regressão múltipla, é possível
calcular obter o modelo y=122,703x1 -267,831x2 que descreve o plano na figura 9:
É possível perceber que o a atenção e esforço necessários para desenvolver estas fórmulas
manualmente aumenta com o número de variáveis sendo considerada. O esforço é ainda maior
quando se quer avaliar a relevância de cada variável candidata a fazer parte do modelo,
comparando-se o resíduo antes e depois da inclusão de cada uma delas (procedimento
conhecido como regressão stepwise). O apoio de uma ferramenta computacional é essencial
para se obter um resultado confiável em um pequeno período de tempo.
Figura 7: Preço x Motor
55 60 65 70 75 80 85 90 95 100 105 110 115 120 125 130
5000
6000
7000
8000
9000
10000
11000
12000
13000
14000
15000
16000
17000
Motor (CV)
Pre
ço (
US
$)
Figura 8: Preço x Comprimento
3,6 3,7 3,8 3,9 4 4,1 4,2 4,3 4,4 4,5 4,6
5000
6000
7000
8000
9000
10000
11000
12000
13000
14000
15000
16000
17000
Comprimento (m)
Pre
ço (
US
$)
Figura 9: Plano y=122,703x1 -267,831x2
37
3.6 VALIDAÇÃO E CALIBRAÇÃO
Depois de formulado com base em dados históricos, um modelo matemático pode ser utilizado
para predição, aplicando-o durante o planejamento de um novo projeto para se obter
estimativas, como foi visto no item 2.4 deste trabalho, no que se refere a estimativa paramétrica.
Espera-se que, ao aplicar um modelo concebido para um cenário similar sejam obtidos
resultados similares, dentro de uma margem de erro conhecida.
Após a conclusão de um projeto, fazendo-se uma análise pos-mortem é possível aferir, dentre
outros elementos, quanto foi o erro médio obtido, comparando o previsto pelo modelo com o
realizado na execução das tarefas. Com isso, é feita a validação do modelo, permitindo verificar
se ele possui a precisão adequada ou se houve mudança na precisão em comparação a um
modelo utilizado anteriormente.
O modelo pode então ser calibrado utilizando os dados do novo projeto executado, repetindo
algumas das atividades desenvolvidas em sua criação. Dependendo das conclusões tiradas na
validação do modelo, pode-se decidir por apenas modificar algumas constantes ou até mesmo
acrescentar e remover variáveis. Portanto, a calibração pode ter custo semelhante ao empregado
para a criação do primeiro modelo.
Percebe-se que a criação e manutenção de um modelo paramétrico de estimativa envolve
processos complexos, que exigem esforço de profissionais com conhecimentos de estatística e
muita atenção ao grande volume de dados envolvidos. O desenvolvimento destas atividades
sem o apoio de ferramentas computacionais fica inviável na maioria dos cenários.
A solução proposta por este trabalho assume todos os processos mostrados na figura 4, exceto o
de coleta de dados, que fica a cargo da ferramenta na qual a solução for integrada. Desta forma,
toda a complexidade dos processos fica encapsulada na solução, que avalia continuamente os
dados disponíveis, indicando quando modelos mais precisos forem encontrados. A técnica
selecionada para realizar esta tarefa foi a de programação evolutiva, que tem sua origem nos
algoritmos genéticos, que serão discutidos na seção seguinte.
3.7 ALGORITMOS GENÉTICOS
As técnicas de inteligência artificial permitem desenvolver soluções mais flexíveis,
apresentando semelhanças com assuntos mais ligados à biologia como a inteligência humana e
38
outros aspectos da natureza. Estes assuntos serviram de base para a criação de tais técnicas, que
podem ser aplicadas virtualmente a qualquer tipo de problema. Reconhecimento de caracteres
por meio de redes neurais e seleção de produtos a serem apresentados a um visitante de um
portal de compras aplicando raciocínio baseado em casos em seu perfil são alguns exemplos.
Charles Darwin desenvolveu no século XIX a teoria da seleção natural. Segundo a teoria, os
indivíduos passam características a seus descendentes e os mais adaptados teriam maior chance
de sobrevivência (LADD, 1994, p. 2). No século seguinte, cientistas conseguiram isolar a
molécula de DNA (acrônimo do inglês deoxyribonucleic acid ou ácido desoxirribonucléico em
português) e, por meio de experimentos com raios X, provaram que os cromossomos, grandes
cadeias de DNA presentes no núcleo das células, eram responsáveis por transmitir as
características entre indivíduos e seus descendentes.
A técnica de algoritmos genéticos foi desenvolvida com base nestas descobertas, trazendo para
a computação muitos conceitos e vocabulário originalmente da biologia. Nesta técnica,
possíveis soluções de um problema são indivíduos dentro de uma população. Cada indivíduo
tem seu cromossomo, estrutura formada por uma cadeia de genes. Cada gene é responsável por
uma característica, uma variável do problema. Os alelos são os valores que um gene pode
assumir, e a informação contida em um cromossomo, denomina-se genótipo.
LADD (1994, p. 8) afirma que um algoritmo genético cria um conjunto de soluções que se
reproduzem com base no seu grau de adaptação a um determinado ambiente (normalmente
chamado de fitness), e que este processo segue os passos:
1. Cria-se uma população inicial de soluções aleatórias.
2. Dá-se um valor de fitness a cada indivíduo, avaliado frente ao problema.
3. Soluções com maior valor de fitness tem mais probabilidade de reproduzir e originar novas
soluções.
4. O novo conjunto de soluções substitui o anterior, completando uma geração e retornando ao
passo 2.
Esta sequência é uma simplificação da teoria da seleção natural. Agregando conhecimentos
sobre o DNA, a técnica inclui dois outros processos importantes que ocorrem durante a
reprodução, no passo 3, conhecidos como operadores genéticos: mutação e crossover. A
mutação consiste em se modificar o alelo de um gene selecionado outro aleatoriamente,
39
enquanto o crossover é a troca de material genético entre dois cromossomos.
Dependendo do problema a ser solucionado, pode-se especificar uma condição de parada, como
por exemplo atingir um tempo limite, um determinado valor de fitness ou encontrar a solução
ótima, o que normalmente é muito difícil dada a natureza estocástica dos algoritmos genéticos.
Durante a busca por uma solução, o algoritmo pode convergir em direção a um máximo local e
não ao máximo global, que seria a solução ótima do problema.
A complexidade da técnica reside em codificar o problema em um cromossomo, definir a
função fitness, que afeta a chance de reprodução dos indivíduos, definir o algoritmo a ser usado
para a seleção natural, definir o número e probabilidade de mutações, definir como ocorre o
crossover entre os cromossomos e definir uma condição de parada. Todas estas definições
dependem de tentativa e erro, não existindo uma regra geral que as oriente.
As únicas restrições que podem ser feitas são com relação à probabilidade de mutação e à
proporção de alelos trocados no crossover. Se houver muita mutação, perde-se a idéia de
evolução e as soluções encontradas se tornam aleatórias, dificilmente convergindo a algo útil.
Se não houver mutação, as gerações deixam rapidamente de apresentar novas soluções. Quanto
ao crossover, se for trocado 100% dos alelos entre dois cromossomos tem-se como resultado os
mesmos cromossomos, eliminando o objetivo do mesmo.
A função fitness é totalmente ligada ao problema que se pretende solucionar. O resultado desta
função é utilizado para realizar a seleção natural dos indivíduos de uma população para outra.
Existem alguns algoritmos conhecidos para realizar a seleção natural, mas estes também podem
sofrer adaptações de acordo com o problema. Porém, todos utilizam o fitness calculado para um
genótipo, avaliando os alelos que representam uma solução codificada no cromossomo.
A forma mais comum e estudada de codificação de problemas em algoritmos genéticos é a
codificação binária, onde cada posição de um vetor é um gene e os alelos possíveis para cada
um são 0 ou 1, representando se uma característica está presente ou não. A mutação de um gene
na codificação binária consiste em alternar um alelo dada uma probabilidade. O crossover é
feito seccionando-se dois cromossomos na mesma posição escolhida aleatoriamente e trocando
os alelos das duas metades.
Davis (apud MICHALEWICZ, 1996, p. 5) observou um franco descrédito por parte de outros
pesquisadores quanto a um sistema desenvolvido por ele ser um algoritmo genético, pois ele
não usou a codificação, mutação e crossover binários. Portanto, para alguns pesquisadores só
40
pode ser considerado algoritmo genético aquele que usa a codificação binária e os operadores
tradicionais. Porém, percebe-se que esta estrutura pode limitar as soluções para problemas
complexos, com estruturas dinâmicas, fazendo-se necessárias outras formas de codificação,
utilizando estruturas como vetores de inteiros, caracteres ou até mesmo árvores no lugar de
vetores.
Abstraindo-se da discussão se algo é ou não um algoritmo genético, MICHALEWICZ (1996)
optou por chamar de programação evolutiva os programas que compartilham das características
básicas dos algoritmos genéticos, independente de sua codificação, implementação de
operadores genéticos ou lógica de seleção natural. Devido às características do sistema proposto
por este trabalho, uma codificação binária não permite a flexibilidade necessária para a criação
e ajuste dos modelos de estimativa, portando seu projeto e implementação pode ser melhor
descrito como um exemplo de programação evolutiva.
3.8 PROGRAMAÇÃO EVOLUTIVA
Não é possível prever o número de variáveis que fará parte de um modelo, tampouco a
disposição e operadores matemáticos entre eles, logo uma estrutura de vetor dificilmente
poderia ser utilizada. Uma codificação em árvore por outro lado, permite uma representação
muito mais natural de modelos matemáticos e por isso foi selecionado para este trabalho.
Neste tipo de codificação, uma mutação não significa simplesmente inverter um bit em um
vetor. Os alelos passam a ser operações matemáticas, caracteres representando variáveis e
constantes numéricas. A ocorrência de uma mutação significa então selecionar aleatoriamente
um alelo no conjunto de alelos possíveis. Porém, isto pode levar a mutações fatais, tornando um
indivíduo inviável. Por exemplo, uma mutação em um genótipo “5 ^ 2” pode originar “5 ^ *”, o
que não representa um modelo matemático válido.
Figura 10: Árvore de (8-3)^2
41
Logo, alguma providência deve ser tomada no algoritmo para tratar esta situação. Como
alternativas, pode-se:
• desfazer e repetir o operador de mutação até que o genótipo seja válido;
• modificar o operador de mutação para que este avalie quais são os alelos válidos naquele
contexto ou para aquele gene específico e selecionar um aleatoriamente deste sub-conjunto;
• criar um operador genético específico para realizar “ajustes” a indivíduos que sofreram
mutações fatais, tornando-os válidos (no exemplo anterior, inserir constantes numéricas
aleatórias à esquerda ou à direita de operadores poderiam tornar o cromossomo “5 ^ *” em
“5 ^ 2 * 2”);
• retornar um fitness que impeça a reprodução dos indivíduos que sofreram mutações fatais,
para que a característica não se dissemine nas gerações seguintes.
Ainda sim, uma estrutura de tamanho fixo não permite a criação de modelos complexos, logo,
outra característica que pode ser usada para diferenciar algoritmos genéticos de programação
evolutiva é a possibilidade de estruturas dinâmicas, sem tamanho fixo, permitindo que um
indivíduo “5 ^ 2” dê origem a um “23 * ( X + 40 ) - 2 ^ 2”. Maiores detalhes sobre a
codificação, algoritmos e operadores genéticos adotados para a solução serão discutidos no
capítulo seguinte.
42
4 ESPECIFICAÇÃO DO SISTEMA PROPOSTO
4.1 INTRODUÇÃO
Para completar o escopo deste trabalho, neste capítulo será feita a especificação de sistema
aplicando técnicas de programação evolutiva com base na bibliografia estudada. Este sistema
foi especificado visando o desenvolvido sobre a plataforma Java, devido à grande
disponibilidade de componentes de software de código aberto na mesma que podem ser
utilizados para reduzir o tempo necessário para o desenvolvimento do protótipo.
O sistema foi especificado como um componente que poderá ser integrado a outros sistemas,
mas também terá a capacidade de funcionar de forma independente. Na forma de componente, a
comunicação com o sistema onde ele estará contido se dará por meio de interfaces Java com
métodos onde o sistema poderá fornecer os dados a serem analisados e o modelo matemático
atualmente sendo utilizado. Há outro método para que o sistema possa recuperar o melhor
modelo encontrado até o momento pelo componente.
Em sua forma independente, o sistema é instalado em um servidor de aplicação como o JBoss
Application Server (JBOSS) ou o GlassFish (SUN), e disponibilizará os mesmos métodos como
web services. Desta forma, qualquer aplicação com acesso ao servidor web onde o sistema
estiver ativo, poderá se integrar a ele.
4.2 ARQUITETURA GERAL
A representação dos modelos matemáticos que chegam e saem do sistema é feita usando um
padrão aberto, como o MathML (W3C) ou o OpenDocument Formula (OASIS). A utilização de
um destes padrões, baseados em XML (W3C), permite uma maior facilidade de integração com
outros sistemas. Com uma arquitetura modular, é possível adicionar suporte a outros formatos
caso necessário. Assim, o sistema tem a seguinte divisão:
43
O analisador de modelo poderá ter uma implementação para cada formato. Para o primeiro
protótipo, os modelos serão passados para o núcleo do sistema diretamente pela interface
especificada para tal. O núcleo do sistema é onde ocorrerá a análise dos dados e do modelo
atual. Os dados recebidos deverão ser das variáveis existentes no modelo inicial e, caso
disponível, variáveis que ainda não façam parte do modelo. Para atender aos objetivos deste
trabalho, apenas o núcleo do componente foi especificado, deixando o detalhamento de outros
componentes para trabalhos futuros.
4.3 EXPERIMENTOS COM JGAP
O núcleo do sistema foi projetado para que utilizasse a técnica de programação evolutiva,
descrita no capítulo anterior. Durante a pesquisa para o desenvolvimento deste trabalho, foi
encontrado um framework para a plataforma Java chamado JGAP. Conforme descrito em seu
endereço na internet, este framework fornece os mecanismos básicos para aplicar princípios
evolutivos a solução de problemas. Com mais de seis anos de desenvolvimento e atualmente em
sua versão 3.01, ele possui uma arquitetura bem definida, facilitando sua utilização. Outro
motivo que levou à escolha deste framework é o fato de ele possuir suporte a programação
evolutiva, incluindo classes e interfaces para tal fim.
Figura 11: Divisão do sistema
44
Com o código fonte, que pode ser encontrado a partir de seu endereço na internet, estão
inclusive classes de exemplo, que permitem o entendimento de cada uma de suas características
e funcionalidades. Com base na classe examples.gp.MathProblem, foram feitos testes para
verificar a validade da idéia proposta por este trabalho. A classe gera 20 valores aleatórios para
uma variável X e executa a função X 4X 3
X 2−X=Y armazenando em uma tabela o X de
entrada e o Y resultante. Depois disso, o JGAP cria uma população de 1000 genótipos montados
aleatoriamente e dá início à evolução por 800 gerações, originando genótipos capazes de dar
resultados cada vez mais próximos da função que deu origem à tabela.
Em sua implementação, o exemplo usa a técnica conhecida como elitismo. Ela serve para evitar
que o melhor indivíduo seja perdido, passando uma cópia do mesmo para as gerações seguintes
até que seja encontrado outro de melhor fitness. Durante a execução, são mostrados na tela
avisos a cada 25 gerações passadas e mensagens indicando quando um novo melhor indivíduo
foi encontrado.
A literatura apresenta mais comumente, problemas onde o maior valor de fitness representa o
indivíduo mais adaptado. No caso de uma função matemática que deve se aproximar de uma
massa de dados, um indivíduo mais adaptado pode ser interpretado como uma função de maior
precisão, ou menor erro. Logo, utilizando o erro como fitness, tem-se que um indivíduo com
fitness zero representa uma solução ótima para o problema, com base na massa de dados
recebida.
Como são utilizados números aleatórios, cada execução do programa apresenta um resultado
diferente. Para avaliar o comportamento desse resultado em diferentes execuções, foi criada
uma nova classe (MathProblem2) com algumas adaptações. A primeira delas foi adicionar um
laço de repetição para que se pudesse executar várias rodadas, indo da primeira à última
geração, em uma mesma execução, armazenando o melhor fitness encontrado em cada rodada
em um arquivo texto que pudesse depois ser aberto em uma planilha eletrônica, permitindo uma
análise mais simplificada dos dados.
A nova versão da classe também foi desenvolvida de forma a aceitar o número de rodadas e o
número de gerações em cada uma como parâmetros fornecidos por linha de comando. Devido
às restrições de se tomar um tempo considerável para completar cada rodada e ter, no momento
em que o teste foi realizado, apenas uma CPU disponível para o seu desenvolvimento e
execução, o número de gerações foi reduzido de 800 para 500. Realizando o teste com 180
rodadas usando os algoritmos originais da classe MathProblem, os resultados deram origem ao
45
seguinte gráfico após 115 minutos de processamento:
Este gráfico mostra a distribuição dos valores divididos em 10 classes, sendo estas intervalos
iguais entre os valores de erro mínimo de 14,3 e o máximo de 53,52. Calculou-se também o
valor de média como sendo 30,37. Este teste demonstra que a técnica de programação evolutiva
pode ser utilizada para se criar funções que descrevam uma determinada massa de dados.
Contudo, é necessário obter-se uma função com erro aceitável para o problema que foi
modelado.
No caso proposto por este trabalho, imaginando um projeto que teve todas as suas tarefas
modeladas em dias, um erro médio de 30,37 pode levar ao encerramento do projeto com um
mês de atraso. Com o objetivo de fazer com que houvesse uma convergência mais rápida dos
indivíduos a cada geração em direção a um melhor fitness e utilizando-se da arquitetura
modular do JGAP, foi criada uma nova implementação da interface INaturalGPSelector, que
determina os métodos que uma classe deve conter para que seja usada pelo framework para
realizar o processo de seleção natural.
A classe foi chamada de ScalingSelector por ter sido pensada inicialmente para implementar a
técnica de fitness scaling. Esta técnica consiste em aplicar uma escala aos valores de fitness para
aumentar a probabilidade de que os indivíduos mais adaptados sejam selecionados para
reprodução. Esta técnica foi selecionada pois, durante depuração do código em execução, foi
Figura 12: Frequência dos resultados em 180 rodadas
18,22
22,15
26,07
29,99
33,91
37,83
41,76
45,68
49,6
53,52
0
2,5
5
7,5
10
12,5
15
17,5
20
22,5
25
27,5
30
Frequência por Intervalo
Original
46
visto que havia uma evolução rápida nas 50 primeiras gerações (descendo de fitness 600 para
100 numa sucessão de 6 indivíduos por exemplo).
Depois, no mesmo teste, a velocidade com que eram mostrados os novos melhores indivíduos
caía, mostrando apenas 3 em 250 gerações, chegando a um fitness de 30. Por fim, as últimas
gerações dificilmente produziam algum indivíduo melhor. Isso ocorre pois, com o passar das
gerações, diminuía a diferença entre o fitness dos indivíduos da população a tal ponto que
provocava uma alta probabilidade de se selecionar um indivíduo com o pior genótipo. Por
exemplo, numa primeira geração em uma população de 3 indivíduos temos os fitness 1.000,
10.000 e 1.000.000 mas depois de centenas de gerações temos indivíduos com 100, 110 e 111.
Antes de aplicar a escala ao fitness de todos os indivíduos, elevando seus valores ao quadrado,
foi necessário multiplica-los por -1 e somar a eles o maior valor encontrado anteriormente.
Desta forma, o melhor indivíduo passa a ser o de maior valor de fitness e, após a aplicação da
escala, a diferença entre os indivíduos quanto à probabilidade de seleção para reprodução é
aumentada. Outra consequência é que neste momento, o fitness zero passa a indicar um
indivíduo sem chances de ser selecionado para reprodução. Ao iniciar os testes com a classe,
foram encontrados dois casos especiais de valor de fitness decorrentes da plataforma Java e do
modo no qual o JGAP foi projetado e implementado.
O primeiro caso é com relação a genótipos que representam funções que não podem ser
solucionadas no conjunto dos números reais. Na plataforma Java, ao se tentar calcular a raiz de
um número negativo, ou elevar um número negativo a um expoente fracionário, o resultado
retornado é a constante NaN, que na plataforma é conhecido como “not a number”, indicando
que o resultado “não é um número”. Um resultado NaN não é considerado maior, menor ou
igual a qualquer outro valor, incluindo outro NaN. Por isso, para o modelo proposto, um
indivíduo que retorne NaN pode ser considerado inválido e a lógica da classe implementada
trata estes casos colocando-os com fitness zero, retirando suas chances de serem escolhidos para
reprodução.
Nas populações encontradas nos testes, também existiam genótipos retornando infinito como
valor de fitness. Lembrando que originalmente este valor indica o erro da função em
comparação à massa de dados, estes indivíduos de erro infinito também foram considerados
inválidos. Em conjunto com esse tratamento, e ainda com o objetivo de acelerar a convergência
no decorrer das gerações, a técnica de threshold foi agregada ao algoritmo implementado na
classe, fazendo com que todos os indivíduos com erro maior que 5000 não tivessem chance de
47
reprodução. Este valor foi arbitrado com base em observações feitas durante a depuração dos
testes.
Um valor maior de threshold deixaria que muitos indivíduos com genótipos prejudiciais
tivessem chance de reprodução, enquanto um valor muito reduzido poderia impedir a
participação de um indivíduo que contivesse uma parte extremamente benéfica de ser utilizada
em uma operação de crossover. O valor arbitrado fez com que em média, 300 indivíduos da
população de 1000 tivessem chances de reprodução. A determinação de um valor ideal tomaria
um tempo maior do que o disponível para a conclusão deste trabalho, e o valor atual foi
suficiente para as conclusões tiradas a seguir.
Com a nova classe, verificou-se que a média foi reduzida de 30,37 para 0,0097. Outro resultado
que deve ser destacado é a presença de 19 rodadas que chegaram à solução ótima, ou seja, em
menos de 500 gerações foi descoberta a função que deu origem aos dados, provando a
aplicabilidade da abordagem. O tempo de processamento subiu de 115 para 16183 minutos,
porém o algoritmo foi implementado sem fazer modificações no JGAP que pudessem aumentar
seu desempenho, logo, existe margem para que ajustes sejam feitos no algoritmo ou no próprio
JGAP, mas isto não afeta o objetivo deste trabalho, podendo ser realizado em trabalhos futuros.
Estes experimentos foram necessários tanto para provar o conceito quanto para adquirir o
Figura 13: Frequência dos resultados para 180 rodadas
usando a classe ScalingSelector
0,04
0,07
0,11
0,15
0,18
0,22
0,26
0,3 0,33
0,37
0
20
40
60
80
100
120
140
160
180
Frequência por Intervalo
ScalingSelector
48
conhecimento prático para se criar uma especificação coerente do sistema proposto. No sub-
capítulo seguinte serão apresentados os diagramas de classe desenvolvidos, explicações sobre o
objetivo das mesmas e sobre a organização de pacotes.
4.4 CLASSES E PACOTES
Como foi dito no sub-capítulo 4.1, a especificação apresentada será do núcleo do componente,
onde os conceitos pesquisados serão aplicados. Devido a isso, dentro de um pacote chamado
“nucleo”, se encontram os pacotes “model”, “control” e “jgap”. O pacote “model” representa o
modelo de dados do sistema. Nele estão as interfaces ITarefa, IVariavel e IRegistro. Estas
interfaces permitem que o componente possa ser integrado a qualquer outro sistema, recebendo
os dados necessários do mesmo, que devem estar organizados em instâncias de implementações
destas interfaces.
Figura 14: Classes e sub-pacotes do pacote "nucleo"
49
Visto que diferentes sistemas ter seus modelos de dados projetados da forma que seus analistas
acharem conveniente, a utilização de interfaces permite a flexibilidade para que sejam criadas
classes que integrem o sistema proposto como um componente, sem a necessidade de alterações
no código existente.
A interface ITarefa define o conjunto mínimo de atributos que uma tarefa deve ter para ser
utilizada com o sistema, tendo uma implementação padrão chamada TarefaImpl. Os atributos
são o nome da tarefa, que funciona como um identificador único, e o esforço realizado na
execução da tarefa. Como não é possível modelar todos os outros atributos que podem estar
associados a uma entidade chamada tarefa nos diferentes sistemas existentes no mercado, existe
uma composição com a interface IRegistro.
A interface IRegistro permite adicionar todas as outras variáveis relacionadas à tarefa,
agregando uma coleção da interface IVariavel, e para facilitar a integração, já existirão as
classes RegistroImpl e VariavelImpl implementando as interfaces. Por exemplo, em um sistema
de gestão de projetos pode haver uma entidade tarefa possuindo, entre outros, os atributos
“dificuldade” e “equipe”. Supondo ainda que este sistema tenha “equipe” como entidade com
um atributo “experiência”, para que as tarefas desse sistema e os atributos mencionados sejam
passados para o componente proposto nesse trabalho, poderá ser criada uma instância da classe
TarefaImpl para cada tarefa, associada a uma instância de RegistroImpl contendo uma
VariavelImpl representando o atributo “dificuldade” e outra para o “experiência”.
A interface IVariavel, como já pode ter sido deduzido com o exemplo anterior e pelo seu nome,
define uma variável que foi medida no projeto e que pode afetar a tarefa de alguma forma. Ela
não necessariamente é um atributo da entidade que representa uma tarefa no sistema onde o
componente está sendo integrado, mas pode vir de outra entidade, como a “equipe” do exemplo
anterior, ou até mesmo direto de um campo em um banco de dados, já que o sistema não
necessita de ter sido projetado usando orientação a objetos.
O pacote “control” contém as classes de controle do componente, que serão chamadas pelo
sistema externo. São elas FuncaoDelegate, VariavelDelegate, RegistroDelegate, StatusDelegate
e BaseControl. A maioria delas recebeu o sufixo Delegate em referência ao padrão de projeto
BusinessDelegate. “A função do BusinessDelegate é proporcionar controle e proteção para o
serviço de negócios” (ALUR; CRUPI; MALKS, 2002, p. 224).
A classe FuncaoDelegate permite ao sistema informar qual modelo matemático é utilizado no
50
momento. Este modelo deverá vir como um genótipo utilizando as classes fornecidas pelo
JGAP para representação de um modelo matemático, para que possa ser inserido na primeira
geração. A VariavelDelegate permite a adição, modificação e remoção das variáveis que serão
avaliadas pelo componente. O RegistroDelegate permite adicionar modificar ou remover tarefas
e seus registros associados.
Como o componente deverá fazer seu processamento paralelamente ao sistema onde ele se
encontra utilizando multithreading, todo momento que um novo modelo de melhor precisão for
encontrado, ele informará o sistema por meio da interface ICallbackControl, também contida no
pacote “control”. Para que o sistema possa consultar o estado do componente e qual o último
melhor modelo encontrado, existe a classe StatusDelegate. Os estados que podem ser retornados
são os seguintes:
O estado “Normalizando Registros” indica que o componente está verificando se todos os
registros possuem variáveis em comum para que possam ser consideradas durante o estado
“Analisando”. Caso uma variável possua valor apenas em uma tarefa e esteja sem valor ou
simplesmente não exista no registro de outras tarefas, esta variável poderá ser descartada do
registro ou a tarefa e seu registro serão descartados da base, dependendo de configuração que
Figura 15: Estados possíveis do componente
51
poderá ser feita em um arquivo texto externo ao componente. No estado “Analisando”, o
componente está realizando os processos de programação evolutiva, buscando um modelo
otimizado. Por fim, o estado pode se tornar “Encerrado” caso ocorra uma das condições de
parada indicadas no diagrama.
A classe BaseControl tem como objetivos representar uma base de dados, onde será feito o
controle da persistência das tarefas, registros, variáveis e modelos encontrados, e fornecer os
mesmos para as outras partes do componente. Para um primeiro protótipo, esta classe poderia
armazenar as informações apenas em memória, utilizando as estruturas de dados já existentes na
API de coleções da plataforma Java, como as classes HashTable ou Vector.
O último pacote, chamado “jgap” contém as classes desenvolvidas para que o framework JGAP
seja utilizado pelo componente para realizar o seu objetivo final, que é utilizar programação
evolutiva para otimizar modelos de estimativa de tarefas de software. As classes deste pacote
são VariavelGA, VariavelFitnessFunction, ModeloGP, ModeloFitnessFunction e
ScalingSelector.
A classe ScalingSelector é a já apresentada no item 4.3 deste trabalho. O ModeloGP é a classe
que utilizará o ScalingSelector em conjunto com a parte de programação evolutiva do JGAP,
para evoluir populações de modelos matemáticos com um conjunto de variáveis selecionado
pela classe VariavelGA. Os modelos serão codificados em árvore e será utilizada a classe
ModeloFitnessFunction para isolar a lógica já descrita de utilizar o erro do indivíduo como
fitness.
Finalmente, a classe VariavelGA utiliza a parte do JGAP que implementa algoritmos genéticos
da forma tradicional, com codificação binária, para selecionar quais das variáveis disponíveis
serão utilizadas pelo ModeloGP. Com isso surge a oportunidade do componente criar modelos
mais otimizados, incluindo variáveis que tragam melhoria ou removendo variáveis irrelevantes
e, desta forma, atingindo o objetivo deste trabalho. As funcionalidades descritas até o momento
podem ser divididas nos seguintes casos de uso:
52
Estas definições servem de base para guiar a implementação de um protótipo funcional. Uma
futura especificação das outras partes do componente permitirá uma maior flexibilidade de
integração com sistemas existentes em diferentes tecnologias, mas está fora do escopo deste
trabalho.
Figura 16: Casos de uso iniciados pelo sistema externo
Figura 17: Caso de uso iniciado pelo componente
53
5 CONCLUSÕES E PERSPECTIVAS FUTURAS
5.1 CONCLUSÕES
Os objetivos específicos definidos no item 1.3.2 deste trabalho foram atingidos, visto que foi
mostrado no capítulo 3 o processo para criação de modelos matemáticos, atendendo ao objetivo
específico “a”. Depois foi feita a especificação de um sistema capaz de realizar ajustes a
modelos matemáticos (objetivo “b”). E, por fim, implementado um protótipo seguindo esta
especificação, que foi validado contra uma massa de dados simulados, contemplando os
objetivos restantes.
Foram apresentados os conceitos e dificuldades que atuam desde a criação até a aplicação de
modelos de estimativa de esforço para tarefas de software. Com base nas técnicas de algoritmos
genéticos e programação evolutiva, o modelo especificado é capaz não apenas de otimizar
funções matemáticas, mas também de criar funções originais que descrevem com mais precisão
o comportamento da massa de dados histórica recebida.
O componente foi especificado de forma altamente modular, permitindo sua futura extensão
para que possa ser integrado a outros sistemas. A especificação, feita com foco na plataforma
Java, se concentrou principalmente no núcleo do componente, onde se encontram as classes que
desempenham o objetivo do modelo proposto.
Com a implementação do modelo proposto, cada organização poderá utilizar uma função criada
especificamente para sua realidade, capaz de fornecer estimativas muito mais precisas. Funções
que, sem a solução proposta, poderiam levar anos para serem ajustadas com base em dados
históricos acumulados de vários projetos e necessitando de um grande esforço de especialistas
de diversas áreas como estatística e gestão.
54
5.2 PERSPECTIVAS FUTURAS
Com os experimentos realizados, foi possível observar que muitas técnicas podem ser
combinadas para se chegar a resultados cada vez mais precisos, porém, à medida que os
algoritmos se tornam mais complexos, cresce a necessidade de otimizá-los, podendo ser
necessário modificar até mesmo o framework que foi utilizado contendo os mecanismos de
algoritmos genéticos e programação evolutiva.
Outra forma de melhorar o desempenho do sistema seria combinar técnicas de processamento
distribuído, permitindo que vários equipamentos dividam a carga e, conseqüentemente, reduzam
o tempo necessário para se atingir um determinado valor de erro, ou para que se possa aplicar
algoritmos ainda mais complexos que levem a resultados mais precisos.
A especificação do sistema pode ser mais detalhada para fornecer uma arquitetura que facilite
ainda mais a integração a outros sistemas independente de suas plataformas tecnológicas. Com
isso poderão ser criados servidores que forneçam o serviço de otimização de estimativas. No
momento em que houverem organizações diferentes utilizando o serviço, e caso estas estejam
dispostas a disponibilizar seus dados, estes podem ser analisados, comparando os diferentes
modelos criados em busca de informações que possam melhorar ainda mais o modelo proposto
por este trabalho.
Por fim, as técnicas aqui apresentadas podem ser transportadas para outros cenários, como por
exemplo, criar uma função capaz de estimar com maior precisão o possível crescimento do
produto interno bruto de um país dada uma determinada massa de dados históricos de
indicadores econômicos do país e mundiais. Ou para estimar quantas toneladas de uma
determinada cultura serão produzidas dado o histórico de variáveis climáticas e quantidade de
insumos.
55
6 REFERÊNCIAS BIBLIOGRÁFICAS
AGUIAR, Mauricio. Estimando os projetos com COCOMO II.Rio de Janeiro: tiMÉTRICAS. 2004. Disponível em: <http://www.metricas.com.br/Downloads/Estimando_Projetos_COCOMO_II.pdf> Acesso em: 20/05/2006
ALUR, Deepak; CRUPI, John; MALKS, Dan. Core J2EETM patterns: as melhores práticas e estratégias de design. Rio de Janeiro: Campus, 2002. ISBN 85-352-1004-0
BUSSAB, Wilton de O.; MORETTIN, Pedro A. Estatística básica. 5. ed. São Paulo: Saraiva. 2003. ISBN 85-02-03497-9
Computational Science Education Project. Introduction to Monte Carlo Methods Disponível em: <http://www.phy.ornl.gov/csep/CSEP/MC/NODE1.html#SECTION00010000000000000000> Acesso em: 17/05/2006
COSTA NETO, Pedro L. Estatística. São Paulo: Edgard Blücher. 1977. ISBN 85-212-0097-8
DEVNANI-CHULANI, Sunita et al. Calibration approach and results of the COCOMO II post-architecture model. 1998. Disponível em: <http://sunset.usc.edu/Research_Group/Sunita/down/ispadoc.pdf> Acesso em: 04/06/2006
DURKIN, John. Expert systems: design and development. New York : Macmillan Publishing Company, 1994. ISBN 0-02-330970-9
DŽEROSKI, Sašo; TODOROVSKI, Ljupčo. Discovering Dynamics: From Inductive Logic Programming to Machine Discovery. Journal of Intelligent Information Systems, Boston, p. 89-108, 1994.
HUGHES, Bob; COTTERELL, Mike. Software Project Management. New York: McGraw Hill, 1999.
International Society of Parametric Analysts. Parametric estimating handbook. 2003. Disponível em: <http://www.ispa-cost.org/PEIWeb/Third_edition/Handbook/Finalized.zip> Acesso em: 02/06/2006
JBOSS. Jboss Aplication Server. Disponível em: <http://www.jboss.org/products/jbossas> Acesso em: 18/06/2006
LADD, Scott. Genetic Algorithms in C++. New York: M&T Books, 1995. ISBN 1-55851-459-7.
LOPES, João. Normalização. Disponível em: <http://bsel.ist.utl.pt/2004/PortalQuimiometria/Contents/procdados/node7.html> Acesso em 06/06/2006
Machine Learning. Disponível em: <http://en.wikipedia.org/wiki/Machine_learning> Acesso
56
em: 05/04/2006
MICHALEWICZ, Zbigniew. Genetic algorithms + data structures = evolution programs. New York : Springer, 1996. ISBN 3-540-58090-5.
MICROSOFT. Microsoft Office Online: Project. Disponível em: <http://office.microsoft.com/pt-br/FX010857951046.aspx> Acesso em: 14/06/2006
Monte Carlo Method. Disponível em: <http://en.wikipedia.org/wiki/Monte_Carlo_method> Acesso em: 10/05/2006
OASIS. OpenDocument – Formula. Disponível em: <http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=office-formula> Acesso em: 18/06/2006
PETERS, James F.; PEDRYCZ, Witold. Engenharia de Software: Teoria e Prática. Rio de Janeiro : Campus, 2001. ISBN 85-352-0746-5.
PRESSMAN, Roger S. Engenharia de Software. São Paulo : Makron Books, 1995.
Project Management Institute. A Guide to the Project Management Body of Knowledge (PMBOK® Guide). 3. ed. Newton Square: Project Management Institute. 2004. ISBN 193069945X.
Project Management Institute. Practice Standard for WBS. Newton Square : Project Management Institute, Inc. 2001. ISBN 1-880410-81-8.
RIBEIRO JÚNIOR, Paulo J. Correlação. Disponível em: <http://www.est.ufpr.br/~paulojus/CE003/ce003/node8.html> Acesso em: 06/06/2006
SENSYS Consultoria e Sistemas. ODYSSEA PMS. Disponível em: <http://www.sensys.com.br/index.php?option=com_content&task=view&id=14&Itemid=28> Acesso em: 14/06/2006
SUN. GlassFish. Disponível em: <https://glassfish.dev.java.net/> Acesso em: 18/06/2006
The CHAOS Report (1994). Disponível em: <http://www.standishgroup.com/sample_research/chaos_1994_1.php> Acesso em: 05/04/2006
TODOROVSKI, Ljupčo. Equation Discovery. Maio. 2001. Disponível em: <http://www-ai.ijs.si/~ljupco/ed/> Acesso em: 05/04/2006
W3C. World Wide Web Consortium. Disponível em: <http://www.w3.org/> Acesso em: 18/06/2006
WRIGHT, James Terence Coulter; GIOVINAZZO, Renata Alves. Delphi – Uma ferramenta de apoio ao planejamento prospectivo. In: Caderno de Pesquisas em Administração. São Paulo. v.01. n°.12. 2000. Disponível em: <http://www.iea.usp.br/iea/futuro/delphi.pdf> Acesso em: 02/06/2006
WU, Liming. The Comparison of the Software Cost Estimating Methods. Disponível em: <http://www.computing.dcu.ie/~renaat/ca421/LWu1.html> Acesso em: 10/05/2006