Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
RESUMO ENG. DE SOFTWARE – Ian Sommerville Autor: Paulo Norberto CAPITULO 1 • INTRODUÇÃO Os sistemas de software são abstratos e intangíveis. Eles não são restringidos pelas propriedades dos materiais, nem governados pelas leis da física ou pelos processos de manufatura. Isso simplifica a engenharia de software, porque não há limites naturais para o potencial do software. No entanto, devido a essa falta de restrição física, os sistemas de software podem se tornar extremamente complexos de modo muito rápido, difíceis de entender e caros para alterar. Existem vários tipos de sistemas de software, desde os simples até os complexos. Não faz sentido que se busque notações, métodos ou técnicas universais para a engenharia de software, pois diferentes tipos de software exigem abordagens diferentes. A seguir algumas causas das falhas de software: 1. Aumento de demanda: O aumento da demanda de softwares os sistemas tem que ser construídos mais rapidamente, serem maiores e mais complexos, devem ter capacidades que antes eram consideradas impossíveis. Como os métodos e as técnicas de engenharia de software existentes não conseguem lidar com isso, novas técnicas de engenharia de software precisam ser desenvolvidas para atender a essas novas demandas. 2. Expectativas baixas: Por ser fácil escrever programas de computador sem usar técnicas e métodos de engenharia de software, isso forçou a muitas empresas a desenvolver softwares à medida que seus produtos e serviços evoluíram. Como consequência, e por não utilizar métodos de engenharia de software no dia-a-dia, seus softwares são mais caros e menos confiáveis do que deveriam ser. Várias pessoas desenvolvem softwares hoje em dia, para os mais diferentes meios (científico, hobby, empresariais), no entanto a maior parte dos softwares é desenvolvido para um propósito específico de negócio. O software profissional, que é usado por alguém além do seu desenvolvedor, é normalmente criado por equipes, em vez de indivíduos. Ele é mantido e alterado durante sua vida. A engenharia de software inclui técnicas que apoiam especificação, projeto e evolução de programas. Falar em engenharia de software não é apenas criar programas de computador, mas também engloba toda a documentação associada e dados de configuração necessários para fazer esse programa operar corretamente. Um sistema de software desenvolvido profissionalmente é mais que apenas um programa; ele é normalmente uma série de programas separados e arquivos de configuração usados para configurar esses programas. Isso inclui documentação do sistema (descreve a sua estrutura), documentação do usuário (explica como usar o sistema), e sites para o usuário baixar informações recentes do produto. Engenheiros de software preocupam-se em desenvolver produtos de softwares (softwares que podem ser vendidos). Existem dois tipos de produtos de software: 1. Produtos genéricos: São os sistemas chamados stand-alone, que são os que são vendidos para qualquer cliente que esteja interessado em compra-los. Exemplos: ferramentas de banco de dados, processadores de texto, pacotes gráficos, etc. E também as aplicações verticais, tais como, sistemas de biblioteca, contabilidade, e manutenção de registros de alguma empresa. 2. Produtos sob encomenda: São criados para atender um fim específico e um cliente particular. É desenvolvido especificamente para esse cliente. Exemplo: sistema de controle de tráfego aéreo. O que é software? R: Softwares são programas de computador e documentação associada. Quais os atributos de um bom software? R: Prover a funcionalidade e o desempenho requerido pelo usuário; deve ser confiável, fácil de manter e usar. Quais as principais atividades da engenharia de software? R: Especificação de software, desenvolvimento de software, validação de software e evolução de software. Quais os principais desafios da engenharia de software? R: Lidar com o aumento de diversidade, demandas pela diminuição do tempo para a entrega e desenvolvimento de software confiável. Quais sãos os custos da engenharia de software? R: 60% de desenvolvimento e 40% de testes. Sobre a qualidade dos softwares profissionais, devemos lembrar que o software é alterado pelas pessoas, além dos seus desenvolvedores. A qualidade não é apenas o que o software faz, mas também como ele se comporta quando está sendo executado, bem como a estrutura e a organização dos programas do sistema e a documentação associada. Isso reflete nos atributos de software, que são chamados de não funcionais ou de qualidade. Exemplos desses atributos: Tempo de resposta a uma consulta realizada pelo usuário e a compreensão do código do programa. A seguir uma tabela com as características essenciais de um sistema profissional de software: Manutenibilidade O software deve ser escrito de forma que possa evoluir para atender às necessidades do cliente. Esse é um atributo crítico, porque a mudança de software é um requisito inevitável de um ambiente de negócios em mudança. Confiança e proteção Inclui uma série de características como: confiabilidade, proteção e segurança. O software não pode causar prejuízos físicos ou financeiros no caso de falha no sistema e usuários maliciosos não devem ser capazes de acessar ou prejudicar o sistema. Eficiência O software não deve desperdiçar os recursos de sistema, como memória e ciclos do processador. Deve ser eficiente na capacidade de resposta, tempo de processamento, uso de memória, etc. Aceitabilidade O software deve ser aceitável para o tipo de usuário para o qual foi projetado. Isso significa que ele deve ser compreensível, usável e compatível com outros sistemas usados por ele. A engenharia de software não se preocupa apenas com os processos técnicos do desenvolvimento de software. Ela também inclui atividades como gerenciamento de projeto de software e desenvolvimento de ferramentas, métodos e teorias para apoiar a produção de software. Engenharia tem haver com obter resultados de qualidades requeridos dentro do cronograma e do orçamento. A abordagem sistemática usada na engenharia de software é, às vezes, chamada processo de software. Um processo de software é uma sequência de atividades que leva à produção de um produto de software. Existem quatro atividades fundamentais comuns a todos os processos de software. São elas: 1. Especificação de software: Clientes e engenheiros definem o que será produzido e as suas restrições de operação. 2. Desenvolvimento de software: projeto e programação 3. Validação de software: O software é verificado para garantir que está de acordo com o que o cliente quer. 4. Evolução de software: O software é modificado para atender a mudança de requisitos do cliente e do mercado. Além das quatro atividades fundamentais também existem três aspectos gerais que afetam vários tipos diferentes de software: 1. Heterogeneidade: O sistema deve rodar em diferentes tipos de computadores e dispositivos móveis. Integração entre sistemas novos e antigos e escritos em linguagens de programação diferentes. Desenvolver um software confiável que seja flexível o suficiente para lidar com essa heterogeneidade. 2. Mudança de negócio e social: As técnicas de desenvolvimento devem evoluir junto com a sociedade e o surgimento de novas tecnologias para que o tempo requerido para o software da retorno a seus clientes seja reduzido também. 3. Segurança e confiança: Precisamos ter certeza de que os usuários maliciosos não possam atacar nosso software e de que a proteção da informação seja mantida. Engenharia de software é uma abordagem sistemática para a produção de software; ela analisa questões práticas de custo, prazo e confiança, assim como as necessidades dos clientes e produtores do software. A forma como ela é realmente implementada varia de acordo com a organização que está desenvolvendo, o tipo de software e as pessoas envolvidas no processo de desenvolvimento. Não existe um método global de desenvolvimento, mas um conjunto diverso de métodos e ferramentas. Talvez o fator mais significante em determinar quais técnicas e métodos de engenharia de software são mais importantes seja o tipo de aplicação a ser desenvolvida. Vejam alguns tipos diferentes de aplicações: 1. Aplicações stand-alone: Aplicações executadas em computador local, não precisam estar conectadas a uma rede. 2. Aplicações interativas baseadas em transações; 3. Sistemas de controle embutido; 4. Sistemas de processamento de lote; 5. Sistemas de entretenimento; 6. Sistemas para modelagem e simulação; 7. Sistemas de coleta de dados; 8. Sistemas de Sistemas. Além 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; 2. Confiança e desempenho são importantes para todos os tipos de sistema; 3. É importante entender e gerenciar as especificações e os requisitos de software (o que o software deve fazer); 4. Você deve fazer o melhor uso possível dos recursos existentes. Pontos importantes: 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 é 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 a 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. CAPITULO 2 Um processo de software é um conjunto de atividades relacionadas que levam à produção de um produto de software. Existem muitos processos de softwares diferentes, mas todos devem incluir quatro atividades fundamentais para a engenharia de software: 1. Especificações de software 2. Projeto e implementação de software 3. Validação de software 4. Evolução de software Os processos de software, às vezes, são categorizados como dirigidos a planos ou a 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 projeto inicial. Em processos ágeis 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 ágeis e os processos dirigidos a planos. A seguir alguns modelos de processos utilizados na engenharia de software: Modelo em cascata: 1. Análise e definição de requisitos: Os serviços, restrições, e metas do sistema são estabelecidos por meio de consulta ao usuário. Em seguida, são definidos em detalhes e funcionam como uma especificação do sistema. 2. Projeto de sistema e software: O processo de projeto de sistemas aloca os requisitos tanto para sistemas de hardware como para os sistemas de software, por meio da definição de uma arquitetura geral do sistema. O projeto de software envolve identificação e descrição das abstrações fundamentais do sistema de software e seus relacionamentos. 3. Implementação e teste unitário: Durante esse estágio, o projeto de software é desenvolvido como um conjunto de programas ou unidades de programas. O teste unitário envolve a verificação de que cada unidade atenda a sua especificação. 4. 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 software é entregue ao cliente. 5. Operação e manutenção: A manutenção envolve a correção de erros que não foram descobertos em estágios iniciais. Nesse modelo, o estágio seguinte não deve ser iniciado até que a fase anterior seja concluída. Por causa dos custos de produção e aprovação de documentos, as iterações podem ser dispendiosas e envolver significativos retrabalho. 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. As atividades de especificação, desenvolvimento e validação são intercaladas, e não separadas, com rápido feedback entre todas as atividades. Engenharia de software orientada a reuso Na maioria dos projetos de software, há algum reuso de software. Isso acontece muitas vezes informalmente, quando as pessoas envolvidas no projeto sabem de projetos ou códigos semelhantes ao que é exigido. Elas o buscam, fazem as modificações necessárias e incorporam-nos a seus sistemas. Apesar do modelo de reuso ter estágios comparáveis com outros processos de software, ele difere nos estágios intermediários. Vejam quais são eles: 1. Análise de componentes: Dada a especificação de requisitos, é feita uma busca de componentes para implementar essa especificação. Os componentes que podem ser usados podem apenas fornecer alguma funcionalidade necessária. 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. 3. Projeto do sistema com reuso: Durante este 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 reuso. 4. Desenvolvimento e integração: Softwares que não podem ser adquiridos externamente são desenvolvidos, e os componentes e sistemas 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 separada. Engenharia de software orientada a reuso tem a vantagem óbvia de reduzir a quantidade de software a ser desenvolvido, e, assim, reduzir custos e riscos. Geralmente, também proporciona a entrega mais rápida do software. Especificação de software ou engenharia de requisitos é o processo de compreensão e definição dos serviços requisitados do sistema e identificação de restrições relativas à operação e ao desenvolvimento do sistema. Essa é uma parte crítica do processo de software, pois erros nessa fase inevitavelmente geram problemas no projeto e na implementação do sistema. O processo de engenharia de requisitos tem como objetivo produzir um documento de requisitos acordados que especifica um sistema que satisfaz os stakeholders. Existem quatro atividades principais do processo de engenharia de requisito: 1. Estudo de viabilidade 2. Elicitação e análise de requisitos 3. Especificação de requisitos 4. Avaliação de requisitos. As atividades no processo de requisitos não são feitas em apenas uma sequencia. A análise de requisitos continua durante a definição e especificação, e novos requisitos emergem durante o processo. Por tanto, as atividades de análise, definição e especificação são intercaladas. O estágio de implementação do desenvolvimento de software é o processo de conversão do sistema em um sistema executável. Um projeto de software é uma descrição da estrutura do software a ser implementado, dos modelos e estruturas de dados usados pelo sistema, das interfaces entre os componentes do sistema e, às vezes, dos algoritmos usados. Os projetistas não chegam a um projeto final imediatamente, mas desenvolvem-no de forma iterativa. Eles acrescentam formalidade e detalhes, enquanto desenvolvem seu projeto por meio de revisões constantes para correção de projetos anteriores. A validação de software tem a intenção de mostrar que um software se adequa a suas especificações ao mesmo tempo em que satisfaz as especificações do cliente do sistema. O teste do programa é a principal técnica de validação. A validação também pode envolver processos de verificação, como inspeções e revisões, em cada estágio do processo de software, desde a definição dos requisitos de usuários até o desenvolvimento do programa. Erros em componentes de programa podem vir à luz durante os testes de sistema. O processo é, portanto, iterativo, com informações realimentadas de estágios posteriores para partes anteriores do processo. Os estágios do processo de teste são: 1. Testes de desenvolvimento 2. Teste de sistema 3. Teste de aceitação Se uma abordagem incremental é usada para o desenvolvimento, cada incremento deve ser testado enquanto é desenvolvido. • Pontos importantes: 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 comunicas as necessidades de sistemas 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 projetos 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 a sua especificação e satisfaz às necessidades reais do usuário 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 continuas, 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 projetos. 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. 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, projetos, etc.) dessas fases. CAPITULO 3 Os processos de desenvolvimento rápido de software são concebidos para produzir, rapidamente, softwares úteis. O software não é desenvolvido como uma única unidade, mas como uma série de incrementos – cada incremento inclui uma nova funcionalidade do sistema. Embora existam muitas abordagens para o desenvolvimento rápido de software, elas compartilham algumas características fundamentais: 1. Os processos de especificação, projeto e implementação são intercalados. 2. O sistema é desenvolvido em uma série de versões. 3. Interfaces de usuário do sistema são geralmente desenvolvidas com um sistema interativo de desenvolvimento que permite a criação rápida do projeto de interface por meio de desenho e posicionamento de ícones na interface. Os métodos ágeis são métodos de desenvolvimento incremental em que os incrementos são pequenos e, normalmente, as novas versões do sistema são criadas e disponibilizadas aos clientes a cada duas ou três semanas. Elas envolvem os clientes no processo de desenvolvimento para obter feedback rápido sobre a evolução dos requisitos. Assim, minimiza-se a documentação, pois se utiliza mais a comunicação informal do que reuniões formais com documentos escritos. Métodos ágeis permitiram que a equipe de desenvolvimento focasse no software em si, e não em sua concepção e documentação. Métodos ágeis, universalmente, baseiam-se em uma abordagem incremental para a especificação, o desenvolvimento e a entrega do software. Destinam-se a entregar o software rapidamente aos clientes, em funcionamento, e estes podem, em seguida, propor alterações e novos requisitos a serem incluídos nas iterações posteriores do sistema. Tem como objetivo reduzir a burocracia do processo, evitando qualquer trabalho de valor duvidoso de longo prazo e qualquer documentação que provavelmente nunca será usada. Os princípios dos métodos ágeis: Envolvimento do cliente Os clientes devem estar intimamente envolvidos no processo de desenvolvimento. Seu papel é fornecer e priorizar novos requisitos do sistema e avaliar suas iterações. Entrega incremental O software é desenvolvido em incrementos com o cliente, especificando os requisitos pra serem incluídos em cada um. Pessoas, não processos. As habilidades da equipe de desenvolvimento devem ser reconhecidas e exploradas. Membros da equipe devem desenvolver suas próprias maneiras de trabalhar, sem processos prescritivos. Aceitar as mudanças Deve-se ter em mente que os requisitos do sistema vão mudar. Por isso, projete o sistema de maneira a acomodar essas mudanças. Manter a simplicidade Focalize a simplicidade, tanto do software a ser desenvolvido quanto do processo de desenvolvimento. Sempre que possível, trabalhe ativamente para eliminar a complexidade do sistema. 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. Em uma abordagem dirigida a planos, ocorrem iterações no âmbito das atividades com documentos formais, usados para estabelecer a comunicação entre os estágios do processo. Por exemplo, os requisitos vão evoluir e, finalmente, será produzida uma especificação de requisitos. Em uma abordagem ágil, iterações ocorrem em todas as atividades. Por tanto, os requisitos e o projeto são desenvolvidos em conjunto, e não separadamente. Extreme Programming (XP) é talvez o mais conhecido e mais utilizado dos métodos ágeis, 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 estó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: 1. O desenvolvimento incremental é sustentado por meio de pequenos e frequentes releases do sistema. 2. O envolvimento do cliente é sustentando por meio do engajamento contínuo do cliente com a equipe de desenvolvimento. 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 que não envolve horas excessivas de trabalho. 4. As mudanças são aceitas por meio de releases contínuos para os clientes. 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. Em um processo XP, os clientes estão intimamente envolvidos na especificação e priorização dos requisitos do sistema. Os requisitos não estão especificados como uma lista de funções requeridas do sistema. Pelo contrário, o cliente do sistema é parte da equipe de desenvolvimento e discute cenários com outros membros da equipe. Juntos, eles desenvolvem um ‘cartão de estórias’, englobando as necessidades do cliente. A equipe de desenvolvimento, então, tenta implementar esse cenário em um release futuro do software. Os cartões de estória são as principais entradas para o processo de planejamento em XP ou ‘jogo de planejamento’. Esse processo geralmente envolve discussões com o cliente para refinamento dos requisitos. O cliente, então, prioriza as estórias para implementação, escolhendo aquelas que podem ser usadas imediatamente para oferecer apoio aos negócios. A intenção é identificar funcionalidade útil que possa ser implementada em cerca de duas semanas, quando o próximo release do sistema é disponibilizado para o cliente. Claro que, como os requisitos mudam, as estórias não implementadas mudam ou podem ser descartadas. Se houver necessidade de mudanças em um sistema que já tenha sido entregue, novos cartões de estória são desenvolvidos e, mais uma vez, o cliente decide se essas mudanças devem ter prioridade sobre a nova funcionalidade. 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 incluiu 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. Envolvimentos dos usuários no desenvolvimento de testes e validação 4. Uso de frameworks de testes automatizados. O desenvolvimento test-first é uma das mais importantes inovações no XP. Em vez de escrever algum código e, em seguida, escrever testes para esse código, você escreve os testes antes do código. Isso significa que você pode executar o teste enquanto o código está sendo escrito e pode encontrar problemas durante o desenvolvimento. No desenvolvimento test-first, os implementadores de tarefas precisam entender completamente a especificação para que possam escrever testes para o sistema. Isso significa que as ambiguidades e omissões da lista de especificações devem ser esclarecidas antes do inicio da implementação. Além disso, também evita o problema de ‘test-lag’. Isso pode acontecer quando o desenvolvedor do sistema trabalha em um ritmo mais rápido que o testador. A implementação fica mais e mais à frente dos testes e desenvolve-se uma tendência a ignorar os testes, a fim de que o cronograma de desenvolvimento possa ser mantido. 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 contrario, 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. O uso da programação em pares tem uma série de vantagens: 1. Dá suporte a ideia de propriedade e responsabilidade coletiva para o sistema. 2. Atua como um processo de revisão informal, porque cada linha de código é observada por, pelo menos, duas pessoas. 3. Dá suporte à refatoração, que é um processo de melhoria de software. • PONTOS IMPORTANTES: 1. 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. 2. A decisão de usar 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. 3. Extreme Programming é um método ágil, bem conhecido, que integra um conjunto de boas praticas de programação, como releases frequentes do software, melhorias contínuas do software e participação do cliente na equipe de desenvolvimento. 4. 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. 5. 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. 6. 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 continua é praticamente impossível quando existem varias equipes de desenvolvimento separadas trabalhando em um projeto.