<?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>Tagview Tecnologia</title>
	<atom:link href="http://blog.tagview.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.tagview.com.br</link>
	<description>Soluções web</description>
	<lastBuildDate>Mon, 30 Aug 2010 18:40:11 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Extendendo classes na inicialização de sua aplicação Rails</title>
		<link>http://blog.tagview.com.br/2010/08/extendendo-classes-na-inicializacao-de-sua-aplicacao-rails/</link>
		<comments>http://blog.tagview.com.br/2010/08/extendendo-classes-na-inicializacao-de-sua-aplicacao-rails/#comments</comments>
		<pubDate>Wed, 25 Aug 2010 16:57:59 +0000</pubDate>
		<dc:creator>Augusto Souza</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://blog.tagview.com.br/?p=120</guid>
		<description><![CDATA[Recentemente, vi uma discussão no grupo de emails &#8220;rails-br&#8221; sobre como extender a classe String em uma aplicação Ruby on Rails. Na Tagview, costumamos utilizar muito este recurso em nossos projetos e acredito que fazemos isto de uma maneira bastante limpa e legível. Neste post vou detalhar este processo.
Vou utilizar no exemplo um código que [...]]]></description>
			<content:encoded><![CDATA[<p>Recentemente, vi uma discussão no grupo de emails &#8220;rails-br&#8221; sobre como extender a classe String em uma aplicação Ruby on Rails. Na Tagview, costumamos utilizar muito este recurso em nossos projetos e acredito que fazemos isto de uma maneira bastante limpa e legível. Neste post vou detalhar este processo.</p>
<p>Vou utilizar no exemplo um código que adiciona um método à classe String. Mas, gostaria de ressaltar que podemos extender qualquer classe do Ruby ou do Rails com este mesmo procedimento. Suponha que queremos adicionar um método de instância à classe String. Este método retornará a própria string, mas sem acentos. Vamos chamo-lo de &#8220;no_accent&#8221;. Lembrando que nem Ruby nem Rails implementam algum método que faça isto.</p>
<p>Primeiramente, vamos definir um módulo que contenha este nosso método. Vamos chamá-lo de &#8220;StringExtensions&#8221;.</p>
<pre class="ruby" name="code">
module StringExtensions
  def no_accent
    self.
        gsub(/á/,  'a').     # à =&gt; a
        gsub(/á/,  'a').     # á =&gt; a
        gsub(/â/,  'a').     # â =&gt; a
        gsub(/ã/,  'a').     # ã =&gt; a
        gsub(/é/,  'e').     # é =&gt; e
        gsub(/ê/,  'e').     # ê =&gt; e
        gsub(/í/,  'i').       # í =&gt; i
        gsub(/ó/,  'o').     # ó =&gt; o
        gsub(/ô/,  'o').     # ô =&gt; o
        gsub(/ã/,  'o').     # õ =&gt; o
        gsub(/ú/,  'u').     # ú =&gt; u
        gsub(/ü/,  'u').     # ü =&gt; u
        gsub(/ç/,  'c').      # ç =&gt; c
        gsub(/À/,  'A').     # À =&gt; A
        gsub(/Á/,  'A').     # Á =&gt; A
        gsub(/Â/,  'A').     # Â =&gt; A
        gsub(/Ã/,  'A').     # Ã =&gt; A
        gsub(/É/,  'E').      # É =&gt; E
        gsub(/Ê/,  'E').      # Ê =&gt; E
        gsub(/Í/,  'I').        # Í =&gt; I
        gsub(/Ó/,  'O').     # Ó =&gt; O
        gsub(/Ô/,  'O').     # Ô =&gt; O
        gsub(/Õ/,  'O').     # Õ =&gt; O
        gsub(/Ú/,  'U').      # Ú =&gt; U
        gsub(/Ü/,  'U').      # Ü =&gt; U
        gsub(/Ç/,  'C')       # Ç =&gt; C
  end
end
</pre>
<p>Agora, basta incluir este módulo na classe String, certo? Sim, porém isto não é tão simples. O método de classe &#8220;include&#8221; é privado. Uma técnica interessante para burlar este problema é o uso do método &#8220;send&#8221; em cima do objeto que representa a classe String. Este método não é privado e aceita como argumentos: um método a ser chamado e os parametros a serem passados para este método. Assim, podemos incluir nosso módulo StringExtensions a classe String com o seguinte código:</p>
<pre class="ruby" name="code">String.send :include, StringExtensions</pre>
<p>Para adicionar toda esta lógica à nossa aplicação basta criarmos um arquivo string_extensions.rb na pasta &#8220;config/initializers&#8221;. Neste arquivos adicionaremos nosso módulo e na última linha o código acima. Quando a aplicação for executada os arquivos &#8220;.rb&#8221; desta pasta serão executados em ordem alfabética e para toda string de nossa aplicação poderemos chamar o método &#8220;no_accent&#8221;.</p>
<p>Esta é uma dica bastante simples porém muito útil. Extender classes pode ser um ótimo começo para um código mais clean, facil de manter e componentizável (imagine que em um próximo projeto RoR você pode reutilizar seus initializers).</p>
<p>Abraços e até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tagview.com.br/2010/08/extendendo-classes-na-inicializacao-de-sua-aplicacao-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configurações básicas no .gitconfig</title>
		<link>http://blog.tagview.com.br/2010/08/configuracoes-basicas-no-gitconfig/</link>
		<comments>http://blog.tagview.com.br/2010/08/configuracoes-basicas-no-gitconfig/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 20:02:49 +0000</pubDate>
		<dc:creator>Daniel Teixeira</dc:creator>
				<category><![CDATA[Git]]></category>
		<category><![CDATA[gitconfig]]></category>

		<guid isPermaLink="false">http://blog.tagview.com.br/?p=105</guid>
		<description><![CDATA[Algo que eu sempre me esqueço quando vou configurar uma nova máquina são as configurações do ~/.gitconfig. Dentre elas:
[core]
  excludesfile = /home/daniel/global-gitignore
Essa configuração faz com que o arquivo /home/daniel/global-gitignore funcione como o .gitignore mas para todos os repositórios git, sendo um adicional ao eventual .gitignore do seu projeto.
[push]
  default = tracking
Define que, por [...]]]></description>
			<content:encoded><![CDATA[<p>Algo que eu sempre me esqueço quando vou configurar uma nova máquina são as configurações do <strong>~/.gitconfig</strong>. Dentre elas:</p>
<pre>[core]
  excludesfile = /home/daniel/global-gitignore</pre>
<p>Essa configuração faz com que o arquivo <em>/home/daniel/global-gitignore</em> funcione como o <strong>.gitignore</strong> mas para todos os repositórios git, sendo um adicional ao eventual .gitignore do seu projeto.</p>
<pre>[push]
  default = tracking</pre>
<p>Define que, por default, o comando <code>git push</code> faça push na branch &#8220;<em>trackada</em>&#8221;</p>
<pre>[alias]
  co = checkout
  st = status
  ci = commit</pre>
<p><em>Aliases</em> essenciais que substituem os <code>git checkout minha-branch</code> por <code>git co minha-branch</code> e etc.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tagview.com.br/2010/08/configuracoes-basicas-no-gitconfig/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Chega de alerts !</title>
		<link>http://blog.tagview.com.br/2010/08/chega-de-alerts/</link>
		<comments>http://blog.tagview.com.br/2010/08/chega-de-alerts/#comments</comments>
		<pubDate>Wed, 11 Aug 2010 18:01:55 +0000</pubDate>
		<dc:creator>Marcio Migueis</dc:creator>
				<category><![CDATA[Codificação]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://blog.tagview.com.br/?p=99</guid>
		<description><![CDATA[Nada contra o uso do alert no javascript. Ele sem dúvida ajuda. Mas o Firebug tem uma alternativa interessante.
Basta habilitar o console do firebug e dento do nosso javascript, escrever :
console.log("minha mensagem");
Ainda há a possibilidade de usar cores, através dos comandos console.debug, console.info, console.warn e console.error
É particulamente útil quando estamos dentro de um loop, e [...]]]></description>
			<content:encoded><![CDATA[<p>Nada contra o uso do alert no javascript. Ele sem dúvida ajuda. Mas o <a href="http://getfirebug.com/logging">Firebug</a> tem uma alternativa interessante.</p>
<p>Basta habilitar o console do firebug e dento do nosso javascript, escrever :</p>
<p><code>console.log("minha mensagem");</code></p>
<p>Ainda há a possibilidade de usar cores, através dos comandos <em>console.debug, console.info, console.warn e console.error</em></p>
<p>É particulamente útil quando estamos dentro de um loop, e ficar dando click em cada alert às vezes atrapalha.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tagview.com.br/2010/08/chega-de-alerts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como alinhar processos ágeis nas organizações</title>
		<link>http://blog.tagview.com.br/2010/08/como-alinhar-processos-ageis-nas-organizacoes/</link>
		<comments>http://blog.tagview.com.br/2010/08/como-alinhar-processos-ageis-nas-organizacoes/#comments</comments>
		<pubDate>Sat, 07 Aug 2010 16:13:42 +0000</pubDate>
		<dc:creator>Elza Morelli Di Sirio</dc:creator>
				<category><![CDATA[ágil]]></category>

		<guid isPermaLink="false">http://blog.tagview.com.br/?p=64</guid>
		<description><![CDATA[Um amigo, bastante engajado na comunidade ágil, me recomendou um artigo muito interessante cujo título é  &#8221;The marriage of Lean, Scrum e XP: How to align Agile Across an Organization&#8220;, escrito por Geoffrey Bourne. Abaixo segue um pequeno resumo.
Nos últimos anos vários “sabores” de métodos/metodologias ágeis surgiram: Scrum, Lean, FDD (Feature Driven Development), AUP (Agile Unified [...]]]></description>
			<content:encoded><![CDATA[<p>Um amigo, bastante engajado na comunidade ágil, me recomendou um artigo muito interessante cujo título é  &#8221;<strong>The marriage of Lean, Scrum e XP</strong>: <strong>H</strong><strong>ow to align Agile Across an Organization</strong>&#8220;, escrito por Geoffrey Bourne. Abaixo segue um pequeno resumo.</p>
<p>Nos últimos anos vários “sabores” de métodos/metodologias ágeis surgiram: Scrum, Lean, FDD (Feature Driven Development), AUP (Agile Unified Process),  XP (Extreme Programming) e outros. Estes métodos possuem muitas features semelhantes e diferentes e as empresas começam a se perguntar qual método devem adotar.</p>
<p>Primeiramente, uma organização deve ser vista em três níveis: O Executivo/(PMO), o Gerenciamento de Projetos e os Desenvolvedores/Entregadores. Um executivo focado na estratégia da empresa irá ficar bastante confuso se você começar a evangelizar sobre as virtudes do Extreme Programming (XP) como integração contínua, refatoração, etc, Estes detalhes são “gregos” para um executivo assim como a discussão sobre orientação por objeto. Entretanto este mesmo executivo ficará bastante interessado se você apontar como aumentar o valor das ações através da eliminação de desperdícios e otimização dos processos na orgazinação (Lean).</p>
<p>Mas a medida que os processos ágeis amadurecem ainda permanece a questão. Qual método agíl devemos adotar para nossa empresa?  Na opiniao do autor, os diversos níveis de uma organização se alinham  com três métodos específicos: Lean, Scrum e Extreme Programming.</p>
<p>A organização deve ser compreendida como um todo, ao invés de &#8220;partes/divisões&#8221; separadas. Deve ser considerada um organismo vivo com suas áreas mutualmente dependentes.</p>
<p><span style="text-decoration: underline;"><a href="http://blog.tagview.com.br/wp-content/uploads/2010/08/agil_diagrama_1_1.jpg"></a><a href="http://blog.tagview.com.br/wp-content/uploads/2010/08/agil_diagrama_1.1.jpg"><img class="alignnone size-full wp-image-75" title="agil_diagrama_1.1" src="http://blog.tagview.com.br/wp-content/uploads/2010/08/agil_diagrama_1.1.jpg" alt="" width="450" height="220" /></a></span></p>
<p><a href="http://blog.tagview.com.br/wp-content/uploads/2010/08/agil_diagrama_1_1.jpg"></a> Cada nível tem metas diferentes (onde querem chegar) e objetivos diferentes (como chegam lá). O Executivo foca no nível estratégico e acionário. O gerente de projetos foca no time e na entrega do produto. O desenvolvedor foca na engenharia e nas entregas das tarefas.  Cada grupo tem apenas uma compreensão superficial dos outros níveis. Quando um desenvolvedor recebe como meta a meta do nível executivo como &#8220;Cliente em primeiro lugar: Conquiste a confiança do cliente e aumente seu valor de negócio&#8221;, este pode até entender a meta, mas não saberá como agir para atingí-la. O mesmo ocorre quando um desenvolvedor tenta convencer um executivo que devem organizar os diretórios do controle de versão SVN da corporação. Com certeza este executivo vai olhar com cara de &#8220;blank&#8221; para este desenvolvedor pois a reestruturação do SVN não se aplica as metas e objetivos do executivo. Como Dale Carnegie apontou,  <strong>a estrada real para o coração de uma pessoa é falar sobre o que ela mais valoriza.</strong></p>
<p>Ágil, como declarado no movimento do Manifesto Ágil, é um conjunto de princípios &#8211; uma filosofia, muito mais do que um processo passo a passo. Processos pesados como Waterfall (cascata) dominaram o mundo do desenvolvimento de software, mas aos poucos gerentes começaram a adotar a idéia de se fazer &#8220;mais&#8221;com &#8220;menos&#8221;. Assim foram surgindo processos mais leves focados na colaboração, comunicação e adaptação. Em 2001, o Manifesto Ágil, cristalizou os conceitos comuns dos processos ágeis &#8211; Scrum (1995) e XP (1996) e outros. Assim, conforme mencionado anteriormente os três se complementam:</p>
<p><span style="text-decoration: underline;"><a href="http://blog.tagview.com.br/wp-content/uploads/2010/08/agil_diagrama_1_2.jpg"></a><a href="http://blog.tagview.com.br/wp-content/uploads/2010/08/agil_diagrama_1_21.jpg"><img class="alignnone size-full wp-image-72" title="agil_diagrama_1_2" src="http://blog.tagview.com.br/wp-content/uploads/2010/08/agil_diagrama_1_21.jpg" alt="" width="441" height="203" /></a></span></p>
<p>Estes três tipos de processos ágeis possuem suas forças unicas mas complementarem entre si.</p>
<p><strong>Lean</strong> &#8211; Originou-se na linha de produção da Toyota como uma maneira de eliminar o desperdício, otimizar os processos da organização e focar naquilo que realmente tinha valor para o cliente. O sucesso deste processo levou a inovadores a aplicarem Lean no desenvolvimento de software. Os 7 princípios são:</p>
<ul>
<li>Emilinar desperdício &#8211; (remover aquilo que não traz valor para o cliente)</li>
<li>Aumentar o aprendizado &#8211; (melhorar o desenvolvimento do software através do aprendizado contínuo)</li>
<li>Decidir o mais tarde possível &#8211; (postergue as decisões até que as &#8220;assumptions&#8221; se tornem fatos)</li>
<li>Entreguar o mais rápido possivel &#8211; (resultados entregues mais rápidos, feedbacks mais rápidos)</li>
<li>Dar poder de decisão para o time  - (permitir que os trabalhadores da linha de frente tomem a maior parte das decisões)</li>
<li>Construir Integridade &#8211; (integridade, flexibilidade e eficiência)</li>
<li>Ver o Todo &#8211; (veja o software como um todo e são como a somatória de várias partes)</li>
</ul>
<p><strong>Scrum</strong> &#8211; uma plataforme que facilita a organização da equipe e a geração de trabalho de alta-qualidade sem sacrificar a produtividade. O nome significa um movimento do jogo rugby cuja idéia é a equipe toda levar a bola até o gol. Como Lean, este processo também se originou no setor da manifatura e depois foi levado para o desenvolvimento de software.Scrum se baseia em:</p>
<ul>
<li>Oraganização do time (Scrum Master, Product Owner e Time de desenvolvimento)</li>
<li>Rituais (Reuniões Diárias, Retrospectivas, Reviews)</li>
<li>Entregas parciais</li>
<li>Time-box (definição do tempo para as entregas e reuniões)</li>
<li>Envolvimento do cliente durante todo o processo</li>
</ul>
<p><strong>Extreme Programming (XP)</strong> &#8211; metodologia voltada para programadores que enfatiza práticas técnicas para promover &#8220;skillful development&#8221; através de entregas frequentes de software funcionais.  As 4 práticas fundamentais de XP são:</p>
<ul>
<li>Comunicação &#8211; próximo ao cliente, programação em par e desenvolvimento nas instalações do cliente</li>
<li>Simplicidade &#8211; Desenho simplificado e codificação do necessário</li>
<li>Feedback &#8211; Releases pequenos para rápidos feedbacks e TDD (Test-Driven-Development)</li>
<li>Coragem &#8211; Código coletivo e Refatoração (coragem para mexer naquilo que está funcionando)</li>
</ul>
<p>Podemos notar que os três níveis (Executivo, Gerenciamento de Projetos e Desenvolvimento) se alinham muito bem com estes três métodos ágeis. Diferentes visões para diferentes audiências. Lean brilha quando aplicado para aqueles com foco nos valores estratégico, organizacional e acionário, enquanto Scrum brilha para os que tem foco na organização do time e no gerenciamento das entregas do projeto. Extreme Programming brilha quando aplicado aqueles com foco tático e no desenvolvimeto com entregas, conforme diagrama abaixo.</p>
<p><a href="http://blog.tagview.com.br/wp-content/uploads/2010/08/agil_digrama_1_5.jpg"><img class="alignnone size-full wp-image-84" title="agil_digrama_1_5" src="http://blog.tagview.com.br/wp-content/uploads/2010/08/agil_digrama_1_5.jpg" alt="" width="378" height="287" /></a></p>
<p>Adotando estes três processos  (System Thinking &#8211; aplicá-los por toda a organização e não em um único nível), aumentamos a chance de adoção, produtividade e sucesso em geral. Talvez em um futuro próximo um único processo ágil nasça para endereçar as necessidades de todos os níveis da empresa, enquanto isto não ocorre, estas idéias podem servir de guia para se adotar Agile em sua organização.</p>
<p><span style="text-decoration: underline;"><br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tagview.com.br/2010/08/como-alinhar-processos-ageis-nas-organizacoes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cuidados que não devemos esquecer &#8230;.</title>
		<link>http://blog.tagview.com.br/2010/08/cuidados-que-nao-devemos-esquecer/</link>
		<comments>http://blog.tagview.com.br/2010/08/cuidados-que-nao-devemos-esquecer/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 12:44:04 +0000</pubDate>
		<dc:creator>Marcio Migueis</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://blog.tagview.com.br/?p=58</guid>
		<description><![CDATA[Recentemente um dos nossos clientes nos relatou uma certa demora em algumas páginas importantes. Observando os relatórios do NewRelic, observei de cara uma query que demorava muito. Não foi difícil entender o motivo. Simplesmente faltava um índice na tabela. Um cuidado básico que nós desenvolvedores deveríamos estar atentos mas que muitas vezes acaba fugindo da [...]]]></description>
			<content:encoded><![CDATA[<p>Recentemente um dos nossos clientes nos relatou uma certa demora em algumas páginas importantes. Observando os relatórios do NewRelic, observei de cara uma query que demorava muito. Não foi difícil entender o motivo. Simplesmente faltava um índice na tabela. Um cuidado básico que nós desenvolvedores deveríamos estar atentos mas que muitas vezes acaba fugindo da nossa atenção. Assim que criei o índice, observei uma rapidez significante.</p>
<p>Existe um plugin que nos ajuda muito nesta tarefa. É o <a href="http://github.com/eladmeidar/rails_indexes">rails_indexes</a> . Ele dá um olhada na aplicação e sugere a criação de índices que ele julga serem importantes. Para instalá-lo, basta dar </p>
<p><code>script/plugin install git://github.com/eladmeidar/rails_indexes.git</code> </p>
<p>  Ele sugere um migração para a criação dos índices com o seguinte comando :</p>
<p><code>rake db:index_migration</code></p>
<p>  O próprio autor do plugin diz que se trata de uma sugestão que deve ser analisada com cuidado pelo desenvolvedor ou pelo DBA, mas ele costuma revelar índices importantes que no calor do desenvolvimento, nós acabamos deixando para trás.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tagview.com.br/2010/08/cuidados-que-nao-devemos-esquecer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Padrão e Organização de Código</title>
		<link>http://blog.tagview.com.br/2010/07/padrao-e-organizacao-de-codigo-2/</link>
		<comments>http://blog.tagview.com.br/2010/07/padrao-e-organizacao-de-codigo-2/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 23:38:15 +0000</pubDate>
		<dc:creator>Lucas Moreno</dc:creator>
				<category><![CDATA[Codificação]]></category>
		<category><![CDATA[ágil]]></category>

		<guid isPermaLink="false">http://blog.tagview.railsplayground.net/?p=32</guid>
		<description><![CDATA[Algo que eu não dava muita importância nos tempos de projetos para o colégio, é a organização de código, de modo que o código fique mais legível, simples e sem necessidade de muitos comentários.
Por exemplo, o códgio abaixo:
conditions = Sql::Conditions.new
if (value = params.get(:section_id)) then conditions.and('videos.section_id = ?', value) end
if (value = params.get(:source_id)) then conditions.and('videos.source_id = [...]]]></description>
			<content:encoded><![CDATA[<p>Algo que eu não dava muita importância nos tempos de projetos para o colégio, é a organização de código, de modo que o código fique mais <strong>legível</strong>, <strong>simples</strong> e sem necessidade de muitos comentários.</p>
<p>Por exemplo, o códgio abaixo:</p>
<pre class="ruby" name="code">conditions = Sql::Conditions.new
if (value = params.get(:section_id)) then conditions.and('videos.section_id = ?', value) end
if (value = params.get(:source_id)) then conditions.and('videos.source_id = ?', value) end
if (value = params.get(:category_id)) then conditions.and('collectible_data.category_id = ?', value) end
if (value = params.get(:source)) then conditions.and('video_sources.name = ?', value) end
</pre>
<p>Poderia ser escrito dessa forma:</p>
<pre class="ruby" name="code">conditions = Sql::Conditions.new
if (value = params.get(:section_id))  then conditions.and('videos.section_id = ?',            value)  end
if (value = params.get(:source_id))   then conditions.and('videos.source_id = ?',             value)  end
if (value = params.get(:category_id)) then conditions.and('collectible_data.category_id = ?', value)  end
if (value = params.get(:source))      then conditions.and('video_sources.name = ?',           value)  end
</pre>
<p>Qual você acha mais legível? Qual você consegue <strong>entender</strong> mais rápido?</p>
<p>Você pode reparar que a diferença não tem nada a ver com a <em>sintaxe</em> nesse caso, e sim com <strong>espaçamento</strong> e <strong>identação</strong> do código.</p>
<p>Pode não parecer muita coisa olhando somente para esse trecho de código, mas você não acredita o que alguns espaços em branco, pulos de linha e caracteres separadores podem fazer!</p>
<p>Mas de que adianta fazer tudo organizado, de modo legível se outra pessoa de sua equipe escrever de um modo completamente desorganizado ou simplesmente diferente?</p>
<p>Para isso, antes de começar um projeto, ou até mesmo uma equipe, é necessário definir um <strong>padrão</strong> de código que todos concordem e gostem. Dessa forma você vai conseguir entender o projeto inteiro de uma forma mais rápida e sem depender que o autor da implementação lhe explique o porquê de ter feito aquilo daquela forma.</p>
<p>Claro que não podemos deixar de escrever comentários em alguns casos, mas é preferível que se faça um código que seja possível entender simplesmente lendo o código em sí, com nomes de variáveis e de métodos apropriados.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tagview.com.br/2010/07/padrao-e-organizacao-de-codigo-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Método returning em rails</title>
		<link>http://blog.tagview.com.br/2010/07/metodo-returning-em-rails/</link>
		<comments>http://blog.tagview.com.br/2010/07/metodo-returning-em-rails/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 14:18:28 +0000</pubDate>
		<dc:creator>Daniel Teixeira</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[returning]]></category>

		<guid isPermaLink="false">http://blog.tagview.railsplayground.net/?p=21</guid>
		<description><![CDATA[Um método bem interessante do rails é o returning. Apesar de ser bem simples, ele ajuda a manter seu código mais limpo e mais fácil de entender (depois de pegar costume  ).
Funciona mais ou menos assim:
Dado 2 argumentos, um objeto qualquer (arg1) e um bloco, o método repassa o objeto arg1 como parâmetro do [...]]]></description>
			<content:encoded><![CDATA[<p>Um método bem interessante do rails é o <code>returning</code>. Apesar de ser bem simples, ele ajuda a manter seu código mais limpo e mais fácil de entender (depois de pegar costume <img src='http://blog.tagview.com.br/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ).<br />
Funciona mais ou menos assim:</p>
<blockquote><p>Dado 2 argumentos, um objeto qualquer (<code>arg1</code>) e um bloco, o método repassa o objeto <code>arg1</code> como parâmetro do bloco e ao final da execução do bloco, retorna o <code>arg1</code> que pode ter sofrido alteração ou não.</p></blockquote>
<p>Por exemplo, o seguinte método:</p>
<pre name="code" class="ruby">def published_titles(posts)
  titles = {}

  posts.each do |p|
    titles.merge!(p.id =&gt; p.title) if p.published?
  end

  titles
end
</pre>
<p>Poderia ser reescrito assim:</p>
<pre name="code" class="ruby">def published_titles(posts)
  returning(Hash.new) do |titles|
    posts.each { |p| titles.merge!(p.id =&gt; p.title) if p.published? }
  end
end
</pre>
<p>É isso. <img src='http://blog.tagview.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<hr title="update" />
<strong>UPDATE</strong><br />
O <a href="http://blog.tagview.com.br/author/guiceolin/" alt="Guilherme Ceolin" title="Guilherme Ceolin">Ceolin</a> comentou comigo hoje que o <code>returning</code> seria &#8220;deprecated&#8221; no Rails 3. Isso é porque a partir do Ruby 1.9, a classe <code>Object</code> ganha um novo método (<a href="http://ruby-doc.org/ruby-1.9/classes/Object.html#M000239" title="Object#tap" alt="Object#tap">tap</a>) que permite o desenvolvedor interagir em uma chamada de métodos em cadeia, por exemplo:</p>
<pre name="code" class="ruby">
Users
  .all .tap {|users| puts "Usuários: #{users.map(&#038;id)}"}
  .last.tap {|user| puts "Último usuário: #{user.name}"}
  .posts
</pre>
<p>Então, o nosso primeiro método poderia ser escrito, no Ruby 1.9, assim:</p>
<pre name="code" class="ruby">def published_titles(posts)
  Hash.new.tap do |titles|
    posts.each { |p| titles.merge!(p.id =&gt; p.title) if p.published? }
  end
end
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.tagview.com.br/2010/07/metodo-returning-em-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A importância de um bom P.O. para o sucesso do projeto</title>
		<link>http://blog.tagview.com.br/2010/05/a-importancia-de-um-bom-p-o-para-o-sucesso-do-projeto/</link>
		<comments>http://blog.tagview.com.br/2010/05/a-importancia-de-um-bom-p-o-para-o-sucesso-do-projeto/#comments</comments>
		<pubDate>Wed, 19 May 2010 04:29:08 +0000</pubDate>
		<dc:creator>Elza Morelli Di Sirio</dc:creator>
				<category><![CDATA[Scrum]]></category>
		<category><![CDATA[p.o.]]></category>
		<category><![CDATA[tagview]]></category>

		<guid isPermaLink="false">http://blog.tagview.railsplayground.net/?p=3</guid>
		<description><![CDATA[Recentemente nossa equipe trabalhou em um grande projeto web de um cliente líder da área editorial que se tornou um caso de sucesso devido a vários fatores, tais como; a expertise da equipe de desenvolvimento, um ótimo Scrum Master,  mas principalmente  devido a excelente atuação do Product Owner. Nestes nove anos de empresa, nunca havia [...]]]></description>
			<content:encoded><![CDATA[<p>Recentemente nossa equipe trabalhou em um grande projeto web de um cliente líder da área editorial que se tornou um caso de sucesso devido a vários fatores, tais como; a expertise da equipe de desenvolvimento, um ótimo Scrum Master,  mas principalmente  devido a excelente atuação do Product Owner. Nestes nove anos de empresa, nunca havia me deparado com um P.O. tão comprometido e com tanto interesse em ver o projeto se concretizar de forma rápida. O histórico de nossa empresa sempre foi ter P.O.s interessados no início mas que com o passar do tempo deixavam de priorizar o projeto e raramente estavam disponíveis para validar e aceitar as estórias entregues. Muitas vezes ficávamos semanas sem obter feedback para podermos prosseguir com a implementação.</p>
<p>Neste projeto utilizamos Scrum como método ágil para facilitar o gerenciamento das equipes remotas e nossas dailies se transformaram em micro Reviews tamanho o interesse do P.O. em navegar e validar as estórias implementadas.  Diariamente no mesmo horário, ele entrava em contato com nossa equipe, via conferência, para escutar sobre o trabalho realizado, as dificuldades, os impedimentos, mas principalmente para acessar e experimentar as novas funcionalidades. Houve dias que confesso ter desejado que ele não tivesse entrado em contato devido a excessiva carga de trabalho, mas lá estava ele no telefone &#8220;E aí pessoal, podemos começar?&#8221; Era inacreditável, todos os dias a mesma frase com o mesmo entusiasmo. Esta proximidade diária foi essencial para o esclarecimento de cada pequena regra de negócio que surgia ao nos aprofundarmos nas estórias e muitas vezes, ao ser questionado sobre determinada regra ouvíamos &#8220;Nao havia pensado nisto, mas tarde darei um retorno&#8221; e no mais tardar no dia seguinte a dúvida estava esclarecida sem retrabalhos de implementação. Este processo se repetiu por quatro meses até a entrega oficial da aplicação. Saldo final &#8211; projeto entregue no prazo (curtíssimo), 0% de retrabalho, funcionalidades utilizadas pelos usuários e apenas alguns pequenos bugs.</p>
<p>Esta nossa experiência nos mostrou que para garantir o sucesso de um projeto devemos buscar e se for o caso &#8220;brigar&#8221; por um P.O. comprometido, interessado e que envolva as pessoas responsáveis pela utilização, para que o software entregue esteja plenamente de acordo com as necessidades reais dos usuários e que somente a proximidade do dia a dia pode garantir esta aderência. Apesar de acreditar e aplicar Scrum há vários anos em nossa empresa, às vezes devemos realizar pequenas alterações em seus rituais para fazer com que o P.O. não espere o final da sprint de duas ou três semanas para validar e experimentar as funcionalidades. A substituição de algumas dailies por  micro Reviews nos traz feedbacks mais rápidos, evita retrabalhos e nos antecipa mudanças de rumo.</p>
<p>Depois de vários anos atuando na área, acredito que não vale a pena seguir em frente com um projeto sem um bom P.O.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tagview.com.br/2010/05/a-importancia-de-um-bom-p-o-para-o-sucesso-do-projeto/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

