Arquivos da categoria: Desenvolvimento

Não peça feedback, obtenha-o

Todo grande líder sabe que o feedback sincero daqueles que estão à sua volta é uma das principais ferramentas para melhoria e evolução de seu trabalho e de seu papel como líder. Receber e saber processar as críticas é fundamental para aprender e melhorar como líder, quando o feedback é um elogio é ainda melhor, nada mais gostoso do que ter a certeza que você está no caminho certo.

Mas há um grande dilema: Como consigo o feedback sincero dos membros do meu time?

A resposta parece simples, afinal, não bastaria apenas perguntar? Bom, é quase por aí, mas deve-se tomar muito cuidado com o tipo de pergunta a se fazer.

A primeira regra que deve-se ter consciência é que nunca será possível conseguir feedback sincero com perguntas idiotas. Uma pergunta idiota geralmente é uma pergunta da qual você não quer ouvir a resposta, ou uma pergunta que você espera ouvir aquilo que você quer ou, até mesmo, uma pergunta cuja resposta é óbvia.

Pergunta idiota: No meio de um jogo de futebol, pergunta-se para a árbitro: Você está ocupado?

Qualquer ser vivo pensante saberá a resposta do árbitro. Se a pergunta é idiota a resposta é tola.

Isso não significa que a pessoa não queira te dar feedback, mas que há outras maneiras mais eficazes de se conseguir feedback. Não faça uma solicitação em forma de ordem pergunta direta.

Lembre-se sempre destas palavras pois elas serão a chave para o seu sucesso como líder de qualquer time em qualquer área ou empresa, especialmente para se obter feedback sincero e colaboração das pessoas. Estas são as palavras mais poderosas que existem para obter cooperação: “Eu preciso de”. Essas simples palavras são capazes de mágicas e feitos surpreendentes.

Pedir feedback não significa que você irá consegui-lo, especialmente se o pedido começar com “eu quero”. Quando você diz a alguém de seu time que você “quer” algo, a primeira coisa que essa pessoa pensa é: “ah, claro, todos queremos algo que não podemos ter”. Mas se você começa com “Eu preciso de”, significa que você pensou sobre o que é necessário para alcançar o que você está pedindo e, para tal, precisa da ajuda desta pessoa. É incrível como as pessoas adoram sentir-se necessárias, saber que podem ajudar com algo, isso faz toda a diferença entre escutar uma resposta tola e conseguir um feedback sincero.

Aprendendo a obter feedback: Preciso de feedback específico sobre meu plano para que a próxima iteração dê certo.

Simples e indolor, certamente você terá muito a ouvir e aprender.

Um líder é qualquer pessoa que possa lhe dar apoio e orientação necessárias para alcançar seu objetivo. Às vezes o seu maior desafio como líder é saber onde e quando cada pessoa do seu time executará este papel, e cabe a você conseguir obter o feedback necessário destas pessoas.

Evitando o cache no cliente

HTML e CSS nunca foram meu forte, eu sei o que preciso saber para sobreviver, já que trabalho com desenvolvimento web. Não da pra esperar que eu consiga montar uma apresentação fantástica usando HTML5 e CSS3 e ainda por cima pensando fortemente em semântica, organização e melhores práticas, fato!

Não estou aqui criticando HTML e CSS, eu entendo perfeitamente a importância de tudo isso, mas não posso negar que nunca me dediquei muito para aprende-las, até porque nunca tive a necessidade de ser o responsável por esse trabalho. Exatamente por isso eu aprendi algo babacamente simples esses dias, porém extremamente eficiente.

Imagine mudar o CSS, subir pra produção e o cliente simplesmente ver o seu site totalmente quebrado? Pior, mudar uma imagem (um banner ou qualquer outra imagem) e o cliente continuar recebendo a imagem antiga. Quem trabalha com sistemas web e nunca passou por isso?

É muito comum alterarmos qualquer coisa estática como CSS, imagens e até JavaScript e essas alterações não serem interpretadas pelo navegador. O jeito é limpar (ou desligar) o cache do navegador, dar uns 3 ou mais refreshs ou apelar pro CTRL+F5, isso é o que fazemos desenvolvendo. Mas e quando isso acontece em produção, vamos dizer pro usuário/cliente ‘limpar o cache’? Claro que não, temos que dar um jeito então do navegador do cliente reconhecer as alterações logo na primeira visita.

Isso ocorre pois o navegador faz cache local destes recursos e os utiliza quando julga ser a melhor opção. A mesma coisa ocorre com proxy de redes, que também podem fazer cache. O jeito para descartar esse cache é fazer algum malabarismo no servidor web, mas nem sempre isso é possível, então precisamos recorrer à aplicação, onde – geralmente – temos maior domínio.

