<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
  <title>Blog Fratech</title>
  <link rel="alternate" href="http://www.fratech.net/comunidade/feed" />
  <subtitle>Praticando Comunidade</subtitle>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/fratech-blog" /><feedburner:info uri="fratech-blog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
    <title>Manifesto TI 2.0</title>
    <link rel="alternate" href="http://feedproxy.google.com/~r/fratech-blog/~3/gyqJxlmxfoU/51" />
    <author>
      <name>Felipe Rodrigues</name>
    </author>
    <updated>2010-03-11T16:45:00Z</updated>
    <published>2010-03-11T16:45:00Z</published>
    <content type="html">&amp;lt;p&amp;gt;Nós da Fratech temos acompanhado um pequeno movimento que aos poucos&#xD;
vem ganhando força. Até o momento ele possui vários nomes e ainda está para&#xD;
ser centralizado. Alguns o chamam de Manifesto 2.0, outros o chamam de&#xD;
Pensamento 2.0, há ainda aqueles que dizem que é um "Movimento&#xD;
Anti-Corporativista". O interessante é que este movimento tem partido de&#xD;
grandes nomes do agile no Brasil.&amp;lt;/p&amp;gt;&#xD;
&#xD;
&amp;lt;p&amp;gt;Manoel Pimentel, Editor Chefe da Revista Visão Ágil, é um dos&#xD;
pioneiros do Agile no Brasil e recomenda, em seu &amp;lt;a&#xD;
href="http://visaoagil.wordpress.com/2009/05/21/nao-cresca/"&#xD;
title="Não Cresça - por Manoel Pimentel"&amp;gt;post no blog da Visão Ágil, não&#xD;
cresça&amp;lt;/a&amp;gt;:&amp;lt;/p&amp;gt;&#xD;
&#xD;
&amp;lt;blockquote&amp;gt;&#xD;
  ...caso você esteja iniciando uma empresa nesse momento, permita lhe dar uma&#xD;
  pequena sugestão: "Não Cresça!".&amp;lt;/blockquote&amp;gt;&#xD;
&#xD;
&amp;lt;p&amp;gt;Ele explica o motivo:&amp;lt;/p&amp;gt;&#xD;
&#xD;
&amp;lt;blockquote&amp;gt;&#xD;
  Essa minha humilde opinião é oriunda da constatação de que as empresas&#xD;
  ditas como "grandes" têm uma complexidade de funcionamento e de&#xD;
  pensamento tão evidente, que simplesmente é muito difícil ou até mesmo&#xD;
  impossível fazer as coisas certas acontecerem nessas&#xD;
  organizações.&amp;lt;/blockquote&amp;gt;&#xD;
&#xD;
&amp;lt;p&amp;gt;Vinícius Manhães Teles da ImproveIt desabafa em um &amp;lt;a&#xD;
href="http://blog.improveit.com.br/articles/2008/03/28/o-mercado-está-mudando"&#xD;
title="O mercado está mudando"&amp;gt;post&amp;lt;/a&amp;gt; oriundo de uma &amp;lt;a&#xD;
href="http://br.groups.yahoo.com/group/visaoagil/message/591"&#xD;
title="O mercado esta mudando ou é impressão minha?"&amp;gt;discussão na lista da&#xD;
Visão Ágil&amp;lt;/a&amp;gt;:&amp;lt;/p&amp;gt;&#xD;
&#xD;
&amp;lt;blockquote&amp;gt;&#xD;
  O que uma empresa produz é resultado de como ela está estruturada. Quem tem&#xD;
  autoridade para dizer como deve ser a estrutura de uma empresa é quem está&#xD;
  no topo. Então, a estrutura de qualquer empresa é, no fim das contas, o&#xD;
  resultado do modo de pensar, da mentalidade, de quem está no comando. A&#xD;
  mentalidade da maioria dos empresários, diretores e gerentes no mundo&#xD;
  inteiro é, com raríssimas exceções, arcaica e incompatível com o&#xD;
  trabalho de desenvolver software. Quando o topo da empresa não entende o&#xD;
  tipo de mentalidade necessária para se desenvolver software de forma bem&#xD;
  sucedida, não há santo que possa fazer milagre. E eu garanto, a maioria&#xD;
  absoluta das pessoas que estão no comando das empresas não entende uma&#xD;
  vírgula do que significa desenvolver software. Isso inclui, certamente, a&#xD;
  maioria absoluta dos CIOs. Não é à toa que eles buscam recorrentemente&#xD;
  coisas como CMMI, PMBOK, MPS.BR, ITIL etc, todos absolutamente incompatíveis&#xD;
  com a NATUREZA do desenvolvimento de software. &amp;lt;/blockquote&amp;gt;&#xD;
&#xD;
&amp;lt;p&amp;gt;Em contra-partida, Alexandre Magno concorda que é necessária uma mudança&#xD;
radical, em sua palestra sobre Utilização de Scrum no alto gerenciamento da&#xD;
empresa.&amp;lt;/p&amp;gt;&#xD;
&#xD;
&amp;lt;blockquote&amp;gt;&#xD;
  ...Na comunidade tem gente muito boa aplicando Scrum em projetos de TI. Mas&#xD;
  isso não é suficiente para mudar a cultura das empresas...&amp;lt;br /&amp;gt;&#xD;
  &amp;lt;br /&amp;gt;&#xD;
  ...quando o Scrum é aplicado em uma única área, esta área sofre pressão&#xD;
  das outras áreas ao seu redor...&amp;lt;/blockquote&amp;gt;&#xD;
&#xD;
&amp;lt;p&amp;gt;Mas lembra:&amp;lt;/p&amp;gt;&#xD;
&#xD;
&amp;lt;blockquote&amp;gt;&#xD;
  Os altos executivos tem a mente aberta e querem resultados, independente da&#xD;
  metodologia&amp;lt;/blockquote&amp;gt;&#xD;
&#xD;
&amp;lt;p&amp;gt;Isso que nos leva a acreditar que o problema é falta de confiança por&#xD;
parte dos executivos em relação às pessoas. Isso ficou bem claro no evento&#xD;
Scrum Gathering, quando Ricardo Vargas do PMI relatou:&amp;lt;/p&amp;gt;&#xD;
&#xD;
&amp;lt;blockquote&amp;gt;&#xD;
  ...seria ótimo se todos fossem pig (comprometidos com o resultado), mas a&#xD;
  grande verdade é que a maioria das pessoas são chicken (não se importam&#xD;
  com o resultado), só querem saber do salário no fim do mês...&amp;lt;/blockquote&amp;gt;&#xD;
&#xD;
&amp;lt;p&amp;gt;Alexandre Gomes, Diretor da Sea Tecnologia e figura muito respeitada no meio&#xD;
de desenvolvimento de Software, discorda e vai além, apresentando o conceito&#xD;
um pouco mais a fundo, em seu &amp;lt;a&#xD;
href="http://blog.seatecnologia.com.br/2009/01/12/manifesto-2-0"&#xD;
title="Manifesto 2.0"&amp;gt;post sobre o Manifesto 2.0&amp;lt;/a&amp;gt;:&amp;lt;/p&amp;gt;&#xD;
&#xD;
&amp;lt;blockquote&amp;gt;&#xD;
  Vemos então dois momentos históricos bem distintos, dois modelos de&#xD;
  pensamento bem claros ou, como temos dito, duas escolas bem definidas. E o&#xD;
  melhor (ou pior) é que não se trata de um evento exclusivo da TI. Pelo&#xD;
  visto, é algo de dimensões ainda não muito definidas pra nós, também&#xD;
  presente em outras áreas do conhecimento. Especulamos que chamarão isso no&#xD;
  futuro de algum nome. Talvez pós-modernidade, realismo-moderno, whatever.&#xD;
  Não vale a pena tentar definir um nome pra isso agora. Melhor observar,&#xD;
  aprender e ter a sobriedade para colher seus melhores frutos.&amp;lt;/blockquote&amp;gt;&#xD;
&#xD;
&amp;lt;p&amp;gt;Dentre vários pontos importantes, Alexandre menciona a visão dos Recursos&#xD;
Humanos no modelo tradicional e como isso passa a ser tratado como gestão de&#xD;
Pessoas no modelo 2.0&amp;lt;/p&amp;gt;&#xD;
&#xD;
&amp;lt;blockquote&amp;gt;&#xD;
  Na visão tradicionalista, profissionais são vistos como máquinas, com&#xD;
  comportamentos determinísticos, produtividade contínua e de fácil&#xD;
  substituição.&amp;lt;br /&amp;gt;&#xD;
  &amp;lt;br /&amp;gt;&#xD;
  A nova visão, felizmente, já compreendeu que profissionais não são&#xD;
  máquinas, mas pessoas que sofrem de alegria, tristeza, motivação,&#xD;
  depressão, cansaço, empatia e vários outros aspectos que influenciam em&#xD;
  seu trabalho. Por isso, é tão complexo extrair métricas precisas de sua&#xD;
  produtividade. Afinal, cada dia é um dia, cada projeto é um projeto e cada&#xD;
  equipe é uma equipe. Na mesma linha, a substituição de profissionais&#xD;
  também não é matemática. A sinergia entre os membros de uma equipe são&#xD;
  fatores ímpares para sua motivação e produtividade. Trocar seis por meia&#xD;
  dúzia pode por toda a dinâmica do grupo abaixo.&amp;lt;/blockquote&amp;gt;&#xD;
&#xD;
&amp;lt;p&amp;gt;Como conclusão, percebemos uma grande sinergia da comunidade ágil em busca&#xD;
de um novo modelo da gestão, que preza: &amp;lt;ul&amp;gt;&#xD;
  &amp;lt;li&amp;gt;mais qualidade e flexibilidade do que comportamentos determinísticos&amp;lt;/li&amp;gt;&#xD;
  &amp;lt;li&amp;gt;mais conforto e humanidade do que números de medição de&#xD;
  produtividade&amp;lt;/li&amp;gt;&#xD;
  &amp;lt;li&amp;gt;mais reflexão e pensamento do que atividades repetitivas&amp;lt;/li&amp;gt;&#xD;
&amp;lt;/ul&amp;gt;&#xD;
&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Este é o modelo 2.0 que vem surgindo em meio ao movimento Ágil no Brasil e que acredito ter suas próprias vertentes no mundo.&amp;lt;/p&amp;gt;&lt;img src="http://feeds.feedburner.com/~r/fratech-blog/~4/gyqJxlmxfoU" height="1" width="1"/&gt;</content>
    <dc:creator>Felipe Rodrigues</dc:creator>
    <dc:date>2010-03-11T16:45:00Z</dc:date>
  <feedburner:origLink>http://www.fratech.net/comunidade/exibir/51</feedburner:origLink></entry>
  <entry>
    <title>O Básico do planejamento ágil</title>
    <link rel="alternate" href="http://feedproxy.google.com/~r/fratech-blog/~3/g8FBe7p3GC4/50" />
    <author>
      <name>Felipe Rodrigues de Almeida</name>
    </author>
    <updated>2009-06-24T11:58:00Z</updated>
    <published>2009-06-24T11:58:00Z</published>
    <content type="html">&amp;lt;p&amp;gt;Muitos acham que ser &amp;amp;aacute;gil &amp;amp;eacute; n&amp;amp;atilde;o planejar. Decidir escrever uma s&amp;amp;eacute;rie de artigos que voltam ao b&amp;amp;aacute;sico da gest&amp;amp;atilde;o &amp;amp;aacute;gil. Uma abordagem independente de metodologia, onde tentarei explicar o porque de algumas pr&amp;amp;aacute;ticas. Neste artigo, falarei sobre o planejamento inicial, deste ponto de vista.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;H&amp;amp;aacute; alguns meses atr&amp;amp;aacute;s, escrevi sobre &amp;lt;a title="Projetos &amp;amp;Aacute;geis - Levantamento Inicial" target="_blank" href="http://fratech.net/comunidade/exibir/46"&amp;gt;como iniciamos projetos &amp;amp;aacute;geis na Fratech&amp;lt;/a&amp;gt;. Agora neste artigo, venho descrever o porque fazemos desta maneira.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;h2&amp;gt;Planejamento Inicial&amp;lt;/h2&amp;gt;&#xD;
