Conhecendo o operator new e os protótipos no JavaScript

Como funciona exatamente o new no JavaScript? Podemos utilizá-lo na frente de uma invocação de uma função. Curiosamente, de qualquer função. Quando usado, o new cria um novo objeto e o atribui a palavra chave this de dentro do escopo da função invocada. Podemos então adicionar atributos a esse objeto… [para ler todo o conteúdo vá até o blog da Caelum onde o post foi publicado originalmente].

Posted in Development | Tagged | Leave a comment

As múltiplas personalidades do this em JavaScript

Se você já escreveu algum código JavaScript, não deve mais achar estranho quando alguém atribui uma função a uma variável. Mas o que exatamente acontece quando você faz isso? Em JavaScript, as funções podem ser passadas como parâmetros para outras funções, retornadas como valor e, como já dito, referenciadas por variáveis.

Leia mais no posto originalmente publicando no blog da Caelum.

Posted in Development | Tagged , | Leave a comment

Gerenciamento de Memória e o ARC no Objective-C

Esse post foi publicado no blog da Caelum: http://blog.caelum.com.br/gerenciamento-de-memoria-e-o-arc-no-objective-c/

Posted in Development | Leave a comment

[rapidinha] Save the data! Usando ActiveRecord (sem o Rails).

Uma necessidade que aparece de vez em sempre é usar o ActiveRecord independente de estar ou não usando o Rails. Segue um pequeno passo a passo (pequeno mesmo porque é bem simples) de como fazer isso.

Você vai precisar instalar a gem do activerecord:

gem install activerecord

Outra coisa que será necessária é criação de uma conexão com o banco de dados. Como não estamos usando a stack do Rails, o pool de conexões do ActiveRecord não será automaticamente iniciado:

# arquivo: ar_connection.rb
require 'rubygems'
require 'active_record'
ActiveRecord::Base.establish_connection(
  :adapter => 'mysql2', # pode usar qualquer adapter compatível com activerecord
  :host => 'localhost', # host para seu database
  :user => '[seu user]',
  :password => '[seu password]',
  :database => '[seu database]'
)

Agora você só precisa criar uma classe que estenda de ActiveRecord::Base:

require "ar_connection"
class MeuModel < ActiveRecord::Base
  set_table_name :meu_model
end

E… prontinho, veja abaixo um exemplo de uso:

# Exemplo de uso
m = MeuModel.new
m.conteudo = 'go!'
m.save
p MeuModel.all

Posted in Development | Tagged , , , | 1 Comment

jQuery.hotkeys, jQuery.silver e mac command key.

Sim, eu estou vivo.

Passei um bom tempo sem postar aqui, mas garanto que tenho uma ótima desculpa para isso. Em um resumo objetivo e simples: estou de trabalho novo, felizão da vida. Agora trabalho na Caelum full time, como desenvolvedor e instrutor. Mas tenho certeza que você está aqui para saber sobre os plugins para jquery citados no título, e não sobre minhas desculpas pelo longo período sem novos posts, então vamos lá e sem mais delongas! =)

Recentemente em um projeto web em que estou trabalhando tive contato com um plugin bastante interessante para o jQuery. Trata-se do jquery.silver, feito pelo Filipe Sabella. O grande lance do plugin é criar um “campo de texto” flutuante sobre o conteúdo atual da página para  possibilitar uma busca no conteúdo, enquanto você digita algo no campo, os links e botões existentes na página que têm um ‘label’ que casa com a busca que está sendo feita vão aparecendo em uma lista logo abaixo ao campo de texto, autocomplete-like.

Existe um atalho que invoca o jquery.silver para que o campo apareça na página: “ctrl+shift+space”. Estou desenvolvendo em um mac e a primeira coisa que tentei fazer foi usar o atalho “command+shift+space”… não funfou. Não me fiz de rogado. O jquery.silver usa o jquery.hotkeys para criar esse atalho e para capturar, por exemplo, um enter no teclado ao escolher o link desejado. Fiz um fork e adicionei código bem simples ao jquery.hotkeys para compatibilidade com a tecla command.

