<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4768685500899450550</id><updated>2012-01-10T20:06:53.437-02:00</updated><category term='ruby'/><category term='baby steps'/><category term='meme'/><category term='academia'/><category term='poesia'/><category term='olá mundo'/><category term='orientação a objetos'/><category term='nsi'/><category term='java'/><category term='aulas'/><category term='egotrip'/><category term='nsi tech talks'/><category term='coding dojo'/><category term='declínio e queda'/><category term='eventos'/><category term='ambiente de desenvolvimento'/><category term='tdd'/><category term='o blog'/><category term='agilismo'/><category term='leia isto'/><category term='testes de aceitação'/><title type='text'>programação radical</title><subtitle type='html'>desenvolvimento de software em 360 graus</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://programacaoradical.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://programacaoradical.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Rodrigo Manhães</name><uri>http://www.blogger.com/profile/07484501729941538844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RLRRh1e3jng/TNEcmqordbI/AAAAAAAAAMs/rhr7nYZmupc/S220/foto.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4768685500899450550.post-7391835881972586209</id><published>2011-02-14T01:03:00.004-02:00</published><updated>2011-02-14T01:08:44.461-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='aulas'/><category scheme='http://www.blogger.com/atom/ns#' term='orientação a objetos'/><title type='text'>Um ambiente para praticar orientação a objetos (ou ActiveRecord sem Rails)</title><content type='html'>Estava pensando em um modo de fazer alunos praticarem orientação a objetos em projetos não triviais (e nestes, necessariamente haverá persistência) mas sem acabar perdendo o foco por causa de parafernálias de frameworks e ORMs. Como venho utilizando Ruby on Rails em projetos reais há algum tempo, pensei em juntar as duas coisas. Usar Rails em aulas de orientação a objetos, porém, seria excessivo e me faria desviar o foco e perder tempo explicando detalhes do framework (imagine o desastre que seria enfrentar dúvidas sobre roteamento ou view helpers em aulas de OO) e mais tempo ainda seria gasto com gems, setup, dependências nativas e outras coisas que não são de interesse direto de orientação a objetos.&lt;br /&gt;&lt;br /&gt;O grande lance é que para o objetivo eu não preciso do Rails inteiro, mas apenas do ActiveRecord. Como reutilização é tudo, antes de meter a mão na massa fui ver se alguém já havia se coçado com isto e encontrei &lt;a href="http://blog.aizatto.com/2007/05/21/activerecord-without-rails/"&gt;aqui&lt;/a&gt; um roteiro. No mesmo blog, suporte a &lt;a href="http://blog.aizatto.com/2007/05/27/activerecord-migrations-without-rails/"&gt;migrations&lt;/a&gt;. Assim, foi possível montar rapidamente um nanoframework para implementar domain models em Ruby. Disponibilizei a brincadeira no Github, sob o nome de &lt;a href="https://github.com/rodrigomanhaes/oorb"&gt;OORB&lt;/a&gt; (muito criativo, não?). Certamente há muito o que ser melhorado e, como era tudo basicamente configuração, não me incomodei em escrever testes. Já que o objetivo era preocupação zero com bancos de dados, o banco configurado é o SQLite3.&lt;br /&gt;&lt;br /&gt;A idéia é fazer tudo ser muito simples e rápido. Não há qualquer pretensão de que isto seja uma plataforma para escrever código para software real, mas simplesmente um ambiente simples para a prática de orientação a objetos, para além dos exercícios bobinhos de apenas uma ou duas classes, com acesso a persistência e tudo o mais que um modelo OO real teria. O &lt;a href="https://github.com/rodrigomanhaes/oorb/blob/master/README.rst"&gt;readme do projeto&lt;/a&gt; traz maiores detalhes de configuração e outras informações.&lt;br /&gt;&lt;br /&gt;Pretendo começar a utilizá-lo já neste semestre, assim que tiver resultados posto aqui.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4768685500899450550-7391835881972586209?l=programacaoradical.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacaoradical.blogspot.com/feeds/7391835881972586209/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4768685500899450550&amp;postID=7391835881972586209' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default/7391835881972586209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default/7391835881972586209'/><link rel='alternate' type='text/html' href='http://programacaoradical.blogspot.com/2011/02/um-ambiente-para-praticar-orientacao.html' title='Um ambiente para praticar orientação a objetos (ou ActiveRecord sem Rails)'/><author><name>Rodrigo Manhães</name><uri>http://www.blogger.com/profile/07484501729941538844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RLRRh1e3jng/TNEcmqordbI/AAAAAAAAAMs/rhr7nYZmupc/S220/foto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4768685500899450550.post-1969720003457688076</id><published>2011-01-04T18:00:00.004-02:00</published><updated>2011-01-04T18:13:35.626-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='meme'/><category scheme='http://www.blogger.com/atom/ns#' term='egotrip'/><category scheme='http://www.blogger.com/atom/ns#' term='ambiente de desenvolvimento'/><title type='text'>Meu ambiente de trabalho em 7 itens</title><content type='html'>Lá vou eu participar do meme de descrever o ambiente de trabalho em 7 itens:&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Sistema Operacional&lt;/h3&gt;&lt;br /&gt;Sou um felicíssimo usuário do &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; 10.10, sistema operacional que será trocado em breve, mais precisamente em abril deste ano, pelo Ubuntu 11.04.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Editor&lt;/h3&gt;&lt;br /&gt;&lt;a href="http://eclipse.org/"&gt;Eclipse Helios&lt;/a&gt; para Java. GEdit - devidamente tunado por &lt;a href="http://live.gnome.org/GeditPlugins"&gt;gedit-plugins&lt;/a&gt;, &lt;a href="https://github.com/gmate/gmate"&gt;gmate&lt;/a&gt; e &lt;a href="https://github.com/hugomaiavieira/batraquio"&gt;Batraquio&lt;/a&gt; - para todo o resto. Por "todo o resto" entenda-se mais de 95% do meu tempo atual, com Ruby, Python, JavaScript, HTML, HAML, CSS, LaTeX, RST, markdown, plain text e o que mais vier. Este texto, por sinal, está sendo escrito no GEdit. Hoje mesmo foi levantada uma discussão acerca de debugging na lista de discussão do (glorioso) &lt;a href="http://nsi.iff.edu.br"&gt;NSI&lt;/a&gt;. Bom, não há maneira mais, digamos, técnica de dizer isto, mas a verdade é que debugging simplesmente não me faz falta na imensa maioria das situações. Na minoria, coisas como o &lt;a href="http://docs.python.org/library/pdb.html"&gt;pdb&lt;/a&gt; do Python atendem muito bem. TDD e passos de bebê também são de grande ajuda para não se necessitar de IDEs superpoderosas.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Terminal&lt;/h3&gt;&lt;br /&gt;O terminal é onde passo boa parte do tempo, então ele precisa de duas coisas, ser eficiente e bonito. A eficiência do terminal é item de série (Linux rulz!) e a beleza é garantida por um fundo semitransparente, um &lt;a href="http://hltbra.blogspot.com/2010/05/prompt-colorido-e-com-git-branch.html"&gt;esquema de cores esperto&lt;/a&gt; e a &lt;a href="http://hltbra.blogspot.com/2010/05/prompt-colorido-e-com-git-branch.html"&gt;belíssima fonte Monaco&lt;/a&gt; (a única coisa que eu tinha inveja do Mac!).&lt;br /&gt;&lt;br /&gt;Além disto, uso algumas conveniências no prompt, como: &lt;a href="http://hltbra.blogspot.com/2010/05/prompt-colorido-e-com-git-branch.html"&gt;mostrar informações do Git caso o diretório corrente seja um repositório&lt;/a&gt;; &lt;a href="http://hugomaiavieira.com/2010/06/qual-versao-do-ruby-estou-usando.html"&gt;mostrar a versão e a gemset do RVM&lt;/a&gt; sendo utilizadas correntemente, caso exista alguma; e o Python virtual do &lt;a href="http://hltbra.blogspot.com/2010/05/gerenciando-ambientes-virtuais-e.html"&gt;virtualenvwrapper&lt;/a&gt; sendo utilizado, também caso exista.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Browser&lt;/h3&gt;&lt;br /&gt;Firefox, Chrome, Opera para validar layouts, Seamonkey para a maioria do lixo que "só funciona no IE", Firefox (com Firebug e Web Developer) para todo o resto. Atualmente, eu não preciso validar layouts no IE, portanto não tenho configuração para isto.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Software&lt;/h3&gt;&lt;br /&gt;TweetDeck, Exaile, K3B, Gimp, Skype, Google Talk, VLC. Por sinal, procuro um bom cliente Twitter que não use Adobe Air, que não exija o Chrome e que não seja o Echofon. Sugestões?&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Código-fonte&lt;/h3&gt;&lt;br /&gt;Git, óbvio. E Subversion para projetos que ainda o utilizam.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Música&lt;/h3&gt;&lt;br /&gt;Uso o Exaile como player, sempre com fone de ouvido, e - se eu não estiver sozinho - com um dos fones um pouco fora do ouvido para sacar o ambiente e ouvir as conversas. Normalmente escuto música brasileira (rock, indie, regional), metal (grindcore, death metal, crossover, hardcore) e coisas estranhas em geral (experimental, math metal, misturebas e por aí vai). Não ouço música, porém, o tempo inteiro. Ouvir ou não e, quando ouço, o tipo de música, dependem do tipo de trabalho, do meu grau de concentração no momento e do ambiente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;E você, fala um pouco do seu ambiente aí!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4768685500899450550-1969720003457688076?l=programacaoradical.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacaoradical.blogspot.com/feeds/1969720003457688076/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4768685500899450550&amp;postID=1969720003457688076' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default/1969720003457688076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default/1969720003457688076'/><link rel='alternate' type='text/html' href='http://programacaoradical.blogspot.com/2011/01/meu-ambiente-de-trabalho-em-7-itens.html' title='Meu ambiente de trabalho em 7 itens'/><author><name>Rodrigo Manhães</name><uri>http://www.blogger.com/profile/07484501729941538844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RLRRh1e3jng/TNEcmqordbI/AAAAAAAAAMs/rhr7nYZmupc/S220/foto.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4768685500899450550.post-1183065575899405322</id><published>2010-12-26T18:30:00.008-02:00</published><updated>2011-04-07T10:41:10.027-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='testes de aceitação'/><title type='text'>Rodando testes offline com Selenium e Firefox</title><content type='html'>O Firefox tem um curioso "recurso" que consiste em colocar o browser em modo "offline" quando o computador se desconecta da rede. Isto se torna um pequeno estorvo quando, por exemplo, se está fora da rede e acessando uma aplicação web local e acaba sendo necessário desmarcar a opção "Work offline". Enfim, todo mundo que usa Firefox e desenvolve para a web já deve ter passado por isto. Até aí, nada demais. O "pequeno estorvo", porém, torna-se um problema real quando se utiliza Selenium com Firefox com o computador desconectado. Aparentemente, &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/13152/"&gt;isto aqui&lt;/a&gt; resolve o problema, que também é possível de ser resolvido manualmente a partir da versão 3.6 do Firefox &lt;a href="http://lifehacker.com/5714560/stop-firefox-from-automatically-entering-work-offline-mode"&gt;setando uma variável oculta&lt;/a&gt; no Firefox, mas acabaria caindo no antipadrão "&lt;a href="http://www.codinghorror.com/blog/2007/03/the-works-on-my-machine-certification-program.html"&gt;works-on-my-machine&lt;/a&gt;", pois apenas o &lt;em&gt;meu&lt;/em&gt; Firefox funcionaria offline, quando o correto seria que qualquer máquina que rodasse as specs do projeto pudesse fazê-lo sem atropelos.&lt;br /&gt;&lt;br /&gt;Tive este problema inicialmente com o &lt;a href="https://github.com/jnicklas/capybara"&gt;Capybara&lt;/a&gt; (Ruby) e uma boa alma já havia &lt;a href="http://code.google.com/p/selenium/issues/detail?id=587#c3"&gt;postado a solução&lt;/a&gt;, reproduzida abaixo, que utiliza a API do Capybara para definir a variável &lt;code&gt;network.manage-offline-status&lt;/code&gt;, a tal "variável oculta" que citei no parágrafo anterior.&lt;br /&gt;&lt;pre class="prettyprint lang-ruby"&gt;&lt;br /&gt;class Capybara::Driver::Selenium&lt;br /&gt;  def self.driver&lt;br /&gt;    unless @driver&lt;br /&gt;      profile = Selenium::WebDriver::Firefox::Profile.new&lt;br /&gt;      profile['network.manage-offline-status'] = false&lt;br /&gt;      @driver = Selenium::WebDriver.for :firefox, :profile =&gt; profile&lt;br /&gt;      at_exit do&lt;br /&gt;        @driver.quit&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;    @driver&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Para aplicações Python, há até pouco tempo não tínhamos algo como o Capybara, até que outro grupo de boas almas, o &lt;a href="https://github.com/cobrateam"&gt;Cobrateam&lt;/a&gt;, formado pelos ex-colegas de &lt;a href="http://nsi.iff.edu.br"&gt;NSI&lt;/a&gt; &lt;a href="https://github.com/hugobr"&gt;Hugo Lopes&lt;/a&gt; e &lt;a href="https://github.com/nsigustavo"&gt;Gustavo Rezende&lt;/a&gt; e mais alguns membros da &lt;a href="http://globo.com"&gt;Globo.com&lt;/a&gt;, decidiram fazer algo semelhamnte para Python, o &lt;a href="https://github.com/cobrateam/splinter"&gt;Splinter&lt;/a&gt;. Apesar de ser um projeto bastante recente, o Splinter já é um ótimo substituto para boa parte das tarefas do dia-a-dia de quem escreve testes de aceitação. Porém, o Splinter não possui uma API para acessar detalhes e/ou configurar o browser utilizado. Assim, consegui resolver o problema fazendo um hack no Selenium.&lt;br /&gt;&lt;pre class="prettyprint lang-python"&gt;&lt;br /&gt;from selenium.firefox.firefox_profile import FirefoxProfile&lt;br /&gt;prefs = FirefoxProfile._get_webdriver_prefs()&lt;br /&gt;prefs['network.manage-offline-status'] = 'false'&lt;br /&gt;@staticmethod&lt;br /&gt;def prefs_func():&lt;br /&gt;    return prefs&lt;br /&gt;FirefoxProfile._get_webdriver_prefs = prefs_func&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Por sinal, o Splinter é um projeto muito legal, vale a pena dar uma olhada e ajudar, nem que seja só falando bem dele no seu blog, como eu fiz aqui :P  &lt;a href="http://railscasts.com/give_back"&gt;Give back to open-source&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Update (05/01/2011, 13h50m)&lt;/strong&gt;: &lt;a href="http://www.franciscosouza.com"&gt;Francisco Souza&lt;/a&gt; abriu um &lt;a href="https://github.com/cobrateam/splinter/issues/#issue/20"&gt;issue&lt;/a&gt; no &lt;a href="http://github.com/cobrateam/splinter"&gt;Splinter&lt;/a&gt; para uma API que possibilite customizar o perfil do Firefox no Webdriver, evitando - do ponto de vista do cliente do Splinter - o tipo de acesso de baixo nível mostrado aqui.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4768685500899450550-1183065575899405322?l=programacaoradical.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacaoradical.blogspot.com/feeds/1183065575899405322/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4768685500899450550&amp;postID=1183065575899405322' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default/1183065575899405322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default/1183065575899405322'/><link rel='alternate' type='text/html' href='http://programacaoradical.blogspot.com/2010/12/rodando-testes-offline-com-selenium-com.html' title='Rodando testes offline com Selenium e Firefox'/><author><name>Rodrigo Manhães</name><uri>http://www.blogger.com/profile/07484501729941538844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RLRRh1e3jng/TNEcmqordbI/AAAAAAAAAMs/rhr7nYZmupc/S220/foto.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4768685500899450550.post-3316765429807726024</id><published>2010-12-11T01:27:00.006-02:00</published><updated>2010-12-11T02:27:11.404-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='academia'/><category scheme='http://www.blogger.com/atom/ns#' term='agilismo'/><title type='text'>"Agile" nunca mais</title><content type='html'>Outro dia, em uma thread na lista de discussão do &lt;a href="http://nsi.iff.edu.br"&gt;núcleo de pesquisa&lt;/a&gt; onde trabalho (a.k.a. glorioso &lt;acronym title="Núcleo de Pesquisa em Sistemas de Informação"&gt;NSI&lt;/acronym&gt;), debatíamos a respeito de uma palestra apresentada na &lt;a href="http://agile2009.agilealliance.org/"&gt;Agile Conference 2009&lt;/a&gt;, chamada "&lt;a href="http://www.math.tau.ac.il/%7Eamiramy/SoftwareSeminar/agile09.ppt"&gt;Let's stop calling it 'agile'&lt;/a&gt;", em cujo resumo constava:&lt;blockquote&gt;Agile development has grown a lot since its rebeleous 2001 start. In fact, it has grown to be the mainstream way of developing software. The time has come to drop the word 'agile.' Agile development is just modern practices in software development. There is no need to explicitly mark practices as Agile. There is no need anymore for opposing camps. Keeping the word Agile and things like ""the Agile conference"" is holding the development of modern SW development practices back.&lt;/blockquote&gt;Ou, em português:&lt;blockquote&gt;O desenvolvimento ágil cresceu bastante desde seu início em 2001. De lá pra cá, se tornou o modo "mainstream" de desenvolver software. É chegada a hora de abandonar a palavra "ágil". Desenvolvimento ágil é tão-somente o uso de técnicas modernas no desenvolvimento de software. Não há necessidade de nomear explicitamente estas práticas como ágeis. Não há mais necessidade para campos opostos. Manter a palavra "ágil" e coisas como "a Conferência Ágil" é atrasar a evolução das práticas modernas de desenvolvimento de software.&lt;/blockquote&gt;&lt;br /&gt;Eu não fui primeiro no NSI a repercutir a conversa: o &lt;a href="http://twitter.com/ratembr"&gt;Rogério Atem&lt;/a&gt; já &lt;a href="http://eis-development.blogspot.com/2010/12/assorted-thoughts-on-agilism-x.html"&gt;falou sobre o assunto&lt;/a&gt; em seu &lt;a href="http://eis-development.blogspot.com/"&gt;blog&lt;/a&gt;. Com este post, quero apenas apresentar a discussão e oferecer meus dois centavos ao assunto. De cara, concordo plenamente com a ideia de que o termo "ágil" tem feito mais mal do que bem hoje em dia. Principalmente por ser relativamente fácil passar um verniz ágil em um projeto ("olha, estamos fazendo Scrum, temos daily meetings, post-its no vidro da janela, e agora o analista de sistemas se chama scrum master, tem até certificado"). Uma vez que está na moda ser "ágil", o modelo se prolifera como erva daninha. Mas isto é assunto para outro post.&lt;br /&gt;&lt;br /&gt;A discussão, inicialmente, era sobre o agilismo e a preponderância, na academia, de um estranho ente teórico-prático chamado "&lt;a href="http://blog.aspercom.com.br/2008/04/23/so-agilidade-funciona/"&gt;modelo tradicional&lt;/a&gt;". Minha opinião é de que a camada pensante do mundo tradicional é cada vez mais um grupo deslocado em um mundo que já não mais compreende. Imagino como estariam fora de lugar em qualquer bom evento de desenvolvimento de software envolvendo desenvolvedores militantes (i.e. que efetivamente desenvolvem software), como, por exemplo, o &lt;a href="http://www.devinrio.com.br/"&gt;Dev In Rio&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Vou tentar explicar melhor como eu vejo essa questão. A idéia de deixar a palavra "agile" de lado é simplesmente continuar vivendo a vida e trabalhando como se os métodos tradicionais fossem o que realmente são: uma etapa ultrapassada - e, hoje, sem qualquer sentido - da evolução da engenharia de software. &lt;br /&gt;&lt;br /&gt;Tenho tentado seguir isto hoje em dia e deixado discussões envolvendo "métodos tradicionais" apenas para contextos específicos como aulas de disciplinas universitárias de "Análise de Sistemas" (pois a própria estrutura das grades de cursos de graduação tem visivelmente inscrita a cascata). Ou então em discussões diretas com tradicionalistas. Fora destes contextos, procuro simplesmente sustentar que TDD/BDD é o modo considerado correto de se criar grande parte aplicações modernas, que integração contínua é condição necessária para a saúde de um projeto, que ubiquitous language é uma obrigação em qualquer projeto de software que queira ter sucesso, que código limpo é um requisito para qualquer programador digno do nome. Sem precisar citar que são técnicas "ágeis" ou qualquer coisa do tipo. E normalmente ignorando completamente o fato de que existe, ou existiu, alguma outra coisa. Tradicionalismo, só em história da engenharia de software, arqueologia, sei lá.&lt;br /&gt;&lt;br /&gt;Para quem está em ambientes modernos de desenvolvimento de software, tudo isto é chover no molhado, é o óbvio. Porém, a academia está muito longe disto, e é no "método tradicional" - o que quer que isto seja - que os estudantes ainda estão sendo educados.&lt;br /&gt;&lt;br /&gt;Assim, penso que o melhor a fazer é apresentar os conceitos tidos como "ágeis" simplesmente como o modo certo de fazer engenharia de software e não como técnicas alternativas ou coisa do tipo. E apresentar rapidamente o tradicionalismo (caso alguém o traga à discussão) simplesmente como um conjunto de ideias ligado a um contexto técnico que já passou (linguagens de baixo nível, computadores pouco poderosos, ambientes de desenvolvimento precários, extrema dificuldade ou impossibilidade de verificação automatizada, inexistência de controle de versão etc). Em nichos específicos, como por exemplo EIS, agile ainda é "alternativo". Mas no geral, não há mais porque continuarmos uma briga (pelo menos no campo simbólico) com um adversário que já morreu de velho. Tratar o tradicionalismo como um adversário é reconhecer-lhe um valor que já não tem mais.&lt;br /&gt;&lt;br /&gt;Let's stop calling it "agile"!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4768685500899450550-3316765429807726024?l=programacaoradical.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacaoradical.blogspot.com/feeds/3316765429807726024/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4768685500899450550&amp;postID=3316765429807726024' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default/3316765429807726024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default/3316765429807726024'/><link rel='alternate' type='text/html' href='http://programacaoradical.blogspot.com/2010/12/agile-nunca-mais.html' title='&quot;Agile&quot; nunca mais'/><author><name>Rodrigo Manhães</name><uri>http://www.blogger.com/profile/07484501729941538844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RLRRh1e3jng/TNEcmqordbI/AAAAAAAAAMs/rhr7nYZmupc/S220/foto.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4768685500899450550.post-7199326383125714192</id><published>2010-11-27T02:32:00.010-02:00</published><updated>2010-11-27T02:52:22.297-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='coding dojo'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><title type='text'>Mais sobre TDD e coding dojo</title><content type='html'>Um &lt;a href="http://www.aniche.com.br/2010/11/cuidado-com-seus-baby-steps/"&gt;post sobre o uso de baby steps em dojos&lt;/a&gt;, escrito pelo Mauricio Aniche, tem causado discussão. Eu &lt;a href="http://programacaoradical.blogspot.com/2008/10/passos-de-beb.html"&gt;escrevi&lt;/a&gt; sobre baby steps há algum tempo e concordo em gênero, número e grau com o post, mas há um ponto que ainda não vi ser tocado na comunidade.&lt;br /&gt;&lt;br /&gt;Eu tenho observado há alguns meses que algumas práticas do dojo andam meio que passando uma visão incorreta sobre TDD, e não é só por causa das cascatas de ifs. Nada melhor que exemplos para mostrar o que quero dizer. Em TDD/BDD/whatever no mundo real, ninguém vai escrever um teste:&lt;br /&gt;&lt;code class="prettyprint lang-ruby"&gt;it 'dois mais dois é igual a quatro' do&lt;br /&gt;   ...&lt;br /&gt;end&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;ou&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint lang-python"&gt;def test_quatro_nao_e_um_numero_feliz(self):&lt;br /&gt;    ...&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Nestes códigos, o nome do método é a expectativa. Em TDD, uma expectativa, é o resultado que se espera que ocorra na execução do teste, seja uma expectativa padrão como &lt;code class="prettyprint lang-python"&gt;order.clear |should| change(order.item_count).by(-3)&lt;/code&gt; ou uma verificação de mock como &lt;code class="prettyprint lang-ruby"&gt;MailService.should_receive(:send).with("sos@batcave.com")&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;O nome do método de teste (ou a sua descrição, no caso do RSpec) não é e nem pode ser a expectativa, pelo menos a se julgar pela literatura de TDD. O nome do método de teste é o nome de uma responsabilidade da classe (o "&lt;a href="http://blog.dannorth.net/introducing-bdd/"&gt;test method names should be sentences&lt;/a&gt;" que é tão enfatizado em BDD).&lt;br /&gt;&lt;br /&gt;O correto seria:&lt;br /&gt;&lt;code class="prettyprint lang-ruby"&gt;&lt;br /&gt;it 'soma dois números' do&lt;br /&gt;   ...&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;ou&lt;br /&gt;&lt;code class="prettyprint lang-python"&gt;&lt;br /&gt;def test_identifica_numeros_infelizes(self):&lt;br /&gt;    ...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Em todos os casos, o nome dos métodos é uma descrição abstrata - no sentido de não trazer exemplos concretos - e as expectativas com seus valores objetivamente verificáveis vêm no interior dos métodos de teste. Ou seja, em TDD, cada método de teste representa algo que a classe é capaz de fazer e não infinitas variações de valores passados a uma mesma funcionalidade. No fim das contas, a expectativa acaba sendo escrita duas vezes: uma vez no nome do método e outra na expectativa propriamente dita. A questão aqui não é o uso ou não de baby steps, mas uma formulação de testes que é conceitualmente diferente daquela utilizada na literatura de TDD.&lt;br /&gt;&lt;br /&gt;Veja um exemplo, do livro "&lt;a href="http://www.growing-object-oriented-software.com/"&gt;Growing Object-Oriented Software, Guided By Tests&lt;/a&gt;", de Steve Freeman e Nat Pryce (Addison-Wesley, 2009):&lt;br /&gt;&lt;code class="prettyprint lang-java"&gt;&lt;br /&gt;public class CatalogTest {&lt;br /&gt;    private final Catalog catalog = new Catalog();&lt;br /&gt;&lt;br /&gt;    @Test&lt;br /&gt;    public void containsAnAddedEntry() {&lt;br /&gt;        Entry entry = new Entry("fish", "chips");&lt;br /&gt;        catalog.add(entry);&lt;br /&gt;        assertTrue(catalog.contains(entry));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Test&lt;br /&gt;    public void indexesEntriesByName() {&lt;br /&gt;        Entry entry = new Entry("fish", "chips");&lt;br /&gt;        catalog.add(entry);&lt;br /&gt;        assertEquals(entry, catalog.entryFor("fish"));&lt;br /&gt;        assertNull(catalog.entryFor("missing name"));&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Neste código, os testes são:&lt;br /&gt;&lt;samp&gt;- contains an added entry&lt;br /&gt;- indexes entries by name&lt;/samp&gt;&lt;br /&gt;&lt;br /&gt;Ou seja, são responsabilidades abstratas e não exemplos concretos.&lt;br /&gt;&lt;br /&gt;Kent Beck, em seu cĺássico "&lt;a href="http://www.amazon.com/Test-Driven-Development-Kent-Beck/dp/0321146530"&gt;Test-Driven Development By Example&lt;/a&gt;" (Addison-Wesley, 2003), vai na mesma linha: seus testes na classe &lt;code&gt;Money&lt;/code&gt; que foi citada no post se chamam "multiplication", "equality", "currency". Ou seja, nada de "twoDollarsPlusThreeDollarsEqualFiveDollars".&lt;br /&gt;&lt;br /&gt;Outra referência de TDD que gosto bastante, "&lt;a href="http://www.manning.com/koskela/"&gt;Test Driven: TDD and Acceptance TDD for Java Developers&lt;/a&gt;", de Lasse Koskela (Manning, 2007), também segue a mesma ideia. Este livro, por sinal, tem disponiblizado o segundo capítulo para &lt;a href="http://www.manning-source.com/books/koskela/Chapter2Sample.pdf"&gt;download&lt;/a&gt;, contendo um excelente exemplo de baby steps que vale mesmo a pena ser lido. Neste exemplo, novamente, os testes são "unknownVariablesAreIgnored", "multipleVariables" ou "missingValueRaisesException". Novamente, nada de expectativas nos nomes dos testes.&lt;br /&gt;&lt;br /&gt;Certamente, não há "culpados" por isto, e também é provável que muitos não vejam assim tanto problema no que expus. Coding dojos são dinâmicos e não hierárquicos por definição, portanto evoluem e se alteram com o tempo e com o contato de diferentes pessoas. Assim, o "desvio" de TDD pode até não ser um problema em si, afinal o coding dojo é um jogo, mas temos que perceber que estamos praticando sob o nome de TDD uma coisa que não é exatamente TDD. E, na verdade, estamos praticando e aprendendo, uma vez que o coding dojo, pelo menos aqui no RJ, tem sido visto como ferramenta de aprendizado de programação. Quando o desenvolvedor está consciente que nos dojos é praticada uma variação do TDD, tudo bem. Porém, no caso de um iniciante, nós temos, sim, um problema, pois as pessoas vão aprender como TDD algo que poderia até mesmo ser considerado um antipattern.&lt;br /&gt;&lt;br /&gt;Talvez pelos problemas utilizados em dojos serem bastante simples, muitas vezes com apenas uma feature, a única forma de ter mais de um método de teste acaba sendo a fatoração das classes de teste por expectativas e não por features. Na verdade, não sei nem se isto é um problema para todo mundo. Pessoalmente, é algo que não gosto e que me incomoda, me soa como se o código estivesse pulando e gritando "ei, eu estou errado, você não está vendo?". Mas é o meu ponto de vista. E aí, qual é o seu?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4768685500899450550-7199326383125714192?l=programacaoradical.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacaoradical.blogspot.com/feeds/7199326383125714192/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4768685500899450550&amp;postID=7199326383125714192' title='14 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default/7199326383125714192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default/7199326383125714192'/><link rel='alternate' type='text/html' href='http://programacaoradical.blogspot.com/2010/11/mais-sobre-tdd-e-coding-dojo.html' title='Mais sobre TDD e coding dojo'/><author><name>Rodrigo Manhães</name><uri>http://www.blogger.com/profile/07484501729941538844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RLRRh1e3jng/TNEcmqordbI/AAAAAAAAAMs/rhr7nYZmupc/S220/foto.png'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4768685500899450550.post-8849111208759232662</id><published>2010-11-24T16:06:00.008-02:00</published><updated>2010-11-24T16:50:55.398-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nsi'/><category scheme='http://www.blogger.com/atom/ns#' term='eventos'/><title type='text'>Como foi o PythOnCampus IFF 2010</title><content type='html'>No dia 12/11/2010, realizou-se um &lt;a href="http://pythoncampus.iff.edu.br"&gt;PythOnCampus&lt;/a&gt; no IFF, em Campos dos Goytacazes/RJ. O evento, organizado por nós do &lt;a href='http://nsi.iff.edu.br'&gt;Núcleo de Pesquisa em Sistemas de Informação&lt;/a&gt; (NSI) do &lt;a href='http://iff.edu.br'&gt;Instituto Federal Fluminense&lt;/a&gt; (IFF), foi muito legal!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RLRRh1e3jng/TO1YSwqPtdI/AAAAAAAAANo/jS_HHb4mqls/s1600/DSCN1978-reduzida.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 384px; height: 288px;" src="http://2.bp.blogspot.com/_RLRRh1e3jng/TO1YSwqPtdI/AAAAAAAAANo/jS_HHb4mqls/s320/DSCN1978-reduzida.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5543183795685930450" /&gt;&lt;/a&gt;&lt;br /&gt;Apesar de ser uma sexta-feira véspera de feriadão, o evento contou com um bom público (e boa parte dele ficou lá até depois das 22 horas) e com minicursos bem legais e palestras de altíssimo nível. Pela manhã, três minicursos simultâneos começaram os trabalhos: "Utilizando OpenCV com Python", com Whanderley Souza (NSI), mostrou como a linguagem Python pode ser usada para trabalhar com visão computacional; em &lt;a href='http://www.slideshare.net/rodrigomanhaes/coisas-que-at-guido-duvida-metaprogramao-em-python'&gt;Coisas que até Guido duvida: Metaprogramação em Python&lt;/a&gt;, apresentei técnicas de metaprogramação usadas na construção do Should-DSL; e, como não poderíamos deixar de oferecer, &lt;a href='http://romulo-machado.blogspot.com/'&gt;Romulo Machado&lt;/a&gt; (NSI) apresentou &lt;a href='http://www.slideshare.net/romulomachado/getting-started-with-python'&gt;Getting Started with Python&lt;/a&gt;, uma introdução à linguagem para já ambientar os novatos no que estaria por vir.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RLRRh1e3jng/TO1ZdH3lHNI/AAAAAAAAANw/u2xPfWs5utc/s1600/DSCN2079-reduzida.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 480px; height: 360px;" src="http://1.bp.blogspot.com/_RLRRh1e3jng/TO1ZdH3lHNI/AAAAAAAAANw/u2xPfWs5utc/s400/DSCN2079-reduzida.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5543185073226194130" /&gt;&lt;/a&gt;&lt;br /&gt;À tarde, enquanto rolava um coding dojo liderado pelo Tarsis Azevedo e contando com as presenças dos palestrantes da noite Henrique Bastos e Rodolpho Eckhardt, aconteciam mais dois minicursos: "Aquecendo os motores com MongoEngine", por Vanderson "Argentino" Mota (Myfreecomm), mostrou na prática o uso de MongoDB com Python; e Rodrigo Pereira (COPPE/UFRJ) apresentava programação orientada a aspectos com Java (sim, Java!). Este minicurso seria do &lt;a href="http://citi2010.iff.edu.br"&gt;Circuito de Tecnologia da Informação&lt;/a&gt; do IFF, que aconteceu na mesma semana, mas devido a problemas de agenda só pode ser ministrado na sexta, sendo acolhido pela PythOnCampus. Todos os minicursos contaram com um ótimo público, tanto em número quanto em participação!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RLRRh1e3jng/TO1cEY5GC6I/AAAAAAAAAN4/wsxylV1-eAA/s1600/DSCN2105-reduzida.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_RLRRh1e3jng/TO1cEY5GC6I/AAAAAAAAAN4/wsxylV1-eAA/s400/DSCN2105-reduzida.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5543187946834103202" /&gt;&lt;/a&gt;&lt;br /&gt;Na parte da noite, &lt;a href='http://eis-development.blogspot.com'&gt;Rogério Atem&lt;/a&gt;, El Jefe do NSI, apresentou o evento e deu início às palestras, que foram um show à parte. Fabricio Barros (Centro Universitário São Camilo - ES) apresentou sua pesquisa em computação soberana que gerou uma implementação em Python, mostrando que a linguagem pode ir bem além do convencional. &lt;a href='http://henriquebastos.net'&gt;Henrique Bastos&lt;/a&gt; (PythonRio) abriu a cabeça do pessoal sobre valores e práticas ágeis e mostrou que desenvolvimento de software pode e deve ser sustentável. Gustavo Rezende (Globo.com) mostrou como é o desenvolvimento de software em uma grande empresa, no caso a Globo.com; &lt;a href='http://rhe.vg/'&gt;Rodolpho Eckhardt&lt;/a&gt; (Google) apresentou as novidades do Google App Engine para desenvolvedores Python; e &lt;a href="http://hltbra.blogspot.com"&gt;Hugo Lopes Tavares&lt;/a&gt; (Globo.com) apresentou Behaviour-Driven Development (BDD) e mostrou uma pilha de ferramentas BDD em Python desenvolvidas no NSI. No final, o Rogério fechou o evento conclamando a academia a se abrir ao novo em desenvolvimento de software, no que foi referendado pelo Henrique, que, aliás, deu uma declaração sobre o NSI que nos orgulhou a todos! Valeu mesmo!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RLRRh1e3jng/TO1dqfIF6ZI/AAAAAAAAAOA/z6mRQsMFxAE/s1600/galera-nsi.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 283px;" src="http://2.bp.blogspot.com/_RLRRh1e3jng/TO1dqfIF6ZI/AAAAAAAAAOA/z6mRQsMFxAE/s400/galera-nsi.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5543189700854278546" /&gt;&lt;/a&gt;&lt;br /&gt;Depois do evento, claro, a galera do NSI (atuais e ex) e mais Henrique e Rodolpho partimos direto pro &lt;a href="http://horaextra.org/"&gt;#horaextra&lt;/a&gt;. Sem falar que foi memorável reunir o pessoal todo: sabe lá quando vamos ter novamente um #horaextra com Hugo, Gustavo e Vanderson.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RLRRh1e3jng/TO1ebifw8FI/AAAAAAAAAOI/6kB_o-rRh5M/s1600/DSCN2231-reduzida.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_RLRRh1e3jng/TO1ebifw8FI/AAAAAAAAAOI/6kB_o-rRh5M/s400/DSCN2231-reduzida.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5543190543572463698" /&gt;&lt;/a&gt;&lt;br /&gt;O evento foi muito, mas muito legal! Ao público presente nas palestras e nos minicursos, muito obrigado por ser o principal ingrediente no sucesso do evento! Quem não participou, perdeu! Mas fique esperto porque ano que vem tem mais.&lt;br /&gt;&lt;br /&gt;Finalizando, gostaria de agradecer, em nome da organização do evento, a Henrique Bastos, Rodolpho Eckhardt, Fabrício Barros, Gustavo Rezende, Hugo Lopes e Vanderson Mota, que vieram a Campos só para o evento. Além disso, agradecer ao IFF pela estrutura e pelo suporte e ao pessoal do Circuito de Tecnologia da Informação (CITI) pela força e propaganda. Fora a galera do NSI que comprou a briga e participou da parada com vontade. Sem palavras para agradecer!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4768685500899450550-8849111208759232662?l=programacaoradical.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacaoradical.blogspot.com/feeds/8849111208759232662/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4768685500899450550&amp;postID=8849111208759232662' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default/8849111208759232662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default/8849111208759232662'/><link rel='alternate' type='text/html' href='http://programacaoradical.blogspot.com/2010/11/como-foi-o-pythoncampus-iff-2010.html' title='Como foi o PythOnCampus IFF 2010'/><author><name>Rodrigo Manhães</name><uri>http://www.blogger.com/profile/07484501729941538844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RLRRh1e3jng/TNEcmqordbI/AAAAAAAAAMs/rhr7nYZmupc/S220/foto.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_RLRRh1e3jng/TO1YSwqPtdI/AAAAAAAAANo/jS_HHb4mqls/s72-c/DSCN1978-reduzida.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4768685500899450550.post-1020742699366891931</id><published>2010-11-07T06:38:00.004-02:00</published><updated>2010-11-07T07:10:46.226-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eventos'/><title type='text'>Semana Cheia</title><content type='html'>Esta semana que se inicia neste domingo vai ser pequena pra tanto evento aqui na terra plana.&lt;br /&gt;&lt;br /&gt;Explico: teremos, de terça a quinta (9 a 11/11), o &lt;a href="http://citi2010.iff.edu.br/"&gt;6º Circuito de Tecnologia da Informação&lt;/a&gt; do IFF (Instituto Federal Fluminense). O evento está dividido em minicursos pela manhã, workshops acadêmicos à tarde e palestras à noite. Eu vou ministrar um minicurso de Ruby on Rails de terça a quinta (dividido em Ruby, Rails e BDD) e vou participar de um debate agilismo x engenharia de software tradicional na terça-feira às 17 horas. As palestras prometem ser de altíssimo nível, confira a &lt;a href="http://citi2010.iff.edu.br/programacao"&gt;programação&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Na sexta-feira (12/11), temos a &lt;a href="http://pythoncampus.iff.edu.br"&gt;PythOnCampus IFF&lt;/a&gt;, evento que estou organizando junto com os colegas do &lt;a href="http://nsi.iff.edu.br"&gt;NSI&lt;/a&gt;, um evento exclusivamente de Python, que ocorre periodicamente em diversos lugares. Neste vou ministrar um minicurso chamado "Coisas que até Guido duvida: Metaprogramação em Python". Para quem ficou boiando, "Guido" se refere a Guido Van Rossum, criador da linguagem Python. O nome, claro, é uma piada: não há nada que eu vá dizer que surpreenderia o sujeito que criou a linguagem, mas eu gostei do trocadilho e, afinal, marketing é tudo... :-P   &lt;br /&gt;&lt;br /&gt;O PythOnCampus terá minicursos de manhã e à tarde e palestras à noite, confira a &lt;a href="http://pythoncampus.iff.edu.br/programacao/"&gt;programação&lt;/a&gt;. Se as tarefas da organização permitirem, pretendo assistir ao minicurso de MongoEngine e participar do coding dojo à tarde. Mas duvido que consiga...&lt;br /&gt;&lt;br /&gt;Para completar, esta semana ainda tem Bienal do Livro aqui em Campos, mas sobre isto, se eu escrever algo, é assunto para meu &lt;a href="http://fanatismoindeciso.blogspot.com"&gt;outro blog&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4768685500899450550-1020742699366891931?l=programacaoradical.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacaoradical.blogspot.com/feeds/1020742699366891931/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4768685500899450550&amp;postID=1020742699366891931' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default/1020742699366891931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default/1020742699366891931'/><link rel='alternate' type='text/html' href='http://programacaoradical.blogspot.com/2010/11/semana-cheia.html' title='Semana Cheia'/><author><name>Rodrigo Manhães</name><uri>http://www.blogger.com/profile/07484501729941538844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RLRRh1e3jng/TNEcmqordbI/AAAAAAAAAMs/rhr7nYZmupc/S220/foto.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4768685500899450550.post-6275649429280346877</id><published>2010-11-03T06:27:00.007-02:00</published><updated>2011-11-20T19:41:56.695-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='orientação a objetos'/><title type='text'>Um diálogo sobre orientação a objetos</title><content type='html'>&lt;style&gt;.padawan {color: blue}.jedi {color: green}&lt;/style&gt;&lt;p&gt;Sempre que leciono Programação Orientada a Objetos, quando estou falando de encapsulamento, eu mostro uma pequena história para desmistificar a lenga-lenga de que "encapsulamento é ter atributos privados". Fiz, para publicar no blog, uma versão em forma de diálogo. Tentei minimizar o tom professoral, mas o texto não nega a origem. Segue.&lt;/p&gt;&lt;hr/&gt;&lt;p class="padawan"&gt;- Aí cara, a galera criou um &lt;a href="http://dojorio.wordpress.com/2010/03/29/1%C2%BA-encontro-do-grupo-de-estudos/"&gt;fork&lt;/a&gt; de orientação a objetos, e uma das coisas que ficou como exercício foi criar um programa orientado a objetos que calcule o fatorial de um número, mas sem utilizar estruturas de repetição. Essa é fácil, implementei rapidinho! Vê aí se ficou legal:&lt;/p&gt;&lt;script src="https://gist.github.com/1380960.js?file=fatorial_procedural.java"&gt;&lt;/script&gt;&lt;p class="jedi"&gt;- Este programa calcula certinho o fatorial, mas não faz o que foi pedido, porque isso aí é tudo menos orientado a objetos.&lt;/p&gt;&lt;p class="padawan"&gt;- Mas como não? Eu utilizo uma classe e um método! Logo, estou programando orientado a objetos, não?&lt;/p&gt;&lt;p class="jedi"&gt;- Nada disso! O fato de utilizar abstrações e terminologia de OO como classes e métodos não torna automaticamente um programa orientado a objetos. É muito comum ver programas completamente procedurais escritos em linguagens orientadas a objetos. Logo de cara, pense comigo: há sentido em um objeto fatorial no contexto deste programa? Você criou um método chamado &lt;code&gt;fatorial&lt;/code&gt; e uma classe &lt;code&gt;Fatorial&lt;/code&gt;. Não tem uma coisa errada aí? Afinal, fatorial é uma classe ou um método?&lt;/p&gt;&lt;p class="padawan"&gt;- Bom, que fatorial é um método está claro. Agora eu já não estou mais tão seguro em relação a ser uma classe.&lt;/p&gt;&lt;p class="jedi"&gt;- Então, se fatorial é um método, é só pensar qual é o objeto que tem a responsabilidade de oferecer esse método. Objetos pilha tem métodos push e pop, que inserem e retiram um elemento de &lt;strong&gt;si mesma&lt;/strong&gt;. Objetos conta bancária oferecem saques e depósitos em &lt;strong&gt;si próprios&lt;/strong&gt;. Pensando assim, qual objeto deve oferecer o cálculo do fatorial?&lt;/p&gt;&lt;p class="padawan"&gt;- Ahhhhh!!! O número é que deve oferecer um fatorial! É tão óbvio! Então fica assim:&lt;/p&gt;&lt;script src="https://gist.github.com/1380960.js?file=Numero1.java"&gt;&lt;/script&gt;&lt;p class="padawan"&gt;- Mas isso continua do mesmo jeito. Como você disse, procedural. Foi só uma mudança estética, certo?&lt;/p&gt;&lt;p class="jedi"&gt;- Mais ou menos. Nomes são importantes e nos ajudam a pensar mais claramente a respeito dos problemas. Pensa aí, como é que a gente pode melhorar mais isso aí? Se eu chamar um &lt;code class="prettyprint lang-java"&gt;new Numero()&lt;/code&gt;, o que este meu objeto vai representar? Qual é o seu significado? Não tá faltando nada aí não?&lt;/p&gt;&lt;p class="padawan"&gt;- Ah, claro! Qual é o número do meu Numero... Um atributo!&lt;/p&gt;&lt;p class="jedi"&gt;- Certo! Manda ver então!&lt;/p&gt;&lt;script src="https://gist.github.com/1380960.js?file=Numero2.java"&gt;&lt;/script&gt;&lt;p class="padawan"&gt;- Realmente, está ficando cada vez mais com cara de código OO. Mas ainda está estranho, pois eu posso fazer algo assim:&lt;/p&gt;&lt;code class="prettyprint lang-java"&gt;Numero numero = new Numero(3);&lt;br /&gt;numero.fatorial(5);&lt;/code&gt;&lt;p class="padawan"&gt;- Não faz o menor sentido eu pedir a 3 para calcular o fatorial de 5.&lt;/p&gt;&lt;p class="jedi"&gt;- E o que isto significa?&lt;/p&gt;&lt;p class="padawan"&gt;- Já estou entendendo: o raio do método ainda é procedural, e ele é que está bagunçando a história toda...&lt;/p&gt;&lt;p class="jedi"&gt;- Esse método é procedural. Se ele fosse escrito em C, seria exatamente igual (tirando o public, claro!). Na programação procedural, rotinas processam dados. É exatamente isto que o nosso método fatorial faz. Na OO, a comunicação se dá por troca de mensagens, não por fluxos de dados. Ou seja: quando você pede a 3 para calcular um fatorial, deve ser o fatorial de quem?&lt;/p&gt;&lt;p class="padawan"&gt;- De 3, claro.&lt;/p&gt;&lt;p class="jedi"&gt;- Então...&lt;/p&gt;&lt;p class="padawan"&gt;- Rala peito, parâmetro!&lt;/p&gt;&lt;script src="https://gist.github.com/1380960.js?file=Numero3.java"&gt;&lt;/script&gt;&lt;p class="padawan"&gt;- Agora ferrou! Como fazer a parada funcionar?&lt;/p&gt;&lt;p class="jedi"&gt;- Você ainda está pensando de modo procedural. Ali dentro do método, você quer o fatorial de quem?&lt;/p&gt;&lt;p class="padawan"&gt;- De valor - 1.&lt;/p&gt;&lt;p class="jedi"&gt;- Então por que você está pedindo o fatorial de valor novamente? Lembre-se que ali você está chamando fatorial sobre o próprio objeto, this. Se você quer o fatorial de valor - 1, não deveria chamar o fatorial sobre o objeto que representa valor - 1?&lt;/p&gt;&lt;p class="padawan"&gt;- Peraí, agora pegou aqui! Deixa eu pensar... Tá, tudo bem, eu entendi a sua ideia, mas não sei como implementar.&lt;/p&gt;&lt;p class="jedi"&gt;- Como é que você obtém um objeto Numero que seja valor - 1?&lt;/p&gt;&lt;p class="padawan"&gt;- Fazendo &lt;code&gt;new Numero(valor - 1)&lt;/code&gt;.&lt;/p&gt;&lt;p class="jedi"&gt;- Então está pronto!&lt;/p&gt;&lt;p class="padawan"&gt;- Ahhh claro!!! Lá vai!&lt;/p&gt;&lt;script src="https://gist.github.com/1380960.js?file=Numero4.java"&gt;&lt;/script&gt;&lt;p class="padawan"&gt;- Depois que você vê pronto é muito, muito simples!! Agora sim!&lt;/p&gt;&lt;p class="jedi"&gt;- A gente pode parar por aqui se você quiser.&lt;/p&gt;&lt;p class="padawan"&gt;- Como assim se eu quiser. Tem mais?&lt;/p&gt;&lt;p class="jedi"&gt;- Imagine que eu estou usando seu código em uma aplicação, e começo a criar códigos como:&lt;/p&gt;&lt;code class="prettyprint lang-java"&gt;long resultado = numero.fatorial();&lt;/code&gt;&lt;p class="jedi"&gt;- Aí um belo dia eu faço o seguinte código:&lt;/p&gt;&lt;code class="prettyprint lang-java"&gt;Numero numero = new Numero(50);&lt;br /&gt;long resultado = numero.fatorial();&lt;/code&gt;&lt;p class="jedi"&gt;- E o resultado que obtenho é obviamente errado: -3258495067890909184. Estourou o tamanho do tipo long.&lt;/p&gt;&lt;p class="padawan"&gt;- Poderia usar double?&lt;/p&gt;&lt;p class="jedi"&gt;- Até poderia, mas já começa a virar gambiarra, concorda? Fatorial, matematicamente, é uma função aplicada sobre um número natural, que retorna um número natural. Meter números reais na história não vai cheirar nada bem. De qualquer modo, a gente pode pensar com razoável grau de segurança que ninguém vai querer um fatorial de 50, e depois, se alguém pedir, a gente troca. Um dos preceitos da OO é o encapsulamento, sob o qual mudanças na implementação interna de uma classe não alteram o mundo exterior a ela. Como acreditamos que nosso programa está orientado a objetos direitinho... Acreditamos, certo?&lt;/p&gt;&lt;p class="padawan"&gt;- Sim, eu acho que agora está ok, o atributo privado, só o método público lá fazendo só o que deve fazer... Eu acho que está ok.&lt;/p&gt;&lt;p class="jedi"&gt;- Podemos liberar esta classe para produção então?&lt;/p&gt;&lt;p class="padawan"&gt;- Manda ver!!&lt;/p&gt;&lt;p class="jedi"&gt;- Agora imagine que você escreveu este código e todos os 200 desenvolvedores da empresa estão utilizando esta classe em 30 aplicações.&lt;/p&gt;&lt;p class="padawan"&gt;- Que responsa!&lt;/p&gt;&lt;p class="jedi"&gt;- Pois é! Aí chega uma demanda dos usuários de algumas das aplicações por fatoriais de números na casa dos 200.&lt;/p&gt;&lt;p class="padawan"&gt;- A gente pode usar, sei lá, BigInteger para representar o número.&lt;/p&gt;&lt;p class="jedi"&gt;- Você está confiando no encapsulamento da classe pra fazer isso? Tenta lá.&lt;/p&gt;&lt;script src="https://gist.github.com/1380960.js?file=Numero5.java"&gt;&lt;/script&gt;&lt;p class="jedi"&gt;- Legal, só que isto vai quebrar &lt;strong&gt;TODAS&lt;/strong&gt; as milhares de chamadas ao método fatorial (estamos imaginando aqui que fatorial é uma funcionalidade muito popular, ok?). Tudo bem, aqueles que querem fatoriais gigantescos nem vão reclamar tanto, mas e os que não têm nada a ver com isso? E ainda são obrigados a importar mais uma classe! E imagine que coisa fede ainda mais se criarmos um método &lt;code&gt;getValor()&lt;/code&gt;. A solução seria criar um método Frankenstein, tipo bigFatorial e manter o fatorial normal? Manter duas classes diferentes? E cadê o desgraçado fidumaégua do encapsulamento que não te salvou? Era tudo mentira isso de "mudanças na implementação não alteram o mundo externo"?&lt;/p&gt;&lt;p class="padawan"&gt;- É aquele papo, de uma "mudancinha à toa" pro cliente ser um pesadelo de manutenção pros desenvolvedores.&lt;/p&gt;&lt;p class="jedi"&gt;- Isso! E muitas vezes (como no nosso caso atual) isto é fruto de mau design.&lt;/p&gt;&lt;p class="padawan"&gt;- E como resolver isso? Eu não tenho idéia.&lt;/p&gt;&lt;p class="jedi"&gt;- Na verdade há um problema conceitual na nossa classe. Ou, dizendo de outro modo, não está suficientemente OO.&lt;/p&gt;&lt;p class="padawan"&gt;- Como assim?&lt;/p&gt;&lt;p class="jedi"&gt;- Primeiro, há um vazamento no encapsulamento: o tipo de retorno de fatorial. Ele espelha exatamente a implementação interna, o modo como a classe Numero armazena o atributo valor. Se houver futuramente uma alternativa a BigInteger e quisermos eliminá-lo, estaremos escolhendo novamente entre quebrar os clientes ou fazer gambiarras de duplicar métodos. Ter simplesmente "atributos privados" não é o bastante. Linguagens como Python não têm suporte a membros privados e não deixam de ter encapsulamento por isto. Encapsulamento é um conceito, não uma palavra-chave como muita coisa que se lê por aí faz supor.&lt;/p&gt;&lt;p class="padawan"&gt;- Certo.&lt;/p&gt;&lt;p class="jedi"&gt;- Este vazamento de encapsulamento é causado pelo problema conceitual de que falei. Quando criamos uma classe, a única representação daquele conceito no nosso modelo passa a ser a classe. Nós criamos uma classe para números, mas representamos números de duas formas: objetos Numero e objetos BigInteger. Deveríamos usar apenas uma. Pense: o que um fatorial retorna?&lt;/p&gt;&lt;p class="jedi"&gt;- Um número.&lt;/p&gt;&lt;p class="jedi"&gt;- E o que é um número no mosso modelo?&lt;/p&gt;&lt;p class="padawan"&gt;- Entendi!! Um objeto Numero!&lt;/p&gt;&lt;p&gt;(começa a escrever o código)&lt;/p&gt;&lt;p class="padawan"&gt;- Mas se eu quiser realmente encapsular por completo o tipo utilizado eu vou ter que...&lt;/p&gt;&lt;p class="jedi"&gt;- Reescrever todos os operadores? Sim, não tem outro jeito neste caso.&lt;/p&gt;&lt;script src="https://gist.github.com/1380960.js?file=Numero6.java"&gt;&lt;/script&gt;&lt;p class="padawan"&gt;- E então?&lt;/p&gt;&lt;p class="jedi"&gt;- A classe Numero agora é um número de pleno direito dentro do software. Agora qualquer coisa que ela faz retorna outro objeto Numero. Tudo está realmente encapsulado.&lt;/p&gt;&lt;p class="padawan"&gt;- Mas continua um problema, aquilo que você falou sobre ter duas representações. Internamente só vamos ter uma, mas o cliente da classe vai continuar vendo duas: o nosso objeto Numero e os números (int, long, etc) que a linguagem Java oferece. Além disso, ter que reescrever todos os operadores dá um trabalhão. Ali eu só reescrevi os que foram necessários, em um caso real todos os outros teriam que ser reescritos também.&lt;/p&gt;&lt;p class="jedi"&gt;- Bom, aí chegamos aos limites da linguagem Java em termos de orientação a objetos. Se você quiser, podemos parar por aqui.&lt;/p&gt;&lt;p class="padawan"&gt;- Como assim "se você quiser"? Eu não acredito que ainda tem mais!?&lt;/p&gt;&lt;p class="jedi"&gt;- Bom, podemos falar, por exemplo, de Ruby e colocar a orientação a objetos em um nível bem mais alto, tanto de simplicidade quanto de praticidade e poder. Partiu?&lt;/p&gt;&lt;p&gt;(mas isso fica pra outro dia, ainda que, provavelmente, não em outro diálogo...)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4768685500899450550-6275649429280346877?l=programacaoradical.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacaoradical.blogspot.com/feeds/6275649429280346877/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4768685500899450550&amp;postID=6275649429280346877' title='14 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default/6275649429280346877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default/6275649429280346877'/><link rel='alternate' type='text/html' href='http://programacaoradical.blogspot.com/2010/11/blog-post.html' title='Um diálogo sobre orientação a objetos'/><author><name>Rodrigo Manhães</name><uri>http://www.blogger.com/profile/07484501729941538844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RLRRh1e3jng/TNEcmqordbI/AAAAAAAAAMs/rhr7nYZmupc/S220/foto.png'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4768685500899450550.post-6388223269828712276</id><published>2010-11-03T04:24:00.004-02:00</published><updated>2010-11-03T04:45:38.465-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='o blog'/><category scheme='http://www.blogger.com/atom/ns#' term='poesia'/><title type='text'>para o alto e avante!</title><content type='html'>Como qualquer um que tenha estado aqui pelos últimos dois anos deve ter percebido, este blog esteve praticamente abandonado durante este período. A mim mesmo, a desculpa era sempre a mesma: eu estava esperando "o momento certo" para voltar a escrever no blog. Assim como na &lt;a href="http://www2.uol.com.br/engenheirosdohawaii/discos/letras/vidareal.htm"&gt;música&lt;/a&gt; de Humberto Gessinger, "esperei chegar a hora certa por acreditar que ela viria". E, por certo, ela não vem. Se formos esperar o momento no qual tudo estará calmo e tranquilo, céu azul de brigadeiro, para colocarmos nossos projetos em prática, nunca faremos coisa alguma. Assim, aqui estou eu reabrindo a casa. Por outro lado, se o presente escrito é só o manifesto de meia dúzia de posts e outros dois anos de silêncio, ninguém sabe. De qualquer modo, tudo vale a pena, já dizia outro poeta. Vamos?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4768685500899450550-6388223269828712276?l=programacaoradical.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacaoradical.blogspot.com/feeds/6388223269828712276/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4768685500899450550&amp;postID=6388223269828712276' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default/6388223269828712276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default/6388223269828712276'/><link rel='alternate' type='text/html' href='http://programacaoradical.blogspot.com/2010/11/para-o-alto-e-avante.html' title='para o alto e avante!'/><author><name>Rodrigo Manhães</name><uri>http://www.blogger.com/profile/07484501729941538844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RLRRh1e3jng/TNEcmqordbI/AAAAAAAAAMs/rhr7nYZmupc/S220/foto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4768685500899450550.post-4307135048115155003</id><published>2010-05-24T23:55:00.002-03:00</published><updated>2010-05-25T00:39:52.273-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nsi tech talks'/><category scheme='http://www.blogger.com/atom/ns#' term='eventos'/><title type='text'>1º NSI Tech Talks: um balanço</title><content type='html'>Na tarde do dia 30/04/2010, ocorreu o 1º NSI Tech Talks, um evento mensal sobre tecnologia organizado pelo &lt;a href="http://nsi.iff.edu.br/"&gt;Núcleo de Pesquisa em Sistemas de Informação (NSI)&lt;/a&gt; do &lt;a href="http://iff.edu.br/"&gt;Instituto Federal Fluminense (IFF)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;O evento foi pensado inicialmente como uma espécie de workshop interno (nossa equipe tem cerca de 30 pessoas distribuídas em diversos projetos), mas acabamos por decidir fazer um evento aberto. No núcleo temos desde pesquisadores doutores até alunos de curso técnico, todos abrangendo um leque bastante amplo de habilidades e conhecimentos.&lt;br /&gt;&lt;br /&gt;A primeira edição foi organizada em pouco mais de uma semana e, por consequência, não foi tão divulgada como deveria, mas mesmo assim houve público em um bom número. &lt;br /&gt;&lt;br /&gt;Na apresentação "OpenOffice: Dominando a Fera com Python", &lt;a href="http://twitter.com/gmonnerat"&gt;Gabriel Monnerat&lt;/a&gt; mostrou em detalhes como o Python é usado para realizar a automação do OpenOffice.org, com o projeto OOOD, criado pelo próprio em uma parceria do NSI com a empresa francesa NEXEDI, utilizado principalmente para conversão de documentos e como resolver questões de escalabilidade, concorrência e como contornar instabilidades do OpenOffice.&lt;br /&gt;&lt;br /&gt;Na segunda apresentação do dia, &lt;a href="http://www.slideshare.net/hugobr/nsi-tech-talkgit"&gt;"Collaborative Coding: Git+Github"&lt;/a&gt;, &lt;a href="http://hltbra.blogspot.com/"&gt;Hugo&lt;/a&gt; &lt;a href="http://github.com/hugobr/"&gt;Lopes&lt;/a&gt; &lt;a href="http://twitter.com/hltbra"&gt;Tavares&lt;/a&gt; explicou como funcionam os sistemas de controle de versão, mostrando as diferenças entre VCS centralizados e distribuídos e expôs o funcionamento do Git, um dos mais modernos e eficientes DVCS disponíveis, e mostrou como o Github pode tornar simples e eficiente o compartilhamento de código e o desenvolvimento colaborativo de software livre.&lt;br /&gt;&lt;br /&gt;Para as próximas edições já estão agendadas palestras com temas como manipulação de vídeo com gstreamer e Python, lean thinking aplicado ao desenvolvimento de software, clean code e qualidade de código, heurísticas para extração de frames significativos em videos, análise de licenças para software livre, o framework web Grok, técnicas para criação de DSLs em Python e integração contínua.&lt;br /&gt;&lt;br /&gt;Pretendíamos disponibilizar os vídeos das apresentações, mas muito infelizmente tivemos um problema com o som dos vídeos e até agora não conseguimos resolver. Caso haja alguma novidade em relação aos vídeos, posto aqui. Também infelizmente, confiamos demais nos vídeos e - adivinhe! - não tiramos fotos.&lt;br /&gt;&lt;br /&gt;Enfim, o 1º NSI Tech Talks, a meu ver - mas sou suspeito para falar, claro! - foi, exceto em termos de registro, um sucesso e só tende a melhorar. É um evento muito interessante, de palestras com um nível técnico bem mais alto do que se costuma encontrar, e uma ótima fonte para quem se interessar em questões atuais sobre desenvolvimento de software.&lt;br /&gt;&lt;br /&gt;O evento possui um &lt;a href="http://nsi.iff.edu.br/nsi-tech-talks"&gt;site&lt;/a&gt; (sim, nós temos que melhorá-lo), onde serão divulgadas as novas edições.&lt;br /&gt;&lt;br /&gt;A segunda edição já está marcada para a próxima segunda-feira, 31/05/2010, às 15 horas, no auditório Reginaldo Rangel, no Instituto Federal Fluminense (antigo Cefet) em Campos/RJ.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4768685500899450550-4307135048115155003?l=programacaoradical.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacaoradical.blogspot.com/feeds/4307135048115155003/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4768685500899450550&amp;postID=4307135048115155003' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default/4307135048115155003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default/4307135048115155003'/><link rel='alternate' type='text/html' href='http://programacaoradical.blogspot.com/2010/05/1-nsi-tech-talks-um-balanco.html' title='1º NSI Tech Talks: um balanço'/><author><name>Rodrigo Manhães</name><uri>http://www.blogger.com/profile/07484501729941538844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RLRRh1e3jng/TNEcmqordbI/AAAAAAAAAMs/rhr7nYZmupc/S220/foto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4768685500899450550.post-3259779886426949516</id><published>2008-11-20T00:11:00.006-02:00</published><updated>2008-11-23T17:42:22.443-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agilismo'/><category scheme='http://www.blogger.com/atom/ns#' term='declínio e queda'/><title type='text'>Agilismo em perigo?</title><content type='html'>Há poucos dias &lt;a href="http://jamesshore.com/index.index"&gt;James Shore&lt;/a&gt;, um dos grandes nomes do agilismo mundial (autor do ótimo &lt;a href="http://jamesshore.com/Agile-Book/"&gt;The Art of Agile Development&lt;/a&gt;), escreveu um polêmico &lt;a href="http://jamesshore.com/Blog/The-Decline-and-Fall-of-Agile.html"&gt;post&lt;/a&gt; em seu &lt;a href="http://jamesshore.com/Blog/"&gt;blog&lt;/a&gt;, chamado "&lt;a href="http://jamesshore.com/Blog/The-Decline-and-Fall-of-Agile.html"&gt;The Decline and Fall of Agile&lt;/a&gt;" e suscitou um monte de polêmica. Eu concordo com o que ele escreveu em praticamente tudo.&lt;br /&gt;&lt;br /&gt;Meses atrás, o &lt;a href="http://isanchez.net/"&gt;Ivan Sanchez&lt;/a&gt; havia levantado, ainda que de modo menos incisivo, &lt;a href="http://dojofloripa.wordpress.com/2008/05/27/a-queda-do-desenvolvimento-agil/"&gt;a mesma coisa&lt;/a&gt; em seu &lt;a href="http://dojofloripa.wordpress.com/"&gt;blog em português&lt;/a&gt;. Hoje, ele &lt;a href="http://dojofloripa.wordpress.com/2008/11/19/a-queda-do-desenvolvimento-agil-parte-2/"&gt;voltou a postar&lt;/a&gt; reivindicando o pioneirismo e reafirmando suas posições. &lt;a href="http://dojofloripa.wordpress.com/2008/11/19/a-queda-do-desenvolvimento-agil-parte-2/"&gt;Neste post&lt;/a&gt; há também links para a repercussão do &lt;a href="http://jamesshore.com/Blog/The-Decline-and-Fall-of-Agile.html"&gt;artigo do Shore&lt;/a&gt; na blogosfera brasileira. Aliás, o post também traz a promessa de se manter atualizado quanto aos links para a repercussão, portanto fique de olho.&lt;br /&gt;&lt;br /&gt;O Uncle Bob (Robert C. Martin) também &lt;a href="http://blog.objectmentor.com/articles/2008/11/16/dirty-rotten-scrumdrels"&gt;se manifestou a respeito&lt;/a&gt;, discordando em certa medida das posições de Shore.&lt;br /&gt;&lt;br /&gt;Pessoalmente, tendo a concordar com o Shore. A culpa não é do Scrum, certamente. Mas agilismo é como uma faca: é um excelente instrumento, mas não é bom que fique nas mãos de crianças nem de psicopatas. O problema é que Scrum, por ser fácil de compreender e ter forte apelo gerencial, tem sido vendido e comprado por crianças (sem avisar que elas deveriam crescer antes de utilizar) e psicopatas (sem um devido tratamento psiquiátrico). E aí não há boa vontade que impeça a faca ágil de fazer o que não deveria: mutilar o próprio usuário e qualquer um que esteja por perto.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4768685500899450550-3259779886426949516?l=programacaoradical.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacaoradical.blogspot.com/feeds/3259779886426949516/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4768685500899450550&amp;postID=3259779886426949516' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default/3259779886426949516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default/3259779886426949516'/><link rel='alternate' type='text/html' href='http://programacaoradical.blogspot.com/2008/11/agilismo-em-perigo.html' title='Agilismo em perigo?'/><author><name>Rodrigo Manhães</name><uri>http://www.blogger.com/profile/07484501729941538844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RLRRh1e3jng/TNEcmqordbI/AAAAAAAAAMs/rhr7nYZmupc/S220/foto.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4768685500899450550.post-7045692494769547298</id><published>2008-10-03T10:48:00.005-03:00</published><updated>2008-10-03T11:10:17.257-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='leia isto'/><category scheme='http://www.blogger.com/atom/ns#' term='agilismo'/><title type='text'>leia isto &gt;&gt; Iterações pra que te quero</title><content type='html'>&lt;sub&gt;&lt;i&gt;Na seção "leia isto", linkarei bons textos e posts relacionados ao tema do blog.&lt;/i&gt;&lt;/sub&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.thiagoarrais.com.br/2008/10/02/iteracoes-pra-que-te-quero/"&gt;http://blog.thiagoarrais.com.br/2008/10/02/iteracoes-pra-que-te-quero/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;cite&gt;Quando chegarmos a este ponto, será que deveríamos parar aí? A beleza deste processo de encolhimento das iterações é poder continuar diminuindo-as. Iterativamente, se você me permite. O limite será alcançado quando em uma iteração couber somente um requisito. Neste ponto, a única maneira de continuar encolhendo as iterações é encolher os próprios requisitos, tornando-os cada vez mais simples e atômicos.&lt;br /&gt;&lt;br /&gt;Mas será que sua organização vai ter coragem para chegar lá?&lt;/cite&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4768685500899450550-7045692494769547298?l=programacaoradical.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacaoradical.blogspot.com/feeds/7045692494769547298/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4768685500899450550&amp;postID=7045692494769547298' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default/7045692494769547298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default/7045692494769547298'/><link rel='alternate' type='text/html' href='http://programacaoradical.blogspot.com/2008/10/leia-isto-iteraes-pra-que-te-quero.html' title='leia isto &gt;&gt; Iterações pra que te quero'/><author><name>Rodrigo Manhães</name><uri>http://www.blogger.com/profile/07484501729941538844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RLRRh1e3jng/TNEcmqordbI/AAAAAAAAAMs/rhr7nYZmupc/S220/foto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4768685500899450550.post-9058550180885274802</id><published>2008-10-02T01:52:00.004-03:00</published><updated>2010-11-26T19:56:06.655-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='baby steps'/><category scheme='http://www.blogger.com/atom/ns#' term='agilismo'/><title type='text'>Passos de bebê</title><content type='html'>Na lista de discussão do &lt;a href="http://nsi.iff.edu.br/"&gt;núcleo de pesquisa&lt;/a&gt; de que faço parte, surgiu uma polêmica a respeito do uso da técnica de &lt;a href="http://www.improveit.com.br/xp/principios/passos_bebe"&gt;passos de bebê&lt;/a&gt;. Resumindo a história, alguém estranhou os passos minúsculos preconizados pela literatura de TDD. Por exemplo, em se tendo apenas o teste (em Java):&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint lang-java"&gt;Template template = new Template("#{tecnica-agil} é legal!");&lt;br /&gt;template.set("tecnica-agil", "TDD");&lt;br /&gt;assertEquals("TDD é legal!", template.parse());&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;a implementação seria necessariamente&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint lang-java"&gt;...&lt;br /&gt;public String parse()&lt;br /&gt;{&lt;br /&gt;    return "TDD é legal!";&lt;br /&gt;}&lt;br /&gt;...&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Bom, vamos à &lt;a href="http://en.wiktionary.org/wiki/IMHO"&gt;minha visão&lt;/a&gt; da coisa toda: a técnica de "passos de bebê" serve para evitar complexidade desnecessária, como generalização prematura e overengineering. O tamanho do passo - o que parece ser o centro da polêmica - deve ser baseado no bom senso e no quanto é confortável para o desenvolvedor. Se um desenvolvedor ou par se sente confortável em utilizar a técnica de modo mais ortodoxo, ótimo. Se não, é uma questão de ajuste fino. Eu, por exemplo, normalmente utilizo passos um pouco (mas não muito) maiores, exceto quando o domínio é pouco conhecido.&lt;br /&gt;&lt;br /&gt;Os passos de bebê estão diretamente ligados a &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;Test-Driven Development&lt;/a&gt;. Em TDD, a implementação deve ser unicamente aquela suficiente para passar nos testes, e nada mais. Deste modo, os passos de bebê não estão na implementação, mas na elaboração dos testes. Caso se queira que os passos sejam maiores, basta aumentar a granularidade dos testes unitários. Escrever um teste apenas para, por exemplo, uma entrada "N" e implementar uma solução genérica para o alfabeto inteiro é algo que contraria diretamente os princípios do agilismo (ou seja, da engenharia de software moderna), é implementar a solução para um problema ainda não formulado. Do ponto de vista da programação, os testes unitários são a especificação de requisitos. Assim, uma solução geral para o alfabeto inteiro com um teste só para "N" recairia em uma das duas situações: (1) ou há implementação desnecessária, ou seja, desperdício e complexidade inútil ou (2) o conjunto de testes é deficiente, o que mostra requisitos mal formulados e pode ter consequências ruins como bugs de regressão.&lt;br /&gt;&lt;br /&gt;A questão é que a implementação tem que ser a coisa mais simples (sem ser simplória, &lt;a href="http://www.brainyquote.com/quotes/quotes/a/q103652.html"&gt;já dizia Einstein&lt;/a&gt;) que possa passar nos testes (e uma cascata de if-elses é tosqueira, não &lt;a href="http://www.improveit.com.br/xp/valores/simplicidade"&gt;simplicidade&lt;/a&gt;). Se você consegue ter uma função que passa nos testes com um mero &lt;code class="prettyprint lang-java"&gt;return "n"&lt;/code&gt;, o problema está em um conjunto fraco de testes. A implementação está correta, pois cumpre os requisitos (testes unitários) de modo claro, simples, rápido e manutenível.&lt;br /&gt;&lt;br /&gt;Toda e qualquer prática ágil deve estar ancorada em princípios e valores. No caso em questão, o valor é a já citada &lt;a href="http://www.improveit.com.br/xp/valores/simplicidade"&gt;simplicidade&lt;/a&gt;, traduzida nos lemas &lt;a href="http://en.wikipedia.org/wiki/KISS_principle"&gt;KISS&lt;/a&gt; e &lt;a href="http://en.wikipedia.org/wiki/You_Ain%27t_Gonna_Need_It"&gt;YAGNI&lt;/a&gt;. Os passos de bebê asseguram que o software terá apenas a complexidade necessária e nada mais.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4768685500899450550-9058550180885274802?l=programacaoradical.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacaoradical.blogspot.com/feeds/9058550180885274802/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4768685500899450550&amp;postID=9058550180885274802' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default/9058550180885274802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default/9058550180885274802'/><link rel='alternate' type='text/html' href='http://programacaoradical.blogspot.com/2008/10/passos-de-beb.html' title='Passos de bebê'/><author><name>Rodrigo Manhães</name><uri>http://www.blogger.com/profile/07484501729941538844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RLRRh1e3jng/TNEcmqordbI/AAAAAAAAAMs/rhr7nYZmupc/S220/foto.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4768685500899450550.post-1804213833424227043</id><published>2008-10-01T23:45:00.003-03:00</published><updated>2008-10-03T11:16:44.438-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='olá mundo'/><title type='text'>Olá mundo!</title><content type='html'>Esta é a estréia do blog. Por aqui teremos, certamente com periodicidade halleyana, programação em geral, orientação a objetos, metodologias ágeis e devaneios relacionados.&lt;br /&gt;&lt;br /&gt;Que ninguém espere nada de revolucionário ou impressionante feito aqui. Coisas assim aparecem nos links aí do lado e na seção &lt;a href="http://programacaoradical.blogspot.com/search/label/leia%20isto"&gt;leia isto&lt;/a&gt;. Por aqui só tijolinhos sem muita importância. Até breve!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4768685500899450550-1804213833424227043?l=programacaoradical.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programacaoradical.blogspot.com/feeds/1804213833424227043/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4768685500899450550&amp;postID=1804213833424227043' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default/1804213833424227043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4768685500899450550/posts/default/1804213833424227043'/><link rel='alternate' type='text/html' href='http://programacaoradical.blogspot.com/2008/08/ol-mundo.html' title='Olá mundo!'/><author><name>Rodrigo Manhães</name><uri>http://www.blogger.com/profile/07484501729941538844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_RLRRh1e3jng/TNEcmqordbI/AAAAAAAAAMs/rhr7nYZmupc/S220/foto.png'/></author><thr:total>0</thr:total></entry></feed>
