Engenharia de Software - Parte VI - Construção

Aula Engenharia de Software → 2010-09-24
Professor Cristiano

Práticas de Implementação → Programação → Desenvolvimento de Software → XP

XP → Técnicas pra desenvolver o software

A programação (Implementação → processo de escrita de uma programa baseado em uma especificação de projeto) veio antes da Engenharia de Software, Engenharia surgiu quando foi necessário criar sistemas comerciais e não apenas pesquisa para fins militares etc, foi quando os programadores não tinham o conhecimento das regras de negócio, ai foi necessário ter analistas, documentadores, testadores, suporte etc.

É muito importante ter um ambiente bom para se trabalhar durante a fase de implementação para que os programadores possam trabalhar da melhor forma, sem ter muitos problemas para resolver, um programador estressado faz um trabalho pior do que um bem humorado.

A melhor forma de implementar um software é utilizar uma série de incrementos e iterações. Isso é desenvolvimento incremental, ou seja, cada iteração do processo produz um novo incremento do software.

Modularidade: é um conceito fundamental para construção de software pois é mais fácil resolver um problema complexo quando ele é dividido em partes (módulos).

O custo de esforço diminui até determinado ponto utilizando modularidade, quando se transforma tudo em módulos o custo pra pensar e programar as interfaces de cada módulo e na sua integração é muito maior do que se não tivesse dividido em módulos.

Análise → Planejamento → Implementação/Construção → Implantação

Dentro da Implementação existe um conjunto de práticas...
  • Checar pré-requisitos e pós-requisitos;
  • Definir informação a ser ocultada, entradas, saídas e tratamento de erros
  • Projetar testes para os módulos
  • Analisar aspectos de eficiência
  • Pesquisar algoritmos e estruturas de dados, encontrar o melhor.

APÓS ESSAS PRÁTICAS PRÉ-CODIFICAÇÃO, INICIA-SE O REAL DESENVOLVIMENTO, ONDE AINDA SÃO NECESSÁRIAS OUTRAS PRÁTICAS COMO:
  • Desenvolver e documentar cada unidade de software
  • Conduzir e documentar os testes unitários → os testes de unidade servem para avaliar a parte individual de um programa (funções e métodos de classe) para ter certeza de que cada elemento individualmente faça a coisa certa.
  • Atualizar a documentação, se necessário
  • Atualizar os requisitos para o teste de integração → quem vai testar vai partir dos requisitos e verificar se todos foram desenvolvidos, se durante o desenvolvimento algum deles foi modificado é importante alterar para que o testador não pense que foi desenvolvido errado.
  • Avaliar o código e os resultados dos testes de acordo com critérios.
  • Teste de Integração → verificar se os módulos não tem erros associados a interface que impossibilitem a comunicação/integração... normalmente se usa alguma ferramenta automática para testar integração. Pode se ter uma abordagem não-incremental para o teste onde o sistema é agrupado por completo e testado somente no final, pior forma de testar, ou uma abordagem incremental onde o sistema é agrupado em etapas, cada etapa desenvolvida é testada antes de passa para próxima facilitando assim o isolamento do erro.


Engenharia de Software - Diagramas de Visão Estrutural

Os Diagramas Estruturais servem para visualizar, especificar, construir e documentar os sistemas, permitem que todos tenham a mesma visão/idéia do sistema. Os principais (Estruturais) são o Diagrama de Classes, Diagrama de Objetos, Diagrama de Componentes e o Diagrama de Implantação.

O Diagrama de Classes é um dos mais usados, ele que define as características dos objetos. Pode ser usado para modelar os dados que o sistema vai manipular servindo de base para o modelo ER, também é usado para modelar as relações entre os objetos (dependências, associações, generalizações), definir atributos e métodos de cada objeto e a visibilidade dos mesmos (private, public, protected). Algumas IDEs permitem gerar o código a partir deste diagrama. Este aqui é básico pra desenvolver OO.