Depois “forquei” o próprio jquery.silver para adicionar o jquery.hotkeys modificado com o suporte ao atalho “command+shift+space” por padrão. De quebra, alterei a versão do jQuery para a mais recente em ambos os projetos.

Então é isso, espero que seja útil para mais alguém além de mim. Para um futuro próximo pretendo adicionar testes automatizados aos dois projetos, e quando ficar tudo redondinho devo mandar pull-requests. Em todo o caso, se você precisa de uma funcionalidade semelhante, já pode usar o código dos forks que eu criei. Caso queira fazer melhorias, fique a vontade para mandar um pull request.

[ + ]

jquery.silver (meu fork no github, versão com suporte a “command+shift+space”)

Posted in Development | Tagged , | Leave a comment

O benefício não tão direto de se conhecer várias linguagens de programação

Já aconteceu de você estar no chuveiro, cantarolando e fazendo moicano com a espuma do shampoo e de repente, entre um pensamento desconexo e outro, surge a imagem de uma solução para um problema no qual você pensou o dia inteiro e não conseguiu resolver? Então você sai do banho, pega papel, caneta ou o notebook e começa a concretizar aquele pensamento. O resultado não é tão claro ou bonito como o que veio a mente durante o banho, por mais que você se esforce para lembrar os detalhes daquela imagem que estava em sua cabeça, o que você consegue expressar em palavras – ou código, no nosso caso – não é tão perfeito quanto a visão que você teve. Mas ainda assim, a solução que você consegue tornar real faz todo o sentido e é bastante razoável. Lembra-se de uma situação parecida? Pois o responsável por esses momentos eureca é o lado direito do cérebro que faz um processamento assíncrono de informações, tentando realizar um pattern matching para resolver problemas que surgem no cotidiano. Essa imagem representando a solução que podemos enxergar com clareza é o resultado da busca, como o processamento é assíncrono, a resposta muitas vezes chega horas, dias ou semanas depois do início da busca. E essa incapacidade de traduzir em algo concreto a solução exatamente da forma como ela foi visualizada é culpa do lado esquerdo do cérebro, já que ele é melhor para exprimir ideias em palavras, linguagem… e código, e não tão bom assim em interpretar imagens complexas e o todo das coisas.

O cérebro, esse CPU dual core.

Na verdade, não existe exatamente um conceito de lado esquerdo e direito em nosso cérebro. Mas há uma divisão clara de responsabilidades lá dentro. Uma metade, a popularmente conhecida por “lado esquerdo” é a que gosta de fatos, de nomear coisas, de dizer que o tempo está passando, de analisar e de sintetizar. Já o “lado direito” é um cara interessado em imagens, sons e sentimentos mais do que em uma palavra que dá significado. Se preocupa com o todo e as relações entre as coisas e não se importa com as coisas em si. Não quer nem saber quanto tempo vai levar para conseguir conectar duas pontas e solucionar um problema, afinal ele tem que relacionar esse problema com todo o conhecimento existente – inclusive aquele que está guardado mofando e cheio de teias desde a infância – afim de encontrar um relacionamento entre coisas que até hoje poderia ser completamente ignorado. O lado esquerdo é o cara racional, exato. O direito é o search engine (assíncrono) do cérebro. Há mais informações a respeito do funcionamento do cérebro no interessantíssimo Pragmatic Thinking and Learning: Refactor Your Wetware.

É por isso que é um pouco desconfortável traduzir a solução que surgiu tão clara lá no banho para algo mais concreto, ou mais especificamente um código. O lado direito é mais apto a visualizar (literalmente) o todo, enquanto o esquerdo precisa dissecar esse todo, analisar os pedacinhos para formar palavras e frases que tenham sentido. Sabe quando você acorda e tem aquele sonho divertido inteirinho na mente, começa a explicar para alguém e puuufff, a lembrança simplesmente desaperece? No seu cérebro o sonho está armazenado no lado direito, e esse lado não se preocupa com linearidade ou tempo. Enxerga o sonho por completo em toda sua riqueza de cores, sons, cheiros e impossibilidades. No momento em que você tenta explicar essa imagem com linguagem, está efetivamente usando o lado esquerdo: incompatibilidade imediata de funções! E agora você deve estar se perguntando: e cadê o papo sobre saber várias linguagens de programação?

