Você está na página 1de 32

Gerência e Qualidade de

Software
Conhecer os principais tópicos a serem cobertos na disciplina;
Conhecer o versionamento de software via o uso de uma ferramenta.

SEMANA 1

GIT - VISÃO GERAL é um software livre que atua como repositório de arquivos com controle de versões.
Similares são: CVS, SVN, Mercurial, BitKeeper, Bazzar, Monotone

Mudanças são inevitáveis quando o software de computador é construído e podem causar confusão quando os
membros de uma equipe de software estão trabalhando em um projeto. Babich [Bab86] sugere uma abordagem
que minimiza a confusão, melhora a produtividade e reduz o número de erros quando afirma: “A gestão de
configuração é a arte de identificar, organizar e controlar modificações no software que está em construção por
uma equipe de programação. O objetivo é maximizar a produtividade minimizando os erros”.

Fluxo do SCM:
(1) identificar a alteração,
(2) controlar a alteração,
(3) assegurar que a alteração esteja sendo
implementada corretamente e
(4) relatar as alterações a outros envolvidos

O gerenciamento de configuração de software é um conjunto


de atividades desenvolvidas para gerenciar alterações ao longo
de todo o ciclo de vida de um software. O SCM pode ser visto
como uma atividade de garantia de qualidade do software
aplicada em todo o processo do software.

GESTÃO DE CONFIGURAÇÃO DE SOFTWARE

Elementos de componente. Conjunto de ferramentas acopladas em um sistema de gestão de arquivos


(p. ex., um banco de dados) que possibilita acesso à gestão de cada item de configuração de software.
Elementos de processo. Coleção de procedimentos e tarefas que definem uma abordagem eficaz de
gestão de alterações (e atividades relacionadas) para todas as partes envolvidas na gestão, engenharia e
ESSENCIAIS

uso do software.
Elementos de construção. Conjunto de ferramentas que automatizam a construção do software,
assegurando que tenha sido montado o conjunto apropriado de componentes validados (i.e., a versão
correta).
Elementos humanos. Conjunto de ferramentas e características de processo (abrangendo outros
elementos de CM) usado pela equipe de software para implementar um SCM eficaz.

Referenciais: é um conceito de gerenciamento de configuração de software que ajuda a controlar


alterações sem obstruir seriamente as alterações justificáveis. Uma especificação ou produto que tenha
sido formalmente revisado e acordado, que depois serve de base para mais desenvolvimento e pode ser
alterado somente por meio de procedimentos formais de controle de alteração. Para que um item de
configuração de software se torne uma referência para o desenvolvimento, as alterações devem ser feitas
rápida e informalmente. No entanto, uma vez estabelecida uma referência, podem ser feitas alterações,
mas deve ser aplicado um processo específico e formal para avaliar e verificar cada alteração
Itens de Configuração. Uma seta curva indica uma relação de composição.
Isto é, DataModel e ComponentN fazem parte do objeto DesignSpecification.
Uma seta reta bidirecional indica uma inter-relação. Se for feita uma alteração
no objeto SourceCode, as inter-relações permitem determinar quais outros
objetos (e SCIs) podem ser afetados.

CARACTERÍSTICAS DE REPOSITÓRIO

Versões: O repositório deve poder controlar uma grande variedade de tipos


de objetos, incluindo texto, gráficos, bitmaps, documentos complexos e
objetos especiais, como definições de tela e relatório, arquivos de objeto,
dados de testes e resultados.
O controle de versão combina procedimentos e ferramentas para gerenciar diferentes versões dos objetos de
configuração criados durante o processo de software. Um sistema de controle de versão implementa ou está
diretamente integrado a quatro recursos principais: (1) um banco de dados de projeto (repositório) que
armazena todos os objetos de configuração relevantes; (2) um recurso de gestão de versão que armazena todas
as versões de um objeto de configuração (ou permite que qualquer versão seja construída usando diferenças
das versões anteriores); (3) uma facilidade de construir que permite coletar todos os objetos de configuração
relevantes e construir uma versão específica do software.
Acompanhamento de dependências e gestão de alterações: A capacidade de manter o controle de todas
essas relações é crucial para a integridade das informações armazenadas no repositório e para a geração de
outros produtos nele baseados, e é uma das contribuições mais importantes do conceito de repositório para o
aperfeiçoamento do processo de desenvolvimento de software.
Controle de requisitos: Essa função especial depende da gestão de links e proporciona a capacidade de
controlar todos os componentes de projeto e construção e outros produtos que resultam de uma especificação
especial de requisitos (acompanhamento adiante). Além disso, proporciona a capacidade de identificar quais
requisitos geraram determinado produto (acompanhamento retroativo).
Gestão de configuração: mantém controle de uma série de configurações representando marcos de projeto
específicos ou versões de produção.
Pistas de auditoria: estabelece informações adicionais sobre quando, por que e por quem foram feitas as
alterações. As informações sobre a origem das alterações podem ser colocadas como atributos de objetos
específicos no repositório.

INTEGRAÇÃO CONTÍNUA

As melhores práticas do SCM incluem: (1) minimizar o número de variantes de código; (2) testar desde o início e
com frequência; (3) integrar desde o início e com frequência; e (4) usar ferramentas para automatizar o teste, a
construção e a integração do código. Vantagens:
Feedback acelerado. Notificar os desenvolvedores imediatamente quando a integração não dá certo permite
que os consertos ocorram enquanto o número de alterações realizadas é pequeno.
Maior qualidade. Criar e integrar software sempre que necessário gera confiança sobre a qualidade do
produto desenvolvido.
Menor risco. Integrar os componentes com antecedência evita o risco de uma fase de integração longa, pois as
falhas de projeto são descobertas e consertadas antes.
Melhores relatórios. Fornecer informações adicionais (p. ex., métricas de análise de código) permite uma
contabilidade de status de configuração mais precisa.
PROCESSO DE GESTÃO DE ALTERAÇÃO
Define uma série de tarefas que têm quatro objetivos principais: (1) identificar todos os itens que
coletivamente definem a configuração do software; (2) gerenciar alterações de um ou mais desses itens;
(3) facilitar a construção de diferentes versões de uma aplicação; e (4) assegurar que a qualidade do
software seja mantida à medida que a configuração evolui com o tempo. Aplicado para responder as
questões:

A PARTIR DAS QUESTÕES SÃO DEFINIDAS AS CINCO TAREFAS DA SCM

GESTÃO DE IMPACTO
A gestão de impacto é realizada com três ações [Sou08]. Primeiro, uma rede de impacto identifica os membros de
uma equipe de software (e outros envolvidos) que podem afetar ou ser afetados pelas alterações feitas no
software. Uma definição clara da arquitetura do software (Capítulo 10) ajuda muito na criação de uma rede de
impacto. Em seguida, a gestão de impacto adiante (forward impact management) avalia o impacto das alterações
feitas por você sobre os membros da rede de impacto e, então, informa-os sobre o impacto dessas alterações.
Por último, a gestão de impacto retroativo (backward impact management) examina as alterações feitas por
outros membros da equipe e o impacto sobre o seu trabalho e incorpora mecanismos para reduzir o impacto.