O Diagrama de Objetos consiste em uma instância do Diagrama de Classes, no qual para cada classe temos a instância do seu objeto com dados reais e seus relacionamentos, normalmente utilizado para esclarecer os relacinoamentos entre as classes e facilitar a modelagem de estruturas complexas de dados. Ajuda identificar possíveis problemas que poderão acontecer com o sistema funcionando pois ao se trabalhar com dados reais pode-se simular algumas rotinas. Bem interessante, vale a pena dar uma estudada.

O Diagrama de Componentes mostra a estrutura de componentes, incluindo os classificadores que eles especificam e os artefatos que eles implementam, até aqui não entendi nada Bolívar, ok, um diagrama de componentes mostra as dependências entre componentes de software, incluindo os classificadores que eles especificam (isto é, classes de implementação -> interfaces do sistema) e os artefatos que eles implementam (isto é, arquivos de códigos-fonte, arquivos de código binário, executáveis, scripts). Eu relamente não consegui pensar em alguma utilidade para este diagrama, ele basicamente mapeia os arquivos do teu sistema e os relacionamentos entre eles, tipo, arquivo index.html ligado com login.php ligado com verificalogin.php. Editando aqui: Achei um conteúdo na Net onde usam este diagrama para mapear os módulos e como eles estão relacionados, qual módulo depende de qual pra funcionar etc, achei legal.

O Diagrama de Implantação/Implementação, assim como o Diagrama de Componentes, mostra os aspectos de implementação física, a estrutura do sistema em tempo de execução (run-time), tipo, qual máquina vai rodar o sistema, por qual protocolo (TCP/IP) se dará comunicação, quais as interfaces (celular, tv, geladeira, caixa auto-atendimento banco...), achei tosco interessanta para mostrar pros clientes, não ajuda muito pra desenvolver, pouco utilizado também.

Referências: Melo, Ana Cristina. Desenvolvendo Aplicações com UML. Rio de Janeiro: Brasport, 2002.

Inteligência Artificial - 8 Rainhas

Noite inspirada a minha, postando tudo que vem na cabeça. Você já ouviu falar do desafio das 8 rainhas no Xadrez? Bom, este é um exemplo em que se pode usar heurística para encontrar as soluções já que o número de combinações é um pouco grande, no Calc (Excel like), consegui montar duas soluções, segue abaixo.


X X X X X R X X
R X X X X X X X
X X X X R X X X
X R X X X X X X
X X X X X X X R
X X R X X X X X
X X X X X X R X
X X X R X X X X


X X X X X R6 X X
X R1 X X X X X X
X X X X X X R7 X
R2 X X X X X X X
X X R3 X X X X X
X X X X R4 X X X
X X X X X X X R8
X X X R5 X X X X

Segundo o professor Helmuth, existem 96 combinações /4 = 24 originais. Meu grupo ficou a cargo de desenvolver o programa pra encontrar as soluções, parece que vamos fazer em Java, gostaria de fazer também em C# e Pascal -> Delphi, daqui uns dias posto aqui os fontes e mais detalhes sobre IA, é muito show!

Engenharia de Software - Parte V - Métodos Ágeis

Métodos Ágeis

Valores:
  • Adaptação a mudança mais do que seguir um plano;
  • Software funcionando é mais importante que documentação completa e detalhada;
  • Indivíduos e iterações são mais importantes que processos e ferramentas;
  • Colaboração do cliente mais do que negociação do contrato;
