<?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; projeto</title>
	<atom:link href="http://www.brasiltech.net/agilez/tag/projeto/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>Sun, 25 Jul 2010 19:38:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=abc</generator>
		<item>
		<title>Voc&#234; entrega algo de valor para seu cliente?</title>
		<link>http://www.brasiltech.net/agilez/2009/10/12/voce-entrega-algo-de-valor-para-seu-cliente-fdd-desenvolvimento-orientado-a-funcionalidade/</link>
		<comments>http://www.brasiltech.net/agilez/2009/10/12/voce-entrega-algo-de-valor-para-seu-cliente-fdd-desenvolvimento-orientado-a-funcionalidade/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 22:23:10 +0000</pubDate>
		<dc:creator>Douglas Cunha</dc:creator>
				<category><![CDATA[Metodologias]]></category>
		<category><![CDATA[estimativas]]></category>
		<category><![CDATA[fdd]]></category>
		<category><![CDATA[produtividade]]></category>
		<category><![CDATA[projeto]]></category>
		<category><![CDATA[scrum]]></category>

		<guid isPermaLink="false">http://www.brasiltech.net/agilez/2009/10/12/voce-entrega-algo-de-valor-para-seu-cliente-fdd-desenvolvimento-orientado-a-funcionalidade/</guid>
		<description><![CDATA[Quando trabalhamos com equipes mais enxutas, utilizando metodologias ágeis (como o Scrum), temos um considerável poder de decisão e planejamento sobre o que será implementado em cada build. Digo considerável pois existem vários fatores que influenciam o que fará parte do seu sprint (sprint é uma interação que segue o ciclo PDCA e entrega incremento [...]]]></description>
			<content:encoded><![CDATA[<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="dilbert" src="http://www.brasiltech.net/agilez/wp-content/uploads/2009/10/dilbert.gif" border="0" alt="dilbert" width="591" height="208" /></p>
<p>Quando trabalhamos com equipes mais enxutas, utilizando metodologias ágeis (como o Scrum), temos um considerável poder de decisão e planejamento sobre o que será implementado em cada build. Digo considerável pois existem vários fatores que influenciam o que fará parte do seu sprint (<a rel="nofollow" href="http://pt.wikipedia.org/wiki/Scrum" target="_blank">sprint</a> é uma interação que segue o ciclo <a rel="nofollow" href="http://pt.wikipedia.org/wiki/Ciclo_pdca" target="_blank">PDCA</a> e entrega incremento de software pronto), como a priorização do <em>Product Owner (</em>o cliente)<em>, </em>tamanho estimado para cada uma das <em>user stories </em>que farão parte da interação, restrições técnicas e outras.</p>
<p>Durante o processo de estimativa, é comum decompormos as <em>user stories</em> em várias tarefas menores, com o objetivo de facilitar a pontuação de cada uma delas. Esse processo é adequado e, se bem feito, aumenta muito a precisão das estimativas, porém, ao quebrar uma solicitação em atividades menores, corremos um sério risco de perdermos de vista o real objetivo de cada uma das tarefas, que é contribuir para a conclusão de um recurso solicitado pelo cliente. Convém não esquecermos que, para o cliente, essas pequenas atividades geralmente não possuem valor por si, a não ser que todas sejam feitas e a <em>feature </em>solicitada seja entregue.<span id="more-90"></span></p>
<p>No parágrafo anterior, introduzi dois conceitos chaves para este artigo: o conceito de <em>feature </em>e <em>valor.</em> Uma <em>Feature </em>pode ser definida como um recurso/funcionalidade e geralmente é escrita da seguinte forma: &lt;ação&gt;&lt;resultado&gt;&lt;objeto&gt;. Por exemplo &lt;emitir&gt;&lt;a nota fiscal&gt;&lt;de venda&gt; (para mais detalhes, veja <a rel="nofollow" href="http://www.heptagon.com.br/fdd-oque" target="_blank">FDD</a> – uma metodologia ágil guiada por funcionalidade). Já <em>valor</em>, neste contexto, é toda <em>feature </em>que traga algum benefício para o cliente, ou seja, é seu cliente (no scrum chamado de <em>Product Owner</em>) quem deve <strong>valorar </strong>o recurso.</p>
<p>Tendo isto em mente, podemos dizer que uma interação deve ter como <strong>principal </strong>objetivo entregar uma nova versão/build com novas funcionalidades para o cliente. Toda implementação que não contribua para a inclusão das novas <em>features</em> deve ser considerada tempo perdido e ser removida do <em>sprint.</em> Um pouco radical? Vejamos: refactoring, melhorias visuais, troca de tecnologia, otimizações e outras, será que tudo isto pode ser considerado tempo perdido? A resposta é sim e não. Não se a alteração for necessária para dar estrutura ao desenvolvimento de um novo recurso, e sim se for somente para satisfazer o ego do programador. É claro que tudo tem sua exceção, e uma refatoração visual pode, por exemplo, ser uma necessidade de mercado e ser solicitada pelo departamento de marketing, e por esse motivo ser considerada uma <em>feature </em>de valor devido ao seu significado estratégico para o  mercado.</p>
<p>Ao planejar seu <em>sprint </em>focando em funcionalidades, deverá tomar cuidado para que nenhuma funcionalidade seja entregue pela metade. Por isso, verifique a possibilidade com o cliente de desmembrar recursos maiores em partes, e entregue uma parte a cada final de interação, deixando claro que a cada fim de <em>sprint </em>ele deverá ter uma versão do programa funcionando e com um novo valor agregado.</p>
<p>Relatórios como o <em>Parking Lot</em>, que nos dá uma visão de progresso por <em>feature</em>, são indispensáveis para gerenciar o andamento do <em>sprint</em> e antecipar qualquer problema que implique na não entrega de uma funcionalidade completa para o cliente. Veja abaixo um exemplo:</p>
<p><a href="http://www.brasiltech.net/agilez/wp-content/uploads/2009/10/ParkingLot.045.preview.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ParkingLot.045.preview" src="http://www.brasiltech.net/agilez/wp-content/uploads/2009/10/ParkingLot.045.preview_thumb.png" border="0" alt="ParkingLot.045.preview" width="593" height="445" /></a></p>
<p>(imagem de: <a title="http://www.featuredrivendevelopment.com/node/1038" href="http://www.featuredrivendevelopment.com/node/1038">http://www.featuredrivendevelopment.com/node/1038</a>)</p>
<p>Existem vários outros conceitos utilizados neste relatório, como a divisão de funcionalidades por área de negócio, que não irei explicar aqui neste artigo. Para se aprofundar mais sobre o desenvolvimento dirigido à funcionalidade, leia o excelente livro do Alexandre Magno: <a rel="nofollow" href="http://www.visaoagil.com/downloads/biblioteca/axmagno_FDDEmUmaCascaDeBanana.pdf" target="_blank">FDD em uma casca de banana</a> e veja o que se encaixa na realidade de sua equipe.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brasiltech.net/agilez/2009/10/12/voce-entrega-algo-de-valor-para-seu-cliente-fdd-desenvolvimento-orientado-a-funcionalidade/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Programe para uma interface, n&#227;o para uma implementa&#231;&#227;o</title>
		<link>http://www.brasiltech.net/agilez/2009/08/09/como-programar-para-uma-interface-e-nao-para-uma-implementacao/</link>
		<comments>http://www.brasiltech.net/agilez/2009/08/09/como-programar-para-uma-interface-e-nao-para-uma-implementacao/#comments</comments>
		<pubDate>Mon, 10 Aug 2009 00:38:32 +0000</pubDate>
		<dc:creator>Douglas Cunha</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[projeto]]></category>
		<category><![CDATA[simplicidade]]></category>

		<guid isPermaLink="false">http://www.brasiltech.net/agilez/2009/08/09/como-programar-para-uma-interface-e-nao-para-uma-implementacao/</guid>
		<description><![CDATA[Um conceito simples, mas nem sempre bem entendido e aplicado. &#8216;Programar para uma interface e não para uma implementação&#8217;, você sabe o que isto significa? Apesar deste conceito ser aplicável a projetos de software, é mais antigo que ele, e é utilizado bem antes do primeiro compilador ser desenvolvido. Um exemplo bem obvio do que [...]]]></description>
			<content:encoded><![CDATA[<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="engrenagens" border="0" alt="engrenagens" src="http://www.brasiltech.net/agilez/wp-content/uploads/2009/08/engrenagens.jpg" width="257" height="193" /></p>
<p>Um conceito simples, mas nem sempre bem entendido e aplicado. &#8216;Programar para uma interface e não para uma implementação&#8217;, você sabe o que isto significa?</p>
<p>Apesar deste conceito ser aplicável a projetos de software, é mais antigo que ele, e é utilizado bem antes do primeiro compilador ser desenvolvido. Um exemplo bem obvio do que é isto, pode ser encontrado na casa de qualquer pessoa: um interruptor de luz. &#8216;Como assim José?&#8217;.</p>
<p>Um interruptor de luz é um exemplo muito bom. Consiste em um botão, que liga e desliga a luz. Uma <strong>interface</strong> simples, que <strong>esconde</strong> os detalhes de implementação de quem vai utilizá-la. Para ligar a luz, basta apertar o botão, e para desligá-la, adivinhem? Aperte novamente. A implementação está bem <strong>encapsulada – </strong>o usuário não precisa entender nada de pólo positivo, neutro, 127v, amperagem ou resistência. Qual foi o pensamento do designer ao projetar um interruptor de luz? Com certeza foi algo parecido com: &#8216;qual o mínimo possível de informação o usuário do meu produto precisa para usá-lo?&#8217;. </p>
<p><span id="more-19"></span>  Falando em programação de software, podemos aplicar este conceito a vários pontos. Quando estamos codificando, ao criar uma nova classe, devemos sempre nos fazer a mesma pergunta que o designer do interruptor de luz fez: &#8216;quais operações e atributos eu devo tornar públicos para que o usuário possa usá-la de forma simples?&#8217; e a cada nova implementação: &#8216;será que eu preciso expor estes parâmetros? E esse novo atributo?&#8217;. Classes com menos operações e atributos públicos, geralmente são mais simples de serem utilizadas. Lembre-se sempre: outros programadores terão que interagir com as classes e bibliotecas que você desenvolveu. Mantenha a simplicidade e procure ser objetivo.
</p>
<p>Ao criar uma nova tela de cadastro, analogamente: &#8216;quais controles o usuário vai precisar para executar as operações a qual a janela se destina?&#8217;. Um erro muito comum cometido por projetistas de interfaces gráficas é transmitir a forma de funcionamento interno do algoritmo para o usuário. O clássico exemplo são as telas de cadastro. Todo mundo desenvolve, ou já desenvolveu, uma tela com os famosos botões <strong>novo, editar, cancelar, excluir </strong>e<strong> salvar</strong>, pois é a forma como o seu algoritmo funciona, e fica mais fácil publicar essa característica para o usuário. Mas, será que o usuário realmente precisa de um botão &#8216;editar&#8217; quando ele quer editar um registro? Não seria mais fácil o seu sistema detectar que alguém está tentando alterar um registro e simplesmente entrar em modo de edição, como funciona, por exemplo, um editor de texto? Um botão a menos na tela, na maioria das vezes, pode significar uma interface mais simples – que é o sonho de todo usuário.</p>
<p>Poderia citar dezenas de exemplo aqui, mas a idéia não muda. Um carro com câmbio automático é muito melhor do que um no qual você precisa apertar a embreagem para trocar de marcha. E ambos funcionam, só que o primeiro é mais simples.</p>
<p>É lógico que, ao começar a <strong>pensar </strong>dessa forma, o programador vai sentir necessidade de amparo por algumas técnicas que ele pode ainda não dominar – técnicas que serão abordadas por aqui – como padrões de projetos ou Grasp. Um caminho que provavelmente não terá volta, e fará de você um melhor projetista de software.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brasiltech.net/agilez/2009/08/09/como-programar-para-uma-interface-e-nao-para-uma-implementacao/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
