quarta-feira, 8 de janeiro de 2014

Métricas - Linhas Gerais

Toda ciência busca obter dados confiáveis sobre seu objeto de estudo, convencionou-se ao longo da história que dados ditos como “confiáveis” são aqueles que podem ser matematicamente demonstrados, permitindo assim análises e comparações a seu respeito. “Nenhuma investigação humana pode realmente ser chamada ciência se não poder ser demonstrada matematicamente” (DA VINCI apud KOSCIANSKI; SOARES, 2006, p. 26). As medições auxiliam na quantificação dos dados coletados para que estes sirvam como informações úteis aos pesquisadores.

 Uma definição técnica sobre medição é dada como sendo o “uso de uma métrica para se obter um valor (o qual pode ser numérico ou categoria), obtido através de uma escala, a um atributo de uma entidade” (NBR ISO/IEC 9126-1). Portanto, sabendo que a medição é o ato de se usar uma determinada métrica e que as medições propiciam dados que servem como base para as investigações humanas, cabe ainda definir o termo métrica. As métricas são utilizadas em diversos aspectos da vida humana, desde a contagem do tempo até a construção de moradias. Sua definição é moldada de acordo com o contexto em que esta está inserida, em matemática a métrica é o conceito que generaliza a ideia geométrica de distância. No contexto de qualidade de software a norma NBR ISO/IEC 9126-1 define métrica como um método de escala e medição definidos, incluindo métodos para categorização de dados qualitativos, podendo ser internas ou externas, e diretas ou indiretas. 

Convencionou-se o uso de diferentes métricas ao longo da história, muitas delas eram adotadas de forma arbitrária, por exemplo, como no caso de medidas de comprimento que eram definidas através da medida de partes do corpo dos reis de cada país. Essa adoção de  11métricas de forma arbitrária causava problemas relativos a falta de padronização. Devido a essas discrepâncias entre as métricas utilizadas, percebeu-se a necessidade de um padrão que pudesse servir como uma base comum para as medições. Alguns sistemas métricos foram estabelecidos ao longo da história, dentre eles destacam-se: O Sistema Imperial (Imperial System) e o Sistema Métrico Decimal. 

O Sistema Imperial é uma coleção de unidades métricas que segundo a Wikipedia foi primeiramente definido na Grã-Bretanha em um ato sobre pesos e medidas em 1824. As unidades foram introduzidas no Reino Unido e suas colônias e estão vigentes ainda hoje juntamente com o Sistema Métrico Decimal. O Sistema Imperial define dentre muitas medidas, por exemplo, a milha que corresponde a 1609.344 metros e o pé que corresponde a 30.48 centímetros. O Sistema Métrico Decimal foi instituído no final do século XVIII (WIKIPEDIA) tendo sua primeira adoção oficial sido realizada na França no ano de 1791 após a Revolução Francesa. Esse sistema tinha como objetivos ser um sistema de uso universal e estabelecer uma base comum de padrões de métricas. Ele oficializou toda a base métrica decimal utilizada até os dias de hoje tais como, por exemplo, o centímetro e o metro, servindo ainda como base para o sistema de kilograma e de contagem de tempo que foram extensões do sistema métrico decimal. 
Atualmente o Sistema Internacional de Unidades (SI) é, segundo dados do Bureau International des Poids et Mesures (BIPM2), o sistema de medições mais adotado no mundo. Ele é um sistema que evoluiu do Sistema Métrico Decimal que teve algumas unidades adicionadas em 1971 tais como o grama e o kilograma. O SI segundo a Wikipedia é um conjunto de definições que visa uniformizar as medições e é utilizado como um guia onde diversas unidades métricas podem ser consultadas. Portanto os sistemas métricos estabeleceram uma base comum para a análise, controle e comparação de dados quantitativos coletados através das medições.

 A administração de projetos, as pesquisas científicas, a engenharia e a indústria em geral são alguns dos setores que utilizam e desenvolvem os sistemas métricos. A Engenharia de Software faz o uso de métricas para o desenvolvimento, administração e avaliação de seus projetos e produtos de  software. 

Métricas de Software para processos



Devido a importância dos processos no ciclo de vida do software bem como, sua forte relação com a qualidade final do produto, foram desenvolvidas ao longo do tempo métricas que auxiliam no gerenciamento e controle dos processos de software. Uma definição para métricas de processos é dada por Kan (1995, p. 83) como sendo métricas que podem ser usadas para auxiliar no desenvolvimento e manutenção dos processos de software.
As métricas segundo Pressman (2002, p. 506) conduzidas durante os primeiros estágios do processo de software fornecem aos engenheiros de software um mecanismo consistente e objetivo para avaliar a qualidade do software em desenvolvimento. 
Na visão de Sommerville (2003, p. 477) a melhoria de processo é uma prática iterativa e de longo prazo e que deve ser apoiada através de métricas de processos que auxiliem os gerentes fornecendo dados quantitativos que demonstrem as variações existentes nas características de um processo para que o mesmo possa ser aperfeiçoado. Sommerville (2003, p. 477) ainda lista algumas dessas características dos processos de software como pode-se observar a seguir: 
  • Facilidade de compreensão: Até que ponto o processo está explicitamente definido e com que facilidade se pode compreender a definição do processo? 
  • Visibilidade: As atividades de processos culminam em resultados nítidos, de modo que o progresso do processo seja externamente visível? 
  • Facilidade de suporte: Até que ponto as atividades do processo podem ser apoiados por ferramentas CASE
  • Aceitabilidade: O processo definido é aceitável e utilizável pelos engenheiros responsáveis pela produção do produto de software? 
  • Confiabilidade: O processo está projetado de tal maneira que seus erros sejam evitados ou identificados antes que resultem em erros no produto? 
  • Robustez: O processo pode continuar, mesmo que surjam problemas inesperados? 
  • Facilidade de manutenção: O processo pode evoluir para refletir os requisitos mutáveis da organização ou melhorias de processos identificadas? 
  • Rapidez: Com que rapidez pode ser concluído o processo de entrega de um sistema, a partir de uma determinada especificação? 


As métricas de processo podem demonstrar através de dados quantitativos aos gerentes valores correspondentes a algumas das questões que se deseja saber através das características listadas a cima apoiando assim suas decisões com dados quantitativos que podem auxiliar no melhoramento dos processos de software. Existem ainda segundo Sommerville (2003, p. 484) três classes de métricas de processos que podem ser coletadas: 

  • O tempo gasto para um processo em particular: Esse pode ser o tempo total dedicado ao processo, o ‘tempo de calendário’, o tempo gasto no processo por engenheiros individuais, etc. 
  • Os recursos requeridos para um processo em particular: Os recursos podem ser o esforço total calculado em pessoa-dia, os custos relacionados a equipamentos de hardware bem como, custos de viagens etc. 
  • O número de ocorrências de um evento em particular: Exemplos de eventos que podem ser monitorados são o número de defeitos descobertos durante a inspeção de código, o número de mudanças nos requisitos que foram solicitados, o número médio de linhas de código modificadas em resposta a uma mudança nos requisitos é um exemplo dessa classe de métrica a ser coletada. 