&amp;lt;p&amp;gt;Projetos &amp;amp;Aacute;geis tem um per&amp;amp;iacute;odo de planejamento inicial. Claro que conta com algumas diferen&amp;amp;ccedil;as em rela&amp;amp;ccedil;&amp;amp;atilde;o ao modelo tradicional.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;&amp;lt;img width="150" height="113" border="0" align="right" style="margin: 5px;" alt="O plano n&amp;amp;atilde;o &amp;amp;eacute; importante. O Planejar &amp;amp;eacute;!" src="http://img520.imageshack.us/img520/295/83915198.jpg" /&amp;gt;A primeira grande diferen&amp;amp;ccedil;a &amp;amp;eacute; que o planejamento inicial demora alguns dias, uma semana ou duas no m&amp;amp;aacute;ximo. Esse &amp;amp;eacute; o tempo necess&amp;amp;aacute;rio para contextualizar todos os envolvidos e definir o objetivo comum do projeto. Comparado aos meses de levantamento de requisitos e prepara&amp;amp;ccedil;&amp;amp;atilde;o de documentos e diagramas do modelo waterfall, esse &amp;amp;eacute; um tempo bem pequeno.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;A segunda grande diferen&amp;amp;ccedil;a &amp;amp;eacute; que os documentos resultantes do planejamento n&amp;amp;atilde;o s&amp;amp;atilde;o muito importantes. Servem mais como um guia, mas alguns at&amp;amp;eacute; dizem que podem ser descartados. O fato &amp;amp;eacute; que acreditamos que o ato de planejar &amp;amp;eacute; muito mais importante valioso do que o plano em si. Isso ressalta a import&amp;amp;acirc;ncia de todos os envolvidos no projeto participarem ativamente do planejamento.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;&amp;amp;Eacute; nesta fase que se definem os objetivos, metas, declara&amp;amp;ccedil;&amp;amp;atilde;o de vis&amp;amp;atilde;o, plataforma tecnol&amp;amp;oacute;gica, restri&amp;amp;ccedil;&amp;amp;otilde;es tecnol&amp;amp;oacute;gicas e padr&amp;amp;otilde;es a serem seguidos. Em outras palavras, &amp;amp;eacute; nesta fase que se definem as diretrizes t&amp;amp;eacute;cnicas e de neg&amp;amp;oacute;cio do projeto. Aqui, define-se tamb&amp;amp;eacute;m a equipe e o papel de cada um dentro do projeto.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;&amp;lt;img width="300" vspace="0" hspace="0" height="225" border="0" align="left" style="margin: 10px;" alt="Planning Meeting" src="http://img517.imageshack.us/img517/6479/82821233.jpg" /&amp;gt;Para que conseguir realizar um bom planejamento. O planejamento gera contexto e permite que as pessoas envolvidas tomem conhecimento do que deve ser feito e quando deve ser feito. &amp;amp;Eacute; fundamental para que todos possam ser pr&amp;amp;oacute;-ativos e caminhe na mesma dire&amp;amp;ccedil;&amp;amp;atilde;o, al&amp;amp;eacute;m de permitir que todos saibam quando est&amp;amp;atilde;o chegando perto do objetivo. Mas para que isso aconte&amp;amp;ccedil;a, &amp;amp;eacute; fundamental que todos participem do planejamento, pois somente atrav&amp;amp;eacute;s da participa&amp;amp;ccedil;&amp;amp;atilde;o &amp;amp;eacute; que existe o comprometimento. &amp;amp;Eacute; imposs&amp;amp;iacute;vel algu&amp;amp;eacute;m se comprometer a buscar um objetivo se ele n&amp;amp;atilde;o tiver participado da defini&amp;amp;ccedil;&amp;amp;atilde;o deste objetivo.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Devido a natureza din&amp;amp;acirc;mica dos projetos de desenvolvimento de software, faz-se necess&amp;amp;aacute;rio um plano flex&amp;amp;iacute;vel e abrangente. Como veremos no cap&amp;amp;iacute;tulo sobre requisitos, os projetos est&amp;amp;atilde;o em constante mudan&amp;amp;ccedil;a e, cabe a n&amp;amp;oacute;s, criarmos um plano que permita a mudan&amp;amp;ccedil;a constante. Por isso, n&amp;amp;atilde;o deve especificar detalhadamente o resultado do projeto, mas deve se limitar a descrever como o projeto ser&amp;amp;aacute; realizado. O plano deve determinar os pap&amp;amp;eacute;is de cada um dentro do projeto, deve determinar como ser&amp;amp;atilde;o levantados os requisitos e quais as subfases do projeto.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Como todos participam desse planejamento, o comprometimento em rela&amp;amp;ccedil;&amp;amp;atilde;o ao que foi definido neste momento ser&amp;amp;aacute; muito grande. Todo este planejamento n&amp;amp;atilde;o deve demorar muito mais do que 2 semanas, dependendo do tamanho do projeto e dos recursos dispon&amp;amp;iacute;veis.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;h2&amp;gt;Declara&amp;amp;ccedil;&amp;amp;atilde;o de Vis&amp;amp;atilde;o&amp;lt;/h2&amp;gt;&#xD;
&amp;lt;p&amp;gt;&amp;lt;img width="350" height="233" border="0" align="left" style="margin: 10px;" alt="Equipe olhando o plano" src="http://img523.imageshack.us/img523/4840/84930564.jpg" /&amp;gt;&amp;amp;Eacute; bom que se determine os objetivos e metas do projeto, de forma que todos saibam, em alto n&amp;amp;iacute;vel, qual o resultado esperado do projeto. &amp;amp;Eacute; importante determinar restri&amp;amp;ccedil;&amp;amp;otilde;es de ambiente e expectativas gerais. &amp;amp;Eacute; bom descrever, em 1 ou 2 folhas A4, qual &amp;amp;eacute; o software desejado. Chamamos este documento de vis&amp;amp;atilde;o geral. Ele deve ser escrito pelo cliente que, dentro do limite de 1 ou 2 folhas, deve descrever de forma abrangente, as partes mais importantes do software.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Tamb&amp;amp;eacute;m &amp;amp;eacute; interessante criar um modelo inicial do fluxo das informa&amp;amp;ccedil;&amp;amp;otilde;es dentro do sistema. N&amp;amp;oacute;s o chamamos de fluxo de neg&amp;amp;oacute;cio, que deve mostrar as principais opera&amp;amp;ccedil;&amp;amp;otilde;es de neg&amp;amp;oacute;cio realizadas pelo usu&amp;amp;aacute;rio do sistema, quando operando o mesmo.&amp;lt;img width="200" height="239" border="0" align="right" alt="Fluxo de Neg&amp;amp;oacute;cio" src="http://img145.imageshack.us/img145/1104/88619747.jpg" style="margin: 10px;" /&amp;gt;&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Tudo isso serve para guiar a equipe e o cliente ao longo do desenvolvimento.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;h2&amp;gt;&amp;amp;nbsp;Estimativa Inicial&amp;lt;/h2&amp;gt;&#xD;
&amp;lt;p&amp;gt;O cliente tamb&amp;amp;eacute;m deve listar algumas das funcionalidades que ele espera ter no software, sem o compromisso de limitar o escopo, mas apenas para garantir que ele n&amp;amp;atilde;o esque&amp;amp;ccedil;a o que deve ser implementado. Essas funcionalidades comp&amp;amp;otilde;em uma lista conhecida como Backlog e podem ser ordenadas por prioridade, tamanho ou complexidade das funcionalidades.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;O backlog pode ser utilizado para criar uma estimativa inicial de esfor&amp;amp;ccedil;o e complexidade para o projeto. Essa estimativa serve como par&amp;amp;acirc;metro para&amp;amp;nbsp; definir viabilidade, custo estimado e pode at&amp;amp;eacute; mesmo ajudar no contrato, por&amp;amp;eacute;m &amp;amp;eacute; de extrema import&amp;amp;acirc;ncia lembrar que s&amp;amp;atilde;o apenas estimativas e que, apesar de aproximadas, n&amp;amp;atilde;o s&amp;amp;atilde;o os n&amp;amp;uacute;meros reais.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;img src="http://feeds.feedburner.com/~r/fratech-blog/~4/g8FBe7p3GC4" height="1" width="1"/&gt;</content>
    <dc:creator>Felipe Rodrigues de Almeida</dc:creator>
    <dc:date>2009-06-24T11:58:00Z</dc:date>
  <feedburner:origLink>http://www.fratech.net/comunidade/exibir/50</feedburner:origLink></entry>
  <entry>
    <title>Test Driven Development &amp; Design Evolutivo</title>
    <link rel="alternate" href="http://feedproxy.google.com/~r/fratech-blog/~3/M22VeDgH2Gs/48" />
    <author>
      <name>Felipe Rodrigues de Almeida</name>
    </author>
    <updated>2009-04-02T19:24:00Z</updated>
    <published>2009-04-02T19:24:00Z</published>
    <content type="html">&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;img height="300" width="246" border="0" align="right" style="margin-left: 10px;" alt="TDD: Todo c&amp;amp;oacute;digo &amp;amp;eacute; culpado at&amp;amp;eacute; que se prove o contr&amp;amp;aacute;rio!" src="http://img18.imageshack.us/img18/8726/steyf.jpg" /&amp;gt;C&amp;amp;oacute;digo limpo e auto-explicativo!&amp;lt;/strong&amp;gt; Este &amp;amp;eacute; o objetivo do &amp;lt;em&amp;gt;Test Driven Development&amp;lt;/em&amp;gt; ou &amp;lt;strong&amp;gt;TDD&amp;lt;/strong&amp;gt;. O TDD &amp;amp;eacute; composto por pr&amp;amp;aacute;ticas propostas pelo &amp;lt;em&amp;gt;eXtreme Programming&amp;lt;/em&amp;gt;, refor&amp;amp;ccedil;ando os conceitos de &amp;lt;em&amp;gt;Design Evolutivo&amp;lt;/em&amp;gt; e &amp;lt;em&amp;gt;Test First&amp;lt;/em&amp;gt;. Focado nestes dois conceitos, tentarei explicar quais os benef&amp;amp;iacute;cios de uma abordagem baseada no TDD.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;h2&amp;gt;Benef&amp;amp;iacute;cios do TDD&amp;lt;/h2&amp;gt;&#xD;