Princípios:
1: A mais alta prioridade é a satisfação do cliente através da libertação mais rápida e contínua de software de valor.
2: Receba bem as mudanças, mesmo em estágios tardios de desenvolvimento. Processos ágeis devem admitir mudanças que trazem vantagens competitivas para o cliente.
3: Libere software com frequência de um par de meses, com preferência para uma escala de tempo mais curta, 2 ou 3 semanas.
4: Mantenha as pessoas dos negócios e os desenvolvedores trabalhando juntos a maior parte do tempo do projeto.
5: Construa projetos com indivíduos motivados, dê a eles o ambiente e suporte que precisam e confie neles para ter o trabalho realizado.
6: O método mais eficiente e efetivo de passar informação entre uma equipe é através da conversação cara-a-cara, pessoalmente.
7: Software funcionando é a principal medida de progresso.
8: Processos ágeis promovem desenvolvimento sustentável. Os patrocinadores, desenvolvedores e usuários devem ser capazes de manter conversação pacífica indefinidamente.
9: A atenção contínua para a excelência técnica e um bom projeto aprimora a agilidade.
10: Simplicidade – a arte de maximizar a quantidade de trabalho não feito é essencial. Fazer apenas o necessário.
11: As melhores arquiteturas, requerimentos e projetos emergem de equipes auto organizadas.
12: Em intervalos regulares as equipes devem refletir sobre como se tornarem mais efetivas e então refinarem e ajustarem seu comportamento de acordo. Buscar aumento de produtividade.


SCRUM

Framework de gerenciamento de projetos e controle. Libera funcionalidades a cada 30 dias. Compatível com a ISO 9001, MPS.BR nível C, e CMMI nível 3. Simples de entender, porém difícil de aplicar.

Sistemas Adaptativos Complexos – CAS: É um sistema formado por uma rede dinâmica de agentes atuando em paralelo, agindo e reagindo constantemente ao que os outros agentes estão fazendo. O controle de um CAS tende a ser disperso e descentralizado. Os “agilistas” consideram o desenvolvimento de software como um CAS.

Uma metodologia pode ser considerada ágil quando é:
  • Incremental: liberar pequenas versões em iterações de curta duração;
  • Colaborativa: cliente e desenvolvedores trabalhando juntos em constante comunicação;
  • Direta: O método em si é simples de aprender e modificar;
  • Adaptativa: Capaz de responder as mudanças até último instante.

Elementos do SCRUM

… → Product Backlog → Reuniões de Planejamento → Sprint Backlog → Burndown → Impedimentos → Product backlog → ...

Papéis
  • Product Owner: Dono do Produto, conhece o negócio e representa demais stakeholders. Estabelece e comunica a visão do produto. Cria o release plan e o product backlog inicial. Monitora o projeto com metas de ROI. Responde e apóia o Scrum Team para sanear dúvidas sobre requisitos. Decide quando serão liberadas as versões do produto. Atualiza e prioriza continuamente o product backlog para assegurar que as funcionalidades mais valiosas são produzidas primeiro. É o Gerente de Produto assumindo parcelas do gerente de Projetos.
  • Scrum Master: Semelhante ao GP, responsável por liderar o time. Acompanha o progresso do trabalho, verifica se está sendo seguidos os padrões e inspeciona as implementações.
  • Scrum Team: Time multi-fucional que reúne todas especializações necessárias para implementar segmentos completos de software a cada sprint. Identifica impedimentos e reporta ao Scrum Master. Realiza a reunião diária de Daily Scrum para garantir comunicação plena do time e sincronismo de tarefas, de pé, no máximo 15 minutos. Pode lançar mão de quaisquer recursos disponíveis para se adaptarem a circunstancias não previstas.
  • Stakeholder: São todos os interessados no software em desenvolvimento a começar por clientes, usuários finais, equipe de marketing e vendas, scrum master, management e outros. São representados pelo dono do produto que deve conhecer o interesse e coletar ideias de todos para contruir o Product backlog.
  • Management: corrensponde ao grupo diretor, que provê fundos ($$) para o projeto ou responsável em última instância.

Detalhamento dos Elementos do SCRUM

→ Product Backlog
Este documento contém todos os itens que devem ser implementados no produto alvo. É atualizado sempre que houverem novas demandas para o produto alvo. Cada item deve ser estimado para determinar o tempo necessário para desenvolvê-lo.

→ Reuniões de Planejamento
Define-se os itens do Product Backlog que serão adicionados no sprint atual. Planeja-se o total de horas da equipe destinada ao sprint. A estimativa de cada item do Product Backlog diminui o total de horas planejada para o Sprint, o planejamento é encerrado quando acaba-se o total de horas que a equipe tem disponível, normalmente 40 horas. Não faz hora extra, planeja fazer apenas o possível para a semana ou dia.

