Marco Gomes

nerd veterano, interneteiro profissional, parkouzeiro amador, evangélico aprendiz, fotógrafo iniciante

Textos marcados como ‘software’

Wallpapr, seja alpha tester dos novos recursos

Publicado em 2008-07-25, 18 comentários

Wallpapr Logo

Em novembro de 2006 eu lancei o Wallpapr, um buscador de papéis de parede legais que procura imagens no Flickr. Essa experiência me rendeu uma ótima história e o conhecimento adquirido fez com que eu tivesse capacidade técnica pra construir o protótipo da boo-box alguns meses após.

Ontem resolvi aprender programação server-side (PHP[bb]) pra valer, vou implementar algo até o fim. Essa noite fiz um gerenciador de usuários pro Wallpapr e o primeiro recurso é a lista de wallpapers favoritos.

Pra testar

  1. Crie seu cadastro
  2. Faça o login
  3. Faça uma busca por wallpapers
  4. Adicione alguns à lista de favoritos clicando no ‘+fav’ sobre o thumbnail (talvez você precise recarregar a janela para ver os links)
  5. Veja os favoritos listados no seu perfil

Falta muita coisa, não é possível nem deletar um favorito, está tudo muito cheio de bugs porque estou aprendendo ainda. Quando estiver mais usável e com menos falhas coloco o link “cadastre-se” na interface principal da ferramenta, até lá fica apenas em alpha test pra quem quiser experimentar.

[update 2008-07-25] Havia um erro para computadores sem Firebug, foi corrigido.

Nova geração de aplicativos que rodam no navegador

Publicado em 2008-06-25, 19 comentários

Se você já conhece a história das aplicações ajax[bb] e sabe o que é um framework[bb] pule direto para a novidade.

No início eram trevas

As primeiras aplicações Web tinham interatividade mínima, estavam no velho modelo clica, recarrega, clica, recarrega. Isso porque o navegador só requisitava dados do servidor no momento de abrir a página, qualquer nova informação que não estivesse no documento desde o início exigia uma recarga da página. Trevas.

Então veio o AJAX

O AJAX é uma maneira de carregar e enviar dados sem necessidade de reload, aplicações como Meebo e boo-box fazem uso dessa tecnologia pra trocar informação com o servidor sem precisar de um reload no documento. O Meebo carrega novas mensagens do chat, o boo-box carrega os produtos, tudo sem necessidade de reloads constantes.

Pra facilitar o desenvolvimento de aplicações que usem AJAX, surgiram as primeiras bibliotecas e frameworks JavaScript.

O que é uma biblioteca de software?

Biblioteca é uma coleção de subrotinas usadas pra desenvolver software. Bibliotecas contém código e dados, que provêm serviços pra programas independentes.

Tradução livre de Wikipedia: Library (computing)

O que é um framework de software?

Um framework de software é o esqueleto de uma aplicação que pode ser customizada por um desenvolvedor de aplicação. Como as bibliotecas de software, ele ajuda o desenvolvedor por conter código-fonte que resolve problemas específicos e contém uma API simples. No entanto, enquanto bibliotecas de software atuam como escravas de outros programas, frameworks de software invertem o relacionamento mestre-escravo. Essa inversão, chamada Inversão de Controle, é a essência de frameworks de software.

Tradução livre de Wikipedia: Software framework

Os aplicativos rodando no navegador que imitam aplicativos nativos do sistema operacional

Tela da aplicação 280 Slides

Mesmo com o desenvolvimento do AJAX, ainda é extremamente difícil desenvolver aplicações que rodem no navegador e funcionem de maneira fluída, como se fossem aplicações desktop. As dificuldades são inúmeras: interpretação de código entre as diferentes versões de navegadores, peculiaridades de sistemas operacionais, lentidão de ter uma tonelada de código rodando no browser que é monoprocessado (monothread), problemas intrínsecos na linguagem utilizada, seja JavaScript, ActionScript ou qualquer outra.

Frameworks pra desenvolvimento client-side

Os primeiros frameworks e bibliotecas para criação de aplicações no navegador corrigiram vários dos problemas citados, Google GWT, Yahoo UI e Ext.js corrigem incompatibilidades de navegadores, compactam código pra agilizar a carga da aplicação, otimizam o código pra que o mesmo não trave o navegador, corrigem erros de estruturais do JavaScript. Mesmo assim aplicações desenvolvidas nessas tecnologias sempre ficam um passo atrás das aplicações desktop, a interatividade é, quase sempre, mais crua que em um programa nativo do seu sistema operacional.