&amp;lt;p&amp;gt;Algo que tenho visto freq&amp;amp;uuml;entemente em clientes e treinamentos por todo o Brasil &amp;amp;eacute; que, em se tratando de processos de desenvolvimento &amp;amp;Aacute;gil, os desenvolvedores ficam um pouco perdidos no in&amp;amp;iacute;cio do projeto. Isso deve-se ao fato de que a pr&amp;amp;aacute;tica t&amp;amp;atilde;o falada de &amp;lt;em&amp;gt;desenvolvimento incremental&amp;lt;/em&amp;gt; gera v&amp;amp;aacute;rias d&amp;amp;uacute;vidas sobre a integridade e arquitetura do sistema. Os desenvolvedores simplesmente n&amp;amp;atilde;o sabem qual componente usar, quando usar e principalmente se &amp;amp;eacute; necess&amp;amp;aacute;rio usar. Isso j&amp;amp;aacute; era de se esperar, pois est&amp;amp;aacute;vamos acostumados ao modelo tradicional, onde esse tipo de decis&amp;amp;atilde;o era responsabilidade de um arquiteto e n&amp;amp;oacute;s apenas obedec&amp;amp;iacute;amos.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Para facilitar o desenvolvimento incremental, uma das solu&amp;amp;ccedil;&amp;amp;otilde;es &amp;amp;eacute; aplicar o &amp;lt;em&amp;gt;design evolutivo&amp;lt;/em&amp;gt;. Design evolutivo significa que voc&amp;amp;ecirc; s&amp;amp;oacute; deve se preocupar com o design relativo &amp;amp;agrave; funcionalidade que est&amp;amp;aacute; em sua m&amp;amp;atilde;o naquele momento, por&amp;amp;eacute;m deixar pontos de extens&amp;amp;atilde;o para facilitar o a evolu&amp;amp;ccedil;&amp;amp;atilde;o. Esse tipo de pr&amp;amp;aacute;tica favorece o refactoring e garante flexibilidade quando o cliente decide mudar o escopo da aplica&amp;amp;ccedil;&amp;amp;atilde;o.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;&amp;lt;img hspace="-" height="366" width="300" border="0" align="left" style="margin-right: 10px;" alt="Ciclo do TDD" src="http://img18.imageshack.us/img18/9751/tddcycle.jpg" /&amp;gt;&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Os desenvolvedores habituados ao modelo tradicional de desenvolvimento de software n&amp;amp;atilde;o est&amp;amp;atilde;o habituados ao design evolutivo. N&amp;amp;atilde;o est&amp;amp;atilde;o acostumados a tomar decis&amp;amp;otilde;es de design a cada funcionalidade que precisam implementar. Isso gera um desconforto e receio na hora de implementar a solu&amp;amp;ccedil;&amp;amp;atilde;o. O TDD ajuda nessa quest&amp;amp;atilde;o. Permite que o desenvolvedor se veja como um consumidor daquela funcionalidade, pois &amp;amp;eacute; obrigado a refletir sobre o c&amp;amp;oacute;digo que ir&amp;amp;aacute; escrever, pensando em como seria sua utiliza&amp;amp;ccedil;&amp;amp;atilde;o.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Para que isso seja realidade, &amp;amp;eacute; necess&amp;amp;aacute;rio utilizar tamb&amp;amp;eacute;m a pr&amp;amp;aacute;tica conhecida como &amp;lt;em&amp;gt;Test First&amp;lt;/em&amp;gt;. Essa pr&amp;amp;aacute;tica consiste em escrever o teste antes de escrever o c&amp;amp;oacute;digo real, obrigando que o desenvolvedor imagine o c&amp;amp;oacute;digo real antes mesmo de come&amp;amp;ccedil;ar a escrever. Dentre outras coisas, isso tamb&amp;amp;eacute;m ajuda a ativar o lado criativo do c&amp;amp;eacute;rebro, pelo fato de exigir o uso da imagina&amp;amp;ccedil;&amp;amp;atilde;o. Isso muitas vezes revela-se o maior desafio para os iniciantes dessa abordagem, por&amp;amp;eacute;m conforme o avan&amp;amp;ccedil;o no desenvolvimento isso se torna natural para o desenvolvedor, aumentando em muito a qualidade do c&amp;amp;oacute;digo. Isso refor&amp;amp;ccedil;a tamb&amp;amp;eacute;m a id&amp;amp;eacute;ia de que &amp;lt;em&amp;gt;desenvolver software &amp;amp;eacute; uma arte e deve ser realizada por artes&amp;amp;atilde;os de software&amp;lt;/em&amp;gt;.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;A pergunta mais freq&amp;amp;uuml;ente que ou&amp;amp;ccedil;o sobre isso &amp;amp;eacute; referente ao retrabalho que isso pode causar e o &amp;lt;em&amp;gt;impacto gerado por grandes mudan&amp;amp;ccedil;as no escopo&amp;lt;/em&amp;gt;. Como resposta, pergunto: Qual seria o impacto desse tipo de mudan&amp;amp;ccedil;a em uma arquitetura r&amp;amp;iacute;gida e pr&amp;amp;eacute;-definida? Seria seguro e f&amp;amp;aacute;cil alterar esse tipo de arquitetura? &amp;amp;Eacute; aqui que o TDD se torna muito importante!&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Quando precisamos alterar algum c&amp;amp;oacute;digo, precisamos nos certificar de que tudo que funcionava antes da altera&amp;amp;ccedil;&amp;amp;atilde;o, tamb&amp;amp;eacute;m funcionar&amp;amp;aacute; depois da altera&amp;amp;ccedil;&amp;amp;atilde;o. A melhor forma de garantir isso &amp;amp;eacute; utilizando testes automatizados. Os testes facilitam o refactoring e permitem verificar rapidamente o que funciona e o que n&amp;amp;atilde;o funciona no sistema.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;h2&amp;gt;Mas como isso acontece na pr&amp;amp;aacute;tica?&amp;lt;/h2&amp;gt;&#xD;
&amp;lt;p&amp;gt;Como descrito no livro Test Driven Development By Example de Kent Beck (Beck2003), os seguintes passos resumem a pr&amp;amp;aacute;tica:&amp;lt;/p&amp;gt;&#xD;
&amp;lt;br/&amp;gt;&#xD;
&amp;lt;ol&amp;gt;&#xD;
    &amp;lt;li&amp;gt;Rapidamente adicione um teste&amp;lt;/li&amp;gt;&#xD;
    &amp;lt;li&amp;gt;Execute todos os testes e veja que o teste novo falha&amp;lt;/li&amp;gt;&#xD;
    &amp;lt;li&amp;gt;Realize um pequena altera&amp;amp;ccedil;&amp;amp;atilde;o no c&amp;amp;oacute;digo&amp;lt;/li&amp;gt;&#xD;
    &amp;lt;li&amp;gt;Execute todos os testes e veja se todos tem sucesso&amp;lt;/li&amp;gt;&#xD;
    &amp;lt;li&amp;gt;Refatore para remover duplica&amp;amp;ccedil;&amp;amp;atilde;o.&amp;lt;/li&amp;gt;&#xD;
&amp;lt;/ol&amp;gt;&#xD;
&amp;lt;p&amp;gt;Neste mesmo livro, est&amp;amp;atilde;o relacionadas algumas das poss&amp;amp;iacute;veis perguntas a serem respondidas:&amp;lt;/p&amp;gt;&#xD;
&amp;lt;br/&amp;gt;&#xD;
&amp;lt;ul&amp;gt;&#xD;
    &amp;lt;li&amp;gt;Como cada teste pode tratar de um pequeno incremento de funcionalidade?&amp;lt;/li&amp;gt;&#xD;
    &amp;lt;li&amp;gt;Qu&amp;amp;atilde;o pequenas e feias as mudan&amp;amp;ccedil;as podem ser para conseguir fazer os novos testes funcionarem?&amp;lt;/li&amp;gt;&#xD;
    &amp;lt;li&amp;gt;Com que freq&amp;amp;uuml;&amp;amp;ecirc;ncia os testes s&amp;amp;atilde;o executados?&amp;lt;/li&amp;gt;&#xD;
    &amp;lt;li&amp;gt;Quantos passos formam os refactorings?&amp;lt;/li&amp;gt;&#xD;
&amp;lt;/ul&amp;gt;&#xD;
&amp;lt;p&amp;gt;Essas e outras quest&amp;amp;otilde;es, bem como detalhes t&amp;amp;eacute;cnicos sobre como praticar o TDD ser&amp;amp;atilde;o abordados no &amp;lt;a href="http://www.fratech.net/eventos/detalhes/81"&amp;gt;Workshop sobre Test Driven Development&amp;lt;/a&amp;gt; realizado pela Fratech. Se seu sistema anda com problemas na hora de refatorar ou sua produtividade est&amp;amp;aacute; restrita, mesmo quando utiliza metodologias &amp;amp;aacute;geis em seus projetos, n&amp;amp;atilde;o deixe de participar.&amp;lt;/p&amp;gt;&lt;img src="http://feeds.feedburner.com/~r/fratech-blog/~4/M22VeDgH2Gs" height="1" width="1"/&gt;</content>
    <dc:creator>Felipe Rodrigues de Almeida</dc:creator>
    <dc:date>2009-04-02T19:24:00Z</dc:date>
  <feedburner:origLink>http://www.fratech.net/comunidade/exibir/48</feedburner:origLink></entry>
  <entry>
    <title>Utilizando metáforas no design de software</title>
    <link rel="alternate" href="http://feedproxy.google.com/~r/fratech-blog/~3/nDfkVRdKV2Q/47" />
    <author>
      <name>Felipe Rodrigues de Almeida</name>
    </author>
    <updated>2009-02-20T17:55:00Z</updated>
    <published>2009-02-20T17:55:00Z</published>
    <content type="html">&amp;lt;p&amp;gt;&amp;lt;img height="150" align="right" width="200" src="http://img27.imageshack.us/img27/9079/homersimpsonbraindx6.jpg" alt="Bad Designer Brains" /&amp;gt;Uma das principais dificuldades no desenvolvimento de software moderno &amp;amp;eacute; disseminar o conhecimento e difundir as necessidades do usu&amp;amp;aacute;rio. &amp;amp;Eacute; muito dif&amp;amp;iacute;cil para n&amp;amp;oacute;s desenvolvedores enteder o sistema, pois temos de nos adaptar &amp;amp;agrave;s diversas situa&amp;amp;ccedil;&amp;amp;otilde;es de neg&amp;amp;oacute;cio, que mudam conforme cada projeto. &amp;lt;br /&amp;gt;&#xD;
