26 outubro, 2014

Requisitos de Software

Requisitos de software

Trabalha com funcionalidades e qualidades que o software vai alcançar.

Tipos: 

Requisitos do usuário:
    Expresso em linguagem natural
    O que o usuário espera encontrar no sistema
 
Requisitos do sistema:
    Detalha as funções e restrições do sistema
     

Classificação dos requisitos:

    - Funcionais
    Especifica as funcionalidades do sistema
 
    - Não funcionais
    Restrições em cima dos funcionais
        Tipos: De produtos, Organizacionais e Externos e vários outros subtipos.
 
    - Domínio (negócio)
    Restrições que vêm do ambiente de negócio do sistema.
 

Documentação de requisitos 

Os requisitos devem ter completeza e consistência
Os requisitos devem ter IDs
Organizar os requisitos por alguma ordem
DEVE (obrigatório) e DEVERIA (desejável)
Evite sentenças muito longas
Evite conjunçoes como "ou", "e", etc.


A prática da engenharia de software


Roger Pressman define dois princípios que guiam a prática da engenharia de software:


  • Princípios que guiam o processo
  • Princípios que guiam a prática


Principios que guiam o processo

  • Seja ágil
  • Concnetre-se na qualidade em todas as etapas
  • Esteja pronto para adaptações
  • Monte uma equipe efetiva
  • Estabeleça mecanismos para comunicação e coordenação
  • Gerencie mudanças
  • Avalie riscos
  • Gere artefatos que forneçam valor para outros artefatos


Principios que guiam a prática



  • Divida e  consquiste
  • Compreenda o uso da abastração
  • Esforce-se por consistência
  • Foque na transferência de informação
  • Construa software que apresente modularidade efetiva
  • Padronize
  • Quando possível, represente o problema e sua solução sob perspectivas diferentes
  • Lembre-se de que alguém fará manutenção no software


01 outubro, 2014

Processo Ágil


Manifesto do Desenvolvimento de Software Ágil


  • Indivíduos e interação acima de processos e ferramentas;
  • Software em funcionamento acima de documentação abrangente;
  • Colaboração com o cliente acima de negociação de contratos;
  • Responder a mudanças acima de seguir um plano.

Agile é rápido nas mudanças e eficaz na comunicação com os envolvidos, faz entregas incrementais.
Segundo o gráfico, com agilidade a curva do custo a mudança é diminuido.

Princípios da Agilidade

  1. A maior prioridade é satisfazer o cliente por meio de entregas continuas;
  2. Acolha bem os pedidos de alterações no software;
  3. Entregue software em funcionamento frequentemente;
  4. Comercial e desenvolvedor trabalham juntos;
  5. Trabalhe em trono de indivíduos motivados;
  6. O método mais eficiente de transmitir informações para equipe é uma conversa aberta;
  7. O software em funcionamento é a principal medida de progresso;
  8. Os processos ágeis promovem desenvolvimento sustentável;
  9. Atenção contínua com a excelência técnica;
  10. Simplicidade;
  11. Os melhores projetos emergem de equipes auto-organizaveis;
  12. Regularmente a equipe faz uma auto-avaliação para ver como se tornar mais eficiente. 


Fatores Humanos

  • Competência
  • Foco comum
  • Colaboração
  • Habilidade na tomada de decisão
  • Habilidade de solução de problemas confusos
  • Confiança mútua e respeito
  • Auto-organização

Extreme Programming (XP) (Kent Beck)


Valores Básicos

  • Comunicação (tanto com o cliente quanto o time)
  • Simplicidade (fazer somente o necessário)
  • Feedback (deve ser constante)
  • Coragem (ou disciplina)
  • Respeito (pelo software e pela equipe)

Processo Ágil: XP


  • Planejamento
    • Começa com a criação das histórias dos usuários
    • Equipe avalia e estima o custo das histórias
    • Histórias são agrupadas em um incremento de software
    • Define-se uma data de entrega do incremento
    • O primeiro é referência para acelerar os demais incrementos
  • Desenho (Design)
    • Princípio KISS
    • Uso de cartões CRC
    • Grandes problemas são resolvidos com prototipação
    • Encoraja a refatoração
    • Recomenda os testes unitários antes de codificar
    • Encoraja a programação em par
  • Teste
    • Todos os testes unitários são executados diariamente
    • Testes de avaliação são definidos pelo cliente


