Baixe o app para aproveitar ainda mais
Prévia do material em texto
Engenharia de Software Experimental Responsável pelo Conteúdo: Prof. Me. Artur Marques Revisão Textual: Mariana Góis Conceituação de Engenharia de Software Experimental Conceituação de Engenharia de Software Experimental • Conhecer os fundamentos da Engenharia de Software Experimental delimitada como área de estudo e evolução da qualidade. OBJETIVO DE APRENDIZADO • Software, sua Natureza e Características; • Conceituação de Engenharia de Software; • Objetivos da Experimentação; • Organização do Experimento; • Experimentação e Engenharia de Software Experimental; • Introdução à Engenharia de Software Experimental. UNIDADE Conceituação de Engenharia de Software Experimental Software, sua Natureza e Características Conceitualmente, as disciplinas de engenharia surgem do artesanato à medida que suas bases de conhecimento evoluem para as ciências. Se um artesanato está fabricando um produto utilitário, há uma demanda por maior funcionalidade do produto, maior qualidade do produto e maiores quantidades do produto. Atender a essas demandas resulta em mais complexidade no produto ou no processo de produção, ou ambos. Para lidar com o aumento das demandas e maior complexidade, um ofício deve mudar de três maneiras importantes. • Em primeiro lugar, nos primeiros estágios de desenvolvimento de um ofício, entender como as coisas se comportam é de primordial importância; entender o porquê é de importância secundária. Com produtos e processos de produção mais complexos, apenas saber como as coisas se comportam não é suficiente. Há também uma neces sidade crescente de compreender as relações causais – as respostas às perguntas do tipo “por quê”. As respostas a essas perguntas costumam ter um poder preditivo essencial para o desenvolvimento de novas técnicas e metodologias de design e produção. Quando o conhecimento sobre o comportamento do produto e de seus constituintes é bem desenvolvido, tornase uma ciência; • Em segundo lugar, a fabricação de produtos com maior funcionalidade ou qualidade requer uma maior compreensão dos valores. Isso leva a uma teoria de valor que trata dos fatores envolvidos na qualidade de um produto, meios para quantificar os fatores, conceitos que identificam características controláveis de um produto que afetam sua qualidade e princípios que focam a atenção em importantes questões de design de produto relacionadas ao valor. A ética do trabalho lida com questões causais mais profundas: causas que afetam o valor. Quando a ética do trabalho do ofício é bem desenvolvida, ela também se torna uma ciência; • Terceiro, a fabricação de produtos complexos, em grandes quantidades e mais fun cionais requer um planejamento significativo. Quando o produto é complexo ou tem maior funcionalidade, o planejamento se concentra no projeto do produto. Quando grandes quantidades de um produto são fabricadas, o planejamento se concentra no projeto de um processo de produção. Em alguns casos, um esforço significativo é necessário para projetar o produto e seu processo de produção. A magnitude desse esforço pode exigir que as pessoas envolvidas desenvolvam habilidades especializadas. Alguns continuam com a produção real, outros estão envolvidos na concepção de produtos e processos de produção. Aqueles envolvidos no projeto tornamse parte de uma nova disciplina – uma disciplina de engenharia. Parte da natureza da Engenharia de Software está implícita em sua classificação como disciplina de engenharia. Esta seção discute algumas de suas características e problemas exclusivos. A exclusividade aqui não significa que as características e problemas não pos sam ser encontrados em outras disciplinas de engenharia. Significa apenas que eles não são comuns a todas as disciplinas de engenharia ou são significativamente mais impor tantes na Engenharia de Software. A Engenharia de Software é caracterizada por seu produto principal, que é o software – programa que direciona um computador para exe cutar alguma tarefa. Na Engenharia de Software existe uma ciência bem desenvolvida, a 8 9 ciência da computação, que cobre, entre outras coisas, conceitos de linguagens de progra mação, algoritmos, estruturas de dados e aspectos importantes de sistemas de hardware e software de sistemas. Muitas das áreas de conhecimento da ciência da computação tratam de produtos de software. Por causa disso, a fronteira entre ciência da computação e engenharia de software é difícil de definir. Em particular, os valores da engenharia de software constituem um elemento importante da ciência da computação. Uma vez que grande parte do esforço de desenvolvimento bemsucedido está envol vido na manutenção, os interesses dos desenvolvedores pesam muito nos valores do software. Alguns dos efeitos estão listados a seguir. É mais importante documentar o design do software além de seu uso. Com um projeto mal documentado, os mantenedores de software gastarão muito mais tempo estudando o software existente antes de fazer alterações. Trabalhar com aspectos de design não documentados também pode causar novos erros. É mais importante despender esforço extra no desenvolvimento de software e pro cedimentos de teste e salválos para reutilização após a manutenção. Os engenheiros de software recentemente se concentraram em uma importante técnica chamada refatoração. Refatoração referese a alterações no software que não alteram sua funcionalidade. As alterações são feitas com o objetivo de simplificar a manutenção futura. Após uma manu tenção de refatoração, o software de teste original pode ser reutilizado sem modificação. É mais importante estruturar o design para que alterações futuras possam ser feitas com mais facilidade. A complexidade e a natureza das interações entre os componentes é a consideração mais importante aqui. Os conceitos de acoplamento e coesão desti namse a lidar com esse problema. Como sabemos, software é qualquer programa de computador, mas também pode ser um ecossistema de softwares, que também pode ser definido como um conjunto de ins truções que são responsáveis por orientar o computador na realização de determinadas tarefas. A seguir estão as características do software: • Durabilidade; • Hibridez; • Usabilidade; • Reutilização de componentes; • Flexibilidade; • Manutenção; • Portabilidade; • Confiabilidade. As metodologias de solução de problemas científicos e de Engenharia de Software estão intimamente relacionadas, afinal, por que o processo deveria ser diferente? Existe um processo científico bem definido para a resolução de problemas: • Elaborar hipóteses; 9 UNIDADE Conceituação de Engenharia de Software Experimental • Coletar evidências; • Tirar conclusões. Sim, pode haver mais etapas e escolas metodológicas diferentes, mas ao final, mini mamente tudo gira ao redor dessas três macroetapas. Se aplicarmos esse processo ao desenvolvimento de software, ele pode ser uma ferramenta muito poderosa em design e arquitetura. Partindo dessas definições, você há de concordar que a Engenharia de Software precisa de mais experimentação, por exemplo: • Para confirmar teorias e também a “sabedoria convencional”: limitar a medida ciclomática garante qualidade? • Para explorar relacionamentos: como a complexidade do design afeta a produti vidade dos designers? • Para avaliar a precisão dos modelos: A análise por pontos de função prevê o tamanho do código? • Para validar medidas: O número de métodos é uma medida válida de complexi dade de classe? Conceituação de Engenharia de Software Engenharia de Software é um estudo detalhado da engenharia para o projeto, desen volvimento e manutenção de software. Foi introduzida para resolver os problemas de projetos de software de baixa qualidade que em meados da década de 1970 do século XX acabaram por gerar o que ficou conhecido como Crise do Software. Os problemas surgem quando um software geralmente excede prazos, orçamentos e níveis reduzidos de quali dade. Elagarante que o aplicativo seja construído de forma consistente, correta, dentro do prazo e do orçamento e dentro dos requisitos. Um software deve estar em conformidade com especificações de qualidade, tratase de uma meta essencial e básica da Engenharia de Software que mostra o caminho para obter a melhor qualidade de produtos e processos para atender ao cliente. Portanto, a Engenharia de Software objetiva diversas soluções que devem evidenciar a qualidade do produto final, que deverá atender ao cliente que o solicitou. A demanda da Engenharia de Software também surgiu para atender à imensa taxa de mudança nos requisitos do usuário e no ambiente no qual o aplicativo deveria estar funcionando. Você já deve ter percebido que no terço final do século XX já se pensava em bus car agilidade. Um produto de software é avaliado pela facilidade com que pode ser usado pelo usu ário final e pelos recursos que oferece. Um aplicativo deve pontuar nas seguintes áreas: • Operacional: isso diz o quão bom um software funciona em operações como orça mento, usabilidade, eficiência, correção, funcionalidade, confiabilidade, segurança e proteção; 10 11 • Transicional: a transição é importante quando um aplicativo é transferido de uma pla taforma a outra. Portanto, portabilidade, reutilização e adaptabilidade vêm dessa área; • Manutenção: especifica o quão bom um software funciona num ambiente em mu dança. Modularidade, facilidade de manutenção, flexibilidade e escalabilidade vêm da parte de manutenção. Ciclo de vida de desenvolvimento de software ou SDLC é uma série de estágios na engenharia de software para desenvolver o aplicativo de software proposto, como: • Comunicação; • Coleta de requisitos; • Estudo de viabilidade; • Análise de sistema; • Design; • Codificação; • Teste; • Integração; • Implementação; • Operações e manutenção; • Disposição. Todas essas etapas são importantes e ocorrem realmente em todos os ciclos de vida de software de formas diferentes em momentos distintos, em iterações ou linearmente, dependem do paradigma utilizado, como por exemplo: cascata, espiral, integrado, ágil ou enxuto. Todavia, podemos abstrair e ficar com as seguintes 5 etapas padrão: • análise e definição de requisitos; • planejamento do projeto de desenvolvimento; • implementação das funcionalidades durante a codificação; • execução dos testes de segurança, validação do usuário e rastreamento de bugs; • integração da aplicação no ambiente de produção. A Engenharia de Software geralmente começa com a primeira etapa como uma ini ciação de solicitação do usuário para uma tarefa ou saída específica. Ele submete seu requerimento a uma organização prestadora de serviços. A equipe de desenvolvimento de software separa os requisitos do usuário, os requisitos do sistema e os requisitos fun cionais. O requisito é coletado por meio de entrevistas com um usuário, referência a um banco de dados, estudo do sistema existente etc. Após a coleta de requisitos, a equipe ana lisa se o software pode ser feito para atender a todos os requisitos do usuário. O desen volvedor então decide um roteiro de seu plano. A análise do sistema também inclui uma compreensão das limitações do produto de software. De acordo com o requisito e análise, um design de software é feito. A implementação do design de software começa em ter mos de escrever o código do programa em uma linguagem de programação adequada. 11 UNIDADE Conceituação de Engenharia de Software Experimental Objetivos da Experimentação Como outras ciências e disciplinas de engenharia, a Engenharia de Software requer um ciclo de construção de modelos, experimentação e aprendizado. Os experimentos são ferramentas valiosas para todos os engenheiros de software envolvidos na avaliação e escolha entre diferentes métodos, técnicas, linguagens e ferramentas. O objetivo da expe rimentação em Engenharia de Software é apresentar os estudos empíricos em Engenharia de Software, usando experimentos controlados. Fornecenos conhecimento do mundo físico e é a experiência que fornece as evidên cias que fundamentam esse conhecimento. A experiência desempenha muitos papéis na ciência. Um de seus papéis importantes é testar teorias e fornecer a base para o conhecimento científico. Realizar um experimento quase sempre é uma tarefa complexa e demorada. Uma vez que a experimentação envolve muitas etapas, como definição de meta, planejamento, execução, análise e empacotamento, todas devem ser realizadas de forma sistemática e consistente para alcançar um experimento replicável e resultados válidos. Como a escala dos problemas científicos tem aumentado, isso se reflete não apenas no tamanho dos dados, mas também na complexidade das ferramentas baseadas em computador neces sárias para investigar esses problemas. Organização do Experimento Para Travassos, Gurov e Amaral (2002), é verdade que nenhum experimento oferece prova com certeza; eles verificam a previsão teórica de encontro à realidade. A comu nidade aceita uma teoria se todos os fatos conhecidos dentro de seu domínio puderem ser deduzidos da teoria, possuírem uma verificação experimental extensa e predizerem o novo fenômeno corretamente. Uma das coisas importantes na organização de um experimento, efetivamente saber por que você está fazendo um experimento. Portanto, precisamos da famosa “hipóteses”. Uma hipótese é algo que você propõe ser verdadeiro como base para uma investi gação posterior. As pessoas costumam fazer suposições ao iniciar projetos de software, por exemplo, em que uma tecnologia atenderá a todos os requisitos necessários mas não definem ou registram totalmente essas suposições. Uma hipótese está, de certa forma, um nível acima de uma suposição. Uma hipótese é uma suposição que você não sabe se é verdadeira. Para continuar com o projeto sob esse pressuposto ele precisa ser provado e, para isso, requer evidências. É importante neste ponto definir os critérios de prova. Se você está prestes a embarcar em uma prova de conceito, precisa definir os critérios de sucesso. Por exemplo, se tivéssemos um sistema que precisa processar grandes quantidades de dados em tempo real, baseado na internet, então alguns critérios de sucesso podem ser: • Podemos ter 1 000 000 de acessos simultâneos no site de compra; • Podemos processar 10 000 mensagens em um segundo; 12 13 • Podemos fazer isso dentro das restrições de orçamento do software; • Podemos recuperar o atraso se ficarmos para trás em nosso processamento. E nossa hipótese para esse caso é, por exemplo: • Seremos capazes de atender aos quatro critérios de sucesso acima usando Azure e Python com um front em HTML5 e CSS3? Em seguida, precisamos coletar evidências para provar ou refutar nossa hipótese. Mas, essencialmente, significa coletar evidências para provar/refutar um design. Neste estágio, construímos a versão mínima útil do sistema que podemos usar para validar nosso pensamento. Esse processo parece muito diferente, dependendo da hipótese que você está tentando provar. O importante a lembrar neste ponto é que você deve fazer isso sem supor se a hipótese é verdadeira ou não. Uma prova de conceito é útil e fundamental, não importa o resultado. Provar que uma abordagem não atenderá aos critérios é tão útil quanto provar que sim. Com isso em mente, é importante provar ou refutar rapidamente uma abordagem. Um loop de feedback rápido entre hipótese, experimento e conclusão é extremamente importante. Desta forma, você pode estabelecer rapidamente as abordagens que não vão funcionar e continuar com uma avaliação mais aprofundada e, posteriormente, o uso da solução comprovada. É aí que entra a famosa “Prova de Conceito”. Mas espere aí! Antes, um pouco da história sobre as tais provas de conceito e como esse conceito tão puro, inteligente e bonito, foi distorcido aqui em nosso país. Vamos primeiro, “pôr os pingos nos is”: Prova de conceito ou POC, também conhecida como prova de princípio,é a rea lização de um determinado método ou ideia para demonstrar sua viabilidade, ou uma demonstração de princípio com o objetivo de verificar se algum conceito ou teoria tem potencial prático. Normalmente, depois que um resultado confiável é alcançado no estágio de prova de conceito, em seguida vem o protótipo de aparência. Este modelo responde à pergunta: como será a aparência e a sensação de uso? Ele oferece uma amostra do design final. O protótipo de aparência é visualmente representativo, mas carece de funcionalidade real (pelo menos deveria carecer). Se o seu cliente tiver uma intenção real, honesta e idônea, ele pagará pelo POC. Acho importante que o cliente se comprometa com o POC de alguma forma. Afinal, muitos jovens desenvolvedores e analistas se comprometem, de corpo e alma, com uma solução ou arquitetura e gastam seu tempo e possibilidades de ganhos fazendo “coisas para os outros”. E acabam resolvendo problemas de graça e depois são descartados por algum outro fornecedor, ou pior, ninguém levou nada mas viraram “trouxas” do cliente tomador do serviço. Se você for uma startup e quiser gerar dinheiro e eles forem um grande cliente, cobre, sem medo. Se não pagarem, esse cliente não era para ser seu e se fosse, geraria mais dor de cabeça que proventos e networking. Lembrese, você é livre e independente. 13 UNIDADE Conceituação de Engenharia de Software Experimental O desenvolvimento de uma prova de conceito geralmente requer algum investimento de tempo ou outros recursos, como tecnologias de suporte ou componentes físicos necessários para ser concluído. Passar por esse processo, no entanto, permite que as empresas determinem a viabilidade de uma ideia antes de colocar recursos de nível de produção por trás de uma ideia não testada. Um plano de prova de conceito pode abordar como o produto ou serviço proposto apoiará as metas organizacionais , objetivos ou outros requisitos de negócios, embora essa etapa não seja o objetivo principal do POC. O processo de prova de conceito deve incluir: • critérios claramente definidos para o sucesso; • documentação de como a prova de conceito será realizada; • um componente de avaliação; e • uma proposta de como avançar caso o POC seja bemsucedido. O desenvolvimento de tal plano é uma etapa importante para determinar como um produto ou serviço imaginado será entregue aos usuários com o menor número de falhas. Prova de conceito vs. protótipo Embora os termos prova de conceito e protótipo sejam frequentemente usados de forma intercambiável, eles são processos diferentes destinados a produzir resultados diferentes e servir a propósitos diferentes. Onde uma prova de conceito se destina a determinar se uma ideia pode ser transformada em realidade, um protótipo se destina a transformar essa ideia em uma versão simplificada do produto que pode ser testado e avaliado quanto à usabilidade, funcionalidade e design. Não se espera que um protótipo tenha todos os recursos e funções de um produto pronto para o mercado, nem que contenha toda a usabilidade ou estética de um produto. Ele fornece às partes interessadas, como gerentes e executivos de projeto, bem como investidores em potencial, um esboço de como será o produto. (PRATT, 2020, p. 2) Bem, em suma, uma vez que uma hipótese foi provada ou refutada, você pode tirar suas conclusões. Se a conclusão disser que uma abordagem funciona ou não, é importante escrevêla e documentar totalmente todas as decisões tomadas. Isso não apenas o força a pensar e considerar totalmente essas decisões, mas também é fundamental para que as pessoas possam entender o design posteriormente. Usando esse processo, podemos avaliar rapidamente as abordagens sugeridas e mini mizar o tempo perdido explorando becos sem saída. A lição mais importante é que o processo experimental científico é igualmente apli cável ao desenvolvimento de software e deixa você não apenas com um design no qual você tem confiança, mas também com um raciocínio totalmente documentado por trás de cada decisão tomada. Agora que você já entendeu, vamos brevemente voltar ao tema da POC, com um pequeno causo para sua aprendizagem: 14 15 Nos idos de 2013, quatro empresas bem-posicionadas em “data cleansing” ou lim- peza de dados, foram chamadas para uma prova de conceito de uma grande insti- tuição. Todos os concorrentes estavam eufóricos e queriam fazer o cliente potencial conhecer qual era o melhor e vencer a competição, afinal, era algo em torno de 90.000.000 de CPFs que estavam em jogo para serem tratados. Então veio a ordem do potencial cliente: • Senhores, precisamos que vocês façam uma prova de conceito para limpar, du- plicar e enriquecer os nossos dados, para tanto propomos que vocês realizem uma POC com suas tecnologias como critério de seleção para um projeto espe- cial que temos aqui. A POC ocorrerá com 5.000 registros como amostra para cada um dos fornecedores. Ohhhhh, todos ficaram eufóricos e mandaram seus orçamentos para a sua POC. Porém, receberam uma ligação... • Se vocês cobrarem a POC não faremos com vocês, pois são só 5.000 registros de 90.000.000 milhões que temos, isso é uma ousadia. Todavia é importante você saber que para esse experimento, houve horas de setup, escrita de código, preparação de interface, preparação de ambiente, horas homem, horas teste etc. Mas como eram 90 milhões de registros, todos os 4 abriram mão e rodaram as POCs livres de custos. A coisa não era tão simples assim, investiram-se 40 horas de codificação para você ter uma ideia. Bom, todos entregaram suas POCs e aguardaram o resultado, que como você já deve imaginar, não veio. Bem, as empresas acharam estranho e começaram a conversar entre si. Duas delas haviam ligado e foram rispidamente tratadas. • Infelizmente devido à crise “desculpa para qualquer intercorrência econômica temporária no país” não poderemos ir adiante com o projeto, agradecemos sua presteza em nos atender e esperamos poder contar com você para o próximo projeto em tempos melhores; • Como assim, “cara pálida”?! Todos ficaram com cara de interrogação após investirem tempo, e pensaram, bem, mas dos males o menor, eram só 5.000 registros. 5.000 de cada, portanto 20.000 registros foram processados. Quase 2 anos depois, acabou-se descobrindo que na verdade o projeto era para 20.000 registros que deveriam ser preparados para uma campanha de marketing exclusiva para clientes “TOP” já selecionados e devidamente segmentados pelo time de DBA daquele potencial cliente. Portanto, caro aluno, o projeto saiu: “de graça”. Moral da história, POC é perigoso se você abrir mão de cobrar porque você ou a empre- sa que você trabalha espera por um contrato mais à frente. Isso infelizmente não existe. A ordem no mercado e nos negócios é “cobre”, mesmo que o cliente vá para outro. Imagino que você esteja curioso pelo fim da história... sim, vou contar. O Superintendente da área do potencial cliente foi demitido por assédio moral, coisa que aconteceu quando ele assediou funcionários de outra área e o outro superinten- dente tinha mais cacife político. Às vezes acontece. 15 UNIDADE Conceituação de Engenharia de Software Experimental Bom, daí você pode imaginar que seus colaboradores e demais pessoas pressionadas se sentiram livres para abrirem processos, contarem histórias de terror, e por aí vai. Ética nos negócios e ética em engenharia de software não se negocia, evite cair em armadilhas você que está no início de carreira ou que ainda não teve o azar de passar por isso. Experimentação e Engenharia de Software Experimental A Engenharia de Software Experimental é uma parte que se concentra na coleta de evidências, por meio de medições e experimentos envolvendo sistemas de software (produtos, processos e recursos de software). O principal objetivo da realização de experimentos é provar ou refutar as hipóteses ou ideias dos cientistas. Portanto é fundamental utilizar o uso da abordagem científica para o desenvolvimento, evolução e manutenção de software, principalmente métodos científicos para fazer pes quisa e para tomar decisões sobre mudanças na forma de desenvolver softwares. Normal mente começa com a observação e o registro do que é observado, e evolui para a mani pulação de variáveis controláveis e a observação de seu efeito em variáveis de interesse. Para entender uma disciplina é necessário a construção de modelos, não só de produtos mas também de processos e domínios de aplicação. Para testar se a compreensão está correta é preciso testar esses modelos, isto implica em experimentação. Ao se analisar resultados experimentais, aprendemos e consolidamos esse conhecimento em modelos mais sofis ticados. (BRAGA; MASIERO, 2017, p. 10) Portanto da mesma maneira que há paradigmas em Engenharia de Software, como vi mos anteriormente, temos paradigmas em Engenharia de Software Experimental, a saber: • Paradigma Analítico: » Baseado em matemática; » Propõe uma teoria formal ou um conjunto de axiomas; » Deriva matematicamente um conjunto de resultados; » Está no cerne da ciência da computação e expõe a herança matemática de nossa área (Engenharia de Software). • Paradigma Experimental: » Observa o mundo ou soluções existentes; » Propõe um modelo de comportamento ou solução melhor; » Mede e analisa modelos experimentalmente; » Valida ou refuta hipóteses e modelos. 16 17 De�nição Interpretação Coleta de dados empíricosPlanejamento O Pl an o d o p ro je to Coleta de dados Objetivo Questão Métrica Medição Resposta Alcanço do objetivo Figura 1 – Relações entre a teoria versus observação e o ciclo para a organização de um processo de solução Fonte: Adaptada de BRAGA, R.; MASIERO, P.C., 2017. p.14 Um experimento deve ser tratado como um processo da formulação ou verificação de uma teoria. A fim de que o processo ofereça os resulta dos válidos, ele deve ser propriamente organizado e controlado ou, pelo menos, acompanhado. Com o propósito de atingir estes objetivos várias metodologias de organização dos experimentos foram elaboradas. Para se rem comparadas as metodologias da experimentação possuem diferentes características como, por exemplo, as fases do processo de experimenta ção, a maneira da transformação dos conceitos abstratos do domínio às métricas concretas, o objetivo principal da experimentação, as ferramentas do empacotamento etc. Um bom exemplo da metodologia da experimentação avançada é o Para digma da Melhoria da Qualidade (Quality Improvement Paradigm – QIP). A essência dessa metodologia está na melhoria contínua do processo do desenvolvimento de software. A metodologia define os seis passos que terminam resultando em um ci clo da melhoria do processo completo. O ciclo se inicia com a caracteriza ção do processo de negócio necessária para a compreensão do ambiente e a definição dos objetivos básicos. A seguir os objetivos quantitativos são estabelecidos com a propósito de demonstrar as expectativas razoáveis da experimentação. Baseado na caracterização e nos objetivos definidos o processo da melhoria apropriado é escolhido tomando em considera ção a consistência entre os objetivos. O processo do desenvolvimento de software oferece, além do próprio software, o feedback do projeto que representa a informação recolhida. Essa informação serve como a base para a análise, ou seja, a avaliação das práticas atuais, a determinação dos problemas, a proposição da melhoria futura. Finalmente, toda infor mação relevante está empacotada para utilização futura. (TRAVASSOS; GUROV; AMARAL, 2002, p. 19) 17 UNIDADE Conceituação de Engenharia de Software Experimental Causa Efeito ResultadoTratamento Teoria Variável Independente Execução do Experimento Variável Dependente Observação Figura 2 – O processo principal da abordagem GQM Fonte: Adaptada de TRAVASSOS; GUROV; AMARAL, 2002, p. 21 Quais tipos de pesquisa nos auxiliam e são complementares? Temos dois tipos de paradigmas de pesquisa com abordagens diferentes para estudos empíricos nos quais devemos notar a complementaridade entre ambas para fins de pes quisa em engenharia de software experimental, a saber: A pesquisa exploratória se preocupa em estudar objetos em seu ambiente natural e deixar os achados emergirem das observações. Isso implica um desenho de pesquisa flexível para se adaptar às mudanças no fenô meno observado. A pesquisa de design flexível também é referida como pesquisa quali tativa, pois é principalmente informada por dados qualitativos. Pesquisas indutivas ten tam interpretar um fenômeno baseado em explicações que as pessoas trazem adiante. Preocupase em descobrir as causas notadas pelos sujeitos no estudo e entender sua visão do problema em questão. O sujeito é a pessoa, que está participando de um estudo empírico para avaliar um objeto. A pesquisa explicativa preocupase principalmente em quantificar uma relação ou comparar dois ou mais grupos com o objetivo de identificar uma relação causaefeito. A pesquisa é frequentemente conduzida através da criação de experimentos contro lados. É um estudo de design fixo, implicando que os fatores são corrigidos antes do lançamento do estudo. A pesquisa de design fixo também é referida como pesquisa quantitativa, pois é infor mada principalmente por dados quantitativos. Investigações quantitativas são apropriadas ao testar o efeito de alguma manipulação ou atividade. Os métodos de pesquisa quantitativa enfatizam medidas objetivas e a análise estatís tica, matemática ou numérica de dados coletados por meio de pesquisas, questionários e pesquisas ou pela manipulação de dados estatísticos préexistentes usando técnicas computacionais. A pesquisa quantitativa concentrase em reunir dados numéricos e generalizálos entre grupos de pessoas ou para explicar um fenômeno específico. O relatório final escrito tem uma estrutura definida que consiste em introdução, literatura e teoria, métodos, resulta dos e discussão. 18 19 Seu objetivo ao conduzir um estudo de pesquisa quantitativa é determinar a relação entre uma variável independente e outra, uma variável dependente ou de resultado den tro de uma população. Os projetos de pesquisa quantitativa são descritivos, geralmente medidos uma vez ou experimental medidos antes e depois de um tratamento. Um estudo descritivo estabelece apenas associações entre variáveis; um estudo expe rimental estabelece causalidade. Suas principais características são: • Os dados são geralmente coletados por meio de instrumentos de pesquisa estruturados; • Os resultados são baseados em tamanhos de amostra maiores que são representa tivos da população; • O estudo de pesquisa geralmente pode ser replicado ou repetido, dada sua alta confiabilidade; • O pesquisador tem uma questão de pesquisa claramente definida para a qual res postas objetivas são buscadas; • Todos os aspectos do estudo são cuidadosamente planejados antes que os dados sejam coletados; • Os dados estão na forma de números e estatísticas, geralmente organizados em tabelas, gráficos, figuras ou outras formas não textuais; • O projeto pode ser usado para generalizar conceitos mais amplamente, prever resultados futuros ou investigar relações causais; • O pesquisador utiliza ferramentas, como questionários ou softwares de computador, para coletar dados numéricos. Uma vantagem é que os dados quantitativos promovem comparações e análi ses estatísticas. Podemos utilizar métodos qualitativos também. A definição de qualitativa referese a medidas das características de algo. A pesquisa qualitativa envolve a coleta e análise de dados não numéricos (por exem plo, texto, vídeo ou áudio) para compreender conceitos, opiniões ou experiências. A pes quisa qualitativa é o oposto da pesquisa quantitativa , que envolve a coleta e análise de dados numéricos para análise estatística. A pesquisa qualitativa visa obter uma compreensão profunda de uma organização ou evento específico, ao invés de uma descriçãosuperficial de uma grande amostra de uma população. Tem como objetivo fornecer uma representação explícita da estrutura, ordem e padrões gerais encontrados entre um grupo de participantes, por exemplo. A pesquisa qualitativa não introduz tratamentos ou manipula variáveis, nem impõe aos participantes as definições operacionais de variáveis do pesquisador. Em vez disso, permite que o significado surja dos participantes. É mais flexível porque pode se ajustar à configuração. Conceitos, ferramentas de coleta de dados e métodos de coleta de dados podem ser ajustados à medida que a pesquisa avança. 19 UNIDADE Conceituação de Engenharia de Software Experimental Tem como objetivo obter um melhor entendimento por meio de experiências em primeira mão, relatos verdadeiros e citações reais. Assim, compreender como os par ticipantes extraem significado de seu entorno e como seu significado influencia seu comportamento. A pesquisa qualitativa usa a observação como método de coleta de dados. A observa ção é usada extensivamente em estudos e reduz a distorção entre o observador e objeto observado, que pode ser produzido por um instrumento. O cenário do mundo real é a primeira característica da pesquisa qualitativa. Em mé todos de pesquisa qualitativa, como método de observação, pesquisa etnográfica, grupo focal, entrevistas individuais, o comportamento dos participantes do estudo é observado e a conclusão é tirada com base em suas respostas e seu comportamento, por exemplo, perante um sistema de informação ou protótipo. É possível que pesquisas qualitativas e quantitativas investiguem os mesmos temas, mas cada um deles abordará um tipo diferente de questão. Por exemplo, uma investigação quantitativa poderia ser iniciada para investigar o quanto um novo método de inspeção diminui o número de falhas encontradas no teste. Para responder a perguntas sobre as fontes de variações entre diferentes grupos de ins peção, uma investigação qualitativa poderia ser iniciada. Estratégias de design fixo, como experimentos controlados, são apropriadas ao testar os efeitos de um tratamento, enquanto um estudo de design flexível é apropriado para descobrir por que os resultados de uma investigação quantitativa são como eles são. As duas abordagens devem ser consideradas complementares e não competitivas entre si. Introdução à Engenharia de Software Experimental Engenharia de Software Experimental é um ramo da engenharia de software que visa avaliar os conceitos utilizados na produção de sistemas de software, como o desen volvimento de ciclos ou arquiteturas de software. É a aplicação de métodos empíricos à engenharia de software. É o estudo dos artefatos de software, ou seja, os elementos envolvidos na criação de um software ou resultado, para fins de caracterização, compreensão, avaliação, previsão, controle, gestão ou melhoria por meio de análises qualitativas ou quantitativas. Muitos critérios entram em jogo no projeto de software, como os métodos de desen volvimento a serem adotados, o número de desenvolvedores a serem empregados ou o tempo de produção a ser estimado. Muitas vezes, com base na experiência dos desenvolvedores, as escolhas que decor rem desses critérios são influenciadas mais por opiniões e “achismos” do que por análises objetivas. Muitos artigos científicos publicados em periódicos de engenharia de software não apresentam qualquer validação experimental e isso descredencia boa parte das pes quisas relacionadas a performance e novas abordagens, mantendo os desenvolvedores 20 21 e engenheiros de software em uma certa zona de conforto, por outro lado mantém as áreas financiadoras de projetos com os “pés atrás”. A Engenharia de Software Experimental consiste na observação de al guns aspectos do desenvolvimento de software com foco no experimento . Esta observação pode ser feita através da aplicação de métodos ou técni cas, sejam eles novos ou já existentes. A Engenharia de Software Experi mental permite compreender melhor o funcionamento das coisas e saber se o que se acredita ser verdade realmente é. Existem vários contextos de aplicação dos experimentos em Engenharia de Software Experimental como in vitro, in vivo, in sílico e in virtuo. (JESUS, 2013, p. 6) O objetivo do uso de métodos experimentais em engenharia de software é, então, provar ou refutar o valor de uma abordagem ou técnica particular. Para tanto, os da dos manipulados na engenharia de software empírica cobrem todo o ciclo de vida do software incluindo, entre outras coisas, o códigofonte (funcional ou de teste ), histórico, documentação ou mesmo vestígios de execução do software. Mas Engenharia de Software também é uma disciplina de laboratório, portanto há necessidade da existência de profissionais cujo papel é construir cada vez “mais barato” e “mais rápido” sistemas cada vez “melhores”, utilizando o conhecimento disponível à época. Portanto, é fundamental que entendamos, ou ao menos tentemos entender, a natureza dos processos e produtos de software e da relação entre os dois no desenvolvi mento e manutenção de sistemas. Mas se a Engenharia de Software Experimental trabalha basicamente com o entendi mento a partir do teste de hipóteses e comparações para saber o que é funcional e o que não é em construção de software ou em abordagem processuais em software, temos então os paradigmas, ou se preferir as formas de se fazer isso não é mesmo?! Todavia, devemos refletir sobre a novidade da disciplina de Engenharia de Software que despontou como a “salvação para a crise do software” e, que hoje, é terrivelmente dependente de teste e experimento para que seus produtos de software possam ser acei tos pelos seus usuários. Independentemente do método da moda ou do que as grandes consultorias e fabricantes determinem. Vejamos por exemplo esse pequeno excerto, retirado de um livro canônico sobre Engenharia de Software Experimental: A experimentação referese à correspondência com fatos a suposições, especulações e crenças que abundam na construção de software. A cons trução de software é apoiada e usa uma série de ideias: aplicamos técni cas em que confiamos para produzir um determinado resultado; acredita mos que muitas pessoas serão capazes de concluir o projeto; esperamos que o tempo de desenvolvimento seja menor usando uma determinada ferramenta; assumimos que a qualidade do produto será melhor se usar mos um determinado processo de desenvolvimento etc. Mas temos a certeza de que as nossas crenças são verdadeiras? Quais das alegações feitas pela comunidade de desenvolvimento de software são válidas? Em que circunstâncias são válidas? Infelizmente, quase não há certezas sobre as ideias sobre as quais a Enge nharia de Software se funda. A engenharia de software atingiu um estágio mais parecido com a charlatanice do que a engenharia; uma si tuação em que um artigo de pesquisa após o outro exalta as virtudes de 21 UNIDADE Conceituação de Engenharia de Software Experimental um procedimento, estilo, técnica ou conjunto de regras específicos para domar o monstro do software e levar à terra prometida; uma situação em que as anedotas formam a maior parte das informações disponíveis sobre o quão bem um determinado esquema funciona, especialmente em com paração com modelos concorrentes; uma situação em que as opiniões são muitas vezes fortemente mantidas, vigorosamente defendidas e mais prevalentes do que dados objetivos reais. Atualmente, as ideias válidas distinguemse das falsas crenças em enge nharia de software, aplicando o teste do tempo. A certeza de uma ideia é julgada se as pessoas usam a ideia. Se muitas pessoas usam a ideia, pa recemos ter certeza. Se poucas pessoas usarem a ideia, ela é considerada falsa e será devastada pelo tempo. Este modus operandi é mais parecido com disciplinas “da moda” do que engenharia. (JURISTO; MORENO, 2010, p. 3) Por ser uma área relativamente nova, a Engenharia de Software Experimental enfrenta a opiniãodos céticos, todavia, as refutações são muito fortes, vejamos: Quadro 1 – Resumo de falácias e refutações sobre experimentação em ciência da computação O método científico tradicional não é aplicável. Para entender o processo de informação, os cientistas da computação devem observar fenômenos e formular e testar explicações. Este é o método científico. O nível atual de experimentação é bom o suficiente. Em relação a outras ciências, os dados mostram que os cientistas da computação validam uma porcentagem menor de suas reivindicações. Experimentos custam muito. Experimentos significativos podem se encaixar em pequenos orça- mentos; experimentos caros podem valer mais do que seu custo. As manifestações serão suficientes. Demos pode fornecer incentivos para estudar uma questão mais adiante. Muitas vezes, no entanto, essas demonstrações apenas ilus- tram um potencial. Há muito barulho no caminho. Felizmente, técnicas podem ser usadas para simplificar variáveis e res- ponder perguntas. A experimentação atrasará o progresso. Aumentar a proporção de papéis com validação significativa tem uma boa chance de acelerar o progresso. A tecnologia muda muito rápido. Se uma pergunta se torna irrelevante rapidamente, ela é muito estrei- tamente definida e não vale a pena gastar muito esforço. Você nunca vai publicá-lo. Passos menores ainda valem a pena publicar porque melhoram nosso entendimento e levantam novas questões. Fonte: Adaptado de JURISTO; MORENO, 2010, p. 7 Por outro lado, a obra canônica de Brooks (1986) descreve alguns desafios com a produção de software que reinam até hoje, dentre os argumentos, que ele acerta damente usa, não há um único desenvolvimento, seja em tecnologia ou técnica de gerenciamento, que por si só promete 10 vezes melhoria em uma década em produtivi dade, confiabilidade e simplicidade no desenvolvimento de software. E vai além, dizendo 22 23 que não podemos esperar ver ganhos de duas vezes a cada dois anos no desenvolvimen to de software, como ocorre no desenvolvimento de hardware citando a lei de Moore. Aqui deixo um artigo para você poder ler esse divisor de águas na Engenharia de Software escrita por Brooks, ganhador do prêmio Alan Turing. Sim, o artigo está em inglês. É importante que você entenda que a língua pátria da Tecnolo- gia da Informação é o inglês e por mais que a universidade se esmere em deixar o conteúdo de graduação em português, uma parte desse esforço dependerá de você para prosperar na área que escolheu ser profissional: o inglês. É aconselhável que você inicie os estudos imediatamente. A Universidade Cruzeiro do Sul possui cursos acessíveis e parceiros incríveis para que você possa evoluir e vir a ser um excelente profissional. Vale o esforço! Artigo original: BROOKS, F. P. J. No silver bullet: essence and accident in Software Engineering. 1986. Disponível em: https://bit.ly/3DxYOMc Segundo Brooks (1986), existem dois tipos de dificuldades em desenvolvimento de software: essenciais e acidentais. As essenciais são da natureza da área e dificilmente serão superadas por qualquer nova tecnologia ou método que se invente. As dificuldades essenciais são as seguintes: 1. Complexidade: dentre as construções que o homem se propõe a realizar, software é uma das mais desafiadoras e mais complexas que existe. Na verdade, como dissemos antes, mesmo construções de engenharia tradicional, como um satélite, uma usina nuclear ou um foguete, são cada vez mais dependentes de software; 2. Conformidade: pela sua natureza software tem que se adaptar ao seu ambiente, que muda a todo momento no mundo moderno. Por exem plo, se as leis para recolhimento de impostos mudam, normalmente es perase que os sistemas sejam rapidamente adaptados à nova legislação. Brooks comenta que isso não ocorre, por exemplo, na Física, pois as leis da natureza não mudam de acordo com os caprichos dos homens. 3. Facilidade de mudanças: que consiste na necessidade de evoluir sempre, incorporando novas funcionalidades. Na verdade, quanto mais bem sucedido for um sistema de software, mais demanda por mudanças ele recebe; 4. Invisibilidade: devido à sua natureza abstrata, é difícil visualizar o tamanho e consequentemente estimar o esforço de construir um sis tema de software. As dificuldades (2), (3) e (4) são específicas de sistemas de software, isto é, elas não ocorrem em outros produtos de Engenharia, pelo menos na mesma intensidade. Por exemplo, quando a legislação ambiental muda, os fabricantes de automóveis têm anos para se conformar às novas leis. Adicionalmente, carros não são alterados, pelo menos de forma essencial, com novas funcionalidades, após serem vendidos. Por fim, um carro é um produto físico, com peso, altura, largura, assentos, forma geométrica etc., o que facilita sua avaliação e precificação por consumidores finais. (VALENTE, 2020, p. 45) 23 UNIDADE Conceituação de Engenharia de Software Experimental A complexidade essencial é o quão difícil é algo de fazer, independentemente do quão experiente você seja, quais ferramentas usa ou qual novo padrão de arquitetura chama tivo você usou para resolver o problema. Embora alguma complexidade seja inerente ao problema, também trazemos nossa própria complexidade ao escrever o programa. Tratase da complexidade acidental. E aí é que está toda a graça da coisa. Pensemos numa analogia para descrevêla: Você pode pensar na distância de sua casa até a universidade como sendo a complexidade essencial. Mas o caminho que você segue para conseguir chegar lá é uma complexidade acidental. E, pelo menos em teoria, você poderia reduzir a complexidade acidental a zero. Seria apenas você sair da sua casa e traçar uma linha reta até a universidade não é mesmo?! Infelizmente, é meio difícil andar reto numa cidade, mesmo se você tivesse um helicóptero, ou melhor ainda, mais rápido do que a velocidade da luz. No entanto, o problema em si não era tão complexo. Às vezes, ao escolher a ferra menta certa, você poderá conseguir reduzir substancialmente a complexidade acidental. Mas para resolver isso, temos que dar um passo para trás e olhar o problema em ques tão de forma apurada. Parece interessante ver como tudo isso aconteceu, todos esses problemas que ator mentaram os engenheiros de software na década de 1980 do século XX foram essen ciais para o início dessa nova área, a Engenharia de Software Experimental. 24 25 Material Complementar Indicações para saber mais sobre os assuntos abordados nesta Unidade: Vídeos Engenharia de Software Experimental A Engenharia de Software Experimental é o estado da arte da tecnologia: a área entre a pesquisa científica e a Engenharia de Software. https://youtu.be/s_Bp5n51YqM O problema do milênio sobre intratabilidade computacional Qual é a diferença entre responder uma pergunta e verificar uma resposta? https://youtu.be/tpEUu7Rtgk8 Motivação para Engenharia de Software Experimental https://youtu.be/qpHf9qEe9Hs Leitura No Silver Bullet – Essence and Accidents of Software Engineering Moldar construções conceituais complexas é a essência; tarefas acidentais surgem na re presentação de construções na linguagem. O progresso passado reduziu tanto as tarefas acidentais que o progresso futuro agora depende de abordar a essência. https://bit.ly/2Yahul8 25 UNIDADE Conceituação de Engenharia de Software Experimental Referências BRAGA, R. B.; MASIERO, P. C. Introdução à Engenharia de Software Experimen- tal. São Paulo: ICMCUSP, 2017. Disponível em: <https://edisciplinas.usp.br/pluginfile. php/3024449/mod_resource/content/2/Aula_1_Introducao_ESExp_2017.pdf> Acesso em: 10/02/2021. JESUS, H. A. Revisão sistemática de Engenharia de Software Experimental in vitro: uma análise preliminar. Universidade Federal de Lavras – UFLA, Lavras, MG. 2013. Disponível em: <http://docplayer.com.br/5918687Heideralvarengadejesusre visaosistematicadeengenhariadesoftwareexperimentalinvitroumaanaliseprelimi nar.html>.Acesso em: 10/02/2021. JURISTO, N.; MORENO, A. M. Basics of Software Engineering experimentation. 2010. Disponível em: <https://www.cin.ufpe.br/~in1002/leituras/Basics_of_Software _ Engineering_Experimentation.pdf> Acesso em: 10/02/2021. PRATT, M.K. prova de conceito (POC). 2020. Disponível em: <https://searchcio. techtarget.com/definition/proofofconceptPOC> Acesso em: 10/02/2021. TRAVASSOS, G. H.; GUROV, D.; AMARAL, E. A. G. Introdução à Engenharia de Software Experimental. Universidade Federal do Rio de Janeiro – UFRJ, Rio de Janeiro: RJ, 2002. 52 p. Disponível em: <https://www.cin.ufpe.br/~scbs/experimen tal/IntroducaoExperimentacao.pdf> Acesso em: 10/02/2021. VALENTE, M. T. Engenharia de Software Moderna. Independente, 2020. 408p. Disponível em: <https://engsoftmoderna.info/>. Acesso em: 10/02/2021. 26 Engenharia de Software Experimental Responsável pelo Conteúdo: Prof. Me. Artur Marques Revisão Textual: Mariana Góis Processos de Condução de Estudos Experimentais Processos de Condução de Estudos Experimentais • Perceber a existência de vários processos dentro da engenharia de software experimental; • Saber onde aplicar cada tipo de processo. OBJETIVOS DE APRENDIZADO • Princípios da Organização do Experimento; • Pacotes de Laboratório; • Experimentos; • Experimentos Controlados em Engenharia de Software; • Métodos Estatísticos e Análise de Dados em Engenharia de Software Experimental; • A Lei dos Grandes Números. UNIDADE Processos de Condução de Estudos Experimentais Contextualização Nas organizações de desenvolvimento de software atuais, são empregados métodos e ferramentas que frequentemente carecem de evidências suficientes sobre sua adequa- ção, limites, qualidades, custos e riscos associados. 8 9 Princípios da Organização do Experimento Em sua forma mais simples, um experimento visa prever o resultado introduzindo uma mudança nas pré-condições, que é representada por uma ou mais variáveis inde- pendentes , também chamadas de “variáveis de entrada” ou “variáveis de previsão”. A mudança em uma ou mais variáveis independentes é geralmente hipotetizada para resultar em uma mudança em uma ou mais variáveis dependentes , também chamadas de “variáveis de saída” ou “variáveis de resposta”. O projeto experimental também pode identificar variáveis de controle que deve ser mantido constante para evitar que fatores externos afetem os resultados. O projeto experimental envolve não apenas a seleção de variáveis independentes, de- pendentes e de controle adequadas, mas também o planejamento da entrega do experi- mento sob condições estatisticamente ótimas, dadas as restrições dos recursos disponíveis. Existem várias abordagens para determinar o conjunto de pontos de design (combina- ções únicas das conf igurações das variáveis independentes) a serem usados no experimento. As principais preocupações no projeto experimental incluem o estabelecimento de validade, confiabilidade e replicabilidade. Por exemplo, essas preocupações podem ser parcialmente tratadas escolhendo cui- dadosamente a variável independente, reduzindo o risco de erro de medição e garan- tindo que a documentação do método seja suficientemente detalhada. As preocupações relacionadas incluem a obtenção de níveis apropriados de poder estatístico e sensibilida- de. Experimentos corretamente projetados aumentam o conhecimento nas engenharias. Os objetivos relacionados à execução de experimentos em Engenharia de Software são a caracterização, avaliação, previsão, controle e melhoria a respeito de produtos, processos, recursos, modelos, teorias entre outros. A importância e o esforço aumentam de um experimento com o objetivo “caracterização” a um experimento com o objetivo “melhoria”. Isso signi- fica que é bastante simples conduzir um experimento com a finalidade de caracterização respondendo questões do tipo “o que está acontecendo?”. É mais difícil medir algo, por exemplo, um processo ou produto e defini-lo “quão bom é isto?”. Os experimentos com a finalidade de previsão além da medição precisam de meios de estimativa para mostrar a possibilidade de: “posso estimar algo no futuro?”. Para atender a finalidade de controle deve existir a possibilidade de gerenciar os atributos de um processo ou produto e dar a resposta a “posso manipular o evento?”. Finalmente, a finalidade da melhoria supõe que possamos caracterizar, avaliar, predizer e controlar, e há os objetivos da melhoria de um processo ou produto que possam ser atingidos respondendo a última questão “posso melhorar o evento?”. (TRAVASSOS; GUROV; AMARAL, 2002, p. 5) Conforme escritos de Zeviani (2018) planejar um experimento envolve, observar e descrever fenômenos, otimizar o custo-benefício, isolar efeito e determinar as relações e causas., produzir resultados confiáveis, a a validade de um experimento é afetada pela 9 UNIDADE Processos de Condução de Estudos Experimentais sua construção e execução, portanto, a atenção investida no delineamento experimental é importante. Tabela 1 – Características Observacionais X Características Experimentais Controle sob as condições de contorno não sim Controle sob efeito de fatores indesejáveis não sim Controle dos fatores sob investigação não sim Determinar relações causais não sim É o mais comum sim não É o mais barato sim não Fonte: Adaptada de ZEVIANI, 2018 Quando falamos de experimentação, devemos recorrer canonicamente a uma me- todologia para projetar experimentos, e temos Ronald Fisher que escreveu dois livros sobre o tema em 1926 e 1935 sobre o desenho de experimentos que teremos que es- tudar com certeza. Pode-se resumir esses princípios da seguinte forma: • Comparação: Em alguns campos de estudo, não é possível ter medições indepen- dentes para um padrão de metrologia rastreável. As comparações entre os tratamen- tos são muito mais valiosas e geralmente preferíveis, e muitas vezes comparadas com um controle científico ou tratamento tradicional que atua como linha de base; • Aleatoriedade: Atribuição aleatória é o processo de atribuir indivíduos aleatoria- mente a grupos ou a grupos diferentes em um experimento, de modo que cada indi- víduo da população tenha a mesma chance de se tornar um participante do estudo. A atribuição aleatória de indivíduos a grupos, ou condições dentro de um grupo distingue um experimento “verdadeiro” rigoroso de um estudo observacional ou “quase-experimento”. Atribuir unidades a tratamentos aleatoriamente tende a mitigar confusão, que faz com que os efeitos devido a outros fatores além do tratamento pareçam resultar do tratamento. Os riscos associados à alocação aleatória, como por exemplo, ter um sério desequilí- brio em uma característica-chave entre um grupo de tratamento e um grupo de control; são calculáveis e, portanto, podem ser gerenciados até um nível aceitável usando unida- des experimentais suficientes. No entanto, se a população for dividida em várias subpopulações que de alguma forma diferem, e a pesquisa exigir que cada subpopulação seja igual em tamanho, a amostragem estratificada pode ser usada. Dessa forma, as unidades em cada subpopulação são randomizadas, mas não a amostra inteira. Os resultados de um experimento podem ser generalizados de forma confiável a par- tir das unidades experimentais para uma população estatística maior de unidades ape- nas se as unidades experimentais forem uma amostra aleatória da população maior; o erro provável de tal extrapolação depende do tamanho da amostra, entre outras coisas. 10 11 • Replicação estatística: As medições estão geralmente sujeitas a variação e incer- teza de medição; assim, são repetidos e experimentos completos são replicados para ajudar a identificar as fontes de variação, para melhor estimar os verdadeiros efeitos dos tratamentos, para fortalecer ainda mais a confiabilidade e a validade do experimento e para aumentar o conhecimento existente sobre o tópico; • No entanto, certas condições devemser atendidas antes que a replicação do experimento seja iniciada: a questão de pesquisa original foi publicada em uma publicação revisada por pares ou o pesquisador é independente do experimento original, o pesquisador deve primeiro tentar replicar as descobertas originais usan- do os dados originais e o artigo deve declarar que o estudo conduzido é um estudo de replicação que tentou seguir o original estudar tão estritamente quanto possível; • Bloqueando: trata-se do arranjo não aleatório de unidades experimentais em gru- pos consistindo em unidades que são semelhantes entre si. O bloqueio reduz as fon- tes de variação conhecidas, mas irrelevantes, entre as unidades e, assim, permite maior precisão na estimativa da fonte de variação em estudo; • Ortogonalidade: diz respeito às formas de comparação que podem ser realizadas de forma legítima e eficiente. Os contrastes podem ser representados por vetores e os conjuntos de contrastes ortogonais não estão correlacionados e são distribuídos independentemente se os dados forem normais. Um experimento planejado é or- togonal se os efeitos de qualquer fator compensarem (soma a zero) entre os efeitos dos outros fatores. A ortogonalidade garante que o efeito de um fator ou interação possa ser estimado separadamente a partir do efeito de qualquer outro fator ou interação no modelo. Por causa dessa independência, cada tratamento ortogonal fornece informações diferentes para os outros. » Experimentos fatoriais: Uso de experimentos fatoriais em vez do método de um fator de cada vez. Estes são eficientes na avaliação dos efeitos e possíveis intera- ções de vários fatores ou se preferir, variáveis independentes. A análise do projeto do experimento é construída com base na análise de variân- cia, uma coleção de modelos que particiona a variância observada em componen- tes, de acordo com os fatores que o experimento deve estimar ou testar. Os elementos principais do experimento são as variáveis, os objetos, os participantes, o contexto do experimento, hipóteses, e o tipo de projeto do experimento. Há dois tipos de variáveis do experimento: dependentes e independentes. As variáveis independentes referem-se à entrada do processo de experi- mentação. Essas variáveis também se chamam “fatores” e apresentam a causa que afeta o resultado do processo de experimentação. O pró- prio valor de um fator se chama “tratamento”. As variáveis dependentes referem-se à saída do processo de experimentação. Essas variáveis apre- sentam o efeito que é causado pelos fatores do experimento. O próprio valor de uma variável dependente se chama “resultado”. (TRAVASSOS; GUROV; AMARAL, 2002, p. 7) 11 UNIDADE Processos de Condução de Estudos Experimentais Objetivos de experimento Construção causa-efeito Construção tratamento-resultado Execução de experimento Variável dependenteVariável independente Observação Teoria Causa Efeito Tratamento Resultado Figura 1 – Quadro conceitual de um experimento Fonte: Adaptada de WOHLIN et al. 2012 Experimentos precisam de controle, como já vimos e são umas das principais necessidades. Em engenharia de software devemos utilizar formas mais controladas de estudo, labo- ratório, manipulação de variáveis, por exemplo: O tempo gasto para desenvolver e testar algumas funções auxiliares usando: • programação de pares vs. programação solo; • realizar teste por último vs. testar primeiro. Ambiente deve ser controlado, por exemplo: • seleção de sujeitos (por exemplo, fundos semelhantes); • curva de aprendizado; • aplicação tanto para novatos (estudantes) quanto para programadores da indústria; • randomização sobre os sujeitos. Tudo deve ser reprodutível, por exemplo, funções e artefatos: • Porque eles exigem menos tempo na execução; • Os artefatos, principalmente, são produzidos apenas para o experimento; • Porém, podem ser reutilizados em repetições de outros experimentos. Validar reivindicações mais específicas, por exemplo: • Avaliação do tempo gasto para alterar um pedaço de módulo usando mecanismos específicos de variabilidade; • Medir a eficácia das métricas para detectar um problema determinado no design. Para Oliveira; Leite; Cysneiros (2012), pesquisadores em Engenharia de Software afirmam que somente os experimentos, no centro do processo científico, podem verifi- car novas teorias e, indicar as correções cabíveis e explorar os fatores críticos dessa nova teoria. Afirmam também que novos métodos, técnicas e ferramentas em Engenharia de Software não deveriam ser publicados sem antes serem experimentados, validados e comparados com os existentes. Para a Engenharia de Software existem quatro métodos relevantes com a finalidade de condução de experimentos. São eles: (1) o método científico 12 13 que retira do ambiente observado um modelo para definir o conjunto de propriedades que devem ser analisadas; (2) o método da engenharia que estuda as soluções já utilizadas e aplica alguma suposta evolução na ten- tativa de achar uma vantagem adicional em relação às soluções iniciais; (3) o método analítico, ou matemático, que propõe uma teoria bem for- malizada, obtém os resultados da aplicação da mesma e compara esses resultados com os resultados empíricos e (4) o método experimental que propõe e submete repetidamente o novo método a situações para observa- ção do comportamento com o objetivo de comprovação e aprimoramento. O Processo de Experimentação possui dois subprocessos, o Processo de Execução e o Processo de Empacotamento. As finalidades das etapas do Processo de Experimentação são apresentadas a seguir. A etapa de defi- nição vai expressar o experimento em termos de objetivos e problemas; a etapa de planejamento vai: determinar o projeto do experimento, definir a instrumentação a ser utilizada e analisar os aspectos de validação dos resul- tados. A etapa de execução vai cuidar da coleta dos dados do experimento. E a etapa de análise e interpretação vai estudar detalhadamente os dados coletados. O processo possui dois pontos de controle, o primeiro existe para avaliar a necessidade de replanejar e o segundo existe para avaliar a efetividade da etapa de análise dos resultados. O Processo de Empacota- mento faz a atividade de organizar e guardar as informações a respeito do Processo de Execução. (OLIVEIRA; LEITE; CYSNEIROS, 2012, p. 19-20) Pacotes de Laboratório As replicações de experimentos desempenham um papel central no método científi- co. Embora a experimentação da engenharia de software tenha amadurecido muito, o número de replicações de experimentos ainda é relativamente pequeno. Os experimen- tos de engenharia de software são compostos de conceitos, procedimentos e artefatos complexos. Os pacotes de laboratório são um meio de transferência de conhecimento entre pesquisadores para facilitar a replicação de experimentos. Com um pacote de laboratório, um grupo externo de pesquisadores em engenharia de software pode reproduzir as configurações de uma linha de base. Características dos experimentos que podem estar impactando os resultados, como a linguagem de progra- mação ou a duração da sessão experimental dos experimentos. Talvez você esteja se perguntando, mas o que é linha de base? Será que é aquela que a gente utiliza em gestão de projetos? Não, estamos falando de engenharia de software experimental, uma disciplina nova, tida como estado da arte em estudo de métodos e meios para se desenvolver software melhor, vou te explicar. Os dados da linha de base em pesquisa são um conjunto de informações frequente- mente empregadas para comparar outros dados adquiridos posteriormente. Serve como base da maioria dos projetos de pesquisa. Daí, com certeza vem a sua próxima pergun- ta; o que significa dados da linha de base? Bem, para estudar diferentes assuntos, os 13 UNIDADE Processos de Condução de Estudos Experimentais pesquisadores exigem um certo grau de informação prévia para estabelecer o escopo e o alcance de sua investigação. Em um experimentocontrolado elabora-se um modelo similar a profissio- nais construindo software. Os participantes, que os representam, aplicam a tecnologia sob investigação. Os dados produzidos pela execução permi- tem que o desempenho seja avaliado, medido e comparado, considerando as condições sob as quais o experimento foi. A partir dos resultados de es- tudos experimentais é construído um corpo de conhecimento, que além de prover um alicerce científico para a disciplina de Engenharia de Software, favorece a sua respectiva aplicação no mercado, apoiando em tomadas de decisão. Entretanto, apenas experimentos isolados não são suficientes para o estabelecimento desse corpo de conhecimento, por isso é preciso realizar replicações para fundamentar as conclusões obtidas com um nível maior de confiança. Quando outros pesquisadores replicam um experimento com sucesso, a confiança é construída nos procedimentos e nos resultados. Realizar uma replicação, que não seja de maneira completamente indepen- dente do grupo de pesquisa responsável pelo experimento original, requer o acesso ao seu respectivo pacote de laboratório. O pacote de laboratório é um artefato que contém a descrição dos procedimentos adotados, o conhe- cimento gerado, os resultados e as conclusões. Revisando essas informa- ções, replicadores podem compreender como o experimento foi projetado, conduzido e analisado. Portanto, o pacote de laboratório consiste em um meio de transferência de conhecimento entre grupos de pesquisa de Enge- nharia de Software. (SCATALON, 2013, p. 15) As variáveis independentes influenciam na aplicação do objeto de estudo, pois como um experimento foca em entender o efeito da mudança em uma ou mais variáveis in- dependentes. Assim, são chamados de tratamentos, os n valores que um fator possa vir a assumir. Caso venhamos a utilizar como fator uma forma de técnica, poderemos ter como tra- tamento um teste estrutural e funcional, por exemplo, de tal forma que haverá variação no efeito desejado. O efeito, nesse experimento dependerá da variável dependente (quantidade de de- feitos), onde os valores dos resultados foram coletados, enquanto as variáveis indepen- dentes são os inputs para rodar, assim com a variação desses valores a saída na variável dependente mudará. Variável dependente Variáveis independentes .. . Processo Figura 2 – Esquema de blocos de um processo mostrando o fluxo das entradas através das variáveis independentes e o pós-processamento gerando a saída na variável dependente Fonte: Adaptada de WOHLIN et al. 2012 Scatalon (2012), reforça que, os tratamentos são aplicados a uma combinação de objetos e participantes, sendo que um objeto pode ser, os programas em que devem ser 14 15 aplicadas as técnicas de teste, e os participantes são as pessoas que aplicam os trata- mentos, ou seja, alimentam durante suas operações as variáveis independentes. Experimentos Agora que você já está adquirindo conhecimento e sabe a importância da engenharia de software experimental, talvez comece a perceber o poder de um pergunta bem-feita, cuja resposta nos impele a pesquisa para buscar a razão das coisas e acima de tudo a verdade imposta aquela situação. Já deve ter percebido também que, afinal das contas, que os estudos experimentais tentam responder a perguntas experimentais. Por exemplo: • Os “estereótipos” melhoram a compreensão dos diagramas UML? • Os ‘padrões de design’ melhoram a manutenção do código? • RUP é melhor que SCRUMBAN para ser usado em uma fábrica de software? • O uso de ‘JUnit’ reduz o número de defeitos no código da indústria XPTO? Ideia De�nição Planejamento Operação Análise e Interpretação Apresentação e Empacotamento Conclusão Ex. Processo de um Experimento Figura 3 – Exemplo de fases para um processo de experimento Vamos a algumas decisões para dirimir qualquer dúvida futura, já que logo mais utilizaremos esse tipo de linguagem para nos referir a experimentos em engenharia de software. • Objeto do estudo: é a entidade que é estudada no experimento. Por exemplo, códi- go, processo, documentos de design etc. ; • Propósito: Qual é a intenção do experimento? Por exemplo, avaliar o impacto de duas técnicas diferentes; • Foco de qualidade: O efeito no estudo no experimento. Por exemplo, custo, con- fiabilidade, correção etc. 15 UNIDADE Processos de Condução de Estudos Experimentais Perspectiva: Ponto de vista a partir do qual os resultados do experimento são interpretados. Contexto: O “ambiente” em que o experimento é executado. Vejamos o exemplo no Quadro abaixo para materializar melhor o que queremos dizer: Quadro 1 – Dados elementares sobre o que será estudado no experimento Objeto do estudo • Código (C e C++) de aplicações tradicionais. Propósito • Avaliando se C++ é melhor que C (benefício de OO?), ou seja, se o número de defeitos em programas C++ for menor do que o número de defeitos no código C. Foco de qualidade • (Qual efeito é estudado?): Correção do código. Perspectiva Múltipla. • Pesquisador: avaliando qual linguagem é melhor; • Gerente de projetos: escolha entre C e C++ em sua organização. Contexto • Disciplinas: Estudantes de Ciência da Computação; • Objeto: uma aplicação simples; • Encontre os primeiros números ‘n’ na sequência de Fibonacci Precisamos em seguida planejar: • A definição determina: “Por que o experimento é conduzido”; • O planejamento determina: “Como o experimento será conduzido”. Devemos afirmar claramente: • Perguntas de pesquisa; • Contexto (sujeitos e objetos); • Variáveis; • Métricas; • Projeto do Experimento. O resultado do experimento pode ser perturbado ou até mesmo destruído se não for planejado corretamente. Como atividades referentes ao planejamento, temos por exemplo: • Seleção de contexto. Temos quatro dimensões a considerar: » off-line vs. on-line; » aluno vs. profissional; » modelos hipotéticos vs. problemas reais; » contexto específico, ou seja, apenas uma determinada indústria vs contexto geral. • Formulação de hipóteses: A hipótese do experimento é declarada formalmente, incluindo uma hipótese nula ou hipótese alternativa; 16 17 • Seleção de variáveis: Determinar variáveis independentes (entradas) e variáveis depen- dentes (saídas). O efeito dos tratamentos é medido por meio das variáveis dependentes ; • Seleção de disciplinas: Para generalizar os resultados para a população desejada, a seleção deve ser representativa para essa população ; O tamanho da amostra também impacta os resultados na generalização. • Projeto de experimento: Como agrupar assuntos e como aplicar tratamentos a eles. Os métodos de análise estatística dependem do desenho escolhido: » um fator com dois tratamentos; » um fator com mais de dois tratamentos. • Instrumentação: Nesta atividade são decididas orientações para orientar os partici- pantes do experimento. O material é preparado e as métricas decididas, por exemplo: » Treinamento; » Questionários; » Diagramas. • Avaliação de validação, uma pergunta fundamental: quão válidos são os resul- tados obtidos? • Validação externa: o resultado do estudo pode ser generalizado fora do escopo do nosso estudo? Aqui devemos tomar cuidado porque há várias armadilhas que podemos cair quanto a validade do experimento em engenharia de software, por exemplo: • Experimento mal designado (materiais e equipamentos) ; • Sujeitos não preparados para enfrentar o experimento (por exemplo, diretrizes ou instruções insuficientes) ; • Ansiedade dos sujeitos (medo da avaliação, medo do resultado do experimento ser diferente do esperado na empresa, as vezes por causa do valor já investido) ; • Os pesquisadores podem influenciar os resultados procurando um resultado espe- cífico, ou seja, um problema clássico de viés de experimento ; • Se o grupo é muito heterogêneo, há o risco de que a variação devido às dife- renças individuais seja maior do que devido ao tratamento. Podemos inclusive termos algo relacionado ao que chamamos de: fatoresde confusão, por exemplo, variáveis não controladas ou consideradas desprezíveis erroneamente frente ao fenômeno. São situações geradas por: » Tamanho amostral pequeno; » Baixo poder estatístico. Já definimos anteriormente hipótese, mas vamos trabalhar com um exemplo, levan- do em consideração que 2 hipóteses ao menos devem ser formuladas em um experi- mento em engenharia de software. Duas hipóteses devem ser formuladas: • A hipótese nula, deverá afirmar que não há tendências subjacentes reais no experi- mento as únicas razões para diferenças em nossas observações são coincidência. Esta é a hipótese que o experimentador quer rejeitar com o maior significado possível ; 17 UNIDADE Processos de Condução de Estudos Experimentais • A hipótese alternativa. Esta é a hipótese a favor da qual a hipótese nula é rejeitada. No caso de nosso experimento sobre a comparação da linguagem C vs. C++, poderia ficar assim: • hipótese nula: Os programas C++ contêm, em média, o mesmo número de defei- tos dos programas C; • hipótese alternativa: Os programas C contêm, em média, mais defeitos do que os programas C++. As variáveis independentes (entradas) são aquelas variáveis que podemos controlar e mudar no experimento. • Descrevem os tratamentos; • Descrevem as variáveis para as quais os efeitos devem ser avaliados. As variáveis dependentes (saídas) são as variáveis de resposta que descrevem os efei- tos dos tratamentos descritos pelas variáveis independentes. Muitas vezes há apenas uma variável dependente e, portanto, deve ser derivada diretamente da hipótese. Preste atenção aos fatores de confusão! Não podemos esquecer das variáveis de confusão, que também são chamadas de confundidores ou fatores de confusão; elas estão intimamente relacionadas às variáveis independentes e dependentes de um estudo. Uma variável deve atender a duas condi- ções para ser um fator de confusão: Deve ser correlacionada com a variável independen- te. Pode ser uma relação causal, mas não precisa ser. • Um fator de confusão: uma variável que pode esconder uma associação genuína entre fatores, pode confundir as conclusões do experimento. Por exemplo, pode ser difícil dizer se um resultado melhor depende da ferramenta ou da experiência do usuário da ferramenta. Experimentos Controlados em Engenharia de Software Precisamos para nos aprofundar um pouco mais nesse tema entender mais adequa- damente os fatores de confusão. Veja o exemplo na Figura abaixo: Teste de Perfomance Grupo de Controle 20 Devs JAVA 20 Devs PYTHON Grupo Experimental Figura 4 – Exemplo de um experimento totalmente confuso Como diferentes linguagens foram utilizadas em cada grupo, há uma terceira variável que confunde o experimento e torna impossível atribuir causalidade. 18 19 Como regra geral, quando você está projetando um experimento, você quer ter um grupo experimental e um grupo de controle. Esses dois grupos devem ser idênticos, exceto que o grupo experimental deve receber algum formulário ou tratamento, o que chamamos de fator experimental ou variável experimental, enquanto o outro não deve receber nada. Em outras palavras, os dois grupos devem ser totalmente idênticos, exceto para a variável experimental. Quando essa condição é atendida, você pode então inferir que as diferenças entre os dois grupos estão sendo causadas pela variável experimental. Em outras palavras, se os dois grupos são completamente e totalmente idênticos em todos os sentidos, exceto para variável experimental, então quaisquer diferenças na sua variável de resposta, sua variável dependente ou seja, a coisa que você está medindo deve estar sendo causada pela variável experimental, porque é a única coisa que difere entre os dois grupos. Mas você também pode ter vários grupos experimentais testando coisas diferentes simultaneamente, mas seria aumentar a complexidade a toa, portanto focaremos nesses dois grupos. O problema é que, na realidade, ter dois grupos idênticos quase nunca é possível. É aí que entra o tema dos fatores de confusão. Lembre-se: Um fator de confusão é simplesmente uma terceira variável que pode ter um efeito causal, impedindo assim que você seja capaz de atribuir causalidade. Então em nosso exemplo logo acima, por causa de usar um grupo com JAVA e ou- tro com PYTHON, teremos problemas certo?! Vê como isso funciona? Por causa dessa terceira variável (por exemplo em nosso grupo de controle, ou seja, JAVA), não há como atribuir com confiança a causalidade. Afinal não saberemos se Python performa melhor porque é uma linguagem relativamente mais nova ou se porque JAVA é muito formal, ou porque os Devs não foram bem escolhidos, veja quantas portas abertas para saírem “es- queletos”. Ao menos os dois grupos deveriam utilizar a mesma linguagem, por exemplo. Esse é obviamente um exemplo extremo, mas esse tipo de coisa acontece o tempo todo em experimentos reais, e pode ocorrer de maneiras muito sutis. E mesmo que algo sutil mesmo, faça o pesquisador relevar ou ficar mais confiante do que devia, realmente pode fazer grandes diferenças em seus resultados, e quando você tem um experimento totalmente confuso como esse que usei para exemplificar, você simplesmente não pode atribuir causalidade. E aí... já era. Então, como os engenheiros de software realmente lidam com isso? Afinal, fatores de confusão estão por toda parte, e ter dois grupos totalmente idênticos é virtualmente impossível. Felizmente, existem várias estratégias importantes para lidar com elas: elimi- nando, randomizando, bloqueando e medindo. Bom, seguindo o nosso exemplo lá em cima sobre performance entre JAVA e PYTHON, o negócio é o seguinte para eliminar fatores de confusão; poderíamos usar apenas uma linguagem para ambos os grupos, isso já retira a linguagem como fator de 19 UNIDADE Processos de Condução de Estudos Experimentais confusão. Mas não é o suficiente, gostaríamos de controlar a versão da linguagem que utilizaremos, qual o Sistema Operacional que utilizaremos e para qual versão, indo mais longe, que computadores, de qual marca, qual processador, com quais especificações, se usamos rede local, qual o cabeamento, quais os switchs e routers, quais as distâncias entre os pontos e o switch ou hub, a rede elétrica é estabilizada, há ruídos, o ambiente tem luz adequada, condicionamento de ar, há conforto ergonômico, e por ai vai. Parece absurdo, muito pelo contrário, basicamente, a ideia é que se você pode remo- ver uma variável do seu experimento, então você deve fazê-lo. Lembre-se, idealmente você quer que seus grupos sejam totalmente, 100% idênticos. Então, para fazer isso, você precisa eliminar o máximo de fatores de confusão que puder. Então, mesmo depois de controlar todos os fatores de confusão que você pode pen- sar, quase certamente ainda haverá alguma pequena variação que você não está ciente. Por exemplo, pode haver pequenas inconsistências nas habilidades de codificação dos Devs do experimento, mesmo que todos sejam Sêniores com 30 anos de experiência comprovada etc. Como você não sabe quais são essas diferenças, você não pode elimi- ná-las, mas pode compensá-las aleatoriamente. Fazendo o que? Selecionando aleatoriamente quais vão para cada grupo. Assim, qualquer variação é dispersada aleatoriamente em seus dois grupos, em vez de cair desproporcionalmente em um grupo. Esta é uma ferramenta extremamente poderosa e importante que deve ser usada sempre que possível. Em qualquer experimento, você deve randomizar com- pletamente sempre que possível. Métodos Estatísticos e Análise de Dados em Engenharia de Software Experimental Bem vamos para o próximo passo, lembremos que o objetivo de um estudo expe- rimental é coletar dados em um ambiente controlado, a fim de confirmar ou descartar a hipótese. A hipótese refere-se a uma teoria que busca explicar um certo comporta- mento de interesse, para a pesquisa, e leva à definição de variáveis independentes ou dependentes. As variáveis independentes representam
Compartilhar