O problema &amp;amp;eacute; que entendemos de computa&amp;amp;ccedil;&amp;amp;atilde;o, mas fazemos softwares para tratar situa&amp;amp;ccedil;&amp;amp;otilde;es que n&amp;amp;atilde;o tem rela&amp;amp;ccedil;&amp;amp;atilde;o direta com a  computa&amp;amp;ccedil;&amp;amp;atilde;o. Isso nos obriga a lidar com teorias e conceitos que n&amp;amp;atilde;o s&amp;amp;atilde;o familiares ao nosso c&amp;amp;eacute;rebro. Isso pode complicar de  forma significativa o design.&amp;amp;nbsp;&amp;lt;/p&amp;gt;&#xD;
&amp;lt;h2&amp;gt;O lado direito do c&amp;amp;eacute;rebro (R-mode)&amp;lt;/h2&amp;gt;&#xD;
&amp;lt;p&amp;gt;&amp;lt;img height="261" align="left" width="349" src="http://img8.imageshack.us/img8/1603/ff70brain1fas7.jpg" alt="Hemisf&amp;amp;eacute;rios do C&amp;amp;eacute;rebro" style="padding: 5px;" /&amp;gt; O fato &amp;amp;eacute; que na maioria das vezes essas informa&amp;amp;ccedil;&amp;amp;otilde;es chegam para n&amp;amp;oacute;s de forma textual, o que estimula apenas o lado esquerdo do c&amp;amp;eacute;rebro (L-mode). Acontece que design de software &amp;amp;eacute; uma atividade de intui&amp;amp;ccedil;&amp;amp;atilde;o, criatividade e resolu&amp;amp;ccedil;&amp;amp;atilde;o de problemas,  atribui&amp;amp;ccedil;&amp;amp;otilde;es do lado direito do c&amp;amp;eacute;rebro (R-mode). Estes dois lados s&amp;amp;atilde;o ass&amp;amp;iacute;ncronos. N&amp;amp;atilde;o podemos utiliz&amp;amp;aacute;-los ao mesmo tempo. Pior que isso, &amp;amp;eacute; o fato de que n&amp;amp;agrave;o controlamos o R-mode, apenas o L-mode de nosso c&amp;amp;eacute;rebro. Para mais informa&amp;amp;ccedil;&amp;amp;otilde;es sobre isso  leia &amp;lt;a href="http://www.pragprog.com/titles/ahptl/pragmatic-thinking-and-learning"&amp;gt;este livro&amp;lt;/a&amp;gt;. Ao tentar raciocinar  textualmente com o L-mode, pensando em sintaxe e detalhes t&amp;amp;eacute;cnicos, perdemos o contato com o R-mode e consequentemente a capacidade de criar, contando apenas com a capacidade anal&amp;amp;iacute;tica e l&amp;amp;oacute;gica de nosso c&amp;amp;eacute;rebro. Em outras palavras, somos fisicamente limitados a criar p&amp;amp;eacute;ssimos modelos a n&amp;amp;atilde;o ser que dominemos o assunto de que o software trata (domain).&amp;amp;nbsp;&amp;lt;/p&amp;gt;&#xD;
&amp;lt;h2&amp;gt;As met&amp;amp;aacute;foras vem para ajudar&amp;lt;/h2&amp;gt;&#xD;
&amp;lt;p&amp;gt;Ap&amp;amp;oacute;s aceitar o fato de que somo limitados, devemos procurar formas de ultrapassar nossos limites. De acordo com a  explica&amp;amp;ccedil;&amp;amp;atilde;o acima, isso envolve ser capaz de usar o processo criativo quando projetando um software, ou, dominar o domain em quest&amp;amp;atilde;o. Precisamos criar um ambiente onde o L-mode se encontre com o R-mode, possibilitando criatividade e an&amp;amp;aacute;lise  simult&amp;amp;acirc;neamente. Este ambiente &amp;amp;eacute; o mundo virtual das met&amp;amp;aacute;foras.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;amp;quot;Met&amp;amp;aacute;fora &amp;amp;eacute; um local comum para a verbaliza&amp;amp;ccedil;&amp;amp;atilde;o e as imagens, uma forma de viajar de para tr&amp;amp;aacute;s e para a frente entre o consciente e o subconsciente, entre os hemisf&amp;amp;eacute;rios direito e esquerdo de nosso c&amp;amp;eacute;rebro.&amp;amp;quot; [The Journal of Creative  Behavior, 15(1), 1981.]&amp;amp;nbsp;&amp;lt;/p&amp;gt;&#xD;
&amp;lt;h2&amp;gt;Met&amp;amp;aacute;foras e os m&amp;amp;eacute;todos &amp;amp;aacute;geis&amp;lt;/h2&amp;gt;&#xD;
&amp;lt;p&amp;gt;O uso de met&amp;amp;aacute;foras &amp;amp;eacute; algo muito difundido na comunidade de m&amp;amp;eacute;todos &amp;amp;aacute;geis. O Extreme Programming chega ao ponto de list&amp;amp;aacute;-la como uma de suas pr&amp;amp;aacute;ticas, destacando a import&amp;amp;acirc;ncia do seu uso. Outros conceitos e processos, como Domain Driven Design cont&amp;amp;eacute;m refer&amp;amp;ecirc;ncias ao uso de met&amp;amp;aacute;fora e seus benef&amp;amp;iacute;cios.&amp;lt;br /&amp;gt;&#xD;
Como visto no &amp;lt;a href="http://www.infoq.com/br/news/2008/11/decline-of-agile"&amp;gt;post no infoQ&amp;lt;/a&amp;gt;, muitos projetos &amp;amp;aacute;geis tem  falhado e conforme Martin Fowler relata &amp;lt;a href="http://www.martinfowler.com/bliki/FlaccidScrum.html"&amp;gt;neste post&amp;lt;/a&amp;gt;, a  maioria por falta da ado&amp;amp;ccedil;&amp;amp;atilde;o de boas pr&amp;amp;aacute;ticas de engenharia de software. O uso de met&amp;amp;aacute;fora, &amp;amp;eacute; uma delas.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;h2&amp;gt;Met&amp;amp;aacute;foras e Domain Driven Design&amp;lt;/h2&amp;gt;&#xD;
&amp;lt;p&amp;gt;No &amp;lt;a href="http://www.fratech.net/comunidade/exibir/41"&amp;gt;Domain Driven Design&amp;lt;/a&amp;gt;, devemos orientar e restringir o design do software &amp;amp;agrave;s peculiaridades de seu dom&amp;amp;iacute;nio. O Domain Driven Design, prega o uso de uma linguagem comum e amplamente utilizada pelo time, com o objetivo de tornar mais f&amp;amp;aacute;cil o entendimento e a comunica&amp;amp;ccedil;&amp;amp;atilde;o de ambas as partes.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;h3&amp;gt;Met&amp;amp;aacute;fora do Sistema&amp;lt;/h3&amp;gt;&#xD;
&amp;lt;p&amp;gt;Eric Evans afirma em seu livro, &amp;lt;em&amp;gt;Domain Driven Design - Tackling Complexity in the Heart of Software&amp;lt;/em&amp;gt;, que &amp;amp;quot;o design  de software tende a ser muito abstrato e dif&amp;amp;iacute;cil de entender. Os desenvolvedores e usu&amp;amp;aacute;rios precisam de uma forma tang&amp;amp;iacute;vel de entender e compartilhar uma vis&amp;amp;atilde;o do sistema como um todo.&amp;amp;quot;. Utilizando as met&amp;amp;aacute;foras, os desenvolvedores e experts do  domain tem um ponto de refer&amp;amp;ecirc;ncia  para discuss&amp;amp;otilde;es que podem ser mais concretas que o modelo por si s&amp;amp;oacute;.&amp;lt;br /&amp;gt;&#xD;
Na verdade, as met&amp;amp;aacute;foras devem ser utilizadas como ponto de partida para a cria&amp;amp;ccedil;&amp;amp;atilde;o de uma boa &amp;lt;em&amp;gt;ubiquitous language&amp;lt;/em&amp;gt;. As met&amp;amp;aacute;foras s&amp;amp;atilde;o consolidadas atrav&amp;amp;eacute;s do uso de modelos explanat&amp;amp;oacute;rios (&amp;lt;em&amp;gt;Explanatory Models&amp;lt;/em&amp;gt;), uma esp&amp;amp;eacute;cie de diagrama sugerido por Evans em seu livro.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;h2&amp;gt;Criando met&amp;amp;aacute;foras&amp;lt;/h2&amp;gt;&#xD;
&amp;lt;h2&amp;gt;&amp;lt;img height="210" align="left" width="210" style="padding: 5px;" src="http://img242.imageshack.us/img242/3214/brain7639821ng9.jpg" alt="Brain Connections" /&amp;gt;&amp;lt;/h2&amp;gt;&#xD;
&amp;lt;p&amp;gt;A palavra &amp;lt;em&amp;gt;Met&amp;amp;aacute;fora&amp;lt;/em&amp;gt; vem do  grego &amp;lt;i&amp;gt;&amp;amp;quot;tranferir&amp;amp;quot;&amp;lt;/i&amp;gt;, implicando a id&amp;amp;eacute;ia de transferir os atributos de um objeto para um outro de forma literalmente imposs&amp;amp;iacute;vel.  Combinar dois objetos ou situa&amp;amp;ccedil;&amp;amp;otilde;es de forma que resulte em uma hist&amp;amp;oacute;ria comum aos dois lados. &amp;lt;a href="http://en.wikipedia.org/wiki/Edward_de_Bono"&amp;gt;Edward De Bono&amp;lt;/a&amp;gt; prop&amp;amp;ocirc;s uma t&amp;amp;eacute;cnica chamada &amp;lt;a href="http://en.wikipedia.org/wiki/Po_(term)"&amp;gt;PO&amp;lt;/a&amp;gt; que ajuda na cria&amp;amp;ccedil;&amp;amp;atilde;o de met&amp;amp;aacute;foras. Basicamente pegamos um objeto aleat&amp;amp;oacute;rio e  associamos com o dom&amp;amp;iacute;nio&amp;lt;img height="256" align="right" width="182" style="padding: 5px;" src="http://img24.imageshack.us/img24/165/82206928es5.jpg" alt="Liquidificador &amp;amp;amp; brain" /&amp;gt; em quest&amp;amp;atilde;o. Por exemplo:&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Dom&amp;amp;iacute;nio em quest&amp;amp;atilde;o: Cria&amp;amp;ccedil;&amp;amp;atilde;o de Met&amp;amp;aacute;foras&amp;lt;br /&amp;gt;&#xD;
Palavra Aleat&amp;amp;oacute;ria: Liquidificador&amp;lt;br /&amp;gt;&#xD;
&amp;lt;br /&amp;gt;&#xD;
&amp;lt;strong&amp;gt;Met&amp;amp;aacute;fora&amp;lt;/strong&amp;gt;:&amp;lt;br /&amp;gt;&#xD;
&amp;amp;nbsp; &amp;lt;span style="font-style: italic;"&amp;gt;Imagine que criar met&amp;amp;aacute;foras &amp;amp;eacute; semelhante a fazer uma vitamina. Voc&amp;amp;ecirc; deve escolher cuidadosamente os ingredientes que voc&amp;amp;ecirc; mais gosta. Coloc&amp;amp;aacute;-los no liquidificador, lig&amp;amp;aacute;-lo e esperar. Enquanto o &amp;lt;/span&amp;gt;&amp;lt;span style="font-style: italic;"&amp;gt;liquidificador faz seu processamento, voc&amp;amp;ecirc; deve relaxar. Ap&amp;amp;oacute;s algum tempo, a vitamina est&amp;amp;aacute; pronta. Basta retirar e tomar.&amp;lt;/span&amp;gt;&amp;lt;br /&amp;gt;&#xD;
&amp;lt;br /&amp;gt;&#xD;
Assim funciona a cria&amp;amp;ccedil;&amp;amp;atilde;o de met&amp;amp;aacute;foras. Voc&amp;amp;ecirc; junta alguns est&amp;amp;iacute;mulos (ingredientes) de sua prefer&amp;amp;ecirc;ncia e armazena em seu c&amp;amp;eacute;rebro. Estimule seu c&amp;amp;eacute;rebro relaxando (ouvindo m&amp;amp;uacute;sica, assistindo TV, caminhando pela cidade) enquanto o seu R-mode  processa os ingredientes e derrepente, algo extremamente saboroso fica pronto. Sua nova met&amp;amp;aacute;fora. Pronta para utilizar.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Expresse sua met&amp;amp;aacute;fora em software, da forma que &amp;amp;eacute; explicado neste &amp;lt;a href="http://www.fratech.net/comunidade/exibir/43"&amp;gt;artigo&amp;lt;/a&amp;gt;. O resultado ser&amp;amp;aacute; um design bem feito e simples de ser explicado. Aconselho ainda &amp;lt;a href="http://conversamos.wordpress.com/2007/10/01/do-uso-das-metaforas-ou-dos-criadores-de-enigmas/"&amp;gt;esta&amp;lt;/a&amp;gt; leitura sobre met&amp;amp;aacute;foras.&amp;amp;nbsp;&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;O que voc&amp;amp;ecirc; acha da utiliza&amp;amp;ccedil;&amp;amp;atilde;o de met&amp;amp;aacute;foras para o design de software? Deixe seu coment&amp;amp;aacute;rio.&amp;lt;/p&amp;gt;&lt;img src="http://feeds.feedburner.com/~r/fratech-blog/~4/nDfkVRdKV2Q" height="1" width="1"/&gt;</content>
    <dc:creator>Felipe Rodrigues de Almeida</dc:creator>
    <dc:date>2009-02-20T17:55:00Z</dc:date>
  <feedburner:origLink>http://www.fratech.net/comunidade/exibir/47</feedburner:origLink></entry>
  <entry>
    <title>Projetos ágeis - Levantamento Inicial</title>
    <link rel="alternate" href="http://feedproxy.google.com/~r/fratech-blog/~3/uak3P85Ald4/46" />
    <author>
      <name>Felipe Rodrigues &amp; Flávia Oliveira</name>
    </author>
    <updated>2009-02-17T13:57:00Z</updated>
    <published>2009-02-17T13:57:00Z</published>
    <content type="html">&amp;lt;p&amp;gt;Na &amp;amp;uacute;ltima semana na Fratech, iniciamos um projeto grande de desenvolvimento. O projeto consiste em um ERP voltado para a ind&amp;amp;uacute;stria de manufatura, principalmente para empresas de pequeno porte. Como em todo projeto de software, o come&amp;amp;ccedil;o &amp;amp;eacute; sempre a parte mais arriscada, neste n&amp;amp;atilde;o seria diferente.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;&amp;amp;Eacute; no come&amp;amp;ccedil;o dos projetos que devemos decidir qual o caminho a ser tomado, qual a tecnologia a ser aplicada e  principalmente, o que deve ser feito. O processo que utilizamos para responder a essas quest&amp;amp;otilde;es, podem definir o sucesso ou o fracasso de um projeto. Isso traz ainda mais responsabilidade (e problemas) no come&amp;amp;ccedil;o do projeto. Neste caso temos duas  op&amp;amp;ccedil;&amp;amp;otilde;es: Postergar esses problemas para um momento onde estejamos mais maduros em rela&amp;amp;ccedil;&amp;amp;atilde;o ao projeto (mera ilus&amp;amp;atilde;o), ou &amp;lt;a href="http://www.martinfowler.com/bliki/EarlyPain.html"&amp;gt;enfrent&amp;amp;aacute;-los imediatamente&amp;lt;/a&amp;gt;.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Por esse e outros motivos, decidimos que a abordagem &amp;amp;aacute;gil seria a melhor op&amp;amp;ccedil;&amp;amp;atilde;o neste caso. Usamos v&amp;amp;aacute;rias pr&amp;amp;aacute;ticas &amp;amp;aacute;geis que vimos funcionar efetivamente em outros projetos, para compor um processo customizado. Nesse contexto, iniciamos nosso projeto com os seguintes passos:&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt;&#xD;