Quando você tem uma base de dados extensa disponível para o lado direito fazer queries, você certamente tem maiores chances de ganhar insights durante um banho [ou insira aqui sua atividade descompromissada favorita]. Outra coisa que você ganha aqui é o desempenho: quanto mais possibilidades para um matching ocorrer, mais rápido ele aparece. E ainda há a quantidade: com muitos matches possíveis é mais provável que você receba mais resultados até que o problema finalmente seja resolvido da melhor forma que seu cérebro pode conceber. Se você aprende sistematicamente novas linguagens de programação, está potencialmente aumentando essa base de conhecimento onde ocorrem as buscas. Mas, espera um pouco, se o lado direito é quem faz as buscas e ele não se importa com linguagens e seus detalhes (e por isso não liga para novas sintaxes e apis que você decora), como é possível se beneficiar desse aprendizado contínuo?

Estar ciente do contexto é essencial

A resposta está na maneira como essas novas linguagens são estudadas e aprendidas. Muito mais relevante que a sintaxe e a api é o contexto onde essa nova linguagem resolve muito bem os problemas. É claro que é interessante conhecer a fundo algumas linguagens, principalmente aquelas que você usa no dia a dia. Mas se você vai estudar todo ano uma nova como sugere o The Pragmatic Programmer: From Journeyman to Master, será realmente muito difícil se tornar perito em todas elas, e não tem problema pois esse realmente não é o objetivo. O importante é compreender a “cultura” dos desenvolvedores nativos daquela linguagem X. É essa abordagem de estudo que vai garantir a expansão da sua capacidade de pensar em um mesmo problema sob diversos prismas, e por consequência é isso que irá aumentar a base para as buscas onde o lado direito faz consultas. Ao estudar uma linguagem de programação desconhecida entenda como os “nativos” da linguagem enxergam um problema. Frequente as listas de discussões, se habitue com o linguajar, procure acompanhar o conteúdo gerado pelos gurus daquele universo. Quando estiver razoavelmente ambientado, submeta suas ideias de solução para qualquer problema na linguagem estudada. Pergunte o que eles acham e receba abertamente todas as críticas, pois nelas estarão embutidos os conhecimentos, costumes e formas de abordar os problemas. Quando sentir que é capaz de abordar problemas simples da mesma forma que as pessoas habituadas com aquela forma de pensar, traga aquela perspectiva de mundo para sua realidade. Essa experiência durante o aprendizado é, na minha opinião, onde está o verdadeiro valor em se aprender uma nova linguagem.

Conheci uma professora de música que, ironicamente, escutava demais. Tinha uma condição física que a impedia de levar uma vida 100% normal devido as possíveis sobrecargas sensoriais que uma cidade como São Paulo podem proporcionar: ao melhor estilo Dare Devil. Me lembro de um dia em que a vi com uma laranja junto a orelha, não entendi a cena e perguntei: “que é isso pô?”. E ela, com toda a naturalidade: “estou vendo se já está madura”. Wow. Se havia uma abordagem que eu nunca havia visto para escolher uma fruta, era aquela. Claro, eu tenho uma audição normal e nada treinada, seria incapaz de ouvir qualquer diferença entre uma laranja e uma melancia. Mas aquilo me fez pensar: realmente existem muitas nuances possíveis em uma simples escolha de frutas além da aparência. Passei a prestar maior atenção em textura, cheiro, além da aparência que era minha maior preocupação até então. Meu contexto para a escolha de frutas se tornou mais amplo quando conheci a cultura de alguém com uma abordagem completamente distinta da minha. Não tenho nem de longe a habilidade e conhecimento dessa professora no campo onde ela é especialista, mas apenas o fato de saber que ela fazia aquilo me permitiu abrir a mente sobre o assunto, o que influenciou a forma como eu escolho maçãs, laranjas e afins.