Isso acontece porque programar mecanismos de copiar/colar imagens, histórico de ações pra usar no desfazer (control + z), controle de arrastar e soltar vídeos, pode tomar muito tempo do desenvolvedor. O caminho mais prático a curto prazo é simplificar a aplicação, empobrecendo a experiência de interatividade do usuário pro velho modelo clica, espera, clica, espera. Mesmo que o “espera” seja esperar o AJAX e não a recarga da página, o modelo de interatividade é o mesmo: clicar, aguardar o servidor processar os dados e responder, clicar, aguardar…

A segunda geração de frameworks para desenvolvimento client-side

Alguns meses atrás Joel Spolsky usou a história dos aplicativos desktop pra profetizar o caminho do desenvolvimento de aplicativos rodando no navegador:

Então, se a história se repete, nós podemos esperar algum tipo de padronização de interfaces AJAX do mesmo jeito que tivemos com Microsoft Windows. Alguém vai escrever um Kit de Desenvolvimento de Software que você poderá usar pra criar aplicações AJAX com elementos de interface com usuário que funcionem entre as aplicações.

Joel Spolsky em Strategy Letter VI.

Tela de aplicação feita em SproutCore

A partir do segundo semestre de 2008 começam a surgir esses novos Kits de Desenvolvimento de Software. Objective-J, Cappuccino e SproutCore vêm pra mostrar que é possível ter aplicações ainda mais impressionantes que o Gmail ou o Meebo rodando no seu navegador, sem precisar instalar nada (nem plugin de Flash).

Com eles é possível fazer aplicações inteiras que rodam no navegador com pouca, ou nenhuma, interação com o servidor. Se o processamento pode acontecer na máquina do cliente, o servidor pode se preocupar apenas com o que só ele faz: consolidar e armazenar. Com isso toda a arquitetura de servidores e aplicações Web pode ser repensada, finalmente aproveitando, de verdade, o incrível poder de processamento dos computadores pessoais atuais, sejam eles Asus EEEs[bb], iPhones ou MacBooks e deixando pros servidores apenas o trabalho de consolidar dados de diferentes máquinas e armazená-los.

MobileMe, o novo produto Apple de integração de calendário, e-mail, contatos e fotos entre diferentes computadores, tem versões que rodam no navegador, é o Apple Mail, Address Book, iPhoto e iCal no seu Firefox, tudo feito com SproutCore.

Tela de Terminal com mensagens de Mongrel rodando aplicação SproutCore

Eu fiz alguns testes com SproutCore e fiquei impressionado. É como desenvolver uma aplicação Rails ou MERB: você cria projeto, models, views e controllers, roda o Mongrel como servidor de desenvolvimento na sua máquina, desenvolve a aplicação e depois faz o build, que gera apenas arquivos XHTML, JavaScript e CSS pra serem colocados no servidor. É JavaScript[bb] feito gente grande.

280 Slides é, até agora, o mais impressionante exemplo da nova leva de aplicações que está para surgir. Ele tem recursos como copiar/colar elementos gráficos, desfazer (control + z), renderização de imagens e elementos gráficos, tudo gerenciado pelo Objective-J, um framework JavaScript que imita o Objective-C, no qual são feitas as aplicações de Mac OS X. Veja uma apresentação de exemplo.

Abra o site do 280 Slides, clique em Try Now e experimente um pouco a aplicação, perceba como tudo funciona de modo macio, como se fosse uma aplicação desktop, mas rodando no navegador. Você não precisou instalar nada pra ter uma cópia do Apple Keynote rodando no seu Windows :)

Leitura recomendada:

Produtividade pra programadores

Publicado em 2008-04-10, 11 comentários

Algumas semanas atrás o Diego (Tableless) Eis me encaminhou uma cópia do documento sobre Produtividade que o Élcio Ferreira escreveu, onde ele fala sobre montagem de bicicletas, construção de software e qualidade de código.

Veja bem: Eu recebi o documento, de graça, pra escrever sobre ele aqui no blog, não recebi dinheiro e não alterei minha opinião só porque recebi de graça, cada palavra que você lê aqui é sincera e não pode ser comprada. Se você está incomodado com essa atitude, pare de ler o post agora e me xingue por email. É bom que eu saiba quantos leitores meus condenam este tipo de prática.

Ele fala um bocado de coisas que eu, Marco Gomes, já sei, como conceitos da Web 2.0, Padrões Web, AJAX e JSON, isso é praticamente metade do documento. É bom pra introduzir o assunto a quem está completamente fora desde mundo ou nunca trabalhou com conceitos mais modernos da Web.

