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

<channel>
	<title>Mergulhando no Caos &#187; tecnologia</title>
	<atom:link href="http://blog.thiagoarrais.com.br/category/tecnologia/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.thiagoarrais.com.br</link>
	<description>Pensamentos, idéias e devaneios sobre desenvolvimento de software e tecnologia em geral</description>
	<lastBuildDate>Tue, 03 Nov 2009 11:30:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Bagunça pode ser tudo o que você precisa</title>
		<link>http://blog.thiagoarrais.com.br/2009/11/03/bagunca-pode-ser-tudo-o-que-voce-precisa/</link>
		<comments>http://blog.thiagoarrais.com.br/2009/11/03/bagunca-pode-ser-tudo-o-que-voce-precisa/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 11:30:10 +0000</pubDate>
		<dc:creator>thiago.arrais</dc:creator>
				<category><![CDATA[gente]]></category>
		<category><![CDATA[tecnologia]]></category>

		<guid isPermaLink="false">http://blog.thiagoarrais.com.br/?p=318</guid>
		<description><![CDATA[Já notou que sempre bangunçamos o ambiente em que estamos trabalhando? Se você não fizer um esforço bem consciente para organizar tudo enquanto trabalha ou quando termina de fazer o que precisa, as chances são que as coisas estejam um pouco mais bagunçadas do que no início. Já notou também que mesmo que tudo pareça [...]]]></description>
			<content:encoded><![CDATA[<p>Já notou que sempre bangunçamos o ambiente em que estamos trabalhando? Se você não fizer um esforço bem consciente para organizar tudo enquanto trabalha ou quando termina de fazer o que precisa, as chances são que as coisas estejam um pouco mais bagunçadas do que no início. Já notou também que mesmo que tudo pareça bagunçado, você (quase) sempre consegue se achar na sua bagunça? E que se alguém fizer o &#8220;favor&#8221; de &#8220;organizar&#8221; as coisas para você há uma boa chance de piorarem sua situação? Isso acontece porque a bagunça era a <em>sua</em> bagunça.</p>
<p>E também porque provavelmente não era uma bagunça.</p>
<p>Por trás desse tipo de bagunça aparente, há sempre uma ordem não óbvia. Para usar um exemplo bastante simples discutido no livro <a href="http://www.submarino.com.br/produto/1/21315984/bagunca+perfeita:+como+aproveitar+as+vantagens+da+desordem,+uma?franq=272505">Uma bagunça perfeita</a> de Eric Abrahamson e David H. Freedman (prometo publicar uma resenha apropriada em breve), uma pilha de papéis jogados sobre uma mesa está ordenada por ordem de uso: os mais usados ficam no topo e os menos usados no fundo. Isso acontece naturalmente se você sempre devolver os papéis que precisou da pilha para o topo. Do mesmo modo, se você pedir a alguém para realizar alguma tarefa rotineiramente, as pessoas sem nem perceber acabam bolando procedimentos de modo a facilitar o trabalho, aproveitar melhor o tempo e tornarem-se produtivas. Por isso bons programadores acabam chegando a algo parecido com <a href="http://www.extremeprogramming.org/">XP</a> se <a href="http://c2.com/cgi/wiki?ObservationsOfProgrammersInTheWild">não forem podados</a>.</p>
<p>Mas este é um blog sobre desenvolvimento de software para programadores e o trabalho do programador é justamente eliminar a bagunça do trabalho das pessoas, escrever programas que as ajudem a se organizar melhor, identificar &#8220;processos de negócio&#8221; e coisa e tal, certo?</p>
<p>Errado, se o seu ego conseguir aceitar que as pessoas que estão lá <em>fazendo</em> o trabalho no fim das contas sabem muito mais dele do que você.</p>
<p>Muitas vezes o que precisamos não é bem <em>organizar</em> o que as pessoas estão fazendo. Às vezes precisamos somente <em>tornar a bagunça mais eficiente</em>. Quando se tenta organizar muito os processos de trabalho das pessoas a coisa acaba ficando engessada demais. O resultado são <a href="http://blog.improveit.com.br/articles/2008/05/02/o-preco-da-modernidade">sistemas que atrapalham</a> mais do que ajudam e gente que passa mais tempo tentando <a href="http://blog.improveit.com.br/articles/2008/05/05/o-preço-da-modernidade-parte-2">agradar os sistemas</a> corporativos do que resolvendo problemas dos clientes. Já ouviu a célebre frase &#8220;eu entendo, mas o sistema não deixa&#8221; quando tentou algo minimamente fora do comum com um banco ou uma operadora de telefone? É disso que estou falando. Resultado dos sistemas paralisantes. Resultado da organização demasiada.</p>
<p>Por outro lado sistemas caóticos terminaram sendo alguns dos exemplos de maior sucesso em nossa indústria. O Unix, por exemplo, é descrito por Martin Fowler como <a href="http://www.languageparallax.com/wordpress/?p=39">a maior aglomeração de coisas coladas umas nas outras que o mundo já viu</a>. A web, por sua vez, é uma imensa bagunça de documentos, links e referências em escala global. Os dois sistemas têm em comum a filosofia de fazer pouca coisa, mas fazer bem o que escolheram fazer, e permitir que os usuários façam o que bem entenderem utilizando essa fundação. Eles não tentam organizar cada mínimo aspecto da rotina das pessoas. Eles aceitam o fato de que nunca vão conhecer o trabalho das pessoas tão bem quanto elas mesmas e se concentram em permitir que elas tenham liberdade para fazer o que quiserem do jeito que quiserem.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.thiagoarrais.com.br/2009/11/03/bagunca-pode-ser-tudo-o-que-voce-precisa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sites de rede social são plataformas, não aplicações</title>
		<link>http://blog.thiagoarrais.com.br/2009/08/18/sites-de-rede-social-sao-plataformas-nao-aplicacoes/</link>
		<comments>http://blog.thiagoarrais.com.br/2009/08/18/sites-de-rede-social-sao-plataformas-nao-aplicacoes/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 21:31:47 +0000</pubDate>
		<dc:creator>thiago.arrais</dc:creator>
				<category><![CDATA[gente]]></category>
		<category><![CDATA[tecnologia]]></category>

		<guid isPermaLink="false">http://blog.thiagoarrais.com.br/?p=290</guid>
		<description><![CDATA[Eu lembro quando as primeiras redes sociais começaram a se popularizar por estas bandas. E por popularizar, é óbvio que eu quero dizer que começaram a ser usadas pelos primeiros geeks. No início éramos só nós que usávamos esse tipo de coisa. Depois começaram a surgir o que vou chamar de &#8220;geeks de segundo nível&#8221;, [...]]]></description>
			<content:encoded><![CDATA[<p>Eu lembro quando as primeiras redes sociais começaram a se popularizar por estas bandas. E por popularizar, é óbvio que eu quero dizer que começaram a ser usadas pelos primeiros geeks. No início éramos só nós que usávamos esse tipo de coisa. Depois começaram a surgir o que vou chamar de &#8220;geeks de segundo nível&#8221;, o pessoal que acompanha tecnologia mas que inicialmente estava cético quanto à utilidade dessas coisas. Esses acabaram se convencendo depois que todos os outros geeks estavam usando. Depois disso foi só aproveitar a inércia: começaram a aparecer pessoas interessadas mais nas possibilidades de interação humana que na tecnologia, atraídas pelo que seus amigos geeks estavam conseguindo dessa nova mídia e pela facilidade de operá-la. Foi neste ponto que começaram a chegar as meninas de treze anos, os perfis falsos, os pedintes (me add! me add!) e aí&#8230;</p>
<p>Aí os usuários originais começaram a debandar. Aquela idéia do início já não parecia tão boa. Na verdade parecia uma <em>péssima</em> idéia. A relação sinal-ruído desequilibrou demais para o lado do ruído: mais um caso internético típico da <a href="http://blog.thiagoarrais.com.br/2008/08/26/a-maldicao-da-popularidade/">maldição da popularidade</a>.</p>
<p>Mas se a idéia era tão ruim, como conseguiu atrair aqueles geeks no início?</p>
<p>Acontece que a idéia <em>não era</em> ruim. Geeks são muito bons para detectar boas plataformas e foi isso que eles fizeram. Eles começaram a adotar aquela idéia por causa do seu <em>potencial</em>. Não pelo que ela oferecia na época, mas pelo que ela poderia vir a oferecer. Quando as redes sociais falharam em aproveitar esse potencial, eles as abandonaram.</p>
<p>O grande erro dos sites de rede social foi não perceber que o que tinham em mãos era uma plataforma para aplicações, não uma aplicação final. Felizmente isto vem mudando nos últimos anos, com a disponibilização de interfaces de programação para que terceiros hospedem aplicações sobre estes sites e o futuro pode voltar a parecer promissor novamente.</p>
<p>Hoje a maioria das aplicações no Orkut, por exemplo, são basicamente inúteis. Temos desde aplicativos que servem simplesmente para permitir que você use o grafo social para encher o saco de seus amigos até os sites com conteúdo externo que não usam praticamente nada do grafo social mas resolveram subir nesse trem por causa da audiência. Sem contar os mini-aplicativos publicitários sem muita criatividade. Olhando por este lado, o futuro não parece muito alegre. Mas o valor de uma plataforma não está nas aplicações que já foram feitas, mas nas que <em>podem</em> ser feitas.</p>
<p>E o que pode ser feito com essas redes sociais? Ninguém sabe ainda. Se alguém soubesse, já teria sido feito. A questão é que você não pode dizer que esse negócio de rede social não vai pra lugar nenhum só porque ninguém fez nada de interessante <em>ainda</em>. Isso não impede que alguém faça algo <em>no futuro</em>. Se em 1992 você dissesse que a web não iria para lugar nenhum, sua opinião pareceria bastante plausível, mas por volta do ano 2000 teria sido provado o contrário. É bem verdade que as redes sociais podem <em>realmente</em> nunca nos trazer nada de útil, mas isso não pode ser afirmado com base no passado.</p>
<p>A própria web não era muito atrativa na década de 90, mas os geeks viram seu potencial e a transformaram em uma mídia riquíssima. No início não havia aplicações web muito interessantes, mas havia <em>potencial</em>. Se vamos usar as aplicações sobre redes sociais somente para jogar frutas virtuais em nossos amigos ou arranjar algo de útil para fazer é uma decisão que está primeiramente em nossas mãos, desenvolvedores web e geeks em geral. Se conseguirmos construir algo que ajude as pessoas, elas virão.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.thiagoarrais.com.br/2009/08/18/sites-de-rede-social-sao-plataformas-nao-aplicacoes/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Quem está preocupado com SEO já está perdido</title>
		<link>http://blog.thiagoarrais.com.br/2009/06/18/quem-esta-preocupado-com-seo-ja-esta-perdido/</link>
		<comments>http://blog.thiagoarrais.com.br/2009/06/18/quem-esta-preocupado-com-seo-ja-esta-perdido/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 23:42:24 +0000</pubDate>
		<dc:creator>thiago.arrais</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[gente]]></category>
		<category><![CDATA[tecnologia]]></category>

		<guid isPermaLink="false">http://blog.thiagoarrais.com.br/?p=275</guid>
		<description><![CDATA[Como assim? Você me pergunta. Você não deveria estar preocupado com a classificação do seu site em engenhos de busca? Mas 96% dos visitantes chegam aos sites através deles! Tudo bem, deixe-me explicar. Para ficar mais fácil, vamos voltar às bases. SEO é um acrônimo para Search Engine Optimization que numa tradução bem pé-duro quer [...]]]></description>
			<content:encoded><![CDATA[<p>Como assim? Você me pergunta. Você não deveria estar preocupado com a classificação do seu site em engenhos de busca? Mas 96% dos visitantes chegam aos sites através deles!</p>
<p>Tudo bem, deixe-me explicar. Para ficar mais fácil, vamos voltar às bases.</p>
<p>SEO é um acrônimo para Search Engine Optimization que numa tradução bem pé-duro quer dizer Otimização de Engenho de Busca. Aqui já dá pra ver a inconsistência: quem faz otimização dos engenhos de busca são os donos dos engenhos de busca, ora bolas, não os responsáveis pelos sites indexados. Você simplesmente não consegue otimizar algo que você não controla.</p>
<p>Digamos que você escreveu uma  rotina para ordenar os valores de uma lista. Como você faz para otimizá-la? Você olha o que pode modificar e reescreve algumas partes de modo a executar mais rápido, consumir menos memória ou algo do tipo, claro. O que definitivamente não conta como otimização da sua rotina é exigir que a entrada sempre venha ordenada de modo que ela não precise fazer nenhum trabalho.</p>
<p>Entretanto, o que se denomina de SEO hoje em dia é basicamente isso, modificar a web para tornar mais fácil para os engenhos de busca acharem o conteúdo. O termo evoluiu para significar Otimização <em>para</em> Engenho de Busca. Muitas vezes é usado como sinônimo para o ato de massagear sites ou páginas de modo a obter uma classificação favorável em relação a alguns termos específicos. Algumas vezes isso inclui até esquemas obscuros de troca de links. O objetivo disso é, no final de tudo, aparecer entre os primeiros resultados quando alguém procurar por algumas palavras relacionadas a seu conteúdo. Chega-se a bolar todo tipo de coisa para conseguir isso, mas a solução definitiva é mais simples do que parece.</p>
<p>Para garantir que sua página vai figurar entre os resultados mais relevantes para um termo de busca basta <em>ter o melhor conteúdo</em> para aquele termo.</p>
<p>Se você tem um site de resenhas de produtos que tem inquestionavelmente a melhor resenha do mundo referente a um produto em particular e alguém procura pelo nome do produto e seu site não aparece em primeiro ou segundo colocado (vamos admitir que o site do fabricante do produto possa ser o primeiro), a falha é dos engenhos de busca, não sua. É o trabalho deles achar o melhor conteúdo. O seu trabalho é <em>ter</em> o melhor conteúdo. Se eles não estão achando o seu conteúdo, simplesmente não estão trabalhando direito.</p>
<p>Não importa como vão fazer para encontrar o melhor conteúdo, eles têm que encontrar. É o que eles se propõem a fazer. É a razão deles existirem. Não importa se eles vão levar em consideração a quantidade de links que cada página recebe em toda a web ou se vão contratar críticos literários para ler e classificar todas as páginas do mundo.</p>
<p>O pessoal do engenho de busca não pode reclamar que você não colocou o nome do produto na URL ou que não incluiu algum tipo de meta-dado para facilitar a indexação. Nada disso importa quando o seu conteúdo é o melhor. Claro que você deve tomar cuidado para tornar o conteúdo fácil de encontrar, garantir que ele vai ser acessível para visitantes usando programas de leitura de tela e certificar-se que o título da página faz sentido. Mas nada disso é SEO, esse tipo de coisa é só Introdução à Web.</p>
<p>SEO no sentido literal só pode ser realizado pelos donos dos engenhos de busca. O melhor meio de fazer SEO como o termo é comumente usado é simplesmente gerar o melhor conteúdo em toda a web. Neste sentido, você não deve perder seu tempo com SEO justamente porque SEO é o que você deveria estar fazendo o tempo todo desde o início.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.thiagoarrais.com.br/2009/06/18/quem-esta-preocupado-com-seo-ja-esta-perdido/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Código que fala por si só</title>
		<link>http://blog.thiagoarrais.com.br/2009/06/13/codigo-que-fala-por-si-so/</link>
		<comments>http://blog.thiagoarrais.com.br/2009/06/13/codigo-que-fala-por-si-so/#comments</comments>
		<pubDate>Sat, 13 Jun 2009 13:15:19 +0000</pubDate>
		<dc:creator>thiago.arrais</dc:creator>
				<category><![CDATA[simplicidade]]></category>
		<category><![CDATA[tecnologia]]></category>

		<guid isPermaLink="false">http://blog.thiagoarrais.com.br/?p=266</guid>
		<description><![CDATA[Uma justificativa (ou desculpa, dependendo de que lado se olhe) bastante comum de equipes que desenham diagramas para qualquer pequeno aspecto de suas aplicações é que eles servem para ajudar a ler o código. Tornam aquela bagunça emaranhada que é o código em algo mais dócil. Traduzem a verborragia computacional em algo mais compreensível para [...]]]></description>
			<content:encoded><![CDATA[<p>Uma justificativa (ou desculpa, dependendo de que lado se olhe) bastante comum de equipes que desenham diagramas para qualquer pequeno aspecto de suas aplicações é que eles servem para ajudar a ler o código. Tornam aquela bagunça emaranhada que é o código em algo mais dócil. Traduzem a verborragia computacional em algo mais compreensível para um mero humano.</p>
<p>O objetivo aqui é certamente louvável. Quem não quer uma aplicação fácil de entender? O problema é que este tipo de discurso parte de uma premissa bastante questionável: a de que código é inerentemente difícil de se ler e entender. Estou usando aqui o exemplo dos diagramas, mas o mesmo problema acontece quando se tenta escrever comentários para cada linha de código. Muda o paciente, mas a doença é a mesma.</p>
<p>Digamos que você esteja escrevendo um livro. Você pensou em um bom tema para a estória, delineou vários personagens e conseguiu imaginar até um cenário interessante para o pano de fundo. Mas seus dotes literários não estão muito apurados e o texto começa a ficar meio emaranhado. Você não sabe onde terminar uma cena e começar outra, não sabe onde encaixar os diálogos e qualquer um que começa a ler se perde depois do quarto parágrafo. Apesar disso você tem uma boa estória para contar. O que você faz? Enche o livro de figuras coloridas? Faz um filme para ser distribuído em conjunto?</p>
<p>Claro que não. Você reestrutura a história e reescreve o livro se for preciso. Você não faz uma representação paralela dele em outra mídia, você torna a mídia original mais acessível. Se você não conseguir fazer isso, é melhor procurar outra coisa para fazer. Talvez você possa aprender a escrever melhor se estudar um bocado. Ou talvez você não tenha talento mesmo.</p>
<p>Para o código a solução é a mesma. O texto do programa deve falar por si só, não se deve assumir que há alguma outra representação alternativa para torná-lo mais claro. Se o relacionamento entre as várias partes do código está obscuro, ele deve ser reestruturado de forma a ficar mais claro. Se o nível de detalhamento das rotinas chamadas dentro de um trecho está muito perto do metal bruto, agrupe alguns blocos em rotinas separadas ou crie novo objetos. Faça o que fizer sentido, mas não deixe o código ficar sujo. Assim como todo bom escritor pensa o tempo todo em seus leitores, pense o tempo todo em quem vai ler seu código.</p>
<p>Isso não quer dizer que nunca devamos usar uma representação gráfica ou comentários para explicar código. Voltando à analogia dos livros, ilustrações são coisas legais de se encontrar, só não devem ser partes essenciais do conteúdo. Talvez fique mais fácil entender o que o autor imaginou com elas, mas qualquer bom livro que tenha as ilustrações removidas continuará tão bom quanto antes.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.thiagoarrais.com.br/2009/06/13/codigo-que-fala-por-si-so/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ninguém liga para sua relação teste-para-código</title>
		<link>http://blog.thiagoarrais.com.br/2009/02/06/ninguem-liga-para-sua-relacao-teste-para-codigo/</link>
		<comments>http://blog.thiagoarrais.com.br/2009/02/06/ninguem-liga-para-sua-relacao-teste-para-codigo/#comments</comments>
		<pubDate>Fri, 06 Feb 2009 23:58:21 +0000</pubDate>
		<dc:creator>thiago.arrais</dc:creator>
				<category><![CDATA[gente]]></category>
		<category><![CDATA[tecnologia]]></category>
		<category><![CDATA[testes]]></category>

		<guid isPermaLink="false">http://blog.thiagoarrais.com.br/?p=231</guid>
		<description><![CDATA[Tenho visto muita gente recentemente se gabando da relação teste-para-código de seus projetos. As pessoas medem a quantidade de linhas de código do sistema em si e a quantidade de linhas de código dos testes automáticos e publicam a relação de uma para a outra, como se isso quisesse dizer algo sobre a qualidade do [...]]]></description>
			<content:encoded><![CDATA[<p>Tenho visto muita gente recentemente se gabando da relação teste-para-código de seus projetos. As pessoas medem a quantidade de linhas de código do sistema em si e a quantidade de linhas de código dos testes automáticos e publicam a relação de uma para a outra, como se isso quisesse dizer algo sobre a qualidade do sistema. Permita-me ser bem claro:</p>
<p><em><b>Ninguém dá a mínima para a sua relação teste-para-código.</b></em></p>
<p>Nem para sua taxa de cobertura de testes, se é que isso interessa.</p>
<p>A menos que a relação seja zero-para-um, não há absolutamente nada de informativo neste número. A partir do momento em que você está escrevendo <em>algum</em> teste, fazer este número crescer não garante melhoria <em>nenhuma</em> na qualidade do sistema. Talvez você esteja escrevendo testes inúteis para verificar se sua linguagem de programação consegue atribuir um valor a uma variável e recuperá-lo de volta. Talvez você esteja repetindo os mesmos testes o tempo todo. Testar é bom, mas alguns testes são melhores do que outros e este número não é calculado sobre a <em>qualidade</em> dos testes, só a <em>quantidade</em> deles. Não há nenhuma conclusão útil que eu possa tirar do seu número sem dar uma olhada no seu código.</p>
<p>Cobertura de testes é outra métrica bem vazia. Claro que você deve tentar se aproximar tanto quanto possível de 100%, mas a verdade é que chegar a níveis de cobertura acima de 90% não é tão difícil assim. Considere, por exemplo, este trecho de código adaptado do <a href="http://www.submarino.com.br/produto/9/300251/code+complete?franq=272505">Code Complete</a> do <a href="http://www.stevemcconnell.com/">Steve McConnell</a>:</p>
<pre>
    totalWithholdings = 0;

    for ( id = 0; id < numEmployees; id++) {
        if (m_employee[id].governmentRetirementWithheld < MAX_GOVT_RETIREMENT) {
            governmentRetirement = ComputeGovernmentRetirement(m_employee[id]);
        }

        companyRetirement = 0;

        if (m_employee[id].WantsRetirement &#038;&#038;
            EligibleForRetirement(m_employee[id])) {
            companyRetirement = GetRetirement(m_employee[id]);
        }

        grossPay = ComputeGrossPay(m_employee[id]);

        personalRetirement = 0;
        if (EligibibleForPersonalRetirement(m_employee[id])) {
            personalRetirement = PersonalRetirementContribution(m_employee[id],
                companyRetirement, grossPay);
        }

        withholding = ComputeWithholding(m_employee[id]);
        netPay = grossPay - withholding - companyRetirement -
            governmentRetirement - personalRetirement;

        PayEmployee(m_employee[id], netPay);

        totalWithholdings = totalWithholdings + withholding;
        totalGovernmentRetirement = totalGovernmentRetirement +
            governmentRetirement;
        totalRetirement = totalRetirement + companyRetirement;
    }

    SavePayRecords(totalWithholdings, totalGovernmentRetirement,
        totalRetirement);
</pre>
<p>É possível obter 100% de cobertura para este trecho completo com apenas um teste: você só precisa garantir que há ao menos um funcionário (para que o loop seja executado) e que as três cláusulas condicionais avaliem para verdadeiro. Obviamente um único teste não é o suficiente para testar todas as nuances deste código e, de fato, McConnel mostra no livro que são necessários <em>pelo menos</em> dezessete testes diferentes. Mesmo assim se tivéssemos escrito aquele único caso de teste, enxergaríamos cobertura total.</p>
<p>Parece que virou moda ultimamente <a href="http://www.infoq.com/presentations/francl-testing-overrated">supervalorizar os testes</a> e divulgar estas métricas vazias. No fim das contas elas funcionam como qualquer métrica para software, só dão uma visão bem abstrata do sistema e podem muitas vezes serem enganosas. Não há substituto para uma boa leitura do código.</p>
<p>Tendo dito isso tudo, eu definitivamente não recomendo tentar <a href="http://logbr.reflectivesurface.com/2009/01/31/testes-pragmatismo-ou-desperdicio-de-tempo/">desenvolver software sem escrever testes automáticos</a>. Já é difícil desenvolver software usando testes, mas é ainda pior sem eles. Só porque você sabe que não é possível provar ausência de defeitos através de testes, não quer dizer que não deva usá-los. Então, por favor, continue escrevendo-os (ou passe a escrever se você não escreve ainda). Só não aja como se eles fossem a última salvação da humanidade. Eles são só a primeira.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.thiagoarrais.com.br/2009/02/06/ninguem-liga-para-sua-relacao-teste-para-codigo/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Você pode ser ruim de mil maneiras</title>
		<link>http://blog.thiagoarrais.com.br/2008/10/09/voce-pode-ser-ruim-de-mil-maneiras/</link>
		<comments>http://blog.thiagoarrais.com.br/2008/10/09/voce-pode-ser-ruim-de-mil-maneiras/#comments</comments>
		<pubDate>Thu, 09 Oct 2008 14:21:43 +0000</pubDate>
		<dc:creator>thiago.arrais</dc:creator>
				<category><![CDATA[gente]]></category>
		<category><![CDATA[linguagens]]></category>
		<category><![CDATA[tecnologia]]></category>

		<guid isPermaLink="false">http://blog.thiagoarrais.com.br/2008/10/09/voce-pode-ser-ruim-de-mil-maneiras/</guid>
		<description><![CDATA[Corre um boato novo dizendo que Rails é o novo ASP, mas isso não é exclusividade de Rails (nem de ASP): qualquer coisa pode ser o novo ASP, basta apresentá-la às pessoas erradas. Programadores ruins serão ruins usando qualquer tecnologia. Tecnologicamente falando, não há nada que se possa fazer para torná-los menos ruins. Não há [...]]]></description>
			<content:encoded><![CDATA[<p>Corre um boato novo dizendo que <a href="http://logbr.reflectivesurface.com/2008/10/07/rails-e-o-novo-asp/">Rails é o novo ASP</a>, mas isso não é exclusividade de Rails (nem de ASP): <em>qualquer coisa</em> pode ser o novo ASP, basta apresentá-la às pessoas erradas. Programadores ruins serão ruins usando qualquer tecnologia. Tecnologicamente falando, não há nada que se possa fazer para torná-los menos ruins. Não há como projetar uma tecnologia que os impeça de ser ruins. Não é com novas linguagens, bibliotecas ou frameworks que eles vão melhorar. Algo que talvez ajude são idéias novas, mas eles precisam estar abertos a elas. No fim das contas a transformação depende somente deles mesmos. Parece auto-ajuda mas é bem verdade.</p>
<p>Há basicamente duas maneiras de novas tecnologias influenciarem programadores ruins a escreverem software menos ruim. A primeira é tornar as boas práticas extremamente fáceis de modo que simplesmente pareçam o jeito natural de fazer as coisas. A segunda é tomar o caminho contrário e tornar práticas ruins mais difíceis ou feias de se fazer. Pode-se usar algo como <a href="http://loudthinking.com/arc/2006_10.html">vinagre sintático</a> para fazer isso. O problema de tornar práticas não recomendadas mais feias é que os programadores ruins vão escrever o código feio <em>e ignorar completamente a feiúra</em>. Os olhos deles são incapazes de enxergar feiúra em um trecho de código. Se você quiser realmente seguir por este caminho, precisa dar um jeito de proibir por completo as asneiras mais gritantes.</p>
<p>Mas só é possível enxergar as mais gritantes.</p>
<p>Mesmo que você consiga evitar os piores erros, surgirão novas idéias igualmente burras. Você pode tentar bloquear essas também e continuar tentando proteger as pessoas delas mesmas até um certo ponto. Mas infelizmente não é possível proibir um idiota de estragar tudo. Os idiotas <em>precisam</em> estragar tudo. É a natureza deles. É isso que os define. É por isso que eles são chamados de idiotas. Não importa quantas <a href="http://blog.thiagoarrais.com.br/2007/06/21/bolas-de-chumbo/">bolas de chumbo</a> você amarre aos pés deles, os verdadeiros idiotas vão <em>arrumar</em> um jeito de fazer besteira. Se sua tecnologia resolver seguir por este caminho, vai precisar proibir tanta coisa e ficar tão limitada que só os tapados serão atraídos. Aqueles que sabem o que estão fazendo simplesmente não aceitam trabalhar acorrentados.</p>
<p>Já que o caminho da proibição não é tão promissor, é melhor explorar a alternativa: tornar o &#8220;certo&#8221; idioticamente fácil. Desse modo, os bons profissionais serão atraídos pela elegância das soluções e vão começar a falar sobre a sua tecnologia. Com o burburinho todo mundo vai querer dar uma olhada nesse novo negócio de que os caras da moda andam falando tanto. As idéias ruins serão contidas por algum tempo, mas há um efeito indesejável que você não vai conseguir evitar.</p>
<p>Este <a href="http://logbr.reflectivesurface.com/2008/01/16/o-efeito-asp/">efeito</a> está intimamente ligado à <a href="http://blog.thiagoarrais.com.br/2008/08/26/a-maldicao-da-popularidade/">maldição da popularidade</a>. Mais popularidade significa mais gente e mais gente significa mais gente <em>tapada</em>. Sua tecnologia preferida simplesmente não pode conseguir se tornar popular e só atrair gênios da computação, eles não são muitos. Para ser popular ela vai precisar dos idiotas. E os idiotas têm um talento natural para estragar as coisas, lembra? Se você quiser ter uma tecnologia amplamente difundida, vai precisar aceitar que ela se torne o novo ASP. Não tem jeito.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.thiagoarrais.com.br/2008/10/09/voce-pode-ser-ruim-de-mil-maneiras/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>4 respostas sobre controle de versão distribuído</title>
		<link>http://blog.thiagoarrais.com.br/2008/09/15/4-respostas-sobre-controle-de-versao-distribuido/</link>
		<comments>http://blog.thiagoarrais.com.br/2008/09/15/4-respostas-sobre-controle-de-versao-distribuido/#comments</comments>
		<pubDate>Mon, 15 Sep 2008 20:32:54 +0000</pubDate>
		<dc:creator>thiago.arrais</dc:creator>
				<category><![CDATA[controle de versão]]></category>
		<category><![CDATA[tecnologia]]></category>

		<guid isPermaLink="false">http://blog.thiagoarrais.com.br/2008/09/15/4-respostas-sobre-controle-de-versao-distribuido/</guid>
		<description><![CDATA[Entre idas e vindas de servidores, domínios e engines, já faz quase três anos que este blog existe. Em todo este tempo ainda não fiz nenhum texto com um título do tipo &#8220;10 razões para usar Emacs ao invés de Vi&#8221; que parece ser tão comum nesse mundo. Isso precisava mudar e meu texto anterior [...]]]></description>
			<content:encoded><![CDATA[<p>Entre idas e vindas de servidores, domínios e engines, já faz quase três anos que este blog existe. Em todo este tempo ainda não fiz nenhum texto com um título do tipo &#8220;10 razões para usar Emacs ao invés de Vi&#8221; que parece ser tão comum nesse mundo.</p>
<p>Isso precisava mudar e meu <a href="http://blog.thiagoarrais.com.br/2008/07/23/por-um-controle-de-versao-menos-insano/">texto anterior</a> sobre controle de versão parece ter servido como a desculpa perfeita. Surgiram algumas perguntas e observações nos comentários que me parecem ser bem freqüentes e resolvi compilar as perguntas e as respostas em um texto no formato 10-mais. As perguntas estão parafraseadas aqui e não foram necessariamente redigidas assim originalmente.</p>
<p>Vamos às questões:</p>
<h4>Como as empresas podem usar sistemas distribuídos e ainda ter controle sobre seu código fonte?</h4>
<p>Entendo a suposta necessidade das organizações de manter um controle rígido e centralizado do código-fonte. É bem verdade que muitas vezes elas fazem isso não tanto por necessidade, mas simplesmente por teimosia ou pela boa e velha força do hábito (também conhecida como inércia corporativa), mas admitamos que seja o caso de realmente haver a necessidade de um local central para se chamar de oficial.</p>
<p>Elas poderiam não usar nenhum sistema de controle de versão e ainda ter controle sobre o código. Basta dizer aos programadores que o código só deverá ser considerado pronto quando for enviado para determinado local. Este local pode ser um repositório de controle de versão centralizado, mas também pode ser um site FTP, um compartilhamento de rede qualquer ou um pendrive na mesa do chefe. Não importa.</p>
<p>A centralização do local de publicação oficial não exige a centralização do sistema de versionamento. Se as empresas simplesmente exigissem que as equipes disponibilizassem o código em algum lugar acessível dentro da rede interna, os programadores poderiam escolher qualquer método que quisessem para controlar suas modificações. Eles poderiam transferir arquivos de máquina em máquina ou guardar diffs manualmente, mas eu poderia apostar que a maioria deles optaria por um sistema de controle de versão qualquer. Muitas empresas não deixam a equipe escolher sozinha por preferir investir menos no processo de seleção dos funcionários e simplesmente assumir posteriormente que todos são tapados incapazes de limpar o próprio nariz. Quando todo mundo é idiota, é melhor minimizar os graus de liberdade para evitar que eles acabem colocando o dedo na tomada. É melhor exigir que todo mundo use exatamente os mesmos procedimentos e ferramentas. Mas esta é uma questão para um texto futuro.</p>
<p>Não há nada impedindo que os sistemas distribuídos de hoje sejam usados de forma centralizada. A equipe pode muito bem escolher um local para chamar de central e oficial. Eles <em>podem</em> fazer isso, mas não são <em>obrigados</em>. A questão é que há limitações que os sistemas centralizados têm que os distribuídos não têm. Não manter histórico das alterações das cópias de trabalho locais e exigir acesso de rede para commitar são só duas delas&#8230;</p>
<h4>Como o controle de patches facilita os merges? Se há conflitos, eles precisam ser tratados independentemente do modelo de controle de versão adotado&#8230;</h4>
<p>Se duas pessoas estão trabalhando no mesmo trecho de código, os conflitos certamente serão os mesmos não importa qual o sistema de controle de versão que usem. Neste caso, elas provavelmente precisam reestruturar o código para evitar pisar nos pés uma da outra. O controle de patches faz uma diferença maior quando os merges precisam ser feitos periodicamente.</p>
<p>O controle de versão por patches (e aí não estou necessariamente falando de controle distribuído, como mostra o <a href="http://blog.thiagoarrais.com.br/2008/07/23/por-um-controle-de-versao-menos-insano/">texto anterior</a>) evita que você precise lembrar quais as modificações que você já integrou. Um bom exemplo é quando você está fazendo merges sucessivos, como no caso do branch de desenvolvimento que precisa incorporar as modificações feitas no branch de conserto de bugs. Com controle de patches, você pode derivar uma base de código qualquer, fazer modificações locais e incorporar de tempos em tempos as modificações feitas no código original com muito menos dor de cabeça. Você não precisa se lembrar de que ponto do código original começou, nem até onde foi seu último merge. Desde que possua todas as modificações que o repositório original tem, você está atualizado.</p>
<h4>Na média os usuários não querem colaborar. Eles contornam o sistema de controle de versão, compartilham código por outros meios e fazem todo tipo de porcaria.</h4>
<p>Mais um argumento a favor dos sistemas distribuídos. Dessa vez não só dos não-seqüenciais, mas dos verdadeiramente distribuídos mesmo. A razão das pessoas estarem compartilhando código fora do controle de versão muitas vezes é o fato do código simplesmente não estar pronto para ser publicado. Ele não pode ir para o repositório central ainda, mas não é por isso que deve deixar de ser compartilhado.</p>
<p>Digamos que estou trabalhando em algum tipo de reestruturação extensiva. Para fazer essa reestruturação, eu preciso deixar alguns testes falhando por algum tempo. Eu sei que, quando terminar, os testes vão voltar a passar, mas precisam ficar quebrados enquanto eu termino. Qualquer reestruturação deste tipo pode ser sub-divida em pequenos objetivos. Portanto, faz sentido registrar alguns marcos parciais. Porém, se o sistema é centralizado, eu não posso fazer isso para não atrapalhar meus colegas. Minha única alternativa passa a ser bifurcar a base de código por algum tempo até que eu consiga terminar a reestruturação. Posso fazer isso por meio de branches ou nem usar o controle de versão e compartilhar código pela rede interna de algum outro modo.</p>
<p>Enquanto estou fazendo essa reestruturação, pode ser que você precise de algumas modificações que eu fiz. É em horas como essas que o pessoal começa a compartilhar código pela rede, fazer merge manual e usar de uma imaginação incrível para contornar as limitações do sistema. Com controle distribuído, cada desenvolvedor tem um ou mais repositórios próprios &#8212; essencialmente branches pessoais &#8212; que, em termos de recursos de versionamento, não deixam nada a desejar em relação ao repositório central. Se você precisa das minhas alterações, você simplesmente as importa diretamente do meu repositório. Não precisamos usar o repositório central como local de troca se não quisermos. Desse modo só nós dois precisamos lidar com aqueles testes falhando, e não a equipe toda.</p>
<h4>Programadores ruins gostam de empurrar mouse e precisam de interfaces gráficas intuitivas. Nem todas equipes são bem capacitadas.</h4>
<p>Sobre interface gráficas, este não é um problema inerente à distribuição e pode ser resolvido. Na verdade, eu acredito que já venha sendo resolvido. Eu particularmente não tenho problemas para trabalhar na linha de comando, portanto nem chego a procurar esse tipo de front-end. Então não posso dizer com toda a certeza que este problema não existe, mas provavelmente já deve estar bem perto de ser eliminado.</p>
<p>Interfaces intuitivas certamente beneficiam a todos &#8212; aos rock-stars também &#8212; e devem ser uma busca constante. Mas se uma equipe é pouco capacitada, pode acreditar que a falta de interfaces gráficas não é o maior dos problemas.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.thiagoarrais.com.br/2008/09/15/4-respostas-sobre-controle-de-versao-distribuido/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Por um controle de versão menos insano</title>
		<link>http://blog.thiagoarrais.com.br/2008/07/23/por-um-controle-de-versao-menos-insano/</link>
		<comments>http://blog.thiagoarrais.com.br/2008/07/23/por-um-controle-de-versao-menos-insano/#comments</comments>
		<pubDate>Wed, 23 Jul 2008 19:49:39 +0000</pubDate>
		<dc:creator>thiago.arrais</dc:creator>
				<category><![CDATA[controle de versão]]></category>
		<category><![CDATA[tecnologia]]></category>

		<guid isPermaLink="false">http://blog.thiagoarrais.com.br/2008/07/23/por-um-controle-de-versao-menos-insano/</guid>
		<description><![CDATA[Recentemente encontrei um texto do Jeff Atwood sobre a instalação do Subversion. Ele tem alguns argumentos bastante interessantes sobre controle de versão (sempre use controle de versão, faça modificações pequenas e blá, blá, blá&#8230;) que me parecem em geral bastante acertados, mas uma coisa me chamou a atenção: por que um programador (que pelo menos [...]]]></description>
			<content:encoded><![CDATA[<p>Recentemente encontrei <a href="http://www.codinghorror.com/blog/archives/001093.html">um texto</a> do Jeff Atwood sobre a instalação do Subversion. Ele tem alguns argumentos bastante interessantes sobre controle de versão (sempre use controle de versão, faça modificações pequenas e blá, blá, blá&#8230;) que me parecem em geral bastante acertados, mas uma coisa me chamou a atenção: por que um programador (que pelo menos parece) tão bem informado quanto ele ainda escolhe um sistema de controle de versão tão completamente insano quando já existem tantas alternativas mais naturais para qualquer ser humano?</p>
<p>A maioria dos sistemas da velha guarda incrementa algum tipo de contador para identificar cada versão do objeto controlado: o Subversion, por exemplo, gera números de revisão quando há modificações em alguma parte da árvore de diretórios e o CVS associa um identificador seqüencial a cada um dos arquivos controlados. O maior problema do versionamento seqüencial é que simplesmente não controla o que queremos que controle. Saber quantas vezes um item qualquer foi modificado é útil, mas não tão útil quanto saber <em>quais</em> foram as modificações e, ainda melhor, <em>quais as dependências</em> entre elas. Sim, é bastante interessante saber qual o estado final de um trecho de código após um certo número de transformações, mas me interessa muito mais saber o que cada uma dessas modificações faz e tratar <em>as modificações</em> como objeto de trabalho, não os <em>resultados</em> delas.</p>
<p>Mais do que quantas modificações aconteceram desde algum ponto qualquer do tempo, eu preciso saber se a segunda modificação pode ser aplicada sem a primeira, se a terceira é uma inversão da primeira ou se a quinta desfaz algumas coisas que a quarta fez. As respostas para todas estas perguntas são necessárias para a operação <em>mais fundamental</em> do controle de versão: o merge.</p>
<p>Quando o Subversion surgiu, lá pelos idos de 2004, um de seus maiores argumentos era o branch barato. Este com certeza é um bom recurso para se ter, afinal de contas derivações precisam ser criadas o tempo todo. Mas o que queremos mesmo é que o merge seja fácil. O branch é só o começo da história. O merge é o ponto alto do processo, é quando as contribuições dos vários envolvidos são combinadas e passam a (pelo menos tentar) funcionar em conjunto. Há uma <a href="http://www.youtube.com/watch?v=4XpnKHJAok8">palestra</a> em que Linus Torvalds resume isto muito bem em algumas poucas palavras: &#8220;branches são completamente inúteis, a não ser que você faça o merge&#8221;. Só que o versionamento seqüencial pára no branch e o merge precisa ser feito de forma manual porque o sistema não enxerga as dependências entre as alterações, só sabe qual delas aconteceu antes ou depois. Você pode conseguir ajuda para comparar duas versões do mesmo conteúdo, mas é você quem tem que saber <em>quais</em> devem ser as duas versões para este merge em particular que você quer fazer. A coisa fica ainda mais complicada quando você precisa importar modificações de outro branch periodicamente. Quando, por exemplo, seu projeto tem um branch estável em que só se faz conserto de bugs e outro &#8212; ou outros &#8212; em que são desenvolvidos novos recursos e que precisa receber as mesmas modificações que o estável para se manter livre de bugs. As pessoas acabam desenvolvendo algumas <a href="http://svnbook.red-bean.com/en/1.4/svn.branchmerge.copychanges.html#svn.branchmerge.copychanges.bestprac">soluções arcanas</a> para controlar manualmente quais alterações já foram aplicadas a quais linhas de desenvolvimento, coisa que o sistema de controle de versão podia (e deveria) fazer sem precisar de babá.</p>
<p>Os identificadores seqüenciais precisam ser atribuídos por algum tipo de servidor central. Não podem ser determinados por máquinas diferentes para evitar conflitos de nomes e acabam sendo completamente artificiais porque refletem simplesmente a ordem em que o servidor recebeu as alterações. Para a maioria das alterações, a ordem de aplicação pouco importa. E quando ela importa, os sistemas com versionamento seqüencial não costumam ajudar.</p>
<p>A alternativa ao controle seqüencial é o controle de patches (termo que admito estar inventando agora, então não deve ser muito preciso e provavelmente você vai encontrar isto com outro nome por aí). Um sistema de controle de patches associa um identificador a uma modificação, não ao resultado dela como os de controle seqüencial. Uma versão qualquer é simplesmente um acumulado de modificações que, quando combinadas, determinam um resultado final.</p>
<p>Sistemas seqüenciais são necessariamente centralizados. Não há como decidir qual o número para a próxima versão se não houver uma autoridade central para controlar a numeração. Porém, o inverso não é verdadeiro. Isto é, sistemas baseados em controle de patches não precisam ser distribuídos. A maioria dos que encontramos realmente é, mas não precisavam ser. A questão é que eles podem ser muito bem usados como sistemas centralizados, mas já tem tudo que precisam para serem distribuídos e independentes de um servidor central. Então porque se limitar? Além de poderem fazer tudo que os centralizados conseguem, os sistemas distribuídos ainda costumam ser muito mais fáceis de instalar. Se o Atwood tivesse escolhido um deles, não precisaria nem escrever um tutorial de instalação para si próprio. Era só escolher inicializar um diretório qualquer como repositório e começar a versionar o que quisesse. Sem serviços. Sem nomes de usuário. Sem senhas. Sem dores de cabeça com o firewall.</p>
<p>Minha impressão é que o funcionamento dos sistemas distribuídos de hoje é muito mais parecido com o modo como naturalmente pensamos do que o dos centralizados. Quando quisesse combinar duas linhas de trabalho distintas eu deveria apenas dizer a meu sistema que quero combinar as modificações que eu tenho com as que meu colega tem e ele deveria ser capaz de fazer isso sozinho (assumindo que não haja conflitos complicados). Eu não deveria precisar criar marcadores artificiais e manter manualmente um histórico de quais alterações dele eu já tenho. Por que algumas vezes ainda insistimos em usar sistemas centralizados? Há alguma vantagem oculta neles ou o quê?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.thiagoarrais.com.br/2008/07/23/por-um-controle-de-versao-menos-insano/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>O que diabos é AGPL?</title>
		<link>http://blog.thiagoarrais.com.br/2008/05/13/o-que-diabos-e-agpl/</link>
		<comments>http://blog.thiagoarrais.com.br/2008/05/13/o-que-diabos-e-agpl/#comments</comments>
		<pubDate>Tue, 13 May 2008 17:51:10 +0000</pubDate>
		<dc:creator>thiago.arrais</dc:creator>
				<category><![CDATA[software livre]]></category>
		<category><![CDATA[tecnologia]]></category>

		<guid isPermaLink="false">http://blog.thiagoarrais.com.br/2008/05/13/o-que-diabos-e-agpl/</guid>
		<description><![CDATA[A menos que você tenha passado os últimos dez anos preso em uma caverna em um planeta distante com os olhos e ouvidos vendados, deve pelo menos já ter ouvido falar da General Public License, a famigerada GPL. Ela (ainda) deve ser a licença mais usada no mundo para distribuir software livre e suas condições [...]]]></description>
			<content:encoded><![CDATA[<p>A menos que você tenha passado os últimos dez anos preso em uma caverna em um planeta distante com os olhos e ouvidos vendados, deve pelo menos já ter ouvido falar da General Public License, a famigerada GPL. Ela (ainda) deve ser a licença mais usada no mundo para distribuir software livre e suas condições são bastante simples:</p>
<ol>
<li>Você tem acesso ao código-fonte do programa que está executando e pode fazer basicamente qualquer coisa com ele;</li>
<li>Você pode inclusive modificar o programa, mas se quiser fazer isso precisa distribuí-lo sob os mesmos termos.</li>
</ol>
<p>O sistema é bem elegante: você pode modificar os programas que recebe e/ou redistribuí-los sem modificação, mas deve oferecer a quem receber o programa de você os mesmos direitos que você recebeu. Isso garante que toda melhoria esteja disponível para todos os interessados e acaba criando comunidades em torno de uma peça de software. Claro que o <a href="http://www.gnu.org/licenses/gpl.txt">texto completo</a> da licença é bastante extenso, afinal de contas precisa incluir todo o advoguês para cobrir os casos limite e garantir que ninguém perca nenhum desses direitos no meio do caminho, mas a idéia é basicamente esta.</p>
<p>Porém há um detalhe bastante sutil neste esquema todo. Com a GPL, as pessoas precisam ter acesso ao código-fonte dos programas <em>que estão executando</em>. No caso de programas acessados através de uma interface de rede qualquer quem executa o código é uma máquina remota. Os usuários que acessam a aplicação de outras máquinas numa rede não podem ver o código-fonte e o dono do servidor pode modificar o programa o quanto quiser sem precisar distribuir o código-fonte. Afinal de contas, tecnicamente é só ele e mais ninguém que <em>executa</em> o programa. É completamente legal, por exemplo, que alguém baixe a versão 0.6.10 do <a href="http://www.motiro.org">Motiro</a>, faça algumas modificações locais e sirva a aplicação para quem quiser usá-la sem ver o código-fonte correspondente.</p>
<p>As aplicações web, como o Motiro, são certamente o exemplo mais óbvio de onde este detalhe pode ser explorado para subverter as intenções iniciais do autor e, como parece que tudo atualmente está indo parar na web, ele ficou bastante evidente. Também é importante notar que é bem possível que o autor realmente <em>quisesse</em> deliberadamente permitir este uso, mas vou deixar esta discussão para outro dia. No caso do autor que quer que todos os usuários possam estudar e contribuir com seu programa, o universo de colaboradores pode ser bastante reduzido se forem considerados usuários apenas os donos dos servidores.</p>
<p>Colocando de uma forma bastante grosseira (e abrindo espaço para quem quiser corrigir), a GPL considera que os usuários são as pessoas que detém as máquinas que executam os programas. Neste sentido, os usuários têm todos os seus direitos, inclusive o acesso ao código-fonte, garantidos. Porém, no caso das aplicações web, as pessoas que realmente <em>usam</em> os sistemas (tipicamente através de seus navegadores) não têm nenhum desses direitos.</p>
<p>Num mundo repleto de processamento distribuído onde a maioria das pessoas não sabe exatamente que computador está efetivamente <em>executando</em> os programas que elas usam, a distinção entre <em>executores</em> e <em>usuários</em> deixa de fazer tanto sentido. A GNU Affero General Public License é uma licença com texto baseado na GPL original (dê uma olhada no <a href="http://www.gnu.org/licenses/agpl.txt">texto completo</a> para saber os detalhes, eu não sou advogado) que tenta consertar esta brecha. A história da licença é bem complexa, mas se eu tivesse que resumir, diria que para a AGPL não importa se as pessoas estão executando um programa em um processador local e usando os sistemas através dos seus teclados e monitores ou se acessam um servidor através da Internet; não importa se elas estão executando o programa por conta própria ou se usam do serviço de hospedagem oferecido por outra pessoa, se puderem efetivamente <em>usar</em> um programa, são consideradas usuários e, como tal, devem ter acesso ao código-fonte.</p>
<p><em>(Uma observação relacionada: consegui permissão dos demais autores do Motiro para mudar a licença de distribuição e hoje publiquei a versão 0.6.11 do programa, agora sob AGPL. Se estiver precisando de um sistema para acompanhamento de projetos, considere usar o Motiro.)</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.thiagoarrais.com.br/2008/05/13/o-que-diabos-e-agpl/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Orientação a objeto, e daí?</title>
		<link>http://blog.thiagoarrais.com.br/2007/12/14/orientacao-a-objeto-e-dai/</link>
		<comments>http://blog.thiagoarrais.com.br/2007/12/14/orientacao-a-objeto-e-dai/#comments</comments>
		<pubDate>Fri, 14 Dec 2007 03:00:17 +0000</pubDate>
		<dc:creator>thiago.arrais</dc:creator>
				<category><![CDATA[gente]]></category>
		<category><![CDATA[tecnologia]]></category>

		<guid isPermaLink="false">http://blog.thiagoarrais.com.br/2007/12/14/orientacao-a-objeto-e-dai/</guid>
		<description><![CDATA[Não é tão incomum sugerir algo novo para um programador “orientado a objetos” e escutar alguma variante da velha frase “mas isso não vai de encontro a todas as noções conhecidas de orientação a objetos?”. Pode acontecer ao mostrar linguagens dinâmicas que permitem redefinição de métodos em tempo de execução, ao demonstrar as vantagens das [...]]]></description>
			<content:encoded><![CDATA[<p>Não é tão incomum sugerir algo novo para um programador “orientado a objetos” e escutar alguma variante da velha frase “mas isso não vai de encontro a todas as noções conhecidas de orientação a objetos?”. Pode acontecer ao mostrar linguagens dinâmicas que permitem redefinição de métodos em tempo de execução, ao demonstrar as vantagens das <em>closures</em> ou até ao introduzir interfaces fluentes. Você escolhe.</p>
<p>Não precisamos nem discutir o que diabos é orientação a objetos para notar que o termo está perdendo o sentido mais rápido do que um raio. Nenhum dos exemplos citados parecem ofender o meu conceito de orientação a objeto e também não vejo porque feririam o de ninguém. Para ser sincero, desde quando os objetos tornaram-se tão sagrados que não possam ser subvertidos um pouco de vez em quando? Apesar disso já vi este argumento ser usado em todos os três casos.</p>
<p>O ponto aqui não é que orientação a objetos não sirva para nada. Nem que o purismo deva ser evitado. Na verdade, o purismo pode ser bastante útil como ferramenta intelectual. Duvido, por exemplo, que muitos dos recursos interessantes introduzidos em Haskell surgissem se não houvesse um compromisso com a pureza da linguagem em termos de transparência referencial. O grande problema com a orientação a objeto não é o purismo.</p>
<p>É o sucesso.</p>
<p>Com a popularização na última década da orientação a objeto o termo se disseminou. Isso fez mal para ele porque quanto mais gente conhece um termo fracamente definido, maiores as chances de ser desvirtuado ou simplesmente usado sem sentido nenhum. Parece que orientação a objeto acabou virando argumento contra qualquer coisa e, como geralmente ninguém sabe a que definição o falante está se referindo, não sobram muitos contra-argumentos. Nas poucas vezes que uma discussão mais ou menos civilizada é possível, o resistente acaba não se convencendo de verdade. Seria melhor que as pessoas dissessem que não gostaram da idéia, mas “estou sendo apresentado a esta técnica agora, parece diferente de tudo que já vi, estou com medo e não quero avaliar melhor as alternativas” não parece tão profissional. Sobra para a velha e leal orientação a objetos.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.thiagoarrais.com.br/2007/12/14/orientacao-a-objeto-e-dai/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
