23 de fevereiro de 2012

Você programa como Edison ou como Tesla?

Nesse carnaval, um dos artigos que saiu da minha sempre crescente lista no Instapaper, foi sobre as diferentes abordagens para a solução de problemas adotadas por dois grandes inventores: Thomas Edison e Nikola Tesla. Além de ter gostando bastante do artigo[1], gostei do que aprendi das pesquisas adicionais que fiz por causa dele (referências no final) e, por fim, tive a motivação que faltava para voltar a postar aqui. Esse post explora o contraste entre as abordagens de Edison e Tesla aplicadas ao desenvolvimento de software.

Edison e o trabalho árduo

"Gênio: 1% inspiração e 99% transpiração" (Thomas Edison)
"Eu não falhei 700 vezes. Não falhei nenhuma vez. Eu fui bem sucedido em provar que aquelas 700 alternativas não funcionam. Quando eu tiver eliminado as que não funcionam, encontrarei aquela que funcionará." (Thomas Edison)

Belas afirmações! Você por acaso conhece alguém bem sucedido que não tenha trabalhado duro nas suas ideias? Se não houver disposição para executar uma ideia, o que muitas vezes envolve desistir de um caminho e tentar outro, a mais brilhante das ideias não vai a lugar algum.

Porém, Tesla, que foi assistente de Edison durante algum tempo, era partidário de uma abordagem diferente.

Tesla e a otimização do trabalho

"Se Edison tivesse que procurar uma agulha no palheiro, ele examinaria palha por palha até encontrar a agulha. Fui uma triste testemunha de coisas como essa, sabendo que um pouco de teoria e cálculo teriam economizado noventa porcento do seu trabalho." (Nikola Tesla)

Quem você acha que teve mais razão nas suas afirmações? Ora, de certa forma, ambos estavam corretos. Disposição para trabalhar arduamente é importante, mas otimizar a maneira como você trabalha também. Uma coisa complementa, não exclui, a outra.

Caso você não saiba, a Edison é atribuída a invenção da lâmpada elétrica incandescente; aquela que gasta mais energia gerando calor do que luz. E Tesla inventou a lâmpada fluorescente, muito mais econômica. Edison também foi o pioneiro na geração de energia elétrica contínua (DC); eficiente, porém cara. Enquanto Tesla foi o pioneiro na energia alternada, muito mais barata, e que se tornou e continua sendo o padrão mundial.

O ponto que quero trazer à atenção aqui é: quando você resolve problemas, você age mais como Edison ou como Tesla? Um breve incidente pessoal ajuda a explicar a diferença no contexto do desenvolvimento de software.

Meu momento Edison

Atualmente estou trabalhando num projeto usando Titanium Mobile (veja meu blog sobre Titanium). A linguagem usada pelo Titanium é o JavaScript, que comecei a conhecer de verdade de um ano pra cá. Nesse projeto, a app mobile recebe dados no formato Json de um WebService. Esses dados incluem um array de centenas de objetos ordenados por um atributo específico. Porém, em um dia de trabalho solitário em home office na semana passada, surgiu a necessidade de se fazer buscas nesse array por um atributo diferente da sua ordenação. Não seria conveniente fazer uma busca sequencial em centenas de elementos. Então, sem medo de encarar o trabalho envolvido, implementei um mecanismo de indexação que consistia em manter um segundo array contendo em cada elemento um objeto com dois atributos: o valor do campo pesquisável e sua posição no array original. Esse array seria ordenado pelo tal atributo pesquisável. Para isso, implementei um BubleSort e uma busca binária, ambos customizados para trabalhar com arrays de objetos. Levei algumas horas para terminar essa solução e, no final, me senti orgulhoso por ter realizado aquele trabalho árduo. Mas, no dia seguinte, ao explicar minha solução para um colega no escritório, todo meu orgulho foi por água abaixo.

Antes que eu terminasse minha explicação ele perguntou: Por que você não usou um hashtable? Então, minha ficha caiu. Todo objeto JavaScript é um hashtable! E o pior é que eu já sabia disso. Eu não precisava implementar ordenação nem busca. Bastava, ao invés de usar o segundo array, usar um objeto cujos atributos fossem os valores do campo pesquisável e cujos respectivos valores fossem sua posição no array original.

Por que eu implementei uma solução muito mais complexa do que era necessário quando eu tinha total condição de conceber uma solução extremamente mais simples? Após refletir um pouco, identifiquei pelo menos dois motivos:

  • Parei de pensar em alternativas na primeira solução que me veio à mente;
  • Me apeguei (ainda que temporariamente) àquela solução.

O resultado foi comparável à lâmpada incandescente de Edison. Funciona, mas gasta mais energia produzindo calor que luz.

Como seria à moda Tesla

"Se quiser derrubar uma árvore na metade do tempo, passe o dobro do tempo amolando o machado." (Provérbio chinês)

Esse provérbio se encaixa muito bem no estilo pragmático de Tesla. Infelizmente, o problema que acabei de contar não aconteceu num dos meus dias mais pragmáticos. Se eu tivesse pensado um pouco mais nas soluções possíveis para aquele problema, provavelmente teria chegado na solução mais simples e óbvia. Ou, se tivesse praticado o desapego à minha ideia e chamado o meu colega no GTalk para conversar sobre o problema, provavelmente ele teria me sugerido a solução mais simples.

No final das contas, levei cerca de 5 minutos para reescrever a minha solução Edison usando a abordagem Tesla. Evidentemente, esse retrabalho não fui inútil porque o aprendizado que vem da tentativa e erro têm o seu valor. Foi o que Edison quis dizer ao citar suas 700 tentativas de acertar. Mas, como Tesla nos lembrou, um pouco de teoria e cálculo podem economizar muito trabalho.

Edison e Tesla: estilos complementares

No dia a dia do desenvolvimento de software, encaramos problemas que exigem tanto um perfil Edison quanto um perfil Tesla. Disposição para encarar os desafios e aprender com os próprios erros é fundamental, mas se fizermos uma pausa antes de colocar as mãos no teclado e pensarmos de maneira analítica sobre as soluções possíveis, economizaremos tempo e "energia". Se for possível compartilhar esse momento analítico com mais alguém, melhor ainda. É preciso apenas cuidar para não ficar pensando indefinidamente.

De hoje em diante, tenho um lema: antes de gastar energia resolvendo um problema, preciso pensar se é hora de ser um Edison ou um Tesla.

Que achou desse artigo? Deixe seu comentário.

Foto: Globo de plasma, uma das invenções de Nikola Tesla. (Wikipedia)

[1] ^ Scott Berkun. "Edison vs. Tesla: two approaches to problem solving"

Para saber mais:

Postar um comentário