O que mais valeu a pena, na minha experiência de leitura, foram os capítulos sobre Programação Pragmática, Não Repita a si Mesmo (DRY), Ortogonalidade (Desacoplamento) Tracer Code, Desenvolvimento Orientado a Testes (TDD) e Controle de Versão.

Programação Pragmática[bb] é um conceito/filosofia/mentalidade/religião que vem me conquistando cada vez mais nos últimos dias. Nas palavras do Élcio:

O programador pragmático é, antes de tudo, um inconformado e um otimista. Ele não consegue repetir dezenas de vezes a mesma tarefa sem se perguntar se há uma maneira melhor. Ao mesmo tempo, ele acredita que há maneiras melhores, e que ele pode desenvolver uma.

[...]

O programador pragmático não se contenta em conhecer uma solução, uma linguagem e um jeito de aprender a fazer as coisas.

[...]

Outra atitude do programador pragmático é a responsabilidade. Ele não se contenta em sentar-se em seu cubículo e esperar por tarefas de programação, mas entende que é parte do seu trabalho envolver-se em todo o processo de desenvolvimento.

Significa que ele nunca vai dizer coisas como:

_ Não fiz backup do código, isso é responsabilidade do departamento de infra-estrutura. (Não importa de quem é a culpa, você vai ter que fazer de novo.)

_ Eu imaginei que isso não ia funcionar, mas o cliente quis assim. Ele assinou uma aprovação para o desenvolvimento disso. (Você viu o problema e não disse nada?)

_ O framework que nós compramos não fala com as versões antigas do nosso banco de dados. (Sim, e?)

Isso é só uma pequena amostra, se você se interessou por este pequeno pedaço, compre o PDF completo.

Estes conceitos de programação pragmática e produtividade já foram usados em meu mais novo projeto, a integração boo-box + WeShow, que ainda não foi publicada mas vai entrar no ar em breve. Veja no blog boo-dojo como eu conduzi a implementação da parte client-side do projeto.

Além disso, eu também já escrevi sobre produtividade pra instruir uma equipe que eu coordenava no meu emprego anterior, é um documento bem antigo, mas que contém muita coisa boa.

Saiba mais sobre programação pragmática

Produtividade: Simplicidade e Foco

Publicado em 2008-01-25, 26 comentários

Em um mundo onde os prazos são curtos, os objetivos ambiciosos e os recursos limitados, como mover o mundo com apenas um ponto de apoio e uma alavanca?

Ao longo de minha experiência como desenvolvedor e líder de equipes de desenvolvimento web, aprendi que o caminho mais fácil pra produtividade é: retirar tudo que não for essencial e se concentrar no objetivo.

Simplicidade

Um artigo do Zen Habits, comentado pelo Sérgio F. Lima, diz que você deve tirar tudo que “for possível”, quando nada mais puder ser retirado, aí sim você pode começar a organizar.

Atingir a simplicidade é menos fácil do que parece, constantemente me pego discutindo sobre o porque a boo-box não deveria ter “aquele recurso tão legal”. O mesmo com qualquer outro projeto, como o Wallpapr e os novos produtos da empresa.

Ser simples sem deixar pedaços faltando é uma habilidade que venho exercitando, tirar tudo é fácil, manter apenas o necessário não. Se perguntar se a ferramenta precisa de um recurso é complicado, porque você, que é especialista na ferramenta sempre tem mais habilidade pra manuseá-la que qualquer outro usuário, logo, teria facilidade pra absorver o novo recurso. Mas pense no novo usuário, que não quer se preocupar em aprender mais uma ferramenta, ele precisa do recurso novo? Interface boa é que não exige que o usuário pense pra utilizá-la.

A simplicidade é importante na produtividade porque é retirando toda a gordura que você consegue reduzir seu projeto de modo que ele caiba no prazo. Costumo dizer que é possível entregar qualquer produto em qualquer tempo, tudo depende de quantas partes você vai retirar pra cumprir o prazo.

Foco

Um dos maiores problemas que encontro em equipes de desenvolvimento é a falta de foco. Explico: O programador pega um projeto, ao invés de começar pelo início ele vai logo fazendo o final (que normalmente é a parte que ele mais gosta), depois, faz uma parte do meio, seguido do final do início, depois faz umas coisinhas de um outro projeto e volta novamente pro projeto inicial, fazendo o final do meio, logo depois faz o início do final… O prazo acaba e o projeto está embolado, com várias partes soltas completamente inúteis e “só falta integrar o componente de controle de usuários com o gerenciamento de produtos usando um Web Service, coisa simples” mas nunca fica pronto.