&amp;lt;ul&amp;gt;&#xD;
    &amp;lt;li&amp;gt;&#xD;
    &amp;lt;h2&amp;gt;Definir o objetivo do projeto:&amp;lt;/h2&amp;gt;&#xD;
    Nesta etapa devemos identificar os principais aspectos do sistema de forma abrangente e sucinta. Descrever o &amp;lt;a href="http://visaoagil.wordpress.com/2008/07/07/sim-nos-agilistas-temos-escopo&amp;amp;hellip;/"&amp;gt;objetivo&amp;lt;/a&amp;gt; deste sistema, para que tenhamos em mente onde queremos chegar. Isso serve para mantermos o foco e a simplicidade do sistema e determinar o resultado que deve ser atingido.&amp;lt;/li&amp;gt;&#xD;
    &amp;lt;li&amp;gt;&#xD;
    &amp;lt;h2&amp;gt;Defini&amp;amp;ccedil;&amp;amp;atilde;o das &amp;amp;aacute;reas e opera&amp;amp;ccedil;&amp;amp;otilde;es do sistema:&amp;lt;/h2&amp;gt;&#xD;
    Ap&amp;amp;oacute;s definir o objetivo &amp;amp;eacute; interessante relacionar algumas das principais opera&amp;amp;ccedil;&amp;amp;otilde;es do sistema (n&amp;amp;atilde;o mais do que 10), com o  objetivo de enteder qual a complexidade do sistema. &amp;amp;Eacute; necess&amp;amp;aacute;rio ser abrangente para que se consiga uma vis&amp;amp;atilde;o geral de das partes do sistema. Uma vez que se tenha esta lista, deve-se organiz&amp;amp;aacute;-la, agrupando os itens por &amp;amp;aacute;reas que comp&amp;amp;otilde;e o  sistema. N&amp;amp;atilde;o estou falando de m&amp;amp;oacute;dulos, mas de conjuntos de opera&amp;amp;ccedil;&amp;amp;otilde;es de um &amp;amp;uacute;nico m&amp;amp;oacute;dulo do sistema. &amp;lt;b&amp;gt;Dica:&amp;lt;/b&amp;gt; Comece pelas partes mais complexas, buscando assim estimular o conceito de &amp;lt;a href="http://www.martinfowler.com/bliki/EarlyPain.htm"&amp;gt; early pain&amp;lt;/a&amp;gt;.&#xD;
    &amp;lt;p&amp;gt;Para isso, utilizamos o conceito de &amp;lt;a href="http://www.heptagon.com.br/fdd2"&amp;gt;&amp;lt;em&amp;gt;FBS (Feature Breakdown Structure)&amp;lt;/em&amp;gt;&amp;lt;/a&amp;gt; do  &amp;lt;a href="http://www.heptagon.com.br/fdd-oque"&amp;gt;FDD (Feature Driven Development)&amp;lt;/a&amp;gt;, que nada mais &amp;amp;eacute; do que listar as  funcionalidades de seus sistema, organizadas por &amp;amp;aacute;reas. Voc&amp;amp;ecirc; pode variar os n&amp;amp;iacute;veis e a estrutura de uma &amp;lt;em&amp;gt;FBS&amp;lt;/em&amp;gt;, por&amp;amp;eacute;m ela &amp;amp;eacute;  muito &amp;amp;uacute;til para construir seu &amp;lt;em&amp;gt;backlog&amp;lt;/em&amp;gt;.&amp;lt;/p&amp;gt;&#xD;
    &amp;lt;p&amp;gt;Exemplo de &amp;lt;em&amp;gt;FBS&amp;lt;/em&amp;gt; usando templates de &amp;lt;em&amp;gt;Mind Map Modeling (M3)&amp;lt;/em&amp;gt;:&amp;lt;/p&amp;gt;&#xD;
    &amp;lt;/li&amp;gt;&#xD;
    &amp;lt;p&amp;gt;&amp;lt;a href="http://img511.imageshack.us/img511/3761/exemplom3pm9.png" target="_blank"&amp;gt; &amp;lt;img border="0" style="width: 578px; height: 199px;" src="http://img511.imageshack.us/img511/3761/exemplom3pm9.png" alt="exemplo de arquivo m3" /&amp;gt; &amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&#xD;
    &amp;lt;li&amp;gt;&#xD;
    &amp;lt;h2&amp;gt;Constru&amp;amp;ccedil;&amp;amp;atilde;o de prot&amp;amp;oacute;tipos de telas:&amp;lt;/h2&amp;gt;&#xD;
    Com as principais funcionalidades do sistema em m&amp;amp;atilde;os, &amp;amp;eacute; hora de criar alguns prot&amp;amp;oacute;tipos de tela e assim vivenciar a  dificuldade na hora de implementar. Esses prot&amp;amp;oacute;tipos tamb&amp;amp;eacute;m s&amp;amp;atilde;o simples e abrangentes, de forma que pode-se utilizar  wireframes para representar as telas. O objetivo deste passo n&amp;amp;atilde;o &amp;amp;eacute; saber como ser&amp;amp;atilde;o as telas, mas sim validar as descri&amp;amp;ccedil;&amp;amp;otilde;es  das funcionalidades descritas no item anterior. Lembre-se que neste momento voc&amp;amp;ecirc; deve ter por volta de 10 funcionalidades  apenas, o que mant&amp;amp;eacute;m este processo simples e r&amp;amp;aacute;pido.&#xD;
    &amp;lt;p&amp;gt;&amp;lt;a href="http://img232.imageshack.us/img232/9580/prototipodetelagp0.png" target="_blank"&amp;gt;   &amp;lt;img width="500" border="0" src="http://img232.imageshack.us/img232/9580/prototipodetelagp0.png" alt="Exemplo de prot&amp;amp;oacute;tipo de tela" /&amp;gt; &amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&#xD;
    &amp;lt;/li&amp;gt;&#xD;
&amp;lt;/ul&amp;gt;&#xD;
&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Este processo completo n&amp;amp;atilde;o tomou mais do uma semana no projeto em quest&amp;amp;atilde;o. Isso contece porque o objetivo n&amp;amp;atilde;o &amp;amp;eacute; detalhar tudo o que precisa ser feito no sistema, afinal n&amp;amp;atilde;o acreditamos no &amp;lt;a href="http://www.agilemodeling.com/essays/examiningBRUF.htm"&amp;gt; Big Requirements Up Front&amp;lt;/a&amp;gt;, mas sim no modelo de &amp;lt;a href="http://martinfowler.com/articles/designDead.html"&amp;gt;design incremental&amp;lt;/a&amp;gt; adotado nas &amp;lt;em&amp;gt;metodologias &amp;amp;aacute;geis&amp;lt;/em&amp;gt;. Os passos seguintes a estes, fazem parte do desenvolvimento do software em si e incluem tarefas de modelagem, levantamento de requisitos continuamente e escrita de testes e c&amp;amp;oacute;digo.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;A partir deste ponto o &amp;lt;em&amp;gt;backlog&amp;lt;/em&amp;gt; &amp;amp;eacute; composto pelos itens iniciais da &amp;lt;em&amp;gt;FBS&amp;lt;/em&amp;gt;, conforme reuni&amp;amp;otilde;es de prioriza&amp;amp;ccedil;&amp;amp;atilde;o com o cliente. O time j&amp;amp;aacute; est&amp;amp;aacute; pronto para come&amp;amp;ccedil;ar o desenvolvimento do software e ap&amp;amp;oacute;s 2 semanas, &amp;lt;em&amp;gt;entregar software funcionando&amp;lt;/em&amp;gt;. Conforme o time se aprofunda no desenvolvimento, deve atualizar a &amp;lt;em&amp;gt;FBS&amp;lt;/em&amp;gt; com prot&amp;amp;oacute;tipos e descri&amp;amp;ccedil;&amp;amp;otilde;es das funcionalidades,  seguindo o conceito de &amp;lt;em&amp;gt;design evolutivo&amp;lt;/em&amp;gt;. Pode-se tamb&amp;amp;eacute;m listar os crit&amp;amp;eacute;rios de aceita&amp;amp;ccedil;&amp;amp;atilde;o ou casos de teste para cada funcionalidade. A &amp;lt;em&amp;gt;FBS&amp;lt;/em&amp;gt; alimenta o &amp;lt;em&amp;gt;backlog&amp;lt;/em&amp;gt; e, ao final do projeto, ela servir&amp;amp;aacute; para mensurar a quantidade de funcionalidades  implementadas e como est&amp;amp;atilde;o divididas. Como um mapa da aplica&amp;amp;ccedil;&amp;amp;atilde;o.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Para mais informa&amp;amp;ccedil;&amp;amp;otilde;es sobre como desenvolver o escopo de sua aplica&amp;amp;ccedil;&amp;amp;atilde;o veja &amp;lt;a href="http://visaoagil.wordpress.com/2009/02/05/escopo-iterativo-e-incremental-para-o-gerenciamento-agil-de-requisitos/"&amp;gt;este post&amp;lt;/a&amp;gt; do Manoel Pimentel.&amp;lt;/p&amp;gt;&lt;img src="http://feeds.feedburner.com/~r/fratech-blog/~4/uak3P85Ald4" height="1" width="1"/&gt;</content>
    <dc:creator>Felipe Rodrigues &amp; Flávia Oliveira</dc:creator>
    <dc:date>2009-02-17T13:57:00Z</dc:date>
  <feedburner:origLink>http://www.fratech.net/comunidade/exibir/46</feedburner:origLink></entry>
  <entry>
    <title>Hello Merb</title>
    <link rel="alternate" href="http://feedproxy.google.com/~r/fratech-blog/~3/Xn9I6dfdn0w/45" />
    <author>
      <name>Felipe Rodrigues</name>
    </author>
    <updated>2009-02-03T13:36:00Z</updated>
    <published>2009-02-03T13:36:00Z</published>
    <content type="html">&amp;lt;p&amp;gt;Ultimamente tenho utilizado o &amp;lt;a target="_blank" href="http://merbivore.com/"&amp;gt;Merb&amp;lt;/a&amp;gt; no trabalho. O Merb &amp;amp;eacute; um framework MVC leve e pr&amp;amp;aacute;tico que oferece agilidade no desenvolviemnto web, da mesma forma que o Rails e o Grails. O Merb &amp;amp;eacute; escrito em  Ruby e dessa forma, utilizamos Ruby para seu desenvolvimento. Neste artigo, vamos caminhar por algumas das funcionalidades  b&amp;amp;aacute;sicas do Merb, criando uma pequena aplica&amp;amp;ccedil;&amp;amp;atilde;o hello World.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;O Merb se torna ainda mais interessante se levarmos em considera&amp;amp;ccedil;&amp;amp;atilde;o que &amp;lt;a target="_blank" href="http://merb-br.org/merb-rails"&amp;gt;o Merb 2 tamb&amp;amp;eacute;m ser&amp;amp;aacute; o Rails 3&amp;lt;/a&amp;gt;. Por isso &amp;amp;eacute; bom ir entender melhor o funcionamento do Merb. Apesar usar um  paradigma similar, o Merb possue algumas diferen&amp;amp;ccedil;as interessantes em rela&amp;amp;ccedil;&amp;amp;atilde;o ao Rails (que foi um dos motivos da fus&amp;amp;atilde;o).&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;O Merb &amp;amp;eacute; um framework agn&amp;amp;oacute;stico, que significa que n&amp;amp;atilde;o imp&amp;amp;otilde;es nenhuma escolha ao usu&amp;amp;aacute;rio, apesar de oferecer alguns  padr&amp;amp;otilde;es. Isso inclui o mecanismo ORM, biblioteca JavaScript e mecanismo de template. No quesito ORM, o Merb suporta o &amp;lt;a target="_blank" href="http://datamapper.org/"&amp;gt;DataMapper&amp;lt;/a&amp;gt;, &amp;lt;a target="_blank" href="http://ar.rubyonrails.org/"&amp;gt;Active Record&amp;lt;/a&amp;gt; e o  &amp;lt;a target="_blank" href="http://sequel.rubyforge.org/"&amp;gt;Sequel&amp;lt;/a&amp;gt;. Os mecanismos de template suportados s&amp;amp;atilde;o o  &amp;lt;a target="_blank" href="http://haml.hamptoncatlin.com/"&amp;gt;HALM&amp;lt;/a&amp;gt; e o  &amp;lt;a target="_blank" href="http://en.wikipedia.org/wiki/ERub"&amp;gt;eRuby&amp;lt;/a&amp;gt;. Isso fez com que o time de desenvolviemnto pudesse  focar no core do Merb.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;h2&amp;gt;Instala&amp;amp;ccedil;&amp;amp;atilde;o&amp;lt;/h2&amp;gt;&#xD;
