<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>AgileZ &#187; Uncategorized</title>
	<atom:link href="http://www.brasiltech.net/agilez/category/uncategorized/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.brasiltech.net/agilez</link>
	<description>Metodologias e técnicas aplicadas a desenvolvimento e gerenciamento</description>
	<lastBuildDate>Wed, 29 Dec 2010 23:40:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Gerenciando seu c&#243;digo-fonte</title>
		<link>http://www.brasiltech.net/agilez/2010/02/09/gerenciando-seu-cdigo-fonte/</link>
		<comments>http://www.brasiltech.net/agilez/2010/02/09/gerenciando-seu-cdigo-fonte/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 19:53:42 +0000</pubDate>
		<dc:creator>Pitty</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[codigo-fonte]]></category>
		<category><![CDATA[cvs]]></category>
		<category><![CDATA[Práticas]]></category>

		<guid isPermaLink="false">http://www.brasiltech.net/agilez/2010/02/09/gerenciando-seu-cdigo-fonte/</guid>
		<description><![CDATA[Um código fonte ‘sadio’ é uma das chaves para o sucesso de um projeto, e um CVS (control version system) é uma ferramenta fundamental para manter a saúde do seu código fonte. No entanto, somente uma boa ferramenta não garante um bom controle de versão. Ela deve ser amparada por boas práticas que normatizam sua [...]]]></description>
			<content:encoded><![CDATA[<p>Um código fonte ‘sadio’ é uma das chaves para o sucesso de um projeto, e um CVS (control version system) é uma ferramenta fundamental para manter a saúde do seu código fonte. No entanto, somente uma boa ferramenta não garante um bom controle de versão. Ela deve ser amparada por boas práticas que normatizam sua utilização. Para analisar se você utiliza corretamente seu controle de versão, verifique se pelo menos as seguintes perguntas podem ser rapidamente atendidas:<a href="http://exocortex.files.wordpress.com/2010/02/codigofonte.jpg"><img style="border-right-width: 0px;border-top-width: 0px;border-bottom-width: 0px;margin-left: 0px;border-left-width: 0px;margin-right: 0px" border="0" alt="codigo-fonte" align="right" src="http://exocortex.files.wordpress.com/2010/02/codigofonte_thumb.jpg" width="242" height="190" /></a></p>
<ul>
<li>
<p>Como era o método XYZ da classe FooBar na versão 2.0.3.12 do projeto?</p>
</li>
<li>
<p>Quais foram as alterações feitas para incluir suporte à NF-e?</p>
</li>
<li>
<p>Quando esta linha de código foi adicionada ao método XYZ?</p>
</li>
<li>
<p>Consigo compilar e executar o sistema na versão 2.0.2.15 para reproduzir e consertar o bug de um cliente?</p>
</li>
</ul>
<p>Se o seu controle de versão não consegue responder a estas perguntas, então está na hora de rever as práticas do seu time. Uma ferramenta de controle de versão não deve servir somente como um backup do código fonte, onde, ao final do dia, o desenvolvedor deposita seu trabalho inacabado. Ela deve ser um santuário, o repositório sagrado que exige do desenvolvedor todo respeito e cuidado. Afinal, o artefato mais valioso de um projeto, o código fonte, está guardado ali. Portanto, não basta instalar um controle de versão e sair usando. O time deve rever seus conceitos e absorver as mudanças necessárias, que podem ser dolorosas. No entanto, após um tempo, o time começa a colher os frutos do terreno bem preparado.</p>
<p>Há pouco tempo li um artigo muito bom do <a href="http://eduardomiranda.net/blogs/dotnet" target="_blank">Eduardo Miranda</a> sobre gerência de versionamento, onde ele cita algumas práticas boas e ruins. Vamos a elas:</p>
</p>
<p> <span id="more-131"></span>
</p>
<h6></h6>
<h4><strong>Boas práticas</strong></h4>
<ol>
<li>
<p><strong>O código-fonte no servidor deve estar sempre pronto para compilação. </strong>Ou seja, a qualquer momento do dia deve ser possível buscar a cópia da última versão disponível do servidor e compilar uma nova versão da aplicação.</p>
</li>
<li>
<p><strong>Toda <em>changelist </em>(conjunto de alterações que foram submetidas juntas) submetida visa <span style="text-decoration: underline">melhorar</span> o produto, <span style="text-decoration: underline">nunca piorar</span>.</strong> O código fonte é sagrado e deve ser total e completamente respeitado. Uma changelist corrige um defeito, adiciona uma funcionalidade, refatora um trecho de código. O desenvolvedor não pode submeter changelists que quebrem o build, seja pela adição de erros de compilação ou pela quebra dos testes automatizados. O time com o qual trabalho tem uma prática problemática que é fazer chekins parciais de código para compartilhar com outro desenvolvedor as alterações feitas. Não tem problema, desde que feito em um ramo de versão temporário especialmente criado para isso (também conhecido como <em>branch)</em>. Assim, o ramo principal (o chamado <em>trunk) </em>não fica ‘contaminado’ com códigos incompletos. Somente quando toda codificação estiver terminada e os testes unitários completos, podemos fazer um merge do ramo temporário com o ramo principal. Claro que o trabalho é maior devido ao merge, mas a maioria das atuais ferramentas de CVS oferecem um bom suporte para isso.</p>
</li>
<li>
<p><strong>Submeta suas alterações o mais rápido possível e com freqüência. </strong>Quanto mais tempo um arquivo fica em alteração mais difícil se torna seu merge e mais aumenta o risco de quebra do build. Divida suas alterações em pequenos pacotes compiláveis e testáveis e submeta sempre.</p>
</li>
<li>
<p><strong>Oh-oh! Atenção, build quebrado! </strong>Se o build está quebrado não submeta alterações nem sincronize sua cópia de trabalho. Um <em>build break</em> é um estado que deve ser tratado com a máxima prioridade. Neste estado não é possível garantir que a sua alteração compila e não quebra testes, portanto não é possível garantir sua qualidade. Por outro lado, sincronizar sua cópia de trabalho irá corrompê-la, o que te impedirá de compilar e testar as funções localmente.</p>
</li>
<li>
<p><strong>Controle tudo que é necessário para compilar e instalar a aplicação.</strong> Código-fonte não é a única matéria prima para compilação e instalação dos aplicativos. Sua aplicação pode depender de bibliotecas de terceiros. Neste caso, é necessário armazenar no repositório uma cópia do binário na versão utilizada pela aplicação. Em caso de atualização, a nova versão deve ser submetida junto com toda a alteração no código-fonte da sua aplicação necessária para suportar a versão.</p>
</li>
<li>
<p><strong>Estabeleça critérios de qualidade. </strong>Código sem erros de compilação é o mínimo aceitável. A partir do momento que o objetivo passa a ser melhorar a aplicação, novos parâmetros de qualidade devem ser adotados para aprovação de um check in: código sem <em>warnings</em> e <em>hints, </em>testes unitários executados, métricas de complexidade mantidas, etc.</p>
</li>
</ol>
<h4>Práticas ruins</h4>
<p>Qualquer prática que vá de encontro ao objetivo de ter no repositório uma versão compilável, testada e sempre melhor da aplicação, é uma prática ruim e deve ser evitada. Mas algumas são típicas e merecem destaque:</p>
<ul>
<li>
<p><strong>Não submeta alterações em cima da hora.</strong> Sexta-feira, 18h, você louco para ir embora e não estará no sábado de amanhã de prontidão para resolver algum problema.</p>
</li>
<li>
<p><strong>Não segure as alterações em sua cópia de trabalho por muito tempo. </strong>Código-fonte fora de repositório estraga como comida fora da geladeira. Tentar submeter uma alteração feita há 2 meses no repositório gera um trabalho enorme e um elevado risco de quebra de build.</p>
</li>
<li>
<p><strong>Nunca ignore a política de check in. </strong>Mesmo alterações simples podem quebrar um build. </p>
</li>
</ul>
<h4>Finalizando</h4>
<p>O controle de versão é provavelmente a ferramenta mais útil e fundamental no desenvolvimento de software e uma das mais utilizadas no dia-a-dia do desenvolvedor. É necessário sempre se preocupar com a facilidade de uso, para que ela não atrapalhe a produtividade nem caia em desuso, sem, contudo, abrir mão dos seus objetivos primordiais.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brasiltech.net/agilez/2010/02/09/gerenciando-seu-cdigo-fonte/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Porque o planejamento tradicional n&#227;o funciona?</title>
		<link>http://www.brasiltech.net/agilez/2009/11/04/porque-o-planejamento-tradicional-nao-funciona-2/</link>
		<comments>http://www.brasiltech.net/agilez/2009/11/04/porque-o-planejamento-tradicional-nao-funciona-2/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 23:52:42 +0000</pubDate>
		<dc:creator>Pitty</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[planejamento]]></category>

		<guid isPermaLink="false">http://www.brasiltech.net/agilez/2009/11/04/porque-o-planejamento-tradicional-nao-funciona-2/</guid>
		<description><![CDATA[Estimativa e planejamento são passos críticos para o sucesso de qualquer projeto de desenvolvimento de software. No entanto, planejar é uma atividade difícil e os planos geralmente falham. Estimativas feitas no início de um planejamento ou projeto tem pouquíssima exatidão e a probabilidade de termos uma estimativa correta para um planejamento de 1 ano é [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.brasiltech.net/agilez/wp-content/uploads/2009/11/planejamento.jpg"><img style="border-right-width: 0px;margin: 0px 15px 0px 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px" src="http://www.brasiltech.net/agilez/wp-content/uploads/2009/11/planejamento_thumb.jpg" border="0" alt="planejamento" width="180" height="181" align="left" /></a>Estimativa e planejamento são passos críticos para o sucesso de qualquer projeto de desenvolvimento de software. No entanto, planejar é uma atividade difícil e os planos geralmente falham. Estimativas feitas no início de um planejamento ou projeto tem pouquíssima exatidão e a probabilidade de termos uma estimativa correta para um planejamento de 1 ano é muito menor que a probabilidade de acertarmos a estimativa para um planejamento de 2 semanas. Esse refinamento na probabilidade do acerto das estimativas é chamado de <em>cone da incerteza (Boehm, 1981)</em>.</p>
<p>No entanto, a dificuldade em planejar não é desculpa para não fazê-lo. O planejamento reduz o risco, diminui a incerteza, ajuda na tomada de decisões, estabelece uma maior confiança e dissemina informações. Infelizmente, o planejamento tradicional não vem funcionando. Ao tentar combinar e responder às necessidades do trio escopo\cronograma\recursos, o planejamento tradicional não nos leva a respostas e produtos satisfatórios.</p>
<p>E por que o planejamento tradicional não funciona? Mike Cohn, em seu livro <em>Agile Estimating and Planning,</em> elenca 5 causas para as falhas de planejamento.<span id="more-95"></span></p>
<ol>
<li>
<div><strong>O planejamento é baseado nas tarefas necessárias e não nos recursos desejados.<br />
</strong>É vital o time manter o foco nos requisitos solicitados; são eles que agregam valor para o cliente (veja <a href="http://www.brasiltech.net/agilez/2009/10/12/voce-entrega-algo-de-valor-para-seu-cliente-fdd-desenvolvimento-orientado-a-funcionalidade/" target="_blank">&#8220;Você entrega algo de valor para seu cliente?&#8221;</a>). Tarefas por si só não agregam valor algum. Além disso, os planejamentos tradicionais, por basearem-se em tarefas, preocupam-se com a dependência entre elas. Assim, atrasos em qualquer tarefa acumulam-se no final do cronograma, pois são repassados pela cadeia de dependência.</div>
</li>
<li>
<div><strong>Executar tarefas simultaneamente agora acaba gerando atrasos no futuro.<br />
</strong>Com a melhor das intenções, o time pode ver a multitarefa como uma possível solução para atrasos. No entanto, ao trabalhar em duas tarefas ao mesmo tempo, um membro do time provavelmente prorrogará o término das duas. Como outras tarefas dependem das primeiras (lembra do item anterior?), é quase certo que um atraso será embutido na cadeia de dependência, refletindo-se no prazo de entrega final.
<div></div>
</div>
</li>
<li>
<div><strong>Não se atende aos requisitos pela prioridade dos mesmos.<br />
</strong>O pensamento tradicional diz que, se todo trabalho é completado, não importa a ordem em que é feito. Nesse caso, é natural que a seqüência e priorização das tarefas siga a conveniência do time de desenvolvimento e não a importância dos requisitos para o cliente. Como conseqüência, é muito provável que no final do projeto, para manter o cronograma, o time acabe descartando requisitos importantes que não foram corretamente priorizados.</div>
</li>
<li>
<div><strong>O planejamento antecipado sempre contém um certo grau de incerteza que é ignorado.<br />
</strong>O planejamento tradicional não considera as incertezas presentes em todo projeto de software. Ele assume que a análise inicial será completa e perfeita e que coletará todos os requisitos do produto. Assume também que os usuários não mudarão de idéia, que nenhuma necessidade nova aparecerá durante a execução do projeto e que sabemos exatamente como os requisitos serão  implementados. É claro que isso não é verdade; tudo o que não sabemos no início do projeto é uma incerteza que deve ser considerada no planejamento, e a melhor forma de lidar com as incertezas é através de iterações curtas com feedbacks rápidos e constantes.</div>
</li>
<li>
<div><strong>Estimativas com alto nível de incertezas e baixa probabilidade de acerto acabam se tornando compromissos.<br />
</strong>Dentro de cada estimativa está embutida uma <em>probabilidade </em>do trabalho ser finalizado no tempo previsto. Uma probabilidade varia de 0 a 100%. Portanto, ao estimar a duração de uma tarefa estamos dizendo que existe uma probabilidade de x % de terminarmos a tarefa em y dias. O problema é que compromissos não podem ser assumidos sobre probabilidades; eles são assumidos sobre uma data.</div>
</li>
</ol>
<p>O planejamento ágil ataca esses problemas focando nos requisitos. A unidade mínima de entrega é um requisito completo; não importa quantas tarefas foram terminadas, se um requisito não está completamente implementado, ele não está entregue. A priorização baseia-se nos requisitos de maior valor para o cliente e não nas tarefas do time de desenvolvimento. O time todo trabalha para entregar um requisito, por isso praticamente não existe multitarefa. O planejamento é incremental; assume-se que no início do projeto sabemos muito pouco sobre o que será feito e sobre como será feito. O time encontrará essas respostas gradativamente, conforme implementa requisito por requisito.</p>
<p>Parece utópico, mas funciona. Qualquer um que desenvolveu software sabe que nunca conseguimos levantar todos os requisitos necessários para um sistema, por maior que seja o esforço. Conheço uma pessoa que trabalha para uma grande empresa indiana que possui a famosa certificação CMM5. Há 2 anos ela realiza levantamento de requisitos para o sistema de um grande banco brasileiro. Dois longos anos de trabalho da equipe; nenhuma linha de código foi escrita, nenhum requisito foi entregue; somente algumas centenas de artefatos obrigatoriamente gerados pela especificação do CMM5. Claro, CMM5 garante qualidade, mesmo que a um custo altíssimo, certo? Mas qual a probabilidade dos requisitos levantados há dois anos ainda serem válidos? Será que ainda representam o que o cliente <em>quer</em> <em>atualmente</em>? Acho pouco provável.</p>
<p>E você, qual sua opinião?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brasiltech.net/agilez/2009/11/04/porque-o-planejamento-tradicional-nao-funciona-2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