Processo Ágil: Desenvolvimento de software adaptativo

  • Planejamento dirigindo a missão
  • Foco no desenvolvimento baseado em componentes
  • Uso de time-boxing (só trata um certo número de requisitos por vez)
  • Consideração explicita de riscos
  • Ênfase na colaboração para entendimento dos requisitos
  • Ênfase na "aprendizagem" durante o processo  

Processo Ágil: Método Dinâmico de Desenvolvimento de Sistemas (DSDM)

  • Promovido pelo consórcio DSDM
  • Similar ao XP e ASD em muitos aspectos

Processo Ágil: SCRUM

  • O trabalho do desenvolvimento é dividido em pacotes;
  • Testes e documentação são realizados e construídos a medida que o produto é construído
  • O trabalho ocorre em "sprints" derivados de um "backlog" de requisitos
  • As reuniões são curtas
  • "Demos" são entregues ao cliente no "time-box" alocado

Processo Ágil: Modelagem Ágil


  • Modelagem com um propósito
  • Uso de múltiplos modelos
  • Facilidade de manutenção dos modelos
  • Conteúdo é mais importante que a representação
  • Conhecimento de modelos e ferramentas para criá-los
  • Adaptações da abordagem de modelagem às características da equipe

Processo Ágil: Crystal

  • Permite adaptabilidade baseada nas características do problema
  • Ênfase na comunicação face a face
  • Sugere-se o uso de workshops de reflexão para revisão da forma de trabalho da equipe

Processo Ágil: Feature Driven Development (FDD)

  • Ênfase na definição de características (feauture)
    • Uma feature é uma "função" valorizada pelo cliente que pode ser implementada em duas semanas ou menos
  • Usa um template para criar uma lista de features e então, iniciar o planejamento
  • O design é a construção do FDD


Processo Ágil: Agile Unified Process (AUP)


  • Adota uma filosofia:
    • Serial para o que é amplo
    • Iterativa para o que é particular
  • Atividades
    • Modelagem
    • Implementação
    • Teste
    • Aplicação
    • Configuração e genreciamento de projeto
    • Gerenciamento do ambiente






24 setembro, 2014

Processos de desenvolvimento de software

Citações

Software de qualidade é aquele que atende seus requisitos
Processo de software é uma metodologia para as atividades, ações e tarefas necessárias para desenvolver um software de alta qualidade.
Uma ideia proposta por uma série de renomados engenheiros de software: um processo de software deve priorizar flexibilidade, extensibilidade e velocidade de desenvolvimento, acima da alta qualidade.
Quando restrições cruzam múltiplas funções, recursos e informações do sistema, elas são, frequentemente, denominadas restrições cruzadas. (Aspecto) 

Atividades Metodológicas

São atividades genéricas que podem ser encontradas em qualquer processo de engenharia de software, ela define 5 passos essenciais:

  • Comunicação
  • Planejamento
  • Modelagem
  • Construção
  • Entrega


Atividades de Apoio (Umbrella activities)

Essas atividades complementam e auxiliam as atividades metodologicas, são elas:

  • Controle e acompanhamento do projeto
  • Administração de riscos
  • Garantia de qualidade
  • Revisões técnicas
  • Medição
  • Gerenciamento de configuração de software
  • Gerenciamento da reusabilidade
  • Preparo e produção de artefatos

Fluxo de Processo

Todo o processo de engenharia de software segue um dos quatro tipos de fluxo de processo:

  • Linear
  • Iterativo
  • Evolucionário
  • Paralelo


Padrões de Processo

Nome do Padrão
Forças
Tipo (Padrão de estágio, tarefas ou fases)
Contexto inicial
Problema
Solução
Contexto Resultante
Padrões relativos
Usos conhecidos e exemplos

Avaliação e aperfeiçoamento dos processos de software

  • SCAMPI (CMMI)
  • CBA IPI (CMM)
  • SPICE (ISO/IEC15504)
  • ISO 9001:2000

Modelos de Software

Modelo de Processo Prescritivo