&amp;lt;p&amp;gt;Para instalar o Merb,&amp;lt;a target="_blank" href="http://www.ruby-lang.org/pt/downloads/"&amp;gt;&amp;amp;eacute; necess&amp;amp;aacute;rio ter o Ruby&amp;lt;/a&amp;gt; e o  &amp;lt;a target="_blank" href="http://www.rubygems.org/read/chapter/3"&amp;gt;RubyGems&amp;lt;/a&amp;gt; instalados e ent&amp;amp;atilde;o, basta executar  &amp;lt;code&amp;gt;sudo gem install merb&amp;lt;/code&amp;gt; (sudo necess&amp;amp;aacute;rio somente para plataformas unix).&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Tamb&amp;amp;eacute;m devemos instalar algum servidor para executar nossas aplica&amp;amp;ccedil;&amp;amp;otilde;es merb. O Merb pode ser utilizado com diversos servidores, como Mongrel, WebBrick, Thin, etc. Para instalar o Mongrel, basta executar o comando &amp;lt;code&amp;gt;gem install mongrel&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;O Merb oferece 4 modelos de aplica&amp;amp;ccedil;&amp;amp;atilde;o (merb stacks) para iniciar um projeto. S&amp;amp;atilde;o eles:&amp;lt;/p&amp;gt;&#xD;
&amp;lt;ul&amp;gt;&#xD;
    &amp;lt;li&amp;gt;App - Stack com mecanismos padr&amp;amp;atilde;o definidos para ORM, templates e configura&amp;amp;ccedil;&amp;amp;otilde;es gerais. Adiciona depend&amp;amp;ecirc;ncias atrav&amp;amp;eacute;s do arquivo &amp;lt;code&amp;gt;config/dependencies.rb&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&#xD;
    &amp;lt;li&amp;gt;Core - Stack que gera uma aplica&amp;amp;ccedil;&amp;amp;atilde;o completa, com estrutura de diret&amp;amp;oacute;rios e arquivos de configura&amp;amp;ccedil;&amp;amp;atilde;o, por&amp;amp;eacute;m n&amp;amp;atilde;o inclui depend&amp;amp;ecirc;ncia. Permite a voc&amp;amp;ecirc; configurar sua aplica&amp;amp;ccedil;&amp;amp;atilde;o para utilizar os mecanismos de sua prefer&amp;amp;ecirc;ncia.&amp;lt;/li&amp;gt;&#xD;
    &amp;lt;li&amp;gt;Flat - Stack para uma aplica&amp;amp;ccedil;&amp;amp;atilde;o onde a l&amp;amp;oacute;gica est&amp;amp;aacute; centralizada em um &amp;amp;uacute;nico arquivo controlador, por&amp;amp;eacute;m com arquivos de configura&amp;amp;ccedil;&amp;amp;atilde;o separados.&amp;lt;/li&amp;gt;&#xD;
    &amp;lt;li&amp;gt;Very-Flat - Stack para uma aplica&amp;amp;ccedil;&amp;amp;atilde;o onde tanto a l&amp;amp;oacute;gica quanto as configura&amp;amp;ccedil;&amp;amp;otilde;es est&amp;amp;atilde;o centralizadas em um &amp;amp;uacute;nico arquivo. Esse tipo de aplica&amp;amp;ccedil;&amp;amp;atilde;o &amp;amp;eacute; comum nos famosos ruby micro-frameworks.&amp;lt;/li&amp;gt;&#xD;
&amp;lt;/ul&amp;gt;&#xD;
&amp;lt;p&amp;gt;Para criar uma aplica&amp;amp;ccedil;&amp;amp;atilde;o, basta executar o comando &amp;lt;code&amp;gt;merb-gen &amp;amp;lt;&amp;lt;stack&amp;gt;&amp;amp;gt; nome_aplicacao&amp;lt;/stack&amp;gt;&amp;lt;/code&amp;gt;. Para este exemplo, vamos utilizar o stack app:&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;merb-gen app hello&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;O resultado deve ser uma lista com os arquivos criados:&amp;lt;/p&amp;gt;&#xD;
&amp;lt;pre&amp;gt;&#xD;
Generating with app generator:&#xD;
     [ADDED]  .gitignore&#xD;
     [ADDED]  public/.htaccess&#xD;
     [ADDED]  tasks/doc.thor&#xD;
     [ADDED]  public/javascripts/jquery.js&#xD;
     [ADDED]  doc/rdoc/generators/template/merb/api_grease.js&#xD;
     [ADDED]  doc/rdoc/generators/template/merb/index.html.erb&#xD;
     [ADDED]  doc/rdoc/generators/template/merb/merb_doc_styles.css&#xD;
     [ADDED]  doc/rdoc/generators/template/merb/merb.css&#xD;
     [ADDED]  doc/rdoc/generators/template/merb/prototype.js&#xD;
     [ADDED]  doc/rdoc/generators/template/merb/merb.rb&#xD;
     [ADDED]  doc/rdoc/generators/merb_generator.rb&#xD;
     [ADDED]  public/favicon.ico&#xD;
     [ADDED]  public/merb.fcgi&#xD;
     [ADDED]  public/robots.txt&#xD;
     [ADDED]  public/images/merb.jpg&#xD;
     [ADDED]  Rakefile&#xD;
     [ADDED]  app/views/exceptions/not_found.html.erb&#xD;
     [ADDED]  app/views/exceptions/not_acceptable.html.erb&#xD;
     [ADDED]  app/controllers/exceptions.rb&#xD;
     [ADDED]  app/controllers/application.rb&#xD;
     [ADDED]  app/models/user.rb&#xD;
     [ADDED]  app/helpers/global_helpers.rb&#xD;
     [ADDED]  autotest/discover.rb&#xD;
     [ADDED]  autotest/merb_rspec.rb&#xD;
     [ADDED]  autotest/merb.rb&#xD;
     [ADDED]  config/rack.rb&#xD;
     [ADDED]  config/router.rb&#xD;
     [ADDED]  config/environments/rake.rb&#xD;
     [ADDED]  config/environments/test.rb&#xD;
     [ADDED]  config/environments/development.rb&#xD;
     [ADDED]  config/environments/staging.rb&#xD;
     [ADDED]  config/environments/production.rb&#xD;
     [ADDED]  config/dependencies.rb&#xD;
     [ADDED]  config/database.yml&#xD;
     [ADDED]  config/init.rb&#xD;
     [ADDED]  public/stylesheets/master.css&#xD;
     [ADDED]  public/javascripts/application.js&#xD;
     [ADDED]  merb/session/session.rb&#xD;
     [ADDED]  merb/merb-auth/setup.rb&#xD;
     [ADDED]  merb/merb-auth/strategies.rb&#xD;
     [ADDED]  tasks/merb.thor&#xD;
     [ADDED]  spec&#xD;
     [ADDED]  gems&#xD;
     [ADDED]  app/views/layout/application.html.erb&#xD;
&amp;lt;/pre&amp;gt;&#xD;
&amp;lt;p&amp;gt;O Merb cria v&amp;amp;aacute;rios diret&amp;amp;oacute;rios e arquivos, que comp&amp;amp;otilde;e a aplica&amp;amp;ccedil;&amp;amp;atilde;o completa. Em um outro artigo, explicarei o objetivo de cada um desses diret&amp;amp;oacute;rios (para que este artigo n&amp;amp;atilde;o fique grande e chato.). Para testar a aplica&amp;amp;ccedil;&amp;amp;atilde;o, basta executar o  comando &amp;lt;code&amp;gt;merb&amp;lt;/code&amp;gt; dentro do diret&amp;amp;oacute;rio de sua aplica&amp;amp;ccedil;&amp;amp;atilde;o.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;&amp;lt;blackquote&amp;gt; &amp;lt;/blackquote&amp;gt;&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Obs.: Caso receba uma mensagem parecida com &amp;lt;code&amp;gt;FATAL: The gem dm-core (= 0.9.9, runtime), [] was not found &amp;lt;/code&amp;gt; n&amp;amp;atilde;o se preocupe. Isso quer dizer que o merb criou uma depend&amp;amp;ecirc;ncia que aponta para a vers&amp;amp;atilde;o errada de um determinado gem. Nesse caso, &amp;amp;eacute; necess&amp;amp;aacute;rio verificar se o arquivo config/dependencies.rb indica a vers&amp;amp;atilde;o correta do &amp;lt;code&amp;gt;dm&amp;lt;/code&amp;gt;  (o gem do DataMapper) e ent&amp;amp;atilde;o corrigir a vers&amp;amp;atilde;o.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Use o comando &amp;lt;code&amp;gt;gem list | grep dm&amp;lt;/code&amp;gt; para verificar a vers&amp;amp;atilde;o de seus gems dm. A vers&amp;amp;atilde;o mais atualizada na data  deste artigo era a 0.9.10. Dessa forma, vamos at&amp;amp;eacute; o arquivo config/dependencies.rb e verifique se o valor da vari&amp;amp;aacute;vel &amp;lt;code&amp;gt; dm_gems_version&amp;lt;/code&amp;gt; corresponde &amp;amp;agrave; vers&amp;amp;atilde;o instalada de seu gem dm. Caso a vers&amp;amp;atilde;o indicada seja diferente, modifique para a vers&amp;amp;atilde;o apresentada no comando acima. Procure utilizar sempre a &amp;amp;uacute;ltima vers&amp;amp;otilde;a instalada, a n&amp;amp;atilde;o ser que voc&amp;amp;ecirc; saiba o que est&amp;amp;aacute; fazendo. Esse problema ocorre porque o merb usa sempre a primeira vers&amp;amp;atilde;o que ele consegue encontrar (geralmente a  vers&amp;amp;atilde;o de n&amp;amp;uacute;mera&amp;amp;ccedil;&amp;amp;atilde;o mais baixa, porque os arquivos s&amp;amp;atilde;o listados em ordem crescente). O mesmo vale para os gem &amp;lt;code&amp;gt;do &amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Uma vez que sua aplica&amp;amp;ccedil;&amp;amp;atilde;o inicie sem erros, voc&amp;amp;ecirc; ser&amp;amp;aacute; capaz de acess&amp;amp;aacute;-la atrav&amp;amp;eacute;s da url &amp;lt;code&amp;gt; &amp;lt;a target="_blank" href="http://localhost:4000"&amp;gt;http://localhost:4000&amp;lt;/a&amp;gt;. Voc&amp;amp;ecirc; dever&amp;amp;aacute; ver a tela a seguir:&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;&amp;lt;a target="_blank" href="http://img24.imageshack.us/img24/4827/merbemptyappdz0.png"&amp;gt;&amp;lt;img border="0" width="480" title="Merb empty app Screenshot" alt="Merb Empty App Screenshot" src="http://img24.imageshack.us/img24/4827/merbemptyappdz0.png" /&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;As aplica&amp;amp;ccedil;&amp;amp;otilde;es merb s&amp;amp;atilde;o organizadas utilizando o pattern MVC (Model View Controller), que significa que teremos uma classe representando nosso modelo de dom&amp;amp;iacute;nio (Model), um ou mais arquivos repreentando nossas telas (view) e uma classe para  controlar o fluxo de nossa aplica&amp;amp;ccedil;&amp;amp;atilde;o (Controller). No merb as classes controller extendem a classe &amp;lt;code&amp;gt;Application&amp;lt;/code&amp;gt; gerada automaticamente pelo Merb. Application, por sua vez extende &amp;lt;code&amp;gt;Merb::Controller&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Para criar nosso primeiro controller, vamos utilizar o comando &amp;lt;code&amp;gt;merb-gen controller hello&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&#xD;
&amp;lt;pre&amp;gt;&#xD;
/hello/config/environments/development.rb&#xD;
     [ADDED]  app/controllers/hello.rb&#xD;
     [ADDED]  app/views/hello/index.html.erb&#xD;
     [ADDED]  spec/requests/hello_spec.rb&#xD;
     [ADDED]  app/helpers/hello_helper.rb&#xD;
&#xD;
&#xD;
Don't forget to add request/controller tests first.&amp;lt;/pre&amp;gt;&#xD;
&amp;lt;p&amp;gt;Os controllers s&amp;amp;atilde;o compostos por m&amp;amp;eacute;todos que s&amp;amp;atilde;o mapeados como actions da aplica&amp;amp;ccedil;&amp;amp;atilde;o. Vamos criar a action index,  adicionando apenas um m&amp;amp;eacute;todo chamado index no arquivo &amp;lt;code&amp;gt;app/controllers/hello.rb&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt;&#xD;
&amp;lt;pre&amp;gt;&#xD;
def index&#xD;
  'Hello World, from Merb!'&#xD;