Essas categorias de medições de processo podem ser utilizadas para descobrir se houve mudanças relativas a eficiência de um processo e ainda mudanças que influenciam na qualidade do software. 

O objetivo das métricas classificadas como métricas de processos, portanto, é auxiliar no controle, gerenciamento e evolução dos processos de software através de dados quantitativos possibilitando um nível de qualidade mensurável.

quarta-feira, 23 de outubro de 2013

Testes de Usabilidade

E aí galera, tudo tranquilo?
Fiquei um bom tempo sem publicar nada, só escrevendo posts pela metade. Mas, agora, juro! Prometo finalizar todos! Aguardem que vem coisa boa por aí.

Então, decidi pesquisar e compartilhar com vocês alguma coisa sobre teste de usabilidade após constatar que apesar de sua importância, acredito que este é o tipo de teste mais deixado de lado, ao menos em empresas de pequeno e médio porte. Há custos sim, de fato exige em alguns tipos, contato com usuário, ambiente controlado e outras variáveis..... tudo isto igual a um custo.... mas...

Bom, vamos começar do começo! 

Interação Humano-Computador

Esta é uma área de pesquisa multidisciplinar,  a IHC  envolve áreas da ciência da computação, do design, da ergonomia, da linguística, da semiótica, da psicologia, da sociologia e antropologia. O principal objetivo da IHC é "fornecer aos pesquisadores e desenvolvedores de sistemas explicações e previsões para fenômenos de interação usuário-sistema e resultados práticos para o design da interface de usuário. [ACM SIGCHI, 1992]

Dentro deste contexto, temos como critérios de qualidade de uso questões de usabilidade, acessibilidade e comunicabilidade.   Portanto, a prioridade dos critérios de qualidade de uso deve ser definida com base no conhecimento sobre os usuários (limitações, necessidades, motivações, etc.), suas atividades e objetivos, e contextos de uso. [Barbosa & da Silva, 2010]. Entretanto, o que acontece dentro de grande parte dos projetos, o que de fato define os critérios de qualidade de uso é o orçamento.

 É com base nestes três critérios apresentados que vou sugerir alguns tipos de avaliações de interação, vou somente pincelar sobre o tema e no fim deixarei a disposição alguns materiais muito bons que encontrei. Vamos lá!


Usabilidade


A usabilidade  é relacionada com a facilidade de aprendizado e uso da interface, bem como a satisfação do usuário em decorrência desse uso. [Nielsen, 1993]. Usabilidade refere-se à capacidade de uma aplicação ser compreendida, aprendida, utilizada e atrativa para o usuário, em condições específicas de utilização. (ISO/IEC 9126).

Possui como fatores relacionados a questão da facilidade de aprendizado, a facilidade de uso ou de memorização/recordação, eficiência de uso e produtividade, a flexibilidade, a segurança no uso (recuperação de erros),  e é claro, a satisfação do usuário.

A norma internacional ISO 9241-11 define usabilidade como sendo um conceito que descreve até que ponto um sistema computacional pode ser usado pelos utilizadores de forma a atingir objetivos específicos como eficácia, eficiência e satisfação num dado contexto. A eficácia permite que o utilizador atinja os objetivos iniciais de interação, e é avaliada em termos de cumprimento de uma tarefa como também em termos de qualidade do resultado obtido. A eficiência refere-se à quantidade de esforço e recursos necessários para se chegar a um determinado objectivo. Os desvios que o utilizador faz durante a interação e a quantidade de erros cometidos podem servir para avaliar o nível de eficiência do sistema. A terceira medida de usabilidade, a satisfação, é a mais difícil de medir e quantificar pois está relacionada com fatores subjetivos. De uma maneira geral, satisfação refere-se ao nível de conforto que o utilizador sente ao utilizar a interface.  A usabilidade de um sistema é um conceito que se refere à qualidade da interação de sistemas com os usuários e depende de vários aspectos. Alguns destes fatores são:

  • facilidade de aprendizado do sistema: tempo e esforço necessários para que os usuários atinjam um determinado nível de desempenho;
  • facilidade de uso: avalia o esforço físico e cognitivo do usuário durante o processo de interação, medindo a velocidade de e o número de erros cometidos durante a execução de uma determinada tarefa;
  • satisfação do usuário: avalia se o usuário gosta e sente prazer em trabalhar com este sistema;
  • flexibilidade: avalia a possibilidade de o usuário acrescentar e modificar as funções e o ambiente iniciais do sistema. Assim, este fator mede também a capacidade do usuário utilizar o sistema de maneira inteligente e criativa, realizando novas tarefas que não estavam previstas pelos desenvolvedores;
  • produtividade: se o uso do sistema permite ao usuário ser mais produtivo do que seria se não o utilizasse.


Comunicabilidade

Diz respeito à capacidade da interface de comunicar ao usuário a lógica do design/as intenções do designer.
A lógica do design deve refletir as decisões sobre: [de Souza et al., 1999(b)]
  • A quem se destina o sistema?
  • Para que serve?
  • Qual é a vantagem de utilizá-lo?
  • Como funciona?
  • Quais são os princípios gerais de interação com o sistema?

É uma propriedade que bons sistemas interativos devem ter de comunicar com clareza sua lógica de design, ou seja, para que servem, como funcionam, quem são seus usuários visados, etc. Tem por objetivo avaliar a qualidade da (meta)comunicação* entre o designer e os usuários de um sistema computacional, apontando explicando as soluções que não deram certo, sugerindo e justificando soluções que podem dar mais certo.

Este critério acredito eu que seja o que mais exige empenho e estudo para poder aplicá-lo. Ele foge um pouco da minha área de domínio. Deixo ao final do post mais materiais sobre, é para os fortes!


Acessibilidade

Relacionado à remoção de barreiras que impedem mais usuários de serem capazes de acessar a interface do sistema e interagir com ele. [Barbosa & da Silva, 2010].

Ao projetar um sistema devemos ter em mente situações e características que o usuário pode apresentar, como:
  • Ser incapaz de ouvir ou se deslocar
  • Ter dificuldade em ler textos
  • Não ter teclado ou mouse, ou ser incapaz de utilizá-los
  • Possuir tela que apresenta apenas texto ou com dimensões reduzidas
  • Estar com olhos, mãos ou ouvidos ocupados (ambiente barulhento, a caminho do trabalho)
  • Possuir um navegador desatualizado

 As idéias de acessibilidade vão um pouco além das idéias de usabilidade, visto que elas se preocupam não apenas com uma boa interface e uma navegação intuitiva, mas também em prover os meios para que indivíduos portadores de algum tipo de necessidade especial (visual, auditiva, cognitiva, neurológica e física) possam usufruir os recursos da maneira mais natural possível. A partir da evolução computacional da web e da preocupação em torná-la mais acessível, surge o termo “acessibilidade digital”, que representa o processo de disponibilização de conteúdos da web para o maior grupo de pessoas possível, incluindo os portadores de necessidades especiais, em termos de interface entre o conteúdo e o usuário. [FREITAS]


