Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 ENGENHARIA E QUALIDADE DE SOFTWARE 1 SUMÁRIO 1. INTRODUÇÃO ..................................................................................................... 4 1.1 Engenharia de Software ................................................................................. 4 1.1.1 Importância dos métodos de desenvolvimento de software .................... 6 1.2 Ciclo de Vida do Software .............................................................................. 7 1.2.1 Fase de definição ..................................................................................... 8 1.2.2 Fase de desenvolvimento ........................................................................ 8 1.2.3 Fase de operação .................................................................................... 9 1.2.4 Fase de retirada ..................................................................................... 10 2. A ESTRUTURA DO PROCESSO DE SOFTWARE ........................................... 10 2.1 Modelos de Processo ................................................................................... 11 2.1.1 O modelo cascata .................................................................................. 12 2.1.2 Modelo Incremental ............................................................................... 13 2.1.3 Prototipação evolutiva ............................................................................ 14 2.1.4 Modelo espiral ....................................................................................... 14 2.1.5 Modelo V................................................................................................ 15 2.2 Desenvolvimento Ágil ................................................................................... 16 2.3 Agilidade e Custo das Mudanças ................................................................. 16 2.4 Processo Ágil ............................................................................................... 17 2.4.1 Princípios da agilidade ............................................................................... 17 2.5 Aspectos Humanos da Engenharia de Software e Características .............. 18 2.6 Psicologia da Engenharia de Software ........................................................ 19 3. QUALIDADE DE SOFTWARE E GESTÃO DE PROJETOS ............................. 20 3.1. O Espectro de Gerenciamento ..................................................................... 20 3.1.1 Pessoas ..................................................................................................... 20 3.1.2 Produtos .................................................................................................... 21 3.1.3 Processo .................................................................................................... 21 3.1.4 Projeto ....................................................................................................... 21 3.2 Métricas de Processo ................................................................................... 22 3.2.1 Aperfeiçoamento do processo de software ............................................ 22 3.3 Estimativas de Projeto de Software .............................................................. 23 3.3.1 Escopo ....................................................................................................... 24 3.4 Recursos ...................................................................................................... 24 3.5 Técnicas de Decomposição ......................................................................... 25 2 3.5.1 Estimativa baseada em linhas de código (LOC) .................................... 26 3.5.2 Estimativa baseada em pontos de função (FP) ..................................... 26 3.6 Método COCOMO(Constructive Cost Model)............................................... 28 3.7 Cronograma de Projetos .............................................................................. 29 CONSIDERAÇÕES FINAIS ...................................................................................... 31 REFERÊNCIAS BIBLIOGRÁFICAS ......................................................................... 32 3 NOSSA HISTÓRIA A nossa história inicia com a realização do sonho de um grupo de empresários, em atender à crescente demanda de alunos para cursos de Graduação e Pós-Graduação. Com isso foi criado a nossa instituição, como entidade oferecendo serviços educacionais em nível superior. A instituição tem por objetivo formar diplomados nas diferentes áreas de conhecimento, aptos para a inserção em setores profissionais e para a participação no desenvolvimento da sociedade brasileira, e colaborar na sua formação contínua. Além de promover a divulgação de conhecimentos culturais, científicos e técnicos que constituem patrimônio da humanidade e comunicar o saber através do ensino, de publicação ou outras normas de comunicação. A nossa missão é oferecer qualidade em conhecimento e cultura de forma confiável e eficiente para que o aluno tenha oportunidade de construir uma base profissional e ética. Dessa forma, conquistando o espaço de uma das instituições modelo no país na oferta de cursos, primando sempre pela inovação tecnológica, excelência no atendimento e valor do serviço oferecido. 4 1. INTRODUÇÃO O software desempenha um papel fundamental em várias áreas de negócios seja para controle e segurança de informações, controle de processos, apoio a decisões como, também, entretenimento. Há 40 anos, o software começava a se tornar complexo e com isso, problemas de qualidade e atendimento de prazos e custos já eram apontados. Assim, nasceu a Engenharia de Software tratando o software como um produto de engenharia para fazer frente aos novos desafios. A Engenharia de Software abrange ferramentas de apoio para as atividades, métodos para orientar a realização das atividades, processo para definir as atividades e os produtos e a qualidade de processo e de produto de software. Dessa maneira o desenvolvimento de software pode obter produtos com qualidade e produtividade. 1.1 Engenharia de Software O conceito “Engenharia de Software” foi cunhado em 1969 por Fritz Bauer em uma conferência patrocinada por um Comitê de Ciência da Organização do Tratado do Atlântico Norte (Otan), no momento em que a chamada crise do software precisava de uma solução para a demanda crescente por software, dentro de custo e prazo adequados. Nessa época, a crise foi identificada pela preocupação crescente na comunidade de software com a quantidade de defeitos, entregas fora de prazo e altos custos do software. De acordo com vários relatos, Fritz Bauer teria dito: “A Engenharia de Software é o estabelecimento e uso de sólidos princípios de engenharia a fim de obter um software que seja confiável e que funcione de forma econômica e eficiente em máquinas reais.” É importante notar que a Engenharia de Software segue os mesmos princípios de uma disciplina de engenharia tradicional, baseada em uma relação adequada de custo/benefício do produto, que não falhe e que seja eficiente. Outras definições podem ser encontradas nas normas da IEEE (Institute of Electrical and Electronics Engineers) dos Estados Unidos, onde a Engenharia de Software é: a) a aplicação de uma abordagem sistemática, disciplinada e quantificável para o desenvolvimento, a operação e manutenção de software; 5 b) o estudo de abordagens como descrito em (a). Fritz Bauer também declarou que os sistemas deveriam ser construídos em níveis e em módulos, que formam uma estrutura matemática. De certa maneira, a Engenharia de Software tem evoluído nesta linha e, atualmente, segundo Pressman, ela pode ser maisbem entendida como uma tecnologia em camadas ou níveis, conforme pode ser vista na Figura 1.1. FIGURA 1.1 Camadas da Engenharia de Software A engenharia de software é uma tecnologia em camadas. Como ilustra a Figura 1.1, qualquer abordagem de engenharia (inclusive engenharia de software) deve estar fundamentada em um comprometimento organizacional com a qualidade. A gestão da qualidade total promove uma cultura de aperfeiçoamentos contínuo de processos, e é essa cultura que, no final das contas, leva ao desenvolvimento de abordagens cada vez mais eficazes na engenharia de software. A pedra fundamental que sustenta a engenharia de software é o foco na qualidade. A base da engenharia de software é a camada de processos. O processo de engenharia de software é a liga que mantém as camadas de tecnologia coesas e possibilita o desenvolvimento de software de forma racional e dentro do prazo. O processo define uma metodologia que deve ser estabelecida para a entrega efetiva de tecnologia de engenharia de software. O processo de software constitui a base para o controle do gerenciamento de projetos de software e estabelece o contexto no qual são aplicados métodos técnicos, são produzidos artefatos (modelos, documentos, dados, relatórios, formulários etc.), são estabelecidos marcos, a qualidade é garantida e mudanças são geridas de forma apropriada. 6 Os métodos da engenharia de software fornecem as informações técnicas para desenvolver softwares. Os métodos envolvem uma ampla variedade de tarefas, que incluem: comunicação, análise de requisitos, modelagem de projeto, construção de programa, testes e suporte. Os métodos da engenharia de software se baseiam em um conjunto de princípios básicos que governam cada área da tecnologia e incluem atividades de modelagem e outras técnicas descritivas. As ferramentas da engenharia de software fornecem suporte automatizado ou semiautomatizado para o processo e para os métodos. Quando as ferramentas são integradas, de modo que as informações criadas por uma ferramenta possam ser utilizadas por outra, é estabelecido um sistema para o suporte ao desenvolvimento de software, denominado engenharia de software com o auxílio do computador. 1.1.1 Importância dos métodos de desenvolvimento de software A importância dos métodos de desenvolvimento de software advém do fato de que eles definem, por meio de suas notações, um canal de comunicação uniforme entre os membros da equipe de desenvolvimento. Também, os métodos estabelecem produtos de trabalho padronizados que facilitam as atividades de manutenção de software. Além disso, permitem que novos colaboradores sejam treinados melhorando a qualidade do software. Os métodos podem ser usados como referência para a escolha e aquisição de ferramentas CASE (do inglês Computer-Aided Software Engineering, é uma classificação que abrange todas as ferramentas baseadas em computadores que auxiliam atividades de engenharia de software, desde análise de requisitos e modelagem até programação e testes) que podem dar maior produtividade ao processo de desenvolvimento de software. INFORMATIVO A disciplina de Engenharia de Software é muito abrangente. Processos, métodos, técnicas e ferramentas têm sido propostos com frequência. Esta contínua evolução da Engenharia de Software aponta para a necessidade de melhorar as abordagens atuais para produzir softwares cada vez mais complexos com qualidade e produtividade. 7 Tais métodos vêm sendo desenvolvidos desde o início da definição da Engenharia de Software e, atualmente, muitos desses métodos estão consolidados na comunidade de software. Atualmente, duas abordagens são reconhecidas: Estruturada e Orientada a Objetos, que são discutidas no próximo tópico. 1.2 Ciclo de Vida do Software Todo projeto de software começa por alguma necessidade do negócio, a necessidade de corrigir um defeito em uma aplicação existente. Para entender de software precisamos analisar as características do software que o tornam diferente de outras coisas produzidas. O software é um elemento de um sistema lógico e não de um sistema físico. Assim ele possui características que são consideravelmente diferentes daquelas do hardware: O Software é desenvolvido ou passa por um processo de engenharia; não é fabricado no sentido clássico; Software não se desgasta; Apesar de a indústria estar se movendo em direção à montagem baseada em componentes, a maior parte dos softwares continua a ser construída sob encomenda. O ciclo de vida de um software descreve as fases pelas quais o software passa desde a sua concepção até ficar sem uso algum. O conceito de ciclo de vida de um software é muitas vezes confundido com o de modelo de processo. Existem várias propostas e denominações para as fases do ciclo de vida de um software. Cada fase inclui um conjunto de atividades ou disciplinas que devem ser realizadas pelas partes envolvidas. Essas fases são: SUGESTÃO DE LEITURA BOURQUE Pierre, DUPUIS Robert, TRIPP Leonard L. Guide to the software engineering body of knowledge – SWEBOK. USA: IEEE Computer Society Press; 2004. PFLEEGER Shari L. Software engineering: theory and practice. 2 New Jersey: Prentice Hall; 2001. 8 Definição Desenvolvimento Operação Retirada 1.2.1 Fase de definição A fase de definição do software ocorre em conjunto com outras atividades como a modelagem de processos de negócios e análise de sistemas. Nesta atividade, se concentra a busca pelo conhecimento da situação atual e a identificação de problemas para a elaboração de propostas de solução de sistemas computacionais que resolvam tais problemas. Profissionais de engenharia de software atuam nesta atividade com o objetivo de identificar os requisitos de software e modelos de domínio que serão utilizados na fase de desenvolvimento. 1.2.2 Fase de desenvolvimento A fase de desenvolvimento ou de produção do software inclui todas as atividades que tem por objetivo a construção do produto. Ela inclui principalmente o design, a implementação e a verificação e validação do software. A atividade de design compreende todo o esforço de concepção e modelagem que têm por objetivo descrever como o software será implementado. A implementação envolve as atividades de codificação, compilação, integração e testes. A codificação visa traduzir o design num programa, utilizando linguagens e ferramentas adequadas. A codificação deve refletir a estrutura e o comportamento descrito no design. Os componentes arquiteturais devem ser codificados de forma independente e depois integrados. Os testes podem ser iniciados durante a fase de implementação. A depuração de erros ocorre durante a programação utilizando algumas técnicas e ferramentas. É fundamental um controle e gerenciamento de versões para que se tenha um controle correto de tudo o que está sendo codificado. Verificação e validação destinam-se a mostrar que o sistema está de acordo com a especificação e que ele atende às expectativas de clientes e usuários. A 9 validação visa assegurar se o programa está fazendo aquilo que foi definido na sua especificação (fazendo a coisa certa). Existem diferentes formas de verificação e validação. Inspeção analítica e revisão de modelos, documentos e código fonte são formas que podem ser usadas antes mesmo que o programa seja completamente codificado. Os testes de correção, desempenho, confiabilidade, robustez, usabilidade, dentre outros, visam avaliar diversos fatores de qualidade a partir da execução do software. 1.2.3 Fase de operação A fase de operação envolve diferentes tipos de atividades: Distribuição e entrega Instalação e configuração Utilização Manutenção A distribuição e entrega pode ser feita diretamente pelo desenvolvedor(em caso de software personalizado), ou em um pacote a ser vendido em prateleiras de lojas ou para ser baixado pela Internet (em caso de softwares genéricos). O processo de instalação e configuração, normalmente, pode ser feito com a ajuda de software de instalação disponibilizados pelos fabricantes dos ambientes operacionais. A atividade de utilização é o objeto do desenvolvimento do software. A qualidade da utilização é a usabilidade do software. A manutenção normalmente ocorre de duas formas: corretiva e evolutiva. A manutenção corretiva visa a resolução de problemas referentes a qualidade do software (falhas, baixo desempenho, baixa usabilidade, falta de confiabilidade, etc.). A manutenção evolutiva ou adaptativa visa a produção de novas versões do software de forma a atender a novos requisitos dos clientes, ou adaptar-se às novas tecnologias que surgem (hardware, plataformas operacionais, linguagens, etc.). Mudanças no domínio de aplicação implicam em novos requisitos e incorporação de novas funcionalidades. Surgimento de novas tecnologias de software e hardware e mudanças para uma plataforma mais avançada também requerem evolução. 10 1.2.4 Fase de retirada A fase de retirada é um grande desafio para os tempos atuais. Diversos softwares que estão em funcionamento em empresas possuem excelentes níveis de confiabilidade e de correção. No entanto, eles precisam evoluir para novas plataformas operacionais ou para a incorporação de novos requisitos. A retirada desse software legado em uma empresa é sempre uma decisão difícil: como abrir mão daquilo que é confiável e ao qual os funcionários estão acostumados, após anos de treinamento e utilização? Processos de reengenharia podem ser aplicados para viabilizar a transição ou migração de um software legado para um novo software de forma a proporcionar uma retirada mais suave. 2. A ESTRUTURA DO PROCESSO DE SOFTWARE O processo de software está́ representado esquematicamente na Figura 2. De acordo com a figura, cada atividade metodológica é composta por um conjunto de ações de engenharia de software. Cada ação é definida por um conjunto de tarefas, o qual identifica as tarefas de trabalho a ser completadas, os artefatos de software que serão produzidos, os fatores de garantia da qualidade que serão exigidos e os marcos utilizados para indicar progresso. Uma metodologia de processo genérica para engenharia de software estabelece cinco atividades metodológicas: comunicação, planejamento, modelagem, construção e entrega. Além disso, um conjunto de atividades de apoio é aplicado ao longo do processo, como o acompanhamento e controle do projeto, a administração de riscos, a garantia da qualidade, o gerenciamento das configurações, as revisões técnicas, entre outras. 11 Figura 2 - Uma metodologia do processo de software 2.1 Modelos de Processo Um modelo de processo prescritivo concentra-se em estruturar e ordenar o desenvolvimento de software. As atividades e tarefas ocorrem sequencialmente, com diretrizes de progresso definidas. Mas os modelos prescritivos são adequados para o mundo do software que se alimenta de mudanças? Se rejeitarmos os modelos de processo tradicionais (e a ordem implícita) e os substituirmos por algo menos estruturado, tornaremos impossível atingir a coordenação e a coerência no trabalho de software? 12 Não há respostas fáceis para essas questões, mas existem alternativas disponíveis para os engenheiros de software. Nas próximas seções, examinamos a abordagem dos processos prescritivos, nos quais a ordem e a consistência do projeto são questões predominantes. Chamamos esses processos de “prescritivos” porque prescrevem um conjunto de elementos de processo: atividades metodológicas, ações de engenharia de software, tarefas, artefatos, garantia da qualidade e mecanismos de controle de mudanças para cada projeto. Cada modelo de processo também prescreve um fluxo de processo (também denominado fluxo de trabalho) ou seja, a forma pela qual os elementos do processo estão relacionados. 2.1.1 O modelo cascata Há casos em que os requisitos de um problema são bem compreendidos, quando o trabalho flui da comunicação à disponibilização de modo relativamente linear. O modelo cascata, algumas vezes chamado ciclo de vida clássico, sugere uma abordagem sequencial e sistemática para o desenvolvimento de software, começando com a especificação dos requisitos do cliente, avançando pelas fases de planejamento, modelagem, construção e disponibilização, e culminando no suporte continuo do software concluído. Figura 2.1.1 – Modelo Cascata O modelo cascata é o paradigma mais antigo da engenharia de software. Entretanto, ao longo das últimas quatro décadas, as críticas a este modelo de processo fizeram até mesmo seus mais árduos defensores questionarem sua eficácia. Entre os problemas às vezes encontrados quando se aplica o modelo cascata, temos: 13 Projetos reais raramente seguem o fluxo sequencial proposto pelo modelo. Embora o modelo linear possa conter iterações, ele o faz indiretamente. Como consequência, mudanças podem provocar confusão à medida que a equipe de projeto prossegue. Frequentemente, é difícil para o cliente estabelecer explicitamente todas as necessidades. O modelo cascata exige isso e tem dificuldade para adequar a incerteza natural existente no início de muitos projetos. O cliente deve ter paciência. Uma versão operacional do(s) programa(s) não estará disponível antes de estarmos próximos ao final do projeto. Um erro grave, se não detectado até o programa operacional ser revisto, pode ser desastroso. 2.1.2 Modelo Incremental Há várias situações em que os requisitos iniciais do software são razoavelmente bem definidos; entretanto, o escopo geral do trabalho de desenvolvimento, impede o uso de um processo puramente linear. Pode ser necessário o rápido fornecimento de determinado conjunto funcional aos usuários para, somente após esse fornecimento, refinar e expandir sua funcionalidade em versões de software posteriores. Em tais casos, pode-se optar por um modelo de processo projetado para desenvolver o software de forma incremental. O modelo incremental combina os fluxos de processo linear e paralelo dos elementos. Na Figura 2.1.2, o modelo incremental aplica sequências lineares de forma escalonada, à medida que o tempo vai avançando. Figura 2.1.2 – Modelo incremental 14 2.1.3 Prototipação evolutiva Frequentemente, o cliente define uma série de objetivos gerais para o software, mas não identifica, detalhadamente, os requisitos para funções e recursos. Em outros casos, o desenvolvedor se encontra inseguro quanto à eficiência de um algoritmo, quanto à adaptabilidade de um sistema operacional ou quanto à forma em que deve ocorrer a interação homem máquina. Em situações como essas, e em muitas outras, o paradigma da prototipação pode ser a melhor abordagem. Na sua forma ideal, o protótipo atua como um mecanismo para identificar os requisitos do software. Caso seja necessário desenvolver um protótipo operacional, pode-se utilizar partes de programas existentes ou aplicar ferramentas que possibilitem gerar rapidamente tais programas operacionais. Figura 2.1.3 – Modelo de prototipação evolutiva 2.1.4 Modelo espiral O modelo espiral é um modelo de processo de software evolucionário que une a natureza iterativa da prototipação aos aspectos sistemáticos e controlados do modelo cascata. Tem potencial para o rápido desenvolvimento de versões cada vez mais completas do software. O primeiro circuito em volta da espiral pode resultar no desenvolvimento de uma especificação de produto; passagens subsequentes em torno da espiral podem ser usadas para desenvolver um protótipo e, então,progressivamente, versões cada vez mais sofisticadas do software. Cada passagem pela região de planejamento resulta em ajustes no planejamento do projeto. Custo e cronograma são ajustados de 15 acordo com o feedback (a realimentação) obtido do cliente após a entrega. Além disso, o gerente de projeto faz um ajuste no número de iterações planejadas para concluir o software. Figura 2.1.4 – Modelo espiral 2.1.5 Modelo V O Modelo V é similar ao processo Cascata, com a diferença de que este modelo está preocupado com o planejamento dos testes nas fases de desenvolvimento. Cada tipo de teste é realizado seguindo um plano de testes correspondente, verificando e validando se as especificações definidas nas fases de desenvolvimento estão sendo atendidas. Seguindo a característica sequencial do processo Cascata, um teste de mais alto nível é realizado somente se o teste atual for bem-sucedido. De forma geral, o Modelo V não é tão conhecido como o processo Cascata, mas pela sua simplicidade e melhor organização das atividades de teste ele se torna um processo bastante interessante para disseminar a importância dos testes no processo de desenvolvimento de software. 16 Figura 2.1.5 – Modelo V 2.2 Desenvolvimento Ágil Em 2001, Kent Beck e outros 16 renomados desenvolvedores, autores e consultores da área de software (batizados de “Agile Alliance” – “Aliança dos Ágeis”) assinaram o “Manifesto para o Desenvolvimento Ágil de Software” (“Manifesto for Agile Software Development”). Ele declarava: Ao desenvolver e ajudar outros a desenvolver softwares, desvendamos formas melhores de desenvolvimento. Por meio deste trabalho passamos a valorizar: Indivíduos e interações acima de processos e ferramentas. Software operacional acima de documentação completa. Colaboração dos clientes acima de negociação contratual. Respostas a mudanças acima de seguir um plano. Ou seja, embora haja valor nos itens à direita, valorizaremos os da esquerda mais ainda. 2.3 Agilidade e Custo das Mudanças O pensamento convencional em desenvolvimento de software (baseada em décadas de experiência) é que os custos de mudanças aumentam de forma não linear conforme o projeto avança. Os proponentes da agilidade argumentam que um processo ágil bem elaborado “achata” o custo da curva de mudança (Figura 2.3 curva em linha azul), 17 permitindo que uma equipe de software assimile as alterações, realizadas posteriormente em um projeto de software, sem um impacto significativo nos custos ou no tempo. Figura 2.3 – Custos de alterações como uma função do tempo em desenvolvimento 2.4 Processo Ágil Processo ágil de software é caracterizado de uma forma que trate de uma série de preceitos chaves acerca da maioria dos projetos de software. Adaptação continua sem progressos, entretanto, de pouco adianta. Um processo ágil de software deve adaptar de modo incremental. Para conseguir uma adaptação incremental, a equipe ágil precisa de feedback do cliente (de modo que as adaptações apropriadas possam ser feitas). 2.4.1 Princípios da agilidade A Agile Alliance estabelece 12 princípios para alcançar a agilidade: 1. A maior prioridade é satisfazer o cliente com entrega adiantada e continua de software funcionando. 2. Aceite bem os pedidos de alterações, mesmo com o desenvolvimento adiantado. Os processos ágeis se aproveitam das mudanças para a vantagem competitiva do cliente. 3. Entregue software em funcionamento frequentemente, de algumas sema- nas a alguns meses, dando preferência a intervalos mais curtos. 18 4. O pessoal do comercial e os desenvolvedores devem trabalhar em con- junto diariamente ao longo de todo o projeto. 5. Construa projetos em torno de pessoas motivadas. Dê a elas o ambiente e o apoio necessários e acredite que elas farão o trabalho corretamente. 6. O método mais eficiente e efetivo de transmitir informações para e dentro de uma equipe de desenvolvimento é uma conversa aberta, presencial. 7. Software em funcionamento é a principal medida de progresso. 8. Os processos ágeis promovem desenvolvimento sustentável. Proponentes, desenvolvedores e usuários devem estar aptos a manter um ritmo constante indefinidamente. 9. Atenção contínua para com a excelência técnica e para com bons projetos aumenta a agilidade. 10. Simplicidade, a arte de maximizar o volume de trabalho não realizado é essencial. 11. As melhores arquiteturas, requisitos e projetos surgem de equipes auto- organizadas. 12. Em intervalos regulares, a equipe se avalia para ver como pode se tornar mais eficiente, então, sintoniza e ajusta seu comportamento de acordo. 2.5 Aspectos Humanos da Engenharia de Software e Características Então você quer ser engenheiro de software? Obviamente, precisa dominar o material técnico, aprender e aplicar as habilidades exigidas para entender o problema, projetar uma solução eficaz, construir o software e testá-lo com a finalidade de produzir a mais alta qualidade possível. Você̂ precisa gerenciar mudanças, comunicar- se com os envolvidos e usar ferramentas adequadas nas situações apropriadas. Um engenheiro de software competente tem um senso de responsabilidade individual. Significa que ele fará o que precisar ser feito, quando for necessário, executando um esforço adicional para a obtenção de um resultado bem-sucedido. Um engenheiro de software competente tem elevado senso de lealdade. De boa vontade, compartilha os créditos com seus colegas. Tenta evitar conflitos de interesse e nunca age no sentido de sabotar o trabalho dos outros. Um engenheiro de software competente mostra atenção aos detalhes. Isso não significa obsessão com a perfeição, mas sugere que ele considera atentamente 19 as decisões técnicas que toma diariamente, em comparação com critérios mais amplos (por exemplo, desempenho, custo, qualidade) que foram estabelecidos para o produto e para o projeto. Por último, um engenheiro de software competente é pragmático. Reconhece que a engenharia de software não é uma religião na qual devem ser seguidas regras dogmáticas, mas sim uma disciplina que pode ser adaptada de acordo com as circunstâncias. 2.6 Psicologia da Engenharia de Software Nos níveis da equipe e do projeto, dinâmicas de grupo se tornam o fator dominante. Aqui, a estrutura da equipe e fatores sociais governam o sucesso. A comunicação, a colaboração e a coordenação do grupo são tão importantes quanto as habilidades dos membros individuais da equipe. Nas camadas externas, o comportamento organizacional governa as ações da empresa e sua resposta para o meio empresarial. Figura 2.6 – Modelo comportamental em camadas 20 3. QUALIDADE DE SOFTWARE E GESTÃO DE PROJETOS A gestão de projetos define quem, o que, quando e o porquê dos projetos. Ela faz uso de processos e ferramentas de gestão os quais servem para ajudar o gerente de projetos e equipe a organizar, documentar, rastrear e relatar as atividades e progresso de um projeto. Dentro desse contexto, o plano de projeto compreende: Escopo de projeto bem definido; Documentação e responsabilidades dos participantes; Uma linguagem comum para comunicação das atividades do projeto, bem como a rastreabilidade e relatórios dessas atividades; Mecanismos de resolução de conflitos e mitigação ou atenuação de riscos. 3.1. O Espectro de Gerenciamento O gerenciamento eficiente do desenvolvimento de software se concentra nos 4 Ps: pessoas, produto, processo e projeto. Essa ordem não é arbitrária. O gerente que se esquecer de que o trabalho do engenheiro de software consiste em esforço humano nunca terá́ sucesso no gerenciamento de projeto. Da mesma forma, o que não estimula a ampla comunicação entre os envolvidos no início da evolução de um produtocorre o risco de desenvolver uma solução elegante para o problema errado. Um gerente que preste pouca atenção ao processo se arrisca a inserir métodos e ferramentas técnicas competentes em um vácuo. Aquele que embarca sem um plano de projeto sólido compromete o sucesso do projeto. 3.1.1 Pessoas Desde os anos 1960, debate-se a valorização da cultura de ter pessoal de desenvolvimento motivado e de alto nível. Realmente, recursos humanos é um fator de tal importância que o Software Engineering Institute (SEI) desenvolveu um Modelo de Maturidade de Capacitação de Pessoas, o People-CMM (People Capability Maturity Model) - em reconhecimento ao fato de que: “Toda organização precisa aprimorar continuamente sua habilidade de atrair, desenvolver, motivar, organizar e reter a forca de trabalho necessária para atingir os objetivos estratégicos de seus negócios” 21 3.1.2 Produtos Antes de traçarmos um plano de projeto, devemos estabelecer os objetivos do produto e seu escopo, considerar as soluções alternativas e identificar as restrições técnicas e de gerenciamento. Sem essas informações, é impossível definir de modo razoável (e preciso) a estimativa de custo, a avaliação efetiva dos riscos, a análise realista das tarefas do projeto ou um cronograma gerenciável do projeto que forneça a indicação significativa de progresso das atividades. 3.1.3 Processo Um processo de software fornece a metodologia por meio da qual pode ser estabelecido um plano de projeto abrangente para o desenvolvimento de software. Uma quantidade de diferentes conjuntos de atividades e tarefas, pontos de controle, artefatos de software e pontos de garantia de qualidade possibilitam que as atividades metodológicas sejam adaptadas às características do projeto de software e aos requisitos de equipe. 3.1.4 Projeto Conduzimos projetos com planejamento e com controle por uma única e principal razão: é a única maneira de administrar a complexidade. E, mesmo assim, as equipes de software têm de se esforçar. Em um estudo de 250 grandes projetos de software entre 1998 e 2004, Carpe Jones constatou que “perto de 25 obtiveram sucesso em cumprir cronograma, custos e objetivos quanto à qualidade. Em torno de 50 apresentaram atrasos ou retardamentos abaixo de 35%, enquanto 175 projetos tiveram atrasos e retardamentos sérios ou não foram concluídos”. Em um trabalho sobre processo e projetos de software, Barry Boehm, sugere uma abordagem com foco nos objetivos do projeto, marcos e cronogramas, responsabilidades, abordagens gerenciais e técnicas, e recursos necessários. Ele denomina o princípio W5HH: 22 Figura 3.1.4 – W5HH 3.2 Métricas de Processo A medição é uma ferramenta de gerenciamento. Se for usada adequada- mente, ela aumenta o conhecimento do gerente de projeto. E, consequentemente, ajuda o gerente de projeto e a equipe de software a tomarem decisões que levarão a um projeto bem-sucedido. 3.2.1 Aperfeiçoamento do processo de software Métricas de processo são coletadas em todos os projetos e no decorrer de longos períodos de tempo. Sua finalidade é proporcionar um conjunto de indicadores de processo que levam à melhoria do processo de software no longo prazo. A única maneira lógica de melhorar qualquer processo é medir atributos específicos do processo, desenvolver um conjunto de métricas significativas com base nesses atributos e então usar as métricas para fornecer indicadores que levem a uma estratégia de aperfeiçoamento. 23 Figura 3.2.1 – Determinantes para a qualidade do software O processo está́ no centro do triângulo que conecta três fatores de profunda influência sobre a qualidade do software e do desempenho organizacional. A complexidade do produto pode ter um impacto significativo sobre a qualidade e o desempenho da equipe. A tecnologia (isto é, os métodos e ferramentas de engenharia de software) que preenche o processo também tem um impacto. 3.3 Estimativas de Projeto de Software O gerenciamento do projeto de software começa com um conjunto de atividades chamadas coletivamente de planejamento de projeto. Antes de iniciar o projeto, a equipe de software deve fazer uma estimativa do trabalho, dos recursos que serão necessários e do tempo necessário para a sua conclusão. Uma vez cumpridas essas atividades, a equipe de projeto deve estabelecer um cronograma que defina as tarefas e as metas de engenharia de software, deve identificar os responsáveis pela execução de cada tarefa e deve especificar as dependências entre tarefas que podem ter forte influência no progresso do trabalho. 24 3.3.1 Escopo O escopo do software descreve as funções e características que devem ser fornecidas aos usuários; os dados que entram e saem, o “conteúdo” que é apresentado aos usuários como consequência do uso do software e o desempenho, restrições, interfaces e confiabilidade que limitam o sistema. O escopo é definido por meio de uma das duas técnicas: Uma descrição narrativa do escopo do software é desenvolvida após comunicação com todos os envolvidos. Um conjunto de casos de uso é desenvolvido pelos usuários. Funções descritas na definição do escopo (ou nos casos de uso) são avaliadas e, em algumas situações, refinadas para fornecer mais detalhes, antes de iniciar as estimativas. Como as estimativas de custo e cronograma são ambas funcionalmente orientadas, muitas vezes é aconselhável certo grau de separação. As considerações de desempenho abrangem requisitos de processamento e tempo de resposta. As restrições identificam limites colocados no software por hardware externo, memória disponível ou outros sistemas existentes. 3.4 Recursos O planejador começa avaliando o escopo do software e selecionando as habilidades necessárias para concluir o desenvolvimento. São especificados o cargo (por exemplo, gerente, engenheiro de software sênior) e a especialização (por exemplo, telecomunicações, banco de dados, cliente-servidor). Para projetos relativamente pequenos (poucas pessoas/mês), um só profissional pode executar todas as tarefas de engenharia de software, consultando os especialistas quando necessário. Para projetos maiores, a equipe pode estar geograficamente dispersa em diferentes locais. Portanto, é especificada a localização de cada recurso humano. 25 Figura 3.4 – Recursos de projeto 3.5 Técnicas de Decomposição Desenvolver uma estimativa de custo e esforço para um projeto de software é muito complexo para ser considerado como um todo. Por essa razão devemos decompor o problema, caracterizando-o como um conjunto de problemas menores. No contexto do planejamento de projeto, o tamanho refere-se ao resultado quantificável do projeto de software. Se uma abordagem direta é adotada, o tamanho pode ser medido em linhas de código (LOC). Se uma abordagem indireta é escolhida, o tamanho é representado como pontos por função (FP). Dados de LOC e FP são usados de dois modos durante a estimativa de projetos de software: 1. Como variável de estimativa para “dimensionar” cada elemento de software; 2. Como métricas referenciais coletadas de projetos anteriores e usadas juntamente com variáveis de estimativa para desenvolver projeções de custo e esforço. Quando um novo projeto é estimado, deve ser primeiro classificado em um domínio (tamanho de equipe, área de aplicação, complexidade e outros parâmetros relevantes) e depois a média de produtividade do domínio adequado deve ser usada para gerar a estimativa. 26 3.5.1 Estimativa baseada em linhas de código (LOC) A medida mais simples para tamanho de um programa é a contagem de linhas de código. Existem algumas variantes para ela, como LOC (Lines Of Code), SLOC (Source Lines Of Code) lógico e SLOC físico. O método mais simplese também o mais impreciso: utilizando-se LOC não se distingue linhas de código de linhas em branco ou de comentários. Essa métrica é, em princípio, o padrão indicado para uso no PSP (Personal Software Process). Pode ser suficientemente precisa quando se comparam grandes volumes de código: naturalmente, um programa de 4 KLOC (milhares de linhas) deve ser mais complexo e levar mais tempo para ser desenvolvido que outro de 2 KLOC. Para aumentar a precisão da medida, sugeriu-se o uso do SLOC, onde linhas em branco ou com comentários não são consideradas. As variantes “lógica” e “física” não têm definições amplamente padronizadas. O exemplo abaixo seria medido como três LOCs, dois SLOCs físicos e três SLOCs lógicos: //uma verificação IF (a > b) {a++; var (“ok”); } 3.5.2 Estimativa baseada em pontos de função (FP) Como vimos, a medida LOC é simples e por esse motivo também é imprecisa. Um programador gastaria no máximo alguns minutos para juntar os arquivos-fonte de um projeto e obter do editor a contagem total de linhas. Entretanto o número obtido não revelaria nada a propósito da estrutura de tal sistema. Para determinar o número de FPs, deve-se considerar a contagem de dados e de transações. Na contagem de dados, consideram-se arquivos lógicos internos ou arquivos de interface externos. Entre as transações têm-se entradas externas, saídas externas ou consultas externas. O termo arquivo refere-se a um grupo de dados logicamente relacionados: Arquivos lógicos internos (ALI): São relativos às funcionalidades do software, como, por exemplo, cadastro de clientes e alteração de produtos. Não são ALI, por exemplo, arquivos temporários e de classificação; 27 Arquivos de interface externos (ALE): Os dados são mantidos e/ou alimentados por outros programas. As transações representam as funcionalidades providas ao usuário pelo processamento dos dados em um software; Entradas externas (EE): Processo lógico onde dados são introduzidos no sistema. Os dados podem ser informações de controle ou de negócios. Por exemplo, exclusão, alteração e inclusão de registros; Saídas externas (SE): Processo lógico em que dados são enviados ao exterior das fronteiras do sistema. Por exemplo, um relatório ou mesmo a apresentação dos dados em tela; Consulta Externa (CE): Os dados são recuperados exclusivamente de arquivos internos e interfaces externas (nada é computado). Por exemplo, consulta ao cadastro de cliente. Após terem sidos identificados e contados, esses cinco fatores devem ter sua complexidade classificada como baixa, média ou alta. Essa classificação depende de uma análise dos elementos de dados que compõe cada fator. Cada organização deve padronizar seu método de classificação de complexidade. Dois programas distintos podem ter a mesma contagem de pontos de função. Aspectos como complexidade dos cálculos ou requisitos como tempo real não entram no cálculo, até então. Para resolver isso pode ser utilizada uma técnica conhecida como Fator de Ajuste, que é baseada em 14 características gerais do sistema: 1. Comunicação de Dados; 2. Funções distribuídas; 3. Desempenho; 4. Configuração do equipamento; 5. Volume de transações; 6. Entrada de dados on-line; 7. Interface com o usuário; 8. Atualização on-line; 9. Processamento complexo; 10. Reusabilidade; 11. Facilidade de implantação; 12. Facilidade operacional 13. Múltiplos locais; 14. Flexibilidade de mudanças. 28 Cada CGS possui um nível de influência de 0 a 5, e é calculado por: FA = 0.65 + 0.01 X (n1 + n2 + ... + n14). Onde cada ni representa um dos 14 níveis de influência. A partir do valor do FA, pode-se calcular o número de pontos de função ajustados (PFA): PFA = FA x PF Algumas métricas podem ser derivadas a partir do cálculo de pontos de função, como o número de homens/hora para produzir 1PF (ou 1PFA, Ponto de Função Ajustado) ou, ainda, dada a produtividade média da equipe, o tempo necessário para implementar um projeto. Por exemplo, se uma equipe produz em média 10 PFs por dia, um projeto cujo tamanho é 300 PFs deve ser implementado em um mês. De maneira semelhante pode-se aproximar valores para o preço de um produto, a partir do custo de desenvolvimento de 1PF dentro da organização. 3.6 Método COCOMO(Constructive Cost Model) Uma das tarefas mais difíceis de um projeto é a correta aplicação dos recursos (humanos) durante seu desenvolvimento, ou seja, em que momento precisarei de mais ou menos programadores/analistas. O método COCOMO nada mais é do que uma pesquisa feita em centenas de empresas norte-americanas que mapeou a distribuição do esforço durante as fases de um projeto. Os principais números são: Figura 3.6 – Método COCOMO 29 Um tempo total de 875h aplicados ao método, ficaria: Figura 3.6.1 – Método COCOMO aplicado Assim sendo distribui-se essas horas nos recursos, em um cronograma, conforme estratégia da gerência e também levando em conta os prazos finais estabelecidos pelo usuário. 3.7 Cronograma de Projetos O cronograma de projeto de software é uma atividade que distribui o esforço estimado pela duração planejada do projeto, partilhando esse esforço por tarefas específicas de engenharia de software. É importante notar que o cronograma evolui com o tempo. Durante os primeiros estágios do planejamento do projeto, um cronograma macro é desenvolvido. Esse cronograma identifica todas as principais atividades do processo e as funções do produto a que se aplicam à medida que o projeto avança, cada entrada nesse cronograma é refinada em um cronograma detalhado. O exemplo a seguir refere-se a um cronograma de desenvolvimento de um projeto novo. Informações como atividades macro, atividades refinadas e suas respectivas datas são exibidas. Em um cronograma é importante que para cada atividade sejam definidas datas inicial e final. 30 Figura 3.7 - Cronograma de projetos 31 CONSIDERAÇÕES FINAIS As tecnologias de software e de sistemas continuam a ser um desafio para todo profissional de software e toda empresa que constrói sistemas de computador. Uma coisa que aprendemos durante muitos anos nesse campo é que os profissionais de engenharia de software são “conscientes de sua situação”. O caminho à frente estará entulhado de carcaças de novas e excitantes tecnologias (a última moda) que nunca tiveram sucesso (apesar da quantidade de “novidades”). O futuro será formado por tecnologias mais modestas que, de certa forma, modificam a direção e a amplitude do caminho. As aplicações das técnicas em estudo visam a melhora contínua do software e sua adaptabilidade dentro do que foi planejado e como profissionais, os engenheiros de software devem se orientar por um código de ética que rege o trabalho que fazem e os produtos que criam, garantindo um planejamento adequado, minimizando os riscos e potencializando as chances de sucesso. 32 REFERÊNCIAS BIBLIOGRÁFICAS ENGENHARIA DE SOFTWARE: revista de engenharia de software. Rio de Janeiro: Grupo Devmedia, 2008. EVELEENS J Laurenz, VERHOEF Chris. The rise and fall of the chaos report figures. IEEE Software. 2010. FILHO, Wilson de Pádua Paula. Engenharia de Software, Fundamentos, Métodos e Padrões. Rio de Janeiro: LTC – Livros Técnicos e Científicos Editora S.A. 2003. OLIVEIRA, Jayr Figueiredo de. Metodologia para Desenvolvimento de Projetos de Sistemas – Guia prático. 3. Edição revisada em ampliada. São Paulo : Érica, 1999. PRESSMANN, Roger S. Engenharia de Software São Paulo : Makron Books, 6. Ed. 2006 : McGraw-Hill 2006. SOMMERVILLE, I. Engenharia de Software. 8a Edição. Addison Wesley. 2007. PRESSMAN Roger S. Software engineering – a practitioner’s approach. 6 New York: McGraw Hill; 2007.
Compartilhar