A partir do momento em que você se torna familiar com novas formas de pensar sobre os problemas, fica cada vez mais claro que uma linguagem é apenas uma ferramenta. E passa a ser aceitável que uma solução ideal possa envolver diversas delas. Já ouviu dizer que para quem só tem martelo, todo problema é prego? Pois quando você aumenta a área de busca de soluções no cérebro é como se tivesse adquirido novas ferramentas. Pode ser até que você use sua própria linguagem nativa e favorita, mas de uma forma que outra pessoa que não conhece outras possibilidades poderia nem sequer achar que é possível. O programador poliglota é alguém que conhece várias linguagens porque pode usar a ferramenta correta para um problema específico. Mas além disso, é alguém que sabe considerar o todo, o contexto de um problema, e sabe que a melhor solução depende inteiramente desse contexto.

Posted in Development | Tagged , , , | 6 Comments

Lidando com as in..ter….rup.ções [ou como economizar alguns fios de cabelo]

No meu último post falei sobre como as interrupções podem ser um problema para a produtividade de um desenvolvedor de software me dirigindo claramente aos gestores de equipes de desenvolvimento. Tentei descrever aquilo que na minha opinião seria o mundo perfeito para alguém que está pilotando o teclado: um ambiente de trabalho livre de interrupções. Mas, utopias deixadas de lado, interrupções vão sempre existir. Esse post é uma tentativa de compilar alguns conhecimentos e experiências que funcionaram comigo para lidar com esses momentos sem aumentar muito minhas chances de morrer do coração. Se for útil para você, me deixe saber disso! =)

  • Faça um dump da memória

Você está no meio de um raciocínio, talvez escrevendo algum teste que valide seu pensamento, mas o código da implementação ainda não existe. Como seu fone de ouvido está em volume, digamos, estratégico, você não escuta um colega chamar seu nome. De repente alguém toca seu ombro para chamar sua atenção. Terror, pavor, desolação são alguns sentimentos válidos já que você pode perder toda a linha de raciocínio que levaria ao seu futuro código se atender muito prontamente a esse chamado. Porém há algo que pode ser feito: escreva rapidamente um breve resumo daquilo que você está pensando no momento, antes de dar atenção a quem quer que seja. Despeje o máximo de ideias, tantas quanto possível, no editor em que você está codificando. Já comentei que não temos um buffer no cérebro onde podemos salvar temporariamente o raciocínio? Essa é uma forma de simular isso, no fim das contas, é melhor que ter que começar do zero. Quando voltar ao trabalho, você terá um ótimo ponto de partida para recomeçar.

  •  Crie o hábito de trabalhar em timeboxes

Existem diversas metodologias de gestão do tempo que pregam a utilização de timeboxes. Sou inocente o suficiente para achar que o maior motivo para isso é que essa ideia funciona. É muito mais simples manter concentração em uma (ou algumas) tarefas que deverão ser executadas nos próximos 15/20 minutos, do que no “todo” maior que será realizado durante o dia. Não sigo ao pé da letra nenhuma metodologia específica, mas me simpatizo – ou me inspiro se soar melhor – na ideia central do Pomodoro. Procuro dividir as minhas tarefas em pequenos conjuntos de ações que caibam em mini-sprints de 15 minutos. Algumas vezes acabo ultrapassando o tempo, mas procuro nunca ultrapassar meia hora em uma “arrancada”. Faço no máximo quatro desses pequenos “arranques” em sequência e ao término de cada um desses sprints descanso por 2 minutos. Após quatro arranques, descanso em média 15 minutos. Durante esses minutos de descanso, verifico meus emails, mensagens instantâneas e, de vez em quando, os feeds e tweets. Isso já resolve grande parte das quebras de concentração por interrupções. Mas isso não impede que alguém me interrompa pessoalmente. Porém, meus “conjuntos de ações” em andamento são pequenos o suficiente para durarem 15/20 minutos. E fica simples resumir os pensamentos que estão em minha cabeça usando a técnica do dump que descrevi anteriormente.

  • Tenha múltiplos desktops