Avaliação em IHC

É uma etapa essencial em qualquer processo de desenvolvimento que busque produzir um sistema interativo com alta qualidade de uso. Mas para isto, existem algumas questões que devemos ter em mente:
  • Para que avaliar?
  • O que avaliar?
  • Quem avalia o quê?
  • Quando avaliar o uso de um sistema?
  • Onde avaliar?
  • Como coletar dados?
  • O que coletar?
  • Como avaliar?
[Preece et al., 1994; Barbosa & da Silva, 2010]

Os objetivos de uma avaliação de IHC precisam ser detalhados em perguntas específicas para torná-los operacionais, perguntas que considerem o usuário-alvo, as atividades, o contexto de uso. Abaixo, é apresentado uma meio para determinar que tipo de avaliação em um projeto será necessária de ser aplicada.

DECIDE
Guia para planejamento de uma avaliação
  • Determinar as metas que a avaliação irá abordar.
  • Explorar as questões específicas a serem respondidas.
  • Escolher (Choose) o paradigma e as técnicas de 
  • avaliação que responderão as perguntas.
  • Identificar as questões práticas que devem ser 
  • tratadas (como a seleção dos participantes).
  • Decidir como lidar com questões éticas.
  • Avaliar (Evaluate), interpretar e apresentar os dados.
[Preece et al, 2002]

Após trabalhadas estas questões podemos escolher qual a avaliação ou avaliações mais adequadas e de fato, possíveis, de serem aplicadas em nosso projeto. Falarei a seguir de algumas das avaliações existentes:

  1. Avaliação por Inspeção

A avaliação por inspeção permite examinar (inspecionar) uma solução de IHC para tentar antever as possíveis consequências de certas decisões de design. Servindo para identificar problemas que os usuários possam vir a ter quando interagirem com o sistema, identificando quais formas de apoio o sistema oferece para ajudá-los a contornar esses problemas. [Mack & Nielsen, 1994].  Objetivo principal é gerar uma lista dos problemas de usabilidade da interface, sendo um método fundamentado em dados empíricos. A avaliação heurística é um exemplo de avaliação por inspeção.

1. 2. Avaliação heurística

A avaliação heurística é um método de avaliação de IHC criado para encontrar problemas de usabilidade durante um processo de design iterativo (Nielsen e Molich, 1990; Nielsen, 1993; Nielsen, 1994a). Esse método de avaliação orienta os avaliadores a inspecionar sistematicamente a interface em busca de problemas que prejudiquem a usabilidade. Por ser um método de inspeção, a avaliação heurística foi proposta como uma alternativa de avaliação rápida e de baixo custo, quando comparada a métodos empíricos (Barbosa e Silva, 2010). A avaliação heurística tem como base um conjunto de diretrizes de usabilidade, que descrevem características desejáveis da interação e da interface, chamadas por Nielsen de heurísticas. Essas heurísticas resultam da análise de mais de 240 problemas de usabilidade realizada ao longo de vários anos por experientes especialistas em IHC (Nielsen, 1994b). Nielsen (1993) descreve um conjunto inicial de dez regras heurísticas a serem utilizadas em seu método de avaliação heurística (p. 30):

1. Visibilidade do estado do sistema: o sistema deve sempre manter os usuários informados sobre o que está acontecendo através de feedback (resposta às ações do usuário) adequado e no tempo certo;

2. Correspondência entre o sistema e o mundo real: o sistema deve utilizar palavras, expressões e conceitos que são familiares aos usuários, em vez de utilizar termos orientados ao sistema ou jargão dos desenvolvedores. O designer deve seguir as convenções do mundo real, fazendo com que a informação apareça em uma ordem natural e lógica, conforme esperado pelos usuários;

3. Controle e liberdade do usuário: os usuários frequentemente realizam ações equivocadas no sistema e precisam de uma “saída de emergência” claramente marcada para sair do estado indesejado sem ter de percorrer um diálogo extenso. A interface deve permitir que o usuário desfaça e refaça suas ações;

4. Consistência e padronização: os usuários não devem ter de se perguntar se palavras, situações ou ações diferentes significam a mesma coisa. O designer deve seguir as convenções da plataforma ou do ambiente computacional;

5. Reconhecimento em vez de memorização: o designer deve tornar os objetos, as ações e opções visíveis. O usuário não deve ter de se lembrar para que serve um elemento de interface cujo símbolo não é reconhecido diretamente; nem deve ter de se lembrar de informação de uma parte da aplicação quando tiver passado para uma outra parte dela. As instruções de uso do sistema devem estar visíveis ou facilmente acessíveis sempre que necessário;

6. Flexibilidade e eficiência de uso: aceleradores - imperceptíveis aos usuários novatos - podem tornar a interação do usuário mais rápida e eficiente, permitindo que o sistema consiga servir igualmente bem os usuários experientes e inexperientes. Exemplos de aceleradores são botões de comando em barras de ferramentas ou teclas de atalho para acionar itens de menu ou botões de comando. Além disso, o designer pode oferecer mecanismos para os usuários customizarem ações frequentes;

7. Projeto estético e minimalista: a interface não deve conter informação que seja irrelevante ou raramente necessária. Cada unidade extra de informação em uma interface reduz sua visibilidade relativa, pois compete com as de- mais unidades de informação pela atenção do usuário;

8. Prevenção de erros: melhor do que uma boa mensagem de erro é um projeto cuidadoso que evite que um problema ocorra, caso isso seja possível;

9. Ajude os usuários a reconhecerem, diagnosticarem e se recuperarem de erros: as mensagens de erro devem ser expressas em linguagem simples, indicar precisamente o problema e sugerir uma solução de forma construtiva;

10. Ajuda e documentação: embora seja melhor que um sistema possa ser utilizado sem documentação, é necessário oferecer ajuda e documentação de alta qualidade. Tais informações devem ser facilmente encontradas e focadas na tarefa do usuário.

Aqui vocês encontram passo a passo, bem explicadinho em como aplicar esta avaliação: http://homepages.dcc.ufmg.br/~rprates/ihc/aula8_aval_InspUsab.pdf


2. Avaliação de Acessibilidade

Uma das técnicas para um teste de acessibilidade, pode ser realizada pela navegação pelo teclado, verificando a acessibilidade da aplicação quando utilizamos apenas o teclado para navegar e utilizar os recursos operacionais da aplicação a ser testada. 

