# Otimização em engenharia de software

A Otimização em engenharia de software é uma recente área de pesquisa que trata da aplicação de técnicas de otimização matemática para a resolução de problemas complexos da engenharia de software. Apesar de já existirem trabalhos relacionados nas últimas décadas do século XX o campo obteve maior atenção e abrangência a partir de 2001 com a publicação de um artigo que deu a denominação "Search-based Software Engineering" ao campo.

## A engenharia de software como uma área de engenharia

O nome da disciplina engenharia de software indica que sua função está na criação de softwares (incluindo, por exemplo, especificação, desenvolvimento e manutenção). Dessa forma, o termo 'engenharia' é usado pois nessa área da Ciência da Computação são definidos métodos e técnicas que objetivam a construção de sistemas de software com foco na definição e modelagem de aspectos do processo de construção do software. Dessa forma, a engenharia de software convencional trata das normas e práticas que devem ser seguidas para que sistemas de software possam ser construídos com qualidade.
O fator matemático que também transparece ao termo 'engenharia' não é comumente utilizado na engenharia de software. Entretanto, diversas são as situações durante o desenvolvimento de software nas quais a presença de características matemáticas são fatores essenciais. Por exemplo, considere o problema da seleção de casos de testes que acontece durante a fase de teste de software. Essa atividade poderia seguir regras textuais definidas em normas de processo de construção de software, mas percebe-se que um melhor resultado pode ser obtido se fatores matemáticos como a cobertura dos casos de teste e suas prioridades e ordem são levados em consideração. Dessa forma seria possível descobrir qual o conjunto de casos de teste que mais beneficiam a empresa de desenvolvimento em relação a custo, tempo, entre outros. Nesse caso, não é apenas a existência desses fatores matemáticos que indicam a necessidade de outra abordagem de resolução, mas também a presença de fatores como a seleção e ordenamento.
De acordo com essa visão, a área de engenharia de software pode ser vista com uma área de engenharia em todos os seus sentidos. O primeiro deles trata dos problemas relacionados com o processo de construção do software, que já são atacados pelas diversas metodologias de décadas de pesquisa em universidades e institutos. A segunda abordagem trata de certos problemas que estão mais relacionados a atividades de seleção e otimização de características. Os problemas dessa segunda abordagem não poderiam ser resolvidos, ou não seriam resolvidos de forma satisfatória, pelas técnicas convencionais.

## A união de dois campos (Engenharia de software e Otimização)

Nesse contexto, percebe-se a validade de um campo de pesquisa de união entre a engenharia de software e a otimização matemática. O campo resultante ficou conhecido como Search-based Software Engineering' (SBSE) devido a um trabalho de 2001, que descreveu essa necessidade e as principais possíveis aplicações do campo.
Na otimização em engenharia de software são encontrados fatores das duas áreas. Da engenharia de software são utilizados problemas complexos que ocorrem durante o desenvolvimento e que podem ser modelados matematicamente. Na verdade, muitos desses problemas não eram sequer considerados pelas abordagens convencionais da engenharia de software. Outro aspecto da engenharia de software presente na área trata da necessidade da análise dos resultados por especialistas. Dessa forma, as soluções encontradas pela otimização em engenharia de software geralmente requerem a avaliação por pessoas experientes no campo de aplicação para que seja possível definir se tais soluções são de fato interessantes. Outro fator importante trata da identificação e definição de problemas que possam ser resolvidos pelas técnicas de otimização.
A otimização matemática apresenta-se como o campo que permite a existência da SBSE. De fato, muitos dos problemas atacados nessa área são impossíveis de serem resolvidos a não ser por métodos matemáticos e computacionais. Entre as principais técnicas empregadas podem ser destacadas as metaheurísticas, devido a geral existência de características que impedem a aplicação de métodos exatos (como a presença de mais uma função de otimização ou não continuidade da função).
Além da resolução de importantes problemas da engenharia de software, a união entre engenharia de software e otimização matemática representa os seguintes avanços:
* A tomada de decisões nas ocasiões dos problemas seguirá um processo mais objetivo, tendo em vista a consideração de variáveis matemáticas para a resolução do problema;
* As soluções encontradas pelas técnicas de otimização refletem a "melhor" possibilidade de solução para o problema, indicando que a empresa desenvolvedora terá vantagens como menos desperdícios, produção do software em menos tempo, entre outros;

## Exemplos de problemas considerados na otimização em engenharia de software

Para que um problema da engenharia de software pertença ao campo da SBSE é necessário que o mesmo tenha algumas características. Por exemplo, o problema em questão deve, naturalmente, possuir aspectos matemáticos que possibilitarão a busca pela melhor solução. Outro aspecto importante trata da existência de uma grande quantidade de possibilidades para escolha. Outros problemas podem ser definidos, mas em geral essas características são presentes.
Exemplos de problemas já considerados na otimização em engenharia de software são mostrados na tabela ao lado. A primeira coluna traz a área da engenharia de software na qual o problema ocorre e na segunda coluna é apresentado o problema propriamente dito.
Como pode ser observado pela tabela, a otimização em engenharia de software encontra aplicação nas mais diversas fases do desenvolvimento de software. Além disso, a quantidade de áreas e problemas apresentada na tabela não representa no total todos os campos de aplicação.

## Grupos de Pesquisa em Otimização em Engenharia de Software

Dentre os diversos pesquisadores e grupos de pesquisa que estudam a otimização em engenharia de software os seguintes grupos e projetos podem ser destacados:
* No Reino Unido: O Projeto SEBASE (Software Engineerin By Automated SEarch) consiste de um importante grupo da área. O coordenador e diretor geral do projeto é Mark Harman, um do responsáveis pela criação do termo Search-based Software Engineering.
* Nos Estados Unidos: Alguns pesquisadores podem ser indicados, como Myra Cohen e Gregory M. Kapfhammer, entre outros.
* No Brasil: O Grupo de Pesquisa em Engenharia de Software (GrES) da Universidade Federal do Paraná coordenado pela professora Silvia Regina Vergílio, e o GOES.UECE (Grupo de Otimização em Engenharia de Software da Universidade Estadual do Ceará), coordenado pelo professor Jerffeson Teixeira de Souza, já produziram diversos trabalhos nessa área de pesquisa. Outros grupos de pesquisadores também se destacam no cenário nacional, como na UNIRIO (Universidade Federal do Estado do Rio de Janeiro), UFG (Universidade Federal de Goiás), UFPB (Universidade Federal da Paraíba) e UFAM (Universidade Federal do Amazonas).

## Eventos

A área de Otimização em Engenharia de Software já é tema central de eventos científicos.
O principal evento da área é o International Symposium on Search Based Software Engineering (SSBSE). A primeira edição (SSBSE 2009) aconteceu em Maio de 2009. A segunda edição (SSBSE 2010) aconteceu em Setembro de 2010.
Um evento específico para a área de Otimização em Teste de Software é o SSBST. O evento já teve três edições: SSBST 2008, SSBST 2009 e SSBST 2010.
No Brasil, o evento inicial na área é o WOES (Workshop Brasileiro de Otimização em Engenharia de Software). A sua primeira edição (WOES 2010), ocorreu em 30 de Setembro de 2010 em conjunto com o XXIV Simpósio Brasileiro de Engenharia de Software.