→ Sprint Backlog
É a lista de itens adicionados no sprint atual, sprintpost-it grande e colado na coluna Backlog do quadro. Caso o item seja complexo para desenvolver deve-se detalhar em atividades menores através do post-it médio. Pode-se ainda ir classificando os post-it em execução, os feitos, os que faltam e os impedimentos.

→ Impedimentos
Tarefas não relacionadas com o desenvolvimento do sprint que devem ser descritas na coluna “BurnDown”. Exemplos: Reunião com clientes, suportes...

→ Burndown
Aqui cola-se os post-it com os impedimentos.

*** Sprint: um sprint é uma iteração de duas semanas a 30 dias. Quem atualiza os post-it no quadro são os próprios desenvolvedores, analistas... assim fica visível para todos o que cada um está fazendo e acredito que também motive as pessoas a trabalharem mais para terminarem logo os itens e irem tirando de “em execução” e “mostrar serviço”. No lado esquerdo do post-it marca-se a estimativa e no lado direito o tempo realizado. No verso do post-it pode-se citar os passos de testes. No final do projeto tirar foto e remover os post-it.

Críticas sobre métodos ágeis:
  • Falta estrutura e documentação realmente necessária.
  • Requer desenvolvedores experientes e disciplinados.
  • Costumam resultar em desenho insuficiente.
  • Requer mudança cultural muito grande.
  • Dificultam negociações contratuais.
  • Dificultam estimativas de esforços, custos e prazos para projetos maiores.
  • Mostram dificuldades de tratamento dos requisitos funcionais e não funcionais.


Método XP

O mais conhecido e radical dos métodos ágeis, Extreme Programming.

Jogo do Planejamento: Os desenvolvedores estimam esforço, o cliente define escopo e prazo.
Liberações pequenas: Iterações duram de 2 a 3 semanas.
Metáfora: A forma do produto é definida por uma metáfora.
Desenho Simples: O código resultante passe em todos os testes, comunique tudo que os programadores querem comunicar..
Desenvolvimento dirigido por testes: Testes de unidades são escritos o tempo todo.
Programação em pares: Todo o código é escrito conjuntamente por 2 programadores na mesma estação de trabalho com papéis de piloto e navegador.
Integração contínua: Sempre integrado.
Propriedade coletiva: Todo programador pode alterar qualquer código.
Cliente Local: representante do cliente disponível durante o tempo todo.
Semana de 40 horas: Horas extras são proibidas.
Espaço aberto: A equipe trabalha em baias em uma única sala.
Regras adaptáveis: A equipe se compromete com as regras anteriores, mas pode alterá-las sempre que necessário.
Medir a velocidade do projeto: Medir o progresso.
Trocar as pessoas com frequência: trocar entre as diversas partes do projeto.
Reunião diária de pé.
Plano de liberações: Plano detalhado de cada iteração.
Padrões de codificação.
Otimizações: Otimizar no final do projeto.
Protótipos: Desenvolvimento de protótipos.

Engenharia de Software - Parte IV - GP

Continuando a série, aula sobre gerenciamento de projetos.

Projeto: Segundo PMI (Project Management Institute), um projeto é um esforço temporário (início, meio e fim) empreendido para criar um produto, serviço ou resultado exclusivo, único. A elaboração é progressiva, o escopo muda no decorrer do projeto.

A gestão de projetos é uma atividade complementar (guarda-chuva) estando presente em todas as fases do projeto. Envolve planejamento, monitoração e o controle do pessoal.

A Gestão de Projetos surgiu para melhorar, organizar os processos dentro dos projetos.

4P → Pessoas, Projeto, Processo, Produto

As pessoas executam processos dentro de um projeto para chegar a um determinado produto.