end&#xD;
&amp;lt;/pre&amp;gt;&#xD;
&amp;lt;p&amp;gt;Agora basta reiniciar a sua aplica&amp;amp;ccedil;&amp;amp;atilde;o (pare o servidor com &amp;lt;code&amp;gt;ctrl+c&amp;lt;/code&amp;gt; e inicie novamente com &amp;lt;code&amp;gt;merb&amp;lt;/code&amp;gt;) acessar o endere&amp;amp;ccedil;o &amp;lt;a target="_blank" href="http://localhost:4000/hello"&amp;gt;http://localhost:4000/hello&amp;lt;/a&amp;gt; para ver sua obra prima.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Em breve teremos mais artigos sobre Merb e outros frameworks.&amp;lt;/p&amp;gt;&lt;img src="http://feeds.feedburner.com/~r/fratech-blog/~4/Xn9I6dfdn0w" height="1" width="1"/&gt;</content>
    <dc:creator>Felipe Rodrigues</dc:creator>
    <dc:date>2009-02-03T13:36:00Z</dc:date>
  <feedburner:origLink>http://www.fratech.net/comunidade/exibir/45</feedburner:origLink></entry>
  <entry>
    <title>Hello Ioke!</title>
    <link rel="alternate" href="http://feedproxy.google.com/~r/fratech-blog/~3/O551iw632ro/44" />
    <author>
      <name>Felipe Rodrigues</name>
    </author>
    <updated>2009-01-29T12:20:00Z</updated>
    <published>2009-01-29T12:20:00Z</published>
    <content type="html">&amp;lt;p&amp;gt;&amp;lt;a target="_blank" href="http://ioke.org"&amp;gt;&amp;lt;img height="78" border="0" align="left" width="80" style="margin-right: 10px;" title="http://ioke.org" alt="Ioke Logo" src="http://www.ioke.org/img/IokeLogo.png" /&amp;gt;&amp;lt;/a&amp;gt;No dia 23 de Dezembro de 2008 &amp;lt;a href="http://olabini.com/blog/"&amp;gt;Ola Bini&amp;lt;/a&amp;gt; (desenvolvedor do JRuby e v&amp;amp;aacute;rios outros  projetos) liberou a primeira vers&amp;amp;atilde;o de uma nova linguagem chamada &amp;lt;a href="http://ioke.org"&amp;gt;Ioke&amp;lt;/a&amp;gt;.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Ioke j&amp;amp;aacute; nasceu com certa popularidade devido aos v&amp;amp;aacute;rios &amp;lt;a href="http://olabini.com/blog/category/ioke"&amp;gt;posts sobre suas  id&amp;amp;eacute;ias em rela&amp;amp;ccedil;&amp;amp;atilde;o ao ioke&amp;lt;/a&amp;gt;. Apesar disso a comunidade de desenvolvedores tem por volta de 7 desenvolvedores ativos e as listas de email est&amp;amp;atilde;o come&amp;amp;ccedil;ando a caminhar. &amp;lt;a href="http://olabini.com/blog/2009/01/ioke-s-released/"&amp;gt;A vers&amp;amp;atilde;o &amp;amp;quot;S&amp;amp;quot; da linguagem acabou de ser liberada&amp;lt;/a&amp;gt;.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Ioke &amp;amp;eacute; desenvolvida em Java e &amp;amp;eacute; uma linguagem concebida para ser executada na JVM, por motivos &amp;amp;oacute;bvios de ado&amp;amp;ccedil;&amp;amp;atilde;o e estabilidade. Qualquer um com bons conhecimentos de Java pode ajudar em seu desenvolvimento. &amp;amp;Eacute; tamb&amp;amp;eacute;m baseada em linguagens como &amp;lt;em&amp;gt;Io&amp;lt;/em&amp;gt;, &amp;lt;em&amp;gt;Smalltalk&amp;lt;/em&amp;gt;, &amp;lt;em&amp;gt;Ruby&amp;lt;/em&amp;gt; e &amp;lt;em&amp;gt;Lisp&amp;lt;/em&amp;gt;.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Neste post quero apresentar superficialmente alguns dos conceitos b&amp;amp;aacute;sico da linguagem, que tem por objetivo principal, ser mais expressiva.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Ioke &amp;amp;eacute; uma linguagem din&amp;amp;acirc;mica por&amp;amp;eacute;m fortemente tipada.  &amp;amp;Eacute; &amp;lt;a href="http://en.wikipedia.org/wiki/Prototype-based_programming"&amp;gt;baseada em prot&amp;amp;oacute;tipos&amp;lt;/a&amp;gt;, o que significa que n&amp;amp;atilde;o possui o conceito de classes. Todo e qualquer inst&amp;amp;acirc;ncia &amp;amp;eacute; criada a partir de prot&amp;amp;oacute;tipos (outros objetos) num processo de clonagem, ou imita&amp;amp;ccedil;&amp;amp;atilde;o (mimic, como &amp;amp;eacute; chamado no Ioke) do comportamento e conhecimento de um objeto j&amp;amp;aacute; existente.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Isso significa que em Ioke, tudo (tudo mesmo) &amp;amp;eacute; um objeto. Existem alguns objetos j&amp;amp;aacute; embutidos na linguagem, que nos  possibilitam imit&amp;amp;aacute;-los para criar nossos pr&amp;amp;oacute;prios objetos. Por exemplo:&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;&amp;lt;code lang="ioke"&amp;gt;myObj = Origin mimic&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;O c&amp;amp;oacute;digo acima cria um objeto chamado myObj que faz mimic (imita) o objeto Origin que &amp;amp;eacute; um dos objetos b&amp;amp;aacute;sicos oferecidos por Ioke.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;h2&amp;gt;Instala&amp;amp;ccedil;&amp;amp;atilde;o&amp;lt;/h2&amp;gt;&#xD;
