Engenharia de Software
Transcrição
Engenharia de Software
Engenharia de Software Metodologias de Desenvolvimento de Sistemas PDF gerado usando o pacote de ferramentas em código aberto mwlib. Veja http://code.pediapress.com/ para mais informações. PDF generated at: Wed, 29 Sep 2010 14:56:00 UTC Conteúdo Páginas Engenharia de software 1 Software Engineering Body of Knowledge 8 Requisitos de Software 9 Projeto de Software 18 Teste de software 18 Gerência de Configuração de Software 25 Processos de Engenharia de Software 34 Qualidade de Software 36 Modelos ciclo de vida 39 Análise Estruturada 43 Projeto Estruturado 43 Programação Estruturada 44 Análise Essencial 44 SADT 48 DFD 48 Modelo de Entidades e Relacionamentos 49 Orientação a Objetos 49 Rational Unified Process 52 Scrum 60 Programação extrema 64 Microsoft Solution Framework 67 Diagrama de contexto 71 Diagrama de fluxos de dados 71 Diagrama entidade relacionamento 72 Dicionário de dados 73 Tabela de decisão 74 Árvore de decisão 75 Diagrama de transição de estados 75 Processo de desenvolvimento de software 77 Análise de requisitos de software 81 Especificação de Programa 81 Arquitetura de software 82 Programação de computadores 86 Teste de Software 89 Documentação de software 96 Manutenção de software 97 CMMI 98 SPICE 102 ISO 12207 104 MPS/Br 104 Referências Fontes e Editores da Página 108 Fontes, Licenças e Editores da Imagem 110 Licenças das páginas Licença 111 Engenharia de software Engenharia de software Engenharia de software é uma área do conhecimento da computação voltada para a especificação, desenvolvimento e manutenção de sistemas de software aplicando tecnologias e práticas de gerência de projetos e outras disciplinas, objetivando organização, produtividade e qualidade. Atualmente, essas tecnologias e práticas englobam linguagens de programação, banco de dados, ferramentas, plataformas, bibliotecas, padrões, processos e a questão da Qualidade de Software. Os fundamentos científicos para a engenharia de software envolvem o uso de modelos abstratos e precisos que permitem ao engenheiro especificar, projetar, implementar e manter sistemas de software, avaliando e garantindo suas qualidades. Além disso, a engenharia de software deve oferecer mecanismos para se planejar e gerenciar o processo de desenvolvimento de um sistema de informação Sistema computacional, pois ambos se confundem! Definição Friedrich Ludwig Bauer foi o primeiro a defini-la como sendo: "Engenharia de Software é a criação e a utilização de sólidos princípios de engenharia a fim de obter software de maneira econômica, que seja confiável e que trabalhe eficientemente em máquinas reais". O próprio significado de engenharia já traz os conceitos de criação, construção, análise, desenvolvimento e manutenção. A Engenharia de Software se concentra nos aspectos práticos da produção de um sistema de software, enquanto a ciência da computação estuda os fundamentos teóricos dos aspectos computacionais. O termo foi criado na década de 1960 e utilizado oficialmente em 1968 na NATO Conference on Software Engineering (Conferência sobre Engenharia de Software da OTAN). Sua criação surgiu numa tentativa de contornar a crise do software e dar um tratamento de engenharia (mais sistemático e controlado) ao desenvolvimento de sistemas de software complexos. Um sistema de software complexo se caracteriza por um conjunto de componentes abstratos de software (estruturas de dados e algoritmos) encapsulados na forma de procedimentos, funções, módulos, objetos ou agentes e interconectados entre si, compondo a arquitetura do software, que deverão ser executados em sistemas computacionais. Os fundamentos científicos envolvem o uso de modelos abstratos e precisos que permitem ao engenheiro especificar, projetar, implementar e manter sistemas de software, avaliando e garantindo suas qualidades. Além disto, deve oferecer mecanismos para se planejar e gerenciar o processo de desenvolvimento. Empresas desenvolvedoras de software passaram a empregar esses conceitos sobretudo para orientar suas áreas de desenvolvimento, muitas delas organizadas sob a forma de Fábrica de Software. A Engenharia de Sistemas é uma área mais ampla por tratar de todos os aspectos de sistemas baseados em computadores, incluindo hardware e engenharia de processos além do software. Áreas de Conhecimento Segundo o SWEBOK (Corpo de Conhecimento da Engenharia de Software), versão 2004, as áreas de conhecimento da Engenharia de Software são: • • • • • Requisitos (Requirements) de Software Projeto (Design) de Software Construção (Construction) de Software Teste (Testing) de Software Manutenção (Maintenance) de software • Gerência de Configuração de Software • Gerência de Engenharia de Software 1 Engenharia de software • Processos de Engenharia de Software • Ferramentas e Métodos de Engenharia de Software • Qualidade (Quality) de Software Conforme Pressman, a Engenharia de Software (ES) é uma tecnologia em camadas. E a base de todas essas camadas é o foco na qualidade do software desenvolvido. Portanto, inclusive do ponto de vista didático, é interessante estudarmos a ES em suas camadas de Processo, Métodos e Ferramentas. Processo de Software Processo de software, ou processo de engenharia de software, é uma seqüência coerente de práticas que objetiva o desenvolvimento ou evolução de sistemas de software. Estas práticas englobam as atividades de especificação, projeto, implementação, testes e caracterizam-se pela interação de ferramentas, pessoas e métodos. SEE e PSEE são os ambientes voltados ao desenvolvimento e manutenção de processos. O projeto ExPSEE é uma continuação dos estudos de processos, principalmente do ambiente PSEE. Devido ao uso da palavra projeto em muitos contextos, por questões de clareza, há vezes em que se prefira usar o original em inglês design. Modelos de Processo de Software Um modelo de processo de desenvolvimento de software, ou simplesmente modelo de processo, pode ser visto como uma representação, ou abstração dos objetos e atividades envolvidas no processo de software. Além disso, oferece uma forma mais abrangente e fácil de representar o gerenciamento de processo de software e consequentemente o progresso do projeto. Exemplos de alguns modelos de processo de software; • Modelos ciclo de vida • Sequencial ou Cascata (do inglês waterfall) - com fases distintas de especificação, projeto e desenvolvimento. • Desenvolvimento iterativo e incremental - desenvolvimento é iniciado com um subconjunto simples de Requisitos de Software e interativamente alcança evoluções subseqüentes das versões até o sistema todo estar implementado • Evolucional ou Prototipação - especificação, projeto e desenvolvimento de protótipos. • V-Model - Parecido com o modelo cascata, mas com uma organização melhor, que permite que se compare com outros modelos mais modernos. • Espiral - evolução através de vários ciclos completos de especificação, projeto e desenvolvimento. • Componentizado - reuso através de montagem de componentes já existentes. • Formal - implementação a partir de modelo matemático formal. • Ágil • RAD • Quarta geração É muito importante o desenvolvimento do software. 2 Engenharia de software Modelos de Maturidade Os modelos de maturidade são um metamodelo de processo. Eles surgiram para avaliar a qualidade dos processos de software aplicados em uma organização (empresa ou instituição). O mais conhecido é o Capability Maturity Model Integration (CMMi), do Software Engineering Institute - SEI. O CMMi pode ser organizado através de duas formas: Contínua e estagiada. Pelo modelo estagiado, mais tradicional e mantendo compatibilidade com o CMM, uma organização pode ter sua maturidade medida em 5 níveis: • Nível 1 - Caótico; • Nível 2 - Capacidade de repetir sucessos anteriores pelo acompanhamento de custos, cronogramas e funcionalidades; • Nível 3 - O processo de software é bem definido, documentado e padronizado; • Nível 4 - Realiza uma gerência quantitativa do processo de software e do produto; • Nível 5 - Usa a informação quantitativa para melhorar continuamente e gerenciar o processo de software. O CMMi é um modelo de maturidade recentemente criado com o fim de agrupar as diferentes formas de utilização que foram dadas ao seu predecessor, o CMM. O (MPS.BR), ou Melhoria de Processos do Software Brasileiro, é simultaneamente um movimento para a melhoria e um modelo de qualidade de processo voltada para a realidade do mercado de pequenas e médias empresas de desenvolvimento de software no Brasil. Metodologias e Métodos O termo metodologia é bastante controverso nas ciências em geral e na Engenharia de Software em particular. Muitos autores parecem tratar metodologia e método como sinônimos, porém seria mais adequado dizer que uma metodologia envolve princípios filosóficos que guiam uma gama de métodos que utilizam ferramentas e práticas diferenciadas para realizar algo.[1] Assim teríamos, por exemplo, a Metodologia Estruturada, na qual existem vários métodos, como Análise Estruturada e Projeto Estruturado (muitas vezes denominados SA/SD, e Análise Essencial). Tanto a Análise Estruturada quanto a Análise Essencial utilizam a ferramenta Diagrama de Fluxos de Dados para modelar o funcionamento do sistema. • Metodologia Estruturada • Análise Estruturada • Projeto Estruturado • Programação Estruturada • Análise Essencial • SADT • DFD - Diagrama de Fluxo de Dados • MER - Modelo de Entidades e Relacionamentos • Metodologia Orientada a Objetos • Orientação a Objetos • Rational Unified Process ( RUP ) • Desenvolvimento ágil de software • • • • Feature Driven Development ( FDD ) Enterprise Unified Process (EUP) Scrum (Scrum) Crystal (Crystal Clear, Crystal Orange, Crystal Orange Web) • Programação extrema ( XP ) • Outras Metodologias 3 Engenharia de software • Microsoft Solution Framework ( MSF ) Modelagem A abstração do sistema de software através de modelos que o descrevem é um poderoso instrumento para o entendimento e comunicação do produto final que será desenvolvido. A maior dificuldade nesta atividade está no equilíbrio (tradeoff) entre simplicidade (favorecendo a comunicação) e a complexidade (favorecendo a precisão) do modelo. Para a modelagem podemos citar 3 métodos: • Análise estruturada, criada por Gane & Searson; • Análise Essencial, criada por Palmer & McMenamin e Ed. Yourdon; • UML criada por Grady Booch, Ivar Jacobson & Jaimes Rumbaugh (veja exemplos). Atualmente a modelagem mais recomendada, e sendo a mais comum, é a utilização da linguagem UML. Ferramentas, Tecnologias e Práticas A engenharia de software aborda uma série de práticas e tecnologias, principalmente estudadas pela ciência da computação, enfocando seu impacto na produtividade e qualidade de software. Destacam-se o estudo de linguagem de programação, banco de dados e paradigmas de programação, como: • • • • • Programação estruturada Programação funcional Programação orientada a objetos Componentes de Software Programação orientada a aspecto Ferramentas Outro ponto importante é o uso de ferramentas CASE (do inglês Computer-Aided Software Engineering). Essa classificação abrange toda ferramenta baseada em computadores que auxiliam atividades de engenharia de software, desde a análise de requisitos e modelagem até programação e testes. Os ambientes de desenvolvimento integrado (IDEs) têm maior destaque e suportam, entre outras coisas: • • • • • • • • • • • Editor Compilador Debug Geração de código Modelagem Deploy Testes não automatizados Testes automatizados Refatoração (Refatoring) Gestão de Riscos nos projectos de Software Uso da Prototipagem na Eng. de Requisitos 4 Engenharia de software Gerência de Projetos A gerência de projetos se preocupa em entregar o sistema de software no prazo e de acordo com os requisitos estabelecidos, levando em conta sempre as limitações de orçamento e tempo. A gerência de projetos de software se caracteriza por tratar sobre um produto intangível, muito flexível e com processo de desenvolvimento com baixa padronização. Planejamento O planejamento de um projeto de desenvolvimento de software inclui: • • • • • • Análise Econômica de Sistemas de Informações organização do projeto (incluindo equipes e responsabilidades) estruturação das tarefas (do inglês WBS - work breakdown structure) cronograma do projeto (do inglês project schedule) análise e gestão de risco estimativa de custos Essas atividades sofrem com dificuldades típicas de desenvolvimento de software. A produtividade não é linear em relação ao tamanho da equipe e o aumento de produtividade não é imediato devido aos custos de aprendizado de novos membros. A diminuição de qualidade para acelerar o desenvolvimento constantemente prejudica futuramente a produtividade. A estimativa de dificuldades e custos de desenvolvimentos são muito difíceis, além do surgimento de problemas técnicos. Esses fatores requerem uma análise de riscos cuidadosa. Além da própria identificação dos riscos, há que ter em conta a sua gestão. Seja evitando, seja resolvendo, os riscos necessitam ser identificados (estimando o seu impacto) e devem ser criados planos para resolução de problemas. Análise de Requisitos As atividades de análise concentram-se na identificação, especificação e descrição dos requisitos do sistema de software. Em resumo, requisito é uma necessidade que o software deve cumprir. Há várias interpretações e classificações sobre requisitos, entre elas: • • • • funcional não funcional de usuário de sistema É comum que o cliente não saiba o que ele realmente deseja, que haja problemas na comunicação e ainda que haja mudança constante de requisitos. Todos esses fatores são recrudescidos pela intangibilidade sobre características de sistemas de software, principalmente sobre o custo de cada requisito. • Estudo de Viabilidade (Levantamento de Requisitos) A Engenharia de requisitos é um processo que envolve todas as atividades exigidas para criar e manter o documento de requisitos de sistema (SOMMERVILLE). Segundo RUMBAUGH, alguns analistas consideram a engenharia de Requisitos como um processo de aplicação de um método estrutura como a analise orientada a objetos. No entanto, a Engenharia de requisitos possui muito mais aspectos do que os que estão abordados por esses métodos. Abaixo um pequeno Processo de Engenharia de Requisitos (SOMMERVILLE). Estudo da viabilidade → "Relatório de Viabilidade" Obtenção e Analise de Requisitos → "Modelos de Sistema" Especificação de Requisitos → "Requisitos de Usuário e de Sistema" Validação de Requisitos → "Documento de Requisitos" 5 Engenharia de software 6 O primeiro processo a ser realizado num Sistema novo é o Estudo de Viabilidade. Os resultados deste processo devem ser um relatório com as recomendações da viabilidade técnica ou não da continuidade no desenvolvimento do Sistema proposto. Basicamente um estudo de viabilidade, embora seja normalmente rápido, deverá abordar fundamentalmente as seguintes questões: O Sistema proposto contribui para os objetivos gerais da organização? O Sistema poderá ser implementado com as tecnologias dominadas pela equipe dentro das restrições de custo e de prazo? Ou precisa de treinamentos adicionais? O Sistema pode ser integrado, e é compatível com os outros sistemas já em operação? Gestão • • • • • Pessoal Produto Processo Projeto Material Histórico A Engenharia de Software (ES) surgiu em meados dos anos 1970 numa tentativa de contornar a crise do software e dar um tratamento de engenharia (mais sistemático e controlado) ao desenvolvimento de sistemas de software complexos. Um sistema de software complexo se caracteriza por um conjunto de componentes abstratos de software (estruturas de dados e algoritmos) encapsulados na forma de procedimentos, funções, módulos, objetos ou agentes interconectados entre si, compondo a arquitetura do software, que deverão ser executados em sistemas computacionais. ES no Presente e Tendências Atualmente existe um destaque todo especial para a Engenharia de Software na Web. Também utilizado por Presmann a sigla WebE, é o processo usado para criar WebApps (aplicações baseadas na Web) de alta qualidade. Embora os princípios básicos da WebE sejam muito próximos da Engenharia de Software clássica, existem peculiaridades específicas e próprias. Com o advento do B2B (e-business) e do B2C (e-commerce), e ainda mais com aplicações para a Web 2.0, maior importância ficou sendo esse tipo de engenharia. Normalmente adotam no desenvolvimento a arquitetura MVC (Model-View-Controller). Outra área de tendência em Engenharia de Software trata da aplicação de técnicas otimização matemática para a resolução de diversos problemas da área. A área, denominada Search-based software engineering, ou Otimização em engenharia de software em Português, apresenta vários resultados interessantes.[2] Para mais detalhes em Português, ver texto com aplicações da otimização em engenharia de software [3].[4] [1] Veja mais detalhes em Metodologia (engenharia de software) [2] HARMAN, M., JONES, B.F., Search-based software engineering, Information and Software Technology, 2001, pp. 833-839. [3] http:/ / goes. comp. uece. br/ resources/ Search-based%20Software%20Engineering%20-%20Aplicação%20de%20Metaheurísticas%20em%20Problemas%20da%20Engenharia%20de%20Software%20R pdf [4] FREITAS, F.G., MAIA, C.L.B., COUTINHO, D.P., CAMPOS, G.A.L., SOUZA, J.T., Aplicação de Metaheurísticas em Problemas da Engenharia de Software: Revisão de Literatura (http:/ / goes. comp. uece. br/ resources/ Search-based Software Engineering - Aplicação de Metaheurísticas em Problemas da Engenharia de Software Revisão de Literatura (Otimização em Engenharia de Software). pdf), II Congresso Tecnológico Infobrasil, 2009, Engenharia de software Bibliografia • MAGELA, Rogerio. Engenharia de Software Aplicada: Princípios (volume 1). Alta Books. 2006. • MAGELA, Rogerio. Engenharia de Software Aplicada: Fundamentos (volume 2). Alta Books. 2006. • MOLINARI, Leonardo. Gerência de Configuração - Técnicas e Práticas no Desenvolvimento do Software. Florianópolis: Visual Books, 2007. 85-7502-210-5 • PRESSMAN, Roger. Software Engineering: A Practitioner's Approach, 6ªedição, Mc Graw Hill, 2005. • ECONÔMICA DE SISTEMAS DE INFORMAÇÕES. (http://www.editoraixtlan.com/livros.htm''ANÁLISE) (ISBN 978-85-909374-7-0) Editora Ixtlan. Autor : Sergio Kaminski. Comentário: Mostra todas as etapas de desenvolvimento do software, relacionando ao lucro,receita e custo. Ligações externas • Site dos alunos da Graduação em Engenharia de Software da Universidade Federal de Goiás - UFG (http://www. engenhariadesoftwarebrasil.com) • Bacharelado em Engenharia de Software (http://engenhariadesoftware.inf.br/home) ( Graduação em Engenharia de Software (http://engenhariadesoftware.inf.br/home)) Curso superior oferecido pelo Instituto de Informática --- Universidade Federal de Goiás. • GPES (http://www.gpes.dcc.ufmg.br/) Grupo de Pesquisa em Engenharia de Software do Departamento de Ciência da Computação da Universidade Federal de Minas Gerais. • Praxis - Processo de desenvolvimento de software com enfoque educacional • Software da gerência de OEE (http://www.capstonemetrics.com/files/understanding-oee.html) • Podcasts bem interessantes (em português) sobre áreas de interesse da Engenharia de Software (http://www. improveit.com.br/podcast) CMMI, MPS.BR, Scrum, Extreme Programming e Lean Software Development • Revista Engenharia de Software (http://www.devmedia.com.br/esmag) Revista sobre Engenharia de Software em portugues • Graduação em Engenharia de Software na Universidade de Brasilia - FGA (http://www.fga.unb.br/unbgama) Novo Campus da Universidade de Brasília • Grupo de Otimização em Engenharia de Software da Universidade Estadual do Ceará (GOES.UECE) (http:// goesuece.yolasite.com) Grupo de Otimização em Engenharia de Software da Universidade Estadual do Ceará (GOES.UECE) Ver também • • • • • • Desenvolvimento de software Qualidade de software Software Engineering Body of Knowledge Análise Econômica de Sistemas de Informações Matriz CRUD Otimização em engenharia de software 7 Software Engineering Body of Knowledge Software Engineering Body of Knowledge O Guide to the Software Engineering Body of Knowledge, conhecido pela sigla SWEBOK, é um documento criado sob o patrocínio da IEEE com a finalidade de servir de referência em assuntos considerados, de forma generalizada pela comunidade, como pertinentes a área de Engenharia de Software. O SWEBOK apresenta uma classificação hierárquica dos tópicos tratados pela Engenharia de Software, onde o nível mais alto são as Áreas do Conhecimento. Objetivos • • • • • Promover uma visão consistente da engenharia de software no mundo Clarear e marcar as fronteiras entre a engenharia de software e as outras disciplinas relacionadas Caracterizar o conteúdo da disciplina de engenharia de software Classificar em tópicos a área de conhecimento da engenharia de software Prover uma fundação para o desenvolvimento do currículo, para certificação individual e para licenciamento de material Áreas do Conhecimento • • • • • • • • • • Requisitos de Software Projeto de Software Construção de Software Teste de Software Manutenção de Software Gerência de Configuração de Software Gerência da Engenharia de Software Processo de Engenharia de Software Ferramentas e Métodos da Engenharia de Software Qualidade de Software Disciplinas Relacionadas • • • • • • • • Ciência da Computação Engenharia da Computação Engenharia de Sistemas Ergonomia de Software Gestão Gestão da Qualidade Gestão de Projeto Matemática 8 Software Engineering Body of Knowledge Crítica Como toda classificação hierárquica, foram tomadas decisões específicas sobre em que posição da hierarquia os tópicos deveriam aparecer, e que podem não ser considerados ideais por outros pesquisadores. Ver também • Engenharia de software • PMBOK Ligações externas • SWEBOK [1] - Neste sítio é possível baixar o guia pela Web. Referências [1] http:/ / www. swebok. org Requisitos de Software A engenharia de requisitos (no contexto da engenharia de software) é um processo que engloba todas as atividades que contribuem para a produção de um documento de requisitos e sua manutenção ao longo do tempo. Este processo deve ser precedido de estudos de viabilidade que, a partir das restrições do projeto, determinam se este é ou não viável e se deve prosseguir para a identificação dos requisitos. O processo de engenharia de requisitos é composto por quatro atividades de alto nível (Soares, 2005): 1. 2. 3. 4. Identificação. Análise e negociação. Especificação e documentação. Validação. Uma outra atividade que se pode considerar que faz também parte deste processo, se incluirmos a fase posterior à produção do documento (isto é, a sua "manutenção"), é a gestão dos requisitos ( change management [1], sendo que as alterações podem ser causadas pelos mais diversos fatores desde inovações tecnológicas a mudanças na natureza do negócio (e consequentemente nos requisitos), entre outras). Estudos de viabilidade Antes de se avançar com uma análise mais detalhada dos requisitos de um projeto, deve ser feito um estudo de viabilidade. Tal como o nome sugere, pretende-se com este estudo avaliar se, de um ponto de vista tecnológico e organizacional, o projeto é viável. Uma forma de avaliar a viabilidade de um projeto é obter, através da interação com "as partes interessadas" (ou stakeholder em inglês) do projeto (em reuniões ou entrevistas, por exemplo), a resposta às seguintes questões: • Será que o sistema contribui para os objetivos da organização? • Dadas as restrições tecnológicas, organizacionais (econômicas, políticas, ambientais, recursos disponíveis) e temporais associadas ao projeto, será que o sistema pode ser implementado? • Caso haja necessidade de integração entre diferentes sistemas, será que esta é possível? 9 Requisitos de Software A questão mais crítica é a primeira, já que um sistema que não contribua para os objetivos da organização não lhe traz qualquer valor acrescentado e como tal a sua existência não se justifica. Apesar de parecer óbvia, são frequentemente desenvolvidos sistemas que não contribuem para os objetivos das respectivas organizações, quer seja por interesses externos (políticos ou organizacionais) ou por falta de clareza na definição dos objetivos da organização. Deve portanto identificar-se que informação é necessária para responder a estas questões e quem possui esta informação, procedendo-se de seguida à recolha de todos os dados disponíveis para clarificar ao máximo o âmbito do projeto e avaliar a sua viabilidade. Tipicamente, quem poderá fornecer esta informação serão os utilizadores dos sistemas atuais e do sistema a implementar, os responsáveis pelos departamentos nos quais o sistema será usado, técnicos que estejam familiarizados com as tecnologias envolvidas (do novo sistema e dos sistemas existentes), responsáveis pela manutenção futura do sistema a implementar e, de um modo geral, todos aqueles que terão qualquer tipo de interação com o novo sistema (ou que sejam por ele afetados). Algumas das questões que podem ser postas nesta coleta de informações são, por exemplo: • Se o novo sistema não fosse implementado, quais seriam as alternativas para a organização? • Quais são os problemas que os sistemas atuais apresentam e como é que um sistema novo irá resolver estas falhas? • De que forma é que o sistema irá contribuir diretamente para os objetivos da organização? • É possível a integração com os outros sistemas da organização (de um ponto de vista tecnológico)? Com que facilidade é que se consegue partilhar informação entre estes sistemas? O estudo de viabilidade deverá culminar com a produção de um relatório e deverá determinar a continuação do desenvolvimento do projeto, tornando mais claras as restrições (econômicas, temporais e organizacionais) do projeto e definindo mesmo alguns requisitos de alto nível. Identificação Caso se determine que o projeto é viável, o passo seguinte é a identificação dos requisitos. Atividades envolvidas Algumas das atividades envolvidas nesta fase incluem: • Compreensão do domínio: é muito importante para o analista compreender o domínio no qual a organização e o projeto se inserem; quanto maior for o conhecimento acerca do domínio, mais eficaz será a comunicação entre o analista e as partes interessadas. • Identificação das partes interessadas: estes já deverão ter sido identificados nos estudos de viabilidade, porém para efeitos de identificação de requisitos convém concentrar as atenções nos utilizadores do sistema. • Captura: consiste na obtenção com o cliente dos requisitos (funcionais e não-funcionais) pretendidos para o sistema. • Identificação e análise de problemas: os problemas devem ser identificados (e a sua definição deve ser consensual) e devem ser propostas soluções em conjunto com as partes interessadas. 10 Requisitos de Software Dificuldades Esta fase não é trivial, sendo que existem algumas dificuldades típicas que lhe estão associadas: • O cliente pode não saber exatamente o que deseja para o sistema, ou sabê-lo mas não conseguir articulá-lo (o que é bastante comum). • Os requisitos identificados podem não ser realistas (do ponto de vista econômico ou tecnológico, por exemplo). • Cada parte interessada pode expressar os mesmos requisitos de formas diferentes, sendo necessário - através de um bom conhecimento do domínio - identificar estas situações. Técnicas para levantamento de requisitos Existem diversas técnicas de identificação de requisitos, e que são adequadas a diferentes situações, entre as quais podemos citar: Entrevistas e Questionários Entrevistas e Questionários é talvez a técnica mais simples de utilizar. Ainda que seja bastante eficaz numa fase inicial de obtenção de dados (e mesmo de esclarecimento de algumas dúvidas), está condicionada a alguns fatores: • Influência do entrevistador nas respostas do cliente: convém que o entrevistador dê margem ao entrevistado para expor as suas ideias sem as enviesar logo à partida. • Relação pessoal entre os intervenientes na entrevista. • Predisposição do entrevistado: caso, por exemplo, o papel do entrevistado venha a ser afetado pela introdução de um sistema na organização, este pode propositadamente dificultar o acesso à informação. • Capacidade de seguir um "plano" para a entrevista: na ausência destes planos é natural que haja tendência para que os intervenientes se dispersem um pouco, levando a que a entrevista demore mais tempo do que seria suposto. Caso a entrevista se torne demasiado longa, as pessoas podem cair na tentação de "querer despachar" sendo os últimos pontos da entrevista abordados de forma superficial (ou podem nem chegar a ser abordados). Workshops de requisitos • O Workshop de Requisitos consiste numa técnica usada através de uma reunião estruturada, da qual devem fazer parte um grupo de analistas e um grupo representando o cliente[2] , para então obter um conjunto de requisitos bem definidos. Ao contrário das reuniões, promove-se a interação entre todos os elementos presentes no workshop fomentando momentos de descontração como forma de dinamizar o trabalho em equipe, existindo um facilitador neutro cujo papel é conduzir o workshop e promover a discussão entre os vários intervenientes (ainda que não tenha realmente poder de decisão). As tomadas de decisão devem seguir processos bem definidos e devem resultar de um processo de negociação, mediado pelo facilitador. Uma técnica que é também útil em workshops é o uso de brainstorming (tempestade de idéias) como forma de gerar um elevado número de ideias numa pequena quantidade de tempo. Como resultado dos workshops deve ser produzida documentação que reflita os requisitos e decisões tomadas sobre o sistema a implementar. 11 Requisitos de Software Cenários • Uma forma de levar as pessoas a imaginarem o comportamento de um sistema é o uso de cenários. Através de exemplos práticos descritivos do comportamento de um sistema, os seus utilizadores podem comentar acerca do seu comportamento e da interação que esperam ter com ele. Trata-se de uma abordagem informal, prática e aplicável a qualquer tipo de sistema. De um modo geral, os cenários devem incluir os seguintes elementos: • Estado do sistema no início do cenário. • Sequência de eventos esperada (na ausência de erros) no cenário. • Listagem de erros que podem ocorrer no decorrer dos eventos do cenário e de como estes erros serão tratados. • Outras atividades que podem ser executadas ao mesmo tempo que as deste cenário. • Estado do sistema depois de o cenário terminar. Prototipagem O uso de prototipagem é feito em diversas fases do processo de engenharia de requisitos (por exemplo na identificação, análise e validação). Trata-se de uma versão inicial do sistema, baseada em requisitos ainda pouco definidos, mas que pode ajudar a encontrar desde cedo falhas que através da comunicação verbal não são tão facilmente identificáveis. Neste tipo de abordagem apenas são desenvolvidas algumas funcionalidades sendo normalmente desenvolvidas primeiro aquelas que são mais fáceis de compreender por parte do utilizador e que lhe podem trazer maior valor acrescentado (principalmente na prototipificação evolutiva, isto é, aquela que mais tarde é evoluída para a fase de desenvolvimento). O uso de protótipos deve ser considerado apenas mediante uma análise custo-benefício, já que os custos de desenvolvimento de um protótipo podem facilmente crescer, sendo particularmente úteis em situações em que a interface com os utilizadores é, para eles, um aspecto crítico. Estudo etnográfico Os Estudos Etnográficos é uma análise de componente social das tarefas desempenhadas numa dada organização. Quando um dado conjunto de tarefas se torna rotineiro para uma pessoa, é de se esperar que esta sinta dificuldade em articular todos os passos que segue ou todas as pessoas com as quais interage para as levar a cabo. Através de uma observação direta das atividades realizadas durante um período de trabalho de um funcionário é possível encontrar requisitos que não seriam observáveis usando técnicas convencionais. Esta observação pode ser acompanhada de registros áudio/vídeo, porém não convém usá-los em demasia visto que o tempo necessário para os processar pode ser demasiado. Nesta técnica assume-se que o representante do cliente observado desempenha as suas funções "corretamente", pelo que convém ter algum cuidado na escolha do mesmo. Análise e negociação dos requisitos Após a identificação dos requisitos do sistema, segue-se à etapa de análise e negociação dos mesmos. Atividades envolvidas Algumas das atividades envolvidas na análise de requisitos incluem: • Classificação: agrupamento de requisitos em "módulos" para facilitar a visão global do funcionamento pretendido para o sistema. • Resolução de conflitos: dada a multiplicidade e diversidade de papéis das partes interessadas envolvidas na captura e análise de requisitos, é inevitável a existência de conflitos nos requisitos identificados; é importante resolver estes conflitos o mais breve possível. • Prioritização: consiste na atribuição de uma "prioridade" a cada requisito (por exemplo elevada/média/baixa); obviamente, este pode ser um fator gerador de conflitos. • Confirmação: é confirmada com as partes interessadas a completude dos requisitos, sua consistência e validade (de acordo com o que se pretende do sistema). 12 Requisitos de Software Estas fases não são independentes entre si, pois uma informação obtida numa delas pode servir inclusive para as demais fases. A identificação e análise de requisitos é um processo iterativo que se inicia com a familiarização do domínio do futuro sistema e termina na confirmação dos requisitos, aumentando o grau de compreendimento do sistema a cada ciclo de trabalho. Dificuldades As dificuldades encontradas na análise são de diversas naturezas: • Fatores externos (políticos) podem influenciar os requisitos (alguma parte interessada, com poder de decisão, pode exigir requisitos específicos que sirvam aos seus interesses e não aos da organização, ou forçar o seu ponto de vista em detrimento dos demais interessados que irão operar o sistema). • O ambiente (económico e/ou organizacional) em que a análise é feita possui fatores dinâmicos, e como tal, os requisitos estão sujeitos a alterações em decorrência destes (por exemplo: novas partes interessadas são envolvidas no projeto, ou alterações em prazos e orçamentos disponíveis). Negociações Relativo à negociação, torna-se necessário ter alguns cuidados para que esta decorra sem problemas, chegando-se logo a consensos. Para tanto, faz-se algumas sugestões: • Saber lidar com ataques pessoais (evitando-os sempre que possível, remetendo a sua resolução para mais tarde, fora de reunião), de preferência nunca tomando partidos. • Fomentar a justificação das posições (negativas) tomadas pelos intervenientes na negociação. • Salientar (e procurar encontrar) os benefícios que uma solução apresenta para todos os envolvidos. • Relaxar restrições, quando se torna óbvio que as actuais não conseguem levar a um consenso. Especificação e documentação É nesta fase que se dá a produção propriamente dita do documento de especificação de requisitos. Em todos os tipos de especificação há 2 tipos de requisitos a considerar: • Requisitos funcionais: descrevem as funcionalidades que se espera que o sistema disponibilize, de uma forma completa e consistente. É aquilo que o utilizador espera que o sistema ofereça, atendendo aos propósitos para qual o sistema será desenvolvido. • Requisitos não-funcionais: referem-se a aspectos não-funcionais do sistema, como restrições nas quais o sistema deve operar ou propriedades emergentes do sistema. Costumam ser divididos em Requisitos não-funcionais de: Utilidade, Confiança, Desempenho, Suporte e Escalabilidade. Pode-se também considerar os requisitos do domínio, que tal como o nome indica derivam do domínio e não de necessidades específicas dos utilizadores, podendo depois ser classificados como funcionais ou não-funcionais. A documentação produzida poderá ter diferentes destinatários e como tal diferentes objetivos. Podem-se distinguir três tipos de especificação: • Especificação de requisitos do utilizador. • Especificação de requisitos do sistema. • Especificação do design da aplicação. A vantagem de conceber mais do que uma especificação para um dado sistema é a de em cada especificação se comunicar apenas um determinado tipo de informação adequado ao leitor a que se destina (usando "linguagens" que o utilizador conheça). Por exemplo, enquanto que nos requisitos do utilizador apenas é feita uma abordagem de alto nível das funcionalidades do sistema e suas restrições, usando linguagem natural e eventualmente diagramas 13 Requisitos de Software (esquemas), nos requisitos do sistema cada requisito é descrito com mais detalhe introduzindo já alguns conceitos relativos à arquitetura do sistema, fazendo-se uso de linguagens estruturadas (notações gráficos como diagramas de casos de uso). Requisitos do utilizador Os requisitos do utilizador destinam-se portanto aos vários níveis hierárquicos da organização na qual o sistema será implementado (desde gestores a utilizadores), pelo que são descritos usando apenas (conforme já foi referido) linguagem natural, formulários e diagramas muito simples. Obviamente, neste nível de especificação surgem algumas dificuldades: • Ambiguidade: torna-se difícil descrever os requisitos de uma forma inequívoca sem tornar a sua descrição muito longa ou de difícil compreensão. • Confusão: ainda que possa não ser tão relevante do ponto de vista do cliente, a distinção entre requisitos funcionais/não-funcionais e objetivos do sistema torna-se difícil. • Agrupamento de requisitos: ao descrever as funcionalidades de um sistema, pode tornar-se difícil separar claramente os requisitos, o que leva a que vários requisitos sejam expressos como sendo apenas um. Algumas considerações úteis a ter em conta ao escrever uma especificação de requisitos do utilizador: • Usar o mesmo formato em todos os requisitos (evitam-se omissões e facilita-se a verificação dos requisitos). • Distinguir claramente entre comportamentos esperados e desejáveis do sistema através do uso de expressões como "O sistema permitirá criar (...)" ou "Deverá ser possível criar (...)" respectivamente. É importante deixar claro o que o sistema tem de fazer e sugestões de como o deve fazer e, acima de tudo, usar este tipo de expressões de forma consistente ao longo de todo o documento. • Usar formatação de texto para salientar determinados aspectos do documento (usando negrito, por exemplo). • Evitar usar termos demasiado técnicos ou fora do âmbito do sistema, identificando-os e definindo-os de uma forma clara quando for absolutamente necessário usá-los. Requisitos do sistema Os requisitos do sistema têm um carácter mais técnico, consistindo numa descrição detalhada dos requisitos do utilizador correspondentes recorrendo ao uso, para além da linguagem natural, de linguagens estruturadas e notações gráficas. Estes requisitos destinam-se ainda aos utilizadores do sistema (e particularmente aos engenheiros que trabalhem nessa organização) e destinam-se também às equipes de especificação de arquitetura do sistema e de desenvolvimento. Tal como nos requisitos do utilizador, o uso de linguagem natural levanta problemas, embora alguns deles sejam ligeiramente diferentes: • As mesmas palavras podem, de acordo com a interpretação de cada pessoa, designar conceitos diferentes. • O mesmo requisito pode ser descrito de formas diferentes, o que leva a que cada pessoa tenha de saber quando é que descrições diferentes se referem ou não a requisitos diferentes. Design da aplicação Por fim, a especificação do design da aplicação consiste num documento usado pela equipe de desenvolvimento do sistema no qual estão definidos pormenores, em um nível mais técnico, acerca da implementação do sistema e sua arquitetura. A partir deste documento, um elemento que entre para a equipe de desenvolvimento no meio do projeto deverá ser capaz de "se situar" quando precisar de começar a codificar, compreendendo a forma como a implementação, em um nível global, está a ser feita, mas sem conhecer necessariamente os detalhes de implementação aprofundados. Não convém cair na tentação de deixar toda a implementação detalhada, uma vez que convém que os desenvolvedores tenham alguma margem de manobra tanto para inovar como para resolver problemas encontrados em sub-sistemas de formas que uma especificação inicial da arquitetura não consegue prever. 14 Requisitos de Software Documento de Especificação de Requisitos Apesar da existência dos 3 tipos de especificação vistos nos itens anteriores, existe uma especificação que é a usada como declaração oficial dos requisitos do sistema. Este documento, normalmente chamado de Documento de Especificação de Requisitos (Software Requirements Specification ou SRS) inclui uma combinação dos requisitos do utilizador e do sistema e tem diferentes utilidades para diferentes pessoas (Kotonya e Sommerville, 1998): • • • • • Clientes: confirmar a completude dos requisitos e propor alterações. Gestores: orçamentar o sistema e planejar o processo de desenvolvimento. Engenheiros: compreender o sistema a desenvolver. Engenheiros (testes): desenvolver testes para validar o cumprimento dos requisitos. Engenheiros (manutenção): compreender o sistema e a ligação entre as suas partes. Existem diversos padrões para este documento, embora não se possa apontar nenhum como o "ideal". Uma estrutura proposta pelo IEEE que é talvez a mais usada é o IEEE/ANSI 830-1993 (Thayer e Dorfman, 1993). Validação Nesta fase pretende-se demonstrar que o documento de requisitos produzido corresponde, de fato, ao sistema que o cliente pretende. À semelhança do que sucede na análise dos requisitos, pretende-se encontrar problemas/conflitos na especificação, porém ao contrário das fases anteriores esta fase lida com uma especificação completa dos requisitos. A validação é especialmente importante em sistemas de grandes dimensões uma vez que erros encontrados demasiado tarde (durante o desenvolvimento ou já depois de o sistema estar a ser usado) no documento de requisitos têm repercussões proporcionais à dimensão do projeto. Uma vez que alterações em requisitos já consolidados têm um custo muito superior a alterações no código ou design, este tipo de erros traduz-se em elevados custos e necessidade de refazer muito do trabalho que se julgava já concluído. Durante a fase de validação dos requisitos, devem ser verificados (através de checklists) os seguintes atributos dos requisitos: • Validade: a especificação resulta da análise dos requisitos identificados junto das diversas partes interessadas envolvidas. Como tal, requisitos identificados individualmente (isto é, junto de cada parte interessada) podem diferir da especificação final que se atinge após o cruzamento de informação e é necessário que cada cliente compreenda e aceite a especificação final obtida. • Consistência: não devem existir conflitos entre os requisitos identificados. • Compreensibilidade / Ambiguidade: os requisitos devem poder ser compreendidos de forma inequívoca pelas partes interessadas. • Completude: todas as funcionalidades pretendidas devem fazer parte da especificação do sistema. • Realismo: dadas as restrições do projeto (tecnológicas, financeiras e temporais) o sistema especificado tem de ser implementável. • Verificabilidade: de forma a evitar futuras discordâncias quanto à concretização dos requisitos especificados, estes devem ser descritos de modo a que seja possível verificar se foram ou não concretizados, isto é, se o sistema final corresponde à especificação inicial. • Rastreabilidade: a origem dos requisitos, em relação ao cliente, deve estar claramente identificada. Entre outros motivos, isto é importante para facilitar a gestão futura dos requisitos. • Conformidade com normas: para além dos aspectos funcionais dos requisitos, a sua especificação deve obedecer às normas usadas ao longo de todo o documento. 15 Requisitos de Software Técnicas de validação Para tornar a validação mais eficaz, existe um conjunto de técnicas que podem ser empregues: Revisões dos requisitos Uma equipe de revisores pode analisar sistematicamente a especificação produzida de forma a garantir que esta corresponde ao sistema pretendido; em revisões informais, a equipe de revisores pode simplesmente ter uma conversa, envolvendo o maior número possível de representantes das partes interessadas, acerca dos requisitos produzidos; em revisões formais, a equipe de revisores deve confirmar junto do cliente um conjunto de critérios que todos os requisitos devem cumprir, nomeadamente: verificabilidade, compreensibilidade (por parte dos utilizadores finais), rastreabilidade (a origem dos requisitos deve ser identificável) e adaptabilidade (capacidade de sofrer alterações sem produzir efeitos em todos os outros requisitos). Prototipificação (Ou prototipação) A implementação de um protótipo (por exemplo, da interface do sistema) pode ser útil para os utilizadores finais (e demais interessados), já que se trata do elemento do sistema final com o qual terão mais contacto quando o sistema estiver operacional; esta técnica também é eficaz, embora tenha desvantagens: o tempo gasto na sua implementação pode não justificar o seu uso, pode enviesar os utilizadores (levando a desilusões com a versão final do sistema, no caso de esta ser muito diferente do protótipo) e pode ainda levar os programadores a cair na tentação de usar o protótipo para continuar o desenvolvimento do sistema (pelo que, idealmente, o protótipo deva ser implementado noutra linguagem que não aquela usada pelo sistema, eliminando por completo esta tentação). Geração de casos de teste Uma vez que cada requisito deve ser testável, deveria ser possível criar (desenhar) os respectivos testes desde a fase de validação de requisitos; se isto não for possível, é sinónimo de que a implementação deste requisito será difícil e que este poderá ter de ser reconsiderado. Análise de consistência automática Através da especificação formal de modelos para o sistema é possível, recorrendo a ferramentas adequadas (como as ferramentas CASE), testar de forma automática a consistência dos modelos criados; apenas a consistência é testada nesta técnica, pelo que tem de ser complementada com uma das outras técnicas referidas. Recomendações A fase de validação não deve ser encarada de ânimo leve: trata-se de uma fase muito importante na engenharia de requisitos e da qual dependem elevados custos a médio e longo prazo. Por depender bastante dos retornos transmitidos pelos clientes (que não são peritos em validação de requisitos) é bastante falível e regra geral há erros que não são encontrados num primeiro momento, o que leva inevitavelmente a discordâncias numa fase posterior, já com o documento validado e o projeto em desenvolvimento ou concluído. Quando isto sucede, torna-se necessário negociar e chegar a um acordo quanto à forma de corrigir o erro detectado. Gestão de requisitos Os requisitos de um sistema, em especial em sistemas minimamente grandes, estão em evolução constante. De um modo geral, isto pode suceder em razão do problema abordado não conseguir ficar completamente definido antes da produção do documento de requisitos (ou mesmo antes de o sistema ser implementado) ou, por outro lado, pode também acontecer por os próprios requisitos se alterarem no decorrer do projeto (reflectindo evoluções tecnológicas ou alterações na organização na qual é usado). É natural que surjam requisitos por parte dos utilizadores por diversos motivos: 16 Requisitos de Software • Conforme já foi referido, a resolução de conflitos entre requisitos resulta num compromisso que procura equilibrar as necessidades das diferentes partes interessadas. Este equilíbrio pode ter de ser modificado e só com o uso do sistema é que é possível avaliá-lo convenientemente. Para além de conflitos entre requisitos de diferentes utilizadores do sistema, há ainda a considerar os conflitos entre utilizadores e "elementos executivos" da organização, isto é, aqueles que têm o poder de decisão e que podem impôr requisitos perante os analistas (que podem não contribuir para os objetivos da organização). • A orientação do negócio da organização pode-se alterar, nova legislação ou regulamentação pode pôr em causa alguns dos requisitos do sistema, alterações a nível tecnológico podem surgir na organização (afectando particularmente, no caso de alterações de hardware, os requisitos não-funcionais), podem surgir novos sistemas que precisem de suporte, a nível de interação, por parte do sistema implementado, e toda uma série de alterações imprevisíveis pode surgir levando a que o sistema tenha de se adaptar a todo este tipo de requisitos. Existem requisitos que, tipicamente, são mais voláteis do que outros (como por exemplo requisitos que dependam da entidade política governante num dado momento), enquanto que outros são relativamente estáveis (os que se referem à natureza do negócio (domínio) propriamente dita). Na prática, a gestão de requisitos acaba por coincidir com o início de novos processos de engenharia de requisitos (para os "novos" requisitos, isto é, os "antigos" que sofreram alterações). Como tal, o planejamento é uma parte importante da gestão de requisitos. Devem estar definidas desde o início da gestão de requisitos políticas para: • Identificação de requisitos: identificação unívoca em especial para facilitar a rastreabilidade. • Processo de gestão de mudanças a utilizar: conjunto de atividades que permitem avaliar o custo e impacto das alterações. • Rastreabilidade: relações entre os requisitos e relações entre requisitos e design; estas podem precisar de manter associada a cada requisito informação como a parte interessada que a propôs, dependências de outros requisitos e associação a módulos específicos do design do sistema. • Ferramentas a utilizar: para sistemas grandes, a quantidade de informação a processar pode ser elevada, sendo o uso de ferramentas CASE aconselhado. Para manter a consistência entre as várias alterações pedidas (e para estas serem feitas de um modo controlado), é importante que o processo de gestão de mudanças esteja definido de um modo formal, sendo que deverá incluir as seguintes três fases: • Análise do problema e especificação da alteração a fazer: identificação do problema existente nos requisitos originais e proposta de alteração a fazer aos requisitos do sistema. • Análise da alteração e seu impacto: através das políticas de rastreabilidade definidas previamente, avaliação do impacto da alteração no sistema. • Implementação da alteração: alteração no documento de requisitos e, conforme seja necessário, no design e implementação. É importante seguir este processo conforme foi enunciado já que cair na tentação de implementar a alteração directamente e só depois, retrospectivamente, actualizar os requisitos pode levar a dessincronização entre requisitos e implementação. [1] http:/ / en. wikipedia. org/ wiki/ Change_management#Change_management_in_information_technology [2] este grupo deve ser escolhido levando-se em conta a organização e o contexto em que o sistema será usado 17 Requisitos de Software Referências • Kotonya e Sommerville (1998). Requirements Engineering: Processes and Techniques. Gerald Kotonya, Ian Sommerville. Wiley. 1998. • Sommerville (2001). Software Engineering. Ian Sommerville. Addison Wesley. 2001. • Thayer e Dorfman (1993). Software Requirements Engineering. R. H. Thayer, M. Dorfman. IEEE Computer Society Press. 1993. • Soares (2005). Introdução, Identificação e Análise em Engenharia de Requisitos. António Lucas Soares. 2005. Ferramentas Projeto SER::Sistema de Engenharia de Requisitos (https://sourceforge.net/p/sersistemadeeng) Projeto de Software 1. REDIRECIONAMENTO Projeto de software Teste de software O teste do software é a investigação do software a fim de fornecer informações sobre sua qualidade em relação ao contexto em que ele deve operar. Isso inclui o processo de utilizar o produto para encontrar seus defeitos. O teste é um processo realizado pelo testador de software, que permeia outros processos da engenharia de software, e que envolve ações que vão do levantamento de requisitos até a execução do teste propriamente dito. Visão geral Não se pode garantir que todo software funcione corretamente, sem a presença de erros,[1] visto que os mesmos muitas vezes possuem um grande número de estados com fórmulas, atividades e algoritmos complexos. O tamanho do projeto a ser desenvolvido e a quantidade de pessoas envolvidas no processo aumentam ainda mais a complexidade. Idealmente, toda permutação possível do software deveria ser testada. Entretanto, isso se torna impossível para a ampla maioria dos casos devido à quantidade impraticável de possibilidades. A qualidade do teste acaba se relacionando à qualidade dos profissionais envolvidos em filtrar as permutações relevantes.[2] Falhas podem ser originadas por diversos motivos. Por exemplo, a especificação pode estar errada ou incompleta, ou pode conter requisitos impossíveis de serem implementados, devido à limitações de hardware ou software. A implementação também pode estar errada ou incompleta, como um erro de um algoritmo. Portanto, uma falha é o resultado de um ou mais defeitos em algum aspecto do sistema. O teste de software pode ser visto como uma parcela do processo de qualidade de software. A qualidade da aplicação pode, e normalmente, varia significativamente de sistema para sistema. Os atributos qualitativos previstos na norma ISO 9126 são funcionalidade, confiabilidade, usabilidade, eficiência, manutenibilidade e portabilidade. De forma geral, mensurar o bom funcionamento de um software envolve compará-lo com elementos como especificações, outros softwares da mesma linha, versões anteriores do mesmo produto, inferências pessoais, expectativas do cliente, normas relevantes, leis aplicáveis, entre outros. Enquanto a especificação do software diz respeito ao processo de verificação do software, a expectativa do cliente diz respeito ao processo de validação do software. Um desenvolvimento de software organizado tem como premissa uma metodologia de trabalho. Esta deve ter como base conceitos que visem a construção de um produto de software de forma eficaz. Dentro desta metodologia estão 18 Teste de software definidos os passos necessários para chegar ao produto final esperado. Assim, quando se segue uma metodologia para o desenvolvimento de um produto de software, espera-se um produto final que melhor agrade tanto aos clientes quanto ao próprio fornecedor, ou seja, a empresa de desenvolvimento. Observando este aspecto, não faz sentido iniciar a construção de um produto de software sem ter uma metodologia de trabalho bem solidificada e que seja do conhecimento de todos os envolvidos no processo. Porém, além de uma crescente demanda por softwares de qualidade, as empresas de desenvolvimento de software sofrem cada vez mais pressão por parte dos clientes para que o produto seja entregue num curto período de tempo. Este fato pode fazer com que uma sólida metodologia de trabalho acabe por se desequilibrar. Independentemente da metodologia de trabalho empregada no desenvolvimento de um software, para que se obtenha um produto final com um certo nível de qualidade é imprescindível a melhoria dos processos de engenharia de software. Uma maneira viável para se assegurar a melhoria de tais processos seria tomar como base modelos sugeridos por entidades internacionais respeitadas no assunto. Dentro de uma gama de modelos, sejam eles para situações e ambientes específicos ou para soluções genéricas, existem alguns que são mais utilizados e tidos como eficientes, como por exemplo os SW-CMM, SE-CMM, ISO 15504 e o mais conhecido CMMI. Outro factor com grande influência sobre a qualidade do software a ser produzido é o que diz respeito aos testes que serão executados sobre tal produto. Todas as metodologias de desenvolvimento de software têm uma disciplina dedicada aos testes. Atualmente esta é uma tarefa indispensável, porém muitas vezes efetuada de maneira ineficiente, seja pelo subestimar dos que desenvolvem, pela falta de tempo ou mesmo pela falta de recursos humanos e financeiros. De acordo com um estudo conduzido pelo NIST em 2002, os defeitos resultam num custo anual de 59,5 bilhões de dólares à economia dos Estados Unidos. Mais de um terço do custo poderia ser evitado com melhorias na infraestrutura do teste de software.[3] Princípios Para Myers (2004), há princípios vitais para o teste de software. O caso de teste deve definir a saída esperada, de forma a reduzir a interpretação do critério de sucesso. A saída da execução do teste deve ser exaustivamente analisada. Os casos de teste devem verificar não somente as condições inválidas de execução, como também as condições válidas. Outro conceito apresentado é utilizar pessoas e organizações diferentes para a implementação e para a verificação. A entidade de teste possui uma visão destrutiva do sistema, em busca de erros, enquanto a entidade de programação possui uma visão construtiva, em busca da implementação de uma especificação. Myers também aborda o esforço para se construir casos de teste. Deve-se evitar testes descartáveis, pois a qualidade do teste piora gradualmente com as iterações de desenvolvimento. Em contrapartida, há o teste de regressão, que permite quantificar a evolução da qualidade de software, mantendo e executando novamente testes realizados anteriormente. O mesmo autor afirma que, diferente do que se poderia considerar senso comum, a probabilidade de existência de erros num certo trecho de código é proporcional à quantidade de erros já encontradas anteriormente. Basicamente, erros aparecem em grupos. Trechos específicos de código de um software qualquer estão mais propensos a ter erros que outros. 19 Teste de software Técnicas Existem muitas maneiras de se testar um software. Mesmo assim, existem as técnicas que sempre foram muito utilizadas em sistemas desenvolvidos sobre linguagens estruturadas que ainda hoje têm grande valia para os sistemas orientados a objeto. Apesar de os paradigmas de desenvolvimento serem completamente diferentes, o objetivo principal destas técnicas continua a ser o mesmo, encontrar falhas no software. Abaixo estão descritas algumas das técnicas mais conhecidas. Caixa-branca Também chamada de teste estrutural ou orientado à lógica, a técnica de caixa-branca avalia o comportamento interno do componente de software. Essa técnica trabalha diretamente sobre o código fonte do componente de software para avaliar aspectos tais como: teste de condição, teste de fluxo de dados, teste de ciclos, teste de caminhos lógicos, códigos nunca executados. Os aspectos avaliados nesta técnica de teste dependerão da complexidade e da tecnologia que determinarem a construção do componente de software, cabendo portanto avaliação de mais aspectos que os citados anteriormente. O testador tem acesso ao código fonte da aplicação e pode construir códigos para efetuar a ligação de bibliotecas e componentes. Este tipo de teste é desenvolvido analisando o código fonte e elaborando casos de teste que cubram todas as possibilidades do componente de software. Dessa maneira, todas as variações relevantes originadas por estruturas de condições são testadas. Um exemplo bem prático desta técnica de teste é o uso da ferramenta livre JUnit para desenvolvimento de classes de teste para testar classes ou métodos desenvolvidos em Java. Também se enquadram nessa técnica testes manuais ou testes efetuados com apoio de ferramentas para verificação de aderência a boas práticas de codificação reconhecidas pelo mercado de software. A aderência a padrões e boas práticas visa principalmente a diminuição da possibilidade de erros de codificação e a busca de utilização de comandos que gerem o melhor desempenho de execução possível. Apesar de muitos desenvolvedores alegarem que não há ganhos perceptíveis com essa técnica de teste aplicada sobre unidades de software, devemos lembrar que, no ambiente produtivo, cada programa pode vir a ser executado milhares ou milhões de vezes em intervalos de tempo pequenos. É na realidade de produção que a soma dos aparentes pequenos tempos de execução e consumo de memória de cada programa poderá levar o software a deixar de atender aos objetivos esperados. A técnica de teste de caixa-branca é recomendada para as fases de teste de unidade e teste de integração, cuja responsabilidade principal fica a cargo dos desenvolvedores do software, que por sua vez conhecem bem o código fonte produzido. Caixa-preta Também chamada de teste funcional, orientado a dado ou orientado a entrada e saída, a técnica de caixa-preta avalia o comportamento externo do componente de software, sem se considerar o comportamento interno do mesmo.[4] Dados de entrada são fornecidos, o teste é executado e o resultado obtido é comparado a um resultado esperado previamente conhecido. Como detalhes de implementação não são considerados, os casos de teste são todos derivados da especificação. Quanto mais entradas são fornecidas, mais rico será o teste. Numa situação ideal todas as entradas possíveis seriam testadas, mas na ampla maioria dos casos isso é impossível.[5] Outro problema é que a especificação pode estar ambígua em relação ao sistema produzido, e como resultado as entradas especificadas podem não ser as mesmas aceitas para o teste.[6] Uma abordagem mais realista para o teste de caixa-preta é escolher um subconjunto de entradas que maximize a riqueza do teste. Pode-se agrupar subconjuntos de entradas possíveis que são processadas similarmente, de forma que testar somente um elemento desse subconjunto serve para averiguar a qualidade de todo o subconjunto. Por exemplo, em um sistema que aceita um inteiro como entrada, testar todos os casos possíveis pode gerar pelo menos dezenas de milhares de casos de testes distintos. Entretanto, a partir da especificação do sistema, pode-se encontrar um subconjunto de inteiros que maximizem a qualidade do teste. Depende do propósito do 20 Teste de software sistema, mas casos possíveis incluem inteiros pares, inteiros ímpares, zero, inteiros positivos, inteiros negativos, o maior inteiro, o menor inteiro. Essa técnica é aplicável a todas as fases de teste – teste unitário, teste de integração, teste de sistema e teste de aceitação. A aplicação de técnicas de teste leva o testador a produzir um conjunto de casos de teste (ou situações de teste). A aplicação combinada de outra técnica – técnica de particionamento de equivalência (ou uso de classes de equivalência) permite avaliar se a quantidade de casos de teste produzida é coerente. A partir das classes de equivalência identificadas, o testador construirá casos de teste que atuem nos limites superiores e inferiores destas classes, de forma que um número mínimo de casos de teste permita a maior cobertura de teste possível. Uma abordagem no desenvolvimento do teste de caixa-preta é o teste baseado na especificação, de forma que as funcionalidades são testadas de acordo com os requisitos. Apesar de necessário, esse tipo de teste é insuficiente para identificar certos riscos num projeto de software.[7] Caixa-cinza A técnica de teste de caixa-cinza é um mesclado do uso das técnicas de caixa-preta e de caixa-branca. Isso envolve ter acesso a estruturas de dados e algoritmos do componente a fim de desenvolver os caso de teste, que são executados como na técnica da caixa-preta. Manipular entradas de dados e formatar a saída não é considerado caixa-cinza pois a entrada e a saída estão claramente fora da caixa-preta. A caixa-cinza pode incluir também o uso de engenharia reversa para determinar por exemplo os limites superiores e inferiores das classes, além de mensagens de erro. Regressão Essa é uma técnica de teste aplicável a uma nova versão de software ou à necessidade de se executar um novo ciclo de teste durante o processo de desenvolvimento. Consiste em se aplicar, a cada nova versão do software ou a cada ciclo, todos os testes que já foram aplicados nas versões ou ciclos de teste anteriores do sistema. Inclui-se nesse contexto a observação de fases e técnicas de teste de acordo com o impacto de alterações provocado pela nova versão ou ciclo de teste. Para efeito de aumento de produtividade e de viabilidade dos testes, é recomendada a utilização de ferramentas de automação de teste, de forma que, sobre a nova versão ou ciclo de teste, todos os testes anteriores possam ser executados novamente com maior agilidade. Técnicas não funcionais Outras técnicas de teste existem para testar aspectos não-funcionais do software, como por exemplo de acordo com necessidades de negócio ou restrições tecnológicas. Em contraste às técnicas funcionais mencionadas acima, que verificam a operação correta do sistema em relação a sua especificação, as técnicas não funcionais verificam a operação correta do sistema em relação a casos inválidos ou inesperados de entrada. É uma forma de testar a tolerância e a robustez do software em lidar com o inesperado. Uma delas é o uso conjunto de teste de desempenho e teste de carga, que verifica se o software consegue processar grandes quantidades de dados, e nas especificações de tempo de processamento exigidas, o que determina a escalabilidade do software. O teste de usabilidade é necessário para verificar se a interface de usuário é fácil de se aprender e utilizar. Entre verificações cabíveis estão a relação da interface com conhecimento do usuário, a compreensibilidade das mensagens de erro e a integridade visual entre diferentes componentes.[8] Já o teste de confiabilidade é usado para verificar se o software é seguro em assegurar o sigilo dos dados armazenados e processados. O teste de recuperação é usado para verificar a robustez do software em retornar a um estado estável de execução após estar em um estado de falha. 21 Teste de software 22 Fases Abstração do teste Descendente Sistema Integração Ascendente Unidade Uma prática comum é testar o software após uma funcionalidade ser desenvolvida, e antes dela ser implantada no cliente, por um grupo de profissionais diferente da implementação. Essa prática pode resultar na fase de teste ser usada para compensar atrasos do projeto, comprometendo o tempo devotado ao teste. Outra prática é começar o teste no mesmo momento que o projeto, num processo contínuo até o fim do projeto. Em contrapartida, algumas práticas emergentes como a programação extrema e o desenvolvimento ágil focam o modelo de desenvolvimento orientado ao teste. Nesse processo, os testes de unidade são escritos primeiro, por engenheiros de software. Antes da implementação da unidade em questão, o teste falha. Então o código é escrito, passando incrementalmente em porções maiores dos casos de teste. Os testes são mantidos junto com o resto do código fonte do software, e geralmente também integra o processo de construção do software. Teste de unidade Também conhecida como teste unitário ou teste de módulo, é a fase em que se testam as menores unidades de software desenvolvidas (pequenas partes ou unidades do sistema).[9] O universo alvo desse tipo de teste são as subrotinas ou mesmo pequenos trechos de código. Assim, o objetivo é o de encontrar falhas de funcionamento dentro de uma pequena parte do sistema funcionando independentemente do todo. Teste de integração Na fase de teste de integração, o objetivo é encontrar falhas provenientes da integração interna dos componentes de um sistema. Geralmente os tipos de falhas encontradas são de transmissão de dados. Por exemplo, um componente A pode estar aguardando o retorno de um valor X ao executar um método do componente B; porém, B pode retornar um valor Y, gerando uma falha. Não faz parte do escopo dessa fase de teste o tratamento de interfaces com outros sistemas (integração entre sistemas). Essas interfaces são testadas na fase de teste de sistema, apesar de, a critério do gerente de projeto, estas interfaces podem ser testadas mesmo antes de o sistema estar plenamente construído. Teste de sistema Na fase de teste de sistema, o objetivo é executar o sistema sob ponto de vista de seu usuário final, varrendo as funcionalidades em busca de falhas em relação aos objetivos originais. Os testes são executados em condições similares – de ambiente, interfaces sistêmicas e massas de dados – àquelas que um usuário utilizará no seu dia-a-dia de manipulação do sistema. De acordo com a política de uma organização, podem ser utilizadas condições reais de ambiente, interfaces sistêmicas e massas de dados. Teste de aceitação Geralmente, os testes de aceitação são realizados por um grupo restrito de usuários finais do sistema, que simulam operações de rotina do sistema de modo a verificar se seu comportamento está de acordo com o solicitado. Teste formal conduzido para determinar se um sistema satisfaz ou não seus critérios de aceitação e para permitir ao cliente determinar se aceita ou não o sistema. Validação de um software pelo comprador, pelo usuário ou por terceira parte, com o uso de dados ou cenários especificados ou reais. Pode incluir testes funcionais, de configuração, de recuperação de falhas, de segurança e de desempenho. Teste de software Teste de operação Nessa fase o teste é conduzido pelos administradores do ambiente final em que o sistema ou software entrará em ambiente produtivo. Vale ressaltar que essa fase é aplicável somente a sistemas de informação próprios de uma organização, cujo acesso pode ser feito interna ou externamente a essa organização. Nessa fase de teste devem ser feitas simulações para garantir que a entrada em produção do sistema será bem sucedida. Envolve testes de instalação, simulações com cópia de segurança dos bancos de dados, etc.. Em alguns casos um sistema entrará em produção para substituir outro e é necessário garantir que o novo sistema continuará garantindo o suporte ao negócio. Testes alfa e beta Em casos especiais de processos de desenvolvimento de software – sistemas operacionais, sistemas gerenciadores de bancos de dados e outros softwares distribuídos em escala nacional e internacional – os testes requerem fases também especiais antes do produto ser disponibilizado a todos os usuários. O período entre o término do desenvolvimento e a entrega é conhecido como fase alfa e os testes executados nesse período, como testes alfa. PRESSMAN afirma que o teste alfa é conduzido pelo cliente no ambiente do desenvolvedor, com este "olhando sobre o ombro" do usuário e registrando erros e problemas de uso. Completada a fase alfa de testes, são lançadas a grupos restritos de usuários, versões de teste do sistema denominadas versões beta. Ele também é um teste de aceitação voltado para softwares cuja distribuição atingirá grande número de usuários de uma ou várias empresas compradoras. PRESSMAN afirma que o teste beta é conduzido em uma ou mais instalações do cliente, pelo usuário final do software. Diferente do teste alfa, o desenvolvedor geralmente não está presente. Conseqüentemente, o teste beta é uma aplicação do software num ambiente que não pode ser controlado pelo desenvolvedor. O cliente registra todos os problemas (reais ou imaginários) que são encontrados durante o teste beta e os relata ao desenvolvedor em intervalos regulares. Com o resultado dos problemas relatados durante os testes beta, os engenheiros de software fazem modificações e depois se preparam para liberar o produto de software para toda a base de clientes. A comunidade do teste de software usa o termo teste gama de forma sarcástica referindo-se aos produtos que são mal testados e são entregues aos usuários finais para que estes encontrem os defeitos já em fase de produção. Candidato a lançamento Ultimamente, e principalmente na comunidade de software livre, é comum utilizar o termo candidato a lançamento (release candidate) para indicar uma versão que é candidata a ser a versão final, em função da quantidade de erros encontradas. Tais versões são um passo além do teste beta, sendo divulgadas para toda a comunidade. Papéis Segue abaixo alguns dos papéis que uma pessoa pode desenvolver num projeto de teste de software. Uma pessoa pode acumular mais de um dos papéis citados, de acordo com características e restrições de projetos de desenvolvimento de software nas quais estejam inseridas. Nas fases de teste de unidade e de integração, por exemplo, os papéis de arquiteto de teste e analista de teste podem ser assumidos pelo analista de sistemas do projeto; o papel de testador pode ser assumido pelo programador ou por um segundo programador que atue num processo de programação em pares. Na fase de teste de sistema, num contexto em que haja uma equipe de teste independente, pode haver profissionais acumulando os papéis de arquiteto de teste, analista de teste e testador. O líder (ou gerente) do projeto de testes é a pessoa responsável pela liderança de um projeto de teste específico, normalmente relacionado a um sistema de desenvolvimento, seja um projeto novo ou uma manutenção. Já o engenheiro (ou arquiteto) de teste é o técnico responsável pelo levantamento de necessidades relacionadas à montagem da infraestrutura de teste, incluindo-se o ambiente de teste, a arquitetura de solução, as restrições tecnológicas, as ferramentas de teste. É também responsável pela liderança técnica do trabalho de teste e pela comunicação entre a equipe de teste e a equipe de projeto (ou equipe de desenvolvimento). 23 Teste de software O analista de teste é o técnico responsável pela operacionalização do processo de teste. Deve seguir as orientações do gerente de teste ou do arquiteto de teste para detalhar a forma de execução dos testes e as condições de teste necessárias. Também deve focar seu trabalho nas técnicas de teste adequadas à fase de teste trabalhada. Também no campo de análise, o analista de ambiente é o técnico responsável pela configuração do ambiente de teste e pela aplicação das ferramentas necessárias para tal. Esse profissional deve ser especializado em arquiteturas de solução e nos sistemas operacionais e softwares de infraestrutura que regem o ambiente. Ele será responsável por tornar disponível o ambiente de teste. O testador é o técnico responsável pela execução de teste. Ele deve observar as condições de teste e respectivos passos de teste documentados pelo analista de teste e evidenciar os resultados de execução. Em casos de execuções de teste mal-sucedidas, esse profissional pode também registrar ocorrências de teste (na maioria das vezes, defeitos) em canais através dos quais os desenvolvedores tomarão conhecimento das mesmas e tomarão as providências de correção ou de esclarecimentos. Por fim, o automatizador de teste é o técnico responsável pela automação de situações de teste em ferramentas. Ele deve observar as condições de teste e respectivos passos de teste documentados pelo analista de teste e automatizar a execução desses testes na ferramenta utilizada. Normalmente são gerados scripts de teste que permitam a execução de ciclos de teste sempre que se julgar necessário, desde é claro, que sejam garantidas as mesmas condições iniciais do ciclo de teste (valores de dados, estados dos dados, estados do ambiente, etc..) Artefatos O processo de teste de software pode produzir diversos artefatos. O caso de teste geralmente consiste de uma referência a um identificador ou requisito de uma especificação, pré-condições, eventos, uma série de passos a se seguir, uma entrada de dados, uma saída de dados, resultado esperado e resultado obtido. A série de passos (ou parte dela) pode estar contida num procedimento separado, para que possa ser compartilhada por mais de caso de teste. Um script de teste é a combinação de um caso de teste, um procedimento de teste e os dados do teste. Uma coleção de casos de teste é chamada de suite de teste. Geralmente, ela também contém instruções detalhadas ou objetivos para cada coleção de casos de teste, além de uma seção para descrição da configuração do sistema usado. A especificação de teste é chamada plano de teste. [1] MYERS, 2004, p. 8 [2] MYERS, 2004, p. 5 [3] Michael Newman (28 de junho de 2002). Software Errors Cost U.S. Economy $59.5 Billion Annually: NIST Assesses Technical Needs of Industry to Improve Software-Testing (http:/ / www. nist. gov/ public_affairs/ releases/ n02-10. htm) (em inglês). NIST. Página visitada em 17 de novembro de 2008. [4] MYERS, 2004, p. 9 [5] MYERS, 2004, p. 10 [6] Jiantao Pan (1999). Software Testing (http:/ / www. ece. cmu. edu/ ~koopman/ des_s99/ sw_testing/ ) (em inglês). Universidade Carnegie Mellon. Página visitada em 1 de dezembro de 2008. [7] James Bach (Junho de 1999). Risk and Requirements-Based Testing (http:/ / www. satisfice. com/ articles/ requirements_based_testing. pdf) (em inglês). IEEE. Página visitada em 17 de novembro de 2008. [8] MYERS, 2004, p. 136 [9] MYERS, 2004, p. 91 24 Teste de software 25 Bibliografia • KOSCIANSKI, A., Soares, Novatec, M. S. Qualidade de Software, 2006 • PRESSMAN, R. S., McGraw Hill, Engenharia de Software, 2002 • RIOS, E., BASTOS, A., CRISTALLI, R., MOREIRA, T., Martins Fontes, Base de conhecimento em teste de software, 2007 • MYERS, Glenford J., John Wiley & Sons, The Art of Software Testing, 2, Nova Jérsei: 2004. ISBN ISBN 0-471-46912-2 Ver também • • • • • Anexo:Lista de instituições pela qualidade Qualidade de software Gestão da qualidade Verificação formal Otimização em engenharia de software. Ligações externas • Guia de gerenciamento de teste (http://www.ruleworks.co.uk/testguide) Gerência de Configuração de Software Gerência de Configuração de Software, Gerência de Configuração ou ainda Gestão de Configuração de Software é uma área da engenharia de software responsável por fornecer o apoio para o desenvolvimento de software. Suas principais atribuições são o controle de versão, o controle de mudança e a auditoria das configurações. Roger Pressman, em seu livro Software Engineering: A Practitioner's Approach, afirma que a gerência de configuração de software (GCS) é o: conjunto de atividades projetadas para controlar as mudanças pela identificação dos produtos do trabalho que serão alterados, estabelecendo um relacionamento entre eles, definindo o mecanismo para o gerenciamento de diferentes versões destes produtos, controlando as mudanças impostas, e auditando e relatando as mudanças realizadas. — Roger Pressman Em outras palavras, a Gerência de Configuração de Software tem como objetivo responder as seguintes perguntas: • • • • O que mudou e quando? Por que mudou? Quem fez a mudança? Podemos reproduzir esta mudança? Cada uma dessas perguntas corresponde a uma das atividades realizadas pela Gerência de Configuração de Software. O controle de versão é capaz de dizer o que mudou e quando mudou. O controle de mudanças é capaz de atribuir os motivos a cada uma das mudanças. A Auditoria por sua vez responde as duas últimas perguntas: Quem fez a mudança e podemos reproduzir a mudança? Gerência de Configuração de Software Histórico A história da Gerência de Configuração de Software surge em meados da década de 1970, quando os microprocessadores se tornaram populares e o software deixou de ser considerado parte integrante do hardware para se tornar um produto independente. Nesta época, os sistemas se tornaram cada vez maiores e sofisticados, ficando claro que seriam necessárias metodologias próprias, diferentes das usadas no desenvolvimento de hardware, para controlar o desenvolvimento desses sistemas. O Departamento de Defesa (DoD) dos EUA foi um dos pioneiros nessa área, criando o padrão DoD-STD-2167 que abordava o desenvolvimento de software. A abordagem do DoD para controlar isto consistia da adoção de uma linguagem padronizada -- Ada -- e de práticas padrão para desenvolvimento de software e Gerência de Configuração. Outras organizações estavam por sua vez adotando práticas e métodos de Gerência de Configuração de Software, algumas das quais envolvidas também com o desenvolvimento de sistemas para o DoD e outros órgãos do governo Americano. Isto levou o próprio DoD a adotar algumas práticas comerciais e eventualmente uni-las com seus padrões, gerando assim o padrão IEEE/IEA 12207. Um outro padrão a respeito é o IEEE 828-1983. Funções A Gerência de Configuração de Software é definida por quatro funções básicas:[1] • • • • Identificação Documentação Controle Auditoria No início do desenvolvimento, a GCS permite à equipe de desenvolvimento identificar as unidades que compõem o sistema de acordo com as funcionalidades que elas deverão desempenhar, e as interfaces entre estas unidades, documentando assim a interação entre elas. O controle contínuo da evolução destas funcionalidades e interfaces permite que a integração entre estas unidades tenha sucesso continuado, com as mudanças devidamente gerenciadas e documentadas. Por fim, a auditoria das funcionalidades identificadas, documentadas e controladas garante a confiabilidade do sistema. Conceitos e Terminologia A terminologia especifica da GCS, como também sua história, tem dado origem a controvérsias, de freqüentes variações. Ferramentas vendidas como também acadêmicas tiraram vantagem disto para deliberadamente mudar a terminologia ou procedimentos para reduzir a possibilidade dos clientes para mudanças, algumas vezes tentando desta maneira redefinir o estabelecimento de acrônimos. Em particular, o vendedor conhecido como Atria (depois Rational Software), agora uma parte da IBM, usava SCM como padrão para Software Configuration Management (em português: "Gerência de Configuração de Software") enquanto o Gartner Group usa o termo SCCM ou Software Change and Configuration Management (em português: "Gerência de Mudanças e Configuração de Software"). Entretanto, os conceitos básicos da GCS descritos abaixo são bem aceitos, divergindo de um autor ou fornecedor para o outro meramente nos termos utilizados. 26 Gerência de Configuração de Software Configuração de software Configuração é o estado em que um sistema se encontra em um determinado momento. Este sistema pode ser composto de todo tipo de elementos, como peças de hardware, artefatos eletrônicos ou não (i.e. documentos em papel), etc. A Configuração de Software trata apenas dos elementos que se encontram em formato eletrônico e fazem parte dessa configuração. Isso inclui todos os arquivos fontes, todos os documentos eletrônicos, as ferramentas de software utilizadas para construir ou mesmo ler estes arquivos, o sistema operacional utilizado, as bibliotecas de software, etc. Essa configuração varia com o tempo, pois novos arquivos são incluídos, e arquivos existentes são alterados ou removidos. O objetivo da Gerência de Configuração como um todo é organizar todos estes elementos de forma a saber em qual estado o sistema se encontrava nos momentos chave do desenvolvimento (por exemplo, quando o sistema foi entregue ao cliente, quando o sistema passou por uma mudança de versão, quando o sistema foi enviado para auditoria, etc). A Gerência de Configuração como um todo trata dos elementos, incluindo hardware, necessários para a manutenção apropriada do sistema. a Gestão de Configuração de Software trata especificamente dos elementos necessários a construção de sistemas de software, e em geral, controla apenas os elementos em formato computadorizado. Em Sistemas de controle de versão as configurações específicas são geralmente identificadas pelo uso de tags ou labels (placas ou etiquetas, em inglês). Linha-base Linhas-base ou Baseline é um conceito de gerenciamento de configuração de software que nos ajuda a controlar as mudanças, sem impedir seriamente as mudanças justificáveis. Segundo PRESSMAN no contexto de engenharia de software, definimos uma linha básica como um marco de referência no desenvolvimento de um software, que é caracterizado pela entrega de um ou mais itens de configuração (em inglês, Software Configuration Items - SCIs) e pela aprovação desses SCIs, obtida por meio de uma revisão técnica formal. Exemplos de linhas-base: • Versão 1.0 • Versão de correção de erros 1.1 • Versão personalizada do sistema para o governo americano Em Sistemas de controle de versão uma linha-base é geralmente identificada pelo uso de branches (galhos, em inglês). Item de configuração de software Durante o desenvolvimento de software, uma grande quantidade de informações é produzida e cada um desses documentos produzidos que precisam sofrer controle de versões e de mudanças é chamado de item de configuração de software O Item de configuração é um elemento unitário que será gerenciado: um arquivo de código fonte, um documento de texto, um projeto de uma placa eletrônica, uma planta feita em papel, um CD-ROM de instalação de um sistema operacional, etc. A configuração de um sistema é basicamente a lista de todos os itens de configuração necessários para reproduzir um determinado estado de um sistema. Em geral números de versão são associados aos itens de configuração de forma a podermos identificar também a evolução destes itens. Exemplos de itens de configuração podem ser: • Item A: CD de instalação do sistema operacional, versão 1.0 • Item B: Documento de ajuda do sistema em formato eletrônico, versão 2.0 • Item C: Processador de texto usado para imprimir o documento de ajuda, versão 5.0 e assim por diante. 27 Gerência de Configuração de Software Segundo Pressman os seguintes SCIs tornam-se alvos das técnicas de GCS e formam um conjunto de linhas básicas (Baselines): 1. Especificação do Sistema. 2. Plano de Projeto do Software. 3. a) Especificação dos Requisitos de Software; b) Protótipo executável ou "em papel". 4. Manual Preliminar do Usuário. 5. Especificação de Projeto: a) Descrição do projeto de dados; b) Descrições do projeto arquitetural; c) Descrições do projeto modular; d) Descrições do projeto de interfaces; e) Descrições de objetos (no caso do uso da metodologia OO). 6. Listagem do código-fonte. 7. Teste de Software/Sistema: a) Plano e Procedimentos de Testes; b) Casos de teste e resultados registrados. 8. Manuais Operacionais e de Instalação. 9. Programa Executável: a) Módulos; b) Módulos interligados. 10. Descrição do Banco de Dados: a) Esquema e estrutura de arquivo; b) Conteúdo inicial. 11. Manual Feito de Acordo com o Usuário. 12. Documentos de Manutenção: a) Relatórios de problemas de software; b) Solicitações de manutenção; c) Pedidos de mudança de engenharia. 13. Padrões e procedimentos para engenharia de software. Identificação de objetos Definimos CSI, no mecanismo de identificação de gerenciamento de configurações, como sendo a sua entidade mais elementar. Segundo PRESSMAN dois tipos de objetos podem ser identificados: • Objeto básico: uma "unidade de texto" que foi criada pelo engenheiro de software durante a análise, o projeto, a codificação ou o teste. • Objeto composto: coleção de objetos básicos e outros objetos compostos. Cada objeto tem um conjunto distinto de características que o identifica unicamente: um nome, uma descrição, uma lista de recursos e uma realização. • Nome: cadeia de caracteres que identifica o objeto claramente. • Descrição: é uma lista de itens de dados que identifica: - O tipo de SCI (ex.: documento, programa, dados) que é representado pelo objeto; - Um identificador do projeto; - Informações sobre mudanças e/ou versão • Recursos: entidades fornecidas, processadas, consultadas ou, por outro lado, exigidas pelo objeto. Para um objeto básico, a realização é um indicador para a "unidade texto" e para o objeto composto a realização é nula. 28 Gerência de Configuração de Software Controle de versões Ocorrem muitos problemas durante o desenvolvimento de software que são causados por falta de controle sobre os arquivos do projeto. Vamos a uma avaliação: • • • • Você já perdeu alguma versão anterior do arquivo do projeto? Já teve problemas em manter diferentes versões do sistema rodando ao mesmo tempo? Alguém já sobrescreveu o seu código por acidente e você acabou perdendo seu arquivo? Você tem dificuldades em saber quais as alterações que foram efetuadas e quando foram feitas e quem fez? Se você respondeu que sim para as perguntas acima, então você precisa de um sistema para controle de versão para o seu projeto. Controle de versão deve ser utilizado em todo o andamento do projeto de desenvolvimento de software. O Controle de versão rastreia e controla todos os artefatos do projeto (código-fonte, arquivos de configuração, documentação etc.) e assim consegue coordenar o trabalho paralelo de desenvolvedores através das seguintes funcionalidades: • Mantém e disponibiliza cada versão já produzida de cada item do projeto • Possui mecanismos para gerenciar diferentes ramos de desenvolvimento, possibilitando a existência de diferentes versões ao mesmo tempo (concorrência) • Estabelece uma política de sincronização de mudanças que evita a sobreposição de mudanças • Fornece um histórico completo de alterações sobre cada item do projeto Controle de Versão resolve diversos problemas básicos de desenvolvimento tais como uso de diferentes versões de código, sincronização do trabalho paralelo de desenvolvedores no mesmo projeto, recuperação de versões anteriores e registro do histórico de alterações. A finalidade do Controle de versão é dar um controle maior sobre tudo que você altera no seu projeto de software. Ele permite que você tenha um histórico de tudo o que você mudar no seu projeto. Se você modificou aquela rotina para otimizar uma consulta, se você inseriu uma nova função e retirou outra, se você modificou a imagem que era exibida em determinada página html, tudo fica guardado neste histórico. Para que isso? Para o caso de sua alteração causar algum problema! Se deu você nem precisa se preocupar em relembrar o que foi que tinha alterado, se fez tudo correto, basta um simples comando e você recupera o estado anterior. Controle de versões dos itens do projeto Todos os arquivos e diretórios que compõem o projeto ficam sob a responsabilidade do sistema de controle de versão num local denominado de repositório, lugar onde se guarda, arquiva, coleciona alguma coisa. É o local onde você vai guardar o seu projeto. Na prática, é um diretório, uma pasta qualquer guardada ou no seu computador, ou no seu pendrive. O repositório registra cada alteração realizada em cada arquivo e diretório controlado. À medida que o projeto evolui, o repositório passa a guardar múltiplas versões dos arquivos que compõem o projeto. Essas múltiplas versões são organizadas em revisões. Uma revisão funciona como um clone de todos os arquivos do projeto em um determinado momento do tempo. Os clone antigos são mantidos e podem ser recuperados e analisados a qualquer momento. Para economizar espaço, apenas as diferenças entre as revisões costumam ser armazenadas no repositório. Quando se deseja recuperar determinado arquivo, as diferenças são analisadas e o arquivo é remontado de acordo com a revisão desejada. Mesmo que não haja alteração em um arquivo entre uma revisão e outra, o número da revisão do arquivo acompanha o número da revisão global, de modo a manter sempre um grupo coeso e coerente de arquivos. 29 Gerência de Configuração de Software Diferentes versões de projeto Alguns projetos precisam de variações específicas, conforme as necessidades específicas de cada cliente, ou criação de um ramo para experimentações no projeto, sem comprometer a linha principal de desenvolvimento. O sistema de controle de versão oferece funcionalidades que facilitam a coordenação de ramos diferentes de desenvolvimento em um mesmo projeto. As alterações feitas em um ramo muitas vezes precisam ser mescladas em outro ramo. Essa operação é bastante delicada e é facilitada em muito com o sistema de controle de versão, que permite bastante controle e automação no processo. Mesmo em caso de uma fusão mal-sucedida, o sistema de controle de versão permite voltar ao estado anterior, o que traz bastante segurança aos desenvolvedores. Sincronização de Mudanças Concorrentes Como os desenvolvedores trabalham em paralelo e concorrentemente nos mesmos arquivos do projeto, é necessária uma política para ordenar e integrar todas essas alterações, de modo a evitar que um desenvolvedor sobrescreva as alterações de outro desenvolvedor. O controle de versão além de rastrear e controlar alterações, também coordena a edição colaborativa e o compartilhamento de dados entre os vários desenvolvedores de uma equipe. Problema do Compartilhamento de Arquivos Cópia de Trabalho Os desenvolvedores não trabalham diretamente nos arquivos do repositório. Cada desenvolvedor possui uma cópia de trabalho que espelha os arquivos do repositório para trabalhar com liberdade enquanto termina suas tarefas, isolado dos outros desenvolvedores. Política TRAVA-MODIFICA-DESTRAVA Nessa política, o sistema de controle de versão permite que apenas um desenvolvedor por vez altere um determinado arquivo do projeto. Ela é restritiva e frequentemente atrapalha o trabalho dos usuários. O travamento pode causar alguns problemas administrativos e forçar a uma serialização desnecessária. Política COPIA-MODIFICA-RESOLVE Nessa política, não existe travamento de arquivos. Cada desenvolvedor trabalha livremente em qualquer arquivo da sua cópia de trabalho. Ao final, as alterações de cada desenvolvedor são mescladas no repositório formando a versão final. A solução "copia-modifica-resolve" parece um pouco estranha e bagunçada a princípio, mas funciona bem na prática. Conflitos são raros e são causados basicamente pela falta de comunicação entre desenvolvedores. Na grande maioria dos casos, as alterações não se sobrepõe e são mescladas automaticamente pelo sistema de controle de versão. Conjunto de mudanças É o conjunto de todas as alterações que ocorreram no sistema para atender um determinado fim, ou num determinado período de tempo. Fazendo um mapeamento dos itens que foram mudados para uma dada versão do sistema com os motivos das mudanças. Um exemplo de conjunto de mudanças: Mudanças da versão 1.0 para a versão 1.1 • • • • • Item A mudou da revisão 1.0 para a revisão 1.1 Item B mudou da revisão 4.5 para a revisão 5.0 Item C foi eliminado Item D foi acrescentado na revisão 5.5 Item E mudou de nome para item F. 30 Gerência de Configuração de Software Gerência de mudanças A Gerência de mudanças é uma parte geralmente negligenciada da Gerência de configuração. Como ela não tem resultados imediatos para os desenvolvedores e engenheiros de software envolvidos no projeto, estes acabam por não perceber sua importância. Gerência de mudanças entretanto é uma parte importante da Gerência de configuração, pois é a atividade que permite se saber o motivo de uma configuração ter sido mudada para outra configuração. Esta atividade também pode ser parcialmente automatizada, e diversos Sistemas de controle de versão já são integrados com sistemas de gerência de mudanças. A gerência de mudanças tem por objetivo mapear, para cada mudança efetuada no sistema, qual foi o motivo que gerou esta mudança. É comum vermos em sistemas de software arquivos que listam as melhorias e mudanças entre duas versões. Estes arquivos são resultado da gerência de mudanças, identificando o que mudou entre uma versão e outra. Exemplos • mudança da versão 1.0 para 1.1 inclui: • • • • correção do problema 355 correção do problema 356 correção do problema 358 nova funcionalidade de impressão de relatórios • pendências para a versão 1.2: • correção das mudanças 357 e 359. • impressão de relatórios coloridos. Histórico de Alterações Como o repositório registra todas as alterações que foram efetuadas, o sistema de controle de versão pode informar com facilidade quais as alterações que foram realizadas entre uma revisão e outra, quando isso ocorreu e quem fez as alterações. Essas informações permitem um controle maior sobre mudanças no projeto. Auditoria de configuração Executar Auditoria de Configuração Física Uma Auditoria de Configuração Física (PCA) identifica os componentes de um produto que serão implantados do Repositório do Projeto. Os passos são: • Identificar a baseline a ser implantada (geralmente é apenas um nome e/ou número, mas também pode ser uma lista completa de todos os componentes e suas respectivas versões). • Confirmar que todos os artefatos necessários, conforme especificado pelo Caso de Desenvolvimento, estão presentes na baseline. Liste os artefatos ausentes em Descobertas da Auditoria de Configuração. Outros Níveis da Auditoria de Configuração Física Algumas organizações usam uma Auditoria de Configuração Física para confirmar a consistência do design e/ou documentação do usuário com o código. O Rational Unified Process recomenda que a verificação dessa consistência seja executada como parte da atividade de revisão no decorrer do processo de desenvolvimento. No último estágio, as auditorias devem se limitar a verificar os produtos liberados necessários que estão presentes, sem se preocupar em revisar o conteúdo. 31 Gerência de Configuração de Software Executar Auditoria de Configuração Funcional Uma Auditoria de Configuração Funcional (FCA) confirma que uma baseline atende aos requisitos estabelecidos para ela. Os passos para a execução dessa auditoria são: • Preparar um relatório que liste cada requisito estabelecido para a baseline, seu procedimento de teste correspondente e o resultado de teste (aprovado/reprovado) da baseline. • Confirmar que cada requisito passou por um ou mais testes e que o resultado de todos esses testes foi 'aprovado'. Em Descobertas da Auditoria de Configuração, liste quaisquer requisitos que não tenham passado por procedimentos de teste e os requisitos que estão com teste incompleto ou que foram reprovados. • Gerar uma lista das CRs estabelecidas para essa baseline. Confirme que cada CR foi fechada. Em Descobertas da Auditoria de Configuração, liste quaisquer CRs que não estão fechadas. Reportar Descobertas Se houver alguma discrepância, ela será capturada em Descobertas da Auditoria de Configuração conforme descrito anteriormente. Além disso, os seguintes passos deverão ser executados: • Identificar ações corretivas. Talvez, isso requeira a entrevista de vários membros da equipe do projeto para que a origem da discrepância e as ações apropriadas sejam identificadas. • Para artefatos ausentes, a ação apropriada é geralmente controlar a configuração do artefato ou criar uma CR ou tarefa que produzirá o artefato ausente. • No caso de requisitos não testados ou reprovados no teste, o requisito pode ser estabelecido para uma baseline posterior ou negociado para ser removido do conjunto de requisitos. • Para CRs em aberto, a CR pode ser simplesmente fechada, testada ou adiada para uma baseline posterior. • Para cada ação corretiva, atribua uma responsabilidade e determine uma data de conclusão. Política de Gerência de Configuração de Software A finalidade da política de Gerência de Configuração de Software consiste em definir a maneira como as atividades de Gerência de Configuração de Software serão executadas, o momento adequado, os responsáveis em executa-las e os conceitos envolvidos no processo. Entre as definições que devem contar nas políticas de Gerência de configuração de software podemos citar: • Ferramentas para automatização do controle de revisões (Sistema de controle de versão) caso seja usada. • Caso não seja usada ferramenta, deve se definir o procedimento manual para o controle de revisões. • Caso existam elementos que não estejam em formato eletrônico (ferramentas de hardware por exemplo), os procedimentos de controle de revisões para estes elementos deve também ser definido. • Ferramentas para o controle de mudanças • Caso não seja usada ferramenta, deve também ser definido o procedimento manual. • Controle de acesso às ferramentas de controle de revisão e controle de mudanças • Nível de integração entre as ferramentas caso sejam ferramentas distintas • Alguns fabricantes fornecem ferramentas que já desempenham os papeis de controle de revisão e controle de mudanças num único sistema, enquanto outros fabricantes as fornecem em separado. • Periodicidade e granularidade do controle de revisões • Recomenda-se um controle diário para elementos em formato eletrônico. A granularidade em geral depende do tipo de item e da ferramenta utilizada. • Papeis a serem desempenhados pelos membros da equipe dentro do contexto de Gerência de Configuração de Software. • Freqüência e forma de realização das auditorias de configuração. 32 Gerência de Configuração de Software • Em geral apenas a primeira auditoria de configuração de uma linha-base precisa de intervenção humana, sendo que as auditorias subseqüentes apenas verificam se houve quebra da integridade dos arquivos auditados. Papéis Uma das principais definições da política de Gerência de Configuração de Software são os papeis a serem desempenhados. A política não determina quais pessoas desempenharão quais papeis, cabendo isso a gerência de projeto. Alguns papeis necessários numa política são: • Gestor de configuração do projeto. Ele é o responsável por acompanhar as alterações dos itens de configurações de um determinado projeto. Em geral este papel cabe ao integrador. • Gestor de ferramentas de Gerência de configuração. Ele é o responsável pela manutenção da infra-estrutura necessária para o bom funcionamento da Gerência de configuração no conjunto dos projetos da organização, ou no contexto do projeto, se for o caso. Em geral é uma pessoa da área de infra-estrutura com bons conhecimentos da plataforma operacional e das ferramentas usadas. • Gestor de Configuração de Software, ou Responsável de Gerência de Configuração de Software. Ele é o responsável por aprovar e gerenciar as atividades relativas a Gerência de Configuração de Software, coordenar a equipe de Gerência de Configuração de Software e algumas vezes, coordenar o trabalho de integração de sistemas. • Auditor de Configuração de Software. Ele é o responsável pela realização das auditorias de configuração nos projetos. • Desenvolvedor. Ele é o principal usuário da Gerência de configuração de software, sendo quem produz os itens de configuração que serão gerenciados. [1] BROWN, William J. et ali. Antipatterns and Patterns in Software Configuration Management. Nova Iorque: Wiley computer publishing, 1999. 0-471-32929-0 Bibliografia • BROWN, William J. et ali. Antipatterns and Patterns in Software Configuration Management. Nova Iorque: Wiley computer publishing, 1999. 0-471-32929-0 • MIKKELSEN, Tim, PHERIGO, Suzanne. Parctical Software Configuration Management: The Latenight Developer's Handbook. Upper Saddle River, NJ, EUA: Prentice Hall PTR, 1997. 0-13-240854-6 • MOLINARI, Leonardo. Gerência de Configuração - Técnicas e Práticas no Desenvolvimento do Software. Florianópolis: Visual Books, 2007. 85-7502-210-5 • PRESSMAN, Roger S.. Engenharia de Software. São Paulo: Pearson Makron Books, 1995. 85-346-0237-9 Ver também • Sistema de controle de versão • Engenharia de software Ligações externas • Gerência de Configuração (http://www.pronus.eng.br/artigos_tutoriais/gerencia_configuracao/ gerencia_configuracao.php?pagNum=1) (em português) 33 Processos de Engenharia de Software Processos de Engenharia de Software Definição Um processo de Engenharia de Software é formado por um conjunto de passos de processo parcialmente ordenados, relacionados com artefatos, pessoas, recursos, estruturas organizacionais e restrições, tendo como objetivo produzir e manter os produtos de software finais requeridos. Conceitos Os processos são divididos em atividades ou tarefas. Uma atividade é um passo de processo que produz mudanças de estado visíveis externamente no produto de software. Atividades incorporam e implementam procedimentos, regras e políticas, e têm como objetivo gerar ou modificar um dado conjunto de artefatos. Um artefato é um produto criado ou modificado durante um processo. Tal produto é resultado de uma atividade e pode ser utilizado posteriormente como matéria prima para a mesma ou para outra atividade a fim de gerar novos produtos. Uma atividade aloca recursos (por exemplo, computadores, impressoras e material de expediente), é escalonada, monitorada e atribuída a desenvolvedores (agentes), que podem utilizar ferramentas para executá-la. Toda atividade possui uma descrição, a qual pode especificar os artefatos necessários, as relações de dependência com outras atividades, as datas de início e fim planejadas, os recursos a serem alocados e os agentes responsáveis pela mesma. O agente pode ser uma pessoa ou uma ferramenta automatizada (quando a atividade é automática) e relaciona-se com as atividades de um processo. Os agentes podem estar organizados em cargos, aos quais podem ser definidas diferentes responsabilidades. A realização do processo é afetada pelas restrições, que podem atingir atividades, agentes, recursos, artefatos, papéis e seus relacionamentos. Uma restrição é uma condição definida que um passo de processo deve satisfazer antes ou depois de ser executado. 34 Processos de Engenharia de Software Atividade de Processos de Engenharia de Software e seus inter-relacionamentos Bibliografia Reis, Rodrigo Quites et. al. 2002. Automação no Gerenciamento do Processo de Engenharia de Software. Disponível em [1]; Ver também • Administração de dados Referências [1] http:/ / www. labes. ufpa. br/ quites/ teaching/ 2006/ TopicosES/ ProcessoEngenhariaSoftware. pdf 35 Qualidade de Software Qualidade de Software A qualidade de software é uma área de conhecimento da engenharia de software que objetiva garantir a qualidade do software através da definição e normatização de processos de desenvolvimento. Apesar dos modelos aplicados na garantia da qualidade de software atuarem principalmente no processo, o principal objetivo é garantir um produto final que satisfaça às expectativas do cliente, dentro daquilo que foi acordado inicialmente. Segundo a norma ISO 9000 (versão 2000), a qualidade é o grau em que um conjunto de características inerentes a um produto, processo ou sistema cumpre os requisitos inicialmente estipulados para estes. No desenvolvimento de software, a qualidade do produto está diretamente relacionada à qualidade do processo de desenvolvimento[1] , desta forma, é comum que a busca por um software de maior qualidade passe necessariamente por uma melhoria no processo de desenvolvimento. Rodney Brooks, diretor do Laboratório de Inteligência Artificial e Ciência da Computação do MIT, define qualidade como a conformidade aos requisitos. Essa definição exige determinar dois pontos: I) o que se entende por conformidade; e II) como são especificados - e por quem - os requisitos. Principais tópicos Para um melhor entendimento e estudo, o SWEBOK divide a qualidade de software em três tópicos, e cada tópico é subdividido em atividades, da seguinte forma: • Fundamentos de qualidade de software • Cultura e ética de engenharia de software • Valores e custos de qualidade • Modelos e características de qualidade • Melhoria da qualidade • Gerência do processo de qualidade de software • Garantia de qualidade de software • Verificação e validação • Revisões e auditorias • Considerações práticas • • • • Requisitos de qualidade para aplicações Caracterização de defeitos Técnicas de gerência de qualidade de software Medidas de qualidade de software Ainda segundo o SWEBOK, a qualidade de software é um tema tão importante que é encontrado, de forma ubíqua, em todas as outras áreas de conhecimento envolvidas em um projeto. Além disso, ele deixa claro que essa área, como nele definida, trata do aspectos estáticos, ou seja, daqueles que não exigem a execução do software para avaliá-lo, em contraposição á área de conhecimento teste de software. Porém, é normal que se encontrem autores e empresas que afirmam serem os testes de software uma etapa da qualidade de software. Muita coisa pode ser encontrada no site http:/ / www. ibqts. com. br O IBQTS, Instituto Brasileiro de Qualidade em Testes de Software 36 Qualidade de Software Requisitos de qualidade Requisitos de qualidade é um tópico por si dentro do assunto qualidade. Dentro da ótica desta última, espera-se que os requisitos sejam definidos de maneira a caracterizar completamente o produto a ser construído. Nesse aspecto - e em relação à definição de Brooks - é evidente que as zonas de sombra dentro de uma especificação abrem margem a todo tipo de problemas de avaliação de produtos. Sommerville distingue requisitos funcionais e não funcionais. O modelo internacional mais recente Square, estabelecido pela norma ISO 25000, adota uma classificação um pouco diferente e utiliza uma descrição hierárquica. Dentro dessa descrição, "funcionalidade" é uma das seis divisões iniciais em que se classificam os requisitos de um produto de software. Idealmente, a especificação de requisitos deve permitir que o processo de fabricação do software seja controlado. Isso significa que idealmente a qualidade de produtos intermediários deve poder ser mensurada e que os dados obtidos devem trazer informação que possa levar ao controle de desvios, localização de defeitos e outras ocorrências negativas. O processo de software Nas últimas décadas foram propostas dezenas de metodologias e processos adaptados a diferentes cenários e produtos. Embora se possa justificar essa multiplicidade por outra lei de Brooks - a ausência de "balas de prata", é um fato que a situação se mostra confusa. Há dezenas de trabalhos propostos para casos particulares. Exemplos das diversas iniciativas para tratar o assunto são metodologias como XP e Scrum; o modelo CMM, seguido de toda uma série de adaptações (como SW-CMM, people-CMM, etc.), mais tarde substituído pelo modelo CMMI; e dezenas de artigos e teses de mestrado e doutorado, abordando tópicos particulares em um ou mais de tais métodos, ou propondo ainda novas adaptações a casos particulares. A situação deixa evidente que há um vácuo a ser preenchido - atacar a raiz do problema e identificar uma estrutura suficientemente geral, capaz de explicar o problema de qualidade e ser adaptada a todos os cenários diferentes. Se tal objetivo é possível resta a ser provado - assunto para novos artigos e teses. Garantia de qualidade de software A Garantia da Qualidade de Software (GQS) é a área-chave de processo do CMM cujo objetivo é fornecer aos vários níveis de gerência a adequada visibilidade dos projetos, dos processos de desenvolvimento e dos produtos gerados. A GQS atua como "guardiã", fornecendo um retrato do uso do Processo e não é responsável por executar testes de software ou inspeção em artefatos. Obtendo a visibilidade desejada, a gerência pode atuar de forma pontual no sentido de atingir os quatro grandes objetivos de um projeto de desenvolvimento de software, quais sejam, desenvolver software de alta qualidade, ter alta produtividade da equipe de desenvolvimento, cumprir o cronograma estabelecido junto ao cliente e não necessitar de recursos adicionais não previstos. Para conseguir esses objetivos a área-chave de processo GQS estimula a atuação das equipes responsáveis pelo desenvolvimento de software em diversas frentes objetivando internalizar comportamentos e ações, podendo-se destacar: • o planejamento do projeto e o acompanhamento de resultados; • o uso dos métodos e ferramentas padronizadas na organização; • a adoção de Revisões Técnicas Formais; • o estabelecimento e a monitoração de estratégias de testes; • a revisão dos artefatos produzidos pelo processo de desenvolvimento; 37 Qualidade de Software • a busca de conformidade com os padrões de desenvolvimento de software; • a implantação de medições associadas a projeto, processo e produto; • a utilização de mecanismos adequados de armazenamento e recuperação de dados relativos a projetos, processos e produtos; e • a busca de uma melhoria contínua no processo de desenvolvimento de software. Para facilitar o trabalho dos desenvolvedores e evitar geração de metodologias diversas, o Serpro desenvolveu o Processo Serpro de Desenvolvimento de Soluções (PSDS). O PSDS foi construído por pessoas das unidades da empresa que procuraram aproveitar as melhores práticas existentes e consagradas. O "CMM - Capability Maturity Model for Software /SEI" é uma estrutura-"framework", que descreve os principais elementos de um processo de desenvolvimento de software efetivo. O CMM descreve os estágios de maturidade através dos quais Organizações de software evoluem o seu ciclo de desenvolvimento de software através de sua avaliação contínua, identificação e ações corretivas dentro de uma estratégia de melhoria dos processos. Este caminho de melhoria é definido por cinco níveis de maturidade: inicial, repetitivo, definido, gerenciado e otimizado. O Modelo CMM (CMM- Capability Maturity Model) fornece às organizações uma direção sobre como ganhar controle de seu processo de desenvolvimento de software e como evoluir para uma cultura de excelência na gestão de software. O objetivo principal nas transações destes níveis de maturidade é a realização de um processo controlado e mensurado como a fundação para melhoria contínua. Cada nível de maturidade possui um conjunto de práticas de software e gestão específicas, denominado áreas-chave do processo. Estas devem ser implantadas para a organização atingir o nível de maturidade em qualidade de software. Bibliografia 1. AROUCK, O. Avaliação de sistemas de informação: revisão da literatura [2]. Transinformação, v. 13, n. 1, jan./jun., 2001. p. 7-21. 2. BROOKS, F. P. No Silver Bullet: Essence and Accidents of Software Engineering". Computer, Vol. 20, N. 4, pp 10-19. April, 1987. 3. KOSCIANSKI, A., Soares, M. S.. Qualidade de Software. Editora Novatec, Segunda Edição, 2007. 4. MOLINARI, Leonardo. Gerência de Configuração - Técnicas e Práticas no Desenvolvimento do Software, Editora Visual Books, 2007, Florianópolis, 85-7502-210-5. 5. MOLINARI, Leonardo. Testes de Software - Produzindo Sistemas Melhores e Mais Confiáveis, Editora Èrica, 2006, 3a Edição, São Paulo, 85-7194-959X. 6. PRESSMAN, R. S. Engenharia de Software. McGraw Hill, 2002. Modelos de qualidade • CMMI • MPS.BR • ISO 9126 Ver também • Lista de instituições pela qualidade • Teste de software • Teste de unidade • Gestão da qualidade • ISO • BIA 38 Qualidade de Software • Underwriters Laboratories [1] Qualidade de Software: Visões de Produto e Processo de Software (http:/ / www. prodepa. psi. br/ sqp/ pdf/ Qualidade de Software. pdf) [2] http:/ / www. eci. ufmg. br/ bogliolo/ downloads/ AROUK%20Avaliacao%20de%20sistemas%20de%20informacao. pdf Modelos ciclo de vida Perceber que atividades fazem parte do processo de engenharia de software é o primeiro passo para o concretizar, mas é também importante perceber como as actividades do processo se relacionam umas com as outras para que se torne visível todo o processo de desenvolvimento. O termo modelo do ciclo de vida é utilizado para descrever um modelo que visa descrever um grupo de actividades e a forma como elas se relacionam. Os modelos mais sofisticados incluem ainda uma descrição de quando e como se deve mover de uma actividade para a próxima e os deliverables que devem ser produzidos em cada etapa. A razão pela qual estes modelos são tão conhecidos é o facto ajudarem as equipas de desenvolvimento, e em particular os gestores, a obter uma visão geral do projecto de forma a ser possível segui-lo passo a passo, saber que deliverables foram especificados, o alocamento de recursos e os objectivos propostos. Estes "modelos de ciclo de vida" ou "modelos de processos" são tipicamente produzidos a partir de uma perspectiva de que poderão existir vários modelos para o mesmo processo. Nenhum modelo é capaz de dar uma visão completa de um determinado processo. Modelos de Processos Embora este artigo seja mais focado aos modelos de ciclo de vida na engenharia de requisitos de projetos de software, é importante ter uma ideia dos vários tipos de modelos de processos existentes. Os tipos de modelos de processos que podem ser produzidos dependem do uso que lhes será dado. Poderá ser necessário um modelo para explicar como está organizada a informação de processos, um modelo que ajude a compreender e permita melhorar processos, um modelo para satisfazer certos requisitos de qualidade, etc. Alguns exemplos de modelos que descrevem processos são: Modelos de Atividade A figura seguinte é um exemplo deste tipo de modelo. Estes modelos mostram os principais processos e atividades de engenharia de requisitos e o seu sequenciamento (aproximado). Este tipo de modelos não permite forçar um processo mas dá uma visão geral do mesmo e são tipicamente construídos como ponto de partida para a descrição de um processo com secções separadas Modelo de atividades. dando cobertura a cada caixa no modelo. Os modelos descrevem o contexto das diferentes atividades de um processo, mostrando outros processos que consomem ou produzem input de um outro. 39 Modelos ciclo de vida Modelos de Atividade de Granularidade Fina Estes são modelos mais detalhados para um processo específico. Podem ser utilizados para perceber e melhorar processos existentes. Modelos Papel-Ação Estes são modelos que mostram o papel de diferentes pessoas envolvidas num processo e as ações que podem tomar. Estes modelos, que não são tratados mais a fundo neste artigo, podem ajudar a perceber e automatizar processos. Modelos Entidade-Relação Estes modelos mostram as entradas, saídas e resultados intermédios dos processos e relações entre eles. Podem ser utilizados num sistema de gestão de qualidade e como modelos complementares das actividades de processo. Atividades do Processo de Engenharia de Requisitos Diferentes tipos de organizações abordam a engenharia de requisitos de formas radicalmente diferentes. Uma companhia aeroespacial que se encontre a especificar sistemas de software e hardware muito complexos não utiliza o mesmo processo de engenharia de requisitos que uma outra companhia que desenvolve produtos de consumo para computadores pessoais. No entanto, as diferenças entre estes processos encontram-se geralmente no nível de detalhe dos processos. Num nível abstracto, todos os processos de engenharia de requisitos podem ser descritos pelo modelo mostrado na figura anterior. Antes de apresentar os modelos de ciclo de vida para o processo de engenharia de requisitos, torna-se necessário compreender melhor as actividades nele envolvidas. As actividades do processo de engenharia de requisitos são as seguintes: Levantamento de Requisitos Os requisitos do sistema são obtidos através de consultas aos stakeholders, documentação do sistema, conhecimento do domínio e estudos de mercado. Este processo é também conhecido como aquisição de requisitos ou descoberta de requisitos. Análise e Negociação de Requisitos Os requisitos são analisados em detalhe e os diferentes stakeholders negociam para decidirem que requisitos serão aceitos. Este processo é necessário visto que é inevitável o aparecimento de conflitos entre requisitos de diferentes fontes, existência de informação incompleta ou então os requisitos podem ser incompatíveis com o orçamento disponível para o desenvolvimento do sistema. Existe, no entanto, alguma flexibilidade no negociamento de requisitos para que seja possível concordar acerca de conjunto de requisitos para o sistema. Documentação de Requisitos Os requisitos acordados durante o processo de negociação são documentados com um nível de detalhe apropriado. Em geral, é necessário existir um documento de especificação de requisitos que seja compreendido por todos os stakeholders. Isto significa que os requisitos devem ser detalhados utilizando linguagem natural e diagramas. Podem também ser produzidos documentos de sistema mais detalhados tais como modelos de sistema. Validação de Requisitos Todos os requisitos obtidos nas actividades anteriores devem ser cuidadosamente verificados para apurar se estão completos e são consistentes. Este processo tem como finalidade detectar potenciais problemas no documento de especificação de requisitos antes que este seja utilizado como base para o desenvolvimento do sistema. 40 Modelos ciclo de vida Modelos de Ciclo de Vida Os modelos existentes possuem diferentes graus de sofisticação e complexidade. Para projetos que envolvem uma equipe de desenvolvimento pouco numerosa e experiente, o mais adequado será provavelmente um processo simples. No entanto, para sistemas maiores que envolvem equipes de dezenas ou centenas de elementos e milhares de utilizadores, um processo simples não é suficiente para oferecer a estrutura de gestão e disciplina necessárias à engenharia de um bom produto de software. Desta forma, é necessário algo mais formal e disciplinado. É importante fazer notar que isto não significa que se perca em inovação ou que se põe entraves à criatividade. Significa apenas que é utilizado um processo bem estruturado para permitir a criação de uma base estável para a criatividade. Por mais simples ou complexo que possa parecer, um modelo de ciclo de vida de um projeto é, de facto, uma versão simplificada da realidade. É suposto ser uma abstracção e, tal como todas as boas abstracções, apenas a quantidade de detalhe necessária ao trabalho em mãos deve ser incluída. Qualquer organização que deseje por um modelo de ciclo de vida em prática irá necessitar de adicionar detalhes específicos para dadas circunstâncias e diferentes culturas. Por exemplo, a Microsoft quis manter uma cultura de pequena equipa e ao mesmo tempo tornar possível o desenvolvimento de grandes e complexos produtos de software. Na próxima secção, é introduzido uma interpretação do aspecto que um modelo de ciclo de vida deve ter em termos de engenharia de requisitos para projectos de software. Dependendo do tipo de sistema em desenvolvimento pode não ser completamente possível ou até apropriado seguir os modelos rigorosamente. É de notar também que para por em prática um destes modelos e aplica-lo a um projecto real seria necessário adicionar mais detalhe. Modelos em Engenharia de Software e Requisitos A engenharia de software tem produzido inúmeros modelos de ciclo de vida, incluindo os modelos de cascata, espiral e desenvolvimento rápido de aplicações (RAD). Antes do modelo de cascata ser proposto em 1970, não havia concordância em termos dos métodos a levar a cabo no desenvolvimento de software. Desde então ao longo dos anos muitos modelos têm sido propostos refletindo assim a grande variedade de interpretações e caminhos que podem ser tomadas no desenvolvimento de software. Neste artigo, foi decidida a inclusão destes modelos por duas razões: primeiro porque são representativos dos modelos utilizados na indústria e foi já provado o seu sucesso, e segundo porque mostram como a ênfase no desenvolvimento de software mudou gradualmente de forma a incluir uma visão mais interativa e centrada no utilizador. Modelo em Cascata O modelo de ciclo de vida em cascata foi o primeiro modelo a ser conhecido em engenharia de software e está na base de muitos ciclos de vida utilizados hoje em dia. Este consiste basicamente num modelo linear em que cada passo deve ser completado antes que o próximo passo possa ser iniciado. Por exemplo, a análise de requisitos deve ser completada antes que o Modelo em Cascata. desenho do sistema possa ser iniciado. Os nomes dados a cada passo variam, assim como varia a definição exata de cada um deles, mas basicamente o ciclo de vida começa com a análise de requisitos movendo-se de seguida para a fase de desenho, codificação, implementação, teste e finalmente manutenção do sistema. Uma das grandes falhas deste modelo é o fato de os requisitos estarem constantemente a mudar já que os negócios e ambiente em que se inserem mudam rapidamente. Isto significa que não faz sentido parar os requisitos durante muito tempo, enquanto o desenho e implementação do sistema são 41 Modelos ciclo de vida 42 completados. Foi então reconhecido que seria necessário dar feedback às atividades iniciais a partir do momento em que este modelo começou a ser usado em grande escala. A ideia de interacção não foi incorporada na filosofia do modelo de cascata. Neste momento, é incluído algum nível de interação na maior parte das versões deste modelo e são comuns sessões de revisão entre os elementos responsáveis pelo desenvolvimento do sistema. No entanto, a possibilidade de revisão e avaliação com os utilizadores do sistema não está contemplada neste modelo. Modelo em Espiral Durante muitos anos, o modelo cascata foi a base da maior parte do desenvolvimento de projetos de software, mas em 1988 Barry Boehm sugeriu o modelo em espiral. Do modelo em espiral para desenvolvimento de software saltam a vista dois aspectos: a análise de risco e prototipagem. O modelo espiral incorpora-os de uma forma interativa permitindo que as ideias e o progresso sejam verificados e avaliados constantemente. Cada interação à volta da espiral pode ser baseada num modelo diferente e pode ter diferentes atividades. No caso da espiral, não foi a necessidade do envolvimento dos utilizadores que inspirou a introdução de interação mas sim a necessidade de identificar e controlar riscos. No modelo espiral para engenharia de requisitos mostra-se que as diferentes atividades são repetidas até uma decisão ser tomada e o documento de especificação de requisitos ser aceito. Se forem encontrados problemas numa versão inicial do documento, reentra-se nas fases de levantamento, análise, documentação e validação. Isto repete-se até que seja produzido um documento aceitável ou até que fatores externos, tais como prazos e falta de recursos ditem o final do processo de engenharia de requisitos. Características de Vários Modelos Na tabela seguinte estão sumariadas algumas vantagens e desvantagens de vários modelos de ciclo de vida utilizados em engenharia de requisitos para projectos de software: Modelo Vantagens Desvantagens Cascata Minimiza o tempo de planejamento. Funciona bem para equipes tecnicamente mais fracas. Inflexível. Apenas a fase final produz um deliverable que não é um documento. Torna-se difícil voltar atrás para corrigir erros. Espiral As interações inicias do projecto são as mais baratas, permitindo que as tarefas de maior risco sejam levadas com o mínimo de custos. Cada iteração da espiral pode ser customizada para as necessidades específicas de cada projecto. É complexo e requer atenção e conhecimento especiais para o levar a cabo. Prototipagem Evolucionária Os clientes conseguem ver os progressos. É útil quando os requisitos mudam rapidamente e o cliente está relutante em aceitar um conjunto de requisitos. É impossível determinar com exactidão o tempo que o projecto vai demorar. Não há forma de saber o número de iterações que serão necessárias. Codificação e Correcção Não há tempo gasto em planejamento, documentação, gestão de qualidade e cumprimento de standards. Requer pouca experiência. Perigoso. Não há forma de assegurar qualidade e identificar riscos. Falhas fundamentais não percebidas imediatamente resultando em trabalho deitado fora. Entre outros modelos utilizados estão: Staged Delivery, Evolutionary Delivery, Design-to-Schedule, Design-to-Tools e Off-the-Shelf. Modelos ciclo de vida Bibliografia • Gerald Kotonya ; Ian Sommerville. Requirements Engineering: Processes and Techniques (em Inglês). John Wiley & Sons, 1998. pag. 294. ISBN 0471972088 • Ian Sommerville ; Pete Sawyer. Requirements Engineering: A good practice guide (em Inglês). 1 ed. John Wiley & Sons, 1997. pag. 404. ISBN 0471974447 • Helen Sharp ; Yvonne Rogers ; Jenny Preece. Interaction Design: Beyond Human-computer Interaction (em Inglês). 2 ed. John Wiley & Sons, 2002. pag. 519. ISBN 0471492787 Ligações externas • Project Lifecycle Models [1] : How They Differ and When to Use Them. Referências [1] http:/ / www. business-esolutions. com/ islm. htm Análise Estruturada 1. REDIRECIONAMENTO Análise estruturada Projeto Estruturado Projeto estruturado é a atividade da especificação das atividades que compõem um modelo funcional de transformação das necessidades do usuário. São provenientes das fases de análise e diagramação e de plano de implementação. 43 Programação Estruturada Programação Estruturada Programação estruturada é uma forma de programação de computadores que preconiza que todos os programas possíveis podem ser reduzidos a apenas três estruturas: sequência, decisão e iteração, desenvolvida por Michael A. Jackson no seu livro "Principles of Program Design" de 1975. Tendo, na prática, sido transformada na Programação modular, a Programação estruturada orienta os programadores para a criação de estruturas simples em seus programas, usando as subrotinas e as funções. Foi a forma dominante na criação de software anterior à programação orientada por objetos. Apesar de ter sido sucedida pela programação orientada por objetos, pode-se dizer que a programação estruturada ainda é muito influente, uma vez que grande parte das pessoas ainda aprendem programação através dela. Além disso, por exigir formas de pensar relativamente complexas, a programação orientada a objetos até hoje ainda não é bem compreendida ou usada pela maioria. Há de se acrescentar também que inúmeras linguagens ainda extremamente relevantes nos dias de hoje, como o Cobol ainda utilizam o paradigma estruturado (muito embora possuam suporte para a orientação à objetos). Análise Essencial A Análise Essencial propõe o particionamento do sistema por eventos. A rigor, o valor de um sistema está na sua capacidade de responder com eficácia a todos os estímulos a que for submetido. Assim, um sistema é construído para responder a estímulos. A cada estímulo, o sistema deve reagir produzindo uma resposta predeterminada. A expressão Essential Analysis, traduzida por Análise Essencial, foi proposta em 1984 por McMenamim e Palmer para refletir a introdução dos novos conceitos que estavam sendo incorporados à Análise Estruturada clássica. Conceito A Análise Essencial é a técnica que orienta a análise de sistemas para a essência do negócio ao qual se destina, independente das soluções de informática que serão utilizadas em sua construção, partindo do princípio de que os sistemas existem independentemente dos computadores, e são feitos visando uma oportunidade de negócio. Na Análise Essencial existem dois modelos, denominados de Modelo Essencial e Modelo de Implementação. 44 Análise Essencial Modelo Essencial Apresenta o sistema num nível de abstração completamente independente de restrições tecnológicas. Antes que um sistema seja implementado, é necessário conhecer-se a sua verdadeira essência, não importando saber se sua implementação vai ser manual ou automatizada, e nem mesmo que tipo de hardware ou software vai ser usado. O Modelo Essencial é formado por: • Modelo Ambiental: Define a fronteira entre o sistema e o resto do mundo • Modelo Comportamental: Define o comportamento das partes internas do sistema necessário para interagir com o ambiente; Métodos Envolvidos:Modelagem de Dados e Modelagem Funcional. Modelo Ambiental O Modelo Ambiental é o modelo que define: • A fronteira do sistema com o ambiente onde ele se situa, determinando o que é interno e o que é externo a ele. • As interfaces entre o sistema e o ambiente externo, determinando que informações chegam ao sistema vindas do mundo exterior e vice-versa. • Os eventos do ambiente externo ao sistema aos quais este deve responder. • Ferramentas para definição do ambiente. O Modelo Ambiental consiste de quatro componentes: 1. 2. 3. 4. Declaração de Objetivos Diagrama de Contexto Lista de Eventos Dicionário de Dados Preliminar (opcional) Declaração dos Objetivos • Consiste de uma breve e concisa declaração dos objetivos do sistema. • É dirigida para a alta gerência, gerência usuária ou outras pessoas não diretamente envolvidas no desenvolvimento do sistema. • Pode ter uma, duas ou várias sentenças mas não deve ultrapassar um parágrafo. • Não deve pretender dar uma descrição detalhada do sistema. Diagrama de Contexto • Apresenta uma visão geral das características importantes do sistema, as pessoas, organizações ou sistemas com os quais o sistema se comunica (Entidades Externas), os dados que o sistema recebe do mundo exterior e que de alguma forma devem ser processados, os dados produzidos pelo sistema e enviados ao mundo exterior e a fronteira entre o sistema e o resto do mundo. 45 Análise Essencial 46 Lista de eventos • É uma relação de estimulos que ocorrendo no mundo exterior implicam que o sistema de algum tipo de resposta. Tambem pode ser definido informalmente como um acontecimento do mundo exterior que requer do sistema alguma resposta. É um ativador de uma função. É a forma como o evento age sobre o sistema. É a conseqüência do fato de ter ocorrido um evento externo. É a chegada de um estímulo que indica que o evento ocorreu e isto faz com que o sistema então ative uma função pré-determinada para produzir a resposta esperada. UM ESTÍMULO: É um ativador de uma função. É a forma como o evento age sobre o sistema. Éa conseqüência do fato de ter ocorrido um evento externo. É a chegada de um estímulo que indica que o evento ocorreu e isto faz com que o sistema então ative uma função pré-determinada para produzir a resposta esperada. UMA RESPOSTA: É o resultado gerado pelo sistema devido à ocorrência de um evento. Uma resposta é sempre o resultado da execução de alguma função interna no sistema como conseqüência do reconhecimento pelo sistema de que um evento ocorreu. Modelo Comportamental Define o comportamento interno que o sistema deve ter para se relacionar adequadamente com o ambiente.Ou, o Modelo Comportamental é definido do ponto de vista interno, é o modelo interior do sistema. Descreve de que maneira o sistema, enquanto um conjunto de elementos inter-relacionados, reage, internamente, como um todo organizado, aos estímulos do exterior. Consiste de quatro componentes: - DFD Particionado Diagrama ER (DER) Diagrama de Transição de Estado (DTE) Dicionário de Dados Preliminar (opcional) Especificações de processos Análise Essencial Modelo de Implementação Tem como objetivo definir a forma de implementação do sistema em um ambiente técnico específico. Apresenta o sistema num nível de abstração completamente dependente de restrições tecnológicas. Simbologia Conjunto de artefatos gráficos que permitem a montagem de diagramas na análise essencial Processo: Conjunto de atividade que produzem, modificam ou atribuem qualidade às informações. Depósito de Dados: Conjunto de informações armazenadas pelo processo para serem utilizadas por algum processo, a qualquer momento. Entidade Externa: É algo situado fora do escopo do sistema, que é fonte ou destino das suas informações. Fluxo de Dados: O nome deve expressar o significado do conjunto de informações que está fluindo. Vantagens da Análise Essencial sobre a Estruturada • A Análise Essencial começa pelo modelo essencial, o que equivale, na Análise Estruturada, começar diretamente pelo modelo lógico proposto. • A Análise Estruturada aborda duas perspectivas do sistema - função e dados -, ao passo que a Análise Essencial aborda três perspectivas - função, dados e controle. • Na Análise Estruturada o particionamento é feito através da abordagem top-down, enquanto na Análise Essencial, o particionamento é por eventos. 47 SADT 48 SADT Structured Analysis and Design Technique Structured Analysis and Design Technique — SADT é uma técnica para apresentação de idéias. Esta técnica foi proposta por Douglas T. Ross em 1977, no artigo Ross, D. (1977) “Structured Analysis (AS): A Language for Communicating Ideas”. IEEE Transactions on Software Engineering, vol. 3, no.1, pp. 16-34. É uma técnica usada na construção de modelos. Segundo essa visão, cada modelo deve ter um objetivo e um ponto de vista. Serviço de Apoio à Diagnose e Terapia – SADT Serviço de Apoio à Diagnose e Terapia, ou Serviço Auxiliar de Diagnóstico e Terapia (SADT) é uma modalidade de prestação de serviços na área da saúde que se utiliza de recursos de uma fonte financiadora (SUS, Particular, ou Convênio) com o objetivo de esclarecer o diagnóstico ou realizar procedimentos terapêuticos específicos para pacientes externos, internos ou de emergência de um serviço de saúde. Geralmente organiza-se por um sistema informatizado que registra a oferta dos serviços em determinadas especialidades, sejam eles próprios, terceirizados ou contratados interna ou externamente ao estabelecimento de saúde. DFD O DFD ou Diagrama de Fluxos de Dados é uma ferramenta para a modelagem de sistemas. Ela fornece apenas uma visão do sistema, a visão estruturada das funções, ou seja, o fluxo dos dados. Se estivermos desenvolvendo um sistema no qual os relacionamentos entre os dados sejam mais importantes que as funções, podemos dar menos importância ao DFD e dedicar-nos aos Diagramas de Entidade-Relacionamento (DER). Um DFD é uma ferramenta de modelagem que nos permite imaginar um sistema como uma rede de processos funcionais, interligados por “dutos” e “tanques de armazenamento de dados". (Edward Yourdon) Outros nomes para este diagrama • • • • • Diagrama de bolhas DFD (abreviatura) Modelo de processo Diagrama de fluxo de trabalho Modelo funcional Componentes de um DFD • • • • DFD Entidades Externas DFD Processos Fluxo de dados Depósito de Dados O DFD pode ter vários níveis de detalhamento de acordo com a necessidade do sistema. O Diagrama de Contexto é uma representação DFD 49 macro do sistema. Em seguida, temos os DFDs de níveis. O nível mais alto é conhecido como DFD de nível 0 e está logo abaixo do diagrama de contexto. Neste nível as principais funções do sistemas são mostradas. Caso o processo não esteja claro o suficiente o mesmo será aperfeiçoado a cada nível. Quando se diz que o DFD fornece apenas uma visão do sistema,é pelo fato de que através de sua representação gráfica não nos comprometemos com a sua implementação física. O DIAGRAMA DE FLUXO DE DADOS (DFD) Todo modelo funcional de um sistema pode ser visto como sendo formado por uma representação gráfica (uma rede de funções ou processos interligados), acompanhada da descrição de cada função e suas interfaces. A representação gráfica do modelo funcional costuma ser expressa através de um diagrama denominado Diagrama de Fluxo de Dados−DFD. O Conceito de Função → Caixa Preta X o------ Y = F(X) ------o Y por exemplo Elevar o X o----- No X ao -----o Y Quadrado Há ligações de entrada e de saída da caixa. Conhecem-se os elementos de entrada da caixa. Conhecem-se os elementos de saída da caixa. Sabe-se o que a caixa faz com as entradas para obter as saídas. Não é preciso saber como a caixa realiza suas operações, e nem a ordem. Veja também • Função e Processo de Negócio • Matriz CRUD Modelo de Entidades e Relacionamentos 1. REDIRECIONAMENTO Modelo de entidades e relacionamentos Orientação a Objetos Orientação a objetos Objeto Classe • Instância Abstração Métodos Atributo Encapsulamento Herança • Herança múltipla Polimorfismo Outras referências Padrões de projeto UML Engenharia OO A orientação a objetos é um paradigma de análise, projeto e programação de sistemas de software baseado na composição e interação entre diversas unidades de software chamadas de objetos. Orientação a Objetos Em alguns contextos, prefere-se usar modelagem orientada ao objeto, em vez de programação. De fato, o paradigma "orientação a objeto", tem bases conceituais e origem no campo de estudo da cognição, que influenciou a área de inteligência artificial e da linguística, no campo da abstração de conceitos do mundo real. Na qualidade de método de modelagem, é tida como a melhor estratégia para se eliminar o "gap semântico", dificuldade recorrente no processo de modelar o mundo real do domínio do problema em um conjunto de componentes de software que seja o mais fiel na sua representação deste domínio. Facilitaria a comunicação do profissional modelador e do usuário da área alvo, na medida em que a correlação da simbologia e conceitos abstratos do mundo real e da ferramenta de modelagem (conceitos, terminologia, símbolos, grafismo e estratégias) fosse a mais óbvia, natural e exata possível. A análise e projeto orientados a objetos têm como meta identificar o melhor conjunto de objetos para descrever um sistema de software. O funcionamento deste sistema se dá através do relacionamento e troca de mensagens entre estes objetos. Na programação orientada a objetos, implementa-se um conjunto de classes que definem os objetos presentes no sistema de software. Cada classe determina o comportamento (definido nos métodos) e estados possíveis (atributos) de seus objetos, assim como o relacionamento com outros objetos. C++, C#, Java, Object Pascal, Objective-C, Python, SuperCollider, Ruby e Smalltalk são exemplos de linguagens de programação orientadas a objetos. ActionScript, ColdFusion, Javascript, PHP (a partir da versão 4.0), Perl (a partir da versão 5) e VB.NET são exemplos de linguagens de programação com suporte a orientação a objetos. Conceitos essenciais • Classe representa um conjunto de objetos com características afins. Uma classe define o comportamento dos objetos através de seus métodos, e quais estados ele é capaz de manter através de seus atributos. Exemplo de classe: Os seres humanos. • Subclasse é uma nova classe originada de sua classe pai (ver Herança). • Objeto / instância de uma classe. Um objeto é capaz de armazenar estados através de seus atributos e reagir a mensagens enviadas a ele, assim como se relacionar e enviar mensagens a outros objetos. Exemplo de objetos da classe Humanos: João, José, Maria. • Atributo são características de um objeto. Basicamente a estrutura de dados que vai representar a classe. Exemplos: Funcionário: nome, endereço, telefone, CPF,...; Carro: nome, marca, ano, cor, …; Livro: autor, editora, ano. Por sua vez, os atributos possuem valores. Por exemplo, o atributo cor pode conter o valor azul. O conjunto de valores dos atributos de um determinado objeto é chamado de estado. • Método definem as habilidades dos objetos. Bidu é uma instância da classe Cachorro, portanto tem habilidade para latir, implementada através do método deUmLatido. Um método em uma classe é apenas uma definição. A ação só ocorre quando o método é invocado através do objeto, no caso Bidu. Dentro do programa, a utilização de um método deve afetar apenas um objeto em particular; Todos os cachorros podem latir, mas você quer que apenas Bidu dê o latido. Normalmente, uma classe possui diversos métodos, que no caso da classe Cachorro poderiam ser sente, coma e morda. • Mensagem é uma chamada a um objeto para invocar um de seus métodos, ativando um comportamento descrito por sua classe. Também pode ser direcionada diretamente a uma classe (através de uma invocação a um método estático). • Herança (ou generalização) é o mecanismo pelo qual uma classe (sub-classe) pode estender outra classe (super-classe), aproveitando seus comportamentos (métodos) e variáveis possíveis (atributos). Um exemplo de herança: Mamífero é super-classe de Humano. Ou seja, um Humano é um mamífero. Há herança múltipla quando uma sub-classe possui mais de uma super-classe. Essa relação é normalmente chamada de relação "é um". 50 Orientação a Objetos • Associação é o mecanismo pelo qual um objeto utiliza os recursos de outro. Pode tratar-se de uma associação simples "usa um" ou de um acoplamento "parte de". Por exemplo: Um humano usa um telefone. A tecla "1" é parte de um telefone. • Encapsulamento consiste na separação de aspectos internos e externos de um objeto. Este mecanismo é utilizado amplamente para impedir o acesso direto ao estado de um objeto (seus atributos), disponibilizando externamente apenas os métodos que alteram estes estados. Exemplo: você não precisa conhecer os detalhes dos circuitos de um telefone para utilizá-lo. A carcaça do telefone encapsula esses detalhes, provendo a você uma interface mais amigável (os botões, o monofone e os sinais de tom). • Abstração é a habilidade de concentrar nos aspectos essenciais de um contexto qualquer, ignorando características menos importantes ou acidentais. Em modelagem orientada a objetos, uma classe é uma abstração de entidades existentes no domínio do sistema de software. • Polimorfismo consiste em quatro propriedades que a linguagem pode ter (atente para o fato de que nem toda linguagem orientada a objeto tem implementado todos os tipos de polimorfismo): • Universal: • Inclusão: um ponteiro para classe mãe pode apontar para uma instância de uma classe filha (exemplo em Java: "List lista = new LinkedList();" (tipo de polimorfismo mais básico que existe). • Paramétrico: se restringe ao uso de templates (C++, por exemplo) e generics (Java/C#). • Ad-Hoc: • Sobrecarga: duas funções/métodos com o mesmo nome mas assinaturas diferentes. • Coerção: a linguagem que faz as conversões implicitamente (como por exemplo atribuir um int a um float em C++, isto é aceito mesmo sendo tipos diferentes pois a conversão é feita implicitamente). • Interface é um contrato entre a classe e o mundo externo. Quando uma classe implementa uma interface, ela está comprometida a fornecer o comportamento publicado pela interface.[1] • Pacotes são referências para organização lógica de classes e interfaces.[1] [1] http:/ / java. sun. com/ docs/ books/ tutorial/ java/ concepts/ Referências bibliográficas • Carlos Sica. PHP Orientado a Objetos - Fale a Linguagem da Internet. 1 ed. Rio de Janeiro: Ciência Moderna, 2006. • Pablo Dall'Oglio. PHP Programando com Orientação a Objetos (http://www.adianti.com.br/phpoo): Inclui Design Patterns. 1 ed. São Paulo: Novatec, 2007. pag. 576. ISBN 978-85-7522-137-2 Ver também • Padrões de projeto de software • Framework • Classe 51 Orientação a Objetos Ligações externas • Página oficial da UML (http://www.uml.org/) (em inglês) • cfoop.org OOP para ColdFusion (http://www.cfoop.org/) (em inglês) • Conceitos de OOP em Java (http://java.sun.com/docs/books/tutorial/java/concepts/index.html) (em inglês) (Site oficial do Java na Sun Microsystems) • Guia do Hardware: Programação Orientada a Objetos (http://www.guiadohardware.net/artigos/ programacao-orientada-objetos/) (em português) • Conceitos de OOP em C++ (http://www.cplusplus.com/doc/tutorial/) (em inglês) Rational Unified Process O RUP, abreviação de Rational Unified Process (ou Processo Unificado Racional), é um processo proprietário de Engenharia de software criado pela Rational Software Corporation, adquirida pela IBM, ganhando um novo nome IRUP que agora é uma abreviação de IBM Rational Unified Process e tornando-se uma brand na área de Software, fornecendo técnicas a serem seguidas pelos membros da equipe de desenvolvimento de software com o objetivo de aumentar a sua produtividade no processo de desenvolvimento. O RUP usa a abordagem da orientação a objetos em sua concepção e é projetado e documentado utilizando a notação UML (Unified Modeling Language) para ilustrar os processos em ação. Utiliza técnicas e práticas aprovadas comercialmente. É um processo considerado pesado e preferencialmente aplicável a grandes equipes de desenvolvimento e a grandes projetos, porém o fato de ser amplamente customizável torna possível que seja adaptado para projetos de qualquer escala. Para a gerência do projeto, o RUP provê uma solução disciplinada de como assinalar tarefas e responsabilidades dentro de uma organização de desenvolvimento de software. O RUP é, por si só, um produto de software. É modular e automatizado, e toda a sua metodologia é apoiada por diversas ferramentas de desenvolvimento integradas e vendidas pela IBM através de seus "Rational Suites". Métodos concorrentes no campo da engenharia de software incluem o "Cleanroom" (considerado pesado) e os Métodos Ágeis (leves) como a Programação Extrema (XP-Extreme Programming), Scrum, FDD e outros. Linhas mestras O RUP define as seguintes linhas-mestras e esqueletos (templates) para os membros da equipe de um ciclo de produção: parte do cliente, e uma avaliação do progresso do projeto pela sua gerência. Além disso, ajuda os programadores a manterem-se concentrados no projeto. Gestão de requisitos Uma documentação apropriada é essencial para qualquer grande projeto; note que o RUP descreve como documentar a funcionalidade, restrições de sistema, restrições de projeto e requisitos de negócio. Os casos de uso (em inglês Use Cases) e os cenários são exemplos de artefatos dependentes do processo, que têm sido considerados muito mais eficazes na captura de requisitos funcionais. 52 Rational Unified Process Uso de arquitetura baseada em componentes A arquitetura baseada em componentes cria um sistema que pode ser facilmente extensível, promovendo a reutilização de software e um entendimento intuitivo. Um componente normalmente se relaciona com um objeto na programação orientada a objetos. O RUP oferece uma forma sistemática para construir este tipo de sistema, focando-se em produzir uma arquitetura executável nas fases iniciais do projeto, ou seja, antes de comprometer recursos em larga escala. Estes componentes são normalmente incluidos em infraestruturas existentes como o CORBA e o COM (Modelo de Componentes de Objectos). Uso de software de modelos visuais Ao abstrair a programação do seu código e representá-la utilizando blocos de construção gráfica, o RUP consegue uma maneira efetiva de se ter uma visão geral de uma solução. O uso de modelos visuais também pode permitir que indivíduos de perfil menos técnico (como clientes) tenham um melhor entendimento de um dado problema, e assim se envolvam mais no projeto como um todo. A linguagem de modelagem UML tornou-se um padrão industrial para representar projetos, e é amplamente utilizada pelo RUP. Verificação da qualidade do software Não assegurar a qualidade do software é a falha mais comum em todos os projetos de sistemas computacionais. Normalmente pensa-se em qualidade de software após o término dos projetos, ou a qualidade é responsabilidade de uma equipe diferente da equipe de desenvolvimento. O RUP visa auxiliar no controle do planejamento da qualidade, verificando-a na construção de todo o processo e envolvendo todos os membros da equipe de desenvolvimento. Gestão e Controle de Mudanças do Software Em todos os projetos de software a existência de mudanças é inevitável. O RUP define métodos para controlar e monitorar mudanças. Como uma pequena mudança pode afetar aplicações de formas inteiramente imprevisíveis, o controle de mudanças é essencial para o sucesso de um projeto. O RUP também define áreas de trabalho seguras, garantindo a um programador que as mudanças efetuadas noutro sistema não afetarão o seu sistema. Fases Até agora estas linhas de guia são gerais, a serem aderidas ao percorrer do ciclo de vida de um projeto. As fases[1] indicam a ênfase que é dada no projeto em um dado instante. Para capturar a dimensão do tempo de um projeto, o RUP divide o projeto em quatro fases diferentes: 1. 2. 3. 4. Concepção: ênfase no escopo do sistema; Elaboração: ênfase na arquitetura; Construção: ênfase no desenvolvimento; Transição: ênfase na implantação. O RUP também se baseia nos 4 Ps: 1. Pessoas 2. Projeto 3. Produto 4. Processo 53 Rational Unified Process As fases são compostas de iterações. As iterações são janelas de tempo; as iterações possuem prazo definido enquanto as fases são objetivas. Todas as fases geram artefatos. Estes serão utilizados nas próximas fases e documentam o projeto, além de permitir melhor acompanhamento. Fase de concepção A fase de concepção contém os workflows [2] necessários para que as partes interessadas (stakeholders) concordem com os objetivos, arquitetura e o planejamento do projeto. Se as partes interessadas tiverem bons conhecimentos, então, pouca análise será requerida. Caso contrário, uma análise maior será requerida. Como cita o RUP, o ideal é que sejam feitas iterações. Porém estas devem ser bem definidas quanto a sua quantidade e objetivos. Fase de Elaboração A fase de elaboração será apenas para o projeto do sistema, buscando complementar o levantamento / documentação dos casos de uso, voltado para a arquitetura do sistema, revisa a modelagem do negócio para os projetos e inicia a versão do manual do usuário. Deve-se aceitar: Visão geral do produto (incremento + integração) está estável?; O plano do projeto é confiável?; Custos são admissíveis? Fase de Construção Na fase de construção, começa o desenvolvimento físico do software, produção de códigos, testes alfa e beta. Deve-se aceitar testes, e processos de testes estáveis, e se os códigos do sistema constituem "baseline". Fase de Transição Nesta fase ocorre a entrega ("deployment") do software, é realizado o plano de implantação e entrega, acompanhamento e qualidade do software. Produtos (releases, versões) devem ser entregues, e ocorrer a satisfação do cliente. Nesta fase também é realizada a capacitação dos usuários. Disciplinas Seis Disciplinas de Engenharia Disciplina de Modelagem de Negócios As organizações estão cada vez mais dependentes de sistemas de TI, tornando-se imperativo que os engenheiros de sistemas de informação saibam como as aplicações em desenvolvimento se inserem na organização. As empresas investem em TI, quando entendem a vantagem competitiva do valor acrescentado pela tecnologia. O objetivo de modelagem de negócios é, primeiramente, estabelecer uma melhor compreensão e canal de comunicação entre engenharia de negócios e engenharia de software. Compreender o negócio significa que os engenheiros de software devem compreender a estrutura e a dinâmica da empresa alvo (o cliente), os atuais problemas na organização e possíveis melhorias. Eles também devem garantir um entendimento comum da organização-alvo entre os clientes, usuários finais e desenvolvedores. Modelagem de negócios, explica como descrever uma visão da organização na qual o sistema será implantado e como usar esta visão como uma base para descrever o processo, papéis e responsabilidades. 54 Rational Unified Process Disciplina de Requisitos Esta disciplina explica como levantar pedidos das partes interessadas ("stakeholders") e transformá-los em um conjunto de requisitos que os produtos funcionam no âmbito do sistema a ser construído e fornecem requisitos detalhados para o que deve fazer o sistema. Disciplina de Análise e Projeto("Design") O objetivo da análise e projeto é mostrar como o sistema vai ser realizado. O objetivo é construir um sistema que: • Execute, em um ambiente de execução específica, as tarefas e funções especificadas nas descrições de casos de uso • Cumpra todas as suas necessidades • Seja fácil de manter quando ocorrerem mudanças de requisitos funcionais Resultados de projeto em um modelo de análise e projeto tem, opcionalmente, um modelo de análise. O modelo de design serve como uma abstração do código-fonte, isto é, o projeto atua como um modelo de "gabarito" de como o código-fonte é estruturado e escrito. O modelo de projeto consiste em classes de design estruturado em pacotes e subsistemas com interfaces bem definidas, representando o que irá se tornar componentes da aplicação. Ele também contém descrições de como os objetos dessas classes colaboram para desempenhar casos de uso do projeto. Disciplina de Implementação Os efeitos da implementação são: • • • • Para definir a organização do código, em termos de subsistemas de implementação organizadas em camadas Para implementar classes e objetos em termos de componentes (arquivos-fonte, binários, executáveis e outros) Para testar os componentes desenvolvidos como unidades Integrar os resultados produzidos por implementadores individuais (ou equipes), em um sistema executável Sistemas são realizados através da aplicação de componentes. O processo descreve como a reutilização de componentes existentes ou implementar novos componentes com responsabilidades bem definidas, tornando o sistema mais fácil de manter e aumentar as possibilidades de reutilização. Disciplina de Teste As finalidades da disciplina de teste são: • • • • • Para verificar a interação entre objetos Para verificar a integração adequada de todos os componentes do software Para verificar se todos os requisitos foram corretamente implementados Identificar e garantir que os defeitos são abordados antes da implantação do software Garantir que todos os defeitos são corrigidos, reanalisados e fechados O Rational Unified Process propõe uma abordagem iterativa, o que significa que deve-se testar todo o projeto. Isto permite encontrar defeitos tão cedo quanto possível, o que reduz radicalmente o custo de reparar o defeito. Os testes são realizados ao longo de quatro dimensões da qualidade:confiabilidade, funcionalidade, desempenho da aplicação, e o desempenho do sistema. Para cada uma destas dimensões da qualidade, o processo descreve como você passar pelo teste do ciclo de planejamento, projeto, implementação, execução e avaliação. Disciplina de Implantação O objetivo da implantação é o de produzir com sucesso lançamentos de produtos e entregar o software para seus usuários finais. Ele cobre uma vasta gama de atividades, incluindo a produção de releases externos do software, a embalagem do software e aplicativos de negócios, distribuição do software, instalação do software e prestação de ajuda e assistência aos usuários. Embora as atividades de implantação estão principalmente centradas em torno da fase de transição, muitas das atividades devem ser incluídas nas fases anteriores para se preparar para a implantação, 55 Rational Unified Process no final da fase de construção. Os processos ("workflows") de "Implantação e Ambiente" do RUP contêm menos detalhes do que outros workflows. Três Disciplinas de Apoio/Suporte Disciplina de Ambiente O ambiente enfoca as atividades necessárias para configurar o processo para um projeto. Ele descreve as atividades necessárias para desenvolver as diretrizes de apoio a um projeto. A proposta das atividades de ambiente é prover à organização de desenvolvimento de software com o ambiente de desenvolvimento de software - os processos e as ferramentas - que darão suporte à equipe de desenvolvimento. Se os usuários do RUP não entendem que o RUP é um framework de processo, eles podem percebê-lo como um processo pesado e caro. No entanto, um conceito-chave dentro do RUP foi que o processo RUP pode e, muitas vezes, deve ser refinado. Este foi inicialmente feito manualmente, ou seja, por escrito, um documento de "caso de desenvolvimento" que especificou o processo refinado para ser utilizado. Posteriormente, o produto IBM Rational Method Composer foi criado para ajudar a tornar esta etapa mais simples, engenheiros de processos e gerentes de projeto poderiam mais facilmente personalizar o RUP para suas necessidades de projeto. Muitas das variações posteriores do RUP, incluindo OpenUP/Basic, a versão open-source e leve do RUP, são agora apresentados como processos distintos, por direito próprio, e atendem a diferentes tipos e tamanhos de projetos, tendências e tecnologias de desenvolvimento de software. Historicamente, como o RUP, muitas vezes é personalizado para cada projeto por um perito do processo RUP, o sucesso total do projeto pode ser um pouco dependente da capacidade desta pessoa. Disciplina de Configuração e Gerência de Mudança A disciplina de Gestão de Mudança em negócios com RUP abrange três gerenciamentos específicos: de configuração, de solicitações de mudança, e de status e medição. • Gerenciamento de configuração: A gestão de configuração é responsável pela estruturação sistemática dos produtos. Artefatos, como documentos e modelos, precisam estar sob controle de versão e essas alterações devem ser visíveis. Ele também mantém o controle de dependências entre artefatos para que todos os artigos relacionados sejam atualizados quando são feitas alterações • Gerenciamento de solicitações de mudança: Durante o processo de desenvolvimento de sistemas com muitos artefatos existem diversas versões. O CRM mantém o controle das propostas de mudança • Gerenciamento de status e medição: Os pedidos de mudança têm os estados: novo, conectado, aprovado, cedido e completo. A solicitação de mudança também tem atributos como a causa raiz, ou a natureza (como o defeito e valorização), prioridade, etc. Esses estados e atributos são armazenados no banco de dados para produzir relatórios úteis sobre o andamento do projeto. A Rational também tem um produto para manter a solicitações de mudança chamado ClearQuest. Esta atividade têm procedimentos a serem seguidos Disciplina de Gerência de Projeto O planejamento de projeto no RUP ocorre em dois níveis. Há uma baixa granularidade ou planos de Fase que descreve todo o projeto, e uma série de alta granularidade ou planos de Iteração que descrevem os passos iterativos. Esta disciplina concentra-se principalmente sobre os aspectos importantes de um processo de desenvolvimento iterativo: Gestão de riscos; Planejamento um projeto iterativo através do ciclo de vida e para uma iteração particular; E o processo de acompanhamento de um projeto iterativo, métricas. No entanto, esta disciplina do RUP não tenta cobrir todos os aspectos do gerenciamento de projetos. Por exemplo, não abrange questões como: • Gestão de Pessoas: contratação, treinamento, etc • Orçamento Geral: definição, alocação, etc • Gestão de Contratos: com fornecedores, clientes, etc 56 Rational Unified Process Princípios e melhores práticas RUP é baseado em um conjunto de princípios de desenvolvimento de software [3] e melhores práticas, por exemplo: 1. 2. 3. 4. 5. 6. Desenvolvimento de software iterativo Gerenciamento de requisitos Uso de arquitetura baseada em componente Modelagem visual de software Verificação da qualidade do software Controle de alteração no software Desenvolvimento iterativo Dado o tempo gasto para desenvolver um software grande e sofisticado, não é possível definir o problema e construir o software em um único passo. Os requerimentos irão freqüentemente mudar no decorrer do desenvolvimento do projeto, devido a restrições de arquitetura, necessidades do usuário ou a uma maior compreensão do problema original. Alterações permitem ao projeto ser constantemente refinado, além de assinalarem itens de alto risco do projeto como as tarefas de maior prioridade. De forma ideal, ao término de cada iteração haverá uma versão executável, o que ajuda a reduzir o risco de configuração do projeto, permitindo maior retorno do usuário e ajudando ao desenvolvedor manter-se focado. O RUP usa desenvolvimento iterativo e incremental pelas seguintes razões: • A integração é feita passo a passo durante o processo de desenvolvimento, limitando-se cada passo a poucos elementos • A integração é menos complexa, reduzindo seu custo e aumentado sua eficiência • Partes separadas de projeto e/ou implementação podem ser facilmente identificadas para posterior reuso • Mudanças de requisitos são registradas e podem ser acomodadas • Os riscos são abordados no inicio do desenvolvimento e cada iteração permite a verificação de riscos já percebidos bem como a identificação de novos • Arquitetura de software é melhorada através de um escrutino repetitivo Usando iterações, um projeto terá um plano geral, como também múltiplos planos de iteração. O envolvimento dos stakeholders é freqüentemente encorajado a cada entrega. Desta maneira, as entregas servem como uma forma de se obter o comprometimento dos envolvidos, promovendo também uma constante comparação entre os requisitos e o desenvolvimento da organização para as pendências que surgem. Gerenciamento de requisitos O Gerenciamento de requisitos no RUP está concentrado em encontrar as necessidades do usuário final pela identificação e especificação do que ele necessita e identificando aquilo que deve ser mudado. Isto traz como benefícios: • A correção dos requisitos gera a correção do produto, desta forma as necessidadades dos usuários são encontradas. • As características necessárias serão incluídas, reduzindo o custo de desenvolvimentos posteriores. RUP sugere que o gerenciamento de requisitos tem que seguir as atividades: • Análise do problema é concordar com o problema e criar medições que irão provar seu valor para a organização • Entender as necessidades de seus stakeholders é compartilhar o problema e valores com os stakeholders-chave e levantar quais as necessidades que estão envolvidas na elaboração da ideia • Definir o problema é a definição das características das necessidades e esquematização dos casos de uso, atividades que irão facilmente mostrar os requerimentos de alto-nível e esboçar o modelo de uso do sistema 57 Rational Unified Process • Gerenciar o escopo do sistema trata das modificações de escopo que serão comunicadas baseadas nos resultados do andamento e selecionadas na ordem na qual os fluxogramas de casos de uso são atacados • Refinar as definições do sistema trata do detalhamento dos fluxogramas de caso de uso com os stakeholders de forma a criar uma especificação de requerimentos de software que pode servir como um contrato entre o seu grupo e o do cliente e poderá guiar as atividades de teste e projeto • Gerenciamento das mudanças de requisitos trata de como identificar as chegadas das mudanças de requerimento num projeto que já começou Uso de arquitetura baseada em componentes Arquitetura baseada em componentes cria um sistema que é facilmente extensível, intuitivo e de fácil compreensão e promove a reusabilidade de software. Um componente freqüentemente se relaciona com um conjunto de objetos na programação orientada ao objeto. Arquitetura de software aumenta de importância quando um sistema se torna maior e mais complexo. RUP foca na produção da arquitetura básica nas primeiras iterações. Esta arquitetura então se torna um protótipo nos ciclos iniciais de desenvolvimento. A arquitetura desenvolve-se em cada iteração para se tornar a arquitetura final do sistema. RUP também propõe regras de projeto e restrições para capturar regras de arquitetura. Pelo desenvolvimento iterativo é possível identificar gradualmente componentes os quais podem então ser desenvolvidos, comprados ou reusados. Estes componentes são freqüentemente construídos em infra-estruturas existentes tais como CORBA e COM, ou JavaEE, ou PHP Modelagem visual de software Abstraindo sua programação do seu código e representando-a usando blocos de construção gráfica constitui-se de uma forma efetiva de obter uma visão geral de uma solução. Usando esta representação, recursos técnicos podem determinar a melhor forma para implementar a dado conjunto de interdependências lógicas. Isto também constrói uma camada intermediária entre o processo de negócio e o código necessário através da tecnologia da informação. Um modelo neste contexto é uma visualização e ao mesmo tempo uma simplificação de um projeto complexo. RUP especifica quais modelos são necessários e porque. A Linguagem modelagem unificada (UML) pode ser usada para modelagem de Casos de Uso, diagrama de classes e outros objetos. RUP também discute outras formas para construir estes modelos. Verificar qualidade de software Garantia da qualidade de software é o ponto mais comum de falha nos projetos de software, desde que isto é freqüentemente algo que não se pensa previamente e é algumas vezes tratado por equipes diferentes. O RUP ajuda no planejamento do controle da qualidade e cuida da sua construção em todo processo, envolvendo todos os membros da equipe. Nenhuma tarefa é especificamente direcionada para a qualidade; o RUP assume que cada membro da equipe é responsável pela qualidade durante todo o processo. O processo foca na descoberta do nível de qualidade esperado e provê testes nos processos para medir este nível. 58 Rational Unified Process Controle de alterações no software Em todos os projetos de software, mudanças são inevitáveis. RUP define métodos para controlar, rastrear e monitorar estas mudanças. RUP também define espaços de trabalho seguros (do inglês secure workspaces), garantindo que um sistema de engenharia de software não será afetado por mudanças em outros sistemas. Este conceito é bem aderente com arquiteturas de software baseados em componentização. Ver também • Rational Rose • Enterprise Unified Process Ligações externas • • • • • Treinamento de RUP [4] Material completo [5] Página de IBM software Rational [6] Excelente descrição sobre o RUP (pdf) [7] Obtendo Qualidade de Software com o RUP [8] Referências [1] [2] [3] [4] [5] [6] [7] [8] http:/ / www. synstec. com. br/ synsweb/ components/ images/ imgRup. gif http:/ / pt. wikipedia. org/ wiki/ Fluxo_de_trabalho http:/ / www-128. ibm. com/ developerworks/ rational/ library/ oct05/ kroll/ http:/ / www. ibm. com/ br/ shop/ trainings/ http:/ / www. wthreex. com/ rup/ http:/ / www. ibm. com/ software/ br/ rational/ ftp:/ / public. dhe. ibm. com/ / software/ pdf/ br/ RUP_DS. pdf http:/ / www. javafree. org/ content/ view. jf?idContent=7 59 Scrum 60 Scrum O Scrum é um processo de desenvolvimento iterativo e incremental para gerenciamento de projetos e desenvolvimento ágil de software. Apesar de a palavra não ser um acrônimo, algumas empresas que implementam o processo a soletram com letras maiúsculas como SCRUM. Isto pode ser devido aos primeiros artigos de Ken Schwaber, que capitalizava SCRUM no título. O processo Scrum. Apesar de Scrum ter sido destinado para gerenciamento de projetos de software, ele pode ser utilizado em equipes de manutenção de software ou como uma abordagem geral de gerenciamento de projetos/programas. História Inicialmente, o Scrum foi concebido como um estilo de gerenciamento de projetos em empresas de fabricação de automóveis e produtos de consumo, por Takeuchi e Nonaka no artigo "The New Product Development Game" (Harvard Business Review, Janeiro-Fevereiro 1986). Eles notaram que projetos usando equipes pequenas e multidisciplinares (cross-functional) produziram os melhores resultados, e associaram estas equipes altamente eficazes à formação Scrum do Rugby (utilizada para reinício do jogo em certos casos). Jeff Sutherland, John Scumniotales e Jeff McKenna conceberam, documentaram e implementaram o Scrum, conforme descrito abaixo, na empresa Easel Corporation em 1993, incorporando os estilos de gerenciamento observados por Takeuchi e Nonaka. Em 1995, Ken Schwaber formalizou a definição de Scrum e ajudou a implantá-lo no desenvolvimento de softwares em todo o mundo. Scrum junta conceitos de Lean, desenvolvimento iterativo e do estudo de Hirotaka Takeuchi e Ikujiro Nonaka. A função primária do Scrum é ser utilizado para o gerenciamento de projetos de desenvolvimento de software. Ele tem sido usado com sucesso para isso, assim como Extreme Programming e outras metodologias de desenvolvimento. Porém, teoricamente pode ser aplicado em qualquer contexto no qual um grupo de pessoas necessitem trabalhar juntas para atingir um objetivo comum, como iniciar uma escola pequena, projetos de pesquisa científica, ou até mesmo o planejamento de um casamento. Mesmo que idealizado para ser utilizado em gestão de projetos de desenvolvimento de software ele também pode ser usado para a gerência de equipes de manutenção, ou como uma abordagem para gestão de programas: Scrum de Scrums. Scrum Características Scrum é um esqueleto de processo que contém grupos de práticas e papéis pré-definidos. Os principais papéis são: 1. o ScrumMaster, que mantém os processos (normalmente no lugar de um gerente de projeto) 2. o Proprietário do Produto, ou Product Owner, que representa os stakeholders e o negócio 3. a Equipe, ou Team, um grupo multifuncional com cerca de 7 pessoas e que fazem a análise, projeto, implementação, teste e etc. • Cada sprint é uma iteração que segue um ciclo (PDCA) e entrega incremento de software pronto. • Um backlog é conjunto de requisitos, priorizado pelo Product Owner (responsável pelo ROI e por conhecer as necessidades do cliente); • Há entrega de conjunto fixo de itens do backlog em série de interações curtas ou sprints; • Breve reunião diária, ou daily scrum, em que cada participante fala sobre o progresso conseguido, o trabalho a ser realizado e/ou o que o impede de seguir avançando (também chamado de Standup Meeting ou Daily Meeting, já que os membros da equipe geralmente ficam em pé para não prolongar a reunião). • Breve sessão de planejamento, na qual os itens do backlog para uma sprint (iteração) são definidos; • Retrospectiva, na qual todos os membros da equipe refletem sobre a sprint passada. O Scrum é facilitado por um Scrum Master, que tem como função primária remover qualquer impedimento à habilidade de uma equipe de entregar o objetivo do sprint. O Scrum Master não é o líder da equipe (já que as equipes são auto-organizadas), mas atua como um mediador entre a equipe e qualquer influência desestabilizadora. Outra função extremamente importante de um Scrum Master é o de assegurar que a equipe esteja utilizando corretamente as práticas de Scrum, motivando-os e mantendo o foco na meta da Sprint. Scrum permite a criação de equipes auto-organizadas, encorajando a comunicação verbal entre todos os membros da equipe e entre todas as disciplinas que estão envolvidas no projeto. Um princípio chave do Scrum é o reconhecimento de que desafios fundamentalmente empíricos não podem ser resolvidos com sucesso utilizando uma abordagem tradicional de "controle". Assim, o Scrum adota uma abordagem empírica, aceitando que o problema não pode ser totalmente entendido ou definido, focando na maximização da habilidade da equipe de responder de forma ágil aos desafios emergentes. Uma das grandes vantagens do Scrum, porém, é que não tem abordagem "receita de bolo" do gerenciamento de projetos exemplificado no Project Management Body of Knowledge ou PRINCE2, que tem como objetivos atingir qualidade através da aplicação de uma série de processos prescritos. Product backlog e Sprint backlog Um backlog é uma lista de itens priorizados a serem desenvolvidos para um software. O Product backlog é mantido pelo Product Owner e é uma lista de requisitos que tipicamente vêm do cliente. O Product Owner pode altera-lo a a qualquer momento, desde que os itens alterados não estejam na sprint. O Sprint backlog é uma interpretação do Product backlog e contém tarefas concretas que serão realizadas durante o próximo sprint para implementar alguns dos itens principais no Product backlog. O Product backlog e o sprint backlog são, então, duas coisas totalmente diferentes, o primeiro contendo requisitos de alto-nível e o segundo contendo informações sobre como a equipe irá implementar os requisitos do produto. Planejamento de sprint Antes de todo sprint, o Product Owner, o Scrum Master e a Equipe decidem no que a equipe irá trabalhar durante o próximo sprint. O Product Owner mantém uma lista priorizada de itens de backlog, o backlog do produto, o que pode ser repriorizado durante o planejamento do sprint. A Equipe seleciona itens do topo do backlog do produto. Eles selecionam somente o quanto de trabalho eles podem executar para terminar. A Equipe então planeja a arquitetura e o design de como o backlog do produto pode ser implementado. Os itens do backlog do produto são 61 Scrum 62 então destrinchados em tarefas que se tornam o backlog do sprint. Scrum simplificado Muitas organizações têm sido resistentes às metodologias introduzidas em baixos níveis da organização. Porém, a adaptabilidade do Scrum permite que ele seja introduzido de forma invisível ("stealth"), usando os três passos: • Agende uma demonstração do software com seu cliente em um mês a partir de agora; • Como equipe, tome um mês para deixar o software pronto para uma demo, com funcionalidades prontas, não simplesmente telas; • Na demonstração, obtenha feedback e use-o para guiar o seu próximo mês de trabalho de desenvolvimento. Algumas características de Scrum • Clientes se tornam parte da equipe de desenvolvimento (os clientes devem estar genuinamente interessados na saída); • Entregas frequentes e intermediárias de funcionalidades 100% desenvolvidas; • Planos frequentes de mitigação de riscos desenvolvidos pela equipe; • Discussões diárias de status com a equipe; • A discussão diária na qual cada membro da equipe responde às seguintes perguntas: • • • • • O que fiz desde ontem? • O que estou planejando fazer até amanhã? • Existe algo me impedindo de atingir minha meta? Transparência no planejamento e desenvolvimento; Reuniões frequentes com os stakeholders (todos os envolvidos no processo) para monitorizar o progresso; Problemas não são ignorados e ninguém é penalizado por reconhecer ou descrever qualquer problema não visto; Locais e horas de trabalho devem ser energizadas, no sentido de que "trabalhar horas extras" não necessariamente significa "produzir mais". Agendando discussões diárias Um momento bom para as discussões diárias é depois do almoço. Durante a manhã pode ser complicado. Estas discussões de status não demoram e uma forma eficiente de fazer estas reuniões seria ficar em pé e em frente a um quadro negro. Como as pessoas tendem a ficar cansadas depois do almoço, ter uma viva reunião em pé nessa hora permite que a equipe mantenha a sua energia alta. Como todos estiveram trabalhando durante a manhã, suas mentes estão focadas no trabalho e não em questões pessoais. Scrum Solo Scrum é baseado em pequenas equipes. Ele permite a comunicação entre os membros da equipe. Entretanto, há uma grande quantidade de softwares desenvolvidos por programadores solos. Um software sendo desenvolvido por um só programador pode ainda se beneficiar de alguns princípios do Scrum, como: um backlog de produto, um backlog de sprint, um sprint e uma retrospectiva de sprint. Scrum Solo é uma versão adaptada para uso de programadores solo. Ver também • Ken Schwaber • John Scumniotales • Jeff Sutherland Scrum Livros • Agile Project Management with Scrum, Ken Schwaber, Microsoft Press, January 2004, 163pp, ISBN 0-7356-1993-X Ligações externas Comunidade Scrum em Portugal [1] Cursos de Scrum em Portugal [2] (Certified Scrum Master; Certified Product Owner; etc) Scrum para Designers [3] Vários quadros kanban para ser utilizado no scrum preferencialmente para Design e UX. Agile Software Development with Scrum [4] by Ken Schwaber Pagina sobre Scrum da Mountain Goat [5] Uma boa definição de Scrum Adaptive Project Management Using Scrum [6] por Craig Murphy. Este artigo provê uma overview sobre Scrum. The New New Product Development Game [7] por Takeuchi and Nonaka. O artigo que iniciou tudo. Scrum Delivers or Scrum and the Toyota Way [8] por Boris Gloger. Este artigo mapeia os princípios de Toyota explicados por Liker, com as praticas de Scrum. • Scrum and XP from the Trenches [9] por Henrik Kniberg. Um livro de 90 paginas descrevendo em detalhe como Scrum e XP podem ser implementados a partir de uma perspectiva pratica. • • • • • • • • • Uma série de textos de Cesar Brod sobre Scrum [10] Incluindo uma introdução, ferramentas, o uso do Scrum no planejamento estratégico e User Stories Referências [1] http:/ / www. scrumpt. com [2] http:/ / scrumpt. com/ content/ training. aspx/ [3] http:/ / www. dubaralho. com. br/ 2009/ 10/ 28/ kanban-para-design-grafico-e-user-experience-ux-usando-scrum/ [4] http:/ / bookshelved. org/ cgi-bin/ wiki. pl?AgileSoftwareDevelopmentWithScrum [5] http:/ / www. mountaingoatsoftware. com/ scrum/ [6] http:/ / www. methodsandtools. com/ archive/ archive. php?id=18 [7] http:/ / harvardbusinessonline. hbsp. harvard. edu/ b02/ en/ common/ item_detail. jhtml?id=86116 [8] http:/ / www. glogerconsulting. de/ downloads/ Gloger_TototaScrum-170706. pdf [9] http:/ / www. crisp. se/ henrik. kniberg/ ScrumAndXpFromTheTrenches. pdf [10] http:/ / www. brod. com. br/ ?q=search/ node/ Scrum 63 Programação extrema Programação extrema Programação extrema (do inglês eXtreme Programming), ou simplesmente XP, é uma metodologia ágil para equipes pequenas e médias e que irão desenvolver software com requisitos vagos e em constante mudança. Para isso, adota a estratégia de constante acompanhamento e realização de vários pequenos ajustes durante o desenvolvimento de software. Os quatro valores fundamentais da metodologia XP são: comunicação, simplicidade, feedback e coragem. A partir desses valores, possui como princípios básicos: feedback rápido, presumir simplicidade, mudanças incrementais, abraçar mudanças e trabalho de qualidade. Dentre as variáveis de controle em projetos (custo, tempo, qualidade e escopo), há um foco explícito em escopo. Para isso, recomenda-se a priorização de funcionalidades que representem maior valor possível para o negócio. Desta forma, caso seja necessário a diminuição de escopo, as funcionalidades menos valiosas serão adiadas ou canceladas. A XP incentiva o controle da qualidade como variável do projeto, pois o pequeno ganho de curto prazo na produtividade, ao diminuir qualidade, não é compensado por perdas (ou até impedimentos) a médio e longo prazo. Valores • • • • • Comunicação Simplicidade Feedback Coragem Respeito Princípios Básicos • • • • • Feedback rápido Presumir simplicidade Mudanças incrementais Abraçar mudanças Trabalho de alta qualidade. Práticas Para aplicar os valores e princípios durante o desenvolvimento de software, XP propõe uma série de práticas. Há uma confiança muito grande na sinergia entre elas, os pontos fracos de cada uma são superados pelos pontos fortes de outras. • Jogo de Planejamento (Planning Game): O desenvolvimento é feito em iterações semanais. No início da semana, desenvolvedores e cliente reúnem-se para priorizar as funcionalidades. Essa reunião recebe o nome de Jogo do Planejamento. Nela, o cliente identifica prioridades e os desenvolvedores as estimam. O cliente é essencial neste processo e assim ele fica sabendo o que está acontecendo e o que vai acontecer no projeto. Como o escopo é reavaliado semanalmente, o projeto é regido por um contrato de escopo negociável, que difere significativamente das formas tradicionais de contratação de projetos de software. Ao final de cada semana, o cliente recebe novas funcionalidades, completamente testadas e prontas para serem postas em produção. • Pequenas Versões (Small Releases): A liberação de pequenas versões funcionais do projeto auxilia muito no processo de aceitação por parte do cliente, que já pode testar uma parte do sistema que está comprando. As versões chegam a ser ainda menores que as produzidas por outras metodologias incrementais, como o RUP. 64 Programação extrema • Metáfora (Metaphor): Procura facilitar a comunicação com o cliente, entendendo a realidade dele. O conceito de rápido para um cliente de um sistema jurídico é diferente para um programador experiente em controlar comunicação em sistemas em tempo real, como controle de tráfego aéreo. É preciso traduzir as palavras do cliente para o significado que ele espera dentro do projeto. • Projeto Simples (Simple Design): Simplicidade é um princípio da XP. Projeto simples significa dizer que caso o cliente tenha pedido que na primeira versão apenas o usuário "teste" possa entrar no sistema com a senha "123" e assim ter acesso a todo o sistema, você vai fazer o código exato para que esta funcionalidade seja implementada, sem se preocupar com sistemas de autenticação e restrições de acesso. Um erro comum ao adotar essa prática é a confusão por parte dos programadores de código simples e código fácil. Nem sempre o código mais fácil de ser desenvolvido levará a solução mais simples por parte de projeto. Esse entendimento é fundamental para o bom andamento do XP. Código fácil deve ser identificado e substituído por código simples. • Time Coeso (Whole Team): A equipe de desenvolvimento é formada pelo cliente e pela equipe de desenvolvimento. • Testes de Aceitação (Customer Tests): São testes construídos pelo cliente e conjunto de analistas e testadores, para aceitar um determinado requisito do sistema. • Ritmo Sustentável (Sustainable Pace): Trabalhar com qualidade, buscando ter ritmo de trabalho saudável (40 horas/semana, 8 horas/dia), sem horas extras. Horas extras são permitidas quando trouxerem produtividade para a execução do projeto. Outra prática que se verifica neste processo é a prática de trabalho energizado, onde se busca trabalho motivado sempre. Para isto o ambiente de trabalho e a motivação da equipe devem estar sempre em harmonia. • Reuniões em pé (Stand-up Meeting): Reuniões em pé para não se perder o foco nos assuntos, produzindo reuniões rápidas, apenas abordando tarefas realizadas e tarefas a realizar pela equipe. • Posse Coletiva (Collective Ownership): O código fonte não tem dono e ninguém precisa solicitar permissão para poder modificar o mesmo. O objetivo com isto é fazer a equipe conhecer todas as partes do sistema. • Programação em Pares (Pair Programming): é a programação em par/dupla num único computador. Geralmente a dupla é formada por um iniciante na linguagem e outra pessoa funcionando como um instrutor. Como é apenas um computador, o novato é que fica à frente fazendo a codificação, e o instrutor acompanha ajudando a desenvolver suas habilidades. Desta forma o programa sempre é revisto por duas pessoas, evitando e diminuindo assim a possibilidade de defeitos. Com isto busca-se sempre a evolução da equipe, melhorando a qualidade do código fonte gerado. • Padrões de Codificação (Coding Standards): A equipe de desenvolvimento precisa estabelecer regras para programar e todos devem seguir estas regras. Desta forma parecerá que todo o código fonte foi editado pela mesma pessoa, mesmo quando a equipe possui 10 ou 100 membros. • Desenvolvimento Orientado a Testes (Test Driven Development): Primeiro crie os testes unitários (unit tests) e depois crie o código para que os testes funcionem. Esta abordagem é complexa no início, pois vai contra o processo de desenvolvimento de muitos anos. Só que os testes unitários são essenciais para que a qualidade do projeto seja mantida. • Refatoração (Refactoring): É um processo que permite a melhoria continua da programação, com o mínimo de introdução de erros e mantendo a compatibilidade com o código já existente. Refabricar melhora a clareza (leitura) do código, divide-o em módulos mais coesos e de maior reaproveitamento, evitando a duplicação de código-fonte; • Integração Contínua (Continuous Integration): Sempre que produzir uma nova funcionalidade, nunca esperar uma semana para integrar à versão atual do sistema. Isto só aumenta a possibilidade de conflitos e a possibilidade de erros no código fonte. Integrar de forma contínua permite saber o status real da programação. 65 Programação extrema Livros • • • • • Extreme Programming Explained: Embrace Change (2nd Edition) (ISBN 0321278658) Planning Extreme Programming (ISBN 0201710919) Extreme Programming Installed (ISBN 0201708426) Agile Software Development, Principles, Patterns, and Practices (ISBN 0135974445) Extreme Programming: Aprenda como encantar seus usuários desenvolvendo software com agilidade e alta qualidade [1] (ISBN 8575220470) Ligações externas • • • • • • • Apresentando XP. Encante seus clientes com Extreme Programming [2] Entregue seu código com confiança utilizando desenvolvimento dirigido a testes [3] Extreme Programming: A gentle introduction [4] (em inglês) Grupo de Usuários de Metodologias Ágeis [5] (Rio Grande do Sul) Introdução ao Extreme Programming [6] XPRio - eXtreme Programming [7] (Rio de Janeiro) Curso de Programação eXtrema no IME/USP [8] • Agilcast [9] - podcast Referências [1] [2] [3] [4] [5] [6] [7] [8] [9] http:/ / www. improveit. com. br/ xp/ livroxp http:/ / www. javafree. org/ content/ view. jf?idContent=5 http:/ / www. javafree. org/ content/ view. jf?idContent=16 http:/ / www. extremeprogramming. org http:/ / xp-rs. blogspot. com http:/ / www. improveit. com. br/ xp http:/ / xprio. blogspot. com http:/ / www. ime. usp. br/ ~xp http:/ / www. agilcoop. org. br/ agilcast 66 Microsoft Solution Framework Microsoft Solution Framework A MSF foi criado em 1994, e originou-se da análise de times de projetos e grupo de produtos, estas análises eram constatadas com a indústria de práticas e métodos. Estes resultados combinados eram consolidados em melhores praticas entre pessoas e processos. O MSF (Microsoft Solutions Framework) tem sido usado pela Microsoft como o seu “método” para desenvolvimento de soluções de software dentro da Microsoft e também para os milhares de clientes e parceiros da Microsoft em todo o mundo. A disseminação deste método, agora na versão 4.0 no Visual Studio 2005, normalmente induz as pessoas a compará-lo com outros “métodos” da indústria, como o RUP, CMMI ou XP, entre outros. É importante entender, entretanto, o que são estes elementos antes de compará-los. O MSF para Desenvolvimento Ágil de Software é um guia de procedimentos, uma coleção de boas práticas para projetos de desenvolvimento de softwares. Um projeto MSF é regido por ciclos ou iterações. A cada ciclo, cada componente da equipe executa suas funções e atualiza o resultado do seu trabalho conforme a necessidade. Os ciclos se repetem até que o projeto seja concluído ou cada versão seja lançada. Cada componente da equipe será responsável por um ou mais papéis, dependendo do tamanho ou da complexidade do projeto. A Microsoft não classifica o MSF como uma metodologia, mas sim como uma disciplina. O que isso quer dizer? Basicamente que o MSF serve como um grande guia e uma coleção de boas práticas. Porém, o MSF não se aprofunda em detalhes. Por exemplo, em um dado momento do projeto, o MSF diz que você terá que fazer uma especificação funcional. Entretanto, ele não define se você deve usar UML, análise essencial ou outras técnicas. Isso fica a seu critério. A falta de detalhes do MSF pode parecer uma deficiência a princípio, mas essa característica permitiu uma abordagem simples e direta das técnicas apresentadas. Ou seja, o MSF permite uma fácil compreensão tanto por parte da equipe como do cliente, além de ser bastante flexível em sua aplicação. PRINCÍPIOS DA MSF Foco no negócio: Entender porque o projeto existe da perspectiva do negócio e como este valor é medido. Comunicação: MSF aconselha a comunicação aberta em toda a equipe, clientes e outros componentes do time. Visão de projeto compartilhado: O processo de compartilhamento de visão de projeto é especificado no início do projeto. Na criação desta visão o time se comunica no intuito de identificar e resolver conflitos e resolver visões enganosas. Isto permite definir a direção do projeto. Esclarecer as responsabilidades compartilhadas: Todo o time compartilha várias responsabilidades para ensinar ao time e seu relacionamento aos respectivos stakeholders. Mais poderes aos membros do time: Baseado em time de pares MSF dá poderes aos membros do time por ter que atingir as metas e entregas, aceitando o fato de terem as responsabilidades compartilhadas por tomar decisões, direções quando necessário. Agilidade: As iterações do ciclo de vida do modelo de processo habilitam ajustes de cursos para a entrega do projeto em cada 67 Microsoft Solution Framework milestone. Investimento em qualidade: MSF tem por premissa que todo o time é responsável por balancear os custos, e funcionalidades para preservar a solução em qualidade e assegurar a qualidade. Membros do time precisam construir qualidade em todas as fases até o sucesso da solução, e por sua vez a organização deve investir em seu time em educação, treinamento, e experiência. Aprender com todas as experiências: Nos últimos 20 anos houve um crescimento colossal no que diz respeito à taxa de sucesso de projetos. Dados que a maior causa de falha são praticamente os mesmos, as organizações de TI não aprendem com as suas falhas de projeto. O MSF engloba o conceito de contínuo crescimento baseado em aprendizado individual e de time. GERENCIAMENTO DE PREPARAÇÃO No início de um projeto da solução, antes da fase de visão/escopo, a organização precisa ter um claro entendimento destes aspectos: Seu cenário e requisitos de segurança específicos: para atender às necessidades das organizações que iniciam implementações de soluções de segurança, o Microsoft Solutions for Security (MSS) criou o SRMG. O SRMG é um processo detalhado usado para determinar quais ameaças e vulnerabilidades têm o maior impacto potencial em uma determinada organização. Como cada empresa tem requisitos comerciais diferentes, é impossível criar uma lista de vulnerabilidades que tenham o mesmo impacto em todos os ambientes. Por isso, o SRMG permite que uma organização aumente de forma incremental sua segurança e identifique áreas potenciais que precisam de correção no futuro. Suas competências internas: o objetivo desta solução é ser facilmente entendida e imediatamente implementada por um Microsoft Certified Systems Engineer (MCSE) com boa experiência e pelo menos uma familiaridade básica com os materiais do Microsoft Official Curriculum (MOC). MODELOS MSF: TIME E PROCESSOS Modelo de Time (Team Model) habilita a escalabilidade do projeto, identifica quem vai trabalhar durante o projeto e linca cada time com um responsável Modelo de Processo (Process Model) provê a alta qualidade através do ciclo de vida do projeto (Disciplina de Gerência de Riscos; Disciplina de Gerência de Projetos). O process model trabalha em conjunto com o Team Model organizando o processo em fases distintas criação, teste, publicação. MSF VERSÂO 4.0 A Microsoft Solution Framework versão 4.0 é uma combinação de um metamodelo, que pode ser usado como base para processos de engenharia de software prescritivo, e dois personalizável e escalável processos de engenharia de software. Os MSF metamodelo consiste de princípios fundamentais, uma equipa modelo e ciclos e iterações. MSF 4.0 fornece uma ferramenta de alto nível quadro de orientações e princípios que podem ser mapeados para uma variedade de modelos prescritivos processo. O programa está estruturado em duas metodologias descritivas e prescritivas. A componente descritiva é chamado a MSF 4,0 metamodelo, que é uma descrição teórica do SDLC melhores práticas para a criação de metodologias SDLC. Microsoft é da opinião de que as organizações têm diferentes dinâmicas e contrariando as suas prioridades durante o desenvolvimento de software; algumas organizações necessitam de uma sensível e softwares adaptáveis ambiente de desenvolvimento, enquanto outros 68 Microsoft Solution Framework precisam de uma padronizado, repetitivo e mais ambiente controlado. Para atender estas necessidades, a Microsoft representa o metamodelo de 4,0 MSF em dois modelos que prevêem prescritivo metodologia específica processo de orientação, chamado Microsoft Solutions Framework para Agile Software Development (MSF4ASD) e Microsoft Solutions Framework para Capability Maturity Model Integration Melhoria de Processos (MSF4CMMI). Note-se que estes processos de engenharia de software podem ser modificados e personalizados de acordo com as preferências da organização, clientes e equipe do projeto. A filosofia MSF afirma que não existe uma única estrutura ou processo que se aplica optimamente os requisitos e ambientes para todos os tipos de projetos. MSF, portanto, suporta múltiplas abordagens processo, para que possa ser adaptado para apoiar qualquer projecto, independentemente da sua dimensão ou complexidade. Esta flexibilidade significa que ele pode oferecer suporte a uma ampla variação no grau de execução dos processos de engenharia de software, mantendo porém a um conjunto de princípios fundamentais e mentalidades. A Microsoft Solutions Framework Process Model consiste em séries curtas de ciclos de desenvolvimento e iterações. Este modelo abraça iterativo rápido desenvolvimento com a aprendizagem contínua e refinamento, devido ao progressivo conhecimento da empresa e do projeto de todos os agentes envolvidos. Identificar necessidades, desenvolvimento de produtos, e os ensaios ocorrem nas sobreposições iterações, resultando em acréscimo conclusão de assegurar um fluxo de valor do projecto. Cada iteração tem um foco diferente eo resultado é uma porção estável do sistema global. Seguem-se os oito princípios fundamentais, que constituem a espinha dorsal para os outros modelos e disciplinas do MSF: 1. comunicação aberta 2. Trabalhar em prol de uma visão compartilhada 3. Capacitar os membros da equipa 4. Estabelecer uma responsabilidade clara e partilhada 5. Concentre-se em negócio prestação valor 6. Fique ágil, esperam mudanças 7. Invista na qualidade 8. Aprenda com todas as experiências MSF Models MSF consiste de dois modelos: 1. MSF equipe modelo. Este artigo descreve o papel dos vários membros da equipe de projeto de desenvolvimento de software. Os membros dessa equipe seria: • Gerente de Produto: Principalmente lida com clientes e definir requisitos projecto, garante ainda a cliente as expectativas são cumpridas. • Gestão de Programas: Mantém projeto desenvolvimento e entrega ao cliente Arquitectura: Responsável pela concepção solução, garantindo a solução óptima concepção satisfaz todas as necessidades e expectativas • • • • Desenvolvimento: Desenvolve de acordo com as especificações. Teste: Ensaios e garante a qualidade dos produtos Lançamento / Operações: Garante a implantação eo bom funcionamento do software Experiência do Usuário: Apoia questões dos usuários. Uma pessoa pode ser atribuído a desempenhar múltiplos papéis. MSF também tem sugestão sobre como combinar a responsabilidades, como o dono da obra não deve ser atribuída a qualquer outro papel. 2. MSF modelo de governação. Esta descreve as diferentes fases da transformação de um projeto. O Modelo de Governança MSF tem cinco faixas sobreposição de actividade (ver abaixo), cada um com uma meta de qualidade 69 Microsoft Solution Framework definidos. Essas faixas de atividade definir o que precisa ser cumprida e deixar como eles se realizem para a equipa seleccionada metodologia. Por exemplo, as faixas podem ser pequenos e realizada no âmbito rapidamente para ser coerente com uma metodologia Agile, ou pode ser serializada e alongada para ser coerente com uma metodologia Cachoeira. • • • • • Envision - pense sobre o que deve ser realizado e identificar constrangimentos Plano - planejar e projetar uma solução para atender as necessidades e expectativas dentro dessas limitações Build - construir a solução Estabilizar - validar a solução que vá ao encontro das necessidades e expectativas Implantar - implantar a solução MSF Project Management Process • • • • • • • Integrar planejamento e condução mudança de controlo Definir e gerenciar o escopo do projeto Preparar um orçamento e gerenciar os custos Preparar e acompanhar os horários Garantir que os recursos são atribuídos à direita do projecto Gerir contratos e vendedores projeto e adquirir recursos Facilitar a equipe e comunicações externas • Facilitar o processo de gestão do risco • Documento e monitorar a qualidade da equipe do processo de gestão MSF para Agile Software Development metodologia O MSF para Agile Software Development (MSF4ASD) se destina a ser um peso leve, processo iterativo e adaptável. O MSF4ASD usa os princípios do desenvolvimento ágil abordagem formulada pela Agile Alliance. O MSF4ASD prevê um processo de orientação que incide sobre as pessoas e as mudanças. Inclui aprendizagem de oportunidades e de avaliações usando iterações em cada iteração. MSF para Capability Maturity Model Integration metodologia Melhoria de Processos O MSF para Capability Maturity Model Integration Melhoria de Processos (MSF4CMMI) dispõe de mais artefatos, mais processos, mais signoffs, mais planejamento e destina-se a projectos que requerem um maior grau de formalidade e cerimônia. O MSF4 CMMI é uma metodologia formal para a engenharia de software. Capability Maturity Model foi criada a partir do Software Engineering Institute da Universidade Carnegie Mellon, e é um processo de melhoria abordagem que fornece às organizações com os elementos essenciais do processo de melhoria contínua, resultando em uma redução SDLC, a melhoria da capacidade de cumprir as metas custo e cronograma, materiais de construção de alta qualidade. O MSF4CMMI que ampliou o MSF4ASD orientação adicional com formalidade, comentários, verificação e de auditoria. Isso resulta em um processo que depende do SEP e ao processo e não conformidades confiando unicamente na confiança e na capacidade de cada um dos membros da equipe. O MSF4CMMI tem mais documentos obrigatórios e relatórios do que a versão ágil, mais formal e desenvolvimento deste processo reduz risco em grandes projetos de software e fornece um estatuto mensuráveis. Uma das vantagens de utilizar o CMMI é o processo pelo qual uma avaliação padrão poderão comparar a capacidade de desenvolver software em outras organizações. 70 Diagrama de contexto Diagrama de contexto O DFD de mais alto nível que representa todo o sistema como um único processo é conhecido como diagrama de contexto, e é composto por fluxos de dados que mostram as interfaces entre o sistema e as entidades externas. O diagrama é uma forma de representar o objeto do estudo, o projeto, e sua relação ao ambiente. Um diagrama de contexto permite identificar os limites dos processos, as áreas envolvidas com o processo e os relacionamentos com outros processos e elementos externos à empresa (ex.: clientes, fornecedores)e mostra as caracteristicas do sistema como: - Organizações/sistemas/pessoas que se comunicam com o sistema; - Dados que o sistema absorve e deve processar; - Dados que o sistema gera para o ambiente; - Fronteira do sistema com o ambiente. Diagrama de fluxos de dados O DFD ou Diagrama de Fluxos de Dados é uma ferramenta para a modelagem de sistemas. Ela fornece apenas uma visão do sistema, a visão estruturada das funções, ou seja, o fluxo dos dados. Se estivermos desenvolvendo um sistema no qual os relacionamentos entre os dados sejam mais importantes que as funções, podemos dar menos importância ao DFD e dedicar-nos aos Diagramas de Entidade-Relacionamento (DER). Um DFD é uma ferramenta de modelagem que nos permite imaginar um sistema como uma rede de processos funcionais, interligados por “dutos” e “tanques de armazenamento de dados". (Edward Yourdon) Outros nomes para este diagrama • • • • • Diagrama de bolhas DFD (abreviatura) Modelo de processo Diagrama de fluxo de trabalho Modelo funcional Componentes de um DFD • • • • DFD Entidades Externas DFD Processos Fluxo de dados Depósito de Dados O DFD pode ter vários níveis de detalhamento de acordo com a necessidade do sistema. O Diagrama de Contexto é uma representação macro do sistema. Em seguida, temos os DFDs de níveis. O nível mais alto é conhecido como DFD de nível 0 e está logo abaixo do diagrama de contexto. Neste nível as principais funções do sistemas são mostradas. Caso o processo não esteja claro o suficiente o mesmo será aperfeiçoado a cada nível. Quando se diz que o DFD fornece apenas uma visão do sistema,é pelo fato de que através de sua representação gráfica não nos comprometemos com a sua implementação física. O DIAGRAMA DE FLUXO DE DADOS (DFD) Todo modelo funcional de um sistema pode ser visto como sendo formado por uma representação gráfica (uma rede de funções ou processos interligados), acompanhada da descrição 71 Diagrama de fluxos de dados de cada função e suas interfaces. A representação gráfica do modelo funcional costuma ser expressa através de um diagrama denominado Diagrama de Fluxo de Dados−DFD. O Conceito de Função → Caixa Preta X o------ Y = F(X) ------o Y por exemplo Elevar o X o----- No X ao -----o Y Quadrado Há ligações de entrada e de saída da caixa. Conhecem-se os elementos de entrada da caixa. Conhecem-se os elementos de saída da caixa. Sabe-se o que a caixa faz com as entradas para obter as saídas. Não é preciso saber como a caixa realiza suas operações, e nem a ordem. Veja também • Função e Processo de Negócio • Matriz CRUD Diagrama entidade relacionamento Diagrama entidade relacionamento é um modelo diagramático que descreve o modelo de dados de um sistema com alto nível de abstração. Ele é a principal representação do Modelo de Entidades e Relacionamentos. É usado para representar o modelo conceitual do negócio. Não confundir com modelo relacional, que representam as tabelas, atributos e relações materializadas no banco de dados. • MER: Conjunto de conceitos e elementos de modelagem que o projetista de banco de dados precisa conhecer. O Modelo é de Alto Nível. • DER: Resultado do processo de modelagem executado pelo projetista de dados que conhece o MER. Tipos de relações Os tipos de relações que são utilizadas neste diagrama: • Relação 1..1 (lê-se relação um para um) - indica que as tabelas têm relação unívoca entre si. Você escolhe qual tabela vai receber a chave estrangeira; • Relação 1..n (lê-se um para muitos) - a chave primária da tabela que tem o lado 1 vai para a tabela do lado N. No lado N ela é chamada de chave estrangeira; • Relação n..n (lê-se muitos para muitos) - quando tabelas têm entre si relação n..n, é necessário criar uma nova tabela com as chaves primárias das tabelas envolvidas, ficando assim uma chave composta, ou seja, formada por diversos campos-chave de outras tabelas. A relação então se reduz para uma relação 1..n, sendo que o lado n ficará com a nova tabela criada. Ver também • • • • • • • • MER - Modelo de Entidades e Relacionamentos Modelo Relacional Administração de dados UML IDEF1X Ferramenta CASE DBDesigner Matriz CRUD 72 Dicionário de dados 73 Dicionário de dados Um dicionário de dados (do inglês data dictionary) é uma coleção de metadados que contêm definições e representações de elementos de dados. Dentro do contexto de SGBD, um dicionário de dados é um grupo de tabelas, habilitadas apenas para leitura ou consulta, ou seja, é uma base de dados, propriamente dita, que entre outras coisas, mantém as seguintes informações: • • • • • Definição precisa sobre elementos de dados Perfis de usuários, papéis e privilégios Descrição de objetos Integridade de restrições Stored procedures (pequeno trecho de programa de computador, armazenado em um SGBD, que pode ser chamado freqüentemente por um programa principal) e gatilhos • Estrutura geral da base de dados • Informação de verificação • Alocações de espaço Um dos benefícios de um dicionário de dados bem preparado é a consistência entre itens de dados através de diferentes tabelas. Por exemplo, diversas tabelas podem conter números de telefones; utilizando uma definição de um dicionário de dados bem feito, o formato do campo 'número de telefone' definido com "( )9999-9999" deverá ser obedecido em todas as tabelas que utilizarem esta informação. Quando uma organização constrói um dicionário de dados de dimensão empresarial, o intuito deve ser o de padronizar precisamente definições semânticas a serem adotadas na empresa toda; portanto, ele deve incluir tanto definições semânticas como de representação para elementos de dados, sendo que os componentes semânticos focam na criação precisa do significado dos elementos de dados, e de outro lado, as definições de representação indicam como os elementos de dados são armazenados em uma estrutura de computador de acordo com seu tipo, ou seja, se são dados do tipo inteiro, caracter ou formato de data (veja Tipos de Dados). Os dicionários de dados são mais precisos que glossários (termos e definições) porque costumam ter uma ou mais representações de como o dado é estruturado e podem envolver ontologias completas quando lógicas distintas sejam aplicadas a definições desses elementos de dados. Os dicionários de dados são gerados, normalmente, separados do Modelo de Dados visto que estes últimos costumam incluir complexos relacionamentos entre elementos de dados. Notação </pre> Símbolo Significado = é composto de () opcional (pode estar presente ou ausente) {} iteração [] escolha em uma das alternativas ** comentário @ identificador (chave) em um depósito | separa opções alternativas na construção []. Tabela de decisão Tabela de decisão A Tabela de decisão é uma maneira de expressar, em forma de tabela, qual o conjunto de condições que é necessário ocorrer para que um determinado conjunto de ações deva ser executado. O ponto principal de uma tabela de decisão é a regra de decisão, que define o conjunto de ações a ser tomado, a partir de um conjunto de condições. Uma tabela de decisão é composta de: • uma área de condições, onde são relacionadas as condições que devem ser verificadas para que seja executado um conjunto de ações; • uma área de ações, que exibe o conjunto de ações que deve ser executado caso um determinado conjunto de condições ocorra; • regras de decisão, representadas pelas colunas, que apresentam a combinação das condições com as ações a serem executadas. Na tabela acima, definimos que para ser considerado exame especial, o avaliado teria que ter mais de 40 anos ou cargo de chefia com mais de 2 anos no cargo. Para que seja definida a quantidade de regras da tabela, basta que multipliquemos a quantidade de respostas possíveis de cada condição. Ex. Condição 1 sim/não: =2 Condição 2 sim/não: =2 Condição 3 Sim/não: =2 x Quantidade de Regras: =8 74 Árvore de decisão 75 Árvore de decisão Uma árvore de decisão é uma representação de uma tabela de decisão sob a forma de uma árvore. Tem a mesma utilidade da tabela de decisão. Trata-se de uma maneira alternativa de expressar as mesmas regras que são obtidas quando se constrói a tabela. Seja a especificação do processo de cálculo do valor da conta de energia elétrica. Uma árvore de decisão para expressar tal problema seria: Diagrama de transição de estados Diagramas da UML 2.0 editar [1] Diagramas Estruturais • • • • • • Diagrama de classes Diagrama de objetos Diagrama de componentes Diagrama de instalação Diagrama de pacotes Diagrama de estrutura Diagramas Comportamentais • • • Diagrama de Caso de Uso Diagrama de transição de estados Diagrama de atividade Diagramas de Interação • • • • Diagrama de sequência Diagrama de Interatividade Diagrama de colaboração ou comunicação Diagrama de tempo Em engenharia de software e eletrônica digital, um diagrama de transição de estados é uma representação do estado ou situação em que um objeto pode se encontrar no decorrer da execução de processos de um sistema. Com isso, o objeto pode passar de um estado inicial para um estado final) através de uma transição. Diagrama de transição de estados 76 Conceitos • Estado: Condição ou situação durante a vida de um objeto na qual ele satisfaz algumas condições, executa algumas atividades ou espera por eventos. • Transição: O relacionamento entre dois estados, indicando que o objeto que está no primeiro estado irá passar para o segundo estado mediante a ocorrência de um determinado evento e em certos casos uma condição. • Condição: causa necessária para que haja a transição de estado. Decorre da ocorrência de um evento ou circunstância que propicia a transição de estado. • Estado inicial: Estado por onde se começa a leitura de um diagrama de estado. • Estado final: Estado que representa o fim de uma máquina. • Barra de Sincronização: Semelhante a um Fork do Diagrama de atividade. • Estado composto: Estado composto por outras máquinas de estado organizadas em regiões que são executadas em paralelo. • Sincronização: permite que os relógios de dois ou mais processos paralelos estejam sincronizados em um determinado momento do processo. • Ação: atividade do sistema que efetua a transição de estado. Exemplo Um exemplo simples seria um semáforo (sinal de trânsito). Cada estado corresponde a uma situação que ocorrerá. Quando verde, os carros podem prosseguir na via. Passado um tempo, é acionada a tarefa de mudar para amarelo. Então o semáforo passa de verde para amarelo. Aqui os carros ficam em estado de atenção e já aguardam a próxima transição. O próximo passo é passar para vermelho. Nesse estado, os carros estão parados na via. De vermelho, o próximo estado somente será verde, assim, os carros podem voltar a trafegar na via. Diagrama de transição de estados de um semáforo Diagrama de transição de estados das estações do ano Diagrama de transição de estados Ver também • Engenharia de software Referências [1] http:/ / pt. wikipedia. org/ w/ index. php?title=Predefinição:Diagramas& action=edit Processo de desenvolvimento de software Um processo de desenvolvimento de software é um conjunto de atividades, parcialmente ordenadas, com a finalidade de obter um produto de software. É estudado dentro da área de Engenharia de Software, sendo considerado um dos principais mecanismos para se obter software de qualidade e cumprir corretamente os contratos de desenvolvimento, sendo uma das respostas técnicas adequadas para resolver a Crise do software. Passos/Atividades Processo Análise Econômica Visa a estabelecer se o projeto de Software gerará lucro, e se a receita gerada será o suficiente para cobrir os custos. Este processo acompanha todas as demais etapas de desenvolvimento do Software. Análise de requisitos de software A extração dos requisitos de um desejado produto de software é a primeira tarefa na sua criação. Embora o cliente, provavelmente, acredite saber o que o software deva fazer, esta tarefa requer habilidade e experiência em engenharia de software para reconhecer a incompletude, ambigüidade ou contradição nos requisitos. Especificação A especificação é a tarefa de descrever precisamente o software que será escrito, preferencialmente de uma forma matematicamente rigorosa. Na prática, somente especificações mais bem sucedidas foram escritas para aplicações bem compreendidas e afinadas que já estavam bem desenvolvidas, embora sistemas de software de missão crítica sejam freqüentemente bem especificados antes do desenvolvimento da aplicação. Especificações são mais importantes para interfaces externas que devem permanecer estáveis. Arquitetura de Software A arquitetura de um sistema de software remete a uma representação abstrata daquele sistema. Arquitetura é concernente à garantia de que o sistema de software irá ao encontro de requisitos do produto, como também assegurar que futuros requisitos possam ser atendidos. A etapa da arquitetura também direciona as interfaces entre os sistemas de software e outros produtos de software, como também com o hardware básico ou com o sistema operacional. Implementação (ou codificação) A transformação de um projeto para um código deve ser a parte mais evidente do trabalho da engenharia de software, mas não necessariamente a sua maior porção.. 77 Processo de desenvolvimento de software Teste Teste de partes do software, especialmente onde tenha sido codificado por dois ou mais engenheiros trabalhando juntos, é um papel da engenharia de software. Documentação Uma importante tarefa é a documentação do projeto interno do software para propósitos de futuras manutenções e aprimoramentos. As documentações mais importantes são das interfaces externas. Suporte e Treinamento de Software Uma grande porcentagem dos projetos de software falham pelo fato de o desenvolvedor não perceber que não importa quanto tempo a equipe de planejamento e desenvolvimento irá gastar na criação do software se ninguém da organização irá usá-lo. As pessoas ocasionalmente resistem à mudança e evitam aventurar-se em áreas pouco familiares. Então, como parte da fase de desenvolvimento, é muito importante o treinamento para os usuários de software mais entusiasmados, alternando o treinamento entre usuários neutros e usuários favoráveis ao software. Usuários irão ter muitas questões e problemas de software os quais conduzirão para a próxima fase. Manutenção A manutenção e melhoria de software lidam com a descoberta de novos problemas e requisitos. Ela pode tomar mais tempo que o gasto no desenvolvimento inicial do mesmo. Não somente pode ser necessário adicionar códigos que combinem com o projeto original, mas determinar como o software trabalhará em algum ponto depois da manutenção estar completa, pode requerer um significativo esforço por parte de um engenheiro de software. Cerca de ⅔ de todos os engenheiros de software trabalham com a manutenção, mas estas estatísticas podem estar enganadas. Uma pequena parte destes trabalha na correção de erros. A maioria das manutenções é para ampliar os sistemas para novas funcionalidades, as quais, de diversas formas, podem ser consideradas um novo trabalho. Analogamente, cerca de ⅔ de todos os engenheiros civis, arquitetos e construtores trabalham com manutenção de uma forma similar. Padrões O processo de desenvolvimento de software tem sido objetivo de vários padrões, que visam a certificação de empresas como possuidoras de um processo de desenvolvimento, o que garantiria certo grau de confiança aos seus contratantes. Alguns padrões existentes atualmente: • • • • CMMI (anteriormente CMM) SPICE ISO 12207 MPS/Br Modelos de Processo Há uma década, vem se tentando encontrar um processo ou metodologia previsível e repetível que melhore a produtividade e qualidade. Alguns tentaram sintetizar e formalizar a tarefa aparentemente incontrolável de escrever um software. Outros aplicaram técnicas de gerenciamento de projeto na escrita de software. Sem o gerenciamento de projeto, projetos de software podem facilmente sofrer atraso ou estourar o orçamento. Como um grande número de projetos de software não atendem suas expectativas em termos de funcionalidades, custo, ou cronograma de entrega, ainda não existe um modelo de processo perfeito para todas aplicações. 78 Processo de desenvolvimento de software Processo em cascata O mais antigo e bem conhecido processo é o Modelo em cascata, onde os desenvolvedores (a grosso modo) seguem estes passos em ordem. Eles estabelecem os requisitos, os analisam, projetam uma abordagem para solução, arquitetam um esboço do software, implementam o código, testam (inicialmente os testes unitários e então os testes de sistema), implantam e mantêm. Depois que cada passo é terminado, o processo segue para o próximo passo, tal como construtores que não revisam as fundações de uma casa depois que as paredes foram erguidas. Se as iterações não são incluídas no planejamento, o processo não tem meios para corrigir os erros nas etapas inicias (por exemplo, nos requisitos), então o processo inteiro da engenharia de software deve ser executado até o fim, resultando em funcionalidades de software desnecessárias ou sem uso.Para isso tem que se fazer o implemento dos requisitos anteriormente analisados pelo programador. Processos Iterativos O Desenvolvimento iterativo e incremental prescreve a construção de uma porção pequena, mas abrangente, do projeto de software para ajudar a todos os envolvidos a descobrir cedo os problemas ou suposições, falhas que possam a levar ao desastre. O processo iterativo é preferido por desenvolvedores porque lhes fornece um potencial para atingir os objetivos de projeto de um cliente que não sabe exatamente o que quer, ou quando não se conhece bem todos os aspectos da solução. Processos de desenvolvimento ágil de software são construídos com os fundamentos do desenvolvimento iterativo. Os processos ágeis usam o feedback, mais que o planejamento, como seus mecanismos de controle primário. O feedback é produzido por testes regulares e das versões do software desenvolvido. Processos ágeis Os processos em Desenvolvimento ágil de software parecem ser mais eficientes do que as metodologias antigas. Utiliza menos tempo do programador no desenvolvimento de softwares funcionais de alta qualidade, mas tem a desvantagem de ter uma perspectiva de negocio que não provê uma capacidade de planejamento em longo prazo. Em essência, eles provem mais funcionalidades por custo/benefício, mas não dizem exatamente o que a funcionalidade irá fazer. Existem várias metodologias que podem ser consideradas como abordagens ágeis, entre elas: Scrum, Programação extrema, FDD, Crystal Clear, DSDM entre outras. A Programação Extrema (XP), é o mais bem conhecido processo ágil. Em XP, as fases são continuadas em passos extremamente pequenos (ou contínuos) comparados aos processos antigos. A primeira passada (iteração incompleta) através das etapas deve levar um dia ou uma semana, ao invés de meses ou anos para cada fase completa do modelo em cascata. Primeiramente, escreve-se um autômato de teste, que provê objetivos concretos para o desenvolvimento. Depois é codificado (por um par de programadores), este passo está completo quando todos os testes se concluem, e os programadores não pensem em nada mais que possa ser testado. Projetistas e Arquitetos executam uma refatoração do código. O projeto é feito por pessoas que estão codificando. O sistema incompleto mas funcional é entregue e demonstrado para os usuários. Neste ponto, os envolvidos iniciam novamente uma nova fase de escrita e teste para as próximas partes mais importantes do sistema. Método formal Os Métodos Formais são abordagens matemáticas para resolver problemas de software e hardware ao nível de requisito, especificação e projetos. Exemplos de métodos formais incluem Método-B, Redes Petri, RAISE e VDM. Várias notações de especificação formal estão disponíveis, tais como a notação-Z. De forma mais genérica, a teoria do autômato pode ser usada para construir e validar o comportamento da aplicação para o projeto de um sistema de máquina de estado finito. 79 Processo de desenvolvimento de software Máquinas de estado finito baseadas nestas metodologias permitiram especificar software executáveis e contornar a codificação convencional. Ver também Alguns métodos de desenvolvimento de software • • • • • • • • • • • Modelo em cascata Modelo em espiral Modelo desenvolvimento dirigido Modelo baseado experiência usuario Modelo Bottom Up Modelo Balbúrdia Prototipacão Modelo Top Down Modelo V Programação extrema Scrum Temas relacionados • • • • • • • • • • • • • Modelo abstrato Modelo IPO+S Processo Modelagem de Dados Matriz CRUD Paradigmas de programação Projeto Ciclo de vida de desenvolvimento de sistema Documentação de Software Projeto de Sistemas Esforço de teste RUP Praxis (engenharia de software) Softwares de apoio • dotProject • Trac • Subversion 80 Análise de requisitos de software Análise de requisitos de software A Análise de requisitos de software é a primeira fase de desenvolvimento de software. É nesta fase que o analista faz as primeiras reuniões com os clientes e/ou usuários do software para conhecer as funcionalidades do sistema que será desenvolvido. É nesta fase também que ocorre a maior parte dos erros, pois a falta de experiência dos clientes ou usuários faz com que eles nem sempre tenham claro em sua mente quais funcionalidades o software terá. As entrevistas estruturadas são um método utilizado para esta fase e que poderão ter um papel importante na ajuda à compreensão de todas as funcionalidades pretendidas pelo cliente. Especificação de Programa Uma especificação de programa é a definição do que se espera que um programa de computador faça. Ela pode ser informal, neste caso ela pode ser considerada como um blueprint ou manual de usuário do ponto de vista do desenvolvedor, ou formal, no caso de ela ser definida principalmente em termos matemáticos ou programáticos. Na prática, as especificações mais bem sucedidas são escritas para a compreensão e ajustes em uma aplicação que já se encontra bem desenvolvida, embora sistemas de sistemas de segurança críticos sejam cuidadosamente especificados antes do desenvolvimento da aplicação. Especificações são mais importantes para interfaces externas que devem permanecer estáveis. Ver também • • • • • • • • • • • Métodos formais Verificação formal Especificação formal Transformação programa Contrato por projeto Notação de maquina abstrata Método desenvolvimento Vienna Notação Z Engenharia de software Linguagem de especificação Refinamento 81 Arquitetura de software Arquitetura de software A arquitetura de software de um sistema consiste dos componentes de software, suas propriedades externas, e seus relacionamentos com outros softwares. O termo também se refere à documentação da arquitetura de software do sistema. A documentação da arquitetura do software facilita: a comunicação entre os stakeholders, registra as decisões iniciais acerca do projeto de alto-nível, e permite o reuso do projeto dos componentes e padrões entre projetos. Introdução O campo da ciência da computação tem lidado com problemas associados, como a complexidade da informação, desde sua criação.[1] Os primeiros problemas de complexidade foram resolvidos pelos desenvolvedores através da escolha da estrutura de dados, do desenvolvimento de algoritmos e pela aplicação de conceitos de separação de escopos. Embora o termo arquitetura de software seja relativamente novo na industria, os princípios fundamentais deste campo vem sendo aplicados esporadicamente pela engenharia de software desde o inicio dos anos 80. As primeiras tentativas de capturar e explicar a arquitetura de software do sistema foram imprecisas e desorganizadas – freqüentemente caracterizadas por um conjunto de diagramas.[2] Durante o decorrer da década de 90 houve um esforço concentrado para definir e codificar os aspectos fundamentais desta disciplina. Inicialmente um conjunto de padrões de projeto, estilo, melhores práticas, descrição de linguagens, e lógica formal foram desenvolvidas durante este período. A disciplina de arquitetura de software é centrada na idéia da redução da complexidade através da abstração e separação de interesses. O glossário do site oficial SOFTWARE ENGENEERING INSTITUTE (Instituto de Engenharia de Software) [3] descreve que arquitetura de software é a estrutura ou estruturas de um sistema, com todos os elementos de software vendo e tendo suas propriedades vistas por todos os outros elementos e relacionamentos. Sendo a arquitetura de sistema uma disciplina em maturação, sem regras claras, a ação do arquiteto é ainda uma composição de arte e ciência. Os aspectos de arte da arquitetura de software são devido ao fato que os sistemas de software comerciais suportam alguns aspectos de um negócio ou missão. Como o direcionamento de negócio chave para o suporte sistemas são descrito nos cenários como requisitos não-funcionais de sistema, também conhecidos como atributos de qualidade, que determinam como um sistema ira se comportar.[4] Cada sistema é único devido a natureza do negócio que ele suporta, tal que o nível dos atributos de qualidade exigidos de um sistema como compatibilidade, extensibilidade, confiabilidade, manutenabilidade, disponibilidade, segurança, usabilidade, dentre outros – irão variar com cada aplicação.[4] Para trazer a perspectiva do usuário para dentro da arquitetura de software, pode-se dizer que a arquitetura de software dá a direção dos passos que serão tomados e as tarefas envolvidas em cada área de especialidade e interesse do usuário, por exemplo, stakeholders de sistemas de software, os desenvolvedores de software, o grupo de suporte ao software do sistema operacional, aos testadores e usuários de negocio final. Neste sentido, a arquitetura de software se torna a ligação das múltiplas perspectivas que um sistema traz nele embutido. O fato de que estas várias perspectivas diferentes possam ser postas juntas em uma arquitetura de software padrão justifica e valida a necessidade de criação da arquitetura de software antes do desenvolvimento do software para que projeto alcance a maturidade. 82 Arquitetura de software História A origem da arquitetura de software como um conceito foi primeiramente identificado no trabalho de pesquisa de Edsger Dijkstra em 1968 e David Parnas no início de 1970. Estes cientistas enfatizaram a importância das estruturas de um sistema de software e a criticidade da identificação da sua estrutura.[5] O estudo deste campo aumentou de popularidade desde o inicio de 1990 com os trabalhos de pesquisa concentrando-se nos padrões de estilo de arquitetura, linguagens de descrição de arquitetura, documentação de arquitetura, e métodos formais.[6] Muitas instituições de pesquisa tais como a Carnegie Mellon University e a University of California, Irvine estavam realizando muitas pesquisas no campo da arquitetura de software. Mary Shaw e David Garlan da Carnegie Mellon escreveram um livro intitulado Software Architecture: Perspectives on an Emerging Discipline em 1996, o qual trazia a tona conceitos da arquitetura de software, tais como componentes, conexões, estilos, etc. Os esforços do UCI's (Institute for Software Research) na pesquisa da arquitetura de software foram inicialmente direcionado para os estilos de arquitetura, descrições de linguagens arquitetura, e arquiteturas dinâmicas. ANSI/IEEE 1471-2000: Recommended Practice for Architecture Description of Software-Intensive Systems[7] foi a primeira norma padrão na área de arquitetura de software, e foi recentemente adotada pelo ISO como ISO/IEC DIS 25961. Descrevendo arquiteturas Linguagem de descrição de arquitetura As Linguagens de descrição de arquitetura (LDAs) são usadas para descrever a arquitetura de software. Vários diferentes LDAs foram desenvolvidas por diferentes organizações, incluindo Wright (desenvolvido por Carnegie Mellon), Acme (desenvolvido por Carnegie Mellon), xADL (desenvolvido por UCI), Darwin (desenvolvido por Imperial College London), DAOP-ADL (desenvolvido pela University of Málaga). Elementos comuns de uma LDA são componente, conexão e configuração. Visões A arquitetura de software é normalmente organizada em visões[8] , as quais são análogas aos diferentes tipos de 'blueprint[9]' utilizados no estabelecimento da arquitetura. Na Ontologia estabelecida pela ANSI/IEEE 1471-2000, visões são instancias de pontos de vista, onde um ponto de vista existe para descrever a arquitetura na perspectiva de um conjunto de stakeholders e seus consortes. Algumas possíveis visões são: • • • • • • Visão funcional/lógica Visão de código. Visão de desenvolvimento/estrutural Visão de concorrência/processo/thread Visão física/evolutiva Visão de ação do usuário/feedback Várias linguagens para descrição da arquitetura de software foram inventadas, mas nenhum consenso foi ainda alcançado em relação a qual conjunto de símbolos ou sistema representação deve ser adotado. Alguns acreditam que a UML ira estabelecer um padrão para representação de arquitetura de software. Outros acreditam que os desenvolvimentos efetivos de software devem contar com a compreensão única das restrições de cada problema, e notações tão universais são condenadas a um final infeliz porque cada uma prove um notação diferenciada que necessariamente torna a notação inútil ou perigosa para alguns conjuntos de tarefas. Eles apontam a proliferação de linguagens de programação e a sucessão de tentativas falhas para impor uma simples 'linguagem universal' na programação, como uma prova da tendência do software para a diversidade e não para padrões. 83 Arquitetura de software Padrões de arquitetura • • • • • DODAF [10] MODAF [11] TOGAF [12] Zachman framework [13] Federal Enterprise Architecture [14] Exemplos de arquitetura Há muitas formas comuns de projetar módulos de software de computador e suas comunicações, entre elas: • • • • • • • Cliente-Servidor Computação distribuída P2P Quadro Negro Criação implícita Pipes e filtros Plugin • • • • • Aplicação monolítica Modelo em três camadas Analise de sistema estruturada (baseada em módulos, mas usualmente monolíticas em dentro dos módulos) Arquitetura orientada a serviço Arquitetura orientada a busca [1] University of Waterloo (2006). A Very Brief History of Computer Science (http:/ / www. cs. uwaterloo. ca/ ~shallit/ Courses/ 134/ history. html). Página visitada em 2006-09-23. [2] IEEE Transactions on Software Engineering (2006). Introduction to the Special Issue on Software Architecture (http:/ / csdl2. computer. org/ persagen/ DLAbsToc. jsp?resourcePath=/ dl/ trans/ ts/ & toc=comp/ trans/ ts/ 1995/ 04/ e4toc. xml& DOI=10. 1109/ TSE. 1995. 10003). Página visitada em 2006-09-23. [3] SEI (2010). Glossary? (http:/ / www. sei. cmu. edu/ architecture/ start/ glossary). Página visitada em 2010-01-31. [4] SoftwareArchitectures.com (2006). Intro to Software Quality Attributes (http:/ / www. softwarearchitectures. com/ one/ Designing+ Architecture/ 78. aspx). Página visitada em 2006-09-23. [5] SEI (2006). Origins of Software Architecture Study (http:/ / www. sei. cmu. edu/ architecture/ roots. html). Página visitada em 2006-09-25. [6] Garlan & Shaw (2006). An Introduction to Software Architecture (http:/ / www. cs. cmu. edu/ afs/ cs/ project/ able/ ftp/ intro_softarch/ intro_softarch. pdf). Página visitada em 2006-09-25. [7] http:/ / en. wikipedia. org/ wiki/ IEEE_1471 [8] Clements, Paul. Documenting Software Architectures: Views and Beyond. 2 ed. Boston: Addison-Wesley, 2003. pag. pp. 13-15. ISBN 0201703726 [9] http:/ / en. wikipedia. org/ wiki/ Blueprint [10] http:/ / en. wikipedia. org/ wiki/ Department_of_Defense_Architecture_Framework [11] http:/ / en. wikipedia. org/ wiki/ MODAF [12] http:/ / en. wikipedia. org/ wiki/ TOGAF [13] http:/ / en. wikipedia. org/ wiki/ Zachman_framework [14] http:/ / en. wikipedia. org/ wiki/ Federal_Enterprise_Architecture 84 Arquitetura de software Ver também • • • • • • • • Padrões de projeto de software Antipadrões de software Modelagens de dados padrões Matriz de estrutura de dependência Arquitetura de negócio Arquitetura de informações Arquitetura de processo Arquiteto de software Ligações externas • Software architecture definitions at Carnegie Mellon University Software Engineering Institute (http://www.sei. cmu.edu/architecture/definitions.html) • Software architecture vs. software design (http://eden-study.org/articles/2003/icse03.pdf) • Worldwide Institute of Software Architects (http://www.wwisa.org/) • Grady Booch's [[Handbook of Software Architecture (http://www.booch.com/architecture/index.jsp)] project] • SoftwareArchitectures.com [[Independent resource of information on the discipline (http://www. SoftwareArchitectures.com)]] • International Association of Software Architects (http://www.iasahome.org/) • Microsoft Architecture Journal (http://www.architecturejournal.net/) • Pangea - Professional and Academic Network to the Growing and Evolution of Architecture (Portuguese) (http:// pangeanet.org/) 85 Programação de computadores 86 Programação de computadores Programação é o processo de escrita, teste e manutenção de um programa de computador. O programa é escrito em uma linguagem de programação, embora seja possível, com alguma dificuldade, escrevê-lo directamente em linguagem de máquina. Diferentes partes de um programa podem ser escritas em diferentes linguagens. Diferentes linguagens de programação funcionam de diferentes modos. Por esse motivo, os programadores podem criar programas muito diferentes para diferentes linguagens; muito embora, teoricamente, a maioria das linguagens possa ser usada para criar qualquer programa. Para mais informações sobre estes métodos, veja Linguagem de programação. Software é um nome colectivo para programas de computadores e dados. Há várias décadas se debate se a programação é mais semelhante a uma arte (Donald Knuth), a uma ciência, à matemática (Edsger Dijkstra), à engenharia (David Parnas), ou se é um campo completamente novo. Programas ou algoritmos? Pequeno programa em linguagem de programação C que imprime na tela se o número passado a ele como argumento é primo ou não. O código fonte está sendo visualizado em um IDE com suporte a coloração de sintaxe e indentação de código. Um algoritmo é uma sequência de passos para realizar uma tarefa ou resolver um problema. Em nosso dia a dia utilizamos algoritmos para realizar nossas atividades, definindo a sequência de atividades que devemos fazer para atingir um objetivo. Um algoritmo é, num certo sentido, um programa abstrato — dizendo de outra forma, um programa é um algoritmo concretizado. No entanto, os programas são, à excepção dos menores, visualizados mais facilmente como uma colecção de algoritmos menores combinados de um modo único — da mesma forma que uma casa é construída a partir de componentes. Dessa forma, um algoritmo é uma descrição de como um computador pode ser levado a executar uma operação simples e específica, como, por exemplo, uma ordenação. Um programa, por outro lado, é uma entidade que na verdade implementa uma ou mais operações de forma que seja útil para as pessoas. Programação de computadores Engenharia de software A criação de um programa de computador consiste de cinco passos principais: 1. 2. 3. 4. Reconhecer a necessidade de um programa para resolver um problema. Planificar o programa e seleccionar as ferramentas necessárias para resolver o problema. Escrever o programa na linguagem de programação escolhida. Compilação: tradução do código fonte legível pelo homem em código executável pela máquina, o que é feito através de compiladores e outras ferramentas. 5. Testar o programa para ter a certeza de que funciona; se não, regressar ao passo 3. Estes cinco passos são colectivamente conhecidos como engenharia de software. A programação põe ênfase nos passos 2, 3 e 4. A codificação põe ênfase no passo 3. O termo coder, por vezes usado como sinônimo para programador, pode tornar-se aviltante porque ignora as capacidades necessárias para lidar com os outros quatro passos. História Heron de Alexandria no século primeiro inventou teatros automatizados que usavam programação análoga para controlar os fantoches, portas, luzes e efeitos de som. A mais antiga programadora de computadores que se conhece é Ada Lovelace, filha de Anabella e de Lord Byron (o poeta). Anabella transmitiu a Ada o seu amor à matemática, a qual, depois de conhecer Charles Babbage, traduziu e expandiu uma descrição da sua máquina analítica. Muito embora Babbage nunca tenha completado a construção de nenhuma das suas máquinas, o trabalho que ele e Ada desenvolveram sobre elas, garantiu a Ada o título de primeira Um bug, que foi depurado em 1947. programadora de computadores do mundo (veja as notas de Ada Byron sobre a máquina analítica. A linguagem de programação Ada recebeu o seu nome. Um dos primeiros programadores que se tem notícia de ter completado todos os passos para a computação sem auxílio, incluindo a compilação e o teste, é Wallace J. Eckert. O trabalho deste homem antecede a ascensão das linguagens de computador, porque ele usou a linguagem da matemática para solucionar problemas astronômicos. No entanto, todos os ingredientes estavam lá: ele trabalhou um laboratório de computação para a Universidade de Columbia com equipamentos fornecidos pela IBM, completos com uma divisão de serviço de atendimento ao cliente, e consultores de engenharia para propósitos especiais, na cidade de Nova York, na década de 1930, usando cartões perfurados para armazenar os resultados intermediários de seus cálculos, e então formatando os cartões perfurados para controlar a impressão das respostas, igual ao trabalho para os censos décadas antes. Tinha técnicas de debug tais como códigos de cores, bases cruzadas, verificação e duplicação. Uma diferença entre Eckert e os programadores dos dias de hoje é que o exemplo do seu trabalho influenciou o projeto Manhattan. Seu trabalho foi reconhecido por astrônomos do Observatório da Universidade de Yale, Observatório da Universidade de Princeton, Observatório da Marinha dos EUA, Observatório da Faculdade Harvard, Observatório dos estudantes da Universidade da Califórnia, Observatório Ladd da Universidade de Brown e Observatório Sproul da Faculdade de Swarthmore. 87 Programação de computadores Alan Turing é frequentemente encarado como o pai da ciência de computadores e, por afinidade, da programação. Ele foi responsável por ajudar na elaboração e programação de um computador destinado a quebrar o código alemão ENIGMA durante a Segunda Guerra Mundial — ver Máquina Enigma. Lista de linguagens Existem várias linguagens de programação. As 20 mais populares são:[1] 1. Java 2. C 3. C++ 4. PHP 5. C# 6. Visual Basic 7. Python 8. Perl 9. Objective-C 10. JavaScript 11. Delphi 12. 13. 14. 15. 16. 17. 18. 19. 20. Ruby PL/SQL SAS Pascal Lisp/Scheme/Clojure MATLAB ABAP Lua PowerShell [1] Linguagens de programação populares (http:/ / www. tiobe. com/ index. php/ content/ paperinfo/ tpci/ index. html) (em inglês). tiobe.com. Página visitada em 9 de julho de 2010. Ver também • • • • • • • • • • • • • • Callback Ciência de computadores Documentação de software Engenharia de software Falha de segmentação Lista de linguagens de programação Orientação a objeto Programação baseada em ARS Programação estruturada Programação funcional Programação imperativa Programação em Lógica (Prolog) Programação orientada por acontecimentos Software • Testes de caixa negra 88 Programação de computadores Ligações externas • CS101 Tutorial by Lynn Andrea Stein, Ph.D (http://www.cs101.org/tutorial/index) • Popular Computer Programming Language Timelines (http://home.cfl.rr.com/eaa/Languages.htm) • Power Programming Methods (http://www.bitesizeinc.net/power.programming.html) Teste de Software O teste do software é a investigação do software a fim de fornecer informações sobre sua qualidade em relação ao contexto em que ele deve operar. Isso inclui o processo de utilizar o produto para encontrar seus defeitos. O teste é um processo realizado pelo testador de software, que permeia outros processos da engenharia de software, e que envolve ações que vão do levantamento de requisitos até a execução do teste propriamente dito. Visão geral Não se pode garantir que todo software funcione corretamente, sem a presença de erros,[1] visto que os mesmos muitas vezes possuem um grande número de estados com fórmulas, atividades e algoritmos complexos. O tamanho do projeto a ser desenvolvido e a quantidade de pessoas envolvidas no processo aumentam ainda mais a complexidade. Idealmente, toda permutação possível do software deveria ser testada. Entretanto, isso se torna impossível para a ampla maioria dos casos devido à quantidade impraticável de possibilidades. A qualidade do teste acaba se relacionando à qualidade dos profissionais envolvidos em filtrar as permutações relevantes.[2] Falhas podem ser originadas por diversos motivos. Por exemplo, a especificação pode estar errada ou incompleta, ou pode conter requisitos impossíveis de serem implementados, devido à limitações de hardware ou software. A implementação também pode estar errada ou incompleta, como um erro de um algoritmo. Portanto, uma falha é o resultado de um ou mais defeitos em algum aspecto do sistema. O teste de software pode ser visto como uma parcela do processo de qualidade de software. A qualidade da aplicação pode, e normalmente, varia significativamente de sistema para sistema. Os atributos qualitativos previstos na norma ISO 9126 são funcionalidade, confiabilidade, usabilidade, eficiência, manutenibilidade e portabilidade. De forma geral, mensurar o bom funcionamento de um software envolve compará-lo com elementos como especificações, outros softwares da mesma linha, versões anteriores do mesmo produto, inferências pessoais, expectativas do cliente, normas relevantes, leis aplicáveis, entre outros. Enquanto a especificação do software diz respeito ao processo de verificação do software, a expectativa do cliente diz respeito ao processo de validação do software. Um desenvolvimento de software organizado tem como premissa uma metodologia de trabalho. Esta deve ter como base conceitos que visem a construção de um produto de software de forma eficaz. Dentro desta metodologia estão definidos os passos necessários para chegar ao produto final esperado. Assim, quando se segue uma metodologia para o desenvolvimento de um produto de software, espera-se um produto final que melhor agrade tanto aos clientes quanto ao próprio fornecedor, ou seja, a empresa de desenvolvimento. Observando este aspecto, não faz sentido iniciar a construção de um produto de software sem ter uma metodologia de trabalho bem solidificada e que seja do conhecimento de todos os envolvidos no processo. Porém, além de uma crescente demanda por softwares de qualidade, as empresas de desenvolvimento de software sofrem cada vez mais pressão por parte dos clientes para que o produto seja entregue num curto período de tempo. Este fato pode fazer com que uma sólida metodologia de trabalho acabe por se desequilibrar. Independentemente da metodologia de trabalho empregada no desenvolvimento de um software, para que se obtenha um produto final com um certo nível de qualidade é imprescindível a melhoria dos processos de engenharia de software. 89 Teste de Software Uma maneira viável para se assegurar a melhoria de tais processos seria tomar como base modelos sugeridos por entidades internacionais respeitadas no assunto. Dentro de uma gama de modelos, sejam eles para situações e ambientes específicos ou para soluções genéricas, existem alguns que são mais utilizados e tidos como eficientes, como por exemplo os SW-CMM, SE-CMM, ISO 15504 e o mais conhecido CMMI. Outro factor com grande influência sobre a qualidade do software a ser produzido é o que diz respeito aos testes que serão executados sobre tal produto. Todas as metodologias de desenvolvimento de software têm uma disciplina dedicada aos testes. Atualmente esta é uma tarefa indispensável, porém muitas vezes efetuada de maneira ineficiente, seja pelo subestimar dos que desenvolvem, pela falta de tempo ou mesmo pela falta de recursos humanos e financeiros. De acordo com um estudo conduzido pelo NIST em 2002, os defeitos resultam num custo anual de 59,5 bilhões de dólares à economia dos Estados Unidos. Mais de um terço do custo poderia ser evitado com melhorias na infraestrutura do teste de software.[3] Princípios Para Myers (2004), há princípios vitais para o teste de software. O caso de teste deve definir a saída esperada, de forma a reduzir a interpretação do critério de sucesso. A saída da execução do teste deve ser exaustivamente analisada. Os casos de teste devem verificar não somente as condições inválidas de execução, como também as condições válidas. Outro conceito apresentado é utilizar pessoas e organizações diferentes para a implementação e para a verificação. A entidade de teste possui uma visão destrutiva do sistema, em busca de erros, enquanto a entidade de programação possui uma visão construtiva, em busca da implementação de uma especificação. Myers também aborda o esforço para se construir casos de teste. Deve-se evitar testes descartáveis, pois a qualidade do teste piora gradualmente com as iterações de desenvolvimento. Em contrapartida, há o teste de regressão, que permite quantificar a evolução da qualidade de software, mantendo e executando novamente testes realizados anteriormente. O mesmo autor afirma que, diferente do que se poderia considerar senso comum, a probabilidade de existência de erros num certo trecho de código é proporcional à quantidade de erros já encontradas anteriormente. Basicamente, erros aparecem em grupos. Trechos específicos de código de um software qualquer estão mais propensos a ter erros que outros. Técnicas Existem muitas maneiras de se testar um software. Mesmo assim, existem as técnicas que sempre foram muito utilizadas em sistemas desenvolvidos sobre linguagens estruturadas que ainda hoje têm grande valia para os sistemas orientados a objeto. Apesar de os paradigmas de desenvolvimento serem completamente diferentes, o objetivo principal destas técnicas continua a ser o mesmo, encontrar falhas no software. Abaixo estão descritas algumas das técnicas mais conhecidas. 90 Teste de Software Caixa-branca Também chamada de teste estrutural ou orientado à lógica, a técnica de caixa-branca avalia o comportamento interno do componente de software. Essa técnica trabalha diretamente sobre o código fonte do componente de software para avaliar aspectos tais como: teste de condição, teste de fluxo de dados, teste de ciclos, teste de caminhos lógicos, códigos nunca executados. Os aspectos avaliados nesta técnica de teste dependerão da complexidade e da tecnologia que determinarem a construção do componente de software, cabendo portanto avaliação de mais aspectos que os citados anteriormente. O testador tem acesso ao código fonte da aplicação e pode construir códigos para efetuar a ligação de bibliotecas e componentes. Este tipo de teste é desenvolvido analisando o código fonte e elaborando casos de teste que cubram todas as possibilidades do componente de software. Dessa maneira, todas as variações relevantes originadas por estruturas de condições são testadas. Um exemplo bem prático desta técnica de teste é o uso da ferramenta livre JUnit para desenvolvimento de classes de teste para testar classes ou métodos desenvolvidos em Java. Também se enquadram nessa técnica testes manuais ou testes efetuados com apoio de ferramentas para verificação de aderência a boas práticas de codificação reconhecidas pelo mercado de software. A aderência a padrões e boas práticas visa principalmente a diminuição da possibilidade de erros de codificação e a busca de utilização de comandos que gerem o melhor desempenho de execução possível. Apesar de muitos desenvolvedores alegarem que não há ganhos perceptíveis com essa técnica de teste aplicada sobre unidades de software, devemos lembrar que, no ambiente produtivo, cada programa pode vir a ser executado milhares ou milhões de vezes em intervalos de tempo pequenos. É na realidade de produção que a soma dos aparentes pequenos tempos de execução e consumo de memória de cada programa poderá levar o software a deixar de atender aos objetivos esperados. A técnica de teste de caixa-branca é recomendada para as fases de teste de unidade e teste de integração, cuja responsabilidade principal fica a cargo dos desenvolvedores do software, que por sua vez conhecem bem o código fonte produzido. Caixa-preta Também chamada de teste funcional, orientado a dado ou orientado a entrada e saída, a técnica de caixa-preta avalia o comportamento externo do componente de software, sem se considerar o comportamento interno do mesmo.[4] Dados de entrada são fornecidos, o teste é executado e o resultado obtido é comparado a um resultado esperado previamente conhecido. Como detalhes de implementação não são considerados, os casos de teste são todos derivados da especificação. Quanto mais entradas são fornecidas, mais rico será o teste. Numa situação ideal todas as entradas possíveis seriam testadas, mas na ampla maioria dos casos isso é impossível.[5] Outro problema é que a especificação pode estar ambígua em relação ao sistema produzido, e como resultado as entradas especificadas podem não ser as mesmas aceitas para o teste.[6] Uma abordagem mais realista para o teste de caixa-preta é escolher um subconjunto de entradas que maximize a riqueza do teste. Pode-se agrupar subconjuntos de entradas possíveis que são processadas similarmente, de forma que testar somente um elemento desse subconjunto serve para averiguar a qualidade de todo o subconjunto. Por exemplo, em um sistema que aceita um inteiro como entrada, testar todos os casos possíveis pode gerar pelo menos dezenas de milhares de casos de testes distintos. Entretanto, a partir da especificação do sistema, pode-se encontrar um subconjunto de inteiros que maximizem a qualidade do teste. Depende do propósito do sistema, mas casos possíveis incluem inteiros pares, inteiros ímpares, zero, inteiros positivos, inteiros negativos, o maior inteiro, o menor inteiro. Essa técnica é aplicável a todas as fases de teste – teste unitário, teste de integração, teste de sistema e teste de aceitação. A aplicação de técnicas de teste leva o testador a produzir um conjunto de casos de teste (ou situações de teste). A aplicação combinada de outra técnica – técnica de particionamento de equivalência (ou uso de classes de equivalência) permite avaliar se a quantidade de casos de teste produzida é coerente. A partir das classes de equivalência identificadas, o testador construirá casos de teste que atuem nos limites superiores e inferiores destas 91 Teste de Software classes, de forma que um número mínimo de casos de teste permita a maior cobertura de teste possível. Uma abordagem no desenvolvimento do teste de caixa-preta é o teste baseado na especificação, de forma que as funcionalidades são testadas de acordo com os requisitos. Apesar de necessário, esse tipo de teste é insuficiente para identificar certos riscos num projeto de software.[7] Caixa-cinza A técnica de teste de caixa-cinza é um mesclado do uso das técnicas de caixa-preta e de caixa-branca. Isso envolve ter acesso a estruturas de dados e algoritmos do componente a fim de desenvolver os caso de teste, que são executados como na técnica da caixa-preta. Manipular entradas de dados e formatar a saída não é considerado caixa-cinza pois a entrada e a saída estão claramente fora da caixa-preta. A caixa-cinza pode incluir também o uso de engenharia reversa para determinar por exemplo os limites superiores e inferiores das classes, além de mensagens de erro. Regressão Essa é uma técnica de teste aplicável a uma nova versão de software ou à necessidade de se executar um novo ciclo de teste durante o processo de desenvolvimento. Consiste em se aplicar, a cada nova versão do software ou a cada ciclo, todos os testes que já foram aplicados nas versões ou ciclos de teste anteriores do sistema. Inclui-se nesse contexto a observação de fases e técnicas de teste de acordo com o impacto de alterações provocado pela nova versão ou ciclo de teste. Para efeito de aumento de produtividade e de viabilidade dos testes, é recomendada a utilização de ferramentas de automação de teste, de forma que, sobre a nova versão ou ciclo de teste, todos os testes anteriores possam ser executados novamente com maior agilidade. Técnicas não funcionais Outras técnicas de teste existem para testar aspectos não-funcionais do software, como por exemplo de acordo com necessidades de negócio ou restrições tecnológicas. Em contraste às técnicas funcionais mencionadas acima, que verificam a operação correta do sistema em relação a sua especificação, as técnicas não funcionais verificam a operação correta do sistema em relação a casos inválidos ou inesperados de entrada. É uma forma de testar a tolerância e a robustez do software em lidar com o inesperado. Uma delas é o uso conjunto de teste de desempenho e teste de carga, que verifica se o software consegue processar grandes quantidades de dados, e nas especificações de tempo de processamento exigidas, o que determina a escalabilidade do software. O teste de usabilidade é necessário para verificar se a interface de usuário é fácil de se aprender e utilizar. Entre verificações cabíveis estão a relação da interface com conhecimento do usuário, a compreensibilidade das mensagens de erro e a integridade visual entre diferentes componentes.[8] Já o teste de confiabilidade é usado para verificar se o software é seguro em assegurar o sigilo dos dados armazenados e processados. O teste de recuperação é usado para verificar a robustez do software em retornar a um estado estável de execução após estar em um estado de falha. 92 Teste de Software 93 Fases Abstração do teste Descendente Sistema Integração Ascendente Unidade Uma prática comum é testar o software após uma funcionalidade ser desenvolvida, e antes dela ser implantada no cliente, por um grupo de profissionais diferente da implementação. Essa prática pode resultar na fase de teste ser usada para compensar atrasos do projeto, comprometendo o tempo devotado ao teste. Outra prática é começar o teste no mesmo momento que o projeto, num processo contínuo até o fim do projeto. Em contrapartida, algumas práticas emergentes como a programação extrema e o desenvolvimento ágil focam o modelo de desenvolvimento orientado ao teste. Nesse processo, os testes de unidade são escritos primeiro, por engenheiros de software. Antes da implementação da unidade em questão, o teste falha. Então o código é escrito, passando incrementalmente em porções maiores dos casos de teste. Os testes são mantidos junto com o resto do código fonte do software, e geralmente também integra o processo de construção do software. Teste de unidade Também conhecida como teste unitário ou teste de módulo, é a fase em que se testam as menores unidades de software desenvolvidas (pequenas partes ou unidades do sistema).[9] O universo alvo desse tipo de teste são as subrotinas ou mesmo pequenos trechos de código. Assim, o objetivo é o de encontrar falhas de funcionamento dentro de uma pequena parte do sistema funcionando independentemente do todo. Teste de integração Na fase de teste de integração, o objetivo é encontrar falhas provenientes da integração interna dos componentes de um sistema. Geralmente os tipos de falhas encontradas são de transmissão de dados. Por exemplo, um componente A pode estar aguardando o retorno de um valor X ao executar um método do componente B; porém, B pode retornar um valor Y, gerando uma falha. Não faz parte do escopo dessa fase de teste o tratamento de interfaces com outros sistemas (integração entre sistemas). Essas interfaces são testadas na fase de teste de sistema, apesar de, a critério do gerente de projeto, estas interfaces podem ser testadas mesmo antes de o sistema estar plenamente construído. Teste de sistema Na fase de teste de sistema, o objetivo é executar o sistema sob ponto de vista de seu usuário final, varrendo as funcionalidades em busca de falhas em relação aos objetivos originais. Os testes são executados em condições similares – de ambiente, interfaces sistêmicas e massas de dados – àquelas que um usuário utilizará no seu dia-a-dia de manipulação do sistema. De acordo com a política de uma organização, podem ser utilizadas condições reais de ambiente, interfaces sistêmicas e massas de dados. Teste de aceitação Geralmente, os testes de aceitação são realizados por um grupo restrito de usuários finais do sistema, que simulam operações de rotina do sistema de modo a verificar se seu comportamento está de acordo com o solicitado. Teste formal conduzido para determinar se um sistema satisfaz ou não seus critérios de aceitação e para permitir ao cliente determinar se aceita ou não o sistema. Validação de um software pelo comprador, pelo usuário ou por terceira parte, com o uso de dados ou cenários especificados ou reais. Pode incluir testes funcionais, de configuração, de recuperação de falhas, de segurança e de desempenho. Teste de Software Teste de operação Nessa fase o teste é conduzido pelos administradores do ambiente final em que o sistema ou software entrará em ambiente produtivo. Vale ressaltar que essa fase é aplicável somente a sistemas de informação próprios de uma organização, cujo acesso pode ser feito interna ou externamente a essa organização. Nessa fase de teste devem ser feitas simulações para garantir que a entrada em produção do sistema será bem sucedida. Envolve testes de instalação, simulações com cópia de segurança dos bancos de dados, etc.. Em alguns casos um sistema entrará em produção para substituir outro e é necessário garantir que o novo sistema continuará garantindo o suporte ao negócio. Testes alfa e beta Em casos especiais de processos de desenvolvimento de software – sistemas operacionais, sistemas gerenciadores de bancos de dados e outros softwares distribuídos em escala nacional e internacional – os testes requerem fases também especiais antes do produto ser disponibilizado a todos os usuários. O período entre o término do desenvolvimento e a entrega é conhecido como fase alfa e os testes executados nesse período, como testes alfa. PRESSMAN afirma que o teste alfa é conduzido pelo cliente no ambiente do desenvolvedor, com este "olhando sobre o ombro" do usuário e registrando erros e problemas de uso. Completada a fase alfa de testes, são lançadas a grupos restritos de usuários, versões de teste do sistema denominadas versões beta. Ele também é um teste de aceitação voltado para softwares cuja distribuição atingirá grande número de usuários de uma ou várias empresas compradoras. PRESSMAN afirma que o teste beta é conduzido em uma ou mais instalações do cliente, pelo usuário final do software. Diferente do teste alfa, o desenvolvedor geralmente não está presente. Conseqüentemente, o teste beta é uma aplicação do software num ambiente que não pode ser controlado pelo desenvolvedor. O cliente registra todos os problemas (reais ou imaginários) que são encontrados durante o teste beta e os relata ao desenvolvedor em intervalos regulares. Com o resultado dos problemas relatados durante os testes beta, os engenheiros de software fazem modificações e depois se preparam para liberar o produto de software para toda a base de clientes. A comunidade do teste de software usa o termo teste gama de forma sarcástica referindo-se aos produtos que são mal testados e são entregues aos usuários finais para que estes encontrem os defeitos já em fase de produção. Candidato a lançamento Ultimamente, e principalmente na comunidade de software livre, é comum utilizar o termo candidato a lançamento (release candidate) para indicar uma versão que é candidata a ser a versão final, em função da quantidade de erros encontradas. Tais versões são um passo além do teste beta, sendo divulgadas para toda a comunidade. Papéis Segue abaixo alguns dos papéis que uma pessoa pode desenvolver num projeto de teste de software. Uma pessoa pode acumular mais de um dos papéis citados, de acordo com características e restrições de projetos de desenvolvimento de software nas quais estejam inseridas. Nas fases de teste de unidade e de integração, por exemplo, os papéis de arquiteto de teste e analista de teste podem ser assumidos pelo analista de sistemas do projeto; o papel de testador pode ser assumido pelo programador ou por um segundo programador que atue num processo de programação em pares. Na fase de teste de sistema, num contexto em que haja uma equipe de teste independente, pode haver profissionais acumulando os papéis de arquiteto de teste, analista de teste e testador. O líder (ou gerente) do projeto de testes é a pessoa responsável pela liderança de um projeto de teste específico, normalmente relacionado a um sistema de desenvolvimento, seja um projeto novo ou uma manutenção. Já o engenheiro (ou arquiteto) de teste é o técnico responsável pelo levantamento de necessidades relacionadas à montagem da infraestrutura de teste, incluindo-se o ambiente de teste, a arquitetura de solução, as restrições tecnológicas, as ferramentas de teste. É também responsável pela liderança técnica do trabalho de teste e pela comunicação entre a equipe de teste e a equipe de projeto (ou equipe de desenvolvimento). 94 Teste de Software O analista de teste é o técnico responsável pela operacionalização do processo de teste. Deve seguir as orientações do gerente de teste ou do arquiteto de teste para detalhar a forma de execução dos testes e as condições de teste necessárias. Também deve focar seu trabalho nas técnicas de teste adequadas à fase de teste trabalhada. Também no campo de análise, o analista de ambiente é o técnico responsável pela configuração do ambiente de teste e pela aplicação das ferramentas necessárias para tal. Esse profissional deve ser especializado em arquiteturas de solução e nos sistemas operacionais e softwares de infraestrutura que regem o ambiente. Ele será responsável por tornar disponível o ambiente de teste. O testador é o técnico responsável pela execução de teste. Ele deve observar as condições de teste e respectivos passos de teste documentados pelo analista de teste e evidenciar os resultados de execução. Em casos de execuções de teste mal-sucedidas, esse profissional pode também registrar ocorrências de teste (na maioria das vezes, defeitos) em canais através dos quais os desenvolvedores tomarão conhecimento das mesmas e tomarão as providências de correção ou de esclarecimentos. Por fim, o automatizador de teste é o técnico responsável pela automação de situações de teste em ferramentas. Ele deve observar as condições de teste e respectivos passos de teste documentados pelo analista de teste e automatizar a execução desses testes na ferramenta utilizada. Normalmente são gerados scripts de teste que permitam a execução de ciclos de teste sempre que se julgar necessário, desde é claro, que sejam garantidas as mesmas condições iniciais do ciclo de teste (valores de dados, estados dos dados, estados do ambiente, etc..) Artefatos O processo de teste de software pode produzir diversos artefatos. O caso de teste geralmente consiste de uma referência a um identificador ou requisito de uma especificação, pré-condições, eventos, uma série de passos a se seguir, uma entrada de dados, uma saída de dados, resultado esperado e resultado obtido. A série de passos (ou parte dela) pode estar contida num procedimento separado, para que possa ser compartilhada por mais de caso de teste. Um script de teste é a combinação de um caso de teste, um procedimento de teste e os dados do teste. Uma coleção de casos de teste é chamada de suite de teste. Geralmente, ela também contém instruções detalhadas ou objetivos para cada coleção de casos de teste, além de uma seção para descrição da configuração do sistema usado. A especificação de teste é chamada plano de teste. [1] MYERS, 2004, p. 8 [2] MYERS, 2004, p. 5 [3] Michael Newman (28 de junho de 2002). Software Errors Cost U.S. Economy $59.5 Billion Annually: NIST Assesses Technical Needs of Industry to Improve Software-Testing (http:/ / www. nist. gov/ public_affairs/ releases/ n02-10. htm) (em inglês). NIST. Página visitada em 17 de novembro de 2008. [4] MYERS, 2004, p. 9 [5] MYERS, 2004, p. 10 [6] Jiantao Pan (1999). Software Testing (http:/ / www. ece. cmu. edu/ ~koopman/ des_s99/ sw_testing/ ) (em inglês). Universidade Carnegie Mellon. Página visitada em 1 de dezembro de 2008. [7] James Bach (Junho de 1999). Risk and Requirements-Based Testing (http:/ / www. satisfice. com/ articles/ requirements_based_testing. pdf) (em inglês). IEEE. Página visitada em 17 de novembro de 2008. [8] MYERS, 2004, p. 136 [9] MYERS, 2004, p. 91 95 Teste de Software Bibliografia • KOSCIANSKI, A., Soares, Novatec, M. S. Qualidade de Software, 2006 • PRESSMAN, R. S., McGraw Hill, Engenharia de Software, 2002 • RIOS, E., BASTOS, A., CRISTALLI, R., MOREIRA, T., Martins Fontes, Base de conhecimento em teste de software, 2007 • MYERS, Glenford J., John Wiley & Sons, The Art of Software Testing, 2, Nova Jérsei: 2004. ISBN ISBN 0-471-46912-2 Ver também • • • • • Anexo:Lista de instituições pela qualidade Qualidade de software Gestão da qualidade Verificação formal Otimização em engenharia de software. Ligações externas • Guia de gerenciamento de teste (http://www.ruleworks.co.uk/testguide) Documentação de software A documentação de software descreve cada parte do código fonte, geralmente uma função, uma classe, um simples trecho ou módulo. Consiste também no conjunto de manuais gerais e técnicos, além de diagramas explicando o funcionamento de um software como um todo ou cada parte dele. 96 Manutenção de software Manutenção de software Em engenharia de software, manutenção de software é o processo de melhoria e otimização de um software já desenvolvido (versão de produção), como também reparo de defeitos. A manutenção do software é uma das fases do processo de desenvolvimento de software, e ocorre a seguir a entrada do software em produção. Esta fase envolve: • mudanças no software para corrigir defeitos e deficiências que foram encontrados durante a utilização pelo usuário • novas funcionalidades para melhorar a aplicabilidade e usabilidade do software. A manutenção do software envolve inúmeras técnicas específicas. Uma das técnicas é separação estática, a qual é usada para identificar todos os códigos de programa que são afetados por alguma variável. Isto é geralmente útil em programas de refatoração de código que foram especialmente útil em assegurar preparação para bug do milênio. A fase de manutenção de software é uma parte explicita do modelo em cascata do processo de desenvolvimento de software a qual foi criada durante a fase de programação estruturada da ciência da computação. O outro modelo principal, o modelo em espiral, foi desenvolvido durante a fase de orientação ao objeto da engenharia de software, não faz nenhuma menção explicita a fase de manutenção. Independentemente disto, esta atividade é importante, considerando o fato que dois terços do custo do tempo de vista do sistema de software envolve manutenções. No ambiente de desenvolvimento de software formal, a equipe ou organização de desenvolvimento deverá ter algum mecanismo para documentar e rastrear os defeitos e deficiências. O software é disponibilizado com problemas porque a organização decide a utilidade e valor do software a um nível de qualidade particular pesando o impacto de deficiências ou defeitos desconhecidos. Os problemas conhecidos são normalmente registrados em um documento de considerações operacionais ou notas de implantação de forma que os usuários do software são capazes de contornar os problemas conhecidos e que irão ser descobertos quando o uso do software incapacitar tarefas particulares. Com a implantação do software, outros defeitos e deficiências não documentadas serão descobertos pelos usuários de software, Tão logo tais problemas sejam reportados para a organização de desenvolvimento, eles passaram a fazer parte do rastreamento de defeitos do sistema. As pessoas envolvidas na fase de manutenção de software irão trabalhar no problemas conhecidos, localizá-los, e preparar novas versões do software, conhecidas como versões de manutenção, a qual ira atualizar a documentação de problemas. Ver também • Software • Gerenciamento de Projeto • Fragilidade do software Ligações externas • • • • • Paper on Software Maintenance Maturity Model [1] (from University of Kentuky) software manutenção Maturity Model [2] Paper on Software Maintenance as Part of the Software Life Cycle [3] (da Universidade de Tufts) Journal of Software Maintenance [4] Software entropy [5] 97 Manutenção de software Referências [1] [2] [3] [4] [5] http:/ / selab. netlab. uky. edu/ homepage/ April%20Huffman%20Abran%20Dumke%20Journal%202005. pdf http:/ / www. s3m. ca http:/ / hepguru. com/ maintenance/ Final_121603_v6. pdf http:/ / www3. interscience. wiley. com/ cgi-bin/ jhome/ 5391/ http:/ / www. pragmaticprogrammer. com/ ppbook/ extracts/ no_broken_windows. html CMMI O CMMI (Capability Maturity Model Integration) é um modelo de referência que contém práticas (Genéricas ou Específicas) necessárias à maturidade em disciplinas específicas (Systems Engineering (SE), Software Engineering (SW), Integrated Product and Process Development (IPPD), Supplier Sourcing (SS)). Desenvolvido pelo SEI (Software Engineering Institute) da Universidade Carnegie Mellon, o CMMI é uma evolução do CMM e procura estabelecer um modelo único para o processo de melhoria corporativo, integrando diferentes modelos e disciplinas. O CMMI foi baseado nas melhores práticas para desenvolvimento e manutenção de produtos. Há uma ênfase tanto em engenharia de sistemas quanto em engenharia de software, e há uma integração necessária para o desenvolvimento e a manutenção. A versão atual do CMMI (versão 1.2) apresenta três modelos: • CMMI for Development (CMMI-DEV) publicada em agosto de 2006. Dirige-se ao processo de desenvolvimento de produtos e serviços. • CMMI for Acquisition (CMMI-ACQ) publicada em novembro de 2007. Dirige-se aos processos de aquisição e terceirização de bens e serviços. • CMMI for Services (CMMI-SVC) publicada em fevereiro de 2009. Dirige-se aos processos de empresas prestadoras de serviços. Uma das premissas do modelo é "A qualidade é influenciada pelo processo", e seu foco é "Melhorar processo de uma empresa". Histórico Os processos de melhoria nasceram de estudos realizados por Deming (Out of the Crisis), Crosby (Quality is Free: The Art of Making Quality Certain) e Juran, cujo objetivo principal era a melhoria da capacidade dos processos. Entende-se por capacidade de um processo a habilidade com que este alcança o resultado desejado. Um modelo tem como objetivo estabelecer - com base em estudos, históricos e conhecimento operacional - um conjunto de "melhores práticas" que devem ser utilizadas para um fim específico. O CMMI tem como origens em três outros modelos de maturidade - SW-CMM (SEI Software CMM), EIA SECM (Electronic Industries Alliances's Systems Engineer Capability Model) e IPD-CMM (Integrated Product Development CMM). 98 CMMI 99 Dimensões O CMM foi construído considerando três dimensões principais: pessoas, ferramentas e procedimentos. O processo serve para unir essas dimensões. Disciplinas O processo inclui três disciplinas ou corpos de conhecimento (body of knowledges), sendo eles: • • • • Engenharia de sistemas Engenharia de software Desenvolvimento integrado de produtos e processos (IPPD - Integrated Product and Process Development) Fontes de abastecimento (Supplier sourcing) A engenharia de software é similar à engenharia de sistemas em relação às áreas de processo, apenas com enfoque diferente nos processos. As áreas de processo requeridas para engenharia de sistemas são as mesmas para engenharia de software, mas o nível de maturidade que é diferente. Representações O CMMI possui duas representações: "contínua" ou "por estágios". Estas representações permitem à organização utilizar diferentes caminhos para a melhoria de acordo com seu interesse. Representação Continua Possibilita à organização utilizar a ordem de melhoria que melhor atende os objetivos de negócio da empresa. É caracterizado por Níveis de Capacidade (Capability Levels): • • • • • • Nível 0: Incompleto (Ad-hoc) Nível 1: Executado (Definido) Nível 2: Gerenciado / Gerido Nível 3: Definido Nível 4: Quantitativamente gerenciado / Gerido quantitativamente Nível 5: Em otimização (ou Optimizado) Nesta representação a maturidade é medida por processos separadamente, onde é possível ter um processo com nível um e outro processo com nível cinco, variando de acordo com os interesses da empresa. No nível um o processo é executado de modo a completar o trabalho necessário para produzir o trabalho necessário. Nível dois é sobre planejar a execução e confrontar o executado contra o que foi planejado. No próximo nível o processo é construído sobre as diretrizes do processo existente, e é mantido uma descrição do processo. O penúltimo nível é quando o processo é gerenciado quantitativamente através de estatísticas e outras técnicas. No último nível o processo gerido quantitativamente é alterado e adaptado para atender às necessidades negociais/estratégicas da empresa. A representação contínua é indicada quando a empresa deseja tornar apenas alguns processos mais maduros, quando já utiliza algum modelo de maturidade contínua ou quando não pretende usar a maturidade alcançada como modelo de comparação com outras empresas. CMMI 100 Representação Por Estágios Disponibiliza uma seqüência pré-determinada para melhoria baseada em estágios que não deve ser desconsiderada, pois cada estágio serve de base para o próximo. É caracterizado por Níveis de Maturidade (Maturity Levels): • • • • • Nível 1: Inicial (Ad-hoc) Nível 2: Gerenciado / Gerido Nível 3: Definido Nível 4: Quantitativamente gerenciado / Gerido quantitativamente Nível 5: Em otimização Nesta representação a maturidade é medida por um conjunto de processos. Assim é necessário que todos os processos atinjam nível de maturidade dois para que a empresa seja certificada com nível dois. Se quase todos os processos forem nível três, mas apenas um deles estiver no nível dois a empresa não irá conseguir obter o nível de maturidade três. Esta representação é indicada quando a empresa já utiliza algum modelo de maturidade por estágios, quando deseja utilizar o nível de maturidade alcançado para comparação com outras empresas ou quando pretende usar o nível de conhecimento obtido por outros para sua área de atuação. Áreas de Processo O modelo CMMI v1.2 (CMMI-DEV) contém 22 áreas de processo. Em sua representação por estágios, as áreas são divididas da seguinte forma: Nível 1: Inicial (Ad-hoc) Não possui áreas de processo. Nível 2: Gerenciado / Gerido • • • • • • • Gerenciamento de Requisitos - REQM (Requirements Management) Planejamento de Projeto - PP (Project Planning) Acompanhamento e Controle de Projeto - PMC (Project Monitoring and Control) Gerenciamento de Acordo com Fornecedor - SAM (Supplier Agreement Management) Medição e Análise - MA (Measurement and Analysis) Garantia da Qualidade de Processo e Produto - PPQA (Process and Product Quality Assurance) Gerência de Configuração - CM (Configuration Management) Nível 3: Definido • • • • • • • • • • • Desenvolvimento de Requisitos - RD (Requirements Development) Solução Técnica - TS (Technical Solution) Integração de Produto - PI (Product Integration) Verificação - VER (Verification) Validação - VAL (Validation) Foco de Processo Organizacional - OPF (Organizational Process Focus) Definição de Processo Organizacional - OPD (Organizational Process Definition) Treinamento Organizacional - OT (Organizational Training) Gerenciamento Integrado de Projeto - IPM (Integrated Project Management) Gerenciamento de Riscos - RSKM (Risk Management) Análise de Decisão e Resolução - DAR (Decision Analysis and Resolution) Nível 4: Quantitativamente gerenciado / Gerido quantitativamente • Desempenho de Processo Organizacional - OPP (Organizational Process Performance) • Gerenciamento Quantitativo de Projeto - QPM (Quantitative Project Management) CMMI 101 Nível 5: Em otimização • Inovação Organizacional e Implantação - OID (Organizational Innovation and Deployment) • Análise Causal e Resolução - CAR (Causal Analysis and Resolution) Modelos e áreas de processo As áreas de processo variam com base no modelo escolhido, não sendo as mesmas áreas para todos os modelos (CMMI-DEV, CMMI-ACQ ou CMMI-SVC). ISO/IEC 15504 A ISO/IEC_15504, também conhecida como SPICE, define um "processo para relatórios técnicos no assessoramento em desenvolvimento de software", e similarmente ao CMMI possui níveis de maturidade para cada processo. O CMMI não é baseado nesta norma, mas sim compatível. Histórico de Avaliações Até o ano de 2002, os EUA tinham realizado 1,5 mil avaliações de CMMI, a Índia feito 153, o Reino Unido 103 e o Brasil apenas 15. Em 2004 a TATA Consultancy Services (empresa indiana) alcançou o nível 5 em todas as unidades da empresa, tendo sido avaliada inclusive a unidade brasileira (a primeira empresa presente no Brasil a receber o nível máximo na avaliação). Entre abril de 2002 e junho de 2006 foram conduzidas 1581 avaliações em 1377 organizações. Segue abaixo o resultado obtido pelas empresas na avaliação (resultados encaminhados para o SEI até 30 de junho de 2006): • • • • • • 18,2%: nível 5 (Optimizing); 4,4%: nível 4 (Quantitatively Managed); 33,8%: nível 3 (Defined); 33,3%: nível 2 (Managed); 1,9%: nível 1 (Initial); 8,4%: sem qualificação (Not Given). No Brasil, as seguintes empresas conseguiram realizar a certificação até o final, ou seja, alcançaram o nível 5 do CMMI (por ano da certificação): 2004 • TCS (TATA Consultancy Services) Brazil 2005 • IBM Brazil • EDS - Electronic Data Systems • Stefanini IT Solutions 2007 • Ci&T[1] • CPM Braxis[2] 2009 • Instituto Atlântico[3] • BRQ IT Services [1] (http:/ / sas. sei. cmu. edu/ pars/ pars_detail. aspx?a=9167) Ci&T Published Appraisal Results [2] (http:/ / sas. sei. cmu. edu/ pars/ pars_detail. aspx?a=10163) CPM Braxis Published Appraisal Results [3] (http:/ / sas. sei. cmu. edu/ pars/ pars_detail. aspx?a=13295) Instituto Atlântico Published Appraisal Results CMMI 102 Ver também • Melhoria de Processos de Software Brasileiro (MPS.BR) Ligações externas • CMMI Online Browser (http://www.cmmi.de/cmmi_v1.2/browser.html) (em inglês) • Lista contendo o resultado de todas as empresas avalidas pelo SEI no modelo CMMi (http://sas.sei.cmu.edu/ pars/pars.aspx) (em inglês) • Lista de Empresas CMMI no Brasil (http://blogcmmi.com.br/avaliacao/lista-de-empresas-cmmi-no-brasil) (em português) • Módulos e modelos para CMMI (http://www.sei.cmu.edu/cmmi/models/) (em inglês) • Blog CMMI (http://www.blogcmmi.com.br) (em português) • mini CMMI-survey (http://survey.cmmi.hu/). SQI Hungarian Software Quality Consulting Institute Ltd. (2007). Página visitada em 07 August de 2007. SPICE SPICE (acrônimo de Simulated Program with Integrated Circuits Emphasis, ou Programa de Simulação com Ênfase em Circuitos Integrados) é um software de simulação de circuitos analógicos. É uma poderosa ferramenta usada para testar, e antever comportamento de circuitos contendo circuitos integrados, resistores, transistores, capacitores, diodos e outros componentes elétricos e eletrônicos. História O software foi desenvolvido no ano de 1975 pelos pesquisadores Larry Nagle e Donald Petterson nos laboratórios de pesquisas sobre eletrônica da Faculdade de Engenharia Elétrica e Ciências da Computação da Universidade da Califórnia, campus de Berkeley. Tanto essa versão, como a segunda versão (criada em 1983) foram codificadas utilizando a linguagem de programação Fortran e rodados em mainframes. A partir da terceira versão, o programa foi codificado em C, mas utilizando a sintaxe de Fortran para descrever circuitos. Algumas versões comerciais mantém compatibilidade com a versão de Berkeley, mas outras adcionaram extensões que incompatibilizou essas versões com a versão de Berkeley. As versões mais recentes incluíram interfaces gráficas. Algoritmos diferentes são usados para resolver diferentes tipos de circuitos. Por exemplo, para circuitos não-lineares (circuitos que possuem elementos não-lineares), é utilizado o método de Newton-Raphson. ... Versões comerciais • • • • • • • PSpice/OrCAD SPICE OPUS HSpice (para UNIX) HSIM MicroCad Dr. Spice T-Spice • Intusoft • Spice-It! • SIMetrix (disponível para Windows e Linux) SPICE • • • • • • • • • • • • • • • 103 TopSPICE NG-spice MultiSIM SmartSpice TINA Spectre Eldo UltraSim MacSpice NanoSim NSPICE B2SPICE ICAP/4 TINA-TI Proteus ISIS (Labcenter Electronics) O famoso programa Electronics Workbench também é baseado no SPICE. Versões Open Source ou Freeware ngspice [1] tclspice [2] LTSpice [3] Links úteis Lista de programas de simulação e projeto de circuitos eletrônicos [4] Referências [1] [2] [3] [4] http:/ / ngspice. sourceforge. net/ http:/ / tclspice. sourceforge. net/ http:/ / www. linear. com/ designtools/ software/ http:/ / www. terrypin. dial. pipex. com/ ECADList. html ISO 12207 ISO 12207 ISO 12207 é uma norma definida pela International Organization for Standardization, que se aplica em engenharia de software. Esta estabelece um processo de ciclo de vida do software, contendo processos, atividades e são aplicadas durante a aquisição e configuração dos serviços do sistema, de forma a melhorá-los. Esta norma tem como principal objetivo fornecer uma estrutura comum para que o adquirente, fornecedor, desenvolvedor, mantenedor, operador, gerentes e técnicos, envolvidos com o desenvolvimento de software, utilizem uma linguagem comum que é estabelecida na forma de processos bem definidos. A estrutura da norma foi concebida de maneira a ser flexível, modular e adaptável às necessidades de quem a utiliza. Para isso, está fundamentada em dois princípios básicos: modularidade e responsabilidade. Modularidade, no sentido de processos com mínimo acoplamento e máxima coesão. Responsabilidade, no sentido de estabelecer um responsável único por cada processo, facilitando a aplicação da norma em projetos, onde várias pessoas podem estar legalmente envolvidas. Conforme citado anteriormente, a norma é composta por um conjunto de processos, atividades e tarefas que podem ser adaptados de acordo com os projetos de software. Estes processos são classificados em três tipos: fundamentais, de apoio e organizacionais. Os processos fundamentais são instanciados de acordo com a situação. Enquanto que os processos de apoio e organizacionais devem existir independentemente da organização e do projeto que está sendo executado. Basicamente, é correspondido ao ISO 12207. MPS/Br O MPS.BR ou Melhoria de Processos do Software Brasileiro é simultaneamente um movimento para a melhoria da qualidade (Programa MPS.BR) e um modelo de qualidade de processo (Modelo MPS) voltada para a realidade do mercado de pequenas e médias empresas de desenvolvimento de software no Brasil. Ele é baseado nas normas ISO/IEC 12207 e ISO/IEC 15504 e na realidade do mercado brasileiro, bem como é compatível com o CMMI. No Brasil, uma das principais vantagens do modelo é seu custo reduzido de certificação em relação as normas estrangeiras, sendo ideal para micro, pequenas e médias empresas. Um dos objetivos do projeto é replicar o modelo na América Latina, incluindo o Chile, Argentina, Costa Rica, Peru e Uruguai. O projeto tem apoio do Ministério da Ciência e Tecnologia, da FINEP e do Banco Interamericano de Desenvolvimento. No Brasil o projeto é desenvolvido pela Softex, interagindo com as universidades e com o Governo Federal. Motivação O Brasil é um país cujo desenvolvimento de produtos de software está entre os maiores do mundo, e a cada dia, aumenta o nível de exigência por parte dos clientes no que diz respeito à qualidade e complexidade dos produtos. A partir deste ponto, podemos observar que as empresas estão buscando cada vez mais a maturidade nos seus processos de software para atingir padronizações de qualidade e produtividade internacionais, que são essenciais para a sobrevivência no mercado de TI. Porém, o custo de uma certificação para uma empresa pode ser de até US$ 400 mil, o que se torna inviável para empresas de micro, pequeno e médio porte. Então, em uma parceria entre a Softex, Governo e Universidades, surgiu 104 MPS/Br 105 o projeto MPS.Br (melhoria de processo de software brasileiro), que é a solução brasileira compatível com o modelo CMMI, está em conformidade com as normas ISO/IEC 12207 e 15504, além de ser adequado à realidade brasileira.. O modelo O MPS.Br é dividido em 3 partes: MR-MPS, MA-MPS, MN-MPS. MR-MPS – Modelo de referência para melhoria do processo de software O MPS.BR apresenta 7 níveis de maturidade (o que é um diferencial em relação aos outros padrões de processo) que são: • • • • • • • A - Em Otimização; B - Gerenciado quantitativamente; C - Definido; D - Largamente Definido; E - Parcialmente Definido; F - Gerenciado; G - Parcialmente Gerenciado. Cada nível de maturidade possui suas áreas de processo, onde são analisados os processos fundamentais (aquisição, gerência de requisitos, desenvolvimento de requisitos, solução técnica, integração do produto, instalação do produto, liberação do produto), processos organizacionais (gerência de projeto, adaptação do processo para gerência de projeto, análise de decisão e resolução, gerência de riscos, avaliação e melhoria do processo organizacional, definição do processo organizacional, desempenho do processo organizacional, gerência quantitativa do projeto, análise e resolução de causas, inovação e implantação na organização) e os processos de apoio (garantia de qualidade, gerência de configuração, validação, medição, verificação, treinamento). Em seguida vem a Capacidade, onde são obtidos os resultados dos processos analisados, onde cada nível de maturação possui um número definido de capacidades a serem vistos. • • • • • • • • • AP 1.1 - O processo é executado; AP 2.1 - O processo é gerenciado; AP 2.2 - Os produtos de trabalho do processo são gerenciados; AP 3.1 - O processo é definido; AP 3.2 - O processo está implementado; AP 4.1 - O processo é medido; AP 4.2 - O processo é controlado; AP 5.1 - O processo é objeto de inovações; AP 5.2 - O processo é otimizado continuamente. MA-MPS – Método de avaliação para melhoria do processo de software Tem como objetivo orientar a realização de avaliações, em conformidade com a norma ISO/IEC 15504, em empresa e organizações que implementaram o MR-MPS. Avaliação MA-MPS: • Equipe de avaliação: 3 a 8 pessoas, sendo: 1 avaliador líder no mínimo 1 avaliador adjunto no mínimo 1 técnico da empresa • Duração: 2 a 4 dias; • Validade: 3 anos; MPS/Br 106 Estruturação da Avaliação: • Planejar e preparar avaliação Plano de Avaliação / Descrição dos indicadores de processo; • Conduzir Avaliação Resultado da avaliação; • Relatar resultados Relatório da avaliação; • Registrar e publicar resultados Banco de dados Softex (Ver portal MPS.BR nas 'Ligações Externas') MPS.BR MN-MPS – Modelo de negócio para melhoria do processo de software Instituições que se propõem a implantar os processos MPS.Br (Instituições Implementadoras) podem se credenciar através de um documento onde é apresentada a instituição proponente, contendo seus dados com ênfase na experiência em processos de software, estratégia de implementação do modelo, estratégia para seleção e treinamento de consultores para implementação do MR.MPS, estratégia para seleção e treinamento de avaliadores, lista de consultores de implementação treinados no modelo e aprovados em prova específica, lista de avaliadores treinados no modelo e aprovados em prova específica. Cursos e certificação A Softex realiza cursos para formação de consultores, compradores e avaliadores MPS.BR. São ao todo 4 cursos: • • • • Curso de Introdução - C1 Curso de Implementação - C2 Curso de Avaliaçao - C3 Curso de Aquisição - C4 Periodicamente, são realizadas provas em nível nacional para certificar profissionais em cada um dos cursos descritos acima. Tanto os cursos e as provas são realizadas nos Agentes SOFTEX em cada estado, por exemplo: • • • • • • SOFTEX Campinas (SP) ITS (São Paulo - SP) FUMSOFT (Belo Horizonte - MG) RIOSOFT (Rio de Janeiro - RJ) SOFTSUL (Porto Alegre - RS) Entre outras Próximos passos O modelo MPS.Br tem como objetivo implementar o Modelo de Referência para melhoria de processo de software em 120 empresas. E como objetivos secundários, a disseminação em diversos locais do país, capacitação no uso do modelo e o credenciamento de instituições implementadoras e avaliadoras do modelo, especialmente instituições de ensino e centros tecnológicos e também a implementação e avaliação do modelo com foco em grupos de empresas. A avaliação conjunta de grupos empresariais, objetiva a redução dos custos, porém há uma perda de foco, pois não há uma especificidade para cada empresa e sim um mesmo modelo de referência para todas elas. O MPS.Br já é uma realidade, e dentro de alguns anos, existe um projeto de implantação em seis países da América Latina, são eles: Chile, Argentina, Costa Rica, Peru, Uruguai e Cuba. MPS/Br Ver também • CMMI • CMM Ligações externas • Softex - Portal MPS.BR [1] • Comparação do MPS.Br com o CMMI [2] Referências [1] http:/ / www. softex. br/ mpsbr/ [2] http:/ / www. pontodatecnologia. com. br/ 2006/ 08/ comparao-do-mpsbr-com-o-cmmi. html 107 Fontes e Editores da Página Fontes e Editores da Página Engenharia de software Fonte: http://pt.wikipedia.org/w/index.php?oldid=21853734 Contribuidores: 200.185.142.xxx, 200.222.171.xxx, Abigar, Abmac, Adailton, Alchimista, Alessandro70, Alexg, André Villeneuve, Arlima, Arthur Buchsbaum, Belanidia, Bonás, Brunoslessa, Chentz, Clayton1975brasilmg, Cuattrin, Daniloleke, Darwinius, Der kenner, Dietox, Ebalter, Eduamaral20, Engenharia de Software Brasil, Ermeson, FML, Felipe Pinto, Fernando S. Aldado, Furutajp, Gbiten, Get It, Girino, Hgfernan, Hugo Nagatomo, IceMan, Ikarohuhuhu, Inesalegria, Isa.souza, JaimeChiquita111, Jcmo, Jo Lorib, JoaoMiranda, Jorge, Jorge.roberto, Kyriosdata, Leonardo.stabile, LeonardoG, Lusitana, Luís Felipe Braga, Macau500, Manuel Anastácio, Micato, Miguelcr, Muriel Gottrop, Nuno Tavares, OS2Warp, PauloColacino, PedroBonifacio, PedroPVZ, Profvalente, Raimundo Norberto, Rbarroso, Rengolin, Rui Silva, Sergio Kaminski, Sica, Teles, ThiagoRuiz, Tjk4236b, Tonsig, Tumnus, Vigia, Xexeo, ZiroCool, 229 edições anónimas Software Engineering Body of Knowledge Fonte: http://pt.wikipedia.org/w/index.php?oldid=13869033 Contribuidores: Arlima, Ermeson, Felipe Pinto, Leonardo.stabile, OS2Warp, Profvalente, Ruy Pugliesi, Xexeo, 3 edições anónimas Requisitos de Software Fonte: http://pt.wikipedia.org/w/index.php?oldid=15720647 Contribuidores: Alcemir felix, Amorujao, AndrelmGomes, Brunosl, Brunoslessa, Eamaral, Flcsilva, Francisco Leandro, Hgfernan, JoaoRomao, Kim richard, Mrcl, Oalexandrino, Orlando, Rpscampos, Sotu, Steve bruto, Tpa87, Yanguas, 79 edições anónimas Projeto de Software Fonte: http://pt.wikipedia.org/w/index.php?oldid=17890135 Contribuidores: Teste de software Fonte: http://pt.wikipedia.org/w/index.php?oldid=21190189 Contribuidores: 333, Adailton, Adersonbs, Alessandro70, Camilor, Cibs, Clara C., Craucarvalho, Daemorris, Danilo.camargo, Dpc01, Edeunix, Eduacorrea, Eduardoferreira, Fabricioaguirre, Fredxavier, GOE3, GRS73, Girino, Giro720, IceMan, Jic, Josimarp, Lechatjaune, Leobopp, Leonardo.stabile, Lijealso, Lmozero, Lusitana, Mwaldeck, Nuno Tavares, OS2Warp, Paulo Augusto Nardi, PedroPVZ, Profvalente, Psargaco, Rei-artur, Ricardo.bernardes, Rodrigo Couto e Silva, Rodrigonw, Sam, Sergio Kaminski, Thevirus, Thiago.jimmy, Thiarlei, Tonsig, Xandi, Xexeo, 151 edições anónimas Gerência de Configuração de Software Fonte: http://pt.wikipedia.org/w/index.php?oldid=21738825 Contribuidores: Adailton, Alessandro70, Bisbis, Bjverde, Brunosl, Cledermr, Girino, Leonardo.stabile, Mwaldeck, OS2Warp, Profvalente, Ricardo.bernardes, 33 edições anónimas Processos de Engenharia de Software Fonte: http://pt.wikipedia.org/w/index.php?oldid=16546588 Contribuidores: Burmeister, Furutajp, 1 edições anónimas Qualidade de Software Fonte: http://pt.wikipedia.org/w/index.php?oldid=13311707 Contribuidores: Adailton, Al Lemos, Alcidesqan, Arlima, Arouck, Bisbis, Brunoslessa, Cidcn, Eduardoferreira, Felipe Pinto, Fredxavier, Girino, Giro720, Heymar Nunes Jr., Leonardo.stabile, Leonardofp, Luís Felipe Braga, Nice poa, OS2Warp, Pietro Roveri, Rodrigonw, Sedibr, Sergio Kaminski, Xexeo, 35 edições anónimas Modelos ciclo de vida Fonte: http://pt.wikipedia.org/w/index.php?oldid=21648855 Contribuidores: 555, Adailton, Alessandro70, Cesar augusto silva, CostaJES, [email protected], Gean, Julianop, Mecanismo, OS2Warp, Profvalente, Segito, 25 edições anónimas Análise Estruturada Fonte: http://pt.wikipedia.org/w/index.php?oldid=17057613 Contribuidores: Projeto Estruturado Fonte: http://pt.wikipedia.org/w/index.php?oldid=20890320 Contribuidores: Hermógenes Teixeira Pinto Filho, Reynaldo, 3 edições anónimas Programação Estruturada Fonte: http://pt.wikipedia.org/w/index.php?oldid=478040 Contribuidores: 200.198.73.xxx, AndrelmGomes, E2mb0t, Get It, GoEThe, Hgfernan, Jorge, Jorge.roberto, Lcavique, Leonardo.stabile, Moretti, OS2Warp, Ramisses, Wbrito, 13 edições anónimas Análise Essencial Fonte: http://pt.wikipedia.org/w/index.php?oldid=20787336 Contribuidores: Elvis Pellizari, Reynaldo, Rjclaudio, T.go, 10 edições anónimas SADT Fonte: http://pt.wikipedia.org/w/index.php?oldid=8418284 Contribuidores: Artdanila, OS2Warp, 3 edições anónimas DFD Fonte: http://pt.wikipedia.org/w/index.php?oldid=4160520 Contribuidores: Beria, GOE2, JRMarque, John André, OS2Warp, Reynaldo, Sazinho, Tumnus, Zetempesta, 39 edições anónimas Modelo de Entidades e Relacionamentos Fonte: http://pt.wikipedia.org/w/index.php?oldid=17057540 Contribuidores: Orientação a Objetos Fonte: http://pt.wikipedia.org/w/index.php?oldid=3899338 Contribuidores: Adailton, Agnaldo.anjos, Albmont, Alchimista, Alexandrepastre, Brunoslessa, ChristianH, Clara C., Dayane C., Denommus, Denys, Dmendes, Dr.Stefano, Eamaral, Edeyson, FML, FelipeVargasRigo, GOE, GRS73, Gean, Giro720, Herbertdeborba, Hgfernan, Iacobus, Jorge.roberto, João Carvalho, Juntas, Kelving12, Lampiao, Leandromartinez, Leonardo.stabile, LeonardoG, LeonardoRob0t, Lourenzo, Lucas Avanço, Luís Felipe Braga, Manuel Anastácio, MarceloB, Mauro Babinski, Nuno Tavares, OS2Warp, Pablodalloglio, Paulo Augusto Nardi, PauloColacino, Rafael.afonso, Rbourdon, Renatoalbano, Rg, Ricvelozo, Rjclaudio, Rlopes, Roma6, Romeuzinh, Salamat, Santana-freitas, Sica, Tschick, Tumnus, Wanc, Xandi, Xurumelous, Yanguas, Zico Jô, 196 edições anónimas Rational Unified Process Fonte: http://pt.wikipedia.org/w/index.php?oldid=8461572 Contribuidores: Addycunha, Alcidesqan, Alessandro70, Allanvb, André Villeneuve, Bonás, Brunobaco, CommonsDelinker, Epinheiro, Felippe Scheidt, GOE2, Gbiten, Get It, Hugo Nagatomo, Infinito, Jbernab, Jphilips, Juntas, Lameiro, Lechatjaune, Leonardo.stabile, LeonardoG, LucianoMaia, Luís Felipe Braga, M4c0, Manuel Anastácio, Marcelo rodrigues, Mnmadeira, Mwaldeck, Mário e Dário, Ntavares, Nuno Tavares, OS2Warp, Oritemis, PedroPVZ, Pietro Roveri, Profvalente, RafaAzevedo, Reynaldo, Ricardoroberto, Roberto mms, Rodrigozanatta, Ruy Pugliesi, Servant, Stegop, Villarinho, Wbrito, 209 edições anónimas Scrum Fonte: http://pt.wikipedia.org/w/index.php?oldid=22025178 Contribuidores: Al Lemos, Bernardovc, Bisbis, Candian, CommonsDelinker, Darwinius, Der kenner, Etore.Santos, FelipeVargasRigo, Fernandosantucci, Franciosi, Jbernab, Jonilsonfraga, Juukyuu, Leonardo.stabile, M3thos, Marcelloevanessa, Marcio68almeida, Mca.leite, Mwaldeck, OS2Warp, Pietro Roveri, Porantim, Recoma, Ricardo wellington, Rodm67, Tiago de Jesus Neves, Tiagonmas, Tilgon, Ts42, Vip Ice Man, 95 edições anónimas Programação extrema Fonte: http://pt.wikipedia.org/w/index.php?oldid=21616816 Contribuidores: 555, Arcanj0, Brunoslessa, Daemorris, DavidFerreira, Dr.Stefano, Dwildt, E2m, Ebalter, FML, Girino, Ivan Sanchez, Jic, Jorge.roberto, JrBr, Leonardo.stabile, Lijealso, Marcelloevanessa, Marcelo Pinto 70, Mnmadeira, Mwaldeck, Panglossa, Pietro Roveri, Rbarroso, Vinicius.teles, Wenderf, 78 edições anónimas Microsoft Solution Framework Fonte: http://pt.wikipedia.org/w/index.php?oldid=18756734 Contribuidores: Hermógenes Teixeira Pinto Filho, Rui Silva, 6 edições anónimas Diagrama de contexto Fonte: http://pt.wikipedia.org/w/index.php?oldid=20151084 Contribuidores: Belanidia, Chico, Elg, Infinito, Lijealso, Nice poa, Rafaeldapontebarbosa, 11 edições anónimas Diagrama de fluxos de dados Fonte: http://pt.wikipedia.org/w/index.php?oldid=4301939 Contribuidores: Beria, GOE2, JRMarque, John André, OS2Warp, Reynaldo, Sazinho, Tumnus, Zetempesta, 39 edições anónimas Diagrama entidade relacionamento Fonte: http://pt.wikipedia.org/w/index.php?oldid=20487496 Contribuidores: Bjverde, Danychvaicer, Jml, LauroMoura, Leonardo.stabile, LeonardoG, Lijealso, Mschlindwein, OS2Warp, Profvalente, Reynaldo, Ricardo Terra, ThiagoRuiz, Xexeo, Yeikicosta, Zeidon, 37 edições anónimas Dicionário de dados Fonte: http://pt.wikipedia.org/w/index.php?oldid=21277434 Contribuidores: Alquimista Digital, Andrea Bellino, CostaJES, Fredmaranhao, Leonardo.stabile, Silentwarrior, Tm, 19 edições anónimas Tabela de decisão Fonte: http://pt.wikipedia.org/w/index.php?oldid=12371732 Contribuidores: Guguff, Jack Bauer00, João Carvalho, 2 edições anónimas Árvore de decisão Fonte: http://pt.wikipedia.org/w/index.php?oldid=20696945 Contribuidores: Joaopchagas2, João Carvalho, Spoladore, Tilgon, 1 edições anónimas Diagrama de transição de estados Fonte: http://pt.wikipedia.org/w/index.php?oldid=20689640 Contribuidores: Albertoivo, Chico, DalGond, Darwinius, Hyju, José Roberto A. JR., Leonardo.stabile, LeonardoG, Mauro Babinski, Nuno Tavares, O CoRVo, 8 edições anónimas Processo de desenvolvimento de software Fonte: http://pt.wikipedia.org/w/index.php?oldid=21685086 Contribuidores: Alchimista, Alessandro70, Alexanderps, André Villeneuve, Angoti, Ascn74, Braswiki, Colabardini, Daniloleke, Dvulture, Euclidespaim, FlavioMattos, Gagerred, Girino, Gunnex, Jbernab, Leonardo.stabile, Lourenzo, LucianeOspra, Marlosin, Mwaldeck, OS2Warp, Pietro Roveri, Pmattos, Profvalente, Rafael R. Faria, Raphaksf, Reynaldo, Rodrigo driessen, Sergio Kaminski, Teles, Tonsig, Utelemaco, Xexeo, 61 edições anónimas 108 Fontes e Editores da Página Análise de requisitos de software Fonte: http://pt.wikipedia.org/w/index.php?oldid=19859410 Contribuidores: Fernando S. Aldado, Gnramos, Jorgeegpf, Leonardo.stabile, SallesNeto BR, 3 edições anónimas Especificação de Programa Fonte: http://pt.wikipedia.org/w/index.php?oldid=7082255 Contribuidores: Alessandro70, Leonardo.stabile, Lijealso, Mwaldeck, OS2Warp, 5 edições anónimas Arquitetura de software Fonte: http://pt.wikipedia.org/w/index.php?oldid=20303533 Contribuidores: Adorilson, Alessandro70, Beria, Hermógenes Teixeira Pinto Filho, Jml, Leonardo.stabile, Lijealso, Luís Felipe Braga, Maddonde, Mrbar2000, Mwaldeck, Nilo Garcia, Pm wiki, 27 edições anónimas Programação de computadores Fonte: http://pt.wikipedia.org/w/index.php?oldid=21984206 Contribuidores: 193.126.243.xxx, Ademirfer, Alchimista, Angrense, Bonás, Cavasconcelos, Dante, the Wicked, Der kenner, Dpc01, Dracom, Dvulture, E2mb0t, Epinheiro, EuTuga, Fanneobom, Fnds, Francisco Paiva Junior, Girino, Gunnex, HecKel, Heldergeovane, Hgfernan, ISoron, Jonas AGX, Jorge, Jorge.roberto, João Carvalho, Juntas, Leandromartinez, Leonardo.stabile, Luís Felipe Braga, Manuel Anastácio, Marcelloevanessa, Muriel Gottrop, Mwaldeck, Nuno Tavares, OS2Warp, One People, Onjacktallcuca, Paulorcjr, Pediboi, Petrus Yuri, Pietro Roveri, Reynaldo, Ricardo Augustinis, Ricvelozo, Ronaldocostajr, Suisui, The fabio, TheThingBR, Wbrito, X360xSilent LightStep, 79 edições anónimas Teste de Software Fonte: http://pt.wikipedia.org/w/index.php?oldid=3491148 Contribuidores: 333, Adailton, Adersonbs, Alessandro70, Camilor, Cibs, Clara C., Craucarvalho, Daemorris, Danilo.camargo, Dpc01, Edeunix, Eduacorrea, Eduardoferreira, Fabricioaguirre, Fredxavier, GOE3, GRS73, Girino, Giro720, IceMan, Jic, Josimarp, Lechatjaune, Leobopp, Leonardo.stabile, Lijealso, Lmozero, Lusitana, Mwaldeck, Nuno Tavares, OS2Warp, Paulo Augusto Nardi, PedroPVZ, Profvalente, Psargaco, Rei-artur, Ricardo.bernardes, Rodrigo Couto e Silva, Rodrigonw, Sam, Sergio Kaminski, Thevirus, Thiago.jimmy, Thiarlei, Tonsig, Xandi, Xexeo, 151 edições anónimas Documentação de software Fonte: http://pt.wikipedia.org/w/index.php?oldid=21975352 Contribuidores: Alan ffm, FML, Hgfernan, Leonardo.stabile, Marcelloevanessa, Mwaldeck, ThiagoRuiz, 2 edições anónimas Manutenção de software Fonte: http://pt.wikipedia.org/w/index.php?oldid=20300517 Contribuidores: Al Lemos, Alessandro70, Beetstra, Girino, Leonardo.stabile, Mwaldeck, Profvalente, 6 edições anónimas CMMI Fonte: http://pt.wikipedia.org/w/index.php?oldid=21840139 Contribuidores: Brunoslessa, Chentz, ChristianH, Dayane C., Dobau, Dreispt, Dwandarti, Eugeniomartins, Felipe Pinto, Fernando S. Aldado, Flávio Costa, GOE, Galabriel, Gus W, H3rman, Itras, Leonardo.stabile, Mestre Yoda, Mwaldeck, OS2Warp, Onjacktallcuca, Pietro Roveri, Porantim, Rcsilva83, Rei-artur, Ronaldofiorilo, Villarinho, 69 edições anónimas SPICE Fonte: http://pt.wikipedia.org/w/index.php?oldid=20429098 Contribuidores: Alves, Euclidespaim, Frosseto, Hyju, Josepojr, Leonardo.stabile, Luiz Jr, RenanBirck, Tschulz, 4 edições anónimas ISO 12207 Fonte: http://pt.wikipedia.org/w/index.php?oldid=21049131 Contribuidores: Adamlorenz, Gaguigu, Gildemax, Ikescs, Jurema Oliveira, Luís Felipe Braga, Manuel Anastácio, MarioM, Mosca, Pedro.haruo, Sadoc, 12 edições anónimas MPS/Br Fonte: http://pt.wikipedia.org/w/index.php?oldid=10205112 Contribuidores: Arges, Brandizzi, Chentz, Felipe Pinto, Fernando Colares, Fredxavier, Gunnex, Jcgpereira2001, Leonardo.stabile, Lijealso, Luís Felipe Braga, Nice poa, OS2Warp, Tiago.bn, Xexeo, 38 edições anónimas 109 Fontes, Licenças e Editores da Imagem Fontes, Licenças e Editores da Imagem Ficheiro:Crystal Clear action 1downarrow.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Crystal_Clear_action_1downarrow.png Licença: desconhecido Contribuidores: Abu badali, Augiasstallputzer, CyberSkull, Foroa, Juliancolton, Rocket000, 6 edições anónimas Ficheiro:Crystal Clear action 1uparrow.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Crystal_Clear_action_1uparrow.png Licença: desconhecido Contribuidores: Abu badali, Augiasstallputzer, CyberSkull, Rocket000 Imagem:cquote1.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Cquote1.svg Licença: Public Domain Contribuidores: Adambro, Editor at Large, Infrogmation, P 96glin, 1 edições anónimas Imagem:cquote2.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Cquote2.svg Licença: Public Domain Contribuidores: Editor at Large, Infrogmation Imagem:Processo_es.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Processo_es.jpg Licença: Public Domain Contribuidores: User:Furutajp Imagem:coarse grain.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Coarse_grain.jpg Licença: GNU Free Documentation License Contribuidores: LeonardoG Imagem:waterfall diagram.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Waterfall_diagram.jpg Licença: GNU Free Documentation License Contribuidores: Original uploader was [email protected] at pt.wikipedia Ficheiro:Modelos da analise essencial.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Modelos_da_analise_essencial.png Licença: Creative Commons Attribution-Sharealike 3.0 Contribuidores: Elvis Pellizari Ficheiro:Diagrama de contexto.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Diagrama_de_contexto.png Licença: Creative Commons Attribution-Sharealike 3.0 Contribuidores: Elvis Pellizari Ficheiro:Simbologia analise essencial.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Simbologia_analise_essencial.png Licença: Creative Commons Attribution-Sharealike 3.0 Contribuidores: Elvis Pellizari Imagem:Dfd.JPG Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Dfd.JPG Licença: Public Domain Contribuidores: Mtheus, Newmanbe Arquivo:Scrum process.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Scrum_process.svg Licença: GNU Free Documentation License Contribuidores: Lakeworks, Mdd, Sebastian Wallroth, 1 edições anónimas Imagem:Tabeladecisao.JPG Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Tabeladecisao.JPG Licença: Public Domain Contribuidores: 555, Mtheus Imagem:Arvoredecisao.JPG Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Arvoredecisao.JPG Licença: Public Domain Contribuidores: Mdd, Mtheus Ficheiro:semaforo.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Semaforo.jpg Licença: Public Domain Contribuidores: Smartkids Ficheiro:Transicaoestado.JPG Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Transicaoestado.JPG Licença: Public Domain Contribuidores: Mtheus Ficheiro:Primoc.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Primoc.png Licença: Creative Commons Attribution-Sharealike 2.5 Contribuidores: Meno25, Paulorcjr, WikipediaMaster, 2 edições anónimas File:H96566k.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:H96566k.jpg Licença: Public Domain Contribuidores: Courtesy of the Naval Surface Warfare Center, Dahlgren, VA., 1988. 110 Licença Licença Creative Commons Attribution-Share Alike 3.0 Unported http:/ / creativecommons. org/ licenses/ by-sa/ 3. 0/ 111
Documentos relacionados
História da arquitetura
A renovação estética proposta pelas vanguardas (especialmente pelo cubismo, pelo neoplasticismo, pelo construtivismo e pela abstração) no campo das artes plásticas abre o caminho para uma aceitação...
Leia mais