O cache no navegador tem uma regra básica super simples: o nome do recurso estático. Se mudarmos o nome de um arquivo CSS ou imagem, por exemplo, não teremos problema algum com cache. Se você puder fazer isso na sua aplicação, ótimo, problema resolvido.

Mas se não puder, temos outra opção simples e eficiente, podemos anexar algum parâmetro falso no nome do recurso, por exemplo:

1
<link rel="stylesheet" type="text/css" href="/css/estilo.css" />

Ao atualizar propriedades desta folha de estilo as alterações não serão perceptíveis no navegador enquanto o cache (do navegador) não for atualizado. E isso ou o cliente faz explicitamente ou nós faremos por ele. Então, vamos fazer a nossa parte, vejam:

1
<link rel="stylesheet" type="text/css" href="/css/estilo.css?1" />

O simples parâmetro ?1 cuida disso pra nós. O navegador vai encarar que se trata de uma nova folha de estilos e fará o download do servidor, utilizando esta nova versão no lugar da que ele tem em cache, na próxima visita o ?1 não vai fazer mais nada, já que o navegador já tem a folha de estilo com o ?1 em cache. O parâmetro ?1 pode ser atualizado toda vez que for preciso fazer alguma alteração na folha de estilo, desta forma o cliente terá sempre a versão correta toda vez que ela for atualizada.

Outra saída é usar um parâmetro que nunca será o mesmo, por exemplo: usar a data completa (dia, mês, ano, hora, minuto e segundo). Só que isso fará com que o cliente faça o download do recurso no servidor toda vez que acessar o site, o que pode causar um grande tráfego no servidor, impactando diretamente na performance da sua aplicação. Num captcha faz sentido, mas em outros casos é bom pensar bastante antes.

É isso, dica simples e fácil (e talvez boba), mas que me salvou um dia desses.

Aniversário do CEJUG, Lucene, Caranguejo e muita castanha

Este final de semana eu estive em Fortaleza, Ceará, participando do Café com Tapioca especial do 7º aniversário do CEJUG. Resumir um evento nunca foi tão simples: Excelência, organização e hospitalidade. Foi assim que o CEJUG fez mais um grande evento. E eu mais uma vez tive a felicidade de participar e contribuir com um pouco de conhecimento e experiência para os amigos cearenses.

DSC08069

O evento estava bem cheio, muita gente acordou sábado cedinho para não perder às apresentações do Bruno Pereira, sobre como se tornar um desenvolvedor web melhor e mais produtivo, do Régis Melo para aprender como desenvolver e entregar aplicativos para o mundo inteiro, e do Victor Oliveira para desmistificar algumas lendas sobre times ágeis de desenvolvimento.

DSC08164

De tarde tivemos a retaliação apresentação do Rafael Ponte e Tarso Bessa sobre os 10 maus hábitos dos desenvolvedores JSF, uma excelente explanação do Rodrigo Yoshima sobre a falta de conhecimento das pessoas que gostam de se dizer ágeis e uma verdadeira aula de TDD com o Paulo Silveira.

E a minha apresentação também foi na parte da tarde. Nesta apresentação falei sobre o Lucene e sobre o Solr e Hibernate Search, duas ferramentas baseadas no Lucene, porém com propósitos bastante distintos.


Além dos slides acima também foram apresentados três exemplos: com Lucene, com Solr e com Hibernate Search. Os exemplos são bem simples e a intenção é apenas mostrar o funcionamento básico das ferramentas. Todos os códigos estão disponíveis no meu github: aprendendo-lucene, aprendendo-solr e aprendendo-hibernatesearch.

Continue lendo Aniversário do CEJUG, Lucene, Caranguejo e muita castanha

Estamos contratando na Giran

Há pouco tempo pude compartilhar minha enorme felicidade com o lançamento da Giran Soluções e Ensino com todos vocês dois leitores, e desde lá estamos trabalhando duro, literalmente ralando por aqui. Cada dia, cada entrega, cada projeto e contrato conquistado são alegrias enormes e, sempre comemoradas com muito entusiasmo. Agora estamos abrindo nosso primeiro processo de seleção, estamos crescendo!

A Giran é uma empresa nova, jovem, descontraída e muito, muito comprometida com seus objetivos. Trabalhamos de forma ágil, usamos Scrum internamente e nos projetos dos clientes, além de várias práticas de Extreme Programming, inclusive TDD e programação em pares. Aversão à estas práticas não é um bom diferencial :)

Neste processo de seleção nós não estamos procurando especialistas e nem donos da verdade, aqui na Giran nós usamos de tudo um pouco. Cada profissional tem uma especialidade ou ‘sabor preferido’, nós também temos as nossas e sabemos valoriza-las, mas estamos interessados especialmente em profissionais multi-disciplinares, que sejam capazes de desenvolver, analisar, testar e arquitetar com diferentes linguagens e tecnologias, ou que ao menos estejam dispostos a trabalhar desta forma. Como trabalhamos com Internet, conhecimentos em Javascript, CSS, XHTML, mashups com APIs de terceiros, etc, serão um bom diferencial.