Para verificarmos a acessibilidade do sistema para usuários com problemas visuais podemos fazer uso de leitores de tela. Desta forma, podemos avaliar e mensurar o grau de facilidade de utilização do sistema desenvolvido para este público específico. Alguns leitores de tela: Narrator, DosVox, Virtual Vision e Jaws. Para isto, é claro, que o sistema deve ter sido desenvolvido sob ao menos, algumas recomendações do W3School, como : fornecer alternativas equivalentes ao conteúdo sonoro e visual; não recorrer apenas à cor; indicar claramente qual o idioma utilizado; rojetar páginas considerando a independência de dispositivos e assegurar a clareza e a simplicidade dos documentos.

O uso de high contrast, pode ser uma opção para verificação de um sistema que facilite a utilização de usuários com dificuldades visuais, já que fora este desenhado para pessoas com problemas de visão. Esquemas de alto contraste podem fazer com que a tela se torne mais simples de ser lida para alguns usuários oferecendo alternativas de combinações de cores. Alguns desses esquemas mudam também o tamanho da fonte. 

Um bom material sobre este tipo de avaliação: http://www.acessibilidadelegal.com/13-validacao.php

3. Avaliação no ambiente do usuário

Os estudos de campo utilizam métodos de pesquisa adaptados da antropologia e de ciências sociais [RAC12]. São úteis por ajudarem pesquisadores a coletar dados mais naturalistas sobre o que os usuários realmente fazem em seu próprio ambiente de trabalho [WIX02].Os usuários finais são observados em seu próprio ambiente de uso enquanto desempenham suas atividades [BAR10]. E tem por objetivo:
  • entender o comportamento natural do usuário final no contexto do seu próprio ambiente de atuação;
  • determinar requisitos de projeto;
  • descobrir como uma tecnologia é de fato usada;
  • identificar novas funcionalidades e produtos;
  • identificar uma falta de correspondência entre a forma como o usuário trabalha e pensa e a forma como as ferramentas e os procedimentos lhes obrigam a trabalhar;
Podemos usar técnicas como:
  • Observação: o avaliador pode atuar como um participante a fim de aprender o que os usuários fazem e porque o fazem.
  • Questionários: semelhantes às entrevistas mas menos flexíveis. Atinge um grande número de pessoas de forma rápida e fácil.
  • Entrevistas Individuais: usadas para estudar como os usuários usam um sistema e quais as características que eles gostam ou desgostam.
  • Entrevistas em Grupo: traz a possibilidade de observar vários sujeitos ao mesmo tempo e observar as interações entre o grupo.
Sempre é bom ter em mente  que para que os usuários não se comportem de forma diferente é importante que [BAR10]:
  • o avaliador peça aos participantes que o considerem como um aprendiz e lhe ensinem sobre o seu trabalho, sem omitir etapas;
  • se realize o estudo durante um longo período de tempo, para que os participantes se acostumem com a presença do observador e voltem a se comportar normalmente.

4. Thinking Aloud

Protocolo Thinking Aloud, é um  Protocolo verbal que consiste em observar o usuário utilizar uma interface enquanto “pensa em voz alta” (falando o que está pensando a cada momento). O foco é no problema do usuário e permite que o observador correlacione ações e comentários do participante, portanto é útil quando do surgimento de um problema específico. O método não é exclusivo de IHC. Pode ser realizado de forma informal e existem diversos meio de gravar a execução deste protocolo. Tem como vantagem a rapidez de aplicação, o feedback de qualidade, informações de diferentes ordens (ação e intenção) e a interação direta observador-usuário permitindo ajustes. 

Aplicada em cenários distintos:
  • Observador define tarefas específicas ao usuário: permite maior concentração na realização da tarefa
  • Open-ended, sem tarefa específica – usuário livre para escolher sua tarefa: permite que o observador se concentre em problemas que ocorrem naturalmente.
Sempre em que se aplicar este protocolo, ao início da realização deste deve-se esclarecer que:

• A interface que está sendo testada, não o usuário
• O usuário deve comentar livremente todas as suas ações, intenções, ideias e impressões
• O usuário está por conta própria. Isso envolve esclarecer que o experimentador não poderá ajudar
• Quaisquer ajuda ao usuário deve ser planejada, pensada e registrada como parte do experimento

A tarefa principal do observador é anotar o que acontece, este momento também deve ser gravado. As anotações podem ser feitas através de formulários estruturados que incluemcategorização e prompts, sendo isto útil  para criar material de análise posterior. Abaixo, seguem alguns exemplos de questões:
  • O que você está pensando?
  • Porque você fez isso?
  • O que você vai fazer agora?
  • O que você faria se eu não estivesse aqui?



5. Teste de Usabilidade

 Testes de Usabilidade envolvem a coleta de dados utilizando uma combinação de métodos em um ambiente controlado (Rogers, 2013). O teste de usabilidade é um processo no qual participantes representativos avaliam o grau que um produto se encontra em relação a critérios específicos de usabilidade (RUB, 1994).
Serve para medir o desempenho (Rubin,1994), pode-se contabilizar: [Métricas]:
  • O tempo para completar cada tarefa;[tempo de execução]
  • O número e o percentual de tarefas completadas corretamente; [número de erros e acertos]
  • O tempo gasto para ler determinada seção; [taxa de finalização da tarefa]
  • Os ícones selecionados incorretos,  
  • As visitas ao índice, à tabela de conteúdos;
  • Os “comentários negativos ”[satisfação subjetiva]
O principal objetivo dos testes de usabilidade é verificar se uma interface é usável pelos usuários alvos para realizar as tarefas que foi projetada recebendo feedback sobre o design,avaliando a situação e comparandocom a concorrência. Os testes de usabilidade devem ser feitos ao longo do processo de desenvolvimento, mesmo durantea fase de concepção da interface. [Rubin,1994]. Para realização deste tipo de teste pode-se utilizar os seguintes recursos:
  •  Gravações em vídeo;
  •  Registros de Logs das interações com o software;
  •  Questionários de satisfação do usuário.
  •  Entrevistas para obter opiniões
  •  Observação Local para coleta de evidências de como esta sendo utilizado o produto, etc...
Uma possível estrutura para o teste se usabilidade poderia ser: 

• Exploração livre : Utilização aberta, sem rotina pré-estabelecida
• Orientado a tarefas: Utilização do sistema guiado por uma sequência de passos (tarefas)
• Investigativo : Define-se um objetivo mensurável para inferir algo sobre esse
• Codescoberta:  Realizado em dupla/grupo


Considerações