A engenharia de software e o seu "produto" beiram o caos, ao mesmo tempo que está tudo organizado, está muito próximo também de surpresas. O modelo de processo prescritivo tenta trazer ordem ao caos através de um conjunto de elementos de processo como, atividades metodologicas, ações de engenharia, tarefas, produtos de trabalho, garantia de qualidade, etc.
Todos os modelos de processo de software (listados abaixo) podem acomodar as atividades metodologicas genéricas (comunição, planejamento, modelagem, construção e entrega).
Os modelos de processo prescritvos são conhecidos como modelos tradicionais.


  • Modelo em cascata

Também conhecido como ciclo de vida clássico e waterfall model. Existe uma variação desse modelo chamado Modelo V, em que a segunda parte existem testes que validam o software e se necessário pode-se corrigir antes de entregar o produto.
    • Adia identificação de riscos
    • Atrasa os testes do sistema
    • Difícil entrega parcial do produto
    • Difícil lidar com mudança de requisitos

  • Incremental
O modelo incremental aplica sequencias lineares, de forma escalonada, a medida que o tempo vai avançando. Cada sequência linear gera "incrementais" (entregáveis/aprovados/liberados) do software. Exemplo do editor de textos, a cada incremento, novas funcionalidades são adicionadas.

  • Evolucionário (espiral e prototipação)
    • Prototipação (Problemas conhecidos)
      • O cliente enxerga o prototipo como o software já pronto, e exige que com algumas modificações ele se torne operacional, constantemente a gerência de desenvolvimento aceita.
      • Na pressa de apresentar um protótipo, o engenheiro de software opta por ferramentas como liguagem de programação, sistema operacional que lhe são mais intimas simplesmente. Após um tempo, pode se acomodar com tais escolhas e o projeto acaba adotando definitivamente essas tecnologias, que podem não ser as ideais. 
    • Espiral
      • Parecido com o incremental, o software evolui a cada volta na espiral.

  • Concorrente 
Define uma rede de processos que são ligados e possuem estados como concluido, aguardando modificações, em exame, inativo, etc.

Modelo de Processo Especializado

  • Baseado em Componentes
    • Esse modelo desenvolve aplicações a partir de componentes de software pré-empacotados.
    • As atividades de modelagem e construção desse modelo começam com a identificação de possíveis candidatos a componentes.
  • Métodos formais
    • Através de análise matemática são facilmente descobertos problemas no software como ambiguidade, incompletude e inconsistência
    • Desvantagens: consome muito tempo e dinheiro, poucos desenvolvedores capacitados, dificil comunicação com o cliente.

PSP (Personal Software Process)

O PSP enfatiza a medição pessoal do todo o processo desde o planejamento até a entrega do software. Com esses dados de medição coletados, o engenheiro de software pode trabalhar em melhorar as partes falhas do processo executados por ele mesmo. 
O PSP não foi largamente adotado pelo setor, os motivos têm mais a ver com a natureza humana e com a inércia organizacional do que propriamente com o processo desenvolvido por Watts Humphrey.
  • Planejamento
  • Projeto de alto nível
  • Revisão de projeto de alto nível
  • Desenvolvimento
  • Autópsia

TSP (Team Software Process)

Os principais objetivos do TSP são:
  • Equipes auto-dirigidas
  • Mostrar gerentes como treinar e manter equipes
  • Acelerar o aperfeiçoamento dos processos de software
  • Fornecer orientações para melhorias a organizações
  • Preparar universitário para trabalhar em equipe a nivel industrial
As atividades metodológicas do TSP são:
  • Lançamento do projeto
  • Projeto de alto nivel
  • Implementação
  • Integração e testes
  • Autópsia

Assim como o PSP, essa metodologia induz a equipe a se auto-avaliar, atraves de medições do processo e do produto. 

-----------------------------

UP (Unified Process)

É uma metodologia de processo. Foi criado pelo mesmos autores da UML. Possui três características chave:
  • Dirigido por casos de uso
  • Centrado na arquitetura
  • Iterativo e incremental

Fases do RUP

  • Concepção (comunicação e planejamento)
  • Elaboração (comunicação e modelagem)
  • Construção (construção)
  • Transição (última parte da construção e primeira parte da atividade de entrega)