Se concentrar no trabalho e esquecer o resto do mundo pode ser muito difícil pra algumas pessoas. Instant Messengers, Twitter, excesso de janelas e programas abertos, alertas em tempo real pulando na sua frente e apitando sempre que chega um e-mail ou um contato fica online, podem ser a bomba atômica da sua produtividade. Desarme-os.

Além disso você pode se pegar distraído por excesso de objetos em sua mesa, excesso de poluição visual em seu campo visual, celular apitando, pessoas conversando, barulhos de TV. É possível eliminar todas essas distrações e, mesmo que você jure que elas não atrapalham existem estudos (e minha experiência própria) comprovando que tudo influencia seu subconsciente, alterando seu estado de tranquilidade e melhorando ou piorando seu poder de concentração.

Ferramentas

Tão importante quanto limpar seu ambiente de trabalho é limpar sua mente, tenha sempre em mãos um lugar em que possa despejar qualquer idéia/tarefa que de repente pipoque em sua cabeça. Se livrar das distrações mentais na hora que elas aparecem é importante pra que você não fique se torturando: “tenho que lembrar de pagar a conta de luz, tenho que lembrar de pagar a conta de luz”.

Um dos meios que consegui pra me livrar de distrações mentais é usar a metodologia GTD do David Allen[bb], cujo princípio é exatamente este: Guarde seus lembretes em um sistema confiável na hora que eles aparecem na sua mente, assim seu cérebro fica livre pra produzir sem distrações novamente. Mas esse é apenas um dos meios, e eu nem sigo tão à risca assim. Se quiser saber mais sobre GTD pesquise na Web e compre o livro[bb].

Quando quis passar a guardar minhas tarefas em um sistema, fui testando várias ferramentas diferentes que pudessem se adaptar à metodologia GTD: blocos de papel, Remember The Milk, Things, e-mail, iGTD.

Os blocos de papel são bons se aliados a outras ferramentas, na rua usa o papel e em casa coloca num sistema digital. Se mantidos apenas em blocos de papel suas tarefas podem se perder no tempo, e pode ficar extremamente difícil achar alguma coisa após algumas semanas. Papel não funciona bem no longo prazo.

Ferramentas cheias de recursos como o Remember The Milk, Things e iGTD confundem sua cabeça, não importa se você usa Photoshop, um Home Broker ou Eclipse pra trabalhar, pra coletar e organizar tarefas a interface não pode ser cheia de botoes, modo de visualização em tabela ou lista, organizadas por prioridade, data, nome, projeto… Isso tudo só atrapalha.

Os programas supracitados funcionam muito bem pra várias pessoas, mas pra mim não deu, muita complicação me fazia querer criar a tarefa já com projeto, prioridade, data, tags, isso matava completamente minha produtividade. O recomendado é simplesmente criar uma pequena sentença que te faça lembrar o que fazer “enviar e-mail pro Navarro perguntando como estão os ganhos com a boo-box” pronto, depois eu coloco ela no projeto certo, insiro tags e prioridade, mas na hora em que lembro da tarefa só preciso guardá-la em outro lugar pra ela parar de me atrapalhar, assim volto a pensar no código JavaScript que estou escrevendo.

O melhor meio que encontrei foi o texto puro, sim, arquivinho de texto, simples, com acesso rápido na barra de ferramentas do sistema operacional. São três arquivos segundo o contexto:

  • boo-box: tarefas e projetos relacionados com o não-trabalho :)
  • marcogomes: projetos e tarefas da vida pessoal, Wallpapr, envio de coisas pelo correio, lista de compras, moradia etc.
  • check: todos os artigos que tenho que ler na Web, sempre que encontro um artigo que merece ser lido eu coloco neste arquivo, assim ele incha sem poluir meus outros contextos com artigos, esta é a maior lista.

Quando preciso anotar algo, abro o arquivo certo e anoto, mais tarde organizo.

A sintaxe dos arquivos:

Wallpapr:
- implementar permalink @done
- corrigir, how many *do* you want
- Linkar as imagens pra main photopage

Publicar diff do Zuardi:
- implementar diff http://moourl.com/b4ek8
- anunciar no blog @blog

Projetos são seguidos de dois pontos, tarefas precedidas por hífen, identação significa subprojetos, tags são inseridas no final começando com arrouba. Pronto, simples assim, nada mais.

Pra editar e gerenciar o arquivo estou usando o TaskPaper, que comprei no pacote MacHeist, facilita a edição e manipulação das tarefas sem complicar a interface. Porém, existe versão dele na Web e você, mesmo que não use Mac, pode usar qualquer bom editor de texto.

Nunca se prenda em rédeas, mais importante que ferramentas e metodologias é você se libertar das distrações e conseguir achar seu caminho para a iluminação produtiva =D