UNIVERSIDADE FEDERAL DE MINAS GERAIS DEPARTAMENTO DE CIÊNCIA DA COMPUTAÇÃO ESPECIALIZAÇÃO EM INFORMÁTICA: ÊNFASE: ENGENHARIA DE SOFTWARE - PDF
UNIVERSIDADE FEDERAL DE MINAS GERAIS DEPARTAMENTO DE CIÊNCIA DA COMPUTAÇÃO ESPECIALIZAÇÃO EM INFORMÁTICA: ÊNFASE: ENGENHARIA DE SOFTWARE
Download "UNIVERSIDADE FEDERAL DE MINAS GERAIS DEPARTAMENTO DE CIÊNCIA DA COMPUTAÇÃO ESPECIALIZAÇÃO EM INFORMÁTICA: ÊNFASE: ENGENHARIA DE SOFTWARE"
Aurora Cesário Figueira
1 UNIVERSIDADE FEDERAL DE MINAS GERAIS DEPARTAMENTO DE CIÊNCIA DA COMPUTAÇÃO ESPECIALIZAÇÃO EM INFORMÁTICA: ÊNFASE: ENGENHARIA DE SOFTWARE Uso de Metodologias Ágeis no Desenvolvimento de Software por Ebenezer Silva de Oliveira Monografia de Final de Curso CEI-ES-031-T Prof. Renato Cardoso Mesquita Orientador Belo Horizonte, fevereiro de 2003.
2 UNIVERSIDADE FEDERAL DE MINAS GERAIS DEPARTAMENTO DE CIÊNCIA DA COMPUTAÇÃO ESPECIALIZAÇÃO EM INFORMÁTICA: ÊNFASE: ENGENHARIA DE SOFTWARE Uso de Metodologias Ágeis no Desenvolvimento de Software por Ebenezer Silva de Oliveira Monografia apresentada aos Senhores: Prof. Dr. Renato Cardoso Mesquita (Orientador) Profa. Dra. Mariza A. S. Bigonha - Coordenadora do CEI-ES Vista e permitida a impressão. Belo Horizonte, / /.
3 Este trabalho é dedicado às pessoas que tem caminhado junto comigo, com as quais tenho aprendido tanto. Entre elas tenho alegria de destacar o companheirismo de Yolanda. Dedico também aos meus pais, que investiram em mim, Ozias e Aparecida.
4 Agradeço à ATAN e à CST por disponibilizarem as informações citadas neste trabalho. Agradeço também à ATAN pelo investimento nesta tecnologia que, entre outros aspectos, valoriza as pessoas.
5 Resumo Palavras chave: Metodologias ágeis, Extreme Programming, Scrum O objetivo deste trabalho é apresentar as metodologias ágeis como alternativa aos processos tradicionais usados na engenharia de software. Com este objetivo ele apresenta um estudo de caso um sistema desenvolvido utilizando um processo baseado nestas metodologias. O sistema apresentado é o Sistema de Embarque da Companhia Siderúrgica de Tubarão, desenvolvido por uma equipe da ATAN Sistemas de Automação. As metodologias usadas no desenvolvimento deste sistema foram Extreme Programming e Scrum.
6 Abstract Keywords: Agile Methodologies, Extreme Programming, Scrum This work presents the agile methodologies as an alternative to the traditional (or heavy weight) process of software engineering. It presents a case study the development of a system, which uses these agile methodologies. The system presented is the Maritime Shipping System of CST (Companhia Siderúrgica de Tubarão Brazil), being developed by a team of ATAN Systems Automation. The methodologies used during the development of this system were Extreme Programming and Scrum.
7 Lista de Ilustrações figura 1 o desenvolvimento de um produto pode ser feito sem o uso de nenhuma metodologia [PAU01] figura 2 ciclo de vida em Cascata [PAU01] figura 3 ciclo de vida em Sashimi [PAU01] figura 4 ciclo de vida em Espiral [PAU01] figura 5 ciclo de vida de um projeto em Scrum [AGI03]
8 Lista de Abreviaturas ou Siglas ATAN Atan Sistemas de Automação Empresa de automação industrial e comercial que oferece sistemas de informação, equipamentos e serviços a clientes dos mais diversos segmentos industriais, localizada em Belo Horizonte, MG. C++ Linguagem de programação de alto nível largamente utilizada para o desenvolvimento de software comercial. CMM Capability Maturity Model: Modelo de capacitação em desenvolvimento de software, elaborado pelo SEI (Software Engineering Institute) da Carnegie Mellon University. COM Microsoft Componente Object Model: Modelo para o desenvolvimento de componentes independentemente da linguagem de desenvolvimento utilizada. CST Companhia Siderúrgica de Tubarão Siderúrgica líder em exportação de Aço no Brasil, localizada em Serra, ES. DER Diagrama de Entidades e Relacionamentos. O diagrama contém o modelamento lógico das entidades existentes no sistema e seus relacionamentos. Excel Aplicativo de escritório desenvolvido pela Microsoft para a manipulação de planilhas virtuais. Microsoft Empresa líder na área de desenvolvimento de sistemas de software. Atua em diversas áreas, desde sistemas operacionais até o desenvolvimento de plataformas para desenvolvimento de software. SEI Software Engineering Institute, da Carnegie-Mellon University. Scrum Metodologia ágil apresentada neste trabalho, cujo foco recai sobre as atividades de gerenciamento de projetos. TI Sigla para a expressão Tecnologia da Informação. TPS Sigla usada para referenciar o Terminal de Produtos Siderúrgicos da CST. O TPS é usado pela CST para despachar produtos via transporte marítimo e se localiza no porto de Praia Mole, no município de Serra, ES. Windows Família de sistemas operacionais desenvolvidos pela Microsoft. XML Extensible Markup Language: linguagem desenvolvida para a descrição de hierarquias de dados. XP Extreme Programming Metodologia ágil apresentada neste trabalho, cujo foco está sobre as atividades de construção dos sistemas.
9 Sumário Resumo... 3 Abstract... 4 Lista de Ilustrações... 5 Lista de Abreviaturas ou Siglas Introdução Revisão Bibliográfica A Engenharia de Software As Metodologias Pesadas As Metodologias Ágeis Predição ou adaptação? A questão dos requisitos Desenho e construção Uma alternativa à predição Focalizando pessoas e não processos Gerenciamento de processos orientados a pessoas Processos versus Resultados Exemplos de Metodologias Ágeis Extreme Programming Os quatro valores de XP As práticas de XP Scrum A Metodologia Principais práticas de Scrum Estudo de Caso O sistema de embarque da CST Porque foram escolhidos XP e Scrum O desenvolvimento do Sistema O levantamento de requisitos O desenvolvimento do sistema Práticas implementadas Práticas não implementadas Resultados obtidos Conclusão Referências Bibliográficas... 36
10 1. INTRODUÇÃO Desde a década de 1960, a Engenharia de Software tem procurado encontrar técnicas para garantir o sucesso dos projetos de software. Ao longo dos últimos 30 anos, temos convivido com as metodologias tradicionais de desenvolvimento de software. Estas metodologias são baseadas nas disciplinas tradicionais da engenharia como a Engenharia Civil ou Elétrica, onde o desenvolvimento do sistema é dividido em duas fases distintas: o sistema é primeiramente planejado e, depois do planejamento pronto, o sistema é construído [MCC03], [MIL02]. Infelizmente, a análise dos resultados apresentados pelo uso destas metodologias não é muito animadora. Os sistemas construídos freqüentemente extrapolam seus cronogramas e orçamentos. As equipes trabalham desmotivadas e acabam não sendo produtivas como deveriam ser. Os sistemas entregues são muitas vezes cheios de defeitos e nem sempre contêm o conjunto de funcionalidades que melhor atendem a seus usuários [FOW01]. A utilização das metodologias tradicionais nem sempre é viável. São necessárias equipes grandes que trabalham para gerar muitos documentos. As metodologias definem muitos papéis o que conseqüentemente requer muito gerenciamento. O processo é basicamente preditivo: o sistema idealizado é construído e as mudanças realizadas no conjunto inicial de requisitos são punidas com faturamentos de extra-escopo [MIL02]. Este quadro desanimador tem trazido nos últimos anos aos engenheiros da área uma reflexão quanto a esta ser realmente a melhor forma de se fazer software. Do resultado desta reflexão surgem as metodologias ágeis para o desenvolvimento de software. Estas novas metodologias se baseiam principalmente no fato de que a natureza dos projetos de software o objeto de estudo da Engenharia de Software é diferente das demais áreas da engenharia. O software possui características dinâmicas demais para ser construído de forma preditiva [FOW01]. Neste trabalho apresentam-se os principais conceitos envolvendo as metodologias ágeis. Apresentam-se com mais detalhes as duas metodologias Extreme Programming (XP) e Scrum que foram utilizadas no desenvolvimento do Sistema de Embarque da CST. Este estudo de caso mostra como as metodologias ágeis podem ser aplicadas no desenvolvimento de projetos de software. 8
11 2. REVISÃO BIBLIOGRÁFICA Muito se tem falado sobre as metodologias ágeis para o desenvolvimento de software nos últimos anos. Muitos vêem estas metodologias como um antídoto à burocracia que as metodologias tradicionais representam. Outros as vêem como um modismo da década como muitos outros da área de TI; e ainda outros as vêem como uma oportunidade para produzir sistemas com baixa qualidade [FOW01]. O objetivo desta revisão é apresentar os principais princípios trazidos por estas metodologias. Como elas surgiram? Como elas pretendem resolver os problemas que elas apresentam? E como devem ser usadas? Estas são algumas perguntas que serão respondidas ao longo deste capítulo. Em primeiro lugar é necessário compreender o problema que este novo modelo pretende resolver A Engenharia de Software O desenvolvimento de software pode ser feito sem nenhuma metodologia, de forma caótica [PAU01], [FOW01]. Alguns autores chamam esta forma de desenvolvimento de codifica-remenda (do inglês code and fix ). A figura 1 abaixo (retirada de [PAU01]) representa esta situação. figura 1 o desenvolvimento de um produto pode ser feito sem o uso de nenhuma metodologia [PAU01]. Este modelo funciona bem para um sistema pequeno. Porém, à medida que seu tamanho aumenta, se torna cada vez mais complexo adicionar novas características. Além disso, defeitos começam a aparecer com freqüência e complexidade cada vez maiores [PAU01]. Esta análise identifica claramente dois problemas distintos. O primeiro é que não é possível desenvolver sistemas grandes ou complexos desta forma. O segundo é que não basta construir o sistema, ele precisa estar preparado para crescer e para ser corrigido. Um outro problema que não fica tão claro, mas que também deve ser destacado nesta análise, é que o desenvolvimento conduzido desta forma é imprevisível, em conseqüência direta de sua natureza caótica. 9
12 Como estes três problemas têm influência direta no negócio, concluímos que é impossível produzir software profissionalmente usando este tipo de desenvolvimento. Estes problemas não são novos e têm sido estudados há aproximadamente 30 anos pela disciplina de Engenharia de Software [SAN02], [MCC03]. Neste estudo, o desenvolvimento de software é tratado como uma disciplina da engenharia. Um sistema deve ser primeiramente planejado, e somente quando o planejamento estiver correto, o projeto deve ser executado para evitar o mau uso de recursos. Pelo mesmo raciocínio, quanto mais planejado for o sistema, melhor ele será executado. Quanto mais detalhado, menores as possibilidades de insucesso [MIL02]. Como resultado destes princípios temos as metodologias tradicionais da engenharia de software. Estas metodologias também são chamadas na literatura de metodologias pesadas (heavy weight methodologies) ou metodologias monumentais como uma forma de crítica ao seu tamanho e à dificuldade de serem implementadas na íntegra [FOW01] As Metodologias Pesadas A engenharia de software encara o software desenvolvido como um produto comercial, e como tal, o software tem um ciclo de vida. O ciclo de vida de um produto de software pode ser representado pela tabela 1 apresentada a seguir [PAU01]: Ciclo de vida Percepção da necessidade Concepção Elaboração Desenvolvimento Operação Retirada Construção Transição Desenho inicial Liberação Testes alfa Desenho detalhado Codificação Testes de unidade tabela 1 ciclo de vida de um produto de produto de software [PAU01]. Geralmente o desenvolvimento de produtos de software é feito dentro de um projeto. O processo de desenvolvimento é dividido em fases caracterizadas pelo objetivo a ser alcançado ao final de sua execução. Tradicionalmente estas fases são divididas da seguinte forma: Levantamento de Requisitos, Análise, Desenho, Implementação, Testes e Implantação. O desafio de qualquer metodologia de desenvolvimento de software é definir quando cada uma destas fases deve ocorrer dentro do projeto, quando ela deve iniciar e quando deve ser encerrada. A princípio esta é uma tarefa simples, pois existe uma ordem em que estas tarefas devem ocorrer. Se o desenvolvimento pudesse ocorrer totalmente sem erros e de uma maneira isolada (sem a influência de fatores externos) bastaria ordenar uma fase após a outra e nosso objetivo seria alcançado. 10
13 Uma das propostas mais simples para a condução de um projeto é desprezar a existência de tais fatores externos, e seqüenciar estas atividades conforme apresentado na figura 2 abaixo [PAU01]. Este modelo de ciclo de vida é chamado de Cascata. figura 2 ciclo de vida em Cascata [PAU01]. Cada uma das etapas deve produzir um artefato que servirá de base para a fase seguinte. A vantagem deste modelo é a possibilidade de ordenar o caos descrito na figura 1. Mas o processo não prevê a possibilidade de ocorrência de erros durante a execução da fase anterior, ou de fatores externos causarem alterações no projeto durante a sua execução. Isto soa como um sistema hipotético sem a influência de fatores externos, ao qual qualificaríamos como sistema ideal. Como tal sistema não existe, percebemos que na prática é impossível desenvolver um projeto seguindo este modelo assim como ele é descrito. Da evolução do modelo em cascata, surgiu o modelo Sashimi, apresentado na figura 3 abaixo [PAU01]. figura 3 ciclo de vida em Sashimi [PAU01]. Neste modelo as atividades de uma fase podem influenciar nas atividades de uma fase anterior. Isto permite corrigir erros ocorridos em fases anteriores no momento em que eles são detectados. 11
14 A desvantagem deste modelo é que o gerenciamento do projeto se torna muito complexo. É difícil de saber quando uma fase está realmente encerrada, porque esta definição acaba dependendo da conclusão de outras fases [PAU01]. Uma outra desvantagem destes dois modelos apresentados é que o cliente e o usuário só virão a receber algum resultado ao final do projeto. Do ponto de utilização por parte do usuário isto significa que a validação dos requisitos do sistema somente pode ser efetivamente realizada após o término do projeto. Do ponto de vista de retorno do investimento, isto significa que os recursos investidos no sistema somente apresentam retorno após o final do projeto. Não é isto que acontece em outras áreas da engenharia. Em muitos projetos (usinas hidrelétricas, sistemas de distribuição, shopping centers, etc...) após uma etapa inicial é possível iniciar o uso do sistema. A evolução é feita gradativamente, garantindo um retorno mais rápido do investimento e aumentando o conhecimento sobre o quê o usuário realmente espera do sistema. Uma alternativa mais moderna apresentada pela engenharia de software é o modelo em Espiral apresentado na figura 4 a seguir [PAU01]. figura 4 ciclo de vida em Espiral [PAU01]. Neste modelo, o sistema é desenvolvido em uma série de iterações. Cada iteração é representada por uma volta na espiral. Este modelo tem a vantagem de responder facilmente a erros em iterações anteriores, ou a modificações no projeto durante o processo de desenvolvimento. O principal problema apontado na literatura é que ele requer uma gestão muito sofisticada para ser previsível e confiável [PAU01]. Para sistemas muito dinâmicos, também existe o risco de que a inércia do modelo (se o número de documentos a serem atualizados for muito grande) imponha iterações muito grandes, ou não permita a evolução rápida do sistema. Os modelos de ciclo de vida para projetos apresentados neste capítulo formam a base das metodologias tradicionais de desenvolvimento de software. Existem algumas 12
15 variações que são interessantes, mas que não serão citadas aqui porque se desviam completamente do escopo deste trabalho As Metodologias Ágeis No final da década de 90, as bases das metodologias tradicionais começaram a ser questionadas [MIL02]. Dois principais motivos contribuíram para isto: - a alta freqüência com que os projetos de software deixavam de cumprir seus cronogramas e extrapolavam seus orçamentos; - a dificuldade de uso das metodologias pesadas. Como fruto dos questionamentos levantados em torno destes problemas ao longo dos últimos anos, surge um novo paradigma para o desenvolvimento de software as metodologias leves (lightweight metodologies) também chamadas de metodologias ágeis. As metodologias ágeis apresentam diferenças marcantes em relação às metodologias tradicionais, entre as quais iremos destacar as seguintes: - as metodologias ágeis são adaptativas ao invés de preditivas [FOW01]; - as metodologias ágeis são orientadas às pessoas e não a processos [FOW01]; - as metodologias ágeis são mais voltadas para o bem do negócio. Estes aspectos serão discutidos com mais detalhes nos tópicos a seguir Predição ou adaptação? As metodologias tradicionais de desenvolvimento de software são completamente baseadas na predição. Cada etapa de desenvolvimento do projeto é baseada na etapa anterior. Isto funciona bem se a concepção do sistema não sofre nenhuma alteração. Quando se percebe que uma definição não foi a mais acertada, a tendência natural deste tipo de metodologia é resistir às mudanças. Isto prejudica a evolução do sistema. As metodologias ágeis se baseiam no fato de que os sistemas mudam durante o desenvolvimento, pois à medida que o desenvolvimento ocorre, mais se conhece sobre o problema que o sistema deseja resolver. À medida que se conhece mais sobre o problema, melhores são as soluções encontradas. Nas metodologias ágeis, os processos são orientados para adaptar o sistema a mudanças durante todo o tempo A questão dos requisitos Um dos principais problemas (se não o principal) relacionados à predição em sistemas de software é a instabilidade dos requisitos. A natureza dos requisitos é dinâmica. Os requisitos de um sistema mudam constantemente. Um dos motivos pelos quais os requisitos mudam é o limite da capacidade humana de prever o sistema como um todo. Isto acontece em projetos de qualquer porte, 13
16 mas quanto maior o sistema, maior a dificuldade de se realizar uma especificação sem nenhum erro. A percepção que os usuários têm de suas necessidades também evolui à medida que eles conhecem o sistema. É difícil compreender o valor de uma determinada funcionalidade até que ela seja efetivamente usada, principalmente porque, não se pode requerer de um usuário comum a mesma capacidade de abstração que um desenvolvedor possui ao olhar um conjunto de requisitos. E mesmo que o sistema seja desenvolvido por desenvolvedores e para desenvolvedores, a percepção que o usuário tem de seu problema evolui à medida que ele conquista melhores mecanismos para atuar. Os requisitos do sistema também mudam por fatores externos ao sistema. Leis, condições de mercado, ou mesmo fatores políticos dentro das organizações fazem com que os requisitos se tornem obsoletos e se tenha que alterar o que era considerado um bom conjunto de requisitos há alguns meses atrás. Os processos tradicionais se baseiam na estabilidade dos requisitos. Como os requisitos têm uma natureza dinâmica, e os processos das metodologias pesadas são resistentes às mudanças, estes processos falham. As metodologias ágeis se adaptam constantemente ao conjunto de requisitos mais atual, e por isto têm chances de oferecer um melhor resultado aos projetos Desenho e construção Nas metodologias tradicionais percebe-se uma distinção clara entre a fase de desenho e a de construção. Isto vem da herança de outras disciplinas de engenharia, como a civil, mecânica ou elétrica, onde estas fases têm um perfil completamente diferente. Nestas engenharias, a fase de desenho geralmente é feita por uma mão de obra mais qualificada (e mais cara), que realiza toda a parte criativa do trabalho. Esta fase não é muito previsível. A fase de construção é feita por uma mão de obra menos qualificada (e mais barata), que executa o planejamento como ele foi feito. Esta fase é extremamente previsível. Durante o desenvolvimento de um projeto de software, dificilmente obtém-se um desenho com detalhamento suficiente para que os seus artefatos sejam diretamente codificados, sem que seja necessário tomar novas decisões [MIL02]. As decisões são atividades de desenho, e requerem pessoas com habilidades para atividades criativas. Em conseqüência disto, ou os projetos voltam para a área de desenho constantemente até serem refinados o suficiente (o que torna o processo lento, e acumula atrasos no projeto como um todo), ou os programadores são obrigados a tomar decisões durante a fase de construção, o que a descaracteriza como tal. Uma outra questão a ser analisada é a diferença de custos. Segundo Martin Fowler [FOW01], na construção de uma ponte por exemplo, os custos da etapa de desenho representam aproximadamente 10% do custo total de construção da ponte. Os outros 90% são consumidos durante a construção efetiva. Em software, esta relação praticamente se inverte: o tempo dedicado à codificação é aproximadamente 15% do tempo total de desenvolvimento do sistema. Isto nos leva a compreender que devemos tomar cuidado ao comparar sistemas de software com sistemas estudados em outras engenharias. A natureza do software é diferente. 14
17 Uma outra idéia interessante, apresentada por Jeck Reeves e citada por [FOW01], sugere uma nova forma de analisar o desenvolvimento de software. O código escrito durante o desenvolvimento de um sistema faz parte de sua documentação de desenho. O serviço de construção de fato é realizado pelos compiladores ao gerar o código de máquina de um software, linkar as bibliotecas e gerar arquivos executáveis. Analisando desta forma, a etapa de construção é instantânea e praticamente gratuita. Conclusões importantes: a atividade de codificação faz parte das atividades de desenho, e portanto, requer mão de obra qualificada para fazer o trabalho criativo e tomar decisões; atividades criativas são mais difíceis de se estimar, e por isto, trabalhar baseado em predição não é uma boa alternativa Uma alternativa à predição As metodologias ágeis propõem que os projetos devam ser conduzidos de forma adaptativa. Isto é feito através de desenvolvimento iterativo. A idéia central é trabalhar com iterações curtas. Cada iteração entrega ao seu final um produto completo e pronto para ser usado, que contém a implementação de um novo subconjunto de características. Esta idéia não é efetivamente nova. Formas de desenvolvimento iterativo já têm sido apresentadas pelas metodologias tradicionais em diferentes propostas (como o ciclo de vida em espiral, apresentado na seção 2.2 desta monografia). A novidade apresentada pelas metodologias ágeis é que o sistema entregue em cada iteração é completo e pode ser colocado diretamente em produção. Na verdade, cada iteração produz uma versão do sistema final. O desenvolvimento é feito de forma evolutiva. Ao final de cada iteração, usuários, clientes e desenvolvedores decidem sobre quais características devem ser adicionadas, quais devem ser modificadas, e até, quais devem ser retiradas do sistema. O sistema é desenvolvido da forma mais iterativa possível. A documentação e design do sistema geralmente são feitos de maneira informal durante o desenvolvimento. Ao final da iteração, a documentação considerada essencial ao entendimento do sistema é gerada ou atualizada de forma objetiva, visando facilitar a manutenção. Documentos que não apresentam utilidade real no processo não são gerados. Muitas vezes, parte da documentação é gerada por ferramentas que automatizam o processo de documentação. O tamanho das iterações é uma das questões chave sobre o desenvolvimento iterativo. Elas devem ser tão curtas quanto possível, desde que sejam suficientes para construir e testar um novo conjunto de funcionalidades. A ordem de grandeza sugerida na bibliografia da área é de três a quatro semanas Focalizando pessoas e não processos As metodologias ágeis procuram usar a natureza humana a seu favor. Desenvolver software, como qualquer outra atividade profissional, dever ser uma experiência interessante para quem a pratica. Por um outro lado, executar um processo adaptativo não é uma tarefa fácil. É preciso reunir pessoas talentosas. E somente reunir pessoas talentosas não é o suficiente: 15
18 elas precisam trabalhar bem como equipe. O resultado produzido deve ser maior que a soma das partes. Uma das principais características das metodologias tradicionais em se tratando de relacionamento com seus colaboradores é que as pessoas são tratadas como recursos, classificados pelo tipo de atividade que desempenham. A equipe de um projeto geralmente é indicada por números, como por exemplo, 1 analista, 3 programadores e 2 testadores, 1 gerente, etc. As pessoas são tratadas como componentes, como partes removíveis e substituíveis. Embora este tratamento facilite a predição, levanta-se a seguinte questão: as pessoas que trabalham em um projeto podem ser tratadas como componentes substituíveis? Uma das tendências das metodologias ágeis é rejeitar este tipo de pensamento. De acordo com a citação de [FOW01], Alistair Cockburn apresenta uma idéia bem interessante sobre este assunto no artigo entitulado Characterizing People as Non- Linear, First-Order Components in Software Development ( Caracterizando as Pessoas como Componentes Não Lineares de Primeira Ordem no Desenvolvimento de Software ). A idéia central é que uma pessoa apresenta um ritmo de trabalho único e completamente diferente, que é fruto da sua caminhada pessoal (sua formação e suas atividades profissionais e não profissionais praticadas até o momento). A reação de uma pessoa a determinados desafios pode ser completamente diferente da reação de outra pessoa. Os fatores que determinam seu sucesso e fracasso podem ser únicos. O resultado desta análise é que, tratar pessoas como componentes é simples demais e pouco eficiente. Para melhor gerenciar projetos de software, pessoas devem ser tratadas como indivíduos e não como recursos. Outro resultado interessante é que a abordagem tradicional também tem outros efeitos colaterais danosos. Tratar pessoas como recursos, afeta o moral e em conseqüência, a produtividade da equipe. Além disso, a tendência é que os indivíduos que se destacam por seu talento acabem indo procurar lugares em que são reconhecidos [FOW01] Gerenciamento de processos orientados a pessoas Conduzir processos orientados a pessoas é muito diferente de conduzir processos orientados a processos. Isto se manifesta em vários aspectos das metodologias ágeis. Um dos pontos mais importantes é a questão da motivação dos colaboradores para adotar o processo. Quando o processo é aceito ao invés de ser imposto, os resultados são equipes mais motivadas e mais produtivas [FOW01]. Uma situação completamente adversa é quando a gerência informa à equipe a adoção de um processo. A situação fica ainda mais delicada se a figura da gerência não gera simpatia para com a equipe, ou se a equipe não confia na gerência em assuntos técnicos. Nestas condições, é natural que as pessoas resistam ao processo imposto [FOW01]. A situação é completamente simétrica nas metodologias ágeis. Em algumas metodologias que requerem alto grau de disciplina por parte dos integrantes das equipes, como XP, o uso da metodologia precisa passar por uma decisão pessoal de cada indivíduo da equipe [BEC00]. Nas metodologias ágeis esta filosofia é levada às últimas conseqüências. Em alguns casos, somente a equipe técnica está autorizada a estimar horas para as tarefas 16
19 pendentes. Um outro exemplo é a prática de os próprios indivíduos escolherem as tarefas que desenvolverão durante a próxima iteração [BEC00] Processos versus Resultados O objetivo final de um projeto de software é que o sistema produzido cumpra seu papel. Na maioria dos projetos, todas as pessoas envolvidas no processo (gerentes, desenvolvedores, clientes e usuários) desejam realmente o sucesso do projeto. Vamos refletir um pouco mais fundo sobre o que realmente significa a palavra sucesso nesta situação. O objetivo final de um sistema de software é que os usuários tenham melhores condições de trabalho. O software deve permitir que o seu usuário produza mais e/ou melhor para que haja a compensação do custo do sistema. Isto significa não somente que o software deve atender às suas especificações, mas também que ele deve ser devidamente estudado para que os requisitos atendidos realmente reflitam as necessidades dos usuários. O software também deve funcionar bem dentro das condições para as quais foi desenvolvido. Por um outro lado, quem investe no desenvolvimento do sistema também tem suas aspirações para o sistema. É preciso haver retorno do investimento feito, para que possam ser feitos novos investimentos. A melhoria das condições de trabalho para os usuários deve refletir em benefício para o cliente. A empresa que fornece o software deseja fornecer um bom sistema, que atenda aos usuários e que agrade ao cliente. Isto gera retorno para a empresa através de novos contratos, melhores condições de venda e conseqüentemente, crescimento econômico. A equipe que desenvolve o sistema deseja fazer um bom trabalho. É um sentimento comum nas áreas da engenharia, e na área de software não é diferente. Fazer parte de uma equipe de sucesso traz satisfação pessoal. Além disto, os profissionais desejam ser reconhecidos pelo seu trabalho e a fórmula mais simples para alcançar este objetivo é apresentar um bom trabalho. Mas se todos os envolvidos efetivamente buscam o sucesso do projeto, porque tantos projetos de software nunca alcançam o sucesso? Porque é comum o fato de os projetos de software não cumprirem seus cronogramas, gastarem mais que o orçamento, apresentarem muitos bugs e, além de tudo, não atenderem completamente ao cliente? A única resposta plausível para esta questão é que existem erros no modelo tradicional de desenvolvimento [MIL02]. As metodologias ágeis, por sua natureza adaptativa e pelo seu foco em resultados, atende melhor às necessidades de cada uma das partes envolvidas no processo. Os usuários têm a oportunidade de obter um sistema mais próximo de suas necessidades, pois o modelo permite que, durante o seu desenvolvimento, o valor de cada característica seja reavaliado. As funcionalidades dispensáveis podem ser abandonadas e as funcionalidades essenciais podem ser melhoradas. O cliente tem um retorno mais rápido do seu investimento. Com o desenvolvimento através de iterações, as características que trazem mais resultados podem ser primeiramente implementadas. O retorno do investimento acontece antes do que aconteceria em outros casos, e pode influenciar de forma positiva o desenvolvimento do restante do sistema. Por outro lado, características que não agregam muito valor e que seriam incluídas no escopo de um sistema desenvolvido no modelo de 17
20 escopo fechado, acabam não sendo produzidas devido ao modelo iterativo do desenvolvimento. Os desenvolvedores têm a oportunidade de trabalhar em um ambiente de melhor produtividade. Os resultados positivos aumentam o moral da equipe, e isto influencia naturalmente na sua produtividade, formando assim um ciclo que torna a atividade mais interessante. Não existe necessidade de trabalhar contra a natureza humana. O fornecedor acaba sendo beneficiado trabalhando com equipes mais eficientes e produtivas. O sucesso dos projetos reflete no marketing da empresa, atraindo novos contratos e aumentando o seu valor de mercado. O modelo de produção de software trazido pelas metodologias pesadas não busca uma análise crítica de seus processos. O fato de os erros no produto final serem encarados como deficiências na execução do processo é extremamente simplista. Para concluir este tópico, é necessário lembrar que os processos tradicionais foram criados para o sucesso dos projetos de software. Se estes processos não conseguem garantir o sucesso dos projetos, eles merecem ser repensados. Se em algum momento se valorizou mais aos processos do que o software gerado através dele, é porque o foco do negócio foi completamente perdido Exemplos de Metodologias Ágeis Neste tópico são apresentadas com mais detalhes as metodologias ágeis em uso no desenvolvimento do Sistema de Embarque da CST. As fontes de pesquisa para estes tópicos são [BEC00] e [SCH01] Extreme Programming Segundo [BEC00], Extreme Programming (ou simplesmente XP) é uma metodologia ágil para equipes pequenas e médias desenvolvendo software com requisitos vagos e em constante mudança. XP nasceu no final dos anos 90, e tem como principal mentor Kent Beck apontado como o autor da metodologia. Ele é autor de vários livros sobre o tema, entre eles Extreme Programming Explained [BEC00], uma das mais importantes publicações sobre o tema das metodologias ágeis. Segundo os autores da metodologia, XP é código-cêntrica, ou seja, todo o desenvolvimento é voltado ao código. Em XP, a comunicação entre a equipe, ou entre equipes separadas geograficamente é feita através do código. Para se entender novas funcionalidades nos sistemas, os desenvolvedores olham o seu código. O ciclo de vida e o ambiente que envolve objetos complexos são definidos através de casos de teste, novamente no código. Problemas no software são demonstrados para a equipe com casos de testes que provam a sua existência, no código. O código é continuamente melhorado através do refactoring. O foco do desenvolvimento em XP é o código escrito para o sistema. A expressão Extreme Programming surgiu da seguinte idéia: se fosse possível controlar o desenvolvimento de um sistema através de um painel, onde houvesse botões giratórios, e que cada botão representasse a importância de uma atividade no desenvolvimento do projeto, qual seria a configuração que permitiria os melhores 18