<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0">
  <channel>
    <title>Ricardo Duarte</title>
    <link>http://ricardoduarte.net/blog</link>
    <description>Site pessoal de Ricardo Duarte</description>
    <pubDate>Wed, 31 Aug 2011 13:56:27 GMT</pubDate>
    <generator>Blogofile</generator>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/BlogDoRicardoDuarte" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="blogdoricardoduarte" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
      <title>Programando em Python no Emacs</title>
      <link>http://ricardoduarte.net/blog/2011/08/31/programando-em-python-no-emacs/</link>
      <pubDate>Wed, 31 Aug 2011 10:51:00 BRT</pubDate>
      <category><![CDATA[python]]></category>
      <category><![CDATA[programação]]></category>
      <guid>http://ricardoduarte.net/blog/2011/08/31/programando-em-python-no-emacs/</guid>
      <description>Programando em Python no Emacs</description>
      <content:encoded><![CDATA[<p>Esse tutorial tem por objetivo mostrar como podemos ser produtivos programando em <a href="http://www.python.org">Python</a> no
<a href="http://www.emacswiki.org/">Emacs</a>. Além disso, o tutorial vai mostrar um pouco do meu ambiente de desenvolvimento e
para quem tiver curiosidade, eu vou deixar alguns links no final para quem quiser se aprofundar no assunto.</p>
<p>Para começar escolha a versão de <strong>Emacs</strong> que mais se adeque ao seu gosto e ao seu sistema operacional, tem até
<a href="http://www.gnu.org/software/emacs/windows/">versão para Windows</a> e depois de tê-lo instalado, faça
<a href="http://www.emacswiki.org/emacs/NovatoNoEmacs#toc2">o tutorial</a> para começar a se acostumar com os conceitos
fundamentais do <strong>Emacs</strong>.</p>
<h3>Configurando o Emacs para uso geral</h3>
<p>Se você estiver usando <strong>Emacs</strong> no Linux, e eu realmente espero que esteja, na instalação foi criada uma pasta oculta
dentro da pasta do seu usuário de nome <strong>.emacs.d</strong>. Para facilitar a configuração, crie dentro dessa pasta uma outra
pasta de nome <strong>plugins</strong>.</p>
<p>Toda a nossa configuração ficará colocada dentro do seguinte arquivo: <strong>/home/&lt;nome_usuario&gt;/.emacs.d/init.el</strong>. Como
já devem ter lido por aí, a grande vantagem de uso do Emacs é a customização, é como brincar de lego para montar a sua
IDE personalizada. Toda a configuração do Emacs é feita em <a href="http://pt.wikipedia.org/wiki/Lisp">LISP</a>, mas não se
preocupe, você não precisa conhecer <strong>LISP</strong> a fundo para entender esse tutorial, a maior parte dos comandos é bem fácil
de entender. Abra esse arquivo no próprio Emacs ou em outro editor de texto de sua preferência. <strong><em>Todos os trechos de
código expostos nesse post devem ser colocados dentro desse arquivo de configuração</em></strong>.</p>
<h4>Passo 1</h4>
<p>Coloque essas linhas abaixo no início do arquivo de configuração.</p>
<div class="pygments_monokai"><pre><span class="p">(</span><span class="nv">add-to-list</span> <span class="ss">&#39;load-path</span> <span class="s">&quot;~/.emacs.d&quot;</span><span class="p">)</span>
<span class="p">(</span><span class="nv">add-to-list</span> <span class="ss">&#39;load-path</span> <span class="s">&quot;~/.emacs.d/plugins&quot;</span><span class="p">)</span>
</pre></div>

<p>Essas linhas acima carregam as pastas onde serão procurados os arquivos com extensão <em>.el</em>, que são os arquivos que
representam extensões e plugins que usaremos durante esse tutorial.</p>
<h4>Passo 2</h4>
<p>Agora, vamos baixar o primeiro plugin da nossa configuração, é o <strong>ido-mode</strong>. Baixe
<a href="http://www.cua.dk/ido.el">esse arquivo</a> e coloque na pasta <strong>~/.emacs.d/plugins</strong>. Depois adicione o seguinte trecho
no arquivo de configuração.</p>
<div class="pygments_monokai"><pre><span class="p">(</span><span class="nb">require</span> <span class="ss">&#39;ido</span><span class="p">)</span>
<span class="p">(</span><span class="nv">ido-mode</span> <span class="no">t</span><span class="p">)</span>
</pre></div>

<p>Esse plugin serve para facilitar a abertura de arquivos dentro do Emacs e também a troca entre os buffers. Como o
Emacs pode ser bastante confuso para os iniciantes esse plugin é mais do que recomendado.</p>
<h4>Passo 3</h4>
<div class="pygments_monokai"><pre><span class="p">(</span><span class="nv">cua-mode</span> <span class="no">t</span><span class="p">)</span>
<span class="p">(</span><span class="k">setq</span> <span class="nv">cua-auto-tabify-rectangles</span> <span class="no">nil</span><span class="p">)</span> <span class="c1">;; Don&#39;t tabify after rectangle commands</span>
<span class="p">(</span><span class="nv">transient-mark-mode</span> <span class="mi">1</span><span class="p">)</span> <span class="c1">;; No region when it is not highlighted</span>
<span class="p">(</span><span class="k">setq</span> <span class="nv">cua-keep-region-after-copy</span> <span class="no">t</span><span class="p">)</span> <span class="c1">;; Standard Windows behaviour</span>

<p><span class="p">(</span><span class="nv">delete-selection-mode</span> <span class="mi">1</span><span class="p">)</span>
</pre></div></p>
<p><strong>cua-mode</strong> vai servir para deixar o Emacs parecido com qualquer outra IDE comum permitindo usar as teclas de atalho
<em>Ctrl + C, Ctrl + V</em> e assim por diante. Só é preciso ter cuidado pois esses atalhos conflitam com alguns outros do
Emacs e por isso somente estão ativos quando algum texto está selecionado.</p>
<p>As demais linhas desse passo são opcionais, chamo a atenção para a linha do <strong>delete-selection-mode</strong>, essa linha faz
com que, toda vez que um texto estiver selecionado, qualquer inserção será inserida no lugar do texto selecionado.</p>
<h4>Passo 4</h4>
<p>[Auto Complete Mode] melhora a funcionalidade de auto-completar do Emacs. A parada é realmente inteligente.
Para instalar:</p>
<div class="pygments_monokai"><pre><span class="nv">$ </span><span class="nb">cd</span> ~/.emacs.d/plugins/
<span class="nv">$ </span>curl http://cx4a.org/pub/auto-complete/auto-complete-1.3.1.tar.bz2 | tar jx
<span class="nv">$ </span><span class="nb">cd </span>auto-complete-1.3.1
<span class="nv">$ </span>make byte-compile
</pre></div>

<p>Para configurar:</p>
<div class="pygments_monokai"><pre><span class="p">(</span><span class="nv">add-to-list</span> <span class="ss">&#39;load-path</span> <span class="s">&quot;~/.emacs.d/plugins/auto-complete-1.3.1/&quot;</span><span class="p">)</span>
<span class="p">(</span><span class="nb">require</span> <span class="ss">&#39;auto-complete-config</span><span class="p">)</span>
<span class="p">(</span><span class="nv">add-to-list</span> <span class="ss">&#39;ac-dictionary-directories</span> <span class="s">&quot;~/.emacs.d/plugins/auto-complete-1.3.1/ac-dict&quot;</span><span class="p">)</span>
<span class="p">(</span><span class="nv">ac-config-default</span><span class="p">)</span>
</pre></div>

<h4>Passo 5</h4>
<p>Instale o <a href="http://code.google.com/p/yasnippet/">YASnippet</a>. Esse cara cria um menu no Emacs onde podemos usar um
sistema de templates semelhante ao TextMate.</p>
<h4>Passo 6</h4>
<div class="pygments_monokai"><pre><span class="p">(</span><span class="nb">require</span> <span class="ss">&#39;uniquify</span><span class="p">)</span>
<span class="p">(</span><span class="k">setq</span> <span class="nv">uniquify-buffer-name-style</span> <span class="ss">&#39;forward</span><span class="p">)</span>
</pre></div>

<p>O último passo dessa customização geral é o uso do <strong>uniquify</strong>, esse modo é extremamente útil quando começamos a
trabalhar com vários arquivos abertos e que alguns tenham nomes iguais.</p>
<h3>Configurando o Emacs para programar com Python</h3>
<p>Antes de entrar no passo-a-passo de como configurar o Emacs para Python é importante avisar algo. Para não deixar a
instalação original de Python no meu Ubuntu ficar poluída com todas as bibliotecas que eu quero instalar, eu instalo
uma ferramenta conhecida como <a href="http://www.virtualenv.org/en/latest/index.html">virtualenv</a>, e para instalação de
pacotes do Python, eu uso uma ferramenta chamada <a href="http://www.pip-installer.org/en/latest/index.html">pip</a>. Basicamente,
<strong>virtualenv</strong> é uma ferramenta para criar ambientes isolados de Python, e <strong>pip</strong> é simplesmente o melhor
gerenciador de pacotes Python que eu conheço.</p>
<p>Para essa configuração eu criei um ambiente de Python isolado com <strong>virtualenv</strong> apenas para servir ao Emacs. Sugiro
que, se estiver seguindo esse tutorial, você faça o mesmo. Vamos continuar com o passo-a-passo.</p>
<h4>Passo 1</h4>
<div class="pygments_monokai"><pre><span class="p">(</span><span class="nv">setq-default</span> <span class="nv">indent-tabs-mode</span> <span class="no">nil</span><span class="p">)</span>  <span class="c1">; use only spaces and no tabs</span>
<span class="p">(</span><span class="k">setq</span> <span class="nv">default-tab-width</span> <span class="mi">4</span><span class="p">)</span>
</pre></div>

<p>Python usa indentação para definição de blocos de código, assim é <strong>extremamente importante</strong> que usemos essas linhas
código para definir o tamanho da indentação e também definir que <strong>sempre</strong> serão usados espaços ao invés de <em>tabs</em>.</p>
<h4>Passo 2</h4>
<p>Agora vamos instalar um pacote essencial para uso de Python no Emacs, o nome desse pacote é
<a href="http://pymacs.progiciels-bpi.ca/index.html">Pymacs</a>. Se estiver usando Linux, vá até o seu terminal e digite os
comandos abaixo:</p>
<ul>
<li>Instalação Pymacs (Parte Emacs)</li>
</ul>
<div class="pygments_monokai"><pre><span class="nv">$ </span>curl -L https://github.com/pinard/Pymacs/tarball/v0.24-beta2 | tar zx
<span class="nv">$ </span><span class="nb">cd </span>pinard-Pymacs-016b0bc
<span class="nv">$ </span>make
<span class="nv">$ </span>cp pymacs.el ~/.emacs.d/pymacs.el
<span class="nv">$ </span>emacs -batch -eval <span class="s1">&#39;(byte-compile-file &quot;~/.emacs.d/pymacs.el&quot;)&#39;</span>
</pre></div>

<ul>
<li>Instalação Pymacs (Parte Python)</li>
</ul>
<div class="pygments_monokai"><pre><span class="nv">$ </span>pip install https://github.com/pinard/Pymacs/tarball/v0.24-beta2
</pre></div>

<p>Agora vamos ao arquivo de configuração no Emacs e incluir o seguinte trecho:</p>
<div class="pygments_monokai"><pre><span class="p">(</span><span class="nv">setenv</span> <span class="s">&quot;PYMACS_PYTHON&quot;</span> <span class="s">&quot;~/&lt;caminho_virtualenv&gt;/bin/python&quot;</span><span class="p">)</span>

<p><span class="p">(</span><span class="nv">autoload</span> <span class="ss">&#39;pymacs-apply</span> <span class="s">&quot;pymacs&quot;</span><span class="p">)</span>
<span class="p">(</span><span class="nv">autoload</span> <span class="ss">&#39;pymacs-call</span> <span class="s">&quot;pymacs&quot;</span><span class="p">)</span>
<span class="p">(</span><span class="nv">autoload</span> <span class="ss">&#39;pymacs-eval</span> <span class="s">&quot;pymacs&quot;</span> <span class="no">nil</span> <span class="no">t</span><span class="p">)</span>
<span class="p">(</span><span class="nv">autoload</span> <span class="ss">&#39;pymacs-exec</span> <span class="s">&quot;pymacs&quot;</span> <span class="no">nil</span> <span class="no">t</span><span class="p">)</span>
<span class="p">(</span><span class="nv">autoload</span> <span class="ss">&#39;pymacs-load</span> <span class="s">&quot;pymacs&quot;</span> <span class="no">nil</span> <span class="no">t</span><span class="p">)</span>
</pre></div></p>
<p>A primeira linha será necessária apenas se você estiver usando o <strong>virtualenv</strong>.</p>
<h4>Passo 3</h4>
<p>Nesse passo, vamos instalar o <a href="http://rope.sourceforge.net/ropemacs.html">Ropemacs</a> e o
<a href="http://rope.sourceforge.net/">Rope</a>. <strong>Rope</strong> é uma poderosa biblioteca de refactoring para Python, e <strong>Ropemacs</strong>
obviamente um plugin do Emacs para uso do <strong>Rope</strong>.</p>
<p>Para instalar o <strong>Rope</strong> e <strong>Ropemacs</strong>, digite no terminal:</p>
<div class="pygments_monokai"><pre><span class="nv">$ </span>pip install http://bitbucket.org/agr/ropemacs/get/tip.tar.gz
</pre></div>

<p>No arquivo de configuração do Emacs:</p>
<div class="pygments_monokai"><pre><span class="p">(</span><span class="nb">require</span> <span class="ss">&#39;pymacs</span><span class="p">)</span>

<p><span class="p">(</span><span class="nv">pymacs-load</span> <span class="s">&quot;ropemacs&quot;</span> <span class="s">&quot;rope-&quot;</span><span class="p">)</span>
<span class="p">(</span><span class="k">setq</span> <span class="nv">ropemacs-enable-autoimport</span> <span class="no">t</span><span class="p">)</span>
</pre></div></p>
<h4>Passo 4</h4>
<p>Chegamos em uma das partes que eu mais gosto do Emacs, análise automática, <em>on-the-fly</em>, do código Python. O
responsável por isso é o <a href="http://flymake.sourceforge.net/">Flymake</a> que já vem por padrão, a partir da versão 23 do
Emacs. O que vamos precisar instalar aqui é o <a href="http://pypi.python.org/pypi/pep8">pep8</a> e o
<a href="http://pypi.python.org/pypi/pyflakes">pyflakes</a> que são bibliotecas para análise estática de código-fonte Python.</p>
<div class="pygments_monokai"><pre><span class="nv">$ </span>pip install pyflakes pep8
</pre></div>

<p>Depois, precisamos configurar o Flymake no Emacs:</p>
<div class="pygments_monokai"><pre><span class="p">(</span><span class="nb">when</span> <span class="p">(</span><span class="nb">load</span> <span class="s">&quot;flymake&quot;</span> <span class="no">t</span><span class="p">)</span>
  <span class="p">(</span><span class="nb">defun</span> <span class="nv">flymake-pyflakes-init</span> <span class="p">()</span>
    <span class="p">(</span><span class="k">let*</span> <span class="p">((</span><span class="nv">temp-file</span> <span class="p">(</span><span class="nv">flymake-init-create-temp-buffer-copy</span>
                       <span class="ss">&#39;flymake-create-temp-inplace</span><span class="p">))</span>
           <span class="p">(</span><span class="nv">local-file</span> <span class="p">(</span><span class="nv">file-relative-name</span>
                        <span class="nv">temp-file</span>
                        <span class="p">(</span><span class="nv">file-name-directory</span> <span class="nv">buffer-file-name</span><span class="p">))))</span>
      <span class="p">(</span><span class="nb">list</span> <span class="s">&quot;/home/lslf/&lt;caminho_virtualenv&gt;/bin/pyflakes&quot;</span> <span class="p">(</span><span class="nb">list</span> <span class="nv">local-file</span><span class="p">))))</span>

<p><span class="p">(</span><span class="nv">add-to-list</span> <span class="ss">&#39;flymake-allowed-file-name-masks</span>
               <span class="o">&#39;</span><span class="p">(</span><span class="s">&quot;\.py\&#39;&quot;</span> <span class="nv">flymake-pyflakes-init</span><span class="p">)))</span></p>
<p><span class="p">(</span><span class="nv">add-hook</span> <span class="ss">&#39;find-file-hook</span> <span class="ss">&#39;flymake-find-file-hook</span><span class="p">)</span></p>
<p><span class="p">(</span><span class="nb">defun</span> <span class="nv">my-flymake-show-help</span> <span class="p">()</span>
  <span class="p">(</span><span class="nb">when</span> <span class="p">(</span><span class="nv">get-char-property</span> <span class="p">(</span><span class="nv">point</span><span class="p">)</span> <span class="ss">&#39;flymake-overlay</span><span class="p">)</span>
   <span class="p">(</span><span class="k">let</span> <span class="p">((</span><span class="nv">help</span> <span class="p">(</span><span class="nv">get-char-property</span> <span class="p">(</span><span class="nv">point</span><span class="p">)</span> <span class="ss">&#39;help-echo</span><span class="p">)))</span>
    <span class="p">(</span><span class="k">if</span> <span class="nv">help</span> <span class="p">(</span><span class="nv">message</span> <span class="s">&quot;%s&quot;</span> <span class="nv">help</span><span class="p">)))))</span></p>
<p><span class="p">(</span><span class="nv">add-hook</span> <span class="ss">&#39;post-command-hook</span> <span class="ss">&#39;my-flymake-show-help</span><span class="p">)</span></p>
<p><span class="p">(</span><span class="nb">delete</span> <span class="o">&#39;</span><span class="p">(</span><span class="s">&quot;\.html?\&#39;&quot;</span> <span class="nv">flymake-xml-init</span><span class="p">)</span> <span class="nv">flymake-allowed-file-name-masks</span><span class="p">)</span>
</pre></div></p>
<h4>Passo 5</h4>
<p>O último passo desse tutorial, também se refere a análise de código, mas ao invés de análise automática, vamos
configurar uma análise de código através de um comando do Emacs.</p>
<p>Primeiro crie um arquivo no caminho <strong>~/.emacs.d/</strong> chamado <strong>pychecker.sh</strong>. O conteúdo do arquivo será:</p>
<div class="pygments_monokai"><pre><span class="c">#!/bin/bash</span>
~/&lt;caminho_virtualenv&gt;/bin/pyflakes <span class="nv">$1</span>
<span class="nb">echo</span> <span class="s2">&quot;## pyflakes acima, pep8 abaixo ##&quot;</span>
~/&lt;caminho_virtualenv&gt;/bin/pep8 --repeat <span class="nv">$1</span>
</pre></div>

<p>Agora a configuração do Emacs:</p>
<div class="pygments_monokai"><pre><span class="p">(</span><span class="nv">custom-set-variables</span>
  <span class="o">&#39;</span><span class="p">(</span><span class="nv">py-pychecker-command</span> <span class="s">&quot;~/.emacs.d/pychecker.sh&quot;</span><span class="p">)</span>
  <span class="o">&#39;</span><span class="p">(</span><span class="nv">py-pychecker-command-args</span> <span class="p">(</span><span class="k">quote</span> <span class="p">(</span><span class="s">&quot;&quot;</span><span class="p">)))</span>
  <span class="o">&#39;</span><span class="p">(</span><span class="nv">python-check-command</span> <span class="s">&quot;~/.emacs.d/pychecker.sh&quot;</span><span class="p">)</span>
<span class="p">)</span>
</pre></div>

<h3>Dicas extras</h3>
<p>Além de tudo o que foi colocado aí acima, você pode querer ir além e melhorar cada vez mais o seu uso do
Emacs, para ficar do seu gosto, aqui vão algumas dicas:</p>
<ul>
<li>O Emacs já funciona automaticamente com Subversion, <a href="http://www.xsteve.at/prg/vc_svn/">basta aprender a usar</a>;</li>
<li>Você pode configurar o Emacs para <a href="https://code.djangoproject.com/wiki/Emacs">te ajudar com o Django</a> também;</li>
<li>Coloque o seu diretório <strong>~/.emacs.d</strong> sob controle de versão;</li>
<li>Explore a infinidade de possibilidades de customização do Emacs.</li>
</ul>
<h3>Conclusão</h3>
<p>Eu sei que esse tutorial ficou bem longo, mas eu tentei colocar todas as principais dicas de otimização de tempo e
produtividade que eu adquiri em pouco tempo usando o Emacs, como eu disse antes, é como brincar de lego para montar
a sua IDE, com as funcionalidades que você precisa.</p>
<p>Deixe as suas impressões nos comentários, se houver algum problema, pode entrar em contato que tentarei ajudar o máximo
que puder.</p>
<h4>Referências</h4>
<p><a href="http://www.enigmacurry.com/2008/05/09/emacs-as-a-powerful-python-ide/">Ryan McGuire: Emacs as a powerful Python IDE</a></p>
<p><a href="http://www.saltycrane.com/blog/2010/05/my-emacs-python-environment/">SaltyCrane: My Emacs Python environment</a></p>
<p><a href="http://hide1713.wordpress.com/2009/01/30/setup-perfect-python-environment-in-emacs/">Lei Chen: Setup Perfect Python Environment In Emacs</a></p>
<p><a href="http://jesselegg.com/archives/2010/02/25/emacs-python-programmers-part-1/">Jesse Legg: Emacs for Python Programmers: Basics</a></p>
<p><a href="http://jesselegg.com/archives/2010/03/14/emacs-python-programmers-2-virtualenv-ipython-daemon-mode/">Jesse Legg: Emacs for Python Programmers #2: Virtualenv, IPython &amp; Daemon Mode</a></p>
<p><a href="http://rhodesmill.org/brandon/2009/emacs-python-virtualenv/">Brandon Rhodes: Installing Python packages for Emacs with virtualenv</a></p>
<p><a href="http://www.clemesha.org/blog/modern-python-hacker-tools-virtualenv-fabric-pip">Alex Clemesha: Tools of modern Python hacker: Virtualenv, Fabric and pip</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Como acessar webservices SOAP com Python</title>
      <link>http://ricardoduarte.net/blog/2010/07/16/como-acessar-webservices-soap-com-python/</link>
      <pubDate>Sat, 17 Jul 2010 00:47:09 BRT</pubDate>
      <category><![CDATA[python]]></category>
      <category><![CDATA[programação]]></category>
      <guid>http://ricardoduarte.net/blog/2010/07/16/como-acessar-webservices-soap-com-python/</guid>
      <description>Como acessar webservices SOAP com Python</description>
      <content:encoded><![CDATA[<p>Na semana passada estava precisando de uma biblioteca <a href="http://www.python.org">Python</a> para realizar acesso a um web
service <a href="http://www.w3schools.com/SOAP/soap_intro.asp">SOAP</a>. Fazendo uma rápida pesquisa encontrei algumas bibliotecas
bem utilizadas, mas todas estavam muito desatualizadas, como a
<a href="http://sourceforge.net/projects/pywebsvcs/files/SOAP.py/">SOAPpy</a> por exemplo, que não é atualizada desde 2005.</p>
<p>Quando já estava quase desistindo de encontrar algo atualizado que atendesse a minha necessidade, eu me deparo com
essa biblioteca de nome <a href="https://fedorahosted.org/suds/">suds</a>. Fiquei positivamente surpreso ao encontrar uma
biblioteca que além de ser atualizada e possuir uma boa documentação, representa toda a simplicidade e praticidade
de <strong>Python</strong>.</p>
<img class="center" title="suds" src="/media/img/post009/sudslogo-medium_ducky.png" alt="suds" />

<p>Como muitos sabem, o protocolo <strong>SOAP</strong> é um protocolo de comunicação complicado, mas usando o <strong>suds</strong> tudo fica 
muito simples. Vejam só.</p>
<p>Para o nosso exemplo, vamos usar um web service que traz informações sobre a Copa do Mundo (eu sei, estou meio 
atrasado, mas vá lá, é só um exemplo). O endereço do serviço é:
<a href="http://footballpool.dataaccess.eu/data/info.wso?WSDL">http://footballpool.dataaccess.eu/data/info.wso?WSDL</a>. Vamos agora usar o <strong>suds</strong> para acessar esse serviço.</p>
<div class="pygments_monokai"><pre><span class="kn">from</span> <span class="nn">suds.client</span> <span class="kn">import</span> <span class="n">Client</span>

<p><span class="n">url</span> <span class="o">=</span> <span class="s">&quot;http://footballpool.dataaccess.eu/data/info.wso?WSDL&quot;</span></p>
<p><span class="n">cliente</span> <span class="o">=</span> <span class="n">Client</span><span class="p">(</span><span class="n">url</span><span class="p">)</span></p>
<p><span class="k">print</span> <span class="n">cliente</span>
</pre></div></p>
<p>Simples assim e temos o cliente que representa o serviço com informações sobre a Copa do Mundo carregado em memória.
A última linha do código acima serve para listar os métodos que esse serviço disponibiliza. O resultado é esse:</p>
<div class="pygments_monokai"><pre>Suds <span class="o">(</span> https://fedorahosted.org/suds/ <span class="o">)</span>  version: 0.3.9 GA  build: R659-20100219

Service <span class="o">(</span> Info <span class="o">)</span> <span class="nv">tns</span><span class="o">=</span><span class="s2">&quot;http://footballpool.dataaccess.eu&quot;</span>
   Prefixes <span class="o">(</span>1<span class="o">)</span>
      <span class="nv">ns0</span> <span class="o">=</span> <span class="s2">&quot;http://footballpool.dataaccess.eu&quot;</span>
   Ports <span class="o">(</span>1<span class="o">)</span>:
      <span class="o">(</span>InfoSoap<span class="o">)</span>
         Methods <span class="o">(</span>41<span class="o">)</span>:
            AllCards<span class="o">()</span>
            AllDefenders<span class="o">(</span>xs:string sCountryName, <span class="o">)</span>
            AllForwards<span class="o">(</span>xs:string sCountryName, <span class="o">)</span>
            AllGames<span class="o">()</span>
            AllGoalKeepers<span class="o">(</span>xs:string sCountryName, <span class="o">)</span>
            AllGroupCompetitors<span class="o">()</span>
            AllMidFields<span class="o">(</span>xs:string sCountryName, <span class="o">)</span>
            AllPlayerNames<span class="o">(</span>xs:boolean bSelected, <span class="o">)</span>
            AllPlayersWithRedCards<span class="o">(</span>xs:boolean bSortedByName, xs:boolean bSortedByRedCards, <span class="o">)</span>
            AllPlayersWithYellowCards<span class="o">(</span>xs:boolean bSortedByName, xs:boolean bSortedByYellowCards, <span class="o">)</span>
            AllPlayersWithYellowOrRedCards<span class="o">(</span>xs:boolean bSortedByName, xs:boolean bSortedByYellowCards, xs:boolean bSortedByRedCards, <span class="o">)</span>
            AllStadiumInfo<span class="o">()</span>
            Cities<span class="o">()</span>
            Coaches<span class="o">()</span>
            CountryNames<span class="o">(</span>xs:boolean bWithCompetitors, <span class="o">)</span>
            DateLastGroupGame<span class="o">()</span>
            DateOfFirstGame<span class="o">()</span>
            DateOfLastGame<span class="o">()</span>
            FullTeamInfo<span class="o">(</span>xs:string sTeamName, <span class="o">)</span>
            GameInfo<span class="o">(</span>xs:int iGameId, <span class="o">)</span>
            GameResultCodes<span class="o">()</span>
            GamesPerCity<span class="o">(</span>xs:string sCityName, <span class="o">)</span>
            GamesPlayed<span class="o">()</span>
            GoalsScored<span class="o">(</span>xs:int iGameId, <span class="o">)</span>
            GroupCompetitors<span class="o">(</span>xs:string sPoule, <span class="o">)</span>
            GroupCount<span class="o">()</span>
            Groups<span class="o">()</span>
            NextGame<span class="o">()</span>
            NumberOfGames<span class="o">()</span>
            PlayedAtWorldCup<span class="o">(</span>xs:string sTeamName, <span class="o">)</span>
            RedCardsTotal<span class="o">()</span>
            StadiumInfo<span class="o">(</span>xs:string sStadiumName, <span class="o">)</span>
            StadiumNames<span class="o">()</span>
            StadiumURL<span class="o">(</span>xs:string sStadiumName, <span class="o">)</span>
            Teams<span class="o">()</span>
            TeamsCompeteList<span class="o">()</span>
            TopGoalScorers<span class="o">(</span>xs:int iTopN, <span class="o">)</span>
            TopSelectedGoalScorers<span class="o">(</span>xs:int iTopN, <span class="o">)</span>
            TournamentInfo<span class="o">()</span>
            YellowAndRedCardsTotal<span class="o">()</span>
            YellowCardsTotal<span class="o">()</span>
         Types <span class="o">(</span>38<span class="o">)</span>:
            ArrayOfString
            ArrayOftCardInfo
            ArrayOftCoaches
            ArrayOftCountryInfo
            ArrayOftCountrySelectedTopScorer
            ArrayOftGameCard
            ArrayOftGameInfo
            ArrayOftGameResultCode
            ArrayOftGoal
            ArrayOftGroupInfo
            ArrayOftGroupsCompetitors
            ArrayOftPlayerNames
            ArrayOftPlayersWithCards
            ArrayOftStadiumInfo
            ArrayOftTeamCompete
            ArrayOftTeamInfo
            ArrayOftTopGoalScorer
            ArrayOftTopSelectedGoalScorer
            tCardInfo
            tCards
            tCoaches
            tCountryInfo
            tCountrySelectedTopScorer
            tFullTeamInfo
            tGameCard
            tGameInfo
            tGameResultCode
            tGoal
            tGroupInfo
            tGroupsCompetitors
            tPlayerNames
            tPlayersWithCards
            tStadiumInfo
            tTeamCompete
            tTeamInfo
            tTopGoalScorer
            tTopSelectedGoalScorer
            tTournamentInfo
</pre></div>

<p>Como podem perceber, esse serviço tem 41 métodos que eu posso acionar para obter informações sobre a Copa do Mundo.
Vamos ver como eu posso usar esses métodos.</p>
<div class="pygments_monokai"><pre><span class="n">resultado</span> <span class="o">=</span> <span class="n">cliente</span><span class="o">.</span><span class="n">service</span><span class="o">.</span><span class="n">RedCardsTotal</span><span class="p">()</span>
<span class="k">print</span> <span class="n">resultado</span>
</pre></div>

<p>O resultado impresso pelo trecho acima é: <strong>17</strong>.</p>
<p>Vamos todos dar um viva à simplicidade do Python! :o)</p>]]></content:encoded>
    </item>
    <item>
      <title>Python e eu na revista TI Digital</title>
      <link>http://ricardoduarte.net/blog/2010/05/13/python-e-eu-na-revista-ti-digital/</link>
      <pubDate>Thu, 13 May 2010 20:33:37 BRT</pubDate>
      <category><![CDATA[python]]></category>
      <guid>http://ricardoduarte.net/blog/2010/05/13/python-e-eu-na-revista-ti-digital/</guid>
      <description>Python e eu na revista TI Digital</description>
      <content:encoded><![CDATA[<img class="center" title="TI Digital - Março 2010" src="/media/img/post008/ti_digital_marco_2010.jpg" alt="TI Digital - Março 2010" />

<p>A revista <a href="http://www.revistatidigital.com.br">TI Digital</a> do mês março vem com uma matéria de capa com 14 páginas
sobre a minha linguagem de programação favorita, <a href="ttp://www.python.org">Python</a>. E por pura coincidência eu fui um dos
convidados a responder algumas perguntas para compor a matéria.</p>
<p>Eu não conhecia a revista antes disso, mas o contato com eles foi sempre muito cordial e a matéria ficou bem bacana,
servindo como uma excelente divulgação para a linguagem. Aproveito esse post para colocar aqui as perguntas que a
revista me fez e as minhas respostas na íntegra.</p>
<p><strong>Quais foram suas primeiras impressões quando começou a programar em Python? Qual era a linguagem de programação que
você utilizava antes?</strong></p>
<p>Eu comecei a utilizar Python em 2005, quando ainda trabalhava no <a href="http://www.serpro.gov.br">SERPRO</a>. Nessa época eu
fui integrado a uma equipe que desenvolvia um sistema para o Ministério da Educação e esse sistema era inteiramente
feito em Python. Uma das coisas que mais me impressionou em Python foi o ganho de produtividade em um curto espaço de
tempo. Eu não tinha experiência anterior com a linguagem e em apenas 2 dias eu já estava participando ativamente no
desenvolvimento de alguns módulos desse sistema.</p>
<p>Anteriormente, eu já havia programado com Java, C#, Visual Basic e ASP e ainda assim, Python também me impressionou
bastante pela legibilidade do código-fonte. Quando somos desenvolvedores de software, nós passamos mais tempo lendo
código do que propriamente escrevendo, e em Python sempre foi muito fácil entender o código que foi escrito por outro
desenvolvedor.</p>
<p><strong>Onde se pode programar Python?</strong></p>
<p>Python pode ser programado em qualquer sistema operacional moderno e até mesmo nos sistemas mais antigos. Em diversas
distribuições Linux, como Ubuntu, Fedora, Suse entre outras, o Python já vem instalado nativamente, o mesmo acontece
também para o Mac OS X. No caso da plataforma Windows, existem instaladores que podem ser usados para facilmente
instalar o Python. Posso destacar que é de longe a linguagem mais portável com que eu trabalhei, e você nem mesmo
precisa alterar o código-fonte da sua aplicação para que ela funcione em sistemas operacionais diferentes, isso eu
já pude comprovar na prática.</p>
<p><strong>O que é possível desenvolver com o Python?</strong></p>
<p>Python é uma linguagem de programação flexível. Por ser uma linguagem dinâmica e multi-paradigma, Python é ideal para
desenvolver desde pequenos scripts para automatização de determinadas tarefas, passando por sistemas web,
cliente-servidor, desktop e até mesmo sistemas científicos. Basta dizer que
<a href="http://www.python.org/about/success/usa/">a NASA usa Python</a>, para comprovar o que estou dizendo.</p>
<p><strong>Por que o Python possui duas versões disponíveis para download (Python 2.6.4 and Python 3.1.1)?</strong></p>
<p>Python é uma linguagem um tanto quanto antiga, foi lançada em 1991, e desde a sua criação tem como premissas ser uma
linguagem simples, que cabe no nosso cérebro e que procura sempre remover os obstáculos da frente do desenvolvedor
para que o mesmo possa se preocupar mais com o conteúdo do que está sendo desenvolvido do que com a linguagem. No
entanto, assim como acontece com qualquer linguagem de programação, mesmo Python tendo adotado essas premissas para o
seu desenvolvimento, ela foi acumulando alguns "probleminhas" chatos. Para resolver esses problemas e manter uma
linguagem simples e que cabe no nosso cérebro, o criador da linguagem resolveu criar a versão 3 de Python quebrando a
compatibilidade com a versão anterior (Python 2).</p>
<p>Sendo assim, para manter a compatibilidade com os sistemas antigos criados em Python, foi lançada a versão 2.6 que
contém ainda algumas funcionalidades novas da versão 3. E a versão 3, pôde então ser lançada com as novas
funcionalidades previstas e sem o compromisso de manter a compatibilidade com as versões anteriores. Com o
lançamento dessa nova versão, foi criada também uma ferramenta batizada 2to3 que auxilia na migração de código-fonte
criado em Python 2 para Python 3.</p>
<p><strong>O Python pode ser integrado a outras linguagens de programação e ferramentas. Quais são as principais? O que estas
integrações oferecem?</strong></p>
<p>As principais integrações de Python são justamente com as plataformas de desenvolvimento que mais fazem sucesso no
mercado hoje. Python possui integração com a plataforma Java através de um projeto chamado
<a href="http://www.jython.org/">Jython</a> que está em constante evolução e oferece acesso total as classes Java e permite que
código Python seja compilado em classes Java.</p>
<p>Existe também a integração com a plataforma .NET através do projeto <a href="http://www.codeplex.com/IronPython">IronPython</a>,
sendo esse também um projeto bastante evoluído que conta com um console interativo para experimentar trechos de código
e conta também com uma IDE específica baseada no Visual Studio da Microsoft. Essa integração permite que você tenha
acesso às bibliotecas do .NET Framework usando o Python, ao invés de uma das linguagens da plataforma .NET . Com essa
integração nós podemos, por exemplo, criar uma aplicação desktop com a biblioteca .NET padrão (WPF) usando código
Python na solução.</p>
<p>Outra integração que ainda está em fase beta, mas que promete ser bem interessante é o
<a href="http://pyobjc.sourceforge.net/">PyObjC</a> que é uma integração entre Python e Objective-C, a linguagem utilizada para
desenvolver aplicativos para iPhone, iPod Touch e para o recém-lançado iPad. Acho que não preciso nem comentar
muito quais serão as vantagens dessa integração né?</p>
<p><strong>Existem alguns fatores tecnológicos q o Python precisa evoluir. Então, o que você sente falta no Python? O que
gostaria que fosse diferente na linguagem?</strong></p>
<p>Python possui um conceito muito interessante chamado de "batteries included", o que significa que a biblioteca padrão
do Python é muito poderosa, de modo que lhe oferece funcionalidades para diversos tipos de necessidades que venham a
surgir para a sua aplicação. Mas mesmo assim, ainda sinto falta em Python de uma biblioteca nativa que seja capaz de
lidar com web services por exemplo, existem alguns projetos interessantes nesse sentido, mas acredito que a biblioteca
padrão pudesse incorporar essa funcionalidade.</p>
<p>Usar concorrência em Python também ainda é bem rudimentar, e acredito que a linguagem possa evoluir MUITO nesse ponto,
não somente na questão de performance que se torna sofrível em alguns casos que você precise lidar com concorrência,
como a própria módulo python para esse fim, threading, poderia incluir mais funcionalidades para facilitar a vida de
quem precisa programar usando concorrência.</p>
<p>Na parte de orientação a objetos, eu gostaria que Python tivesse uma melhor implementação de encapsulamento, não
somente por necessidade minha, mas também para poder "agradar" aos desenvolvedores que tem uma grande experiência
com OO e acabam não se acostumando muito bem com o encapsulamento de Python que é bem diferente de Java e .Net, por
exemplo.</p>
<p><strong>A comunidade Python ainda não é muito conhecida. Qual a melhor maneira de fazer com que o Python seja mais explorado?
O que ainda falta para convencer os programadores sobre o poder do Python?</strong></p>
<p>Outro dia ouvi um colega de trabalho dizer que Python é uma linguagem que deu certo em outros países, mas não
funcionou no Brasil. Concordo que isso já pode ter sido verdade algum dia, mas hoje estamos experimentando uma
realidade diferente. Muitas empresas no país tem adotado Python para projetos importantes, e acredito que para fazer
com que o Python seja mais explorado é importante mostrar que a cena está mudando. É necessário investir em um
marketing positivo, ou seja, ao invés de criticar duramente as linguagens que hoje dominam o mercado, precisamos
exaltar as características do Python, convencer as pessoas, especialmente aquelas que hoje estão em posição de
decisão, de que Python é uma alternativa viável, estável, mais rápida e mais barata do que a maioria das opções que
existem hoje.</p>
<p>Convencer os programadores, eu acredito ser a parte mais fácil do processo, mas precisamos de mais eventos técnicos
focados em Python para mostrar todas as possibilidades que o Python oferece. Usar um veículo de comunicação como a
revista TI Digital com uma matéria de capa sobre Python já mostra que o cenário está mudando rapidamente e
favoravelmente à linguagem, isso também ajuda a mostrar para os desenvolvedores que existem alternativas.</p>
<p><strong>A comunidade brasileira tem ajudado de alguma forma para o crescimento e atualização da linguagem?</strong></p>
<p>A comunidade brasileira de Python é fantástica. Hoje nós temos a
<a href="http://associacao.python.org.br/">Associação Python Brasil</a> que promove anualmente uma
<a href="http://www.pythonbrasil.org.br/">conferência de Python</a> que cada vez mais tem crescido em qualidade e audiência. E
sem contar que temos diversos grupos locais espalhados pelo país, entre eles posso destacar o
<a href="http://pythonrio.org/">PythonRio</a> que promove alguns eventos importantes sobre Python durante o ano. Um desses
eventos promovidos que merece destaque é o <a href="http://pythoncampus.org/">PythonCampus</a> que é uma espécie de caravana de
tecnologia que visa integrar os estudantes de diversas universidades do estado com o mercado e com a tecnologia em si.</p>]]></content:encoded>
    </item>
    <item>
      <title>Parem de falar mal das linguagens de programação</title>
      <link>http://ricardoduarte.net/blog/2010/02/24/parem-de-falar-mal-das-linguagens-de-programacao/</link>
      <pubDate>Wed, 24 Feb 2010 16:17:19 BRT</pubDate>
      <category><![CDATA[programação]]></category>
      <guid>http://ricardoduarte.net/blog/2010/02/24/parem-de-falar-mal-das-linguagens-de-programacao/</guid>
      <description>Parem de falar mal das linguagens de programação</description>
      <content:encoded><![CDATA[<img class="center" title="Discussão entre programadores" src="/media/img/post007/discussao_programadores.jpg" alt="Discussão entre programadores" />

<p>Se tem algo que tem me deixado cansado ultimamente são as discussões sobre linguagens de programação. Mas as
discussões que me deixam cansado não são aquelas discussões construtivas onde linguagens de programação são comparadas
para percebermos quais são os pontos fortes e fracos de cada uma. O que tem me incomodado e muito são aquelas
discussões juvenis que começam com frases do tipo "a minha linguagem é melhor do que a sua", "a linguagem que você
usa vai morrer" e seguem com argumentos fracos e geralmente baseados em suposições infundadas, ou seja, a discussão
pelo simples prazer de discutir e não de melhorar algo ou alguém.</p>
<p>Um exemplo, fiz uma pesquisa no <a href="http://www.google.com">Google</a> colocando a frase <em>"java is dead"</em> e a pesquisa
retornou <strong>157.000</strong> resultados, boa parte desses são posts em blogs ou artigos em sites de tecnologia estão
decretando o fim do <a href="http://www.java.com">Java</a>. Ora bolas, ou estão fazendo isso para atrair visitantes para seus
blogs/sites ou são pessimistas de plantão que querem decretar o fim do <strong>Java</strong> a qualquer custo. Não que eu seja um
fã de <strong>Java</strong> (está longe disso), mas posso citar aqui N argumentos rapidamente que comprovam que a linguagem não
vai morrer tão cedo.</p>
<p>Sendo assim, eu resolvi escrever esse post para fazer um apelo: se a sua crítica sobre qualquer linguagem de
programação não for construtiva, guarde-a para você ou fale somente para os seus amiguinhos que acham o máximo
ouvir os seus argumentos vazios que não levam a lugar nenhum. Vou aproveitar e pedir um outro favor: se estiver no
meio de qualquer discussão vazia sobre linguagens de programação, por favor, não alimente-a, seja pessoalmente, em
fóruns, em blogs ou em qualquer outro meio de comunicação.</p>
<p>Ao invés de falar mal da linguagem de programação do vizinho, economize esse esforço e empregue-o em aprender uma
nova linguagem de programação que você goste, ou em melhorar algum aspecto ou promover a sua linguagem de programação
preferida. Acredito que assim estaremos contribuindo para uma comunidade tecnológica melhor.</p>]]></content:encoded>
    </item>
    <item>
      <title>Software corporativo, estamos fazendo errado</title>
      <link>http://ricardoduarte.net/blog/2010/01/08/software-corporativo-estamos-fazendo-errado/</link>
      <pubDate>Fri, 08 Jan 2010 11:15:19 BRST</pubDate>
      <category><![CDATA[programação]]></category>
      <guid>http://ricardoduarte.net/blog/2010/01/08/software-corporativo-estamos-fazendo-errado/</guid>
      <description>Software corporativo, estamos fazendo errado</description>
      <content:encoded><![CDATA[<p><img class="center" title="Triciclo" src="/media/img/post006/triciclo.jpg" alt="Triciclo" />
Eu trabalho numa <a href="http://www.petrobras.com.br">grande empresa</a> do país. Apesar de não ser uma empresa de software, a
área de TI é enorme e devemos ter pelo menos umas <em>6 mil</em> aplicações desenvolvidas (sem exagero!) ao longo do
tempo para atender às demandas da empresa, não estou contando aqui as aplicações que foram compradas, apenas as
desenvolvidas mesmo. A fila de espera de aplicações a serem desenvolvidas é enorme, e depois de conviver nesse
ambiente por quase 5 anos, eu posso afirmar categoricamente: estamos fazendo a coisa errada, estamos desenvolvendo
software de um jeito completamente equivocado.</p>
<h3>Errado, por quê?</h3>
<p>Primeiro, preciso deixar claro que isso não é exclusividade da empresa onde trabalho, mas pelo que eu tenho
conversado com outras pessoas e tenho lido por aí, a maioria absoluta das empresas no Brasil ou no mundo estão
fazendo software do jeito errado.</p>
<p>Uma coisa que comprova isso é o <a href="http://www.pmhut.com/the-chaos-report-2009-on-it-project-failure">Chaos Report</a>,
um relatório lançado a cada 2 anos com dados estatísticos sobre como anda o desenvolvimento de software nas empresas
ao redor do mundo. Vamos dar uma olhada no gráfico relativo a 2009.</p>
<img class="center" title="2009 Chaos Report" src="/media/img/post006/2009-chaos-report.jpg" alt="Chaos Report 2009" />

<p>Apenas <strong>32%</strong> dos projetos são bem sucedidos, no passado a situação era bem pior, em <strong>1994</strong> apenas <strong>16%</strong> dos
projetos eram bem sucedidos. Mas ainda assim, eu considero esses números alarmantes. Com toda a dita "maturidade"
em desenvolvimento que adquirimos nos últimos anos, com todas as metodologias, processos, certificações e toda a
evolução da indústria de software para isso? Sem contar o fato que eu acho que esses números são extremamente
otimistas em relação à realidade que eu observo.</p>
<p><a href="http://www.tbray.org/ongoing/misc/Tim">Tim Bray</a>, empregado da <a href="http://www.oracle.com/index.html">Oracle</a>, escreveu
<a href="http://www.tbray.org/ongoing/When/201x/2010/01/02/Doing-It-Wrong">um artigo</a> sobre isso e não poderia ter colocado o
problema de forma melhor:</p>
<blockquote>
<p>The community of developers whose work you see on the Web, who probably don’t know what ADO or UML or JPA even
stand for, deploy <em>better systems</em> at <em>less cost</em> in <em>less  time</em> at <em>lower risk</em> than we see in the Enterprise.</p>
</blockquote>
<p>Quem conhece pelo menos um pouco das comunidades de software livre ou das empresas da era web 2.0 sabe que isso é
uma tremenda verdade. Os desenvolvedores dessas comunidades, em geral, produzem sistemas melhores, mais baratos,
em menos tempo e com um custo menor do que a maioria absoluta das grandes empresas que conhecemos atualmente. <strong>Tim
Bray</strong> vai ainda mais fundo na sua crítica:</p>
<blockquote>
<p>This is unacceptable. The Fortune 1,000 are bleeding money and missing huge opportunities to excel and compete.
I’m not going to say that these are low-hanging fruit,  because if it were easy to bridge this gap, it’d have been
bridged.  But the gap is so big, the rewards are so huge, that it’s time for some serious bridge-building investment.</p>
</blockquote>
<p>O que precisamos nos perguntar nesse momento é: por que as coisas estão tão erradas assim com o desenvolvimento de
software no meio corporativo? Por que as empresas que possuem todo o capital, todo o "suporte" dos grandes
fornecedores não conseguem atingir a excelência no desenvolvimento de software? O momento não é apenas de fazer
perguntas, mas sim de buscar as respostas.</p>
<h3>Onde está a solução?</h3>
<p>Uma das sugestões do Tim Bray, e que deveria ser óbvio pois é um conselho antigo da engenharia de software, é <strong>comprar
sistemas ao invés de construí-los, sempre que isso for possível</strong>, mas isso
<a href="http://www.infoworld.com/d/applications/build-or-buy-it-applications-676">ainda é uma controvérsia</a>. E muitas vezes
a coisa realmente é mais complexa do que imaginamos. Se um software atende a 70% das suas necessidades, o que será
melhor, construir um para atender completamente ou solicitar ao fornecedor uma customização? Qual a melhor opção para
futuras manutenções nesse software? Isso nem sempre é uma pergunta fácil de responder.</p>
<p>Mas ainda assim. Eu tenho algumas outras sugestões que podem nos ajudar a suceder mais no que tange ao software que
desenvolvemos, ou pelo menos, poderemos falhar menos, por assim dizer.</p>
<p>*<em>1) Evite desenvolver sistemas repetidos.</em>0 Falando pela experiência que eu tenho aqui na empresa, acho que temos
pelo menos uns 12 sistemas desenvolvidos com o objetivo de reservar salas de reuniões, sim, isso mesmo, reuniões
são abundantes no meio corporativo. Mas por que raios eu preciso de 12 sistemas distintos que fazem a mesma coisa,
talvez com customizações mínimas aqui ou ali, mas se fazem a mesma coisa é totalmente factível que esses 12 sistemas
sejam reduzidos para 1 somente. Esse é apenas um exemplo, entre tantos outros que eu já vi.</p>
<p><strong>2) Fuja das certificações.</strong> A não ser que exista uma razão extremamente primordial, pela qual a sua empresa precise
de certificações, fuja extremamente delas. Elas vão engessar o seu trabalho, vão proliferar as políticas e padrões
dentro da sua empresa, e é quase certo que elas farão a sua empresa gastar desnecessariamente, muito mais dinheiro do
que deveria. Então, se aparecer algum consultor mirabolante, falando que a sua empresa de TI ou o seu setor de TI
precisa de uma certificação CMMI, ISO 9000 ou qualquer outra, fuja completamente!</p>
<p><strong>3) Esqueça a analogia de fábrica de software.</strong> Comparar a construção de um software, um produto abstrato com
qualquer outro produto industrial tangível em que você consegue automatizar ou criar uma linha de montagem é a pior
comparação possível nos tempos de hoje. Tratar o seu desenvolvedor como o trabalhador de uma fábrica é pior ainda,
isso vai apenas desmotivá-lo e fazer com que o trabalho dele fique cada vez mais burocrático e mais lento.</p>
<p><strong>4) Responda rapidamente à mudanças.</strong> A natureza do software é ser um produto volátil, os requisitos do software são
volatéis, mudam muito rápido. Não tem como mudar isso. O cenário de tecnologia muda muito rápido, as coisas avançam
numa velocidade incrível. Aceitar isso e moldar o seu setor de TI ou a sua empresa para responder a essas
mudanças é a melhor coisa a se fazer. A não ser que você queira se fechar no seu mundinho pequeno e começar a se
debater quando os seus projetos começarem a fracassar.</p>
<p><strong>5) Olhe com atenção e, se possível, copie os bons exemplos das comunidades de software livre e das empresas web.</strong>
Será que o <a href="http://www.google.com/corporate/">Google</a> se preocupa em usar UML nos seus projetos? Consegue imaginar o
<a href="http://www.twitter.com">Twitter</a> sendo feito através de um processo em cascata? Existem vários e vários exemplos de
sistemas de grande sucesso nessas comunidades, e geralmente essas empresas conseguem a excelência no desenvolvimento
de software. É claro que, num ambiente corporativo, muitas vezes você não conseguirá o nível de liberdade que essas
empresas ou comunidades conseguem, mas ainda assim, conseguimos aproveitar alguma metodologia, alguma ferramenta,
ou alguma outra forma de organização que lhe permita ter mais agilidade, mais responsividade para o produto que
entregamos para nossos clientes.</p>
<p><em>Tim Bray</em>, no final do seu artigo até propõe um experimento interessante. Tente imaginar na sua empresa que você
vai solicitar à sua área de desenvolvimento de software que eles desenvolvam uma ferramenta semelhante ao
<a href="http://www.twitter.com">Twitter</a>, ou ao <a href="http://basecamphq.com/">Basecamp</a>, ou ao <a href="http://www.youtube.com/">YouTube</a>
com todas as formalidades e processos que a sua empresa prega. Provavelmente chegará à conclusão que não será possível
fazer, seria um tremendo fracasso.</p>
<h3>Conclusão</h3>
<p>A situação no mundo do software corporativo é alarmante. É como aquele paciente que está no CTI respirando por
aparelhos, porém existe a perspectiva de melhoras. E cada um de nós, que faz parte desse ambiente, pode fazer algo
para mudar, ou pelo menos tentar mudar. Mesmo que não tenhamos poder de decisão, podemos tentar convencer as pessoas
que tem para que possamos promover melhorias significativas nesse quadro caótico.</p>]]></content:encoded>
    </item>
    <item>
      <title>Minha vida como gamer</title>
      <link>http://ricardoduarte.net/blog/2009/12/01/minha-vida-como-gamer/</link>
      <pubDate>Tue, 01 Dec 2009 21:12:07 BRST</pubDate>
      <category><![CDATA[pessoal]]></category>
      <guid>http://ricardoduarte.net/blog/2009/12/01/minha-vida-como-gamer/</guid>
      <description>Minha vida como gamer</description>
      <content:encoded><![CDATA[<p>Quem me conhece sabe que sou um fã de videogames. Aliás, ter escolhido a carreira de programação muito tem a ver com
o meu gosto pelos games, pois foi a curiosidade de saber como esses jogos eram feitos que me fez mergulhar no mundo
dos computadores e do desenvolvimento de software.</p>
<p>Hoje eu trabalho com programação, mas não de jogos, e ainda tento entender como muita coisa funciona no mundo dos
games. Portanto, este post serve para contar um pouco da minha história como um gamer inveterado.</p>
<h3>Primeiro Videogame</h3>
<img class="center" title="Atari 2600" src="/media/img/post005/atari-26001.jpg" alt="Atari 2600" />

<p>Meu primeiro videogame foi um <strong>Atari 2600</strong>, lembro com grande saudosismo de tardes e mais tardes que gastei com meus
primos jogando clássicos como <em>River Raid, Enduro, Pitfall</em> e muitos outros jogos de uma época em que tínhamos
gráficos pobres e criatividade rica. Eram grandes disputas e grandes discussões para saber quem era o melhor e
conseguir chegar ao "final" de jogos que muitas vezes nem tinham fim.</p>
<p>Lembro-me bem quando ia com meu pai ou minha mãe na <strong>Casa e Vídeo</strong> e ficava babando em cima da sessão de jogos
quase implorando que meus pais comprassem ao menos um jogo para mim. Eu era feliz sem pirataria e não me dava
conta :-) Outra forma de conseguir jogos naquele tempo era pegar emprestado com seus colegas ou parentes.</p>
<p>Hoje, de vez em quando, baixo alguns emuladores de Atari no computador apenas para relembrar essa época saudosa e
os jogos que marcaram a minha introdução ao mundo dos games na infância.</p>
<h3>Segundo Videogame</h3>
<img class="center" title="Turbo Game" src="/media/img/post005/turbo_game.jpg" alt="Turbo Game" />

<p>O <strong>Turbo Game</strong> era um clone do <em>Nintendinho 8 bits (NES)</em> fabricado pela <strong>CCE</strong> aqui no Brasil. A grande vantagem
desse brinquedinho é que ele rodava os jogos japoneses e americanos, que vinham com chips de tamanhos diferentes.
Outro videogame famoso nessa época era o <strong>Phantom System</strong> que tinha quase as mesmas características
do <strong>Turbo Game</strong>.</p>
<p>Nessa época eu já tinha amigos na escola e começava a trocar jogos com eles, ou pegar emprestado. Nesse tempo,
começaram a surgir também as locadoras de games que era a salvação para quem tinha pouca grana para comprar os jogos.</p>
<p>Alguns jogos que marcaram essa época foram <em>Super Mario Bros 3, Double Dragon, 1942, Bomberman, Contra, o grande
e dificílimo Battletoads, Skate Or Die</em> e outros tantos que eu nem consigo mencionar agora.</p>
<h3>E chega a era de 16 bits</h3>
<img class="center" title="Super Nintendo" src="/media/img/post005/super_nintendo_entertainment_system.jpg" alt="Super Nintendo" />

<p>É impressionante como a <strong>Nintendo</strong> dominou por MUITO tempo o mercado de games, que posteriormente teria o seu posto
de primeiro lugar tomado pela <strong>Sony</strong>. Mas o <strong>Super Nintendo</strong> foi o console de videogame que eu mais joguei.
Nessa época eu já estava no Segundo Grau (hoje Ensino Médio) e ainda mantinha o hábito saudável de trocar e alugar
jogos para videogame. O controle do <strong>Super Nintendo</strong> era extremamente suave e fácil de ser utilizado, além de ter
introduzido os botões L1 e R1 que melhoraram a jogabilidade significativamente.</p>
<p>Além disso, o Super Nintendo foi o primeiro console que tornou possível trazer franquias famosas das máquinas de
fliperama para o nosso videogame doméstico. Jogos como <em>Street Fighter II, Final Fight e Mortal Kombat</em> apareceram no
console e fizeram a alegria de vários gamers que como eu gastavam o seu suado dinheiro da mesada em fliperamas no
bairro.</p>
<p>Um jogo que eu joguei demais nesse console foi <em>Superstar Soccer</em>. Lembro de disputas memoráveis com colegas de
escola nesse jogo e lembro que poucos conseguiam jogar de igual para igual comigo nesse game. Começava nessa mesma
época a surgir também os campeonatos de futebol no videogame e foi bem legal participar com os colegas nessa
modalidade de jogo.</p>
<h3>Jogando no PC</h3>
<img class="center" title="Alienware" src="/media/img/post005/alienware6.jpg" alt="Alienware" />

<p>Depois de possuir um <strong>Super Nintendo</strong>, eu parei de jogar em consoles por um bom tempo e me dediquei a jogar apenas
no PC. Foi então que conheci os RPG's e jogos de estratégia em tempo real que fizeram a minha alegria durante um
bom tempo. O primeiro <em>Resident Evil</em> joguei no PC, jogos de corrida também eram bem legais de jogar no PC. Mas chegou
um certo tempo que era muito chato ter de ficar instalando e desinstalando jogos no PC, formatar o
PC MUITAS VEZES por causa dos jogos e então, como eu já tinha começado a trabalhar, resolvi voltar para os consoles.
Isso nos leva a próxima fase da minha vida nos games.</p>
<h3>Enfim, um Playstation 2</h3>
<img class="center" title="Playstation 2" src="/media/img/post005/ps2.jpg" alt="Playstation 2" />

<p>Comprei meu <strong>Playstation 2</strong> quando quase todo mundo tinha um. Encomendei o meu pela Internet e fiquei numa angústia
danada porque a loja não era muito conhecida e na época os Correios estavam em greve. O meu <strong>PS2</strong> era desbloqueado
e sim, nessa época eu virei um gamer pirata, todo mundo fazia isso, mas hoje eu não tenho muito orgulho disso na
verdade. Não joguei tantos jogos assim no PS2, mas pude finalmente voltar a jogar o bom e velho futebol com a
série <em>Winning Eleven</em> (e suas muitas modificações) e conheci um jogo que considero hoje uma das maiores
obras-primas da história dos videogames, <em>Metal Gear Solid 3</em>. Revolucionário, inovador, fenomenal, esse jogo
conseguiu me prender por um bom tempo na plataforma, e por fim, um dos últimos jogos que me prenderam
no <strong>PS2</strong> foi <em>Final Fantasy XII</em>, nunca tinha jogado nenhum jogo da série, mas gostei desse e fiquei entretido com
ele durante um bom tempo.</p>
<h3>Chegamos na era atual</h3>
<img class="center" title="Playstation 3" src="/media/img/post005/ps3.jpg" alt="Playstation 3" />

<p>Atualmente sou um homem casado, aliás <a href="http://twitter.com/vivian_duarte">MUITO bem casado</a>, e possuo basicamente
2 fontes de entretenimento com jogos em casa. Um <strong>iPod Touch</strong> e depois de negociar com a minha esposa (obrigado
amor!), tenho hoje um <strong>PS3</strong>, e um dos primeiros jogos que fiz questão de ter no PS3 foi <em>Metal Gear Solid 4</em> e
depois adquiri <em>Fifa 10</em>, pois agora <em>Fifa</em> superou a série <em>Winning Eleven/PES</em> como melhor franquia de futebol do
mundo dos games. Não sou mais um gamer pirata e sou feliz assim.</p>
<p>Bom, é isso. Fiz esse post mais para guardar como uma memória da minha jornada através de vários consoles até chegar
ao ponto em que estamos hoje. Tive a oportunidade de jogar diversos consoles e cada um deles marcou de certa
forma, a vida desse que vos fala. É difícil explicar para quem não joga, o fascínio que os videogames causam nas
pessoas.</p>
<p>Enfim, quem ler esse post, poste quais consoles já teve e o que o faz ser fascinado por games.</p>
<h4>Referências:</h4>
<p><a href="http://casadoquejoga.wordpress.com">Casado Que Joga</a></p>
<p><a href="http://www.inexistentman.net/2007/05/29/top-100-jogos-do-nintendo-8-bits-nes-para-jogar-online/">100 Melhores Jogos de NES para Jogar Online</a></p>
<p><a href="http://lotsasplainin.blogspot.com/2009/03/and-lo-unto-seventh-generation.html">7 Gerações de Consoles explicadas</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Carta aberta aos microgerentes</title>
      <link>http://ricardoduarte.net/blog/2009/10/29/carta-aberta-aos-microgerentes/</link>
      <pubDate>Thu, 29 Oct 2009 15:17:27 BRST</pubDate>
      <category><![CDATA[produtividade]]></category>
      <guid>http://ricardoduarte.net/blog/2009/10/29/carta-aberta-aos-microgerentes/</guid>
      <description>Carta aberta aos microgerentes</description>
      <content:encoded><![CDATA[<p><a href="http://www.scottberkun.com/about/">Scott Berkun</a> é um conhecido escritor e palestrante na área de negócios e
tecnologia. Publicou <a href="http://www.scottberkun.com/books/">alguns livros</a> que se tornaram <em>best-sellers</em> e hoje são
leitura recomendada para quem deseja ou precisa aprender a gerenciar negócios, sejam eles ligados ou não à tecnologia.
Eu acompanho o blog dele e recentemente ele
<a href="http://www.scottberkun.com/blog/2009/letter-to-micromanagers/">postou um texto</a> que é uma carta aberta aos
microgerentes.</p>
<p>Para contextualizar, já que <strong>microgerente</strong> não é um termo muito usado aqui no Brasil, <strong>microgerente</strong> é aquele
sujeito que controla obsessivamente os seus subordinados, até mesmo nas tarefas mais pequenas. Eu pedi autorização
ao Scott para traduzir o seu texto e publicar aqui no blog. Autorização concedida, segue o texto traduzido.</p>
<p><em>Prezado microgerente:</em></p>
<p><em>Donos de cavalos puro-sangue nunca param seus cavalos durante uma corrida, a cada 10 segundos, para lembrar ao cavalo
e ao jockey como eles devem correr, onde está a linha de chegada, ou para dizer quão boa é a idéia de chegar
em primeiro. Por que? Porque isso os deixaria muito mais lentos. Apenas um idiota faria isso.</em></p>
<p><em>Se você é um gerente, você deve assumir que tem cavalos puro-sangue trabalhando para você. O seu trabalho é dar a
eles o que precisam para vencer suas corridas, acordando com eles prazos e premiações, porém, tirando todos os
obstáculos do caminho. A não ser que eles comecem a pular cercas ou atacar outros cavalos, você deve deixá-los correr
para vencer.</em></p>
<p><em>Mesmo que você seja 30% melhor do que alguém que trabalha para você em determinada tarefa, o tempo que toma ficar
de olho na sua equipe de hora em hora e solicitar aprovações para decisões triviais custam muito mais em perda de
ânimo, paixão pelo trabalho e destruição do respeito próprio dentro de sua equipe do que os 30% que você pensa
estar contribuindo. Ninguém consegue trabalhar bem sentindo que está sendo tratado como uma criança idiota. Ter 2
pessoas envolvidas em um trabalho que requer apenas uma é perda de tempo, para todos.</em></p>
<p><em>Talvez você não pense que está gerenciando cavalos puro-sangue e que esses precisam de muita ajuda.</em></p>
<p><em>Isso é possível.</em></p>
<p><em>Mas se você é de fato um microgerente, você começou a se exceder no dia em que começou a gerenciar. Você não tem
idéia do potencial das pessoas que trabalham para você. É grande a probabilidade de você estar tratando, pelo menos,
um potencial <a href="http://pt.wikipedia.org/wiki/Seabiscuit">Seabiscuit</a> como se ele fosse um pônei de brinquedo em um
conto medieval.</em></p>
<p><em>Um saudável, confiante e bem ajustado gerente sabe que o seu trabalho envolve fazer 3 coisas:</em></p>
<p><em>1. Contratar cavalos puro-sangue, indicar a linha de chegada e sair do caminho deles a não ser que peçam ajuda.</em></p>
<p><em>2. Treinar, ensinar, encorajar e posicionar cavalos extraordinários para maximizar o potencial e aproximá-los ao
menos em parte do seu trabalho.</em></p>
<p><em>3. Demitir aqueles que nunca conseguem fazer o trabalho necessário sem o seu constante envolvimento para criar
espaço para aqueles que conseguem trabalhar bem.</em></p>
<p><em>Se você não fizer essas coisas, o fardo do fracasso está sobre você. Bons gerentes atingem todos as três atividades
mencionadas acima. Gestores medíocres, ao menos, estão trabalhando para bons objetivos. Entretanto, maus gerentes
estão excessivamente distraídos por seus próprios egos, contracheques ou insegurança para reconhecer o
quão auto-destrutivos são.</em></p>
<p><em>Um fácil teste de gerenciamento é deixar que a sua equipe saiba o quão confiante você é na habilidade que eles tem
de realizar o trabalho e oferecer, caso eles queiram, que você esteja cada vez menos envolvido no seu trabalho do
dia-a-dia para que eles tenham mais espaço para produzir. Diga-lhes que você está disponível se eles precisarem de
você, mas caso contrário, você vai colocar a sua atenção em outro lugar. Veja o que acontece. Segure a sua língua.
Não solicite a revisão daquele email. Não insista em regular quem se reúne com quem. Tome um pequeno passo atrás e
veja o que acontece.</em></p>
<p><em>Existe uma enorme probabilidade de que o mundo não vai acabar. Seus melhores empregados serão mais felizes e mais
produtivos, dando a você uma nova energia para investir no restante do seu trabalho ou até mesmo para que em
determinados dias você possa ir embora para casa mais cedo. Algumas pessoas de sua equipe vão te surpreender e
prosperar com mais autonomia. E para aqueles que não conseguem melhorar ou cometem erros, você não saiu perdendo,
pois ainda pode voltar atrás e dar atenção onde é realmente necessário.</em></p>
<p><em>Se você estiver temeroso de tentar isso e tem uma lista de desculpas para dizer que isso é uma má idéia, a única
coisa que está gerenciando realmente é o seu ego. Porém, você está com medo de admitir que as pessoas podem
funcionar muito bem sem a sua aprovação ou intromissão em cada pequena coisa estúpida. Ou, pode ser que você seja
uma prova viva do <a href="http://en.wikipedia.org/wiki/Peter_Principle">Princípio de Peter</a>, e seria mais feliz e mais
útil se parasse de gerenciar e começasse a trabalhar sozinho. Um salário maior não é um troca saudável pois faz você
mesmo e sua equipe infelizes.</em></p>
<p><em>Bons gerentes são corajosos e confiantes, confiam nas pessoas que gerenciam. Eles querem amadurecer a sua habilidade
de julgar e aumentar as suas habilidades, preferindo errar por excesso de confiança do que por confiar pouco.
Eles têm prazer em se soltar e dar poder à sua equipe, aceitando que quando alguém que trabalha para eles brilha,
eles brilham muito.</em></p>
<p><em>No entanto, se você não gosta dessas coisas e luta para confiar em sua equipe, ou não suporta ver uma decisão
tomada ou um prêmio ganho sem o seu nome sobre ele, você deve parar de gerenciar pessoas. Você, e todos que trabalham
para você serão mais felizes se fizer isso.</em></p>
<p><em>Beijos e abraços,</em></p>
<p><em>Assinado,</em></p>
<p><em>- As pessoas que você está microgerenciando.</em></p>
<p><a href="http://www.scottberkun.com/blog/2009/letter-to-micromanagers/">Texto original</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Sobre liberdade e livros, um caso curioso</title>
      <link>http://ricardoduarte.net/blog/2009/10/20/sobre-liberdade-e-livros-um-caso-curioso/</link>
      <pubDate>Tue, 20 Oct 2009 12:59:37 BRST</pubDate>
      <category><![CDATA[livros]]></category>
      <guid>http://ricardoduarte.net/blog/2009/10/20/sobre-liberdade-e-livros-um-caso-curioso/</guid>
      <description>Sobre liberdade e livros, um caso curioso</description>
      <content:encoded><![CDATA[<img class="center" title="Liberdade" src="/media/img/post003/liberdade.jpg" alt="Liberdade" />

<p>O que significa liberdade? <a href="http://pt.wikipedia.org/wiki/Charles_de_Montesquieu">Charles de Montesquieu</a> tem a sua
própria definição: "A liberdade consiste em fazer tudo o que se deve querer e em jamais ser coagido a fazer o que não
se deve querer". A Internet trouxe um grande ganho de liberdade para as pessoas, como alguns costumam dizer, "não há
liberdade sem conhecimento", e uma das principais propostas da web é tornar disponível a maior quantidade de
conhecimento possível para a maior quantidade de pessoas que se consiga alcançar com a tecnologia.</p>
<p>Mas parece que alguns governos e grandes empresas ainda não entenderam isso, querem proibir downloads, pesquisas e
em alguns casos partem para a censura explícita e descabida. No entanto, no meio desse mar de ignorância, aparece um
caso que me fez ainda ter esperança na liberdade de expressão, e algo que pode fazer as pessoas pensarem um pouco
sobre como tratamos a liberdade alheia.</p>
<p><a href="http://diveintomark.org">Mark Pilgrim</a> é um conhecido programador e também é escritor. Sua maior obra é o livro
<a href="http://www.diveintopython.org">Dive Into Python</a>. Esse livro, sobre a linguagem de programação
<a href="http://www.python.org">Python</a>, já vendeu muitas cópias no mundo inteiro e inclusive ganhou uma versão em português
com tradução de qualidade duvidosa chamada
<a href="http://afiliados.submarino.com.br/books_productdetails.asp?Query=ProductPage&amp;amp;ProdTypeId=1&amp;amp;franq=132130&amp;amp;ProdId=1074889">Megulhando no Python</a>, mas isso não vem ao caso.</p>
<p>O interessante dessa história é que ontem Mark
<a href="http://diveintomark.org/archives/2009/10/19/the-point">relatou em seu blog</a> que outra pessoa simplesmente pegou o
seu livro e começou a distribuí-lo por conta própria sem a autorização de sua editora, a Apress. Ele conta que isso
causou um alvoroço dentro da editora e no meio da confusão, os executivos descobriram que juridicamente não poderiam
fazer nada contra isso. O que acontece é que o livro foi publicado sob uma licença chamada
<em>GNU Free Documentation License</em> que dá o direito a qualquer pessoa de publicar e distribuir o livro, bastando para
isso, ter os recursos para fazê-lo, haja visto que não é tarefa trivial distribuir um livro, seja ele qual for.
Inclusive o livro em questão está disponível na íntegra online para quem quiser acessar e ler. Assim sendo, os
executivos da empresa nada podiam fazer, pois não tinham recursos legais para isso.</p>
<p>O que mais me chamou a atenção, foi a opinião do próprio Mark sobre o assunto, em tese ele deveria se sentir mais
ofendido com essa situação, como é praxe vermos acontecer em casos como esse, mas ele mesmo escreveu o seguinte.</p>
<blockquote>
<p>I enjoy working with publishers because it makes me a better writer. But I don’t write for money; I write for
love (or passion, or whatever you want to call it). I choose open content licenses because this is the way I want
the world to work, and the only way to change the world is to change yourself first.</p>
</blockquote>
<p>Ao invés de censura, frustração, palavras duras ou qualquer outra coisa, vemos aqui uma pessoa contente por sua obra
ser reconhecida e estar aberta a todas as pessoas. Ele conclui o seu ponto de vista com as palavras abaixo.</p>
<blockquote>
<p>So I am grateful for this anonymous soul who woke up one day and said to herself, “You know what I should do today?
I should try to sell copies of that Free book that Pilgrim wrote.” Grateful, because it afforded me the opportunity
to remind myself why I chose a Free license in the first place. My Zen teacher once told me that, when people try to
do you harm, you should thank them for giving you the opportunity to forgive them. In this case it’s even simpler,
because there’s nothing to forgive, just explain. She’s redistributing the work that I explicitly made
redistributable. She’s kind of the point.</p>
</blockquote>
<p>Obrigado Mark, quem sabe um dia faremos o mundo entender que as coisas mudaram, que o conceito de liberdade está cada
vez mais amplo e que todos precisam ter acesso ao conhecimento, afinal de contas, liberdade é conhecimento,
não é mesmo?</p>]]></content:encoded>
    </item>
    <item>
      <title>O programador fita adesiva</title>
      <link>http://ricardoduarte.net/blog/2009/09/30/o-programador-fita-adesiva/</link>
      <pubDate>Wed, 30 Sep 2009 21:44:47 BRT</pubDate>
      <category><![CDATA[programação]]></category>
      <guid>http://ricardoduarte.net/blog/2009/09/30/o-programador-fita-adesiva/</guid>
      <description>O programador fita adesiva</description>
      <content:encoded><![CDATA[<img class="center" src="/media/img/post002/duct_tape_baby.png" alt="Fita Adesiva" />

<p>Tudo começou quando o <a href="http://en.wikipedia.org/wiki/Joel_Spolsky">Joel Spolsky</a> escreveu
<a href="http://www.joelonsoftware.com/items/2009/09/23.html">um artigo</a> em seu blog intitulado <em>The Duct Tape Programmer</em>.
E aí a coisa <a href="http://www.google.com.br/search?q=the+duct+tape+programmer">começou a se espalhar</a>, uns gostaram, outros
nem tanto. Mas o curioso foi ver a quantidade de blogs que imediatamente levantaram o dedo para dizer como o Joel
estava errado, como a comparação era exagerada, como o conceito era falho.</p>
<p>Pelamordedeus! Vamos parar com essa coisa de querermos sempre rotular tudo como certo e errado, poucas coisas na
vida são certas e erradas, preto no branco, claro e escuro ou seja lá que comparação você preferir. O segredo é
buscar o equilíbrio. E quando falamos em desenvolvimento de software, programação, isso se torna ainda mais verdade.
Pouquíssimas coisas estão no terreno do certo e errado, na maioria das vezes, você precisa usar o bom senso
(coisa rara hoje em dia) para escolher a forma de trabalho mais apropriada, a tecnologia mais apropriada ou a
ferramenta de trabalho mais apropriada.</p>
<p>Assim sendo, ao invés de gastar energia criticando o artigo, vamos pegar a idéia principal e ver como isso pode
melhorar a nossa vida, a forma como trabalhamos, para ver se conseguimos fazer melhor o nosso trabalho que é
desenvolver software.</p>
<h3>Analisando o artigo</h3>
<p>No artigo mencionado no início desse post, quando Joel fala sobre o termo "duct tape programmer" ou, numa tradução
livre, "programador fita adesiva", faz referência ao livro
<a href="http://www.amazon.com/gp/product/1430219483?ie=UTF8&amp;amp;tag=joelonsoftware&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1430219483">Coders at Work</a>,
que é uma coletânea de entrevistas com programadores experientes e seus respectivos trabalhos.</p>
<p>Nesse livro Joel encontrou a entrevista de Jamie Zawinsky, um dos desenvolvedores do navegador Netscape, e descreveu
a Jamie como um "programador fita adesiva". Vejam a definição:</p>
<blockquote>
<p>He is the kind of programmer who is hard at work building the future, and making useful things so that people can do
stuff. He is the guy you want on your team building go-carts, because he has two favorite tools: duct tape and WD-40.
And he will wield them elegantly even as your go-cart is careening down the hill at a mile a minute. This will
happen while other programmers are still at the starting line arguing over whether to use titanium or some kind of
space-age composite material that Boeing is using in the 787 Dreamliner.</p>
</blockquote>
<p>Sim, a idéia principal exposta aqui é simples: <strong>o programador fita adesiva está mais interessado em resolver o
problema, em entregar o produto, ao invés de se preocupar em adicionar complexidade em cima de complexidade em
cima de complexidade</strong> (atenção <a href="http://www.java.com/pt_BR/">Java</a>, eu estou olhando para você!).</p>
<blockquote>
<p>And the duct-tape programmer is not afraid to say, “multiple inheritance sucks. Stop it. Just stop.”</p>
</blockquote>
<p>Sim, para que tenhamos agilidade é necessário aprendermos a dizer "Não!". Não para a complexidade desnecessária,
não para funcionalidades que não agregam valor, não para ferramentas que possuem uma curva de aprendizado enorme
e que no final agregam pouco ou nenhum valor ao seu trabalho. Foco no principal, foco no que vai resolver o meu
problema ou o problema do meu cliente. Esse parágrafo do artigo diz tudo:</p>
<blockquote>
<p>Peter asked Zawinski, “Overengineering seems to be a pet peeve of yours.” “Yeah,” he says, “At the end of the day,
ship the fu**ing thing! It’s great to rewrite your code and make it cleaner and by the third time it’ll actually
be pretty. But that’s not the point—you’re not here to write code; you’re here to ship products.”</p>
</blockquote>
<p>Preciso reforçar essa última frase: <strong><em>não estamos aqui para escrever código, estamos aqui para entregar produtos</em></strong>.
Sim, é para isso que somos pagos e essa deve ser a nossa principal preocupação, entregar produtos de qualidade para
nossos clientes.</p>
<h3>Concluindo</h3>
<p>É claro que não devemos pegar esse conceito e tratá-lo como verdade absoluta, está longe disso. Repito mais uma vez,
assim como tudo na vida, precisamos analisar isso com equilíbrio. Não adianta entregarmos o produto no prazo,
sendo que o mesmo está cheio de erros e com a estrutura comprometida.</p>
<p>Da mesma forma como uma fita adesiva nem sempre resolverá o seu problema e talvez seja necessário usar algo que seja
mais complicado, porém mais duradouro, no desenvolvimento de software precisamos realmente avaliar quando resolver
os nossos problemas com a solução mais simples possível ou então usar algo um pouco ou muito mais complexo mas que
nos trará ganhos maiores e mais duradouros no futuro.</p>]]></content:encoded>
    </item>
    <item>
      <title>Ferramentas para trabalhar com Scrum</title>
      <link>http://ricardoduarte.net/blog/2009/09/18/ferramentas-para-trabalhar-com-scrum/</link>
      <pubDate>Fri, 18 Sep 2009 13:06:41 BRT</pubDate>
      <category><![CDATA[agile]]></category>
      <guid>http://ricardoduarte.net/blog/2009/09/18/ferramentas-para-trabalhar-com-scrum/</guid>
      <description>Ferramentas para trabalhar com Scrum</description>
      <content:encoded><![CDATA[<p>Na <a href="http://www.petrobras.com.br" title="Petrobras">empresa</a> onde trabalho, eu participo de um projeto interno com uma equipe
de 8 pessoas. Após assistir a uma palestra sobre <a href="http://pt.wikipedia.org/wiki/Scrum">Scrum</a>, decidimos
adotar algumas práticas dessa metodologia de desenvolvimento ágil aqui na equipe.</p>
<p>Ficamos muito empolgados com a metodologia, porém, o espaço físico onde trabalhamos não possibilita usarmos as
principais ferramentas de <strong>Scrum</strong> (quadro branco, papel, caneta e post-it).
Sendo assim, comecei a pesquisar  algumas ferramentas para uso de <strong>Scrum</strong> que poderiam ser aplicadas
em nossa equipe e nas práticas ágeis que pretendemos adotar.</p>
<p>Escrevi então esse post para listar aqui o resultado prévio dessa pesquisa. Apenas um <em>disclaimer</em>, nossa
equipe ainda não adota o <strong>Scrum</strong> plenamente, nossa idéia é adotar de forma incremental algumas práticas
dessa metodologia para que possamos melhorar a maneira como desenvolvemos software. Agora vamos deixar o blá-blá-blá
de lado e vamos dar uma olhada nas ferramentas.</p>
<p><a href="http://scrumy.com/">
<img title="Scrumy" src="/media/img/post001/scrumy.png" alt="Scrumy" width="150" height="47" />
</a></p>
<p>Começaremos com uma ferramenta que preza pela simplicidade e pela facilidade de uso, e eu sou um fã da simplicidade.</p>
<p>Para criar um projeto no <strong>Scrumy</strong> basta digitar no seu browser a url: <strong>http://scrumy.com/&lt;nome do projeto&gt;</strong>
e você já terá o seu espaço criado. Além disso, o que a ferramenta basicamente provê é a criação das <em>user stories</em>
e o acompanhamento delas através do painel de tarefas (<em>taskboard</em>). Existe ainda uma versão para chamada
<strong>Scrumy Pro</strong> que lhe permite coordenar múltiplos sprints e múltiplos backlogs, além de prover <em>burndown charts</em>.</p>
<p><a href="http://pangoscrum.com/">
<img title="Pango Scrum" src="/media/img/post001/pango_scrum.png" alt="Pango Scrum" width="150" height="35" />
</a></p>
<p>Assim como o <strong>Scrumy</strong>, <strong>Pango Scrum</strong> também é uma ferramenta online, porém muito mais completa. Auxilia em quase
todas as atividades principais do <strong>Scrum</strong> como <em>Product Backlog</em>, <em>Sprint Backlog</em>, agendamento de eventos e
planejamento de <em>sprints</em>. A ferramenta não disponibiliza a funcionalidade para criação de painel de tarefas pois eles
pregam que isso deva ser realmente feito na base do papel e <em>post-it</em>. O <strong>Pango Scrum</strong> é gratuito e assim como
muitas outras ferramentas da Web 2.0, está "em fase beta".</p>
<p><a href="http://studios.thoughtworks.com/mingle-agile-project-management">
<img title="Mingle" src="/media/img/post001/mingle_logo.png" alt="Mingle" width="150" height="68" />
</a></p>
<p>Essa talvez seja a melhor das ferramentas que estão aqui listadas, afinal de contas, foi criada pela empresa de um
dos maiores evangelizadores de metodologias ágeis, <a href="http://martinfowler.com/">Martin Fowler</a>.</p>
<p>Essa ferramenta possui tudo o que podemos esperar de uma boa ferramenta de <strong>Scrum</strong>, e melhor ainda, tudo muito bem
implementado e com uma usabilidade visível desde o primeiro contato. Além das funcionalidades esperadas, a ferramenta
provê um <em>wiki</em> integrado, alertas por e-mail, <em>feeds</em> RSS e muito mais. Porém, como era de se esperar para uma
ferramenta desse nível, ela é paga e de acordo com<br />
<a href="http://studios.thoughtworks.com/mingle-agile-project-management/buy-now">a tabela de preços</a>, não é barata.</p>
<p><a href="http://danube.com/scrumworks">
<img title="Scrum Works Pro" src="/media/img/post001/scrumworks-pro-275x78.png" alt="Scrum Works Pro" width="150" height="42" />
</a></p>
<p>Essa é uma ferramenta muito bem comentada pela web. Possui duas versões, <strong>Basic</strong> (gratuita) e <strong>Pro</strong>
(obviamente paga). Diferentemente das ferramentas expostas acima, essa ferramenta não roda online e precisa ser
instalada. <strong>ScrumWorks</strong>, depois de instalado, consiste em 2 programas, um servidor e um cliente. O servidor é
para ser usado pelo <em>Scrum Master</em>, é onde se realiza todas as tarefas de planejamento do <em>Scrum</em>. A parte cliente é
direcionada aos membros da equipe para que possam receber a atualização das tarefas.</p>
<p>Testei rapidamente, e me parece ser uma ferramenta muito boa, apesar de carecer de uma interface mais intuitiva como
as outras ferramentas já citadas. A vantagem dessa ferramenta é que ela parece ter um nível de customização bem
interessante para equipes que estão continuamente melhorando o seu processo de desenvolvimento.</p>
<p><a href="http://www.icescrum.org/">
<img title="Ice Scrum" src="/media/img/post001/ice_scrum_logo.png" alt="Ice Scrum" width="150" height="39" />
</a></p>
<p>Chegamos na última ferramenta desse post e da única que é open source. <strong>IceScrum</strong> está na versão 2. É uma ferramenta
bem completa que tem todas as funcionalidades que eu já mencionei nesse post como <em>Product Backlog</em>, <em>Sprint Backlog</em>,
planejamento de <em>release</em>, funcionalidades para todos os papéis do <em>Scrum</em>, auxílio ao <em>planning poker</em>, gráficos
diversos e muito mais.</p>
<p>A ferramenta parece ter sido muito bem implementada e parece estar em constante evolução. Vale a conferida para quem
está interessada em uma ferramenta sem custos de aquisição e que pode agregar bastante valor ao processo de sua
equipe de desenvolvimento.</p>
<h3>Concluindo...</h3>
<p>Gostei muito de todas as ferramentas expostas acima, desde a mais simples até a mais completa. Procurarei olhá-las
novamente com mais profundidade e particularmente, vou testar mais de perto <strong>IceScrum</strong> e <strong>Scrumy</strong>.</p>
<p>Espero ter ajudado a alguém que assim como eu, tem sempre procurado melhorar o desempenho da sua equipe no que tange
a desenvolver software melhor. Como sempre, os comentários estão abertos para dúvidas, críticas, novas sugestões e o
que mais quiserem colocar ali.</p>
<h3>Atualização: 18 de Agosto de 2011</h3>
<p><a href="http://www.scrumhalf.com.br">
<img title="Scrum Half" src="/media/img/post001/scrumhalf.png" alt="Scrum Half" />
</a></p>
<p>Essa ferramenta merece uma menção honrosa, pois é a única ferramenta nacional que está ganhando mercado na área de
desenvolvimento ágil. Não tive oportunidade de testá-la ainda, mas à primeira vista parece ser uma ferramenta muito
boa.</p>
<p><strong>Scrum Half</strong> foi desenvolvida pela <a href="http://www.gpetec.com.br/">GPE</a>, uma empresa brasileira com foco em gestão ágil
de projetos. Uma das vantagens que percebi na ferramenta, além da mais óbvias que é o idioma, é o fato de ser online e
assim, não precisar de instalação. Vale muito a pena dar uma conferida, para quem tiver interesse, a ferramenta é
gratuita para uso de até 3 pessoas, mais do que isso, tem uma
<a href="https://www.scrumhalf.com.br/plano/home.jsf">tabela de preços</a> que pode ser consultada.</p>
<h4>Links relacionados:</h4>
<p>Stack Overflow: Best Scrum Tools <a href="http://stackoverflow.com/questions/35760/best-scrum-tools">http://stackoverflow.com/questions/35760/best-scrum-tools</a></p>
<p>All Product Backlog and User Story Management Tools for Agile and Scrum Projects <a href="http://www.userstories.com/products">http://www.userstories.com/products</a></p>]]></content:encoded>
    </item>
  </channel>
</rss>

