Baixe o app para aproveitar ainda mais
Prévia do material em texto
CENTRO UNIVERSITÁRIO DE JOÃO PESSOA - UNIPÊ PRÓ-REITORIA DE ENSINO DE GRADUAÇÃO CURSO DE BACHARELADO EM CIÊNCIA DA COMPUTAÇÃO LEOMAR ILÁRIO DOS SANTOS UTILIZANDO LINHA DE PRODUTOS DE SOFTWARE PARA GERAÇÃO ESPECÍFICA DE SOFTWARES JOÃO PESSOA - PB 2016 LEOMAR ILÁRIO DOS SANTOS UTILIZANDO LINHA DE PRODUTOS DE SOFTWARE PARA GERAÇÃO ESPECÍFICA DE SOFTWARES Monografia apresentada ao Curso de Bacharelado em Ciência da Computação do Centro Universitário de João Pessoa - UNIPÊ, como pré-requisito para a obtenção do grau de Bacharel em Ciência da Computação, sob orientação do Prof. Ms. Josias Paes da Silva Júnior. JOÃO PESSOA - PB 2016 S237u Santos, Leomar Ilário dos. Utilizando Linha de Produtos de Software para geração específica de software / Leomar Ilário dos Santos. - João Pessoa, 2016. 98f. Monografia (Curso de Ciências da Computação) – Centro Universitário de João Pessoa – UNIPÊ. 1. Engenharia de Software. 2. Linha de Produtos de Software. 3. Reusabilidade. 4. Variabilidade. I. Título. UNIPÊ / BC CDU - 004.41 LEOMAR ILÁRIO DOS SANTOS UTILIZANDO LINHA DE PRODUTOS DE SOFTWARE PARA GERAÇÃO ESPECÍFICA DE SOFTWARES Monografia apresentada ao Curso de Bacharelado em Ciência da Computação do Centro Universitário de João Pessoa - UNIPÊ, como pré-requisito para a obtenção do grau de Bacharel em Ciência da Computação, apreciada pela Banca Examinadora composta pelos seguintes membros: Aprovada em 06/12/2016. BANCA EXAMINADORA _________________________________________ Prof. Ms. Josias Paes da Silva Júnior Orientador _____________________________________________ Prof. Dr. Rodrigo da Cruz Fujioka Examinador ______________________________________________ Prof. Esp. Renato Atouguia Leite Examinador A todos que de alguma forma fizeram parte da minha formação e doaram um pouco de si para que a conclusão deste trabalho fosse possível. AGRADECIMENTOS A Deus, primeiramente, pois sem Ele eu não teria forças para essa longa jornada. A minha família por acreditar e investir em mim e por ter paciência com a minha ausência, assim como a todos os professores e colegas do curso que foram muito importantes na minha vida acadêmica. RESUMO É inegável que a Engenharia de Software contribui de forma fundamental para o desenvolvimento de sistemas, fazendo o uso de métodos que auxiliam em todo ciclo de criação e manutenção de um software. Convencionalmente, a Engenharia de Software gera sistemas classificados como software individual e software padrão que, atendem a maioria dos usuários. Entretanto, o valor dos softwares individuais, pela sua especificidade, é geralmente mais alto e o tipo software padrão, por serem tão genéricos, muitas vezes não atendem as diferentes perspectivas individuais dos clientes. A metodologia utilizada para esta pesquisa é do tipo exploratória através de levantamento bibliográfico sobre o tema. Assim, o paradigma de Linha de Produtos de Software vem com o intuito de unir os dois conceitos. A ideia é a produção em larga escala (como um software padrão), porém, realizando a individualização de cada sistema para que sejam satisfeitas as necessidades específicas de cada cliente (como um software individual). Dessa forma, Linha de Produtos de Software tenta absorver os conceitos e práticas da Engenharia de Software para tentar ampliar a forma de como o desenvolvimento de sistemas é realizado, a partir da reutilização de artefatos do projeto para a geração específica de software. Palavras Chave: Engenharia de Software. Linha de Produtos de Software. Reusabilidade. Variabilidade. ABSTRACT It is undeniable that the Software Engineering contributes in a fundamental way to the development of systems, making the use of methods that help in every cycle of creation and maintenance of software. Conventionally, Software Engineering generates systems classified as individual software and standard software that meets most users. However, the value of individual software, its specificity is generally higher and the type standard software, because they are so generic, often do not meet the different individual perspectives of customers. The methodology used for this research is exploratory through literature on the subject. Thus, the Software Product Line paradigm comes with the intention to unite the two concepts. The idea is the large-scale production (as a standard software), however, making the individualization of each system to the specific needs of each client are met (as an individual software). Thus, Software Product Line tries to absorb the concepts and practices of software engineering to try to expand as the development of systems is carried out from the reuse project artifacts for the specific generation of software. Key Words: Software Engineering. Software Product Line. Reusability. Variability. LISTA DE TABELAS Tabela 01 - Quantidade de produtos gerados de acordo com o número de features ......... 60 LISTA DE GRÁFICOS Gráfico 01 - Reutilização em Linha de Produtos ................................................................... 15 Gráfico 02 - Custo inicial de uma LPS .................................................................................. 41 LISTA DE ILUSTRAÇÕES Figura 01 - Fases da Metodologia .......................................................................................... 17 Figura 02 - As três atividades essenciais da ELPS ............................................................... 31 Figura 03 - Processo de Engenharia de Domínio ................................................................. 32 Figura 04 - Processo de Engenharia de Aplicação ............................................................... 34 Figura 05 - Destaque da variabilidade na Engenharia de Domínio ..................................... 37 Figura 06 - Exemplo de Modelo de Features ........................................................................ 40 Figura 07 - Fluxo de compilação da linguagem Python ....................................................... 46 Figura 08 - Modelo de features do GenCommerce ............................................................. 57 Figura 09 - Tela de configuração das variabilidades ............................................................ 64 Figura 10 - Tela inicial .......................................................................................................... 66 Figura 11 - Tela de detalhes de produtos .............................................................................. 67 Figura 12 - Tela de cadastro de usuário ................................................................................ 68 Figura 13 - Tela de login ........................................................................................................ 69 Figura 14 - Tela de contato ....................................................................................................69 Figura 15 - Tela após login .................................................................................................... 70 Figura 16 - Configuração para a feature Últimos Vistos ..................................................... 71 Figura 17 - Resultado da feature Últimos Vistos ................................................................. 71 Figura 18 - Configuração para a feature Destaque Promoção ............................................. 72 Figura 19 - Resultado da feature Destaque Promoção em bloco ......................................... 72 Figura 20 - Resultado da feature Destaque Promoção em lista).......................................... 73 Figura 21 - Configuração para a feature de Pagamentos ..................................................... 74 Figura 22 - Resultado da feature de Pagamentos .................................................................. 74 Figura 23 - Resultado das 3 features de Pagamentos ........................................................... 75 LISTA DE ABREVIATURAS E SIGLAS CSRF - Cross-Site Request Forgery BSD - Berkeley Software Distribution DRY - Don’t Repeat Yourself ELPS - Engenharia de Linha de Produtos de Software FODA - Feature Oriented Domain Analysis GUI - Graphical User Interface IEEE - Institute of Electrical and Electronics Engineers LPS - Linha de Produtos de Software MVC - Model-View-Controller MTV - Model-Template-View POA - Programação Orientada a Aspectos POO - Programação Orientada a Objetos UML - Unified Modeling Language XSS - Cross-Site Scripting SUMÁRIO 1 INTRODUÇÃO .................................................................................................................... 13 1.1 RELEVÂNCIA DO ESTUDO ........................................................................................ 14 1.2 OBJETIVOS .................................................................................................................... 16 1.2.1 Objetivo Geral ............................................................................................................. 16 1.2.2 Objetivos Específicos .................................................................................................. 16 1.3 INDICAÇÃO DA METODOLOGIA .............................................................................. 16 1.4 ORGANIZAÇÃO DO TRABALHO ............................................................................... 19 2 LINHA DE PRODUTOS DE SOFTWARE .................................................................... 20 2.1 ENGENHARIA DE SOFTWARE ..................................................................................... 20 2.1.1 Entendendo o que é um software ................................................................................. 20 2.1.2 Definição de Engenharia de Software .......................................................................... 22 2.1.3 Qualidade de Software .................................................................................................. 23 2.1.4 Processos de Software ................................................................................................... 24 2.1.5 Reuso de software .......................................................................................................... 27 2.2 LINHA DE PRODUTOS DE SOFTWARE ...................................................................... 28 2.2.1 Definição de Linha de Produtos de Software .............................................................. 28 2.2.2 Vantagens da Linha de Produtos de Software ............................................................ 29 2.2.3 Engenharia de Linha de Produtos de Software .......................................................... 31 2.2.3.1 Engenharia do Domínio ................................................................................................ 31 2.2.3.2 Engenharia de Aplicação .............................................................................................. 33 2.2.3.3 Gerenciamento .............................................................................................................. 35 2.2.4 Variabilidade em Linha de Produtos de Software ..................................................... 36 2.2.4.1 Modelo de Features ...................................................................................................... 38 2.3 LIMITAÇÕES DE LINHA DE PRODUTOS DE SOFTWARE ....................................... 40 3 TECNOLOGIAS UTILIZADAS ........................................................................................ 42 3.1 PYTHON ............................................................................................................................ 42 3.1.1 Django ............................................................................................................................. 47 3.2 SQLite ................................................................................................................................. 51 4 IMPLEMENTAÇÃO DA LPS ............................................................................................ 54 4.1 ENGENHARIA DE REQUISITOS ................................................................................... 55 4.2 PROJETO ........................................................................................................................... 60 4.3 IMPLEMENTAÇÃO DO PRODUTO ............................................................................... 65 4.3.1 Implementação da Feature Últimos Vistos .................................................................. 70 4.3.2 Implementação da Feature Destaque Promoção ........................................................ 72 4.3.3 Implementação das Features de Pagamento ............................................................... 73 4.4 TESTES .............................................................................................................................. 75 5 CONSIDERAÇÕES FINAIS .............................................................................................. 77 REFERÊNCIAS ....................................................................................................................... 79 APÊNDICE A - Documento de Requisitos .............................................................................. 83 13 1 INTRODUÇÃO A Engenharia de Software tem si mostrado importante para o desenvolvimento da sociedade por contribuir de forma produtiva na maneira como os softwares são criados. A mesma utiliza métodos e ferramentas de forma organizada no ciclo de desenvolvimento de software indo desde o início até o final do processo. Entretanto, o software desenvolvido às vezes não satisfaz totalmente o cliente que o adquiriu, no tocante a algumas características observáveis pelos mesmos, exemplo delas são o custo e quais tipos de funcionalidades possui o software. Sendo assim, da maneira convencional que a Engenharia de Software trabalha, são produzidos sistemas que são classificados como software individual e software padrão que, em partes atendem aos interesses dos usuários, mas não deixam de ter certas desvantagens. Os softwares do tipo padrão possuem menor custo e tempo de produção, porém, por terem suas funcionalidades pensadas para tentar atender o máximo de clientes possíveis, acabam sendo mais genéricos e não atendem às características específicas de cada cliente. Já os softwares individuais atendem essas características específicas, mas seu custo de desenvolvimento é mais elevado, tornando sua aquisição mais onerosa.É nesse cenário que os conceitos do paradigma de Linha de Produtos de Software - LPS se encaixam, propondo um diferencial na forma de desenvolvimento de sistemas. LPS tem o intuito de usar a reutilização de recursos de forma planejada para satisfazer as necessidades específicas dos clientes, utilizando o mesmo núcleo de sistemas de uma forma predeterminada (SEI, 2016). Dessa maneira, a LPS tenta abarcar as vantagens existentes nos tipos de desenvolvimento que foram apresentadas logo acima. A mistura do conceito de software individual e software padrão pode ser encontrada no modo de trabalho da LPS, através de sua forma de planejamento e conclusão dos produtos. A LPS une a vantagem de produção de softwares padrões (menor custo e tempo de desenvolvimento) e softwares individuais (características específicas atendidas) gerando uma linha de produção onde o que é comum se mantém e as variabilidades são inseridas de acordo com as necessidades de cada perfil de cliente. Diante do que foi exposto, é necessária a demonstração de como isso é viável de acontecer na prática. Unindo os conceitos de Engenharia de Software e LPS, como é possível realizar o desenvolvimento de vários sistemas (desenvolvimento em massa) gerando sistemas diferentes entre eles com características distintas e adaptáveis as peculiaridades de cada cliente? 14 Portanto, este trabalho busca responder a essa questão trazendo toda estrutura teórica necessária para entendimento do processo em si, como também uma parte prática através de um caso de uso que implementa LPS. 1.1 RELEVÂNCIA DO ESTUDO Na maioria das vezes quando uma empresa desenvolve um sistema para negócios, onde o mesmo será utilizado por outras empresas, o software acaba sendo criado de uma forma mais genérica com o intuito de prover um produto que abarque os requisitos mais comuns, atendendo assim as principais características desejadas. Entretanto, essas empresas que adquiriram o software, geralmente possuem uma forma diferente de trabalhar e essas especificidades terão de ser incluídas pelo software para se ajustar a tal realidade. Porém, em alguns casos, esses fatores específicos podem afetar os de outros clientes. Com o uso da abordagem de LPS, pode-se ter como resultado produtos que se adequam às necessidades específicas de cada cliente com um menor custo, comparado com o desenvolvimento de um software contratado por clientes individuais (COUTO, 2010). Os benefícios ao utilizar uma LPS vão além da redução dos custos, como diz o SEI (2016), as melhorias são percebidas no tempo, produtividade, qualidade dentre outros fatores. Em um estudo de caso onde Clements e Brownsword (1996) desenvolveram sobre o uso de LPS na empresa CelsiusTech (um dos principais fornecedores de sistemas de comando e controle de navios militares da Suécia), foi constatado que: A participação dos softwares no custo total de seus produtos diminuiu de 65% para 20%; Houve uma redução na quantidade de funcionários responsáveis pelo desenvolvimento dos softwares de 200 para cerca de 50; Houve uma redução no tempo de entrega, que antes era na casa de anos, passou e ser meses. Além desses dados, o estudo também ilustra que em média de 70% a 80% dos sistemas são constituídos por componentes comuns que são utilizados em outros sistemas sem nenhuma modificação. 15 O Gráfico 01 exibe o grau de similaridade entre os sistemas navais da empresa. Pode-se ver na horizontal os elementos que integram a linha de produto (software nos navios) representados por letras e na vertical os valores referentes a quantidade de funções de sistemas presentes em cada produto. Na lateral direita tem-se a descrição dos tipos das funções e suas respectivas cores. A de maior destaque é a de cor preta (funções comuns) que compõe a maior parte de cada membro (navios) da linha de produto. Gráfico 01 - Reutilização em Linha de Produtos Fonte: Adaptado de Clements e Brownsword (1996). Outro estudo de caso que pode ser citado é da Hewlett-Packard - HP, uma das mais importantes empresas de tecnologia existentes. Sua área de abrangência é larga, indo de dispositivos portáteis até instalações de computadores de grande desempenho (HEWLETT-PACKARD, 2016). O uso de LPS trouxe como resultado, em comparação com o desenvolvimento dos produtos anteriores, uma redução de 25% dos recursos de pessoal e 67% do tempo de desenvolvimento, como também foi percebido que, o uso de LPS levou a uma redução de 96% de defeitos em seus produtos (TOFT, COLEMAN e OHTA, 2000). Mais um exemplo de uso de LPS bem sucedido encontra-se no caso da empresa Deutsche Bank. O Deutsche Bank é um banco que oferece soluções financeiras no campo de carteira comercial e de investimento, atuando também na estruturação de operações de fusões e aquisições e de mercado de capitais, entre outros, abrangendo mais de 70 países (DEUTSCHE, 2016). Tradicionalmente seu sistema sofre muitas mudanças para se adaptar as características de cada país. Anteriormente, a consequência era um inchaço do software e uma separação do sistema original, assim, uma mudança no núcleo (atingindo de forma global todos os outros sistemas) trazia um custo muito elevado para a 16 empresa por causa de incompatibilidades com os módulos desenvolvidos localmente (FAUST e VERHOEF, 2003). O Deutsche Bank conseguiu reduzir sua problemática de forma considerável através da implantação de uma LPS. Após a migração para uma LPS, um dos maiores benefícios trazido foi visto no ramo financeiro, com uma redução de custo de cerca de 4 (quatro) milhões de dólares anuais, valor correspondente que atinge de 3% a 7% do orçamento anual da empresa (FAUST e VERHOEF, 2003). Dessa forma fica claro que, com LPS é possível produzir sistemas onde a sua maior parte pode ser integrada por outras já criadas anteriormente e as diferenças são incorporadas especificamente em cada sistema, ocasionando uma maior facilidade de mudanças e adaptação ao perfil peculiar de cada cliente. Portanto, percebe-se a utilidade de demonstrar o uso de LPS no desenvolvimento de sistemas, pois é possível fazer com que o mesmo software seja ajustado para adequar-se aos diferentes perfis de clientes. 1.2 OBJETIVOS 1.2.1 Objetivo Geral Demonstrar que através do uso da tecnologia de LPS é possível desenvolver um produto específico para o mercado, porém com a capacidade de diversificá-lo para diferentes seguimentos de clientes. 1.2.2 Objetivos Específicos Descrever as tecnologias necessárias para implementação de uma LPS; Demonstrar que com LPS é possível desenvolver sistemas que se adéquam ao perfil específico de diversos clientes; Desenvolver um sistema Web como caso de uso utilizando o paradigma de LPS. 1.3 INDICAÇÃO DA METODOLOGIA De acordo com os objetivos desse trabalho, o mesmo pode ser classificado como uma pesquisa exploratória, pois busca proporcionar mais familiaridade sobre o tema abordado tornando-o mais explícito e claro através do uso de um levantamento bibliográfico e análise de exemplos que estimulem a compreensão (GIL, 2002). Para melhor entendimento e compreensão do que foi 17 desenvolvido aqui, a Figura 01 exibe os passos que foram realizados tratando de todos os procedimentos efetuados na forma de divisão através de fases, possibilitando uma separação de atividades para melhor entendimento de todo ciclo. Na fase 1 foi o momento para definição do tema. Isso foi conseguido a partir de conversas com o orientador, onde foi observado a importância do tema e também o fato de existir pouco conteúdo acadêmico em língua portuguesa sobre assuntos referentes a LPS,considerando seus conceitos e práticas. Foi decidido que a prática seria o desenvolvimento de um estudo de caso que pudesse ser empregado a teoria do tema abordado. A partir de então seria necessário a captação de materiais de conteúdo referente a tal área, dando início a fase 2. Figura 01 - Fases da Metodologia Fonte: Próprio autor (2016). Na fase 2 ouve a busca e coleta de material bibliográfico para ser usado como referência de composição, para nortear os caminhos a serem seguidos desta monografia. A consulta foi feita através da Web em portais de pesquisa como: ACM Digital Library1 - uma plataforma de pesquisa que contém um conjunto interligado de autores, obras, instituições e idade especializada; IEEE Xplore Digital Library2 - biblioteca digital que disponibiliza acesso aos conteúdos científicos e técnicos publicados pelo Institute of Electrical and Electronics Engineers (Instituto de Engenheiros Elétricos e Eletrônicos) - IEEE; 1 http://dl.acm.org 2 http://ieeexplore.ieee.org 18 SpringerLink3 - a plataforma online da editora Springer que possui publicações dos principais autores do mundo, incluindo livros, periódicos, obras de referência entre outros; Google Acadêmico4 - ferramenta do Google que disponibiliza uma forma fácil de pesquisa de conteúdo acadêmico com filtros para melhorar os resultados, sendo integrado inclusive, com uma conta Google; Software Engineering Institute5 - um centro de pesquisas e desenvolvimento patrocinado pelo Departamento de Defesa dos Estados Unidos e operado pela Universidade Carnegie Mellon, oferecendo uma grande quantidade de material técnico e científico. O resultado, foi uma compilação de materiais para serem usados com intuito de conseguir um embasamento teórico necessário para desenvolvimento desse trabalho, trazendo opiniões de autores da área para reforçar o que está sendo escrito aqui. Na fase 3, ouve a análise crítica de toda a literatura encontrada na fase 2, onde foi realizado uma leitura para filtrar o que poderia fazer parte do conteúdo do trabalho. Esta é uma fase muito importante, pois foi necessário tomar decisões que implicariam na construção de toda monografia. Após, teve a união das partes mais relevantes, para compor a estrutura desse trabalho. Na fase 4 foi o momento de desenvolver o caso de uso, porém antes disso, foi preciso um planejamento de quais as tecnologias que seriam utilizadas. Assim, foi realizado alguns estudos e tentativas para escolher as ferramentas que necessárias que se encaixasse de melhor maneira no que estava sendo buscado. Dessa forma, nessa última fase, ocorreu o desenvolvimento do caso de uso propriamente dito. Este caso de uso é um gerador de sistemas com as características principais de um e-commerce. Tanto o gerador quanto os sistemas que o mesmo produz, foi aqui desenvolvido, sendo também demonstrado seu uso através de exemplos. Com este caso de uso foi possível aplicar os preceitos abordados nas fases anteriores para exemplificar o paradigma de LPS. 3 https://www.springer.com/gp/products/springerlink 4 https://scholar.google.com.br/ 5 http://www.sei.cmu.edu/ 19 1.4 ORGANIZAÇÃO DO TRABALHO Após esse capítulo introdutório, o conteúdo deste trabalho organiza-se da seguinte forma: Capítulo 2 - LINHA DE PRODUTOS DE SOFTWARE apresentará quais teorias e respectivos autores mais contribuíram para a realização do estudo e as bases teóricas para a realização deste trabalho; Capítulo 3 - TECNOLOGIAS UTILIZADAS apresentará as ferramentas que foram utilizadas para desenvolvimento do estudo de caso presente neste trabalho; Capítulo 4 - IMPLEMENTAÇÃO DA LPS apresentará o desenvolvimento da pesquisa juntamente com a solução proposta e sua aplicabilidade; Capítulo 5 - Apresentará as considerações finais e demais conclusões sobre a pesquisa realizada. 20 2 LINHA DE PRODUTOS DE SOFTWARE A LPS utiliza conceitos e práticas próprias para a correta realização de suas atividades. Existem técnicas específicas com características adaptadas para todo ciclo de desenvolvimento de um software. Porém a LPS não trabalha sozinha, existe uma forte ligação com a Engenharia de Software, fazendo com que esses dois conceitos compartilhem benefícios e interajam visando um ponto em comum, que é o sucesso no desenvolvimento de sistemas. Nas próximas linhas serão apresentadas tanto a Engenharia de Software como a LPS. 2.1 ENGENHARIA DE SOFTWARE Este capítulo contém os principais conceitos sobre Engenharia de Software. Serão abordos aqui, as características necessárias a criação de um software, como também, a forma de como a Engenharia de Software evoluiu até o seu estado atual. 2.1.1 Entendendo o que é um software Na definição de software, muitas pessoas usam apenas o conceito clássico, afirmando que o mesmo é um programa com conjunto de instruções a realizar uma determinada tarefa, porém esse é um entendimento muito simplório. O programa é um dos componentes que constituem um software, junto com a documentação do sistema, que contém a estrutura do sistema, a documentação do usuário, onde é condensada a explicação de como deve ser utilizado o sistema e arquivos de configuração, usados para configurá-lo e em alguns casos sites Web com suas informações (SOMMERVILLE, 2007). No âmbito da Engenharia de Software, o software é tratado como um produto, ficando de fora desse escopo pequenos programas criados por alguém para resolver um problema, mas não serão utilizados por outros (PAULA FILHO, 2009). Segundo Sommerville (2007), sendo o software considerado um produto, isso quer dizer que o mesmo pode ser vendido para um cliente e categorizado em dois tipos fundamentais de produtos de software: Produtos genéricos - são sistemas com funcionalidades pouco específicas para o usuário individual. Por serem desenvolvidos com características genéricas, são produzidos por empresas de desenvolvimento que os colocam a venda no mercado para qualquer tipo de cliente que esteja disposto a adquiri-los. Exemplos desse tipo de produto são processadores de texto, planilhas e gerenciador de banco de dados; 21 Produtos personalizados - são aqueles desenvolvidos sob encomenda, aonde uma empresa de software irá produzi-lo para um determinado cliente. Este produto possui características específicas de acordo com os desejos do cliente. A principal diferença entre esses tipos de software, encontra-se no fato de que os produtos genéricos têm suas especificações determinadas pela organização que o desenvolveu, enquanto nos produtos personalizados, as especificações são ditadas por quem encomendou o software. Outras características dos softwares são seus diversificados campos de atuações. Pressman (2011) traz algumas categorias de software que exigem desafios contínuos, onde engenheiros de software trabalham em novos projetos ou em outros projetos já existentes: Software de sistema - uma característica marcante é a interação intensiva com o hardware do computador. Geralmente sua função é atender a outros programas. Exemplos podem ser, o sistema operacional, servindo de camada entre o hardware e as aplicações, drivers, necessários para um componente específico de hardware se integrar corretamente ao sistema operacional, softwares de rede, compiladores, entre outros; Software de aplicação - processam dados comerciais ou técnicos com a intenção de facilitar a tomada de decisão. São programas que atendem a uma necessidade específica de negócio, auxiliando o usuário a realizardeterminada tarefa. Usa processamento de dados já existentes e armazenados, como também controlam funções em tempo real, por exemplo, transações de venda e controle dos processos de fabricação em tempo de produção. Navegadores de internet, leitor de arquivos, editor de imagens, são alguns exemplos dessa categoria; Software científico - caracteriza-se por um grande processamento numérico. Essas aplicações envolvem cálculos de diversas áreas, que vão desde a biologia molecular até a astronomia; Software embutido - está presente no interior de um produto ou sistema ajudando o usuário no controle do próprio sistema, realizando tarefas bem definidas, como controle de um painel de um forno de micro-ondas, funções digitais de um automóvel, tal como níveis de combustíveis; Software para linha de produtos - busca atender as necessidades específicas de vários usuários com gostos e perfis distintos sem ter que criar um software do zero totalmente diferente para cada um; Aplicações para Web - são softwares acessados através da rede em ambiente de sites Web com diversas funcionalidades, fornecendo recursos especializados para o usuário final, 22 normalmente integrados a banco de dados e aplicações comerciais; Software de inteligência artificial - procura estudar e solucionar problemas através de algoritmos não numéricos. Exemplos são redes neurais artificiais, robótica, reconhecimento de padrão de imagens e voz, prova de teoremas e outros. 2.1.2 Definição de Engenharia de Software Atualmente, é inegável a necessidade das pessoas, empresas e países por sistemas ou computadores dependentes de softwares. Essa forte presença acaba forçando que sua produção seja realizada visando a qualidade e custos satisfatórios. Entretanto, tais objetivos não são fáceis de serem alcançados. A busca pelo aperfeiçoamento no desenvolvimento de software teve maior importância com relação a seu crescimento, na época da chamada Crise do Software. Essa expressão surgiu em uma conferência no final dos anos de 1960, a qual representa as dificuldades existentes no desenvolvimento de software naquela época. Foi nessa mesma conferência que houve o surgimento da ideia de reuso de software através de um artigo escrito por Doug McIlroy, assim como a ideia de dividir o sistema em componentes podendo ser reutilizados posteriormente (FUKS e PIMENTEL, 2012). Nesse artigo McIlroy (1968) afirma, entre outras coisas, que naquela época existiam condições suficientes de criar esses componentes, porém, ainda não existia uma coerência na forma de produção e uso dos mesmos, alertando os projetistas de software para a importância de se pensar também em reutilizar e não só construir. Segundo Sommerville (2007), essa conferência colocou em destaque a discussão do termo “crise de software”, suas causa e efeitos, mas também surgiram conceitos importantes entre eles a ideia inicial de Engenharia de Software. Dessa forma, o conceito de Engenharia de Software nasceu, assim, em meio à confusa forma adotada de desenvolvimento até aquele período. Foi nessa conferência que se admitiu a existência da necessidade de mudanças e que realmente encontravam-se problemas na criação de software. Com isso, foi reconhecido que os projetos de sistemas devem ser considerados como trabalhosos e difíceis, e como tal, merecem uma atenção diferente da abordada até então, demonstrando assim, uma crescente preocupação com a confiabilidade do software naquele momento (DIJKSTRA, 1972). Sommerville (2007) define Engenharia de Software como uma disciplina da engenharia que tem como responsabilidade se relacionar com todos os pontos de construção de um software, do início ao final, passando pela etapa de especificação até a sua manutenção. A Engenharia de Software abraça 23 as fases trazendo maior organização para o desenvolvimento de sistemas, contribuindo de maneira enfática para o melhoramento da forma de produção. Sendo assim, a Engenharia de Software não abrange somente a elaboração de programas em si, mas sua atuação encontra-se também na questão de documentação dos respectivos estágios de desenvolvimento (VASCONCELOS et al, 2006). Relaciona-se também com processos não técnicos, como a atividade de gerenciamento e desenvolvimento de ferramentas, métodos e teorias que auxiliam a criação de software (SOMMERVILLE, 2007). Portanto, a Engenharia de Software possui como um de seus principais papeis estabelecer métodos e ferramentas de forma organizada para o desenvolvimento de software, visando concebê- los a custos adequados e alta qualidade. 2.1.3 Qualidade de Software No desenvolvimento de software, é comum se ouvir muito em qualidade e o quanto ela é importante para o produto final. Dessa maneira, entender sua definição e o que é um software com qualidade, é primordial para o estudo da Engenharia de Software. Para Paula Filho (2009), a qualidade de um projeto de software depende do quanto às funções e características do modelo de requisitos foram atendidas. Assim, o produto resultante atenderá as necessidades identificadas no projeto, através do grau de conformidade entre o que foi planejado e o que foi realizado. A qualidade com relação a conformidade não é o único fator a ser observado. A essa ideia Pressman (2011) acrescenta que a satisfação do usuário deve ser lavada em consideração, dando devida atenção ao fato de perceber se o produto de software fornece ou não benefícios ao usuário, pois, em caso positivo, é possível que o usuário venha a tolerar eventuais problemas de confiabilidade. Quando a conformidade com os requisitos não está satisfatória, os problemas decorrentes trazem um desempenho abaixo do esperado. Paula Filho (2009) exemplifica dizendo que esses problemas aparecem de diversas maneiras e em alguns casos podem surgir como funções que não são executadas corretamente dependendo das condições impostas ou certos valores de entrada. Para alcançar a qualidade de software é necessária uma prática bem realizada dos métodos e preceitos da Engenharia de Software usando-a para nortear a procura pela qualidade. Em Pressman (2011) encontram-se quatro grandes atividades que ajudam na obtenção do aumento do padrão da qualidade de software: Métodos de Engenharia de Software - é necessário entender o problema a ser resolvido para ser capaz de desenvolver um projeto adequado ao problema. A Engenharia de Software 24 apresenta métodos apropriados para se ter um entendimento mais completo do problema que quando aplicados aumentam a probabilidade de sucesso na qualidade; Gerenciamento de software - o gerenciamento feito de forma incorreta pode acarretar grandes danos a qualidade de software. Para diminuir os riscos de uma má gerência e fazer com que a qualidade do software seja afetada de forma positiva por ela, é necessário traçar estimativas satisfatórias para as datas de entrega, obedecer ao cronograma, bem como realizar um planejamento de riscos para os possíveis problemas que venham a ocorrer; Controle de qualidade - esse controle é prescrito pela Engenharia de Software através de um conjunto de ações que ajudam a atingir as metas de qualidade. Aqui é empregado vários testes com a intenção de descobrir possíveis erros e naturalmente corrigi-los; Garantia da qualidade - a garantia de qualidade é um conjunto de funções de auditoria e de relatório para uma avaliação das ações de controle de qualidade, tendo como objetivo assegurar a qualidade fornecendo dados ao pessoal técnico e administrativo sobre a qualidade do produto. Caso esses dados identifiquem problemas, é de responsabilidade da gerência tratá- los buscando sua resolução. 2.1.4 Processos deSoftware Um processo de software é um conjunto de atividades que auxiliam na produção de um software propriamente dito, através de linguagens de programação ou na criação de um novo produto ampliando ou modificando um já existente, como também na integração de softwares ou componentes de sistemas (SOMMERVILLE, 2007). Paula Filho (2009) complementa dizendo que os processos podem ser utilizados nas operações de desenvolvimento, manutenção, aquisição e contratação de software, assim como, para cada operação dessas, pode-se definir subprocessos. Um exemplo pode ser no desenvolvimento com seus subprocessos de aquisição de requisitos, análise, implementação e testes. Contudo, o processo de software não garante um desenvolvimento sem falhas. Pressman (2011) alerta para o fato de que, mesmo com a existência de um processo, pode-se ocorrer a entrega fora do prazo, assim como, a adoção do processo de software não garante que as necessidades do cliente serão realmente atendidas de forma correta ou que será alcançada as características de qualidade satisfatórias. Para diminuir o grau de dificuldade e facilitar o entendimento dos processos de software existem modelos de ciclo de vida de um projeto. Em um processo de desenvolvimento de software a escolha de um modelo de ciclo de vida é o ponto inicial para a arquitetura de um processo (PAULA 25 FILHO, 2009). Tais modelos possuem descrições do processo de desenvolvimento, com atividades de produção, manutenção e a ordem de como devem ser executadas (VASCONCELOS et al, 2006). De acordo com Sommerville (2007) um modelo de processo de software é a forma de representar um processo de software, onde cada modelo reflete um processo a partir de uma determinada visão, possuindo cada um, suas próprias características. Entretanto, mesmo existindo muitos modelos de processo de software diferentes, algumas atividades são comuns entre eles, como: levantamento de requisitos, projeto, implementação e testes. A engenharia de requisitos é o processo de aquisição, refinamento e verificação dos serviços e restrições do software de acordo com as necessidades do cliente (IEEE, 1984). Logo, os requisitos são as características que o cliente planeja que o software possua depois de pronto. Para Sommerville (2007) os requisitos são frequentemente classificados em requisitos funcionais, requisitos não funcionais e requisitos de domínio: Requisitos Funcionais - declarações de serviços que o sistema deve prover, como deve reagir diante de certas ações dos usuários e em alguns casos, estabelecem de forma explícita o que o sistema não deve fazer; Requisitos Não Funcionais - são aqueles que não estão diretamente relacionados com as funções fornecidas pelo sistema, podendo estar relacionados com as propriedades do sistema, como a confiabilidade, tempo de resposta e espaço de armazenamento; Requisitos Domínio - requisitos advindos do domínio (características específicas do negócio tratado no sistema) do sistema em vez das necessidades dos usuários do sistema. Na maioria das vezes possuem certas terminologias específicas desse domínio. A atividade de projeto de software é um conjunto de princípios, conceitos e práticas com o intuito de levar o desenvolvimento de um sistema ou produto a obter alta qualidade (PRESSMAN, 2011). Essa atividade caracteriza-se por trabalhar para permitir que os requisitos adquiridos anteriormente sejam transformados em uma representação do software a ser desenvolvido. Essa tradução é feita de forma iterativa fazendo com que sejam adicionados mais detalhes a cada iteração, aproximando-se cada vez mais dos algoritmos e das estruturas de dados a serem implementados (VASCONCELOS et al, 2006). Desse modo, com a fase de aquisição e análise de requisitos, possibilita o que o sistema deve fazer, já a fase de projeto, determina como as funcionalidades do sistema devem ser implementadas. Na fase de projeto é comum utilizar estruturas para descrever a arquitetura do sistema através de diagramas. Na maioria das vezes, para representar esses diagramas usa-se a notação Unified 26 Modeling Language - UML (BOOCH, 1998). A UML é uma notação de modelagem que pode ser usada independentemente do tipo de processo de desenvolvimento e possui uma série de modelos para representar as principais atividades que terão de ser realizadas no sistema, com detalhes o suficiente para permitir um planejamento eficiente da fase de construção (PAULA FILHO, 2009). Vasconcelos et al (2006) complementam ao mostrarem que na UML os requisitos funcionais são representados com diagramas de casos de uso através de uma sintaxe precisa e bem definida. Porém os requisitos não funcionais ainda continuam com sua especificação sendo feitas com a linguagem natural, trazendo assim, poucos detalhes. Os diagramas adquiridos na etapa de projeto agora servirão como base na etapa de implementação. Aqui, o software é criado como um conjunto de unidades utilizando uma linguagem de programação como também usando ferramentas de apoio, que servem como plataforma de desenvolvimento. Para Vasconcelos et al (2006) o julgamento da qualidade de um código produzido pode ser baseado em alguns fatores como a qualidade da documentação, o uso de um padrão de codificação, a legibilidade, o nível de complexidade, o tamanho, como também o tempo de execução. Existem outros atributos que podem ser levados em consideração para descobrir a qualidade do código como a revisão e até mesmos testes. Na atividade de testes, há uma execução de uma implementação do software com dados de testes, verificando a saída realizada pelo sistema e seu comportamento, examinando se o desempenho está de acordo com o esperado (SOMMERVILLE, 2007). O teste é um conjunto de tarefas planejadas e executadas sistematicamente, com isso, deverá existir para o processo de software um modelo de testes a ser seguido, que contenha técnicas e casos de teste (PRESSMAN, 2011). A importância da realização de testes encontra-se na possibilidade de falhas no processo de desenvolvimento de software. Portanto, para garantir uma maior chance de conseguir um maior nível de qualidade do sistema, os custos por causa das falhas justificam um planejamento criterioso na atividade de testes (VASCONCELOS et al, 2006). Segundo Sommerville (2007) existem dois tipos de testes para serem explorados em determinado estágio do processo de software, cada um com um fim, verificando o desempenho do sistema: Teste de validação - é destinado a validar as características do sistema observando os requisitos do cliente, buscando descobrir se o desejo do cliente foi atingido; Teste de defeitos - tem a finalidade de verificar se certo segmento de código fonte foi 27 realmente implementado de forma correta, procurando identificar inconsistências entre o código e sua especificação. 2.1.5 Reuso de software No contexto da Engenharia de Software a reusabilidade está relacionada geralmente aos componentes de vários tamanhos. De acordo com Sommerville (2007) as unidades de software reusadas podem ser menores como objetos e funções, maiores como componentes/subsistemas de uma aplicação ou até mesmo um sistema completo, como acontece no caso de uma absorção e integração por outros sistemas. Para entender melhor o que é realmente é uma reutilização, Dusink e Katwijk (1995) a definem como sendo o uso de um artefato de software existente no momento da construção de um novo sistema ou em uma incorporação de um artefato de software em um sistema novo. Sobre o que é um artefato, os mesmos autores afirmam que é uma parte de conhecimento com características que possam realizar uma contribuição noprocesso de Engenharia de Software. Para Hirama (2011) o reuso pode trazer como benefícios um software desenvolvido mais rapidamente, aumento na qualidade e custos reduzidos, entre outros, possibilitando que as organizações obtenham um retorno maior sobre os investimentos relacionados aos softwares. Para poder implementar o reuso em um projeto, é necessário um planejamento observando fatores importantes que influenciam nos resultados da reusabilidade. Alguns desses fatores são elencados por Sommerville (2007) e exibidos a seguir: Cronograma - o tempo de desenvolvimento de um software pode ser reduzido reusando sistemas prontos e não só pequenos componentes, mesmo a adaptação podendo ser imperfeita, existe uma minimização no trabalho de desenvolvimento; Ciclo de vida - caso o sistema tenha um ciclo de vida longo, a manutenção do sistema e as implicações do reuso devem ser analisadas olhando o longo prazo e não só nas possibilidades imediatas do reuso; Conhecimentos - para utilizar as práticas de reuso em um projeto de desenvolvimento de software é necessário que a equipe esteja preparada, possuindo habilidades e experiência que conduzam à uma implementação eficaz da reutilização; Requisitos não funcionais - para softwares que possuam requisitos de desempenho exigentes, reutilizar componentes vindos de geradores de código, pode não ser aconselhável, pois esses geradores tendem a criar códigos muitas vezes pouco eficientes; Domínio da aplicação - em alguns domínios como industriais e médicos, existem produtos 28 genéricos e configuráveis que podem ser reusados em situações específicas; 2.2 LINHA DE PRODUTOS DE SOFTWARE Esta seção contém os principais conceitos sobre LPS. Aqui serão apresentados conceitos e principais características desse paradigma de desenvolvimento. 2.2.1 Definição de Linha de Produtos de Software Uma LPS é uma união de vários sistemas que compartilham um conjunto comum de recursos gerenciando-os para satisfazer as necessidades específicas de um determinado segmento de mercado (NORTHROP e CLEMENTS, 2012). Esta definição exibe que a LPS pode trazer benefícios no desenvolvimento de sistemas, uma vez que uma linha de produtos é derivada a partir de características comuns, algo que não acontece quando o software é desenvolvido separadamente sendo sempre iniciado a partir do zero. Essa economia vê-se na construção de um novo produto (sistema) onde, durante sua construção, existe uma conexão e integração de componentes já desenvolvidos anteriormente, se parecendo mais com uma montagem de características necessárias ao sistema que está sendo desenvolvido em vez de apenas criá-lo programando código por código (NORTHROP e CLEMENTS, 2012). Dessa maneira, cada produto é formado por uma base comum de características/funcionalidades e a ela é aplicada componentes que possam ser necessários para montar a coleção dos produtos da linha. Porém, é necessário distinguir também o que não é uma LPS. Northrop (2008) traz uma lista com abordagens que não podem ser confundidas com LPS. Abaixo encontram-se algumas delas: Desenvolvimento de um único sistema com reuso - quando se usa partes de um sistema anteriormente desenvolvido em um novo sistema. Isso produz um novo sistema através do reuso, não dois sistemas construídos a partir do compartilhamento de uma mesma base comum de características. Reutilização de pequenas partes - bibliotecas que podem ser reutilizadas contendo algoritmos, módulos ou objetos; Várias versões de um único sistema - uma empresa pode criar um sistema e depois modificá- lo lançando-o com uma versão diferente. Porém, uma LPS trabalha com vários produtos simultaneamente e todos estão passando por seus próprios ciclos e controle de versão; 29 2.2.2 Vantagens da Linha de Produtos de Software As vantagens de uma LPS encontram-se no fato de se conseguir fornecer produtos personalizados a custos menores. Porém os benefícios vão além destes e a baixo vê-se alguns dos principais de acordo com Pohl, Böckle e Linden (2005) para o desenvolvimento de software sob o paradigma da linha de produtos: Menor custo de desenvolvimento - artefatos reutilizados em vários sistemas implicam em redução de custos de desenvolvimento por cada sistema; Melhoria na qualidade - os componentes reutilizados são testados em cada produto, implicando numa significativa chance de encontrar e corrigir possíveis erros, trazendo assim, como consequência, um aumento na qualidade de cada sistema; Menor tempo de desenvolvimento - o tempo de desenvolvimento de um único software (sem uso do paradigma de LPS) é considerado constante, pois compreende o período para criação desse software. Para uma LPS, o tempo inicial é elevado, uma vez que os artefatos comuns a todos os produtos devem ser criados. Contudo, após esse início, o tempo de desenvolvimento é consideravelmente diminuído, visto que muitos artefatos anteriormente gerados podem ser reutilizados nos novos sistemas; Menor esforço de manutenção - quando um produto precisa ser alterado, por exemplo, para corrigir erros, as correções podem ser disseminadas para todos os outros produtos da linha, reduzindo o esforço na manutenção. A reutilização de procedimentos de testes está dentro do foco da ideia de LPS, isto também traz uma ajuda para menor redução no esforço de manutenção; Lidar com a evolução - a necessidade de introduzir uma nova funcionalidade no produto pode ser satisfeita adicionando artefatos específicos. Dessa forma, fica mais fácil organizar a evolução de todos os produtos da linha, pois se fossem sistemas distintos, a evolução teria de ser construída em cada um dos sistemas. Entretanto, numa LPS só precisa fazer uma única vez; Melhorar a aferição dos custos - como as partes comuns dos produtos são as mesmas, é necessário realizar cálculo dos custos para elas apenas uma vez, faltando mensurar somente as partes específicas de cada produto; Vantagens para os clientes - os clientes obtêm produtos que se encaixam às suas necessidades específicas de seu perfil, como também adquiri-los por um valor mais baixo e qualidade maior, pois como já dito antes, LPS reduz os custos de desenvolvimento como o 30 aumento da qualidade. Além disso, os requisitos são avaliados e atendidos de forma mais consistente chegando o mais próximo possível da realidade idealizada pelo desejo do cliente. Os clientes também têm como benefícios, interfaces e funcionalidades semelhantes que torna mais fácil para o cliente migrar de um produto para outro sem a necessidade de aprender novas maneiras de usar outro produto. A reutilização usada de forma estratégica é a base dos benefícios da LPS, trazendo às organizações vantagens competitivas significativas, uma vez que realizada a obtenção das partes comuns (núcleo) da linha de produtos, como consequência natural, ocorrerá uma economia em torno de cada novo produto construído. Assim, quanto mais complexo for o software, maior será o proveito sobre o retorno trazido pela LPS, pois toda carga de problemas já terá sido resolvida anteriormente. Northrop e Clements (2012) mostram que os benefícios podem ser observados de forma mais específica, associados a vários níveis do desenvolvimento do software: Requisitos - os requisitos dos novos produtos da linha serão mais simples de descrever, uma vez que as exigências já foram especificadas anteriormente; Arquitetura - para uma linha de produtos, arquitetura é o modelo a ser seguido na montagem dos novos produtos, a partir dos componentes da base comum que compõem o núcleo. A arquitetura é algo trabalhoso e de significativo investimento,porém para os produtos seguintes, a parte mais importante do projeto já foi realizada; Componentes - Até 100% dos componentes que formam a base comum da linha são reaproveitados para cada produto. Caso necessitem serem alterados, essas modificações serão pequenas, pois toda sua estrutura já está bem formada e pronta para ser usada; Testes - o plano de testes genérico, casos de testes, dados de testes, forma de reportar e corrigir problemas e todo o ambiente relacionado a testes, já foram construídos, devendo apenas adaptá-los para as variações específicas de cada produto; Planejamento - o orçamento e o cronograma já existem através de outros produtos desenvolvidos anteriormente, assim fornecem uma base confiante para os próximos produtos; Processos - o controle de configuração, processo de gestão e todo o processo global de desenvolvimento encontram-se bem alinhado, pois foram utilizados antes e estão bem robustos e confiáveis; Pessoas - a quantidade de pessoas necessária para desenvolver um novo produto é menor. 31 2.2.3 Engenharia de Linha de Produtos de Software Segundo Pohl, Böckle e Linden (2005) a Engenharia de Linha de Produtos de Software - ELPS é um processo de desenvolvimento de software que usa uma arquitetura comum e fornece componentes reutilizáveis que podem ser utilizados para customização em massa. Assim, a ELPS dá apoio através de um framework para geração de sistemas customizados. Para Northrop e Clements (2012) existem três atividades essenciais para uma ELPS, que são a Engenharia do Domínio, Engenharia da Aplicação e Gerenciamento, como é visto na Figura 02. Figura 02 - As três atividades essenciais da ELPS Fonte: Adaptado de Northrop e Clements (2012). Na Figura 2 cada círculo representa uma das atividades, onde são ligadas uma as outras. As setas indicam um movimento contínuo, mostrando que elas possuem um alto grau de interatividade entre si, podendo essa interatividade ocorrer em qualquer momento. Tanto a Engenharia de Domínio, quanto a Engenharia da Aplicação e o Gerenciamento serão tratados com mais detalhes nas próximas seções. 2.2.3.1 Engenharia do Domínio Na engenharia de domínio ocorre a definição e separação das características comuns e as variabilidades da linha de produtos (POHL, BÖCKLE e LINDEN, 2005). A Engenharia de Domínio verifica se a variabilidade realmente existe e, se é adequada para implementar uma LPS. É na engenharia de domínio onde ocorre a atividade de criação dos core assets (VOELTER e VISSER, 2011). Para entender melhor essa terminologia, Northrop e Clements (2012) dizem que os core assets são recursos que formam a base para uma LPS, os quais também são conhecidos como ativos, podendo abranger os artefatos de requisitos, documentação, orçamentos, plano de testes, 32 componentes de software reutilizáveis, entre outros. Para Pohl, Böckle e Linden (2005), os objetivos principais do processo de engenharia de domínio podem ser resumidos em três: identificar o que é comum e as variabilidades da LPS; definir o escopo da LPS; identificar e construir artefatos que sejam reutilizáveis para se conseguir a variabilidade planejada. A Figura 03 exibe os subprocessos da engenharia de domínio. Cada um será explicado separadamente a seguir. Apesar de a Figura 03 ser composta pela Engenharia de Domínio na primeira metade da imagem e pela Engenharia de Aplicação na outra parte, aqui será exposto a Engenharia de Domínio e em outro tópico a Engenharia de Aplicação. Figura 03 - Processo de Engenharia de Domínio Fonte: Adaptado de Pohl, Böckle e Linden (2005). Gerenciamento de Produto - aqui a preocupação é com a gestão dos produtos, aplicando técnicas para definir o escopo, identificando o que está dentro e o que está fora do âmbito da linha de produtos. O Gerenciamento de Produto tem como saída uma espécie de mapa dos produtos que contém as principais características comuns e variáveis dos futuros novos 33 produtos; Engenharia de Requisitos de Domínio - abrange todas as atividades de identificar e documentar os requisitos tanto do núcleo comum quanto das variabilidades da LPS. Recebe como entrada o resultado do Gerenciamento de Produto e sua saída é o modelo com os requisitos da linha de produtos. Assim, a Engenharia de Requisitos de Domínio está relacionada à linha de produtos que está sendo desenvolvida e não aos requisitos de uma aplicação em particular. Portanto, seu foco encontra-se nas exigências comuns e variáveis de toda LPS em questão; Projeto de Domínio - nesse subprocesso ocorre a definição da arquitetura de referência da linha de produtos, que fornece uma estrutura comum para todos os aplicativos da linha de produtos; Realização de Domínio - a Realização do Domínio consiste em detalhar e implementar os componentes de software reutilizáveis da linha de produtos. Tais componentes são configuráveis e acopláveis e serão usados posteriormente como parte da construção dos produtos da linha, logo, não devem ser confundidos com aplicativos que podem entrar em execução individualmente; Testes de Domínio - tem a responsabilidade de fazer a validação e verificação dos componentes reutilizáveis, realizando testes, onde os componentes são comparados com sua especificação. Este subprocesso também gera artefatos de teste que posteriormente serão utilizados para testar o sistema, reduzindo o esforço de produção desses testes. 2.2.3.2 Engenharia de Aplicação Segundo Pohl, Böckle e Linden (2005) alguns dos principais objetivos da Engenharia de Aplicação é documentar os requisitos, arquitetura, componentes e testes relacionando-os aos artefatos de domínio do sistema; vincular todas as características variáveis de acordo com as necessidades do sistema; calcular as diferenças entre das características da aplicação e de domínio da arquitetura, com relação a requisitos, componentes e testes. A Engenharia de Aplicação, assim como a Engenharia de Domínio, pode ser dividida em subprocessos. Cada um deles utiliza artefatos gerados pela Engenharia de Domínio e produz artefatos para a aplicação. A Figura 04 está destacando a parte referente à Engenharia de Aplicação e seus subprocessos. Cada um será explicado separadamente a seguir. 34 Figura 04 - Processo de Engenharia de Aplicação Fonte: Adaptado de Pohl, Böckle e Linden (2005). Engenharia de Requisitos de Aplicação - abrange todas as atividades relacionadas com as especificações de requisitos de aplicação. Aqui se busca encontrar as diferenças entre os requisitos da aplicação com aqueles produzidos na Engenharia de Requisitos de Domínio; Projeto de Aplicação - produz a arquitetura que será usada para produção da aplicação. Essa arquitetura define a estrutura da aplicação a ser desenvolvida, pertencente a linha de produtos; Realização da Aplicação - nesse subprocesso é criada a aplicação com base na seleção e configuração dos componentes reutilizáveis e também na criação de novos componentes específicos da aplicação. Dessa forma a aplicação é formada por ativos reutilizáveis e específicos da aplicação considerada; Testes de Aplicação - aborda as operações relacionadas a validação e verificação da especificação com o que foi desenvolvido em busca de possíveis incompatibilidades, realizando diversos testes. 35 2.2.3.3 Gerenciamento Considerando que o grau de dependência de componentes em uma LPS é bem elevado, o Gerenciamento deve ser realizado de forma eficiente no controle de todo processo (SILVA JUNIOR, 2011). Para Northrop (2008) o Gerenciamento desempenha um papel crucial para o sucesso ou não da práticada LPS. O Gerenciamento é composto por uma gestão de nível técnico e de nível organizacional. Esses dois enfoques devem estão fortemente ligados com o esforço de criação, desenvolvimento e manutenção da LPS. Northrop e Clements (2012) demonstram as características tanto da gestão técnica quanto da gestão organizacional. A gestão organizacional define um modelo para garantir a evolução dos principais ativos da linha de produtos. Também coordena as atividades técnicas essenciais no desenvolvimento dos ativos de núcleo (aqueles que formam as partes comuns dos produtos da linha), assim como o desenvolvimento de cada produto. A administração deve garantir que tais operações e os caminhos usados para conseguir sucesso no esforço de implementação da LPS sejam devidamente documentados. A gestão organizacional deve assumir a responsabilidade de gerar uma estrutura organizada que certifique que as unidades participantes recebam os recursos necessários e adequados em quantidades suficientes, como por exemplo, pessoal treinado. A tarefa da gestão técnica no desenvolvimento de ativos de núcleo e no desenvolvimento de produtos é garantir que quem esteja construindo esses recursos estejam trabalhando nas atividades realmente necessárias, seguindo os processos já definidos na linha de produtos. Também tem como função observar e recolher dados que sejam suficientes para examinar o progresso, realizando um acompanhamento constante do processo como um todo. A gestão técnica e a gestão organizacional trabalham de forma conjunta para contribuir na criação dos ativos do núcleo com intuito de deixar cada vez mais reutilizáveis os artefatos ligados ao gerenciamento, de forma mais específica, cronogramas e orçamentos, para serem utilizados no desenvolvimento de cada produto da linha. As duas atividades (Engenharia de Domínio e Engenharia de Aplicação) juntamente com a atividade de Gerenciamento, são individualmente importantes, porém sua união, uma mistura de tecnologia com práticas de negócio, é essencial. Entretanto, o caminho a ser tomado de como realizar essa mistura depende da organização que está implantando a LPS. Assim, diferentes empresas podem realizar caminhos diferentes através das três atividades. 36 Algumas organizações começam a implantação da LPS, usando como início a análise e desenvolvimento dos ativos comuns. Em compensação, outras preferem começar a partir de apenas um produto ou um pequeno conjunto de produtos que ela já possui, e então começar com a produção dos recursos do núcleo da LPS e os próximos produtos futuros. Northrop e Clements (2012) afirmam que no primeiro caso, as empresas usaram a abordagem proativa e no segundo caso a abordagem reativa. Para Northrop (2008) na abordagem reativa há o cálculo de todo o escopo da linha para ser usado como padrão a ser seguido como base para todos os produtos. Assim, novos produtos tem a chance de serem colocados no mercado mais rapidamente, pois toda sua base já foi desenvolvida anteriormente. Porém, essa abordagem necessita de um investimento inicial maior e de conhecimento prévio considerável. A abordagem reativa começa com um ou mais produtos que a própria organização já possuía. Baseado neles, são gerados os ativos que possuem características comuns, formando o núcleo da linha de produtos e a partir daí os produtos futuros. Nessa abordagem a evolução do escopo acontece de forma mais lenta, em contra partida, o custo inicial é menor com relação à abordagem proativa. Apesar de serem abordagens diferentes, elas podem ser usadas de maneira incremental, assim a empresa pode iniciar com uma delas e depois usar os conceitos e práticas da outra para sua implantação de LPS. Northrop e Clements (2012) demonstram esse fato a partir de um exemplo: uma abordagem proativa pode ser usada para iniciar a criação de apenas alguns ativos fundamentais que constituem o núcleo, no lugar de construir todos de uma vez. Dessa forma, os primeiros produtos usariam apenas esses poucos ativos desenvolvidos e os produtos subsequentes, só iriam usar mais ativos, quando os mesmos fossem desenvolvidos aos poucos e sendo adicionados à coleção. 2.2.4 Variabilidade em Linha de Produtos de Software Variabilidade está ligada com a ideia de poder modificar ou personalizar um sistema, implicando em conseguir facilidade para se chegar a alguns tipos de mudanças (QUEIROZ, 2009). No início do planejamento de desenvolvimento de um software, pelo fato de ainda as restrições serem poucas, acaba existindo diversos possíveis sistemas a serem construídos, porém, durante o desenvolvimento esse número vai caindo, até chegar ao sistema propriamente dito na fase de execução (SILVA et al, 2011). Assim, a variabilidade vai sendo limitada de acordo com o avanço natural do projeto. Com relação a LPS, as variabilidades possuem uma importância central, pois são elas que fazem com que o paradigma de LPS realize papel de destaque com relação de possibilidade e 37 facilidade em obter resultados satisfatórios nas diferenciações de cada um de seus produtos (FERREIRA, 2012). A variabilidade em uma LPS pode ser facilmente observada durante todos os seus ciclos de implementação. Segundo Pohl, Böckle e Linden (2005) as variabilidades podem ser encontradas fortemente estabelecidas na Engenharia de Domínio, pois é nesse momento onde ocorre a separação das partes comuns para compor os ativos de núcleo e as variabilidades de cada produto. Na Figura 05 vemos em foco que dentro da Engenharia de Domínio deve-se reservar uma atenção para o conteúdo variável tanto dos requisitos, como arquitetura, componentes e testes. Figura 05 - Destaque da variabilidade na Engenharia de Domínio Fonte: Adaptado de Pohl, Böckle e Linden (2005). Para Ferreira (2012) a variabilidade está diretamente relacionada com outro conceito no universo de linha de produto de software que são os elementos comuns que compõem a base de ativos. Considerando que esses elementos comuns formam uma estrutura de características que estão presentes em todos os produtos da linha, as diferenciações desses produtos, um em relação ao outro, faz com que essas variabilidades encontradas sejam entendidas como as particularidades específicas 38 de cada sistema (produtos da linha) que espelham as expectativas desejadas do cliente. As variabilidades existentes na abordagem de LPS são representadas por pontos de variação e variantes que são resolvidos antes da criação dos produtos (SILVA et al, 2011): Ponto de Variação - é o local de certo artefato da linha de produtos onde seu conteúdo ainda não foi determinado e está esperando por uma variação. O ponto de variação determina pontos em que é possível inserir as variantes; Variante - corresponde a uma alternativa dentro de uma gama de variações projetadas, que podem ser usadas para representar as variabilidades de um produto. Assim, uma variante é formada por características peculiares de um produto e o ponto de variação é o local onde está variante vai ser inserida, determinando as características da variabilidade. Porém, Ferreira (2012) chama a atenção para o fato de poder ocorrer riscos na gerência das variabilidades no tocante a evolução dos produtos durante o decorrer do tempo, trazendo consequentemente, mudanças em suas variabilidades, mas que isso pode ser contornado ao realizar essa evolução seguindo as escolhas das variantes do produto. Para melhor separação e compreensão das partes comuns e também das variabilidades de um sistema, é utilizado o modelo de features (SILVA JUNIOR, 2011). Com o modelo de features é possível ter uma melhor organização e visualização dos componentes que formam os produtosde uma LPS. 2.2.4.1 Modelo de Features O conceito de features (características) foi apresentado em 1990 pelo método Feature Oriented Domain Analysis - FODA para representar características variáveis e também as características comuns de um grupo de sistemas (SCHOBBENS et al, 2006). Seguindo esse modelo, uma feature é uma característica presente no sistema sendo visível ao nível do usuário final (SILVA JUNIOR, 2011). Assim, uma feature é uma característica de um produto que no olhar dos usuários e clientes representa uma importância relevante na distinção de um determinado produto da linha (GRISS, 2000). Segundo Ferré e Vegas (1999) além do FODA existem outros métodos semelhantes como por exemplo o IDeA, STARS e DADO, onde podem ser utilizados na arquitetura e design de exibição de features dentro em uma LPS. Neste trabalho será usado o FODA por possuir uma maior quantidade de conteúdo, enquanto os outros, possuem material muito limitado. O modelo de features é estruturado em diagramas visivelmente semelhantes a uma árvore, 39 onde cada nó representa uma característica (feature) e suas arestas se referem ao tipo de relacionamento entre elas (FERREIRA, 2012). Já a sua raiz é responsável por representar o sistema mostrado no respectivo modelo, podendo possuir ramificações em features e em subfeatures (SILVA JUNIOR, 2011). Um exemplo desse modelo pode ser visto na Figura 06. Dentro de uma LPS, a estrutura produzida e representada pelo diagrama de um modelo de features muitas vezes acaba sendo a estrutura da própria LPS (SILVA et al, 2011). Dentro dessa estrutura existem mais de um tipo de feature. Segundo Kang et al (1990) as features podem ser separadas de acordo com seu tipo, da seguinte forma: Obrigatórias - quando a característica não pode faltar em nenhum produto da linha; As features obrigatórias são as funcionalidades que todos os membros da linha de produtos devem possuir (partes comuns); Opcionais - são aquelas que são optativas para fazerem parte ou não de um produto; Variáveis - aqui existe um conjunto de features podendo escolher uma o mais delas. As features desse conjunto são relacionadas entre si e no momento da escolha e uso, é necessário realizar a diferenciação da alternativa OR (que possibilita a escolha de mais de uma feature) ou a alternativa que possibilita optar por apenas uma das opções. Para diferenciar visualmente esses tipos de features são usadas convenções de cardinalidade. De acordo com Deursen e Klint (2001) as features obrigatórias são representadas por um ponto fechado, as features opcionais são indicadas a partir de um ponto aberto. Para as features do tipo variáveis, são indicadas tanto por um triângulo aberto, que representa as features excludentes entre si, como por um triângulo fechado, que representa features que podem ser escolhidas e usadas ao mesmo tempo. Na Figura 06 encontra-se um exemplo do modelo de features, com ele é possível identificar os tipos de features. Na raiz da árvore está a feature correspondente ao nome no sistema. A ela está conectada quatro subfeatures três obrigatórias para todas as aplicações, a saber, Catálogo, Pagamento e Graphical User Interface - GUI (Interface Gráfica do Usuário). As outras duas são opcionais, podendo ser usadas ou não, Segurança e Banners. A feature Catálogo possui as subfeatures Ofertas e Pesquisa sendo opcionais e Informação que é obrigatória. Esta última possui a indicação de um triângulo preenchido determinando de é possível escolher entre uma ou mais de suas subfeatures (Imagem, Descrição e Preço). O mesmo ocorre na feature Pesquisa com suas subfeatures Básico e Avançado. A feature Pagamento dá a possibilidade de escolher Cheque, Cartão de Crédito ou ambos e em Cartão de Crédito, a escolha é Visa, American Express ou os dois tipos de cartões. 40 Figura 06 - Exemplo de Modelo de Features Fonte: Adaptado de SEGURA et al (2010). Na feature Segurança, o triângulo aberto informa que apenas uma de suas subfeatures pode ser escolhida, não as duas ao mesmo tempo. Na feature de interface (GUI) as opções são as subfeatures PC e Mobile (dispositivos móveis) podendo escolher apenas uma ou as duas ao mesmo tempo. O modelo informa também que a feature Banner não é obrigatória, podendo fazer parte ou não do sistema a ser desenvolvido. 2.3 LIMITAÇÕES DE LINHA DE PRODUTOS DE SOFTWARE O paradigma de LPS baseado na reutilização estratégica de ativos possibilita uma grande oportunidade de alcançar benefícios significativos no desenvolvimento de software. Porém, a decisão de usar ou não LPS deve ser tomada de forma cautelosa, pois o investimento inicial geralmente é um pouco mais oneroso que a forma tradicional como a Engenharia de Software trabalha, assim como os custos para manter a base de ativos essenciais. Para Northrop e Clements (2012) os custos adicionais trazidos com o uso de LPS podem ser observados em algumas etapas do processo de desenvolvimento da linha de produtos. Por exemplo, a aquisição dos requisitos para uma linha de produtos, considerando que a mesma é um conjunto de sistemas, pode ser complexa, exigindo grande análise para identificar quais requisitos irão compor a base de ativos comuns e quais serão os requisitos das variabilidades de todos os sistemas individualmente. Com relação à arquitetura, ela é o modelo a ser seguido pela linha de produtos servindo como base para montar os componentes do núcleo de ativos. Aqui, a desvantagem encontra-se no momento em que a arquitetura vai ser definida, pois as variações de cada produto devem ser levadas em consideração aumentando as restrições e isso provoca uma maior dificuldade em sua obtenção por parte dos engenheiros. 41 A desvantagem encontrada na criação dos componentes da linha de produtos, é que cada componente deve ser elaborado seguindo a perspectiva de estarem sempre preparados para serem adaptados ao contexto dos produtos, como também devem ser previstos na elaboração, os pontos de variação dos produtos. Desse modo, geralmente os componentes devem ser concebidos de uma forma mais geral e sem perda de desempenho. As necessidades iniciais de negócio como análise de mercado, estimativas de custo e cronograma formam as necessidades envolvidas em qualquer produto. Para LPS, esses artefatos deverão ser genéricos o suficiente para englobar as características variantes de cada produto. Isso demanda uma análise maior para chegar a uma adequação satisfatória. Os casos de testes, planos de testes e dados de testes são desenvolvidos e revistos para todos os componentes. Assim, os artefatos de testes devem ser mais robustos, pelo fato deles terem que ser realizados para mais de um produto. Consequentemente, devem ser extensíveis às variações entre cada produto da linha. Já no caso das pessoas, suas habilidades e formação, a LPS exige uma equipe bem treinada, não só em Engenharia de Software em geral, mas também em específico, entendimento prático em LPS, para conseguirem realizar os procedimentos básicos com o uso dos ativos da linha que está sendo desenvolvida. Sendo assim, materiais de treinamentos devem ser criados e devem permanecer sempre atualizados, pois serão usados principalmente por novos funcionários. Outro fator a ser considerado é o custo inicial de desenvolvimento de sistema utilizando LPS. O Gráfico 02 exemplifica esse acontecimento, onde é comparado os custos acumulados de desenvolvimento entre a abordagem sem LPS e com LPS. Gráfico 02 - Custo inicial de uma LPS Fonte: Adaptado de Pohl, Böckle e Linden (2005). 42 Com mais detalhes, no mesmo gráfico, é possível observar que a linha contínua representa um
Compartilhar