É importante que o candidato saiba que prezamos muito pela qualidade do que fazemos, nós estudamos os códigos um dos outros e nos respeitamos por isso, aprendemos muito assim. Nosso principal objetivo é a qualidade máxima, nós não viramos noite trabalhando e mesmo assim entregamos software no prazo, testado e funcionando muito bem, obrigado! Por isso estamos procurando pessoas com esse perfil: comprometidas, organizadas, que saibam trabalhar muito bem em equipe e que prezem pela qualidade do que fazem.

Por último, e talvez mais importante: todos nós somos nerds, geeks, apaixonados por tecnologia e super atualizados com as últimas novidades da Internet e do mercado. Nossa equipe é jovem, irreverente, descontraída e em constante evolução. São pessoas com esse perfil que estamos procurando.

A empresa oferece contratação com salário de mercado (não o do mercado capixaba), plano de benefícios e outros incentivos como cursos e treinamentos (especialmente aulas de inglês), um iMac ou Macbook (sim, gostamos da maçã por aqui) exclusivo para você, e claro vaga garantida nas partidas de xbox360. Estamos localizados em Jardim da Penha, Vitória-ES.

Se você acha que se enquadra, mande um email para mim (contato at giran.com.br) com seu currículo e os nomes dos 3 últimos livros técnicos que você leu. Diga se você sabe quem é o Taurin e qual sua ocupação, afinal de contas você está indo para Giran Castle Town.

Não pense que estamos procurando apenas profissionais experientes e de altíssimo nível: se você é estudante e tem pouca ou nenhuma experiência mas gosta de ler e aprender sobre coisas novas você não está fora! Escreva pra gente.

Trabalhando com mais de um JDK no Ubuntu

Hoje em dia ter o Java5 e Java6 instalados na máquina de um desenvolvedor é praticamente uma obrigação. Java2 1.4 e Java7 também figuram bastante, ao menos aqui por estas bandas.

No meu macbook, que uso para trabalhar, eu controle tudo via a variável de ambiente $JAVA_HOME, é bem tranquilo. Quando quero compilar ou rodar alguma coisa com outro JDK/JVM é só mudar o $JAVA_HOME e pimba!

Quando eu usava Ubuntu sempre tive problemas para instalar mais de um JDK através do apt-get. A instalação era uma maravilha, como sempre no apt-get, mas por algum motivo o JDK e JVM padrões sempre ficavam com a versão mais alta. Eu tentava ‘corrigir’ usando a solução do $JAVA_HOME e incluindo o $JAVA_HOME/bin no $PATH, mas isso só funcionava enquanto eu estivesse no bash ou em aplicações que não fizessem referência direta ao /usr/bin/java.

Recentemente assumimos alguns servidores aqui na Giran e estamos migrando todos para Ubuntu Server. Não vou entrar no mérito dos porquês desta escolha para não criar uma guerra santa. Mas o que importa é que nestes servidores nós queríamos usar o apt-get para gerenciar todos os pacotes, afinal não temos paciência tempo para cuidar de tantos detalhes pequenos em tantos servidores.

Ao instalar um JDK, qualquer versão, através do apt-get, vários comandos estarão disponíveis no $PATH, dentre eles o java, javac, javap, jar, etc. Estes comandos estão sempre /usr/bin, mas são um link simbólico para os comandos em /etc/alternatives, que por sua vez são um link simbólico para o arquivo executável de verdade. Após instalar mais um JDK aí a coisa complica, qual deles será o padrão!? A cadeia de links simbólicos continua a mesma e mudar todos (mais de 15) manualmente não é muito indolor.

As instalações ficam sempre em /usr/lib/jvm/java-$versão, que é exatamente onde vão bater os links simbólicos de /etc/alternatives. No meu caso, por exemplo, tenho estas duas instalações: /usr/lib/jvm/java-6-sun e /usr/lib/jvm/java-1.5.0-sun. Se eu quiser alternar entre elas como padrão para todo o sistema, posso simplesmente usar o comando “update-alternatives” ao invés de sofrer reconfigurando um monte de link simbólico.

Então vamos lá:

spock@vulcan:~$ sudo update-alternatives --config java
There are 2 alternatives which provide `java'.
Selection    Alternative
-----------------------------------------------
+        1    /usr/lib/jvm/java-6-sun/jre/bin/java
*        2    /usr/lib/jvm/java-1.5.0-sun/jre/bin/java

Press enter to keep the default[*], or type selection number: 2
Using '/usr/lib/jvm/java-1.5.0-sun/jre/bin/java' to provide 'java'.

E pronto, simples assim. O item com o sinal de + (mais) é a opção default e o item com o sinal de * (asterisco) é a opção atual.