Baixe o app para aproveitar ainda mais
Prévia do material em texto
ENGENHARIA DE SOFTWARE TÓPICOS DE ASSUTOS ABORDADOS EM AULAS AULA 03 INTRUDUÇÃO À ENGENHARIA DE SOFTWARE A engenharia de software tem por objetivo apoiar o desenvolvimento profissional de software, mais do que a programação individual. Ela inclui técnicas que apoiam especificação, projeto e evolução de programas, que normalmente não são relevantes para o desenvolvimento de software pessoal. Muitas pessoas pensam que software é simplesmente outra palavra para programas de computador. No entanto, quando falamos de engenharia de software, não se trata apenas do programa em si, mas de toda a documentação associada e dados de configurações necessários para fazer esse programa operar corretamente. Um sistema de software desenvolvido profissionalmente é, com frequência, mais do que apenas um programa; ele normalmente consiste em uma série de programas separados e arquivos de configuração que são usados para configurar esses programas. Isso pode incluir documentação do sistema, que descreve a sua estrutura; documentação do usuário, que explica como usar o sistema; e sites, para usuários baixarem a informação recente do produto. No entanto, se você está escrevendo um software que outras pessoas usarão e no qual outros engenheiros farão alterações, então você provavelmente deve fornecer informação adicional, assim como o código do programa. O que é software São programas de computador e documentação associada. Produtos de Software podem ser desenvolvidos para um cliente específico ou para o mercado em geral. Quais os atributos de um bom software Deve prover a funcionalidade e o desempenho requerido pelo usuário; além disso, deve ser confiável e fácil de manter e usar. O que é engenharia de software? É uma disciplina de engenharia que se preocupa com todos os aspectos de produção de software. Quais são as principais atividades da engenharia de software? Especificação do software, desenvolvimento de software, validação de software e evolução de software. Qual a diferença entre engenharia de software e engenharia de sistemas? Engenharia de sistemas se preocupa com todos os aspectos do desenvolvimento de sistemas computacionais, incluindo engenharia de hardware, software e processo. Engenharia de software é uma parte específica desse processo mais genérico. Quais são os principais desafios da engenharia de software? Lidar com o aumento da diversidade, demandas pela diminuição do tempo para entrega e desenvolvimento de software confiável. Quais são os custos da engenharia de software Aproximadamente 60% do custo de software são de desenvolvimento; 40% são custos de teste. Para software customizado, os custos de evolução frequentemente superam os custos de desenvolvimento. Quais são as melhores técnicas e métodos da engenharia de software Enquanto todos os pojetos de software devem ser gerenciados e desenvolvidos profissionalmente, técnicas diferentes são adequadas para tipos de sistemas diferentes. Por exemplo, jogos devem ser sempre desenvolvidos usando uma série de protótipos, enquanto sistemas de controle críticos de segurança requerem uma especificação analisável e completa. Portanto, não se pode dizer que um método é melhor do que o outro. Quais diferenças foram feitas pela internet na engenharia de software? A internet tornou serviços de software disponíveis e possibilitou o desenvolvimento de sistemas altamente distribuídos baseados em serviços. O desenvolvimento de sistemas baseados em Web gerou importantes avanços nas linguagens de programação e reuso de software. Quando falamos sobre a qualidade do software profissional, devemos levar em conta que o software é usado e alterado pelas pessoas, além de seus desenvolvedores. A qualidade, portanto, implica não apenas o que o software faz. Ao contrário, ela tem de incluir o comportamento do software enquanto ele está executando, bem como a estrutura e a organização dos programas do sistema e a documentação associada. Isso se reflete nos atributos de software chamados não funcionais ou de qualidade. Exemplos desses atributos são o tempo de resposta do software a uma consulta do usuário e a compreensão do código do programa ATRIBUTOS NÃO FUNCIONAIS OU ATRIBUTOS DE QUALIDADE Um conjunto específico de atributos que você pode esperar de um software obviamente depende da aplicação. Sistema Banco Seguro Jogo Interativo e Ágil Comutação de Telefonia Confiável ATRIBUTOS ESSENCIAIS DE UM BOM SOFTWARE Características do produto Descrição Manutenibilidade O software deve ser escrito de forma que possa evoluir para atender ás necessidades dos clientes. Esse é um atributo crítico, porque a mudança do software é um requisito inevitável de um ambiente de negócio em mudança Confiabilidade e Proteção Confiabilidade, proteção e segurança. Não deve causas prejuízos físicos e econômicos, em uma caso de falha. Usuários maliciosos não devem ser capazes de acessar ou prejudicar o sistema. Eficiência Trabalhar de forma a otimizar os recursos do sistema, como memória e ciclos do processador. Pontanto eficiência incluir: Capacidade de resposta, tempo de processamento, uso da memória etc. Um software pouco eficiente é também um software muito pesado e lento. Aceitabilidade O software deve ser aceitável para o tipo de usuário para o qual foi projetado. Isso significa deve ser compreensível, usável e compatível com outros sistemas usados por ele. Compativel com outros sistemas, usável e compreensível. Um software que tem pouco aceitabilidade, é um sistemas que ninguém quer usar, por ser de difícil compreensão e que não é integrado com outros sistemas que o usuário já utiliza. Engenharia de software – Foco em todos os aspectos da produção de software. Desde os estágios iniciais de especificações de sistema até sua manutenção, quando o sistema já esta sendo usado. Fazem parte também atividade não só da produção do software, mas de gerenciamento de projetos, desenvolvimento de ferramentas, métodos, teorias para apoiar a produção de software. Uma abordagem mais criativa e formal pode ser eficiente em algumas circunstâncias. Processo de software: Sequencia de atividade para a produção do mesmo. Existem quatro atividades fundamentais comuns a todos os processos de software. 1 – Especificação: Definição do software em sí e suas restrições de sua operação. 2 – Desenvolvimento: Nesta fase o software é projetado e programado. 3 – Validação do software: O SOFTWARE é verificado para garantir que é exatamente o que o cliente quer 4 – Evolução: O sistema é modificado para refletir a mudança de requisitos do cliente e do mercado.(Em constante processo). ENGENHARIA DE SISTEMAS: Se preocupa menos com a engenharia dos componentes dos sistemas, (hardware, software) ASPECTOS GERAIS QUE AFETAM VÁRIOS TIPOS DIFERENTES DE SOFTWARE: Heterogeneidade, Mudança de negócio e social; Segurança e confiabilidade (Sistemas distribuídos com tipos diferentes de computadores e dispositivos móveis.) Linguagens de programação antigas, de modo que é necessário criar um software confiável e flexível o suficiente para lidar com essa heterogeneidade. DIVERSIDADE NA ENGENHARIA DE SOFTWARE Engenharia de software é uma abordagem sistemática para a produção de software; ela analisa questões práticas do curso, prazo e confiança, assim como as necessidades dos clientes e produtores do software. Tipos diferentes de aplicações: 1 – Aplicações Stand-Alone 2 – Aplicações interativas baseadas em transações 3 – Sistemas de controle embutidos 4 – Sistemas de processamento de lotes 5 – Sistemas de entretenimento 6 – Sistemas paramodelagem e simulação 7 – Sistemas de coleta de dados 8 – Sistema de sistemas Apesar disso, existem fundamentos de engenharia de software que se aplicam a todos os tipos de sistemas de software: 1. Eles devem ser desenvolvidos em um processo gerenciado e compreendido. A organização que desenvolve o software deve planejar o processo de desenvolvimento e ter ideias claras do que será produzido e quando estará finalizado. É claro que processos diferentes são usados para tipos de software diferentes. 2. Confiança e desempenho são importantes para todos os tipos de sistema. O software deve se comportar conforme o esperado, sem falhas, e deve estar disponível para uso quando requerido. Deve ser seguro em sua operação e deve ser, tanto quanto possível, protegido contra ataques externos. O sistema deve executar de forma eficiente e não deve desperdiçar recursos. 3. É importante entender e gerenciar a especificação e os requisitos de software (o que o software deve fazer). Você deve saber o que clientes e usuários esperam dele e deve gerenciar suas expectativas para que um sistema útil possa ser entregue dentro do orçamento e do cronograma. 4. Você deve fazer o melhor uso possível dos recursos existentes. Isso significa que, quando apropriado, você deve reusar o software já desenvolvido, em vez de escrever um novo. ENGENHARIA DE SOFTWARE E A INTERNET ESTAGIO 01 – WEBSERVICES: Componentes de software acessados pela net e fornecem funcionalidade específica e útil. ESTAGIO 02 – SOFTWARE COMO SERVIÇO: O software não executará em computadores locais, e sim em nuvem computacionais acessadas pela internet. Se você usa um serviço como um webmail, está usando um sistema baseado na nuvem. Uma nuvem computacional consiste em um grande número de sistemas computacionais interligados, os quais são compartilhados entre vários usuários. Os usuários não compram o software, mas pagam de acordo com o uso ou possuem acesso gratuito em troca de propagandas que são exibidas em suas telas. Os softwares agora são altamente distribuídos. As vezes pelo mundo todo. O reuso de software tornou-se a abordagem dominante para a construção de sistemas Web. Quando construímos esses sistemas, pensamos em como podemos montá-los a partir de componentes e sistemas de software preexistentes. Os três tipos de sistema que uso como estudos de caso são: 1. Um sistema embutido: Trata-se de um sistema no qual o software controla um dispositivo de hardware e é embutido nesse dispositivo. As questões em sistemas embutidos incluem tipicamente o tamanho físico, a capacidade de resposta, o gerenciamento de energia etc. O exemplo de um sistema embutido que uso é um sistema para controlar um dispositivo médico. 2. Um sistema de informação: Esse é um sistema cujo principal objetivo é gerenciar e prover acesso a um banco de dados de informações. As questões em sistemas de informação incluem proteção, usabilidade, privacidade e manutenção da integridade dos dados. O exemplo de um sistema de informação que uso é um sistema de registros médicos. 3. Um sistema de coleta de dados baseado em sensores. Esse é um sistema cujo principal objetivo é coletar dados a partir de um conjunto de sensores e processá-los de alguma forma. Os principais requisitos de tais sistemas são confiabilidade, mesmo em condições ambientais hostis, e manutenibilidade. O exemplo de um sistema de coleta de dados que uso é uma estação meteorológica no deserto. Apresento cada um desses sistemas neste capítulo, com mais informações a respeito de cada um deles disponíveis na Internet 2.1 - ÉTICA NA ENGENHARIA DE SOFTWARE Assim como outras disciplinas de engenharia, a engenharia de software é desenvolvida dentro de um framework social e legal que limita a liberdade das pessoas que trabalham nessa área. Como um engenheiro de software, você deve aceitar que seu trabalho envolve maiores responsabilidades do que simplesmente aplicar habilidades técnicas. Você também deve se comportar de forma ética e moralmente responsável se deseja ser respeitado como um engenheiro profissional 1. Confidencialidade: Você deve respeitar naturalmente a confidencialidade de seus empregadores ou clientes, independentemente de ter sido ou não assinado um acordo formal de confidencialidade. 2. Competência: Você não deve deturpar seu nível de competência. Você não deve aceitar conscientemente um trabalho que esteja fora de sua competência. 3. Direitos de propriedade intelectual: Você deve ter conhecimento das leis locais a respeito da propriedade intelectual, como patentes e copyright. Você deve ter cuidado para garantir que a propriedade intelectual dos empregadores e clientes seja protegida. 4. Mau uso do computador: Você não deve usar suas habilidades técnicas para fazer mau uso de computadores de outras pessoas. Esse mau uso varia de relativamente trivial (jogar videogames em uma máquina do empregador, por exemplo) até extremamente sério (disseminar vírus ou outros malwares) ESTUDO DE CASO Exemplo de tipos de sistemas SISTEMA EMBUTIDO SISTEMA DE INFORMAÇÃO SISTEMA DE COLETA DE DADOS BASEADOS EM SENSORES Engenharia de software é uma disciplina de engenharia que se preocupa com todos os aspectos da produção de software. Software não é apenas um programa ou programas; ele inclui também a documentação. Os atributos principais de um produto de software são manutenibilidade, confiança, proteção, eficiência e aceitabilidade. O processo de software inclui todas as atividades envolvidas no desenvolvimento do software. Atividades de alto nível de especificação, desenvolvimento, validação e evolução são parte de todos os processos de software. As ideias fundamentais da engenharia de software são universalmente aplicáveis para todos os tipos de desenvolvimento de sistemas. Esses fundamentos incluem processos de software, confiança, proteção, requisitos e reuso. Existem vários tipos diferentes de sistemas, e cada um requer ferramentas e técnicas de engenharia de software adequadas a seu desenvolvimento. Existem poucas, se houver alguma, técnicas específicas de projeto e implementação aplicáveis para todos os tipos de sistemas. As ideias básicas da engenharia de software são aplicáveis a todos os tipos de sistemas de software. Esses fundamentos incluem processos de software gerenciados, confiança e proteção de software, engenharia de requisitos e reuso de software. Engenheiros de software têm responsabilidades com a profissão de engenharia e com a sociedade. Eles não devem se preocupar apenas com as questões técnicas. Sociedades profissionais publicam códigos de conduta que definem os padrões de comportamento esperado de seus membros. LISTA EXERCÍCIOS 1.1 Explique por que software profissional não é apenas os programas que são desenvolvidos para o cliente. 1.2 1.2 Qual a diferença mais importante entre o desenvolvimento de um produto genérico de software e o desenvolvimento de software sob demanda? O que isso pode significar na prática para usuários de produtos de software genérico? 1.3 1.3 Quais são os quatro atributos importantes que todo software profissional deve possuir? Sugira outros quatro atributos que, às vezes, podem ser significantes. 1.4 1.4 Além dos desafios de heterogeneidade, mudanças sociais e corporativas, confiança e proteção, identifique outros problemas e desafios que a engenharia de software provavelmente enfrentará no século XXI (Dica: pense no meio ambiente). 1.5 Baseado em seu conhecimento de alguns tipos de aplicações discutidos na Seção 1.1.2, explique, com exemplos, por que tipos de aplicações diferentes requerem técnicas especializadasde engenharia de software para apoiar seu projeto e desenvolvimento. 1.6 Explique por que existem ideias fundamentais na engenharia de software que se aplicam a todos os tipos de sistemas. 1.7 Explique como o uso universal da Internet mudou os sistemas de software. 1.8 Discuta se os engenheiros profissionais devem ser certificados da mesma forma que médicos e advogados. 1.9 Para cada uma das cláusulas no Código de Ética da ACM/IEEE m stradas 1.10 Para ajudar a combater o terrorismo, muitos países estão planejando desenvolver, ou já desenvolveram, sistemas computacionais que rastreiam grandes números de cidadãos e suas ações. Obviamente, isso tem implicações nas questões da privacidade. Discuta a ética de se trabalhar desenvolvendo esse tipo de sistema. PROCESSOS DE SOFTWARE: O objetivo deste capítulo é apresentar a ideia de um processo de software — um conjunto coerente de atividades para a produção de software. Ao terminar de ler este capítulo, você: 2.1 Modelos de processo de software 2.2 Atividades do processo 2.3 Lidando com mudanças 2.4 Rational Unified Process (RUP) Existem muitos processos de software diferentes, mas todos devem incluir quatro atividades fundamentais para a engenharia de software: 1. Especificação de software. A funcionalidade do software e as restrições a seu funcionamento devem ser definidas. 2. Projeto e implementação de software. O software deve ser produzido para atender às especificações. 3. Validação de software: O software deve ser validado para garantir que atenda às demandas do cliente. 4. Evolução de software: O software deve evoluir para atender às necessidades de mudança dos clientes Existem também as atividades que dão apoio ao processo, como documentação e gerenciamento de configuração de software. Os processos de software, às vezes, são categorizados como dirigidos a planos ou processos ágeis. Processos dirigidos a planos são aqueles em que todas as atividades são planejadas com antecedência, e o progresso é avaliado por comparação com o planejamento inicial. Em processos ágeis, que discuto no Capítulo 3, o planejamento é gradativo, e é mais fácil alterar o processo de maneira a refletir as necessidades de mudança dos clientes. Geralmente, é necessário encontrar um equilíbrio entre os processos dirigidos a planos e os processos ágeis. Em organizações nas quais a diversidade de processos de software é reduzida, os processos de software podem ser melhorados pela padronização. Isso possibilita uma melhor comunicação, além de redução no período de treinamento, e torna mais econômico o apoio ao processo automatizado. A padronização também é um importante primeiro passo na introdução de novos métodos e técnicas de engenharia de software, assim como as boas práticas de engenharia de software. MODELOS DE PROCESSO DE SOFTWARE O modelo em cascata: Esse modelo considera as atividades fundamentais do processo de especificação, desenvolvimento, validação e evolução, e representa cada uma delas como fases distintas, como: especificação de requisitos, projeto de software, implementação, teste e assim por diante. Desenvolvimento incremental: Essa abordagem intercala as atividades de especificação, desenvolvimento e validação. O sistema é desenvolvido como uma série de versões (incrementos), de maneira que cada versão adiciona funcionalidade à anterior. Engenharia de software orientada a reuso: Essa abordagem é baseada na existência de um número significativo de componentes reusáveis. O processo de desenvolvimento do sistema concentra-se na integração desses componentes em um sistema já existente em vez de desenvolver um sistema a partir do zero. Esses modelos não são mutuamente exclusivos e muitas vezes são usados em conjunto, especialmente para o desenvolvimento de sistemas de grande porte. Para sistemas de grande porte, faz sentido combinar algumas das melhores características do modelo em cascata e dos modelos de desenvolvimento incremental. É preciso ter informações sobre os requisitos essenciais do sistema para projetar uma arquitetura de software que dê suporte a esses requisitos. Integração e teste de sistema: As unidades individuais do programa ou programas são integradas e testadas como um sistema completo para assegurar que os requisitos do software tenham sido atendidos. Após o teste, o sistema de software é entregue ao cliente. Operação e manutenção: Normalmente (embora não necessariamente), essa é a fase mais longa do ciclo de vida. O sistema é instalado e colocado em uso. A manutenção envolve a correção de erros que não foram descobertos em estágios iniciais do ciclo de vida, com melhora da implementação das unidades do sistema e ampliação de seus serviços em resposta às descobertas de novos requisitos. DESENVOLVIMENTO INCREMENTAL O desenvolvimento incremental tem três vantagens importantes quando comparado ao modelo em cascata: 1. O custo de acomodar as mudanças nos requisitos do cliente é reduzido. A quantidade de análise e documentação a ser refeita é muito menor do que o necessário no modelo em cascata. 2. É mais fácil obter feedback dos clientes sobre o desenvolvimento que foi feito. Os clientes podem fazer comentários sobre as demonstrações do software e ver o quanto foi implementado. Os clientes têm dificuldade em avaliar a evolução por meio de documentos de projeto de software. 3. É possível obter entrega e implementação rápida de um software útil ao cliente, mesmo se toda a funcionalidade não for incluída. Os clientes podem usar e obter ganhos a partir do software inicial antes do que é possível com um processo em cascata. GERENCIAMENTO INCREMENTAL Do ponto de vista do gerenciamento, a abordagem incremental tem dois problemas: 1. O processo não é visível. Os gerentes precisam de entregas regulares para mensurar o progresso. Se os sistemas são desenvolvidos com rapidez, não é economicamente viável produzir documentos que reflitam cada uma das versões do sistema. 2. A estrutura do sistema tende a se degradar com a adição dos novos incrementos. A menos que tempo e dinheiro sejam dispendidos em refatoração para melhoria do software, as constantes mudanças tendem a corromper sua estrutura. Incorporar futuras mudanças do software torna-se cada vez mais difícil e oneroso. 2.1.3 ENGENHARIA DE SOFTWARE ORIENTADA A REUSO Na maioria dos projetos de software, há algum reúso de software. Isso acontece muitas vezes informalmente, quando as pessoas envolvidas no projeto sabem de projetos ou códigos semelhantes ao que é exigido. Elas os buscam, fazem as modificações necessárias e incorporam-nos a seus sistemas. 1. Análise de componentes. Dada a especificação de requisitos, é feita uma busca por componentes para implementar essa especificação. Em geral, não há correspondência exata, e os componentes que podem ser usados apenas fornecem alguma funcionalidade necessária. 2. 2. Modificação de requisitos. Durante esse estágio, os requisitos são analisados usando-se informações sobre os componentes que foram descobertos. Em seguida, estes serão modificados para refletir os componentes disponíveis. No caso de modificações impossíveis, a atividade de análise dos componentes pode ser reinserida na busca por soluções alternativas. 3. 3. Projeto do sistema com reúso. Durante esse estágio, o framework do sistema é projetado ou algo existente é reusado. Os projetistas têm em mente os componentes que serão reusados e organizam o framework para reúso. Alguns softwares novos podem ser necessários, se componentes reusáveis não estiverem disponíveis. 4. 4. Desenvolvimento e integração. Softwares que não podem ser adquiridos externamente sãodesenvolvidos, e os componentes e sistemas COTS são integrados para criar o novo sistema. A integração de sistemas, nesse modelo, pode ser parte do processo de desenvolvimento, em vez de uma atividade separa Existem três tipos de componentes de software que podem ser usados em um processo orientado a reúso: 1. Web services desenvolvidos de acordo com os padrões de serviço e que estão disponíveis para invocação remota. 2. Coleções de objetos que são desenvolvidas como um pacote a ser integrado com um framework de componentes, como .NET ou J2EE. 3. Sistemas de software stand-alone configurados para uso em um ambiente particular. Engenharia de software orientada a reúso tem a vantagem óbvia de reduzir a quantidade de software a ser desenvolvido e, assim, reduzir os custos e riscos. Geralmente, também proporciona a entrega mais rápida do software. ATIVIDADES DO PROCESSO DE DESENVOLVIMENTO DO SOFTWARE Processos reais de software são intercalados com sequências de atividades técnicas, de colaboração e de gerência, com o intuito de especificar, projetar, implementar e testar um sistema de software. 2.2.2 PROJETO E IMPLEMENTAÇÃO DE SOFTWARE O estágio de implementação do desenvolvimento de software é o processo de conversão de uma especificação do sistema em um sistema executável. Sempre envolve processos de projeto e programação de software, mas, se for usada uma abordagem incremental para o desenvolvimento, também pode envolver o refinamento da especificação do software. 1. Projeto de arquitetura, no qual você pode identificar a estrutura geral do sistema, os componentes principais (algumas vezes, chamados subsistemas ou módulos), seus relacionamentos e como eles são distribuídos. 2. Projeto de interface, no qual você define as interfaces entre os componentes do sistema. Essa especificação de interface deve ser inequívoca. Com uma interface precisa, um componente pode ser usado de maneira que outros componentes não precisam saber como ele é implementado. Uma vez que as especificações de interface são acordadas, os componentes podem ser projetados e desenvolvidos simultaneamente. 3. Projeto de componente, no qual você toma cada componente do sistema e projeta seu funcionamento. Pode-se tratar de uma simples declaração da funcionalidade que se espera implementar, com o projeto específico para cada programador. Pode, também, ser uma lista de alterações a serem feitas em um componente reusável ou um modelo de projeto detalhado. O modelo de projeto pode ser usado para gerar automaticamente uma implementação. 4. Projeto de banco de dados, no qual você projeta as estruturas de dados do sistema e como eles devem ser representados em um banco de dados. Novamente, o trabalho aqui depende da existência de um banco de dados a ser reusado ou da criação de um novo banco de dados. 4.2.3 VALIDAÇÃO DE SOFTWARE 1. Testes de desenvolvimento. Os componentes do sistema são testados pelas pessoas que o desenvolveram. Cada componente é testado de forma independente, separado dos outros. Os componentes podem ser entidades simples, como funções ou classes de objetos, ou podem ser agrupamentos coerentes dessas entidades. Ferramentas de automação de teste, como JUnit (MASSOL e HUSTED, 2003), que podem reexecutar testes de componentes quando as novas versões dos componentes são criadas, são comumente usadas. 2. Testes de sistema. Componentes do sistema são integrados para criar um sistema completo. Esse processo se preocupa em encontrar os erros resultantes das interações inesperadas entre componentes e problemas de interface do componente. Também visa mostrar que o sistema satisfaz seus requisitos funcionais e não funcionais, bem como testar as propriedades emergentes do sistema. Para sistemas de grande porte, esse pode ser um processo multiestágios, no qual os componentes são integrados para formar subsistemas individualmente testados antes de serem integrados para formar o sistema final. 3. Testes de aceitação. Esse é o estágio final do processo de testes, antes que o sistema seja aceito para uso operacional. O sistema é testado com dados fornecidos pelo cliente, e não com dados advindos de testes simulados. O teste de aceitação pode revelar erros e omissões na definição dos requisitos do sistema, pois dados reais exercitam o sistema de formas diferentes dos dados de teste. Os testes de aceitação também podem revelar problemas de requisitos em que os recursos do sistema não atendam às necessidades do usuário ou o desempenho do sistema seja inaceitável. Os processos de desenvolvimento de componentes e testes geralmente são intercalados. Os programadores criam seus próprios dados para testes e, incrementalmente, testam o código enquanto ele é desenvolvido 2.2.4 EVOLUÇÃO DO SOFTWARE A flexibilidade dos sistemas de software é uma das principais razões pelas quais os softwares vêm sendo, cada vez mais, incorporados em sistemas grandes e complexos. Uma vez que a decisão pela fabricação do hardware foi tomada, é muito caro fazer alterações em seu projeto. Entretanto, as mudanças no software podem ser feitas a qualquer momento durante ou após o desenvolvimento do sistema 2.3 LIDANDO COM MUDANÇAS A mudança é inevitável em todos os grandes projetos de software. Os requisitos do sistema mudam, ao mesmo tempo que o negócio que adquiriu o sistema responde a pressões externas e mudam as prioridades de gerenciamento. Com a disponibilidade de novas tecnologias, emergem novos projetos e possibilidades de implementação. 2 3.1 PROTOTIPAÇÃO Um protótipo é uma versão inicial de um sistema de software, usado para demonstrar conceitos, experimentar opções de projeto e descobrir mais sobre o problema e suas possíveis soluções. O desenvolvimento rápido e iterativo do protótipo é essencial para que os custos sejam controlados e os stakeholders do sistema possam experimentá-lo no início do processo de software Entrega incremental (Figura 2.10) é uma abordagem para desenvolvimento de software na qual alguns dos incrementos desenvolvidos são entregues ao cliente e implantados para uso em um ambiente operacional. Em um processo de entrega incremental os clientes identificam, em linhas gerais, os serviços a serem fornecidos pelo sistema. 2.3.3 MODELO ESPIRAL DE BOEHM Um framework de processo de software dirigido a riscos (o modelo em espiral) foi proposto por Boehm (1988). Isso está na Figura 2.11. Aqui, o processo de software é representado como uma espiral, e não como uma sequência de atividades com alguns retornos de uma para outra. 2.4 RATIONAL UNIFIED PROCESS (RUP) O Rational Unified Process — RUP (KRUTCHEN, 2003) é um exemplo de modelo de processo moderno, derivado de trabalhos sobre a UML e o Unified Software Development Process associado (RUMBAUGH, et al., 1999; ARLOW e NEUSTADT, 2005). Incluí uma descrição aqui, pois é um bom exemplo de processo híbrido. Ele reúne elementos de todos os modelos de processo genéricos (Seção 2.1), ilustra boas práticas na especificação e no projeto (Seção 2.2) e apoia a prototipação e a entrega incremental (Seção 2.3) Os processos de software são as atividades envolvidas na produção de um sistema de software. Modelos de processos de software são representações abstratas desses processos. Modelos gerais de processo descrevem a organização dos processos de software. Exemplos desses modelos gerais incluem o modelo em cascata, o desenvolvimento incremental e o desenvolvimento orientado a reuso. Engenharia de requisitos é o processo de desenvolvimento de uma especificação de software. As especificações destinam-se a comunicar as necessidadesde sistema dos clientes para os desenvolvedores do sistema. Processos de projeto e implementação estão relacionados com a transformação das especificações dos requisitos em um sistema de software executável. Métodos sistemáticos de projeto podem ser usados como parte dessa transformação. Validação de software é o processo de verificação de que o sistema está de acordo com sua especificação e satisfaz às necessidades reais dos usuários do sistema. Evolução de software ocorre quando se alteram os atuais sistemas de software para atender aos novos requisitos. As mudanças são contínuas, e o software deve evoluir para continuar útil. Processos devem incluir atividades para lidar com as mudanças. Podem envolver uma fase de prototipação, que ajuda a evitar más decisões sobre os requisitos e projeto. Processos podem ser estruturados para o desenvolvimento e a entrega iterativos, de forma que mudanças possam ser feitas sem afetar o sistema como um todo. O Rational Unified Process (RUP) é um moderno modelo genérico de processo, organizado em fases (concepção, elaboração, construção e transição), mas que separa as atividades (requisitos, análises, projeto etc.) dessas fases. DESENVOLVIMENTO ÁGIL DE SOFTWARE O objetivo deste capítulo é apresentar os métodos ágeis de desenvolvimento de software. Ao terminar de ler este capítulo, você: t compreenderá a lógica dos métodos ágeis de desenvolvimento de software, o manifesto ágil, e as diferenças entre desenvolvimento ágil e desenvolvimento dirigido a planos; t conhecerá as práticas mais importantes da Extreme Programming e o modo como elas se relacionam com os princípios gerais dos métodos ágeis; t compreenderá a abordagem Scrum para gerenciamento ágil de projetos; t estará ciente das questões e problemas de escalamento de métodos ágeis de desenvolvimento para o desenvolvimento de sistemas de software de grande porte. 3.1 Métodos ágeis 3.2 Desenvolvimento ágil e dirigido a planos 3.3 Extreme Programming 3.4 Gerenciamento ágil de projetos 3.5 Escalamento de métodos ágeis A filosofia por trás dos métodos ágeis é refletida no manifesto ágil, que foi acordado por muitos dos principais desenvolvedores desses métodos. Esse manifesto afirma: Estamos descobrindo melhores maneiras de desenvolver softwares, fazendo-o e ajudando outros a fazê-lo. Através desse trabalho, valorizamos mais: Indivíduos e interações do que processos e ferramentas Software em funcionamento do que documentação abrangente Colaboração do cliente do que negociação de contrato Respostas a mudanças do que seguir um plano Ou seja, embora itens à direita sejam importantes, valorizamos mais os que estão à esquerda. 1. Embora a ideia de envolvimento do cliente no processo de desenvolvimento seja atraente, seu sucesso depende de um cliente disposto e capaz de passar o tempo com a equipe de desenvolvimento, e que possa representar todos os stakeholders do sistema. Frequentemente, os representantes dos clientes estão sujeitos a diversas pressões e não podem participar plenamente do desenvolvimento de software; 2. Membros individuais da equipe podem não ter personalidade adequada para o intenso envolvimento que é típico dos métodos ágeis e, portanto, não interagem bem com outros membros da equipe; 3. Priorizar as mudanças pode ser extremamente difícil, especialmente em sistemas nos quais existem muitos stakeholders. Normalmente, cada stakeholder dá prioridades diferentes para mudanças diferentes; 4. Manter a simplicidade exige um trabalho extra. Sob a pressão de cronogramas de entrega, os membros da equipe podem não ter tempo para fazer as simplificações desejáveis; 5. Muitas organizações, principalmente as grandes empresas, passaram anos mudando sua cultura para que os processos fossem definidos e seguidos. É difícil para eles mudar de um modelo de trabalho em que os processos são informais e definidos pelas equipes de desenvolvimento; 3.2 DESENVOLVIMENTO ÁGIL E DIRIGIDO A PLANOS Abordagens ágeis de desenvolvimento de software consideram o projeto e a implementação como atividades centrais no processo de software. Eles incorporam outras atividades, como elicitação de requisitos e testes no projeto e na implementação. Em contrapartida, uma abordagem de engenharia de software dirigida a planos identifica estágios distintos do processo de software com saídas associadas a cada estágio. As saídas de um estágio são usadas como base para o planejamento da atividade do processo a seguir. A Figura 3.1 mostra as distinções entre as abordagens dirigidas a planos e ágil para a especificação do sistema. 3.3 EXTREME PROGRAMMING Extreme Programming (XP) é talvez o mais conhecido e mais utilizado dos métodos ágeis. O nome foi cunhado por Beck (2000), pois a abordagem foi desenvolvida para impulsionar práticas reconhecidamente boas, como o desenvolvimento iterativo, a níveis ‘extremos’. Por exemplo, em XP, várias novas versões de um sistema podem ser desenvolvidas, integradas e testadas em um único dia por programadores diferentes. Em Extreme Programming, os requisitos são expressos como cenários (chamados de histórias do usuário), que são implementados diretamente como uma série de tarefas. Os programadores trabalham em pares e desenvolvem testes para cada tarefa antes de escreverem o código. Quando o novo código é integrado ao sistema, todos os testes devem ser executados com sucesso. Há um curto intervalo entre os releases do sistema. Extreme Programming envolve uma série de práticas que refletem os princípios dos métodos ágeis (elas estão resumidas na Tabela 3.2): 1. O desenvolvimento incremental é sustentado por meio de pequenos e frequentes releases do sistema. Os requisitos são baseados em cenários ou em simples histórias de clientes, usadas como base para decidir a funcionalidade que deve ser incluída em um incremento do sistema. 2. O envolvimento do cliente é sustentado por meio do engajamento contínuo do cliente com a equipe de desenvolvimento. O representante do cliente participa do desenvolvimento e é responsável por definir os testes de aceitação para o sistema. ( Dono do Produto, na Metodologia Scrum) 3. Pessoas — não processos — são sustentadas por meio de programação em pares, propriedade coletiva do código do sistema e um processo de desenvolvimento sustentável que não envolve horas de trabalho excessivamente longas. 4. As mudanças são aceitas por meio de releases contínuos para os clientes, do desenvolvimento test- first, da refatoração para evitar a degeneração do código e integração contínua de nova funcionalidade. 5. A manutenção da simplicidade é feita por meio da refatoração constante que melhora a qualidade do código, bem como por meio de projetos simples que não antecipam desnecessariamente futuras mudanças no sistema TESTE EM XP Para evitar alguns dos problemas de teste e validação do sistema, a abordagem XP enfatiza a importância dos testes do programa. Extreme Programming inclui uma abordagem de testes que reduz as chances de erros desconhecidos na versão atual do sistema. As principais características dos testes em XP são: 1. Desenvolvimento test-first; 2. Desenvolvimento de teste incremental a partir de cenários; 3. Envolvimento dos usuários no desenvolvimento de testes e validação; 4. Uso de frameworks de testes automatizados 3.3.2 A PROGRAMAÇÃO EM PARES Outra prática inovadora introduzida no XP é que, para desenvolver o software, os programadores trabalhem em pares. Na verdade, para desenvolver o software eles se sentam juntos, na mesma estação de trabalho. No entanto, os mesmos pares nem sempre programam juntos. Pelo contrário,os pares são criados de maneira dinâmica, de modo que todos os membros da equipe trabalhem uns com os outros durante o processo de desenvolvimento. 3.4 GERENCIAMENTO ÁGIL DE PROJETOS A principal responsabilidade dos gerentes de projeto de software é gerenciar o projeto para que o software seja entregue no prazo e dentro do orçamento previsto. Eles supervisionam o trabalho dos engenheiros de software e acompanham quão bem o desenvolvimento de software está progredindo. MÉTODOS ÁGEIS Métodos ágeis são métodos de desenvolvimento incremental que se concentram em desenvolvimento rápido, releases frequentes do software, redução de overheads dos processos e produção de códigos de alta qualidade. Eles envolvem o cliente diretamente no processo de desenvolvimento. A decisão de usar uma abordagem ágil ou uma abordagem dirigida a planos para o desenvolvimento deve depender do tipo de software a ser desenvolvido, das habilidades da equipe de desenvolvimento e da cultura da empresa que desenvolve o sistema. Extreme Programming é um método ágil, bem conhecido, que integra um conjunto de boas práticas de programação, como releases frequentes do software, melhorias contínuas do software e participação do cliente na equipe de desenvolvimento. Um ponto forte da Extreme Programming é o desenvolvimento de testes automatizados antes da criação de um recurso do programa. Quando um incremento é integrado ao sistema, todos os testes devem ser executados com sucesso. O método Scrum é uma metodologia ágil que fornece um framework de gerenciamento de projetos. É centralizado em torno de um conjunto de sprints, que são períodos determinados de tempo, quando um incremento de sistema é desenvolvido. O planejamento é baseado na priorização de um backlog de trabalho e na seleção das tarefas mais importantes para um sprint. O escalamento de métodos ágeis para sistemas de grande porte é difícil. Tais sistemas necessitam de projeto adiantado e alguma documentação. A integração contínua é praticamente impossível quando existem várias equipes de desenvolvimento separadas trabalhando em um projeto ENGENHARIA DE REQUISITOS Os requisitos de um sistema são as descrições do que o sistema deve fazer os serviços que oferece e as restrições a seu funcionamento. Esses requisitos refletem as necessidades dos clientes para um sistema que serve a uma finalidade determinada, como controlar um dispositivo, colocar um pedido ou encontrar informações. O processo de descobrir, analisar, documentar e verificar esses serviços e restrições é chamado engenharia de requisitos (RE, do inglês requirements engineering). 1. Requisitos de usuário são declarações, em uma linguagem natural com diagramas, de quais serviços o sistema deverá fornecer a seus usuários e as restrições com as quais este deve operar. 2. Requisitos de sistema são descrições mais detalhadas das funções, serviços e restrições operacionais do sistema de software. O documento de requisitos do sistema (às vezes, chamado especificação funcional) deve definir exatamente o que deve ser implementado. Pode ser parte do contrato entre o comprador do sistema e os desenvolvedores de software REQUISITOS 4.1 Requisitos funcionais e não funcionais Os requisitos de software são frequentemente classificados como requisitos funcionais e requisitos não funcionais: 1. Requisitos funcionais: São declarações de serviços que o sistema deve fornecer, de como o sistema deve reagir a entradas específicas e de como o sistema deve se comportar em determinadas situações. Em alguns casos, os requisitos funcionais também podem explicitar o que o sistema não deve fazer. 2. Requisitos não funcionais: São restrições aos serviços ou funções oferecidos pelo sistema. Incluem restrições de timing, restrições no processo de desenvolvimento e restrições impostas pelas normas. Ao contrário das características individuais ou serviços do sistema, os requisitos não funcionais, muitas vezes, aplicam-se ao sistema como um todo. 4.1.1 Requisitos funcionais Os requisitos funcionais de um sistema descrevem o que ele deve fazer. Eles dependem do tipo de software a ser desenvolvido, de quem são seus possíveis usuários e da abordagem geral adotada pela organização ao escrever os requisitos. Quando expressos como requisitos de usuário, os requisitos funcionais são normalmente descritos de forma abstrata, para serem compreendidos pelos usuários do sistema. No entanto, requisitos de sistema funcionais mais específicos descrevem em detalhes as funções do sistema, suas entradas e saídas, exceções etc. 4.1.2 Requisitos não funcionais Os requisitos não funcionais, como o nome sugere, são requisitos que não estão diretamente relacionados com os serviços específicos oferecidos pelo sistema a seus usuários. Eles podem estar relacionados às propriedades emergentes do sistema, como confiabilidade, tempo de resposta e ocupação de área. Uma alternativa a esse cenário seria os requisitos definirem restrições sobre a implementação do sistema, como as capacidades dos dispositivos de E/S ou as representações de dados usadas nas interfaces com outros sistemas. 4.2 O DOCUMENTO DE REQUISITOS DE SOFTWARE é uma declaração oficial de o que os desenvolvedores do sistema devem implementar. Deve incluir tanto os requisitos de usuário para um sistema quanto uma especificação detalhada dos requisitos de sistema Documentos de requisitos são essenciais quando um contratante externo está desenvolvendo o sistema de software. Etnografia é uma técnica de observação que pode ser usada para compreender os processos operacionais e ajudar a extrair os requisitos de apoio para esses processos. Um analista faz uma imersão no ambiente de trabalho em que o sistema será usado. O trabalho do dia a dia é observado e são feitas anotações sobre as tarefas reais em que os participantes estão envolvidos. O valor da etnografia é que ela ajuda a descobrir requisitos implícitos do sistema que refletem as formas reais com que as pessoas trabalham, em vez de refletir processos formais definidos pela organização. 4.6 Validação de requisitos A validação de requisitos é o processo pelo qual se verifica se os requisitos definem o sistema que o cliente realmente quer. Ela se sobrepõe à análise, uma vez que está preocupada em encontrar problemas com os requisitos. A validação de requisitos é importante porque erros em um documento de requisitos podem gerar altos custos de retrabalho quando descobertos durante o desenvolvimento ou após o sistema já estar em serviço. Os requisitos para um sistema de software estabelecem o que o sistema deve fazer e define as restrições sobre seu funcionamento e implementação. Os requisitos funcionais são declarações dos serviços que o sistema deve fornecer ou descrições de como alguns processamentos devem ser efetuados. Muitas vezes, os requisitos não funcionais restringem o sistema que está sendo desenvolvido e o processo de Gerenciamento de mudança de requisitos. Implementação de mudanças Análise de mudança e custos Análise de problema e especificação de mudanças Problema identificado Requisitos revisados . Estes podem ser os requisitos de produto, requisitos organizacionais ou requisitos externos. Eles costumam se relacionar com as propriedades emergentes do sistema e, portanto, aplicam-se ao sistema como um todo. O documento de requisitos de software é uma declaração acordada dos requisitos do sistema. Deve ser organizado para que ambos — os clientes do sistema e os desenvolvedoresde software — possam usá-lo. O processo de engenharia de requisitos inclui um estudo da viabilidade, elicitação e análise de requisitos, especificação de requisitos, validação e gerenciamento de requisitos. Elicitação e análise de requisitos é um processo iterativo que pode ser representado como uma espiral de atividades — descoberta de requisitos, classificação e organização de requisitos, negociação de requisitos e documentação de requisitos. A validação de requisitos é o processo de verificação da validade, consistência, completude, realismo e verificabilidade dos requisitos. Mudanças organizacionais, mudanças nos negócios e mudanças técnicas inevitavelmente geram mudanças nos requisitos para um sistema de software. O gerenciamento de requisitos é o processo de gerenciamento e controle dessas mudanças. LISTA DE EXERCÍCIOS 4.1 Identifique e descreva brevemente os quatro tipos de requisitos que podem ser definidos para um sistema computacional 4.2 Descubra ambiguidades ou omissões nas seguintes declarações de requisitos para parte de um sistema de emissão de bilhetes: Um sistema automatizado para emitir bilhetes vende bilhetes de trem. Os usuários selecionam seu destino e inserem um cartão de crédito e um número de identificação pessoal. O bilhete é emitido, e sua conta de cartão de crédito, cobrada. Quando o usuário pressiona o botão de início, é ativado um display de menu de destinos possíveis, junto com uma mensagem ao usuário para selecionar um destino. Uma vez que o destino tenha sido selecionado, os usuários são convidados a inserir seu cartão de crédito. Sua validade é verificada e, em seguida, é solicitada ao usuário a entrada de um identificador pessoal. Quando a operação de crédito é validada, o bilhete é emitido 4.3 Reescreva a descrição anterior usando a abordagem estruturada descrita neste capítulo. Resolva, de um modo apropriado, as ambiguidades identificadas. 4.4 Escreva um conjunto de requisitos não funcionais para o sistema de emissão de bilhetes, definindo sua confiabilidade e tempo de resposta esperados. 4.5 Usando a técnica sugerida neste capítulo, em que as descrições em linguagem natural são apresentadas em formato-padrão, escreva requisitos do usuário plausíveis para as seguintes funções: BPMN (Business Process Model and Notation): Notação para uma modelagem de processo de software OBJETIVOS Uma linguagem padrão ( comum para modelagem de processos de negócio, facilitando a comunicação e tornar um padrão Representar um processo de negócio privado detalhado; AS IS – Processos de negócios atuiais e antigos TO BE – Processos de negócios novos ou propostos Atender aos objetivos organizacionais através do mapeamento dos processos para alcançar as metas gerenciais e estratégicas do negócio. a meta primária da notação BPMN é fornecer uma notação que possa ser entendida por todos os usuários do negócio (analistas de processos/negócios que criam a versão inicial do processo), desenvolvedores responsáveis por implementar a tecnologia que auxiliará os processos e, finalmente, as pessoas que irão gerenciar e monitorar os processos. Entender quais as integrações entre os setores Tramitação de documentações, procedimentos, atividade de um processo de produção MODELO EKD
Compartilhar