Safe evolution of software product lines and sets of product lines - TEIXEIRA, Leopoldo Motta (2014)
Linhas de Produtos de Software exploram reuso entre sistemas de software, fornecendo uma maneira sistemática de gerá-los. Extrair e evoluir linhas de produtos a partir de produtos existentes pode ser caro e propenso a erros. Tais tarefas podem se beneficiar de refatoramentos com base formal, garantindo corretude por construção. Linhas de produtos são muitas vezes desenvolvidas no contexto de um conjunto de linhas relacionadas. Por exemplo, no contexto de populações de produtos, podemos ter diferentes versões de uma linha sendo desenvolvidas simultaneamente em diferentes branches. Também podemos combinar várias linhas que dependem umas das outras para desenvolver multilinhas de produto. Ao evoluir uma linha pertencente a um conjunto, é importante verificar se as alterações afetam as demais linhas do mesmo conjunto. A teoria de refinamento de linhas de produtos formaliza a noção de evolução segura em termos de uma relação de refinamento. Refinamento captura preservação de comportamento, mas abstrai melhoria de qualidade. Neste trabalho, n´os estendemos essa teoria para populações de produtos e multilinhas de produtos. Estabelecemos propriedades de composicionalidade, que estabelecem as condições necessárias para garantir a evolução segura de conjuntos de linhas quando evoluímos individualmente seus membros. As teorias de refinamento são gerais com respeito às diferentes linguagens usadas para descrever modelos de características, modelos de configuração e demais artefatos para implementar linhas de produtos e conjuntos de linhas. Pressupostos e axiomas estabelecem as interfaces entre nossas teorias e linguagens específicas. Instanciar as teorias com diferentes combinações de linguagens concretas nos permite derivar transformações que abstraem evoluções seguras, que vão desde a evolução individual de artefatos até a evolução de linhas de produtos e seus conjuntos como um todo. Investigamos e exploramos semelhanças entre estas linguagens, abstraindo propriedades em comum, o que resulta em transformações expressas em n´níveis mais altos de abstração, que podem ser reutilizados por mais linguagens. Desta forma, n´os propomos uma linha de produtos de teorias, onde diferentes linguagens correspondem a diferentes features, e os produtos correspondem à instanciações das teorias de refinamento. Foi utilizado o Prototype Verification System para codificação e prova das teorias e suas instanciações. Para avaliar a expressividade das transformações propostas, analisamos o histórico de evolução de linhas de produtos, observando se transformações são expressivas o suficiente para justificar os cenários de evolução segura. Além disso, também estudamos a evolução do kernel do Linux e mostramos que a maioria dos padrões de evolução encontrados está de acordo com a noção de refinamento de linhas de produtos. Finalmente, também usamos as transformações para raciocinar sobre a evolução da linha de produtos de teorias.