• Sonuç bulunamadı

1982 Anayasasında Başbakan

THE PRIME MINISTER IN THE 1982 CONSTITUTION

C. Hukuki Sorumluluğu

A Engenharia de Software Baseada em Buscas, tal como seu nome sugere, lida com problemas da engenharia de software como problemas de busca, e procura utilizar algoritmos de otimização para automatizar a construção de soluções para tais problemas [Harman, Jones

CAPÍTULO 2 – FUNDAMENTAÇÃO TEÓRICA 22

2001]. Trata-se de uma vertente de pesquisa relativamente nova dentro da Engenharia de Software, que gradativamente tem conquistado relevância por sua vasta aplicabilidade.

A Tabela 3 enumera os principais problemas de busca nas diferentes áreas da engenharia de software aos quais se aplicam algoritmos de otimização, com base na revisão bibliográfica documentada em [Harman, Jones 2001]. Conforme pode ser observado, os problemas identificados estão espalhados por todo o ciclo de vida dos sistemas de software.

No planejamento de projeto, existe o problema de alocação de recursos decorrente das restrições das tarefas de projeto que devem ser realizadas, tais como prazo, orçamento e prioridade, das interdependências entre as tarefas, e da disponibilidade de recursos. Esse problema é genericamente denominado de problema de construção de cronogramas de projetos, podendo receber denominações específicas conforme o tipo de tarefas consideradas, como tarefas de um processo de desenvolvimento (análise, projeto, implementação, testes e manutenção). Outros problemas discutidos consistem na estimativa de tamanho de um projeto dados os seus requisitos, por exemplo, e na estimativa de custo de um projeto, dado o tamanho deste, o esforço envolvido, seus atributos de qualidade e o cronograma planejado.

Tabela 3. Problemas de busca em engenharia de software.

Área Problemas

Planejamento de projeto Alocação de recursos, Estimativa de tamanho, Estimativa de custo

Engenharia de requisitos Seleção de requisitos, Priorização de requisitos Projeto da arquitetura Melhoria de qualidade da arquitetura

Implementação Otimização de código-fonte

Testes Seleção de casos de teste, Priorização de casos de teste, Geração de dados de teste

Já na engenharia de requisitos, um dos principais problemas de busca investigados consiste na seleção do conjunto de requisitos que deve estar presente para a próxima iteração de desenvolvimento, o denominado problema da próxima versão, no qual devem ser balanceadas as necessidades do cliente, as restrições de recursos e as interdependências entre requisitos. Diretamente relacionado a este problema, existe a questão de ordenação de requisitos de acordo com a relevância ou prioridade destes como parte da atividade de planejamento de uma iteração de desenvolvimento.

Em se tratando de projeto arquitetural, um problema recorrente é a melhoria de um projeto arquitetural segundo a abordagem de engenharia reversa, através da qual os limites

CAPÍTULO 2 – FUNDAMENTAÇÃO TEÓRICA 23

dos elementos arquiteturais são redefinidos a fim de melhorar atributos de coesão e acoplamento da arquitetura como um todo.

Na atividade de implementação, embora ainda seja restrita a pesquisa no contexto de engenharia de software baseada em buscas, verifica-se a aplicação de algoritmos de busca em compiladores a fim de encontrar sequências de otimização que resultem em códigos de tamanho reduzido.

Por fim, na área de testes, na qual foram publicados os primeiros trabalhos no contexto de engenharia de software baseada em buscas, os principais problemas dizem respeito à seleção e priorização de casos de teste, semelhantemente ao que acontece na engenharia de requisitos, e na geração de casos de teste, que consiste na identificação de dados de entrada válidos para uma aplicação de acordo com os critérios de teste.

Em algumas destes problemas são utilizadas técnicas tradicionais de busca, como busca exaustiva e branch-and-bound. No entanto, devido à complexidade dos problemas, nem sempre é possível aplicar as técnicas tradicionais para encontrar uma solução ótima, devido ao elevado custo computacional envolvido. Nesse sentido, a aplicação de metaheurísticas tem se apresentado frequentemente como solução.