AUDITORIA DE CONFIGURAÇÃO
Assegura que a alteração foi realizada
corretamente. Uma auditoria de
configuração de software complementa a
revisão técnica avaliando o objeto de
configuração quanto a características que
em geral não são consideradas durante a
revisão. A auditoria propõe e responde às
seguintes questões:

RELATÓRIO DE STATUS
O relatório de status de configuração (CSR, do inglês configuration status reporting) (às vezes chamado de
contabilidade de status) é uma tarefa do SCM que responde às seguintes questões: (1) O que aconteceu? (2)
Quem fez? (3) Quando aconteceu? (4) O que mais será afetado?

GESTÃO DE ALTERAÇÃO ÁGIL


O relatório de status de configuração (CSR, do inglês configuration status reporting) (às vezes chamado de
contabilidade de status) é uma tarefa do SCM que responde às seguintes questões: (1) O que aconteceu? (2)
Quem fez? (3) Quando aconteceu? (4) O que mais será afetado?
Cada alteração deve ser classificada em uma dentre quatro classes:

Classe 1. Alteração de conteúdo ou função que corrige um erro ou melhora o conteúdo ou a funcionalidade local.

Classe 2. Alteração de conteúdo ou função que tenha impacto sobre outros objetos de conteúdo ou sobre os
componentes funcionais.
Classe 3. Alteração de conteúdo ou função que tenha um amplo impacto em uma aplicação (p. ex., extensão ou
funcionalidade principal, melhora significativa ou redução em conteúdo, alterações importantes necessárias na
navegação).

Classe 4. Uma alteração importante de projeto (p. ex., alteração na abordagem de projeto da interface ou na
estratégia de navegação) que será notada imediatamente por uma ou mais categorias de usuário.

GESTÃO DE CONTEÚDO
está relacionada à gestão de configuração no sentido de que um sistema de gestão de conteúdo (CMS, do inglês
content management system) estabelece um processo (suportado por ferramentas apropriadas) que adquire o
conteúdo existente (de uma ampla variedade de objetos de configuração de jogos e/ou aplicativos), estrutura
esse conteúdo de maneira que ele possa ser apresentado a um usuário e, então, fornece-o ao ambiente no lado
do cliente para ser exibido.

O uso mais comum de um sistema de gestão de conteúdo ocorre quando é criada uma aplicação dinâmica.
Classe 2. Alteração de conteúdo ou função que tenha impacto sobre outros objetos de conteúdo ou sobre os
componentes funcionais.
Controle de Versão:

Um repositório central para o projeto de jogo ou aplicativo deve ser estabelecido. O repositório terá as
versões atuais de todos os objetos de configuração (conteúdo, componentes funcionais e outros).
Cada desenvolvedor Web cria sua própria pasta de trabalho. A pasta contém os objetos que estão sendo
criados ou alterados em determinado instante.
Os relógios das estações de trabalho de todos os desenvolvedores devem estar sincronizados. Isso é
feito para evitar conflitos de sobrescrita, quando dois desenvolvedores fazem alterações em horários muito
próximos.
À medida que novos objetos de configuração são desenvolvidos ou objetos existentes são alterados,
são importados para o repositório central. A ferramenta de controle de versão vai gerenciar todas as
funções de entrada (check-in) e saída (check-out) das pastas de trabalho de cada desenvolvedor. A ferramenta
também fornecerá atualizações automáticas de e-mail a todas as partes envolvidas quando forem feitas
alterações no repositório.
À medida que objetos são importados ou exportados do repositório, é gerada uma mensagem automática com
data e hora. Isso proporciona informações úteis para auditoria e pode se tornar parte de um esquema eficaz de
relatórios.

GIT -LISTA DE COMANDOS

INIT Cria um repositório vazio.

Primeiro chama init para criar um repositório vazio. Em seguida, ele copia para esse repositório
CLONE
todos os commits de um repositório remoto, passado como parâmetro

Usados para criar snapshots (ou fotografias) dos arquivos de um sistema. Uma vez tiradas essas
fotografias, elas são armazenadas no sistema de controle de versões, de forma compactada e
COMMIT otimizada, para não ocupar muito espaço em disco. Recomenda-se que desenvolvedores
realizem commits periodicamente, sempre que tiverem efetuado uma mudança importante no
código.