&amp;lt;p&amp;gt;Para instalar Ioke, voc&amp;amp;ecirc; deve ter o JDK1.5 ou superior instalado em sua m&amp;amp;aacute;quina e baixar o pacote bin&amp;amp;aacute;rio do Ioke neste  &amp;lt;a href="http://www.ioke.org/download.html"&amp;gt;link&amp;lt;/a&amp;gt;. Depois, basta descompactar o arquivo em algum diret&amp;amp;oacute;rio de sua escolha e incluir a vari&amp;amp;aacute;vel de ambiente IOKE_HOME apontando para o diret&amp;amp;oacute;rio de instala&amp;amp;ccedil;&amp;amp;atilde;o do Ioke. Tamb&amp;amp;eacute;m acrescente IOKE_HOME/bin &amp;amp;agrave; vari&amp;amp;aacute;vel de ambiente PATH.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;h2&amp;gt;Hello World&amp;lt;/h2&amp;gt;&#xD;
&amp;lt;p&amp;gt;Como todo com artigo de programa&amp;amp;ccedil;&amp;amp;atilde;o vamos escrever o hello world em Ioke, passando por algumas caracter&amp;amp;iacute;sticas da  linguagem. A seguinte linha imprime a famosa mensagem &amp;amp;quot;Hello World!&amp;amp;quot; na tela:&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;Hello World from Ioke!&amp;amp;quot; println&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;No c&amp;amp;oacute;digo acima, podemos perceber a primeira grande diferen&amp;amp;ccedil;a em rela&amp;amp;ccedil;&amp;amp;atilde;o a outras linguagens. Criamos um objeto que imita Text e ativamos a cell println. Atributos e m&amp;amp;eacute;todos s&amp;amp;atilde;o chamados de cell em Ioke. Cells podem ser adicionadas ou removidas  dinamicamente, permitindo criar objetos &amp;amp;uacute;nicos em seu sistema. A cell println &amp;amp;eacute; definida no objeto Origin e est&amp;amp;aacute; dispon&amp;amp;iacute;vel em nosso Text, simplesmente porque Text imita Origin (&amp;lt;code&amp;gt;Text = Origin mimic&amp;lt;/code&amp;gt;).&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Outra grande diferen&amp;amp;ccedil;a &amp;amp;eacute; que as mensagens para acionar uma cell n&amp;amp;atilde;o possuem pontos. Isso quer dizer que para chamar m&amp;amp;eacute;todos ou acessar atributos n&amp;amp;atilde;o h&amp;amp;aacute; um '.' entre o objeto e a cell (m&amp;amp;eacute;todo ou atributo). Reparem que &amp;lt;code&amp;gt;println&amp;lt;/code&amp;gt;  &amp;amp;eacute; uma cell do objeto &amp;lt;code&amp;gt;&amp;amp;quot;Hello world from Ioke&amp;amp;quot;&amp;lt;/code&amp;gt;, e para acess&amp;amp;aacute;-lo utilizamos apenas um espa&amp;amp;ccedil;o entre o objeto e a  cell. Isso tem por meta, tornar a linguagem mais expressiva.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Vamos experimentar um pouco da dinamicidade do Ioke e entender melhor seu conceito de prot&amp;amp;oacute;tipos. Observe o seguinte c&amp;amp;oacute;digo:&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt;&#xD;
&amp;lt;pre&amp;gt;&#xD;
aObject = Origin mimic&#xD;
aObject aCell = &amp;amp;quot;Hello world in a cell&amp;amp;quot;&#xD;
aObject aCell println&amp;lt;/pre&amp;gt;&#xD;
&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Na linha 1 criamos um objeto chamado aObject e dizemos que este objeto deve ser baseado no objeto Origin do Ioke. Origin  &amp;amp;eacute; um objeto embutido no Ioke, com o objetivo de prover um ponto de in&amp;amp;iacute;cio para a maioria dos objetos. &amp;amp;quot;Foi especialmente criado para ser a origem dos objetos&amp;amp;quot; como dito no &amp;lt;a href="http://ioke.org/wiki/index.php/Guide"&amp;gt;Ioke Guide&amp;lt;/a&amp;gt;. Origin por sua vez, imita Ground (outro objeto) que por sua vez imita Base e DefaultBehavior. Juntos esses objetos definem o  comportamento de um objeto comum em Ioke. &amp;lt;code&amp;gt;mimic&amp;lt;/code&amp;gt; &amp;amp;eacute; uma cell do objeto Base, que retorna uma int&amp;amp;acirc;ncia que cont&amp;amp;eacute;m todas as cells do objeto no qual foi chamado (neste caso, Origin) incluindo as cells dos objetos que Origin imita (Ground, Base e DefaultBehavior).&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Na segunda linha, adicionamos uma cell chamada aCell no objeto aObject. Na verdade, Ioke procura por uma cell com este nome e caso n&amp;amp;atilde;o encontre, esta cell &amp;amp;eacute; criada e adicionada dinamicamente no objeto. Esta cell recebe o valor literal  &amp;lt;code&amp;gt;&amp;amp;quot;Hello World in a cell&amp;amp;quot;&amp;lt;/code&amp;gt;. Acabamos de criar um atributo para nosso objeto. &amp;amp;Eacute; assim que definimos objetos  espec&amp;amp;iacute;ficos no Ioke.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;A terceira e &amp;amp;uacute;ltima linha, obt&amp;amp;eacute;m o valor da cell &amp;lt;code&amp;gt;aCell&amp;lt;/code&amp;gt; do objeto &amp;lt;code&amp;gt;aObject&amp;lt;/code&amp;gt; e chama o m&amp;amp;eacute;todo  &amp;lt;code&amp;gt;println&amp;lt;/code&amp;gt; do valor resultante da chamada &amp;lt;code&amp;gt;aObject aCell&amp;lt;/code&amp;gt;. O valor contido em aCell apesar de ser  literal, tamb&amp;amp;eacute;m &amp;amp;eacute; um objeto que imita Text que por sua vez imita Origin. Isso faz com que a chamada da &amp;amp;uacute;ltima linha seja interpretada como &amp;lt;code&amp;gt;&amp;amp;quot;Hello world in a cell&amp;amp;quot; println&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&#xD;
&amp;lt;p&amp;gt;Como podemos observar, Ioke &amp;amp;eacute; uma linguagem n&amp;amp;atilde;o muito t&amp;amp;iacute;pica, por&amp;amp;eacute;m com grandes promessas em termos de expressividade. Mesmo tendo sido mencionada pela primeira vez em Novembro de 2008 j&amp;amp;aacute; possui duas vers&amp;amp;otilde;es muito capazes que incluem, execu&amp;amp;ccedil;&amp;amp;atilde;o de macros, aspectos, iSpecs (no estilo RSpec do Ruby). H&amp;amp;aacute; ainda muitas outras caracter&amp;amp;iacute;sticas interessantes no Ioke, por&amp;amp;eacute;m isso &amp;amp;eacute; assunto para um outro post.&amp;lt;/p&amp;gt;&lt;img src="http://feeds.feedburner.com/~r/fratech-blog/~4/O551iw632ro" height="1" width="1"/&gt;</content>
    <dc:creator>Felipe Rodrigues</dc:creator>
    <dc:date>2009-01-29T12:20:00Z</dc:date>
  <feedburner:origLink>http://www.fratech.net/comunidade/exibir/44</feedburner:origLink></entry>
  <entry>
    <title>Groovy ou Ruby? Um breve relato.</title>
    <link rel="alternate" href="http://feedproxy.google.com/~r/fratech-blog/~3/gyqJPqzjJ-8/35" />
    <author>
      <name>Felipe Rodrigues de Almeida</name>
    </author>
    <updated>2008-10-03T18:58:00Z</updated>
    <published>2008-10-03T18:58:00Z</published>
    <content type="html">&amp;lt;p align="justify"&amp;gt;Como já é de conhecimento publico, a InfoQ Brasil será lançada no dia 20 de Outubro de 2008 incluindo vários artigos e notícias traduzidos para o protuguês, além do livro &amp;lt;a href="http://www.infoq.com/minibooks/scrum-xp-from-the-trenches"&amp;gt;Scrum e XP direto das trincheiras&amp;lt;/a&amp;gt; também traduzido.&amp;lt;/p&amp;gt;  &amp;lt;p align="justify"&amp;gt;Todos que conhecem o portal InfoQ sabem da qualidade de seu conteúdo e pretendemos manter a mesma qualidade na versão brasileira do portal. Para começar bem, iremos cobrir e publicar as apresentações do &amp;lt;a href="http://site.locaweb.com.br/railssummit/"&amp;gt;Rails Summit 2008&amp;lt;/a&amp;gt; ao longo do próximo ano. Esse evento promete ser um marco na história do Ruby e Rails no Brasil e como tal estarei lá pra conferir. =)&amp;lt;/p&amp;gt;  &amp;lt;p align="justify"&amp;gt;Você devem estar se perguntando o que isso tem a ver com o título do post. =)&amp;lt;/p&amp;gt;  &amp;lt;p align="justify"&amp;gt;Eu explico. Eu pedi pro Floyd Marinescu (co-fundador da InfoQ) uma idéia de quantos posts são publicados por mês na InfoQ original. Ele me respondeu o email dizendo que o máximo que ele podia fazer era conseguir um arquivo CSV com o seguinte conteúdo:&amp;lt;/p&amp;gt;  &amp;lt;p align="justify"&amp;gt; &amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;&amp;lt;font face="Courier New"&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;&amp;lt;font face="Courier New"&amp;gt;Publications.csv&amp;lt;/font&amp;gt;&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;&amp;lt;font face="Courier New"&amp;gt;TYPE;DATE;COMMUNITIES      &amp;lt;br /&amp;gt;Interview;15/06/2008;Java       &amp;lt;br /&amp;gt;Article;28/03/2008;Architecture       &amp;lt;br /&amp;gt;Article;23/05/2008;SOA       &amp;lt;br /&amp;gt;News;12/06/2008;.NET       &amp;lt;br /&amp;gt;News;12/06/2008;.NET       &amp;lt;br /&amp;gt;News;10/06/2008;Java       &amp;lt;br /&amp;gt;... continua ...&amp;lt;/font&amp;gt;&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt; &amp;lt;/p&amp;gt;  &amp;lt;p align="justify"&amp;gt;Obviamente isso não resolvia meu problema. Nesse arquivo temos o tipo de publicação (Interview, Article, News ou Presentation), tem a data em que foi publicado e a comunidade em que foi publicado o artigo. O que eu pensei? Vou escrever um parser para esse arquivo e assim obter os dados que preciso.&amp;lt;/p&amp;gt;  &amp;lt;p align="justify"&amp;gt;O objetivo era conseguir um resultado como esse:&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;&amp;lt;font face="Courier New"&amp;gt;ANO      &amp;lt;br /&amp;gt;A quantidade de materias desse ano foi: &amp;lt;&amp;lt;TOTAL ANO&amp;gt;&amp;gt;       &amp;lt;br /&amp;gt;A media de materias por mes nesse ano foi: &amp;lt;&amp;lt;MEDIA DO ANO&amp;gt;&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;&amp;lt;font face="Courier New"&amp;gt;ANO      &amp;lt;br /&amp;gt;A quantidade de materias desse ano foi: &amp;lt;&amp;lt;TOTAL ANO&amp;gt;&amp;gt;       &amp;lt;br /&amp;gt;A media de materias por mes nesse ano foi: &amp;lt;&amp;lt;MEDIA DO ANO&amp;gt;&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;&amp;lt;font face="Courier New"&amp;gt;O Total de itens é &amp;lt;&amp;lt;TOTAL DE ITENS DO ARQUIVO&amp;gt;&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/p&amp;gt;  &amp;lt;p align="justify"&amp;gt;Decidi que faria esse parser em ruby, abri meu &amp;lt;a href="http://www.e-texteditor.com/"&amp;gt;e-editor&amp;lt;/a&amp;gt; e comecei a digitar o programa. 15 minutos depois percebi que eu estava indo pelo caminho errado e que não conseguiria o reslutado esperado daquela forma. Meus anos de Java me acostumaram errado. Eu comecei a pensar que deveria haver algum modo mais fácil de fazer aquilo. Decidi então escrever em Groovy, linguagem que possuo mais domínio do que Ruby. Em Groovy não tive dificuldades e construi esse código:&amp;lt;/p&amp;gt;  &amp;lt;p align="justify"&amp;gt; &amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;&amp;lt;font face="Courier New"&amp;gt;publications.groovy&amp;lt;/font&amp;gt;&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;&amp;lt;font face="Courier New"&amp;gt;List items = [] &amp;lt;/font&amp;gt;&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;&amp;lt;font face="Courier New"&amp;gt;new File('publications.csv').splitEachLine(';') { line -&amp;gt;      &amp;lt;br /&amp;gt;  items.add(line)       &amp;lt;br /&amp;gt;} &amp;lt;/font&amp;gt;&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;&amp;lt;font face="Courier New"&amp;gt;def range = 2005..2008 &amp;lt;/font&amp;gt;&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;&amp;lt;font face="Courier New"&amp;gt;range.each { year -&amp;gt;      &amp;lt;br /&amp;gt;    println year       &amp;lt;br /&amp;gt;    numItems = items.findAll{it[1] =~ /${year}$/}.size       &amp;lt;br /&amp;gt;    println "A quantidade de materias desse ano foi: ${numItems}" &amp;lt;/font&amp;gt;&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;&amp;lt;font face="Courier New"&amp;gt;    def average = (numItems/12) as BigInteger      &amp;lt;br /&amp;gt;    println "A media de materias por mes nesse ano foi: ${average}"       &amp;lt;br /&amp;gt;    def weekAverage = (average/4) as BigInteger       &amp;lt;br /&amp;gt;    println "A media de materias por semana nesse ano foi: ${weekAverage}\n\n"       &amp;lt;br /&amp;gt;} &amp;lt;/font&amp;gt;&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;&amp;lt;font face="Courier New"&amp;gt;println "Total de itens em todos os anos: ${items.size}\n"&amp;lt;/font&amp;gt;&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;&amp;lt;font face="Courier New"&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;Foi extremamente fácil e não gastei mais do que 15 minutos para concluir esse código. Decidi então que eu iria escrever o mesmo programa em Ruby, tentando seguir os mesmos passos que realizei em Groovy. O resultado saiu em 10 minutos com o seguinte código:&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;&amp;lt;font face="Courier New"&amp;gt;publications.rb&amp;lt;/font&amp;gt;&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;&amp;lt;font face="Courier New"&amp;gt;require 'csv'&amp;lt;/font&amp;gt;&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;&amp;lt;font face="Courier New"&amp;gt;rows = CSV::Reader.parse(File.open('publications.csv'),';')      &amp;lt;br /&amp;gt;@items = rows.to_a &amp;lt;/font&amp;gt;&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;&amp;lt;font face="Courier New"&amp;gt;range = 2005..2008 &amp;lt;/font&amp;gt;&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;&amp;lt;font face="Courier New"&amp;gt;range.each {|year|      &amp;lt;br /&amp;gt;    puts year       &amp;lt;br /&amp;gt;    @thisYearItems = []       &amp;lt;br /&amp;gt;    @items.each {|item|       &amp;lt;br /&amp;gt;        if (item[1] =~ /#{year}$/) != nil       &amp;lt;br /&amp;gt;            @thisYearItems &amp;lt;&amp;lt; item       &amp;lt;br /&amp;gt;        end       &amp;lt;br /&amp;gt;    }       &amp;lt;br /&amp;gt;    numItems = @thisYearItems.size       &amp;lt;br /&amp;gt;    puts "A quantidade de materias desse ano foi: #{numItems}" &amp;lt;/font&amp;gt;&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;&amp;lt;font face="Courier New"&amp;gt;    average = (numItems/12)      &amp;lt;br /&amp;gt;    puts "A media de materias por mes nesse ano foi: #{average}"       &amp;lt;br /&amp;gt;    weekAverage = (average/4)       &amp;lt;br /&amp;gt;    puts "A media de materias por semana nesse ano foi: #{weekAverage}\n\n"       &amp;lt;br /&amp;gt;} &amp;lt;/font&amp;gt;&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;&amp;lt;font face="Courier New"&amp;gt;puts "Total de itens em todos os anos: #{@items.size}\n\n"&amp;lt;/font&amp;gt;&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;Dessa experiência pude observar várias semelhanças entre as duas linguagens e também algumas diferenças. Os pontos que mais me chamaram a atenção foram o seguinte:&amp;lt;/p&amp;gt;  &amp;lt;ol&amp;gt;   &amp;lt;li&amp;gt;Groovy possue mais métodos de conveniência do que Ruby. Esses métodos são projetados para oferecer mais comodidade para o desenvolvedor. Isso fez com que o programa escrito em Groovy utilizasse apenas 23 linhas de código, enquanto o programa em Ruby utiliza 29 linhas. &amp;lt;/li&amp;gt;    &amp;lt;li&amp;gt;Ruby foi mais performático neste caso (rodando ambos como script). &amp;lt;/li&amp;gt;    &amp;lt;li&amp;gt;Ambas são linguagens extremamento flexiveis e poderosas com recursos e facilidades muito boas. Eu não tentei escrever esse programa em Java e nem em C, mas imagino que teriamos pelo menos o dobro de linhas de código. Se alguém se habilitar a fazer essa experiência, eu agradeço.&amp;lt;/li&amp;gt; &amp;lt;/ol&amp;gt;  &amp;lt;p&amp;gt;Analisem os dois exemplos e tirem suas próprias concluões sobre qual delas é mais a sua cara.&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;Isso me deu uma ótima idéia para postar sobre Groovy on Rails e Ruby on Rails. Também pretendo postar sobre meta-programação nestas duas linguagens.'&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;Pra terminar o post vale a pena mostrar o resultado, assim já dá uma idéia de quanto conteúdo teremos na InfoQ Brasil.&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;&amp;lt;font face="Courier New"&amp;gt;2006     &amp;lt;br /&amp;gt;A quantidade de materias desse ano foi: 949      &amp;lt;br /&amp;gt;A media de materias por mes nesse ano foi: 79      &amp;lt;br /&amp;gt;A media de materias por semana nesse ano foi: 19 &amp;lt;/font&amp;gt;&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;&amp;lt;font face="Courier New"&amp;gt;2007     &amp;lt;br /&amp;gt;A quantidade de materias desse ano foi: 1525      &amp;lt;br /&amp;gt;A media de materias por mes nesse ano foi: 127      &amp;lt;br /&amp;gt;A media de materias por semana nesse ano foi: 31 &amp;lt;/font&amp;gt;&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;&amp;lt;font face="Courier New"&amp;gt;2008     &amp;lt;br /&amp;gt;A quantidade de materias desse ano foi: 878      &amp;lt;br /&amp;gt;A media de materias por mes nesse ano foi: 73      &amp;lt;br /&amp;gt;A media de materias por semana nesse ano foi: 18 &amp;lt;/font&amp;gt;&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;&amp;lt;font face="Courier New"&amp;gt;Total de itens em todos os anos: 3352&amp;lt;/font&amp;gt;&amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;Conto com a participação de todos vocês nesse novo e promissor portal brasileiro. =)&amp;lt;/p&amp;gt;&lt;img src="http://feeds.feedburner.com/~r/fratech-blog/~4/gyqJPqzjJ-8" height="1" width="1"/&gt;</content>
    <dc:creator>Felipe Rodrigues de Almeida</dc:creator>
    <dc:date>2008-10-03T18:58:00Z</dc:date>
  <feedburner:origLink>http://www.fratech.net/comunidade/exibir/35</feedburner:origLink></entry>
</feed>