17 setembro, 2014

Engenharia de Software

Três pontos me chamaram atenção durante essa unidade, pois foram frisadas em mais de um momento, são elas:

Fazer software não significa sentar no computador e programar

Obviamente, para quem está estudando engenharia de software e ainda não tem isso na cabeça, é melhor mudar agora.

Qualidade e produtividade são duas palavras que devem andar juntas, sempre

Pelo que percebi, essa idéia está relacionada a qualquer tipo de engenharia, e se pensar bem, em qualquer área de produção. Sempre é melhor fazer um produto de alta qualidade e com o menor gasto de recursos possiveis. Interessante que, apesar de software não ser um produto - é uma solução - mas ele deve se adequar a esse conceito da engenharia.

O software não deve atrapalhar a vida das pessoas

Auto-explicativo, se o sistema está atrapalhando a vida do usuário, tem alguma coisa errada. Isso pode ter acontecido desde a concepção do software até as rotinas executadas dentro da empresa onde o programa está rodando.

---------------------------------------------

Questões para Engenharia de Software

Dúvidas a serem respondidas durante a elaboração de software.

  • Qual o problema a ser resolvido?
  • Quais as características do software são utilizadas para resolver o problema?
  • Como o software será construído?
  • Como os erros serão identificados?
  • Como o software será mantido?


How to Solve It

Livro de 1945 do matemático George Pólya que descreve métodos para se resolver um problema, a essência do livro são os passos citados abaixo, cada passo possui possui várias perguntas a serem respondidas.  

  • Compreenda o problema
  • Planeje a solução
  • Execute / leve adiante o plano
  • Examine o resultado



Software e suas aplicações

Software é um lugar onde sonhos são plantados e pesadelos são colhidos, um pântano abstrato e místico onde demônios terríveis competem com mágicas panaceias, um mundo de lobisomens e balas de prata. (Brad J. Cox) 
Melhor e mais engraçada definição de software que já li. Esqueça aquele papo de que software é um conjunto de instruções de computador, estrutura de dados, blah blah blah.

A classificação dos tipos de software segundo Roger Pressman não me agradou, achei pouco objetiva, por deixar muitas dúvidas no ar, pretendo ler esse capítulo do livro Engenharia de Software - Roger Pressman (Bookman) para obter mais detalhes, só a explicação da aula não foi suficiente.
Aplicações de software segundo Pressman:
  • Software de sistemas
  • Software de tempo real
  • Software de aplicação (aplicativos)
  • Software científicos (astronomia - volcanologia, CAD)
  • Software embutido (embedded)
  • Software para linhas de produto (editor texto, planilhas)
  • Software que usa recursos da web (webapps)
  • Software de inteligência artificial
  • Software netsourcing (widgets)
  • Software Livre
  • Computação Ubíquoa

16 setembro, 2014

Introdução à engenharia de software

Assistindo a primeira video-aula da pós graduação em Engenharia de Software na PUC Minas, o professor Dr. Humberto Neto levantou um ponto que me chamou atenção.
Na história da informática, o hardware evoluiu (e ainda evolui) muito mais em muito menos tempo do que o software.
Segundo ele, por um motivo básico, o principal recurso do software ainda é a mente humana, enquanto que, o processo de produção de hardware necessita cada vez menos da interação humana. A medida que pesquisas avançam com descobertas em novas tecnologias, basta um projeto para que a produção de hardware aconteça.

Ainda no vídeo, foram levantados algumas áreas que ocorrem falhas na construção do software, elas estão relacionadas ao:

  • Processo: como cronogramas, gerência de recursos, qualquer problema relacionado a planejamento. 
  • Produto: requisitos de software mudam. FATO!, isso atrapalha o cronograma e pode gerar problemas no software. Além disso, adicionar novos requisistos depois que o escopo está fechado, também acarreta problemas.
  • Tecnologia: qualquer tecnologia utilizada no software como bibliotecas, frameworks, etc. Tanto superestimar os beneficions de um framework quanto a troca durante a produção de software prejudicam o cronograma. 

Por enquanto é isso. :)

Hello World!

Primeiro post... hello world!