Salvar o conteúdo do arquivo no index. Feito isso, podemos usar um commit para salvar no
ADD
repositório local a versão adicionada ao index.
Mostra o estado do diretório de trabalho e do index (arquivos do diretório de trabalho que foram
alterados pelo desenvolvedor, mas que ele ainda não adicionou no index ou não são rastreados
STATUS
pelo git, ou seja, eles ainda não foram objetos de um add que encontram-se no index,
aguardando um commit.

Destacar as modificações realizados nos arquivos do diretório de trabalho e que ainda não foram
DIFF
movidas para o index (ou stage).

LOG Lista informações sobre os últimos commits, como data, autor, hora e descrição do commit.

Copia os commits mais recentes do repositório local para o repositório remoto. Portanto, ele é
PUSH uma operação mais lenta, pois envolve comunicação pela rede. Um push deve ser usado quando
o desenvolvedor deseja tornar uma modificação visível para os demais desenvolvedores.

Para atualizar seu repositório local (Primeiro, um pull copia os commits mais recentes do
PULL repositório central para o repositório local do desenvolvedor-FETCH e Em seguida, o comando
pull atualiza os arquivos do diretório de trabalho - MERGE.

Mecanismo que viabiliza que um branch seja revisado e discutido antes de ser integrado no
branch principal. Quando se usa pull requests, um desenvolvedor sempre implementa novas
Pull requests funcionalidades em um branch separado. Concluída a implementação, ele não integra
imediatamente o novo código no branch principal. Antes que isso ocorra, ele abre uma
solicitação para que seu branch seja revisado e aprovado por um segundo desenvolvedor.

Comando que permite unir diversos commits em um único commit. É uma operação
Squash
recomendada, por exemplo, antes de submeter pull request

Mecanismo que o GitHub oferece para clonar repositórios remotos, isto é, repositórios
armazenados pelo próprio GitHub. Um fork é realizado via interface do GitHub. Na página de
Forks qualquer repositório, existe um botão para realizar essa operação. Se fizermos um fork do
repositório torvalds/linux será criado uma cópia desse repositório na nossa conta do GitHub,
chamado, por exemplo, mtov/linux.

Conflito de Merge acontecem quando dois


desenvolvedores alteram o mesmo trecho de
código ao mesmo tempo.
Branches: é a organização o diretório de
trabalho em diretórios virtuais. Um
desenvolvedor somente pode alterar o
branch corrente de A para B se as
modificações que ele fez em A estiverem
salvas. Isto é, se ele tiver realizado antes um
add e commit.
Conhecer a automação de compilação e integração de software via o
uso das ferramentas Maven, Gradle e Cmake.
SEMANA 2

O Maven é uma ferramenta de gerenciamento de dependências e do ciclo de vida de projetos de


software no sentido técnico. Isso inclui:
Facilitar a compilação do código, o empacotamento (JAR, WAR, EAR, …), a execução de testes
unitários, etc.
Unificar e automatizar o processo de geração do sistema. Nada mais de uma coleção de
passos e scripts a serem executados manualmente.
Centralizar informações organizadas do projeto, incluindo suas dependências, resultados de
testes, documentação, etc.
Reforçar boas práticas de desenvolvimento, tais como: separação de classes de teste das
classes do sistema, uso de convenções de nomes e diretórios, etc.
Ajuda no controle das versões geradas (releases) dos seus projetos.
Usada primariamente em Java, mas também outras linguagens
POM (Project Object Model), arquivo XML descreve o projeto de software sendo construído:
Dependências sobre módulos e componentes externos
Ordem de compilação
Diretórios
Plug-ins necessários

CONCEITOS

Artefato (artifact): Um artefato é geralmente um arquivo JAR que fica no repositório do Maven, mas pode ser de
outro tipo. Identificados através dos seguintes elementos: grupo (é como o endereço do site ao contrário, como
br.com.starcode, org.apache, com.google, com.ibm, etc); identificador único de artefato ( geralmente é o nome do
projeto. Ele deve ser único por grupo); Número de versão: a versão do projeto, como 1.4.2 ou 3.0 (se houver o
sufixo -SNAPSHOT (0.0.1-SNAPSHOT, por exemplo) significa que o projeto está em desenvolvimento e o pacote
pode ser alterado); Tipo do projeto (jar, war, ear, pom (projeto de configuração); e Classificador: identificação
opcional para diferenciar variações da mesma versão (Por exemplo, se o programa é compilado para diferentes
versões do Java podemos usar os classificadores jdk4 e jdk6. Se há variações específicas para Sistemas
Operacionais, podemos ter os classificadores linux e windows).

Repositório local: É um diretório em seu PC onde os artefatos são armazenados após baixados de um repositório
remoto na internet ou na intranet.

Repositório remoto: Consiste numa aplicação que disponibiliza artefatos do Maven. Pode se um repositório
público na Internet, onde criadores de bibliotecas e frameworks disponibilizam seus artefatos, ou pode ser um
repositório privado da empresa, disponível na intranet.
Existe um repositório central que já vem configurando no Maven, mas algumas empresas criam seus próprios
repositórios. Inclusive você pode criar o seu instalando o Artifactory ou Nexus num servidor.
Quando adicionamos esses repositórios remotos em nossa instalação do Maven, ele é capaz de localizar e baixar
automaticamente as dependências através da identificação do artefato.

Arquivo POM: O arquivo pom (pom.xml) é a configuração principal do Maven e estará presente em todo projeto.
Nele você declara a identificação do seu projeto (que após gerado será também um artefato Maven), as
dependências, repositórios adicionais, etc.
Ciclo de vida padrão do Maven
O Maven possui um ciclo de vida padrão. Cada
1. process-resources mvn process-resources
passo do ciclo de vida é chamado de Goal e
2. compile mvn compile
possui plugins específicos. Os mais importantes
3. process-test-resources mvn process-test-resources
são:
4. test-compile mvn test-compile
validate: valida o projeto e se as informações
5. test mvn test
necessárias para os próximos passos estão
6. package mvn package
disponíveis, como as dependências por
7. install mvn install
exemplo.
8. deploy mvn deplo
compile: compila o código-fonte.
test: executa os testes unitários (JUnit, por
exemplo).
package: empacota o código compilado em um JAR, WAR, etc.
integration-test: executa os testes de integração.
install: adiciona o pacote gerado ao repositório local, assim outros projetos na mesma máquina podem usar
essa dependência.
deploy: copia o pacote final para o repositório remoto, disponibilizando-o para outros desenvolvedores e
outros projetos.

VANTAGENS DO MAVEN

Centralização das informações: O Maven centraliza as informações dos projetos no arquivo pom.
Padronização do ambiente de desenvolvimento: Através da especificação do projeto, incluindo suas
características e dependências, o Maven constrói a estrutura necessária do projeto, baixando automaticamente as
versões corretas das dependências (JARs, por exemplo) de um repositório central ou de um repositório privado
(contendo sistemas da empresa).
Gerenciamento de dependências: o Maven faz o download automático de dependências para o projeto e os
adiciona ao classpath do seu projeto. Cada dependência pode ter também as suas próprias dependências. Elas são
chamadas dependências transitivas. O Maven resolve essa árvore de dependências e traz tudo o que você
precisa.
Facilidade de compreensão do projeto
Automação: O Maven gerencia o ciclo de vida da aplicação. Após configurar um projeto, você será capaz de
executar comandos que vão desde a compilação até a geração de documentação (Javadoc) e um site padrão
contendo informações sobre o projeto. Uma vez feita a configuração necessária, o projeto pode ser baixado e
compilado sem nenhum esforço. Novas versões podem ser geradas em servidores de Integração Contínua e
testadas automaticamente sempre que necessário.

DESVANTAGENS DO MAVEN

Incompatibilidade de dependências
Algumas tecnologias simplesmente não vão funcionar bem com o Maven

Trata-se de uma ferramenta de build open source bastante poderosa que nos permite configurar
arquivos de build por meio da sua DSL (Domain Specific Language) baseada na linguagem
Groovy.
Além da DSL, a ideia do Gradle é permitir configurações baseando-se em tasks, ou seja, quando queremos criar
algum novo comportamento durante o build, vamos criar uma task.

é um "Cross-Platform Makefile Generator" ou uma ferramenta open-source que permite gerar


automaticamente scripts de construção de aplicação em diferentes plataformas.
Conhecer a automação de teste de software via o uso das ferramentas
JUnit, Selenium e Cucumber.
SEMANA 3
JUNIT

O teste unitário é uma modalidade de testes que se concentra na verificação da menor unidade do projeto de
software. É realizado o teste de uma unidade lógica, com uso de dados suficientes para se testar apenas à lógica
da unidade em questão. Em sistemas construídos com uso de linguagens orientadas a objetos, essa unidade
pode ser identificada como um método, uma classe ou mesmo um objeto. O JUnit é um framework que facilita o
desenvolvimento e execução de testes unitários em código Java.

@Test Identifica que este método é um método de teste.

Executará o método antes de cada teste. Este método pode ser usado
@Before para preparar o ambiente de teste, por exemplo, lendo dados do
usuário.

@After Executará o método após cada teste.


Executará o método antes do início de todos os testes. Por
@BeforeClass
exemplo: usado para se conectar a um banco de dados

Executára o método após todos os testes finalizarem. Por


@AfterClass
exemplo: usado para desconectar a base de dados.

O método será ignorado. Usado quando fizemos alguma


@Ignore
mudança e ainda não adaptamos o teste.

@Test
Testa se o método levanta a exceção especificada.
(expected=IllegalArgumentException.class)

@Test (timeout=100) Falha se o teste levar mais que 100 milisegundos

SELENIUM

É uma ferramenta de teste automatizada de código aberto usada para testar aplicativos da Web em vários
navegadores. Ele é construído principalmente em Java e suporta vários navegadores e linguagens de
programação. uma interface fácil de usar que registra as interações do usuário no navegador e as exporta como
um script reutilizável.
O Selenium IDE faz parte da suíte Selenium e foi desenvolvido para acelerar a criação de scripts de automação. É
uma ferramenta de prototipagem rápida e pode ser usada por engenheiros sem nenhum conhecimento de
programação. Abaixo o fluxo de funcionamento do Selenium:
Os comandos de selênio são amplamente classificados em:

1. Ações - Comandos que interagem diretamente com o aplicativo:

clickAndWait(),

tipoAndWait()

2. Permitir que o usuário armazene determinados valores em uma variável definida pelo usuário:

storeTitle()

3. Asserções - Verifica o estado atual do aplicativo juntamente com um estado esperado. Existem
diferentes tipos de asserções:

O comando Assert garante que a execução do teste seja encerrada em caso de falha
O comando Verify garante a execução do script mesmo se a verificação tiver falhado
O comando WaitFor aguarda que uma condição específica seja atendida antes de executar a próxima etapa de
teste

Desenvolvimento orientado a comportamento

BDD é um conjunto de práticas de engenharia de software projetado para ajudar as equipes a construir e
entregar mais rápido software de alta qualidade.

Para explicar o funcionamento do BDD vamos usar o seguinte exemplo: uma equipe praticante de BDD decide
implementar uma nova funcionalidade e para isso, eles trabalham em conjunto com os usuários e outras partes
interessadas para definir as histórias e cenários do que os usuários esperam dessa funcionalidade. Em
particular, os usuários ajudam a definir um conjunto de exemplos concretos que ilustram resultados que a nova
funcionalidade deve fornecer. Esses exemplos são criados utilizando um vocabulário comum e podem ser
facilmente compreendidos pelos usuários finais e membros da equipe de desenvolvimento de software, e
geralmente são expressos usando Cenário(Scenario), Dado(Given), Quando(When) e Então (Then).

Exemplo:

Cenário: Transferir dinheiro para uma conta poupança


Dado que eu tenho uma conta corrente com 1000.00
E que eu tenho uma conta de poupança com 2.000,00
Quando eu transferir 500,00 a partir de minha conta corrente para a minha conta poupança
Então eu deveria ter 500,00 em minha conta corrente
E eu deveria ter 2.500,00 em minha conta poupança

Depois de especificada a nova funcionalidade, sempre que possível estes exemplos concretos são
automatizados sob a forma de especificações executáveis, que tanto valida o software quanto fornece uma
documentação atualizada, técnica e funcional. Logo, existem várias ferramentas e frameworks que apoiam esta
fase do BDD, transformando esses requisitos em testes automatizados que ajudam a orientar o desenvolvedor
para que a nova funcionalidade seja desenvolvida corretamente e dentro do prazo.
CUCUMBER

uma ferramenta usada para executar testes de


aceitação automatizados que foram criados em
um formato BDD. Um de seus recursos mais
destacados é a capacidade de realizar descrições
funcionais de texto simples (escritas numa
linguagem chamada Gherkin) como testes
automatizados.

Esta característica incrível da abordagem BDD


apresenta as seguintes vantagens:

Escrever testes de BDD em uma linguagem


onipresente, estruturada em torno do
modelo de domínio e amplamente usada por
todos os membros da equipe incluindo
desenvolvedores, testadores, analistas de
negócio e clientes;
Conexão técnica com membros não técnicos
de uma equipe de software;
Permitir a interação direta com o código do
desenvolvedor; os testes de BDD são
escritos em um idioma que também podem
ser criados pelos stakeholders envolvidos;
Por último, mas não menos importante, os
testes de aceitação podem ser executados
automaticamente, enquanto são executados
manualmente pelos stakeholders.

o teste de automação usando o Cucumber é criado em uma linguagem de domínio do negócio, ou em uma
linguagem natural, que pode ser facilmente produzida por todos os membros do projeto. A comunicação é
crucial para qualquer time de desenvolvimento, especialmente para um time Ágil.

Conhecer a análise de cobertura de teste via o uso de ferramenta;


Conhecer os principais tipos de refatoração de software. SEMANA 4

COVERAGE.PY não tem uma opção de relatório que mostre cobertura em nível de função ou cobertura de condição.

Os engenheiros do Python usam Coverage.py para medir a eficácia de um conjunto de testes quando aplicado
a um aplicativo. Ao medir a cobertura de teste, há quatro medições que podem ser feitas que fornecem
informações sobre a eficácia de um conjunto de testes para uma aplicação específica. Essas quatro medidas
são: cobertura de declaração, cobertura de função, cobertura de agência e cobertura de condição.

Cobertura de Declaração (Statement Coverage): A cobertura de instrução informa quantas linhas de


código foram executadas pelo conjunto de testes e quantas linhas de código não foram executadas. A
principal medida aqui é a porcentagem de código executado para cada arquivo individual, bem como para
todo o aplicativo. Obviamente, a meta é atingir 100% de cobertura.
Cobertura de Função (Function Coverage): informa quais funções foram chamadas e quais funções não
foram chamadas. Observar a cobertura de código a partir do nível de funções é uma boa maneira de
encontrar código morto. Analisar a cobertura da função ajuda você a descobrir como melhorar a cobertura
de um conjunto de testes.
Cobertura de Agências (Branch Coverage): medida que informa se cada ramificação de uma instrução de
controle foi executada. Exemplos de instruções de controle são instruções if e instruções de caso. Como
exemplo, uma instrução if simples sem cláusula else tem duas ramificações possíveis. Uma ramificação é
executada quando a condição da instrução if é avaliada como true. A segunda ramificação é executada
quando a condição é false. É importante ressaltar que é possível ter 100% de cobertura de declaração e
menos de 100% de cobertura de agência.
Cobertura de Condição (Condition Coverage): medida que informa se cada subexpressão booleana
dentro de um programa foi avaliada como verdadeira e falsa durante a execução de um conjunto de
testes.

JaCoCo

Jacoco é uma biblioteca gratuita de Cobertura de Código para Java que pode ser usada para capturar a
cobertura de Código durante a execução de Testes de Unidade e Suítes de Automação completas. Ele
instrumenta as Classes do aplicativo quando elas são carregadas na JVM e despeja os dados mediante
solicitação ou na saída.

Pode ser usado em conjunto com Maven e com Gradle.


Sobre limiares (thresholds) dos valores de cobertura de teste, é correto afirmar que:
com Gradle, é possível informar classes a serem excluídas da verificação dos limiares.
REFATORAÇÃO

EXTRAIR MÉTODO: Se você tiver um fragmento de código que pode ser agrupado - Transforme o fragmento em
um método cujo nome explique o propósito do mesmo

INTERNALIZAR MÉTODO: Se o corpo de um método for tão claro quanto seu nome - Coloque o corpo do
método dentro do corpo do que o chama e remova o método.

INTERNALIZAR VARIÁVEL TEMPORÁRIA: Você tem uma variável temporária que recebe uma única atribuição
de uma expressão simples, e essa variável está atrapalhando outras refatorações. - Substitua todas as
referências a essa variável temporária pela expressão.

é um passo essencial an- tes de Extrair Método


SUBSTITUIR VARIÁVEL TEMPORÁRIA POR CONSULTA: Se você estiver usando uma variável temporária para
armazenar o resultado de uma expressão - Extraia a expressão para um método. Substitua todas as
referências à variável temporária pela expressão. Este novo método pode então ser usado em outros
métodos.

INTRODUZIR VARIÁVEL EXPLICATIVA: Se você tiver uma expressão complicada: Coloque o resultado da
expressão, ou partes da expressão, em uma variável temporária cujo nome explique o seu propósito.
DIVIDIR VARIÁVEL TEMPORÁRIA: Você tem uma variável temporária que mais de uma vez recebe uma
atribuição, mas não é uma variável de laço nem um acumulador temporário. - Crie uma variável temporária
separada para cada atribuição.

SUBSTITUIR MÉTODO POR OBJETO MÉTODO: Você tem um método longo que usa variáveis locais de um
modo que você não po- de aplicar Extrair Método (100) - Transforme o método em seu próprio objeto de
modo que todas as variáveis locais se tornem campos desse objeto. Você pode então decompor o
método em outros métodos no mesmo objeto.

SUBSTITUIR ALGORITMO: Se você quiser substituir um algoritmo por um mais claro - Substitua o corpo do
método pelo novo algoritmo.
conhecer os principais conceitos relacionados à integração contínua;
conhecer algumas métricas de código-fonte de software via uma
ferramenta;
conhecer os principais conceitos relacionados à beleza de código. SEMANA 5

INTEGRAÇÃO CONTÍNUA

A mais popular
Código aberto / grande comunidade por trás
Fácil suporte na internet
Quase 1000 plugins para extensão
Baseada em Java
Focado em instalações locais
Não inclui suporte a testes

Gitlab CI/CD
Uma das principais ferramentas de IC
Grande eficiência
Trio: integração, implantação e entrega
contínua
Integração com Docker
Uso local ou na nuvem
Suporte a testes automatizados
Boa experiência do usuário, facilidade de
aprender
TESTE DE VALIDAÇÃO

CENÁRIOS DE TESTES:
TESTES DE SISTEMA

de Recuperação de Falhas:

de Segurança

de Estresse

de Desempenho
de Implantação

TESTES DE VERSÃO

TESTES DE USUÁRIO
TESTES DE ACEITAÇÃO

MÉTRICAS PARA INTERFACE DO USUÁRIO


MÉTRICAS DE ESTÉTICA

MÉTRICAS DE CONTEÚDO

MÉTRICAS DE NAVEGAÇÃO
MÉTRICAS PARA CÓDIGO FONTE

PRINCÍPIOS CLEAN CODE

1. Use nomes que revelam seu propósito.


2. Use distinções significativas
3. Use nomes fáceis de se pronunciar, ou pelo menos que
sejam pronunciáveis.
4. Use nomes que sejam fáceis de se buscar.
5. Nomes de classes devem ter nomes com substantivos
6. Nome de métodos é uma boa prática ter verbos
7. Escreva funções melhores

7.1. Faça apenas uma coisa


Funções devem fazer somente uma coisa e devem fazê-la bem.
7.2. Um nível de abstração por função
7.3. Use nomes descritivos
Não tenha medo de criar nomes extensos, pois eles são
melhores que um pequeno e enigmático.
7.4. Parâmetros de funções
Devemos evitar passar vários parâmetros para uma função, o
ideal é que nossas funções recebam no máximo 2 parâmetros.
7.5. Parâmetros lógicos
Parâmetros lógicos é uma má prática, pois mostra
explicitamente que a função faz mais de uma coisa.
7.6. Evite efeitos colaterais e Evite variáveis globais.
Efeitos colaterais são mentiras. Sua função promete fazer
apenas uma coisa, mas ela também faz outras coisas
escondidas.
7.7. Evite repetição
Duplicação de código pode ser um grande mal no seu
software, sempre que você ver que você está repetindo muito
código, extraia isso para funções.
7.8 Escreva comentários com responsabilidade

conhecer os principais conceitos relacionados à programação


pareada;
conhecer os principais conceitos relacionados à revisão de código;
conhecer os principais conceitos relacionados à dívida técnica. SEMANA 6

PROGRAMAÇÃO PAREADA

Técnica de desenvolvimento de software ágil em que dois programadores trabalham juntos em uma estação de
trabalho. Um deles, o "piloto", escreve o código, enquanto o outro, chamado de "co-piloto" (ou "navegador"),
analisa cada linha do código. Os dois programadores geralmente trocam de papel frequentemente.

Evitando distrações e criando um ambiente colaborativo, em geral, a programação pareada se prova mais
produtiva do que a isolada. Enquanto está analisando, o co-piloto também considera a orientação estratégica do
trabalho, dando ideias para melhorias e comenta sobre possíveis problemas futuros que devem ser resolvidos.
Isso libera o controlador para concentrar toda a sua atenção nos aspectos táticos da tarefa atual.

Piloto: escreve o código.

Co-piloto: analisa cada linha de código escrita e dá ideias para melhorias e comenta sobre possíveis
problemas futuros que devem ser resolvidos.

equipes que usaram programação pareada completaram


“...96% dos programadores que já programaram
vários projetos com uma qualidade de código superior,
utilizando a técnica de programação em par preferem
além de, em muitos casos, certas funcionalidades terem
trabalhar em um ambiente com essa metodologia do
sido implementadas com uma quantidade menor de
que programarem sozinhos” (Blekinge Institute of Technology)
linhas de código do que com programadores sozinhos
(Universidade de Utah)

V Mais produtiva do que a programação isolada.


A
N Evita distrações e cria um ambiente colaborativo.
T
A Melhor colaboração, maior qualidade, melhor código e melhores práticas de desenvolvimento sustentado.
G
E Melhor aprendizado e compartilhamento de informações entre os desenvolvedores.
N
S Mais de uma pessoa pensando no mesmo problema pode ajudar a criar soluções e cenários mais simples
e eficazes.
Melhora a disciplina do time: programação individual costuma ser cansativa levando à distrações

Compartilhar conhecimento: a rotação entre os papéis de piloto e copiloto e entre os membros das
V duplas permite troca de informações, técnicas, conhecimento e melhora o nivelamento do nível técnico
A da equipe, além do compartilhamento do conhecimento sobre as diferentes partes do código e
N versões do projeto.
T
A Melhor qualidade do código: supera o desafio de criar códigos limpos e sem erros de forma rápida
G pela revisão e aprimoramento constantemente por diferentes integrantes da equipe, já que revisar
E sozinho não costuma ser agradável mas aos pares sim. Em dupla, há menor risco de se usar
N "gambiarras", já que seu algoritmo vai ser visualizado e revisado por outra pessoa.
S
Gera mais união na equipe: o espírito coletivo é fortalecido, pois erros e qualidade do código
passam a ser responsabilidade do time e não de apenas uma pessoa; além disso, amizades são criadas
e relações interpessoais são fortalecidas.

Parear consome 15% a mais de tempo total de trabalho mas reduz,


pelo menos, 15% a quantidade de códigos com defeito

Modelos de Pareamento

Tipo Vantagem Desvantagem

Geralmente fornece pouca percepção sobre


Parece a escolha óbvia para maior
Especialista– novas maneiras de resolver problemas, pois é
produtividade; pode produzir ótimos
especialista improvável que ambas as partes questionem as
resultados;
práticas estabelecidas

Cria várias oportunidades para o especialista


Um novato intimidado pode passivamente apenas
orientar o novato; pode introduzir novas ideias,
“observar o mestre” e hesitar em participar de
Especialista– pois é mais provável que o novato questione as
forma significativa; e alguns especialistas podem
novato práticas estabelecidas; o especialista, ao ser
não ter a paciência necessária para permitir a
obrigado a explicar práticas estabelecidas, fica
participação construtiva de novatos.
mais propenso a questioná-las.

Pode produzir resultados significativamente É mais difícil para novatos desenvolver bons
Novato–
melhores do que dois novatos trabalhando hábitos sem um “modelo” adequado e, por isso, é
novato independentemente desincentivada

Boas Práticas

Entrosamento: deve existir boa química entre participantes, que precisam entender como os outros
gostam de trabalhar.

Entender o motivo: os programadores devem entender as suas funções dentro do projeto e por qual
motivo estão trabalhando aos pares.

Troca de pares: para que todos aprendam a trabalhar uns com os outros, melhorando o desempenho
de toda a equipe, o que pode ocorrer, por exemplo, no fim de cada Sprint.

Estrutura: uma boa estrutura é necessária, incluindo materiais como cadeiras ergométricas, mesas com
tamanho suficiente para comportar todos os equipamentos necessários e um monitor de boa qualidade
com bom tamanho de tela.
REVISÃO DE CÓDIGO

é uma das práticas mais importantes para


garantir a saúde a médio e longo prazo da
base de código de um sistema. Ela é hoje
adotada por várias empresas que
desenvolvem software.

A ideia de revisão de código é simples: todo


código desenvolvido por um desenvolvedor
tem que ser, em seguida, analisado por pelo
menos um outro desenvolvedor, chamado
de revisor. O revisor pode adicionar
comentários no código sob revisão,
procurando esclarecer dúvidas, sugerindo
melhorias, indicando bugs, etc.

Assim, estabelece-se um diálogo – na forma


de uma troca de comentários — entre o
autor do código e o seu revisor.

Assim, estabelece-se um diálogo – na


forma de uma troca de comentários — entre
o autor do código e o seu revisor.

Prioridade de Revisão

Bugs em geral Ausência de testes


Código mais complexo do que o necessário Ausência de documentação, principalmente aquela mais
Código que usa um algoritmo e/ou relevante
estrutura de dados menos eficiente Falhas de segurança ou privacidade
Código que viola princípios de projeto (veja Problemas de desempenho
mais no Capítulo 5) Problemas de usabilidade com o usuário
Código que viola a arquitetura de camadas Uso inadequado ou sub-ótimo de APIs
do sistema (veja mais no Capítulo 7) Uso de bibliotecas ou frameworks não autorizados
Código que não trata exceções e erros Problemas relacionados com alocação de memória dinâmica
Código com code smells (veja mais no Problemas relacionados com programação concorrente
Capítulo 9) Código com problemas de leiaute ou indentação
Otimizações prematuras Código que viola convenções de nome

Recomendações “Um trecho de código para revisão deve ter no máximo 200 linhas de código.

1. O objetivo da revisão é detectar problemas inequívocos no código submetido. A revisão não é para propor
alternativas que não tenham vantagens claras e inequívocas. Ou seja, um revisor somente deve propor uma
alternativa se ela for, de fato, bem melhor!
2. Evite comentários subjetivos e relacionados a estilos pessoais.
3. Nunca use palavras ofensivas, sarcásticas ou mesmo irônicas. Seja sempre educado e profissional.
4. Sempre restrinja seus comentários ao código que foi submetido.
5. Procure fazer perguntas e não julgamentos.
6. Se você tiver feito um comentário errado ou sem sentido, reconheça o seu erro e agradeça
7. Sempre que for esclarecedor, referencie a documentação interna ou externa ao projeto.
8. Procure justificar os seus comentários
DÍVIDA TÉCNICA

Descreve a dívida que a equipe de desenvolvimento assume quando escolhe um design ou abordagem fácil de
implementar no curto prazo mas com grande impacto negativo no longo prazo.

É inevitável possuir dívidas técnicas em um projeto.

Martin Fowler, também cita também os exemplos de classificação da dívida técnica, como um cruzamento de 2
conceitos básicos, de Prudencia, quando o time de desenvolvimento entende o conceito de dívida técnica e
como utilizá-lo e o conceito de Consciência, quando o time de desenvolvimento sabe que está gerando dívidas
técnicas.

O time não tem tempo para o design e utiliza O time precisa entregar o produto agora com todas as
uma solução rápida e com pouca preocupação limitações conhecidas e assume de maneira pró-ativa as
com a qualidade; consequências para futuras correções.

O time não tem consciência dos princípios Isso é verdade para times com excelentes arquitetos.
básicos de design e então nem sequer imagina Eles fornecem uma solução que agrega valor ao negócio,
a bagunça que estão adicionando; mas depois de completar a solução, eles entendem que
a abordagem de design poderia ter sido melhor.

Suponha uma unidade de medida para o valor (funcionalidades novas, melhorias de performance entre outros) do software
que estamos entregando, algo hipotético. Essa medida vamos chamar de “F”.

Assim com essa medida, vamos pensar em um time que é capaz de entregar 100 F por semana. Porém “excepcionalmente”
essa semana existe uma funcionalidade muito importante que deve ser entregue, a qual necessita que sejam entregues 150 F.
O que fazer? O time pega um empréstimo, utilizando POG (gambiarra), para que o time consiga entregar os 50 Fs a mais
necessários nessa semana atípica.

Nas semanas seguintes o time continua com a meta de entregar os 100 F por semana. Porém um empréstimo foi contraído, e
está começando a cobrar os juros. Então o time não consegue desenvolver com o mesmo desempenho, pois a gambiarra feita
na semana excepcional está com problemas no design, bugs e outras coisas que fazem com que a atenção do time também
esteja focada nessa funcionalidade muito importante. Suponha que isso custe 20% dos F entregues nessas semanas,
entregando apenas 80 F de funcionalidades novas.

Se esse pagamento de juros continuar por 3 semanas custando 20% por semana, por exemplo, a sua dívida técnica terá
custado 60 Fs e você emprestou somente 50 Fs para utilizar a mais naquela semana excepcional. Com esse simples ponto já
estamos percebendo que não está valendo a pena ter se endividado no começo.

Percebeu que se em algum momento você não quitar a sua dívida técnica a sua geração de valor em software fica
comprometida? E a situação é muito pior quando mesmo já tendo uma dívida técnica resolvemos contrair mais um
empréstimo. Assim a dívida aumenta, e chega num determinado momento em que simplesmente não entregamos mais valor,
mas somente ficamos pagando juros em uma gigantesca bola de neve
Curva do Pânico

Uma pressão pelo aumento da


produtividade inicia-se quando o time
percebe que precisa adiar a entrega por
algum desses motivos:

Erros na estimativa
Pressão por um prazo menor
Falta de habilidade/conhecimento do
time
Juros da dívida técnica acumulado
Entre outros motivos

Adicionais mais pessoas não adianta: A


Lei de Brooks é um conceito criado por
Fred Brooks em 1975 em seu livro "O
mítico homem-mês". Segundo Brooks,
adicionar mais indivíduos a um projeto
que já está atrasado não irá torná-lo
pronto mais rápido, mas pelo contrário,
irá atrasá-lo ainda mais

Trabalhar mais horas por dia pode funcionar, aumentando de forma efetiva a produtividade. Mas esta não é uma
situação sustentável, desgasta a equipe que acaba sacrificando ainda mais a qualidade e gerando mais dívida
técnica.

Optar conscientemente por menos controle de qualidade pode funcionar a curto prazo, mas ao longo do tempo,
o acúmulo de juros da dívida técnica, fatalmente, implicará em novos atrasos e mais pânico.

Ao contrário disso, será que não poderíamos negociar com o cliente? Se não for uma opção mexer no
prazo, podemos negociar o escopo. Priorizar as funcionalidades mais importantes, que agreguem
valor de negócio e retirar/simplificar funcionalidades menos importantes.

Por outro lado, se precisarmos contornar a qualidade para ter um benefício imediato, contraindo
dívida técnica, temos que ter bem claro em nossas mentes (e na do cliente): será necessário pagar
essa dívida o quanto antes, de preferência já na próxima iteração.

Abrir mão da qualidade dificilmente será uma boa opção. Não dá para construir algo bom
em cima de uma base podre. Uma vez que o código está deteriorado, recuperar sua
qualidade é difícil e caro

Conhecer os principais conceitos relacionados à arquitetura de


software e padrões arquiteturais;
Conhecer a geração automática de documentação via o uso de
ferramenta; SEMANA 7
Conhecer os principais conceitos relacionados à comunicação com o
usuário.
ARQUITETURA DE SOFTWARE PADRÕES ARQUITETURAIS

Preocupa-se com projeto em mais alto nível. Propõem uma organização de mais alto nível para
Inclui as decisões de projeto mais sistemas de software, incluindo seus principais módulos
importantes em um sistema. e as relações entre eles. Essas relações definem, por
Estilos arquiteturais propõem que os exemplo, que um módulo A pode (ou não pode) usar os
módulos de um sistema devem ser serviços de um módulo B. Padrões focam em soluções
organizados de uma determinado modo, o para problemas específicos de arquitetura
que não necessariamente ocorre visando
resolver um problema específico.

Arquitetura em Camadas
É um dos padrões arquiteturais mais usados, desde que os primeiros sistemas de software de maior porte
foram construídos nas décadas de 60 e 70. Em sistemas que seguem esse padrão, as classes são
organizadas em módulos de maior tamanho, chamados de camadas. As camadas são dispostas de forma
hierárquica, como em um bolo. Assim, uma camada somente pode usar serviços — isto é, chamar métodos,
instanciar objetos, estender classes, declarar parâmetros, lançar exceções, etc. — da camada imediatamente
inferior. Dentre outras aplicações, arquiteturas em camadas são muito usadas na implementação de
protocolos de rede. Uma arquitetura em camadas particiona a complexidade envolvida no desenvolvimento
de um sistema em componentes menores (as camadas). Como uma segunda vantagem, ela disciplina as
dependências entre essas camadas.

Duas Camadas: camadas de interface e de aplicação são unidas em uma única camada, que executa no
cliente. A camada restante continua sendo o banco de dados. A desvantagem de arquiteturas em duas
camadas é que todo o processamento ocorre nos clientes, que, portanto, devem ter um maior poder de
computação.

Três Camadas: comum na construção de sistemas de informação corporativos, é composta por (i)
Interface com o Usuário, também chamada de camada de apresentação, é responsável por toda
interação com o usuário; (ii) Lógica de Negócio, também conhecida como camada de aplicação,
implementa as regras de negócio do sistema e (iii) Banco de Dados, que armazena os dados manipulados
pelo sistema. Normalmente, uma arquitetura em três camadas é uma arquitetura distribuída. Isto é, a
camada de interface executa na máquina dos clientes. A camada de negócio executa em um servidor,
muitas vezes chamado de servidor de aplicação.
MVC (Model-View-Controller): define que as classes de um sistema devem ser organizadas em três
grupos:
Visão: classes responsáveis pela apresentação da interface gráfica
do sistema, incluindo janelas, botões, menus, barras de rolagem, etc.
Controladores: classes que tratam e interpretam eventos gerados
por dispositivos de entrada, como mouse e teclado. Como resultado
de tais eventos, Controladoras podem solicitar uma alteração no
estado do Modelo ou da Visão.
Modelo: classes que armazenam os dados manipulados pela
aplicação e que têm a ver com o domínio do sistema em construção.
Assim, classes de modelo não têm qualquer conhecimento ou
dependência para classes de Visão e Controladoras. Além de dados,
classes de modelo podem conter métodos que alteram o estado dos
objetos de domínio.

vantagens
favorece a especialização do trabalho de desenvolvimento.
permite que classes de Modelo sejam usadas por diferentes Visões
favorece testabilidade.

Microsserviços
Arquiteturas baseadas em microsserviços tornaram-se possíveis devido ao aparecimento de plataformas de
computação em nuvem. Certos grupos de módulos são executados em processos independentes, sem
compartilhamento de memória. Ou seja, o sistema é decomposto em módulos não apenas em tempo de
desenvolvimento, mas também em tempo de execução. Com isso, as chances de que mudanças em um
módulo causem problemas em outros módulos ficam bem menores.
Monolito Microsserviços
vantagens
(1) eles permitem a evolução mais rápida e
independente de um sistema, permitindo que
cada time tenha seu próprio regime de liberação
de novas releases; (2) eles permitem escalar um
sistema em um nível de granularidade mais fino
do que é possível com monolitos; (3) como os
microsserviços são autônomos e independentes
eles podem ser implementados em tecnologias
diferentes, incluindo linguagens de programação,
frameworks e bancos de dados e (4) podemos ter
falhas parciais.

Desvantagens
Complexidade
Latência
Transações Distribuídas

Arquiteturas Orientadas a Mensagens


este tipo de arquitetura, a comunicação entre clientes e servidores é mediada por um terceiro serviço que
tem a única função de prover uma fila de mensagens
Os clientes atuam como produtores de informações, isto é, eles inserem mensagens na fila. E os servidores
atuam como consumidores de mensagens, isto é, eles retiram mensagens da fila e processam a informação
contida nelas. Uma mensagem é um registro (ou um objeto) com um conjunto de dados. E uma fila de
mensagens é uma estrutura do tipo FIFO (first in, first out), isto é, a primeira mensagem a entrar na fila é a
primeira a ser consumida pelo servidor.
Com o uso de filas de mensagens, a comunicação pelo lado do cliente torna-se assíncrona, pois uma vez que
a informação seja colocada na fila, o cliente está liberado para continuar seu processamento.
Além de permitirem comunicação assíncrona entre clientes e servidores, filas de mensagens viabilizam duas
formas de desacoplamento entre os componentes de uma aplicação distribuída:
Desacoplamento no espaço: clientes não precisam conhecer os servidores e vice-versa. Em outras
palavras, o cliente é exclusivamente um produtor de informações. Mas ele não precisa saber quem vai
consumir essa informação. O raciocínio inverso vale para servidores.
Desacoplamento no tempo: clientes e servidores não precisam estar simultaneamente disponíveis
para se comunicarem. Se o servidor estiver fora do ar, os clientes podem continuar produzindo
mensagens e colocando-as na fila. Quando o servidor voltar a funcionar, ele irá processar essas
mensagens.

Arquiteturas Publish/Subscribe
Em arquiteturas publish/subscribe, as mensagens são chamadas de eventos. Os componentes da
arquitetura são chamados de publicadores (publishers) e assinantes (subscribers) de eventos. Publicadores
produzem eventos e os publicam no serviço de publish/subscribe, que normalmente executa em uma
máquina separada. Assinantes devem previamente assinar eventos de seu interesse. Quando um evento é
publicado, os seus assinantes são notificados.
Assim como ocorre quando se usa filas de mensagens,
arquiteturas publish/subscribe também oferecem
desacoplamento no espaço e no tempo. No entanto,
existem duas diferenças principais entre publish/subscribe e
sistemas baseados em filas de mensagens:

Em publish/subscribe, um evento gera notificações em todos os seus assinantes. Por outro lado, em filas de
mensagens, as mensagens são sempre consumidas — isto é, retiradas da fila — por um único servidor.
Portanto, em publish/subscribe temos um estilo de comunicação de 1 para n, também conhecido como
comunicação em grupo. Já em filas de mensagens, a comunicação é 1 para 1, também chamada de
comunicação ponto-a-ponto.

Em publish/subscribe, os assinantes são notificados assincronamente. Primeiro, eles assinam certos eventos
e, então, continuam seu processamento. Quando o evento de interesse ocorre, eles são notificados por meio
da execução de um determinado método. Por outro lado, quando se usa uma fila de mensagens, os
servidores — isto é, os consumidores das mensagens — têm que puxar (pull) as mensagens da fila.

Em alguns sistemas publish/subscribe, eventos são organizados em tópicos, que funcionam como categorias
de eventos. Quando um publicador produz um evento, ele deve informar seu tópico. Assim, clientes não
precisam assinar todos os eventos que ocorrem no sistema, mas apenas eventos de um determinado tópico.

Arquiteturas publish/subscribe são, às vezes, chamadas de arquiteturas orientadas a eventos.

JAVADOC

A ferramenta JavaDoc é uma ferramenta geradora de documentos na linguagem de programação Java para
gerar documentação padrão em formato HTML. Ele gera documentação de API . Ele analisa a documentação do
anúncio de declarações em um conjunto de arquivos de origem que descreve classes, métodos, construtores e
campos.
Formato JavaDoc: -
Tem duas partes: - uma descrição que é seguida por tags de bloco.
Alguns ambientes de desenvolvimento integrado (IDE) geram automaticamente o arquivo JavaDoc como NetBeans,
IntelliJ IDEA, Eclipse, etc.

Geração de JavaDoc: -
Para criar um JavaDoc não é necessário compilar o arquivo java. Para criar a API de documentação Java, você
precisa escrever Javadoc seguido pelo nome do arquivo.
javadoc file_name or javadoc package_name
Após a execução bem-sucedida do comando acima, vários arquivos HTML serão criados, abra o arquivo
denominado index para ver todas as informações sobre as classes.

DESIGN CENTRADO NO USUÁRIO

Na maioria dos modelos de desenvolvimento, pouco se fala sobre a maneira de se conversar com o cliente, ou
quais passos devem ser dados para facilitar a comunicação, com o objetivo de obter informações sobre os
usuários e suas necessidades. Isso acontece porque a Engenharia de Software, onde se originaram esses
modelos, foca no software e não as pessoas que irão utilizá-lo. A ênfase está nos requisitos do sistema e
não nas características dos usuários.

A IHC tem como principal característica preocupar-se com os usuários, observando suas
características físicas e cognitivas para utilizá-las na criação do sistema.

A principal característica da área de Design Centrado no Usuário (User Centered Design ou UCD) é
colocar as necessidades do usuário como um todo no centro das decisões. Não importa se são
necessidades de requisitos ou necessidades cognitivas, é preciso pensar no usuário final em todo o processo
de desenvolvimento.

A UCD precisa entender mais profundamente a


regra do negócio, ou seja: “os usuários não são projetistas, e
Usuários Experientes Fornecem
projetistas não são usuários”.
Informações Genéricas:
Outro fator importante a se considerar Como é feito o controle de estoque? Outro erro é perguntar diretamente aos
são as situações onde o usuário está usuários “o que eles querem”, pois embora
envolvido com suas atividades há muito
Quais são as atividades mais importantes? eles saibam que a tecnologia pode ajudar a
tempo. Por possuir uma prática imensa, Quais são as atividades menos importantes? amenizar ou resolver seus problemas, eles
realiza as tarefas de maneira não são projetistas.
Quais são as dificuldades?
“automática”, sem a necessidade de
pensar muito. Estes usuários costumam Qual processo é mais simples?
não levar muito em consideração todas Qual processo é mais complexo?
as atividades que realizam, e na hora de
passar as informações, acabam usando
frases muito genéricas.
O UCD se preocupa em promover a colaboração entre o projetista e o usuário (que pode ser o próprio cliente ou
um funcionário que usará o sistema). Tanto o projetista como o usuário possuem conhecimentos que devem ser
compartilhados.

o UCD abrange várias áreas, dentre elas:


IHC: com sua preocupação em entender as características físicas e psicocognitivas dos usuários, os fatores
humanos etc;
Engenharia de Usabilidade: que se preocupa em entender os objetivos dos usuários, desenvolver interfaces
para eles etc.

Assim como nos Modelos de Processos de Software, o UCD também possui algumas etapas para auxiliar o projetista
nesse contato com o usuário, permitindo um melhor entrosamento, compreensão e colaboração.

PESQUISA DE DESIGN DESENHO AVALIAÇÃO DE DESENHO

PESQUISA DE DESIGN

Planejamento:
Identifica-se o objetivo, as restrições e as suposições do projeto.
Identificam--se os Stakeholders.

Condução
Este passo objetiva conduzir a investigação na empresa, onde um projetista irá Entrevista face a face;
conhecer as atividades das pessoas e como elas realizam suas tarefas. Perguntas abertas e fechadas;
Recomenda-se o Background Research. Entrevistas remotas/presenciais

Análise
Projetista deverá organizar todas as informações, decidir quais são as
prioridades, o que deve ser feito, o que precisa ser mudado, suas propostas,
enfim, todas as informações necessárias para, depois, conversar com as
pessoas.

Reporte

DESENHO

Ocorre a consolidação de todas as informações obtidas até esse momento.


Prototipagem
Pode ser realizada por meio dos primeiros desenhos da interface. Esses
desenhos são feitos de acordo com as informações obtidas e pelas conversas
feitas durante esta etapa.

AVALIAÇÃO

Terceira e última etapa do UCD, essa etapa avalia tudo o que foi investigado, Heurística;
desenvolvido e representado por meio do Desenho. A avaliação pode ser feita Questionário de satisfação;
com auxílio do usuário, certificando que tudo o que foi planejado e realizado Percurso cognitivo;
está de acordo com as necessidades e as características do usuário. Revisão pelos usuários;

Você também pode gostar