As 9 áreas do conhecimento GP
Escopo, Comunicação, Tempo, RH, Integração, Riscos, Qualidade, Aquisições e Custos. Essas áreas normalmente estão dentro de 5 fases maiores chamadas “Genéricas”.

5 fases Genéricas presentes nas 9 áreas de conhecimento da Gestão de Projet

  • Inicialização

    • O que fazer? Quem é o GP? Qual equipe? Expectativa de resultado (cliente)? Qual o ROI? Está alinhado à estratégia da empresa?

  • Planejamento

    • É um processo de aprendizado com o cliente, seu valor está mais no seu exercício do que no plano que ele gera.

  • Execução

    • Fase que toma mais tempo no cronograma, construção do sistema.

  • Controle

    • Presente paralelamente as outras fases. Monitorar e intervir quando necessário.

  • Encerramento

    • Avaliação ROI; Reunião lições aprendidas; Ganhos Tecnológicos; Resultados;

  • Detalhamento das 9 áreas


    Escopo

    • 1 Planejamento: Coletar requisitos;

    • 2 Planejamento: Definir escopo;

    • 3 Planejamento: Criar EAP (Estrutura Analítica de Processo → WBS

    • 4 Controle: Verificar escopo;

    • 5 Controle: Controlar escopo;

  • Comunicação
    • 1 Inicialização: Identificar Stakeholders (partes interessadas → patrocinadores, cliente, governo, qualquer um que possa ser afetado pelo projeto);
    • 2 Planejamento: Planejar comunicações (Com quem vai falar, quando e de que forma);
    • 3 Execução: Distribuir informações;
    • 4 Execução: Gerenciar expectativas;
    • 5 Controle: Relatar desempenho;

  • Tempo

    • 1 Planejamento: Definir atividades mais detalhadas, elas já estão abstratas no WBS;

    • 2 Planejamento: Sequenciar atividades (quais precisam ser feitas primeiro para possibilitar as outras...);

    • 3 Planejamento: Estimar recursos (pessoas, tecnologias, servidores...);

    • 4 Planejamento: Estimar duração (por atividade, utilizar parâmetros de projetos anteriores se existirem);

    • 5 Planejamento: Desenvolver cronograma;

    • 6 Controle: Controlar cronograma;

  • RH

    • 1 Planejamento: Desenvolver plano de RH (matriz com habilidades dos colaboradores para saber os recursos que tem disponível para projeto, planejar treinamentos);

    • 2 Execução: Contratar/mobilizar equipe (mobilizar a equipe e caso necessário pode-se contratar novas pessoas);

    • 3 Execução: Desenvolver equipe (treinamentos se necessário);

    • 4 Controle: Gerenciar a equipe;

  • Integração: área central, consome cerca de 70% tempo do GP

    • 1 Inicialização: Desenvolver termo de abertura;

    • 2 Planejamento: Desenvolver Plano do Projeto;

    • 3 Execução: Orientar e gerenciar execução;

    • 4 Controle: Monitorar e controlar o trabalho;

    • 5 Controle: Controle integrado de mudanças;

    • 6 Encerramento: Encerrar Fase/Projeto (reunião de lições aprendidas...).

  • Riscos

    • 1 …? Faltou comentar este na aula.

  • Qualidade

    • 1 Planejamento: Planejar a qualidade (padrões de tela, requisitos bem feitos...);

    • 2 Execução: Garantia da qualidade (medir o processo, resultados);

    • 3 Controle: Controle da qualidade (acompanhamento do processo de garantia de qualidade, se está sendo feito);

  • Aquisições

    • 1 Planejamento: Planejar aquisições (o que comprar e de quem);

    • 2 Execução: Conduzir aquisições;

    • 3 Controle: Administrar aquisições (chegaram dentro do prazo, transporte adequado);

    • 4 Encerramento: Encerrar aquisições;
  • Custos


    • 1 Planejamento: Estimar custos (Salários, equipamentos, viagens...);

    • 2 Planejamento: Determinar Orçamento;

    • 3 Controle: Controlar custos;

  •