<?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>DestaqueBlog &#187; project euler</title>
	<atom:link href="http://weblog.destaquenet.com/tag/project-euler/feed/" rel="self" type="application/rss+xml" />
	<link>http://weblog.destaquenet.com</link>
	<description>Blog da equipe Destaquenet.</description>
	<lastBuildDate>Tue, 23 Nov 2010 17:06:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Programação Funcional: vale a pena aprender?</title>
		<link>http://weblog.destaquenet.com/2009/06/16/programacao-funcional-vale-a-pena-aprender/</link>
		<comments>http://weblog.destaquenet.com/2009/06/16/programacao-funcional-vale-a-pena-aprender/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 19:32:54 +0000</pubDate>
		<dc:creator>Daniel Martins</dc:creator>
				<category><![CDATA[Português]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[clojure]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[programação funcional]]></category>
		<category><![CDATA[project euler]]></category>
		<category><![CDATA[projeto]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://weblog.destaquenet.com/?p=511</guid>
		<description><![CDATA[Antes de começar com Python, eu não conhecia praticamente nada sobre Programação Funcional. Para falar a verdade, eu até achava que os paradigmas Funcional e Procedural eram a mesma coisa pelo fato do segundo se basear em funções métodos (e &#8230; <a href="http://weblog.destaquenet.com/2009/06/16/programacao-funcional-vale-a-pena-aprender/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Antes de começar com <a href="http://python.org">Python</a>, eu não conhecia praticamente nada sobre <a href="http://en.wikipedia.org/wiki/Functional_programming">Programação Funcional</a>. Para falar a verdade, eu até achava que os paradigmas Funcional e <a href="http://en.wikipedia.org/wiki/Procedural_programming">Procedural</a> eram a mesma coisa pelo fato do segundo se basear em <span style="text-decoration: line-through;">funções</span> métodos (e várias pessoas com as quais eu convivo e trabalho também têm esse equívoco). Felizmente, tudo começou a fazer sentido quando aprendi, graças ao Python, coisas  como <a href="http://docs.python.org/library/functions.html#map"><code>map()</code></a>, <a href="http://docs.python.org/library/functions.html#reduce"><code>reduce()</code></a>, <a href="http://docs.python.org/library/functions.html#filter"><code>filter()</code></a>, <a href="http://docs.python.org/tutorial/classes.html#generators">generators</a> e <a href="http://docs.python.org/tutorial/datastructures.html#list-comprehensions">list comprehensions</a>.</p>
<p>Como o mercado é dominado por linguagens imperativas, é bem difícil encontrar pessoas que realmente conheçam e utilizem linguagens funcionais com certa regularidade. Mas isso não significa, de forma alguma, que não há espaço para tais linguagens. Na verdade, a tendência é que elas ganhem cada vez mais espaço.</p>
<p><span id="more-511"></span></p>
<h3>Por que aprender uma linguagem funcional?</h3>
<p>Em linguagens imperativas, a programação de um <em>software</em> consiste basicamente na definição e manipulação de seu estado interno, conduzida de modo a resolver um determinado problema. Portanto, pode-se dizer que <em>softwares</em> escritos em tais linguagens são movidos a <em>efeitos colaterais</em>, pois a forma e a ordem com que seu estado interno é modificado é o que define o funcionamento do <em>software</em>.</p>
<p>Em <em>softwares</em> triviais isso não chega a ser um problema, mas quando falamos de <em>softwares</em> grandes e complexos, essa volatilidade complica, e muito, a vida de quem os desenvolve e os mantém.</p>
<p>Linguagens funcionais, por outro lado, são conhecidas por evitar efeitos colaterais ao máximo, e isso nos trás uma infinidade de vantagens. Assim como na matemática, executar uma função <em>f(x)</em> com o mesmo argumento <em>N</em> vezes produz <em>sempre</em> o mesmo resultado, e por isso:</p>
<ol>
<li>o código fica muito mais fácil de entender, debugar e testar. Tudo o que você precisa saber sobre uma função está nos seus argumentos;</li>
<li>o código, por também contar com estruturas de dados imutáveis, pode ser executado de forma concorrente, com poucas ou quaisquer modificações, e você nunca terá de se preocupar com locks, <a href="http://en.wikipedia.org/wiki/Race_condition">condições de corrida</a>, <a href="http://en.wikipedia.org/wiki/Deadlock">deadlocks</a> e coisas do tipo;</li>
<li>o compilador pode fazer otimizações impossíveis de serem feitas em linguagens imperativas, como automaticamente paralelizar ou reordenar chamadas a funções;</li>
</ol>
<p>Enfim, esse é só um resumo das vantagens que linguagens funcionais têm sobre linguagens imperativas. Confira os links no final deste post para saber mais.</p>
<h3>Escolhendo a linguagem</h3>
<p>Clojure, Erlang, Haskell, J, (Common) Lisp, Scheme. E essas são somente algumas das linguagens com forte base funcional disponíveis por aí.</p>
<p>Mas qual delas escolher? Cada pessoa segue um ritual diferente ao escolher uma nova ferramenta e por isso não sou eu quem irá te dizer qual delas escolher. O que eu posso fazer é dar algumas sugestões:</p>
<ul>
<li>Quer saber como tudo começou? Aprenda <a href="http://en.wikipedia.org/wiki/Common_Lisp">Common Lisp</a>.</li>
<li>Quer uma linguagem parecida com Lisp, mas que rode na JVM? <a href="http://clojure.org/">Clojure</a> pode ser uma boa.</li>
<li>Quer uma linguagem com uma sintaxe sucinta e poderosa? Dê uma olhada em <a href="http://www.jsoftware.com/">J</a>.</li>
<li>Quer uma linguagem que facilite a construção de <em>softwares</em> distribuídos e de alta disponibilidade? Vá de <a href="http://www.erlang.org/">Erlang</a>.</li>
<li><strong>Quer uma linguagem que mude a forma com que você pensa sobre programação? Aprenda qualquer uma delas!</strong></li>
</ul>
<p>Erlang e Haskell estão na minha mira mas, no momento, eu optei por aprender Clojure.</p>
<h3>Praticar é essencial</h3>
<p>Ok, escolhida a linguagem de programação, o próximo passo é ler muito e praticar mais ainda.</p>
<p>Para quem está interessado em aprender Clojure, material não falta. Apesar de bem nova (apenas 2 anos de existência), a linguagem vem ganhando popularidade e muito vêm sendo escrito sobre ela. Aliás, <a href="http://www.pragprog.com/titles/shcloj/programming-clojure">o primeiro livro sobre Clojure</a> foi publicado recentemente pela <a href="http://pragprog.com/">Pragmatic Bookshelf</a>. (Pode comprar sem medo, o livro é excelente)</p>
<p>Agora, independente da linguagem escolhida, uma forma interessante de aplicar os conhecimentos recém-adquiridos é tentar resolver os problemas propostos pelo <a href="http://projecteuler.net/">Project Euler</a>, um website com centenas de problemas do tipo <a href="http://projecteuler.net/index.php?section=problems&amp;id=12">&#8220;What is the value of the first triangle number to have over five hundred divisors?&#8221;</a>. No começo eu sofri um pouco para pegar as manhas da linguagem, mas depois de ter resolvido uns 10-15 problemas desse tipo, eu sinto que as coisas estão começando a fazer sentido.</p>
<p>Aos interessados, eu acabei de disponibilizar no Github <a href="http://github.com/danielfm/euler-clojure/tree/master">um projeto</a> contendo as soluções, todas em Clojure, para alguns dos problemas propostos.</p>
<h3>E vocês, o que recomendam?</h3>
<p>Depois de algumas semanas pesquisando sobre Programação Funcional, eu me sinto como se tivesse deixado de lado um vício: meio assustador no início, mas melhor a cada dia que passa!</p>
<p>Aos que já conhecem ou trabalham regularmente com linguagens funcionais, que dica vocês dão para quem acabou de tomar a <a href="http://en.wikipedia.org/wiki/Redpill">pílula vermelha</a>?</p>
<h3>Referências</h3>
<ul>
<li><a href="http://www.paulgraham.com/onlisp.html">On Lisp Book</a> (Obrigatório!);</li>
<li><a href="http://www.defmacro.org/ramblings/fp.html">Functional Programming For The Rest Of Us</a> (Obrigatório!);</li>
<li><a href="http://www2.computer.org/portal/web/computingnow/0609/whatsnew/cise">The Promises Of Functional Programming</a> (Atualização);</li>
<li><a href="http://www.pragprog.com/titles/shcloj/programming-clojure">Programming Clojure</a>;</li>
<li><a href="http://java.ociweb.com/mark/clojure/article.html">Clojure &#8211; Functional Programming for the JVM</a>;</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://weblog.destaquenet.com/2009/06/16/programacao-funcional-vale-a-pena-aprender/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