Uma metaheurística é um conjunto de conceitos que são usados para definir métodos heurísticos que podem ser aplicados a uma grande variedade de problemas. Na engenharia de software baseada em buscas, as metaheurísticas mais comumente adotadas são Hill Climbing, Simulated Annealing (SA) e Algoritmos Genéticos [Harman, Jones 2001]. Por padrão, a metaheurística Hill Climbing parte de uma solução inicial e a cada iteração gera uma solução na vizinhança da solução atual. Se a nova solução melhorar o valor da função objetivo, a nova solução é aceita, o que significa que a busca procede a partir dela. Caso contrário, a solução é rejeitada e é gerada uma nova solução a partir da solução corrente. A busca prosssegue até que nenhuma melhora significativa sobre o valor da função objetivo seja alcançada, um número fixo de iterações seja atingido, ou alguma outra condição de parada seja satisfeita.

A metaheurística Simulated Annealing (SA) [Kirkpatrick et al. 1983], empregada no presente trabalho, simula o método de recozimento usado na metalurgia, onde um metal é aquecido até o seu ponto de fusão e em seguida é resfriado lentamente até solidificar-se novamente, atingindo o seu estado de energia mínima. Quando aplicado a problemas de otimização, SA permite que o algoritmo de busca aceite soluções ruins, a fim de melhor explorar o espaço de busca. A probabilidade de aceitação é gradativamente reduzida ao longo

CAPÍTULO 2 – FUNDAMENTAÇÃO TEÓRICA 24

da busca, de maneira que quanto mais lenta for essa redução, maior é a possibilidade do algoritmo resultar na solução ótima ou em uma solução próxima desta.

Por fim, algoritmos genéticos procuram imitar o processo de evolução observado na natureza, com o intuito de encontrar soluções próximas da ótima para problemas de elevada complexidade. Dessa forma, essa estratégia consiste de uma representação das soluções sob a forma de genes, um conjunto de operadores genéticos para gerar novos indivíduos (soluções) e uma função de avaliação para determinar quais os indivíduos mais capazes, ou seja, as soluções mais próximas da ótima [Davis 1991].

O presente trabalho define um algoritmo que emprega a metaheurística SA para agrupar componentes de software em módulos. O objetivo do algoritmo é agrupar componentes segundo o nível de dependência existente entre eles, de maneira que componentes fortemente dependentes sejam agrupados a fim de definir módulos fracamente dependentes entre si, que possam ser desenvolvidos por equipes distintas com reduzida necessidade de comunicação. Ao contrário de algoritmos aplicados ao projeto da arquitetura visando melhorar a sua qualidade simplesmente, o algoritmo desenvolvido utiliza o projeto arquitetural para dar suporte à atividade de alocação de equipes de desenvolvimento, contribuindo com a área de planejamento de projeto (Tabela 3). O Capítulo 5 apresenta em detalhes o algoritmo definido neste trabalho.

2.5. Considerações Finais

Este capítulo apresentou as principais áreas de estudo envolvidas no presente trabalho e cujo conhecimento se faz necessário para o seu entendimento como um todo: Linhas de Produto de Software, com ênfase no aspecto de variabilidade, que impõe diferenças em relação ao desenvolvimento tradicional de software quanto à avaliação da dependência entre componentes; Arquitetura de Software, com foco no uso de métricas para avaliar a dependência entre componentes e no uso de DSM para representar a arquitetura; e Engenharia de Software Baseada em Buscas, com ênfase no uso de metaheurísticas como estratégia de busca. Dado que a literatura é ampla a cerca de tais áreas, o capítulo focou nos tópicos relevantes para o trabalho, mas leituras adicionais são fortemente recomendadas para um estudo aprofundado sobre cada uma das áreas de pesquisa.