Tentei dar uma pincelada nos conceitos mais básicos e iniciar um pouquinho de tudo o que pude para despertar a curiosidade sobre este tema em vocês. Existem outros diversos meios de inspeção, verificação e testes nesta área, como por exemplo: inspeção semiótica, prototipação em papel, percurso cognitivo, ergolist e muitos outros e, é claro, que existem profissionais extremamente qualificados para a aplicação destas técnicas, como nossos amigos UX (users experience specialists, designers de interfaces). Entretanto, nós profissionais da área de qualidade e testes de software devemos sim, estar por dentro de tudo aquilo que venha a nos tornar mais aptos, que nos provenha uma perspectiva maior e mais criteriosa para o desempenho de nossa função.  Espero que tenha sido proveitoso. 

Até a próxima!

Outros Materiais:

Comunicabilidade:
Não é propaganda, mas já fiz cursos da Qualister e gostei muito!  http://www.qualister.com.br/avaliacao-teste-usabilidade-teste-de-software

Acessibilidade:

Usabilidade
Visualizar perfil de Laís Berlatto no LinkedIn

sexta-feira, 7 de dezembro de 2012

Behavior Driven Development




Behavior Driven Development (BDD) ou ainda uma tradução livre Desenvolvimento Guiado por Comportamento é uma técnica de desenvolvimento Ágil que encoraja colaboração entre desenvolvedores, setores de qualidade e pessoas não técnicas ou de negócios num projeto de software. Foi originalmente concebido em 2003, por Dan North [1]como uma resposta à TDD, e tem se expandido bastante nos últimos anos (Behavior Driven Development, 2012). No BDD, os testes de aceitação são descritos em linguagens naturais próximas do domínio do negócio usando DSL. Para estes testes de aceitação são usadas DSTL e se estes possuírem formalidade suficiente podem ser interpretados e executados por uma ferramenta especializada (CAETANO, 2012). Os testes descritos em linguagem natural são interpretados por ferramentas especializadas que, por sua vez, exercitam o código/API do sistema para demonstrar se o comportamento foi atendido.
O BDD pode ser visto como uma evolução da técnica de programação TDD [ (AL., 2009), e compartilha com essa técnica a característica principal de se escrever testes antes de escrever a implementação do que está sendo testado, para então desenvolvê-la até que o teste passe. (RIMMER, 2010) mostra que outra forma de se ver o BDD é como uma nova compreensão sobre o processo de TDD que estabelece que o teste não é o ponto central real da técnica, mas sim a descoberta e compreensão, através da definição dos testes, do comportamento que está se querendo obter com um código. O processo de BDD incrementa o TDD de forma a resolver algumas questões em aberto com as seguintes práticas: cada funcionalidade deve ser claramente compreendida por ambas partes (desenvolvedores e clientes), para isso se deve usar uma linguagem para os casos de teste compreensível a ambas partes, uma vez que os casos de teste são na realidade especificações de comportamento; cada funcionalidade deve possuir um valor claro e verificável para o negócio, de modo a priorizar o mais importante e evitar o que pode não vir a ser necessário; deve-se planejar a frente o mínimo possível, escrevendo testes para o menor e mais prioritário subconjunto de funcionalidades possível e o desenvolvendo antes de adicionar mais funcionalidades (AL., 2009).
O foco em BDD é a linguagem e interações usadas no processo de desenvolvimento de software. O BDD propicia o uso da língua nativa, a linguagem natural, em combinação com a linguagem ubíqua (usada no processo de desenvolvimento de software) permitindo que os desenvolvedores foquem em por que o código deve ser criado, ao invés de detalhes técnicos minimizando assim, traduções entre linguagem técnica na qual o código é escrito e outras linguagens de domínio, usuários, clientes, gerência do projeto, etc. (NORTH, 2006).

As práticas de BDD incluem:
       Envolver as partes interessadas no processo através de Outside-in Development (Desenvolvimento de Fora pra Dentro)
       Usar exemplos para descrever o comportamento de uma aplicação ou unidades de código
       Automatizar os exemplos para prover um feedback rápido e testes de regressão
   Usar deve (should em inglês) na hora de descrever o comportamento de software para ajudar esclarecer responsabilidades e permitir que funcionalidades do software sejam questionadas
     Usar dublês de teste [2](mocks, stubs, fakes, dummies, spies) para auxiliar na colaboração entre módulos e códigos que ainda não foram escritos


BDD é guiado pelos valores de negócios; que é o benefício trazido para o negócio no qual a aplicação está sendo produzida. A única maneira na qual o benefício pode ser percebido é através de interfaces de usuário para a aplicação, comumente (mas nem sempre) a interface gráfica de usuário. Da mesma maneira, cada trecho de código, começando com a interface de usuário, pode ser considerado como sendo um cliente de outros módulos de código no qual a interface é utilizada. Cada elemento de código provê algum comportamento, o qual em colaboração com outros elementos provê o comportamento da aplicação. A primeira parte de código de produção que os desenvolvedores que usam BDD implementam é a interface de usuário, pois dessa maneira os desenvolvedores podem se beneficiar com um feedback rápido para saber se a interface está adequada ou não. Através de código, e usando princípios de design e refatoração, desenvolvedores descobrem colaboradores para a interface de usuário, e posteriormente para cada unidade de código. Isso os ajuda a aderirem o princípio de YAGNI, desde que cada trecho de código de produção é requerido pelos negócios ou por outro trecho de código já escrito (Behavior Driven Development, 2012).
Devido ao impacto da aplicação de BDD no projeto como um todo ele se tornou uma metodologia ágil de segunda geração. (Primeira geração, Scrum, XP. Segunda geração BDD). Segundo (CHELIMSKY, ASTELS, et al., 2010) o desenvolvimento guiado por comportamento se baseia em três princípios básicos:

       O bastante é o bastante: Planejamento antecipado, análise, e design são atividades que possuem um retorno decrescente. Não deve-se fazer menos do que o necessário para iniciar o projeto, porém, mais do que isso é desperdício de esforço. Isso também se aplica à automação do processo. Ter um processo de implantação do sistema e testes automatizados é importante, mas deve-se evitar automatizar tudo.
       Entregar valor aos stakeholders: Se uma atividade não está entregando valor ou melhorando a capacidade de entregar valor, então não se deve executá-la e deve-se focar em outra atividade.
       Tudo é comportamento: Não importa se ao nível de código, à nível de aplicação, ou além, pode-se utilizar o mesmo pensamento e construção linguística para quaisquer níveis de granularidade.


Defensores de BDD alegam que o uso de "deve" (should) e "garantirQue" (ensureThat) em exemplos de BDD incentivam os desenvolvedores a questionarem se as responsabilidade que eles estão atribuindo aos seus objetos são apropriados, ou se elas podem ser delegadas ou movidas inteiramente para outros objetos. Um objeto que é mais simples que o código de colaboração e provê a mesma interface, porém com um comportamento mais previsível, pode ser injetado no código que precisa dele, e os exemplos de comportamento do código podem ser escrito usando estes objetos ao invés da versão de produção.
A palavra-chave para este tipo de técnica é "especificação executável” baseada no comportamento da aplicação. Especificações executáveis ​​têm muito mais chance de não serem abandonas, já escrevê-las, ao contrário de escrever estática não executável e tradicional documentação, torna-se efetivamente parte de todo o processo de desenvolvimento. Executando estas especificações é possível visualizar instantaneamente o que realmente o software em questão faz, enquanto no momento em que se inspeciona o código fonte é revelado somente o que este supostamente deveria realizar. Trazendo á tona um benefício desta prática, gerando para uma equipe praticante uma maior confiança em relação ao trabalho que está sendo desenvolvido


[1] Ativista da causa Ágil. Mais informações em: http://dannorth.net/
[2] Mais informações em: http://martinfowler.com/articles/mocksArentStubs.html

Testes Ágeis




A maioria dos métodos ágeis tenta delimitar e reduzir o risco pelo desenvolvimento do software em curtos períodos, denominados iterações, os quais despendem menos de uma semana de tempo a um máximo de quatro semanas, sendo que cada iteração é como um projeto de software em pequena escala do projeto principal, e inclui em si todas as tarefas necessárias para implantar um mini-incremento de uma nova funcionalidade: planejamento, análise de requisitos, projeto, codificação, teste e documentação (Desenvolvimento ágil de software, 2005). Enquanto em um processo convencional cada iteração não está necessariamente focando em adicionar um conjunto de funcionalidades, um projeto de software com metodologia ágil busca a capacidade de implantar uma versão nova do software ao fim de cada iteração, etapa a qual a equipe responsável reavalia as prioridades do projeto.
Pressman denota a filosofia do método ágil para desenvolvimento de software da seguinte forma:
 “A engenharia de software ágil combina uma filosofia e um conjunto de diretrizes de desenvolvimento. A filosofia encoraja a satisfação do cliente e a entrega incremental do software logo de início; equipes de projeto pequenas, altamente motivadas, métodos informais, produtos de trabalho de engenharia de software mínimos e simplicidade global de desenvolvimento. As diretrizes de desenvolvimento enfatizam a entrega em contraposição à análise e ao projeto (apesar dessas atividades não serem desencorajadas) e a comunicação ativa entre desenvolvedores e clientes” (PRESSMAN, 2002)

Métodos ágeis enfatizam comunicações em tempo real, preferencialmente in loco, em vez de documentação escrita. A maioria dos stakeholders de um grupo ágil deve estar agrupada em uma sala. Isso inclui todos aqueles necessários para terminar o software: no mínimo, os programadores, gerentes e/ou analistas de negócio e seus clientes. Nesta sala devem também se encontrar os testadores e projetistas. Métodos ágeis também enfatizam trabalho no software como uma medida primária de progresso. Combinado com a comunicação face-a-face, métodos ágeis produzem pouca documentação em relação a outros métodos, sendo este um dos pontos que podem ser considerados negativos (Desenvolvimento ágil de software, 2005). É recomendada apenas a produção de documentação que realmente será útil.
Segundo (NADALETE, 2010) em se tratando de desenvolvimento ágil, alguns princípios definidos por meio do Manifesto Ágil são utilizados com o objetivo de nortear a linha de produção, como:

       Indivíduos e interações entre eles mais que processos e ferramentas;
       Software em funcionamento mais que documentação abrangente;
       Colaboração com o cliente mais que negociação de contratos;
       Capacidade de responder a mudanças mais que seguir um plano.

Os mesmos princípios usados para direcionar o desenvolvimento ágil, devem ser considerados quando for aplicado teste ágil, ou seja, testar de forma ágil exige uma forte adaptação na rotina e dinâmica da equipe de teste, em relação ao processo de desenvolvimento adotado, com o objetivo de propiciar um processo relativamente simples e que possa ser executado com grande facilidade e agilidade, cobrindo o maior número de riscos, com um nível de qualidade que seja apreciada e valorizada pelo cliente ou usuário final (NADALETE, 2010).
Afirma (LEAL, 2009) que os requisitos para metodologias de teste para processos ágeis não possuem grande diferenciação em relação processos guiados por planos. O que é diferente é o grau de importância atribuído aos testes em cada um dos processos. Nos processos guiados por planos, existe uma extensa série de artefatos documentais resultantes de uma análise profunda sobre o sistema a ser desenvolvido. Sendo assim testes são utilizados nesse caso apenas como mais um artefato produzido pelo processo visando garantir a detecção de erros antes da liberação da versão final
Segundo análise comparativa realizada por (NETO, 2004) tomando como base os documentos gerados na etapa de testes o RUP orientado para pequenos projetos gera apenas um único documento que é o Modelo de Testes, já a XP gera quatro, que são os Testes de Aceitação, Testes de Dados, Testes de Resultados e Unidades de Testes (KENT, 1999).   Esses quatro documentos gerados na programação extrema são englobados num único documento no Processo Unificado da Rational, fazendo com que este artefato se torne extenso e abrangente, porém sendo tratado como único (KRUCHTEN, 2000)
Reitera (MÁRIO, 2009) que no processo XP antes do desenvolvimento do código, recomenda o processo, que se crie uma bateria de testes unitários para que a história fique satisfeita. Então o foco dos programadores é a satisfação destes testes unitários. Para a codificação o XP, recomenda que esta seja feita em pares, isto garante outros aspectos como qualidade, e rapidez. Os testes unitários são mantidos ao longo das várias iterações e passam a fazer parte de uma bateria de testes de regressão, que não é mais do que todos os testes unitários agrupados para serem testados periodicamente de uma vez em períodos curtos. A ideia é confirmar que nada deixou de funcionar. Os clientes são considerados parte da equipe de desenvolvimento, uma vez que a todo o momento são questionados sobre prioridades e testes de versões.
Ressalta-se que muitos métodos ágeis, como Lean, Scrum e XP recomendam que todas as pessoas de um projeto (programadores, gerentes, equipes de homologação e até mesmo os clientes) trabalhem controlando a qualidade do produto todos os dias e a todo o momento, pois acreditam que prevenir defeitos é mais fácil e barato que identificá-los e corrigi-los. A Programação eXtrema, em particular, recomenda explicitamente testes automatizados para ajudar a garantir a qualidade dos sistemas de software (BERNARDO, 2008). Através da definição do processo ideal e simplificado, onde o teste ágil é suportado, um conjunto de práticas que proporcionem a diminuição do tempo entre o erro e a sua descoberta tende a ser estabelecidos em conjunto com uma sistemática de trabalho que possibilite à área de teste de software ser mais proativa do que reativa.
Analisemos algumas das práticas do processo de teste tradicional aplicados na tentativa de gerenciar o "chaos", ou ao menos evitar culpados (HENDRICKSON, 2006).

       A área de teste de software assumindo a postura de "Último Defensor da Qualidade";
       Restrições no gerenciamento de mudanças;
       Preparação detalhada e planejamento acima de tudo;
       Conjunto de documentação pesado para a terceirização dos esforços de teste;
       Critérios de entrada e saída rigorosos e com aprovações;
       Automatização de testes pesada e com foco nas regressões;
       Tentativas de execução do processo.

Ao se tratar de teste ágil, essas mesmas práticas não se adaptam à dinâmica almejada. Em um ambiente ágil de controle de qualidade devem-se considerar os prazos e as atividades de teste do começo ao fim da iteração (NADALETE, 2010). Ao contrário do teste tradicional, não se espera que uma única equipe se responsabilize pela qualidade final das entregas, mas sim que todas as equipes tenham sua colaboração no controle dessa qualidade, desde o levantamento das necessidades do cliente, até a implantação do produto final gerado.
 Ainda afirma que no teste tradicional, espera-se que os defeitos sejam identificados no último nível, pela equipe de QA, enquanto que ao se aplicar teste ágil, isso é antecipado pela própria equipe de desenvolvimento por meio de práticas como desenvolvimento em pares, integração contínua, pequenas entregas, refatoração constante e padrões de codificação, de técnicas como TDD (Test Driven Development) e ATDD (Acceptance Test Driven Development), e através da automatização dos testes gerados. Ao se trabalhar com testes ágeis, (NADALETE, 2010) observa algumas mudanças de conceito em relação ao modelo tradicional, tais como:

  •     Mudanças são inevitáveis, e com base nisso toda equipe, incluindo os programadores, testadores e clientes, são responsáveis pelo resultado final;
  •          Todos da equipe devem estar acessíveis e se comunicando ativamente através do projeto;
  •          O teste de software se torna mais preventivo, ou seja, programadores testam mais cedo, com mais frequência e agressivamente. Neste ponto a prática de TDD pode e deve ser aplicada;
  •          Toda equipe solicita ativamente feedback das demais;
  •        Testadores e programadores tendem a ser mais proativos (participação direta com o cliente) e técnicos (aplicação de práticas XP e técnicas como TDD e ATDD);
  •          Testadores precisam saber automatizar, com o intuito de manter o ciclo de entregas dos testes sempre no prazo estabelecido e com teste de regressão atualizado. Só não se automatiza o que realmente não pode ser automatizado ou não vale a pena ser automatizado (e.g. Teste de Usabilidade);
  •          Os testes tonam-se uma rotina que nasce e morre junto à iteração planejada.


quinta-feira, 29 de novembro de 2012

Specification By Example


Terminologia e Definição



O termo Specification by Example (Especificação por Exemplos) surgiu segundo seu criador Gojko Adzik (2011) com o intuíto de unificar em um só termo as seguintes técnicas, metodologias e práticas ágeis:



  • Agile acceptance testing
  • Test-Driven Development
  • Acceptance Test-Driven Development
  • Example-Driven Development
  • Story testing
  • Behavior-Driven Development



Segundo Gojko o fato de as mesmas práticas possuírem tantos nomes diferentes reflete o grande número de inovações nesse campo no cenário atual da industria de software. Sobre essas diferentes nomenclaturas Gojko afirma:



Se queremos os usuários finais (stakeholders) mais envolvidos, o que é o principal objetivo dessas práticas, precisamos usar os nomes corretos para as coisas corretas e parar de confundir as pessoas.



O autor decidiu por tanto simplificar essa terminologia na comunidade de software para que as pessoas possam usufruir de seus benefícios sem entrarem em discuções improdutivas sobre terminologias. Specification by Example é o resultado de um conjunto de estudos de caso realizados por Gojko com mais de 50 projetos de desenvolvimento de software do mundo real. Projetos que variam em tecnologia (de websites a softwares para desktop) e em metodologias (Extreme Programing, Scrum, Kanban e outras metodologias normalmente agrupadas sobre os termos agile e lean). Specification by Example pode ser definido como um suplemento de práticas que podem ser incorporadas a qualquer metodologia de desenvolvimento atual.





Necessidade


Construir o produto certo e construir certo o produto são dois objetivos distindos. Porém os dois são necessários para se obter sucesso. Segundo Gojko tradicionalmente, construir o produto certo requeria enormes especificações funcionais, documentação e longos ciclos de teste, atualmente em um mundo de releases semanais isso não funciona. Ainda segundo Gjko é necessário uma solução para:

  • Evitar super-especificações inúteis; Evitar gastar tempo em detalhes que mudarão antes do primeiro fragmento de trabalho ser desenvolvido.
  • Ter documentos legíveis que explicam oque o sistema faz para que se posso modificá-lo facilmente.
  • Checar de maneira eficiente que o sistema faz o que as especificações dizem.
  • Manter a documentação relevante e confiável com o menor custo de manutenção.
  • Colocar tudo isso em processos baseados em iterações, de forma que a informação do trabalho a ser feito é produzida sob demanda.

Specification by Example unificou padrões e processos que times do mundo real utilizaram para atingir esses objetivos.


Padrões de processo

Os padrões estabelecidos por Specification by Example são assim denominados no sentido em que eles são elementos recorrentes usados por diferentes times; São resultados de uma série de experimentos empíricos com projetos e times reais e não de um modelo teórico de elaboração de processos.




Figura 1. Principais padrões de processo de Specification by Example.

1. Deriving scope from goals (Derivando o escopo dos objetivos): Nessa etapa a equipe que criará o software deve derivar os escopos de desenvolvimento a partir dos objetivos estabelecidos pelos stakeholders. Segundo Gojko é um erro esperar que os usuários envolvidos digam qual o escopo de desenvolvimento pois os mesmos não são designers de software. O mais apropriado nessa etapa é elencar os objetivos que os stakeholders querem atingir com o software em questão. Em outras palavras, qual ou quais os problemas que a “solução” deve ser capaz de resolver. Começa-se com um objetivo de negócios o time de desenvolvimento colabora definindo o escopo que vai atingir este objetivo.

2. Specifying collaboratively (Especificando colaborativamente): O time nesse etapa deverá juntamente com os stakeholders especificar colaborativamente o comportamento esperado para cada funcionalidade do escopo. Desenvolvedores, testadores e analista de negócios devem participar nessa etapa pois cada um tem um contexto único e habilidades que podem ajudar a resolver questões que de outra forma poderiam passar desapercebidas gerando re-trabalho no futuro.

3. Illustrating using examples (Ilustrando utilizando exemplos): Ao invés de esperar que as especificações sejam expressadas precisamente em uma linguagem de programação durante a implementação, deve-se ilustrar o comportamento  esperado do sistema utilizando exemplos antes do desenvolvimento ser iniciado. O time de desenvolvimento trabalha com os stakeholders para identificar exemplos-chave que descrevem a funcionalidade esperada. Desenvolvedores e testadores dão exemplos adicionais que revelam áreas antes ignoradas da funcionalidade evitando assim gaps funcionais e faz com que todos tenham um conhecimento distribuído sobre aquilo que precisam entregar.

4. Refining the specification (Refinando a especificação): Nessa etapa o time de desenvolvimento deve remover informações irrelevantes dos exemplos tais como detalhes que tornam os exemplos extensos e verbosos sem adicionar informações úteis. Segundo Gjko deve-se identificar o que o software deve fazer e não detalhar o como fazer. Os resultados dessa etapa podem ser considerados critérios de aceitação, que ao mesmo tempo são especificações para o desenvolvimento e futuramente quando automatizados farão parte dos testes de regressão.

5. Automating validation without changing specifications (Automatizando as validações sem modificar as especificações): Com os exemplos especificados e refinados o time pode usá-los como meio de validar o produto. O sistema será validado diversas vezes durante o desenvolvimento para assegurar que o mesmo atinge os objetivos. Rodar essas validações manualmente introduziria um delay desnecessário e o feedback seria lento. A solução para isto é automatizar as validações, porém essa automação deve também ser acessível aos stakeholders e não deve modificar as especificações originais. O time de desenvolvimento literalmente deve escrever a automação com as mesmas palavras utilizadas para criarem os exemplos, pois scripts e código fonte não têm a capacidadade de contar expressar adequadamente o contexto de negócio em que estão inseridos e documentação puramente textual fica desatualizada rapidamente. Portanto nessa etapa a validação automática do sistema, suas especificações por exemplos e seus critérios de aceitação tornam-se um só. O resultado dessa etapa gera especificações executáveis.  

6. Validating Frequently (Validando frequentemente): Gjko afirma que a documentação tradicional de software fica desatualizada antes mesmo de o sitema ser lançado. A validação frequente é um produto das especificações executáveis ela sincroniza o que foi especificado com o que o sistema realmente está fazendo.

7. Evolving a documentation system (Evolução de um sistema de documentação): Nessa etapa o time de desenvolvimento mantém a documentação viva (especificações executáveis - testes) atualizada com as modificações requisitadas pelos stakeholders para incrementar o software. As especificações e testes estando em um mesmo lugar facilitam essa mudança pois concentram os esforços em apenas uma fonte de informações. Desenvolvedores utilizam essa documentação como especificações, testadores utilizam como testes e os analistas de negócio utilizam para avaliar o impácto que uma mudança ou especificação futura pode ter no sistema.
Os exemplos são tratados como fonte única de verdade, sendo este um aspecto chave desta metodologia. Desta forma, evita que diferentes colaboradores de uma equipe de desenvolvimento gerem e trabalhem somente em seus próprios documentos. Neste contexto, pode-se afirmar que a eficácia da entrega do software é significativamente afetada pela constante necessidade de coordenação e sincronização destas diferentes “versões da verdade”. Fazendo uso de SbE todos os membro da equipe participam da criação da única fonte de verdade, sendo assim nela encontra-se a compreensão de todos. Estes exemplos são utilizados para proporcionar precisão e clareza, para fazer uso desta informação tanto como uma especificação como um teste funcional. Qualquer informação considerada relevante durante o ciclo de desenvolvimento é adicionada a esta fonte de exemplos única, sem requerer qualquer necessidade de tradução ou interpretação.

Documentação Viva

Segundo Gojko a questão da documentação gerada pelo Specification by Example advém parte do ATTD e parte do BDD, ambas com focos diferentes que quando unidas proporcionam uma totalidade na cobertura e profundidades acerca das especificações do sistema. O ATTD detém seu foco na automação dos testes funcionais, de regressão e são alvos mais claros para o desenvolvimento. O ATDD é mais útil para a adoção inicial quando se tem muitos problemas relacionados a qualidade funcional do sistema. Já o BDD centra-se no processo de especificação de cenários por meio do comportamento do sistema, podendo servir como base para fundamentar as atividades de entrega de software, a médio e curto prazo. O BDD centra-se na construção do entendimento comum entre as partes interessadas através da colaboração e esclarecimento de especificações. É necessário saber o que um sistema faz para ser capaz de analisar os impactos das mudanças sugeridas, apoiá-lo, e solucionar problemas. Muitas vezes, a única maneira de descobrir o que o sistema faz é olhar para o código-fonte da linguagem de programação e aplicar engenharia reversa na funcionalidade do negócio. Logo uma boa documentação é útil para além do desenvolvimento de software. 
A solução ideal seria um sistema de documentação que é fácil e barato de manter, de forma que ele possa ser mantido de acordo com a funcionalidade do sistema, mesmo se o código da linguagem de programação subjacente é alterado com frequência. O problema com qualquer tipo de documentação completa é, de fato, o custo de manutenção. Quando um sistema de software é continuamente validado contra um conjunto de especificações executáveis, uma equipe pode estar certa de que o sistema irá fazer o que as especificações dizem, ou, em outras palavras, que as especificações vão continuar a descrever o que o sistema faz. Essas especificações vivem com o sistema, e elas são sempre consistentes, e pelo fato da noção das diferenças entre as especificações e a funcionalidade de fato implementada de forma imediata, esta documentação pode ser mantida consistente a um baixo custo. Estas especificações executáveis ​​criam um corpo robusto de documentação, uma fonte autorizada e não ambígua de informações sobre a funcionalidade de um sistema,fazendo uma analogia, cada uma das especificações seriam como páginas do livro que é o próprio sistema de documentação viva. 
Gojko ainda afirma que a documentação viva substitui todos os artefatos que as equipes precisam para entregar o produto certo, ela pode até mesmo apoiar a produção de manuais de usuários (embora provavelmente não substituí-los). As especificações são definidas conforme e concomitante a evolução do sistema, a documentação resultante é incremental e assim torna-se barata de escrever. Ao mesmo tempo em que os processos de negócio são derivados é possível executá-los exercitando e auxiliando o processo de desenvolvimento do software, já que se trata de algo mais leve e intrinsecamente mais ligado ao código real, é uma documentação real. Aplicar Specification by Example somente pelo fato do ganho por meio dos testes de regressão acaba por não justificar o investimento feito em longo prazo para implementá-lo já que conforme as estimativas dos custos de software, aponta que a eficiência na remoção dos defeitos por meio de testes de regressão é de 23% em média. Esta prática permite a criação de documentação viva sem necessidade de anos de prática pela sua forma mais natural de escrita, criando documentação por meio de especificações executáveis.
Figura 2 Tipo de documentação que deve ser escrita
A documentação viva é tão importante quanto o sistema que se está entregando, a ideia de que a documentação é um produto chave é o cerne deste método. Algumas vantagens em ter uma documentação viva são apontadas por Gojko: 
  • Ajuda as equipes a longo prazo  evitando os problemas mais comuns com manutenção;
  •  Ajuda as equipes a criarem documentação útil que irá facilitar a evolução do software ao longo do tempo;
  •  Ajuda a evitar problemas de manutenção causados ​​pela falta de conhecimento compartilhado.