Se o seu sistema operacional permite que você crie desktops virtuais, você já tem uma ótima arma contra os males das interrupções. E se por acaso ele não permite, você deveria considerar mudar seu S.O. preferido para algum outro mais bacanudo ;) . Brincadeiras a parte, qualquer sistema operacional moderno vai permitir (nativamente ou por meio de alguma aplicação terceira) a configuração de diversos desktops virtuais. Uma forma de estabelecer uma fronteira clara entre o que pode ou não ser usado/acessado durante um timebox, é justamente separar os programas de acordo com a afinidade em diversos desktops. No meu caso, configuro em um deles algumas tabs do browser logadas em minhas contas de e-mail, outra aba no google reader e deixo por ali os clientes de messenger. Em um outro desktop deixo tudo que estou usando no projeto em que estou trabalhando no momento: terminal, editor, ide, suite de testes e outras ferramentas ligadas diretamente ao desenvolvimento. Configuro também um desktop com meu player de música e o navegador de arquivos aberto no diretório onde armazeno meus mp3, caso eu queira dar uma olhada mais específica nesses arquivos. Quando estou trabalhando em algum texto, costumo manter um desktop configurado só para isso: uma instância do editor de texto, uma aba do browser com o WordPress logado…
Toda essa descrição é para dar uma ideia de como venho usando os desktops virtuais em minhas máquinas (tanto do trabalho como pessoal) para distribuir melhor meu foco. Essa forma de organização me permite manter toda a concentração em um único desktop virtual por timebox. Durante os minutos de descanso, fico livre para passear pelos outros desktops, cada um deles já bem organizado de acordo com seu objetivo. Se você puder usar dois monitores dá prá melhorar ainda mais essa ideia.

  • Aceite as interrupções

Minha capacidade de raciocínio é diretamente afetada pelo meu humor e, se com você a coisa também funciona assim, aceite um conselho: não encare as interrupções como uma desgraça. Sério. Houve um momento em que percebi que seria impossível não ser interrompido de vez em quando, foi praticamente uma epifania. Quando compreendi isso passei a trabalhar minha relação com essa questão e até a estudar formas de melhorar meu foco para que as interrupções não me desgastassem nem fossem mais tão incômodas. Parte do resultado desse trabalho e estudos está muito resumidamente condensada nas “técnicas” que descrevi até agora. Mas interrupções são inevitáveis e fazem parte do convívio humano, não há como fugir. É claro que você pode tentar diminuir a frequencia delas, talvez conversar com seu gestor e seus colegas e tentar mostrar prá eles o quanto isso pode ser prejudicial. Mas isso não vai impedir que de vez em quando você tenha que cortar uma ideia genial para responder uma pergunta, ou ouvir uma piada, vai saber. Aproveite o momento. Transforme esse empecilho em uma oportunidade. Sei que está começando a soar como auto-ajuda, mas acredite, isso é uma forma interessante de lidar com uma interrupção chata.
Quando for interrompido, além de fazer seu “dump de memória”, pense: será que meu intervalo já não estava próximo? Será que posso melhorar a tarefa que fiz até o momento, quem sabe tentar uma outra abordagem no próximo timebox? Será que não é uma boa hora prá dar uma garibada em um de meus desktops virtuais, fechar uma tab, criar outra? Será que não é uma hora interessante para discutir com essa pessoa que está me interrompendo aquele assunto que acabei esquecendo de trazer a tona ontem? Quando passei a ter essa atitude, meu humor passou a ser mais constante, mesmo após as interrupções, e percebi que isso foi essencial para que eu pudesse manter a concentração ao iniciar um novo timebox retomando o raciocínio deixado em meu dump de memória improvisado.

Tem dois livros bacanas para você que ficou interessado nas ideias desse post. O Pragmatic Thinking and Learning: Refactor Your Wetware (Pragmatic Programmers) fala sobre a tal falta de uma área de dump no cérebro e da técnica do breve resumo das ideias para facilitar sua retomada. Esse livro é ótimo e, claro, vai bem além disso, é um livro sobre como hackear o cérebro. E há um livro sobre a técnica do pomodoro que explica o assunto em detalhes, é o Pomodoro Technique Illustrated (Pragmatic Life).

Se esse post puder ajudar a melhorar a sua produtividade, ou ao menos lhe dar ideias para que você possa encontrar sua própria forma mais adequada de lidar com as malfadadas interrupções, então terei atingido meu objetivo. Se você conhece outras técnicas ainda melhores para lidar com as interrupções, divida comigo e os outros leitores aqui do blog, deixe um comentário. =)

Posted in Development | Tagged , | 3 Comments