5 de novembro de 2010

79 colunas automaticamente no vim

Para deixar o vim formatar as linhas dos seus programas automaticamente com largura de 79 caracteres, use as seguintes opções:
:set textwidth=79
:set formatoptions+=tcqaw

Para entender melhor, :help 'formatoptions na linha de comandos do vim.

Abaixo estão minhas configurações para editar programas Python usando identação de 4 espaços, folding e linha com 79 colunas:
autocmd FileType python setlocal foldmethod=indent foldcolumn=5 foldnestmax=3
autocmd FileType python setlocal tabstop=4 softtabstop=4 shiftwidth=4 expandtab
autocmd FileType python smarttab autoindent smartindent
autocmd FileType python setlocal formatoptions+=tcqaw textwidth=79

Essas configurações fazem automaticamente muito trabalho braçal que o PEP8 recomenda.

21 de outubro de 2010

Confianca é a base

Meu amigo @franciscosouza compartilhou a apresentação Seja Lento, Seja Ágil com a galera.

Lá tem muita coisa legal, vale a pena vê-la.

Nela, um slide com uma citação do @henriquebastos me chamou atenção:
"Se você não tiver uma equipe na qual confia, nenhuma metodologia vai resolver seu problema"

Captou?

Eu já tinha ouvido esse argumento num tech talk que Linus Torvalds fez no Google, sobre o git. Ele defende que a base da segurança de um controle de versão descentralizado é a confiança, que, por sua vez, é consequência do mérito. Ou seja, a confiança é também meritocracia. É, faz sentido...

Sugiro que você preste bastante atenção a essa afirmação e faça um esforço de memória para lembrar dos lugares e das pessoas com quem você já trabalhou.

Adiantou alguma metodologia de trabalho, fosse ela qual fosse, se as pessoas não confiassem umas nas outras?

Esse é o pressuposto de um time ágil: confiança.

Pense nisso.

20 de outubro de 2010

Python e web2py

Para quem é desenvolvedor a vida profissional não pode cair na rotina, certo?

Então, já que estou com o tempo um pouco mais livre, resolvi reativar um projeto que ficou parado há mais de 1 ano: aprender mesmo web2py.

Web2py é um framework para Python, que tem ganho espaço principalmente por não precisar de configuração para rodar. É full-stack, completo. Basta descompactar em um diretório e começar a usar.

Assim como Django e Rails, ele tem um servidor web para desenvolvimento, e algumas coisinhas complementares que ajudam bastante.

Em julho/2009 eu escrevi um post que analisa os motivos para escolher o web2py como plataforma de desenvolvimento.

Se você se interessar, acompanhe o blog Aprenda Web2py ou siga-me no twitter: @viniciusban.

13 de outubro de 2010

Até a Microsoft vai de Wordpress e jQuery

Há muitos anos empresas vivem de free software. Não necessariamente gratuito (free of charge), mas free no sentido de te dar liberdade (freedom).

Linguagens famosíssimas como PHP, Javascript, Java, Python, Perl e Ruby são free.
Bancos de Dados como MySQL, Postgre SQL também.
Nem preciso falar do maior fenômeno do free software, o Linux.

Há alguns anos a IBM anuncia apoio incondicional ao Linux, investindo cifras enormes nele.
O Google deu uma alavancada nesse cenário, oferecendo ferramentas bastante poderosas, baseadas na web e distribuídas como free software.

Há muito tempo, free software deixou de ser sinônimo de amadorismo ou papo de universitários ideológicos comunistas.

Atualmente as melhores práticas na área de desenvolvimento de software são oriundas do ambiente free ou open source e bastante adotadas por eles.

Veja XP, TDD e Agile, por exemplo. Tem tudo a ver com o cenário de distribuição e desenvolvimento desse tipo de software.

Mesmo apesar disso, muita gente ainda sentia falta de um player importante, que até então ia contra esse movimento, apesar de algumas investidas discretas, a Microsoft.

Recentemente eu li duas notícias que me deixaram com uma pulga atrás da orelha e me motivou a escrever esse artigo:
Se você achava que o fato de a Microsoft não ter entrado mesmo na onda do mundo open era um bom motivo para defender arquiteturas proprietárias, repense seus argumentos.

Até ela já fez isso. Eu resolvi traduzir um parágrafo do artigo sobre a contribuição dela ao jQuery porque diz muito à indústria de software. Observação: destaques acrescentados por mim:
"Durante os sete meses de desenvolvimento, as equipes do jQuery e da Microsoft trabalharam juntas para garantir que o código estava de acordo com as melhores práticas especificadas pelo projeto jQuery e atendiam às necessidades específicas da comunidade jQuery. Nós também garantimos que qualquer contribuição de código estivesse disponível para a comunidade jQuery conforme os mesmos termos de licenças não restritivas, da mesma forma que o jQuery JavaScript Library."

Sobre a migração do Live Spaces, note a quantidade de blogs que serão migrados: 30.000.000 (30 milhões)!

Acorde! Até a Microsoft já percebeu que também existem boas ideias fora de Redmond.

22 de setembro de 2010

Veja seu programa Python rodando!

O Online Python Tutor é muito bom para quem está aprendendo a programar e praticar os conceitos de lógica.

Com ele você consegue acompanhar a execução do seu código linha a linha, como se fosse um depurador. E ele ainda mostra as variáveis e seus conteúdos.

Não é recomendado para depurar código, não. É só para aprender mesmo.

17 de setembro de 2010

Pratique Python online no CodingBat

Há alguns dias eu postei sobre um curso de Python elaborado pelo Google.

Fuçando, descobri que o autor, Nick Parlante, é professor de Stanford e mantém um projeto bem legal para ajudar pessoas a aprenderem Python e Java. É o CodingBat.

É um bom lugar para praticar Python e ver os resultados ali, na hora.

16 de setembro de 2010

Garanta o fechamento dos arquivos

Há alguns dias rolou uma thread interessante na lista Python Brasil sobre leitura de arquivos texto.

O Leonardo Santagada fez uma observação importantíssima a respeito de como devemos abrir e ler arquivos em Python.


A recomendação dele é abrir e ler arquivos usando o seguinte pattern:
with open('arquivo.txt') as arquivo:
    for linha in arquivo:
        print linha.strip()

Em seguida, o Carlos Ribeiro explicou o motivo disso:
Só pra complementar, seria bom explicar a razão por trás disso tudo... acho
que muita gente não sabe o motivo.

A forma "simplista" de abrir & ler o arquivo com "for linha in open('arquivo.txt')" sem fechar o arquivo explicitamente no final do loop funciona bem no CPython e por isso muita gente assume que vai funcionar em qualquer versão do Python. O que pouca gente sabe é que isso não é uma feature da classe "file", mas sim um "efeito colateral" do sistema de "garbage collection" ou "coletor de lixo".

Para piorar, o idioma simplificado foi amplamente divulgado durante vários anos como sendo a forma "pitônica" de fazer leitura de arquivos. Por isso muita gente ainda aprende este idioma como sendo o certo.

Explicando: no CPython, assim que a última referência para o objeto é destruída (o que acontece "automaticamente" na saída do "for"), o objeto que referencia o arquivo na memória é descartado *na hora* e como consequencia, o arquivo em disco é fechado.

Em outras versões de Python o coletor de lixo funciona de forma bem diferente e por isso, o arquivo pode ficar "pendurado", mantido aberto sem necessidade, até que o lixo seja coletado (o que em alguns casos pode ocorrer só no momento em que o script pára de rodar). O que o "with" faz é garantir que o arquivo seja fechado no final do bloco, independente da implementação do coletor de lixo. Por isso a sugestão do Leonardo é MUITO importante.

--
Carlos Ribeiro
Consultoria em Projetos
twitter: http://twitter.com/carribeiro
blog: http://rascunhosrotos.blogspot.com
Valeu pela aula, pessoal.

9 de setembro de 2010

Curso gratuito de Python em portugues no Youtube

O curso "Lógica de Programação Usando Python - Curso Completo" é uma iniciativa do prof. Ronaldo Ramos, do Instituto Federal de Educação Ciência e Tecnologia do Ceará.

No site do IFET-CE tem o índice com todas as aulas em vídeo, e também tem na página do autor, no Youtube.

Na data desse post (09/set/2010) constavam 21 aulas disponíveis.

Vale visitar o site deles, o Lambda, que fala sobre computação em vários aspectos.

3 de setembro de 2010

Aprenda Python de graça no Google e no MIT

Tem gente que ainda duvida que Python é uma linguagem muito usada.

Depois que li o texto Google Python Style Guide, tenho repassado para várias pessoas. Na seção "Background", está escrito que Python é a principal linguagem de script usada pelo Google. Vale lembrar que o Guido van Rossum, criador da linguagem, também trabalha lá.

Recentemente descobri que o Google disponibilizou gratuitamente o curso Google's Python Class, direcionado a iniciantes. É, "de grátis", 0800, sem custo, no horário que você puder. O conteúdo é muito bom, especialmente para quem nunca viu Python na vida. Se você preferir, faça o download do material completo do curso.

Tem também alguns cursos gratuitos muito bons do MIT. Sim, o Massachusets Institute of Technology. São eles:

Os vídeos você encontra no Youtube.

A desvantagem para alguns é que esses cursos são todos falados e escritos em inglês. Então aproveita e faz um curso gratuito de inglês da IBM.

30 de agosto de 2010

PHP em 15 minutos - parte 2

Continuação da parte 1.

Hoje vamos falar sobre acesso a banco de dados usando o MySQL, que forma a dupla dinâmica com o PHP.

Em PHP puro, os comandos SQL são enviados ao banco de dados normalmente, sem nenhum segredo. Abaixo estão os comandos mais comuns para lidar com o MySQL, em 15 minutos.

Observação: nesses exemplos não fazemos o escape das strings como deveria (mysql_real_escape_string()) nem o tratamento de erros como numa aplicação real.

// mysql_connect() e mysql_select_db()
$servidor = 'localhost';
$usuario = 'eu';
$senha = 'minhasenha';
$banco = 'meus_exemplos';

$conexao = mysql_connect($servidor, $usuario, $senha);
if (!$conexao) {
    die("nao consegui conectar: ", mysql_error());
}

mysql_select_db($banco, $conexao);

Se você estiver usando UTF-8 como codificação padrão do seu banco de dados e das suas páginas web (o que recomendo fortemente), acrescente essas linhas depois do mysql_select_db():
// utf-8
mysql_query("SET NAMES 'utf8'");
mysql_query('SET character_set_connection=utf8');
mysql_query('SET character_set_client=utf8');
mysql_query('SET character_set_results=utf8');

A partir de agora vou considerar que $conexao acima é a conexão ativa para todos os comandos abaixo.
// insert
$sql = "INSERT INTO pessoa (nome, fone) VALUES ('Joao', '8876-1234')";
$inclusao = mysql_query($sql, $conexao);
if ($inclusao) {
    echo "o ultimo ID inserido foi: ", mysql_insert_id();
} else {
    die(mysql_error($conexao));
}

// update
$sql = "UPDATE pessoa SET nome = 'Joaquim' WHERE id=1234";
$alteracao = mysql_query($sql, $conexao);
if ($alteracao) {
    echo mysql_affected_rows(), " linhas alteradas";
} else {
    die(mysql_error($conexao));
}

// delete
$sql = "DELETE pessoa WHERE id=4321";
$exclusao = mysql_query($sql, $conexao);
if ($exclusao) {
    echo mysql_affected_rows(), " linhas excluidas";
} else {
    echo mysql_error($conexao);
}

// select retornando apenas 1 linha
$sql = "SELECT nome, fone as telefone_da_pessoa FROM pessoa WHERE id=1234";
$consulta = mysql_query($sql, $conexao);
if (!$consulta) {
    die(mysql_error($conexao));
}

if (mysql_num_rows() == 0){
    die("nenhuma linha encontrada");
}

$reg = mysql_fetch_assoc($consulta);

echo "nome: {$reg['nome']} \n";
echo "fone: {$reg['telefone_da_pessoa']} \n";

// select retornando várias linhas
$sql = "SELECT nome, fone FROM pessoa WHERE nome='Maria%'";
$consulta = mysql_query($sql, $conexao);
if (!$consulta) {
    die(mysql_error($conexao));
}

if (mysql_num_rows() == 0){
    die("nenhuma linha encontrada");
}

$i = 0;
while ($reg = mysql_fetch_assoc($consulta)) {
    $i++;
    echo "{$i} - nome: {$reg['nome']} / fone: {$reg['fone']} \n";
}


No próximo post vou falar de orientação a objetos na prática.

27 de agosto de 2010

PHP em 15 minutos - parte 1

Quando eu vou aprender uma nova linguagem de programação sinto falta de informações rápidas, tipo uma cartilha. A Novatec fez sucesso com as cartilhas há um tempo atrás. Nem sei se elas ainda são publicadas.

Como tenho visto alguns programadores migrarem de plataforma .Net para PHP, resolvi fazer um fast track agrupando conceitos e exemplos pra essa galera que não precisa de explicação "for dummies".

Primeiro, vamos a alguns conceitos:
  1. PHP tem sintaxe C-like. As chaves e os pontos-e-vírgulas, lembra? Tem também if, for que são parecidos com os equivalentes em C. Testes condicionais devem estar entre parênteses e o teste de igualdade é feito com o ==.
  2. Mas não preciso do main(). Basta começar a escrever o programaa. O PHP interpreta tudo o que estiver dentro de <?php e ?>.
  3. PHP tem tipagem dinâmica de dados. Você não precisa dizer que a variável $i será um inteiro. Basta jogar um número pra ela e pronto.
  4. Todas as variáveis começam com um $.
  5. Tipos de dados: string, booleano, inteiro, float, array, objetos.
  6. PHP usa funções para fazer quase tudo: Converter de maiúscula para minúscula, substituir textos, quebrar strings, formatar números, etc.
  7. Com PHP você também pode desenvolver scripts de administração do sistema operacional (apesar de não ser muito usada para isso), rodar scripts através da crontab, desenvolver orientado a objetos (ou não), acessar diversos bancos de dados.

Obedecendo ao título desse post, vamos pros 15 minutos de código real:

// for e if
for ($i=1; $i <= 10; $i++) {
    if ($i % 2 == 0) {
        echo "o número {$i} é par <br> \n";
    } else {
        echo "{$i} é ímpar <br> \n";
    }
}
echo "saí do loop com o conteúdo {$i} <br> \n";

// while e break
$i = 0;
while ($i < 10) {
    $i++;
    echo "só vou até 6 \n";
    if ($i > 5) {
        break;
    }
    // veja também: continue
}
die("fim");

// substituicao em string
$contexto = "vou fazer um novo xxx";
$de = "xxx";
$para = "teste";
$novo_texto = str_replace($de, $para, $contexto);
echo $novo_texto;

// converter para minusculas
$maiusculas = 'TUDO DE UM JEITO SÓ';
$minusculas = strtolower($maiusculas);
echo "grande={$maiusculas} - pequeno={$minusculas}";
// veja também: strtoupper(), ucfirst(), ucwords(), strpos(), trim()

// funcao com retorno e 2 parms. O ultimo é opcional
function calcular($n1, $n2=0) {
    $t = ($n1 * 10) + $n2;
    return $t;
}

echo calcular(3);
echo " - ";
echo calcular(4, 7);

// array simples e foreach
$nomes = array();
$pessoas[] = "Marcos";
$pessoas[] = "Pedro";

foreach ($pessoas as $nome) {
    echo "{$nome} \n";
}

// array associativo (dicionario)
$contatos = array();
$contatos["maria"] = "3254-7654";
$contatos["joaquim"] = "8721-1435";

foreach ($contatos as $fulano => $fone) {
    echo "numero de {$fulano}: {$fone} \n";
}

// testes boleanos
$n = 10;
$s = "";

if ($n) {
    echo "tenho conteudo \n";
}

if (!$s) {
    echo "string vazia";
}

// aspas simples e duplas
$nome = "jose";
$sobrenome = "da silva";
$nome_completo = "{$nome} {$sobrenome}";
$coisa_estranha = '{$nome} {$sobrenome}';
echo $nome_completo, "
 \n";
echo $coisa_estranha;

// concatenar strings e testar booleano
$misturado = "AgOrA É tUdO oU NAda";
$vai_juntar = true;
if ($vai_juntar) {
    $tudo_minusculo = "quem sabe se ". strtolower($misturado). "?";
    echo $tudo_minusculo;
}

PHP também tem printf(), if...elseif, regexp, switch...case, do...while e até goto (a partir da versão 5.3 -- quem diria!).

No próximo post vou mostrar acesso ao banco de dados.

16 de agosto de 2010

Não comente seus programas - parte 1

Uma das características mais valiozas num programador é a capacidade de escrever código limpo.

Qualquer coisa que esteja no programa fonte que não seja comando da linguagem, é ruído. E comentário é um deles.

Se seu programa precisa de comentários, ele não é claro para uma pessoa entender.

Escreva programas mais simples, mais fáceis de entender. Assim, ele são menos propensos a erro e não há necessidade de comentários. Aliás, os comentários são como mato: brotam onde não deveriam existir. Se um programa é bem escrito, de maneira clara, quase nunca vai precisar de comentários.

Desculpe, mas eu nunca vi um programador o tempo todo preocupado em deixar os comentários atualizados. Quando o programa é criado, está tudo bonitinho, mas com o passar dos meses (e dos anos!) e com o ritmo de trabalho, duvido que os comentários retratem o que o código fonte realmente faz. Infelizmente os comentários não acompanham o programa.

Note que não sou contra os comentários. Sou a favor deles, nos lugares que realmente são necessários. Mas esses lugares são raríssimos!

Ao invés de adotar um estilo claro de comentários, adote um estilo de codificação que permita às pessoas entenderem melhor seu código. Afinal, qualquer um escreve código que os computadores entendem. Os bons programadores escrevem código que outras pessoas entendem.

A ideia é simplificar a vida de quem vai dar manutenção em seus programas. Digo sempre que você pode dar o azar de ter que mexer num programa que você mesmo escreveu há 6 meses atrás. Será que você vai lembrar o que quer dizer aquele (if $codigo == 8)? E o return -2, o que significa mesmo?

Vamos a um exemplo (em PHP) de uma situação que você, programador consciente, pode aproveitar para tornar seu programa mais limpo e expressivo.

Evite os números mágicos e os códigos.

Ao invés de escrever isso:
if ($usuario['perfil'] == 1) { // vendedor
    return -2; // nao autorizado
}

if ($usuario['perfil'] == 2) { // financeiro
    return 1; // ok
}

Use métodos e constantes no lugar dos números mágicos:
if (ehPerfilVendedor($usuario['perfil'])) {
    return PERFIL_NAO_AUTORIZADO;
}

if (ehPerfilFinanceiro($usuario['perfil'])) {
    return PERFIL_OK;
}


Escreva programas que sejam claros para as pessoas. Deixe seu programa falar por si só.

Como esse assunto é longo, em breve teremos mais um post sobre como escrever programas mais fáceis de entender.

13 de agosto de 2010

Como identificar um bom programador

Esse tema é recorrente em blogs técnicos, portanto vou resumir.
Como aqui na empresa passamos por uma fase recente de recrutamento, seguem alguns itens que podem te ajudar na hora de você identificar (ou saber se é) um bom programador.

Perceba que vários deles estão interligados ou são interdependentes. O que eu analiso nesse post é a pessoa, e não o técnico.


1. Ser apaixonado por programação

Isso não significa tirar 10 em todas as matérias da faculdade.

Significa que você desenvolve algum projeto pessoal, sem ninguém ter pedido para você fazer isso. Muitas vezes significa que você aprendeu programação antes da faculdade, ou antes do seu primeiro emprego.
Às vezes, significa que você atravessa as madrugadas procurando solução para um algoritmo "dificião" e só percebe há quanto tempo está ali, quando o dia está clareando.

Essas coisas você não vai encontrar no currículo de ninguém.

Uma pessoa apaixonada por programação, muito provavelmente será um bom programador.


2. Aprender sozinho e gostar disso

Não estou falando em copiar e colar códigos de exemplos ou tutoriais. Estou falando em aprender a ponto de poder ensinar para os colegas, explicando porquê essa é a melhor forma de usar tal recurso nessa situação.

Se uma pessoa não tem a capacidade de realmente aprender sozinha, provavelmente ela não se sairá bem em programação.


3. Conhecimento variado

As pessoas que são apaixonadas por progamação e que gostam de aprender sozinhas, certamente têm conhecimento em várias áreas do desenvolvimento de sistemas. São os nerds.

É comum você encontrar nerds que manjam de Java, C, robótica, eletricidade, skate e video games.
Isso é diferente de encontrar aquela pessoa que se diz programador PHP e também é webdesigner.

Sim, existem programadores que também atuam como designers. E bons designers que também programam. Mas aqui, refiro-me a programadores mesmo. Aqueles que manjam de algoritmos, que fuçam código dos outros. Aqueles que otimizam quando necessário. Aqueles que sabem a real diferença entre modelo lógico e físico de dados. E também a diferença entre modelo de dados e modelo de classes.

Quanto ao conhecimento variado, quero dizer dominar uma ou mais linguagens de programação bem diferentes (PHP, Python e Assembly, por exemplo). Também conhecer técnicas como TDD, BDD, XP. Também saber desenvolver pra web e pra desktop. Também saber programação funcional. Também saber como escrever código limpo e expressivo. Também ter usado editores de programa diferentes. Também saber como montar uma massa de testes. Também saber como funciona os bastidores do HTTP. Também isolar o aplicativo em camadas. Também saber otimizar SQL.

É claro que é muito difícíl encontrar uma única pessoa que conheça tudo isso. Essa relação mostra exemplos, mas acho que você entendeu.


4. Conhecimento formal

Esse é um ponto polêmico. Se eu tiver que escolher entre contratar uma pessoa com mestrado + certificações e outra apenas com o ensino médio, sabe qual delas eu escolho? Aquela que for capaz de resolver os problemas que enfrentamos na empresa.

Não estou dizendo pra você esquecer a faculdade. Não mesmo. Só estou dizendo que uma empresa precisa de bons profissionais e não de apenas bons estudantes.

Sim, é possível encontrar bons estudantes que são ótimos profissionais e eu tenho alguns amigos assim. O problema é que muita gente que não se garante como programador, procura nos títulos uma forma de se perpetuar no mercado. E por mais irracional que isso possa parecer, consegue.


5. Atitude

É possível perceber se uma pessoa sabe o que está fazendo no momento que ela senta na frente do computador. Quando você pede uma opinião dela, você saca logo se ela conhece do assunto ou não.

A essência da atividade de programação é tomar decisões. Fazemos isso o tempo todo. Quando você escolhe dar um nome a uma variável, quando você resolve refatorar uma rotina, quando você acha que é melhor criar um método genérico para resolver determinado problema, você está decidindo; tendo que tomar uma atitude.

Para decidir com coerência e segurança, é preciso ter senso crítico. Portanto, um bom programador deve ter opinião, atitude.

Programador que não tem opinião formada sobre a linguagem que domina ou sobre o sistema operacional que usa, provavelmente não tem a variedade de conhecimento que daria a ele o senso crítico para opinar.


Como eu disse, passamos por um processo de seleção. Li vários currículos que não diziam nada. Li outros que diziam bastante, mas não tínhamos como pagar o que a pessoa estava pedindo, infelizmente.
Nisso tudo, o que mais me chamou a atenção foi a atitude de algumas pessoas ao preencherem nosso formulário web respondendo algumas perguntas com opiniões a respeito de assuntos técnicos superficiais.

Por isso, sugiro a você analisar muito mais o candidato do que o currículo dele.
Tenha coragem de não contratar ninguém. É preferível ficar com a vaga em aberto a preenchida por alguém que não atende os requisitos da empresa.

4 de agosto de 2010

Lógica de Programador

Recebi um email com uma piada mostrando a capacidade que nós, programadores, temos de focar tanto nas linguagens de computador, que nos esquecemos da linguagem humana.

"A esposa pede ao marido, que é programador, para ir à mercearia e diz:
- Compre duas salsichas. Se eles tiverem ovos, compre 10.
O programador vai até a mercearia e pergunta:
- Vocês têm ovos?
- Sim.
- Então eu quero 10 salsichas!"

Linguagem de computador é importante, mas muito mais é a capacidade de ser tradutor entre as linguagens humana -> computador -> humana.

Entender um problema e dar uma solução é fundamental.
Entender um programa com uma solução e saber explicá-la a alguém é muito valioso também.

Moral da história: comunique-se para entender e ser entendido.

Compre as salsichas. E os ovos também.

9 de julho de 2010

Exceder sim

Às vezes minhas opiniões incomodam e eu gosto disso. Em agosto de 2009 eu escrevi um post mostrando um pouco do meu pensamento a respeito do perfil de um desenvolvedor de software. O título dele é "Todo desenvolvedor deve saber".

Hoje eu recebi um comentário lá, de uma pessoa anônima, falando sobre a relação entre a exigência do que citei e o salário baixo que algumas empresas pagam. E isso me motivou a escrever esse novo artigo, sobre postura profissional.

Eu mostro esse texto para algumas pessoas que eu sinto precisarem situar-se melhor no ambiente profissional e para meus colegas de trabalho. Há alguns dias eu o coloquei como uma das referências de leitura para possíveis candidatos a uma vaga de desenvolvedor que abrimos na empresa que eu trabalho. Alguns concordam comigo, outros não. Isso é natural.

Agora, seja sincero e me responda:
  • Se você fosse dono da empresa, sabendo o quanto ralou para estabelecê-la, pagaria um salário alto para um recém-contratado antes de saber se o trabalho dele vale tudo isso?
  • Pagaria para ele ter postura profissional, ou porque ele a tem?
  • Daria aumento para uma pessoa começar a mostrar que pode mais, ou porque ela já mostrou isso?
  • Promoveria uma pessoa para ela compartilhar o conhecimento, ou porque ela já tem o hábito de não esconder o jogo?
  • Concederia um bônus para que ela entenda as prioridades da empresa, ou porque ela já veste a camisa?

Acho que você já entendeu aonde eu quero chegar, né?

Portanto, o que escrevi naquele artigo anterior não tem nada a ver com o tamanho do salário que você tem. Mas certamente tem a ver com o tamanho do salário que você mostra que quer ter.

Aliás, salário não se ganha, se conquista, viu? Seu patrão não te dá de presente. Ele compra seu tempo.

Talvez você não alcance seu ideal nessa empresa que está hoje, mas seu futuro profissional será moldado por suas atitudes (positivas ou negativas), não por suas expectativas.

Não espere que seu chefe te dê aumento para só então você começar a mostrar mais serviço. Sugiro mostrar isso antes de ele perceber que você estagnou e resolva contratar outra pessoa pro seu lugar.

É esse cenário que vemos quando um grupo trabalha junto há anos e, de uma hora pra outra, entra um chefe novo e todos se perguntam por que nenhum dos antigos foi escolhido para o cargo.

Costumo dizer pros meus colegas que se passarmos uma semana sem aprender nada no trabalho, devemos procurar outro lugar para trabalhar.

Dizem que não devemos disputar com nossos companheiros de equipe. Eu penso exatamente o contrário. Quero sempre participar de equipes que tenham conhecimentos diversificados. Quero aprender mais e ensinar também. Sim, quero ser o melhor, ganhar o maior salário, ser o referencial. Não quero derrubar ninguém, mas quero crescer, independente do que os outros pensem. Afinal o meu futuro é meu, né?

Gosto muito de uma frase de Sir Isaac Newton que diz: "se hoje posso enxergar mais longe, foi porque me apoiei em ombros de gigantes".

Gosto também do que ouvi de um dos componentes do grupo de dança inglês, chamado Flawless ("sem falhas", na tradução literal): "persiga seus sonhos, não seus competidores".

Sonhe alto, busque chegar lá, exceda sim!

1 de maio de 2010

O que é Lean?

Observações:
1) Tradução do artigo original "What is Lean?" de Henrik Kniberg.
2) Eu resolvi traduzí-lo para ficar disponível para o maior número de pessoas, dada sua clareza e sucintez.

Mary Poppendieck usou essa definição há alguns meses em nosso curso Liderando o Desenvolvimento Lean de Software. Uma definição muito legal e concisa do que é lean.

O que é Lean?
  • Entrega contínua de aumento de valor para o cliente
  • Utilizando um esforço cada vez menor
  • No menor tempo possível
  • Com a maior qualidade possível
Uma jornada, não um destino.

29 de abril de 2010

Testador online de regexp

Quem nunca se enrolou com expressões regulares?

Eu sempre me enrolo.

Vai aí uma dica, o Regular Expression Tool.

Ele faz a validação da sua regexp on-the-fly, sem precisar submeter o formulário.

Ele valida e gera o código em PHP para os padrões PCRE, POSIX e também para Javascript.

28 de abril de 2010

Outras informações que o Google mostra

Se você não usa o Google como oráculo de informação, pode parar de ler esse post.

Assim como eu, a grande maioria dos brasileiros simplesmente buscam no Google o que precisam. Meu filho, por exemplo, não entra em um site digitando a url na barra de endereços do navegador. Ele procura pelo nome do site no Google e clica no link mostrado.

Aí a gente para e pensa: "mas por que eu uso o Google, se o Bing me dá os resultados parecidos?" Bem, primeiro porque o Google traz coisas mais relevantes. Segundo, porque ele tem uns recursos legais. Quer ver?
  1. Faça cálculos: Digite "20*2" (sem as aspas) na caixa de busca do Google e veja o resultado.
  2. Saiba o horário de outra cidade: Digite "time in londres" (sem as aspas). Obs.: pode digitar qualquer cidade do mundo.
  3. Veja a taxa de câmbio: Digite "1 dollar in real" (sem as aspas) e veja o que ele consegue fazer.
É por essas e outras que a maioria dos seus conhecidos usam o Google, não é mesmo?
E tudo muito rápido e simples.

Velocidade é a característica mais importante

Foi postado no blog Signal vs. Noise uma citação que, traduzindo as 2 frases iniciais, fica assim:
"Velocidade é a característica mais importante. Se sua aplicação é lenta, as pessoas não irão usá-la."

Leia o post original (em inglês).

27 de abril de 2010

Destrua sua lista de backlog

Lendo o artigo Kill Your To-Do List do blog Zen Habits, me lembrei sobre backlog de sistemas.

Algumas pessoas defendem que não vale a pena manter uma lista de backlog, porque ninguém vai esquecer de fazer as tarefas realmente importantes. Se ninguém lembrar de determinada coisa, certamente não era importante.

Você já deve ter-se deparado com uma lista crescente de tarefas antigas. A cada hora aparece um item mais importante, que vai furando a fila, não é? Passado algum tempo, você acaba cansando daqueles itens históricos, que já estão quase fazendo aniversário. Então vem a dúvida: "tiro esse item da lista ou mantenho-o ali?"

Na minha opinião, tire-o imediatamente. Aliás, nem sei o que ele ainda está fazendo nessa lista.

Siga meu raciocínio. Se você tem uma tarefa "importante" que fica ali sempre deixada para depois, é porque ela não era importante. Talvez você achou que fosse ou talvez alguém tenha pedido para você fazê-la. Mas, na realidade, ela não é importante. Talvez ela seja legal, interessante, útil, mas não importante. Porque o que é importante precisa ser feito e, por isso, priorizado.

Isso faz todo o sentido quando você resolve desenvolver aplicativos que contenham apenas a parte importante, que o cliente vai realmente usar. Estamos cansados de ouvir que praticamente 60% das funcionalidades dos nossos aplicativos não são usados. Isso significa dinheiro e tempo desperdiçados, propensão a defeitos e dúvidas.

Quando você trabalha em um ambiente de equipe, as pessoas estão engajadas e vão ajudar-se mutuamente. Daí vai chegar a hora de escolher o quê implantar. Então elas se lembrarão dos itens importantes e a lista de backlog não tem utilidade.

Se mesmo assim você achar conveniente manter uma lista de backlog, então deixe ali somente coisas que serão feitas. Jogue os itens com mais de 2 meses para um arquivo morto. Mantenha uma lista ativa de coisas a serem feitas, não de coisas que nunca serão tocadas.

Simplifique a administração de suas atividades. Destrua sua lista de backlog.

26 de abril de 2010

Rápido é melhor mesmo

Durante algum tempo tenho vivido uma experiência nova ao participar de um projeto que usa bastante JQuery em algumas funcionalidades. Fiquei admirado com o que se pode fazer com esse bichinho estranho pra mim, chamado JavaScript. Eu sei, estou atrasado, mas antes tarde do que nunca para aprender coisa nova, né? Esse aplicativo que estamos desenvolvendo tem uma característica "peculiar" que deveria ser padrão em tudo o que desenvolvemos: tem que  responder rápido.

Tenho pensado muito em desempenho de sites e encontrei algumas boas referências sobre o assunto. A primeira, que foi quem me encaminhou às outras, foi o post Webcast: como melhorar a performance do meu site?, em um dos blogs da Locaweb.

O Yahoo! escreveu suas Best Practices for Speeding Up Your Web Site. Vale também a visita à página de referência Exceptional Performance. Na seção Research você pode aprender coisas legais, como a surpresa do impacto real dos caches dos browsers. Como diz o ditado, "na prática, a teoria é outra".

Se você é um "server sider" como eu, recomendo fortemente assistir aos vídeos da seção Videos About High Performance Web Pages, principalmente os introdutórios de JavaScript.
Tem material riquíssimo ali.

Como não poderia deixar de ser, o Google também tem ótimas fontes de consulta Aliás, seus aplicativos são conhecidos também por terem um excelente tempo de resposta. Então, vamos ao Google Speed. que é um centro de informações a respeito de como tornar seus aplicativos web mais rápidos. Ali tem um link para o post Let's make the web faster, que dá uma boa introdução sobre o assunto. Para aprender o "como fazer", visite a página de artigos do Google Speed.

Fazendo um resumo (resumão mesmo) bem objetivo, seguem 3 dicas que, de acordo com os especialistas, trazem resultado mais rápido, que são sentidas imediatamente pelos usuários e que deveriam ser tentadas primeiro:
  1. Faça menos requisições http: Quanto menos objetos externos sua página html solicitar, melhor. Por isso, diminua a quantidade de imagens e de CSS/JavaScripts externos.
  2. Comprima suas imagens: Salve-as para visualização na web. Em monitores, a resolução não passa de 72 dpi. Portanto, ajuste a paleta de cores para essa realidade. Diminua sempre.
  3. Comprima seus HTML, CSS e JavaScript: aqui a história pode ficar complicada, mas vou dar uma dica de programador: retire espaços em branco desnecessários e use nomes de classe e de variáveis pequenos, mas que façam sentido. Só com isso a coisa já vai melhorar muito. Seria boa prática usar um compressor de código antes de colocá-lo em produção. Procure por "javascript compressor" ou "html compressor" ou "css compressor" para encontrar alternativas.
Antes de sair mudando linhas de códigos server side, sugiro a leitura dos resultados das pesquisas do Yahoo! e do Google e analisar os resultados do YSlow e do Google Page Speed. Normalmente (mas nem sempre) o gargalo de desempenho está no client side.

Dependendo da estrutura de seu banco de dados, o SQL também pode trazer um bom gargalo de desempenho. Normalizar é preciso, mas responder rápido, também.

Se você tiver alguma dica geral para melhorar desempenho de sites ou aplicativos web, colabore nos comentários. Toda ajuda é bem-vinda.

Update em 26/04/2010 às 12:07: Ranking do Google agora considera velocidade de carregamento do site.
Update em 11/09/2011 às 02:33: [QCon 2011] Por uma web mais rápida: técnicas de otimização de Sites - por @sergio_caelum

26 de março de 2010

Mysql GROUP_CONCAT

Tem situação que você se depara no serviço que nem sempre sabe como resolver, né?

Ao mesmo tempo, tem coisa que você descobre que salva o seu dia. Uma dessas, é a função GROUP_CONCAT() do MySQL.

Ela faz o seguinte: concatena o retorno de um result set, transformando-o em uma string.

Exemplo de situação que seria útil: trazer os nomes de todos os dependentes de um empregado:

SELECT e.nome, GROUP_CONCAT(d.nome) AS d.dependentes FROM empregado e, dependente d WHERE e.id = 123 AND d.id_empregado = e.id;

O que isso vai retornar? O nome do empregado na coluna e.nome e os nomes dos dependentes, separados por vírgula, na coluna d.dependentes.

Outras situações em que ele pode ser útil são:
* Retornar pares "chave = valor";
* Retornar conteúdos separados por vírgula para serem carregados diretamente em um array em PHP;

Dá uma lida no manual do MySQL e procure exemplos na internet. Tem muita coisa boa sobre o GROUP_CONCAT().

Usar firefox sem mouse

Eu já escrevi aqui muitas vezes sobre minha aversão ao mouse. Eu gosto mesmo é do teclado e recomendo que todo programador use o teclado.

Nele eu faço o que quero, normalmente mais rápido do que com o mouse. Existem situações de exceção, é claro. Mas no geral, me saio melhor no teclado.

Há algum tempo eu conheci um plugin muito interessante, o vimperator. Ele faz uma modificação grande no Firefox, criando comandos ao estilo do vim, meu editor de programas preferido. Assim, você rola página com CTRL+F/B, faz scroll de linha com "j"/"k" (sem as aspas), vai para o início e fim da linha com o "0"/"$". Ah, e pode até mandar imprimir a página atual com o comando ":ha" (hardcopy). Sim, tem os comandos ":" também.

Interessante, né? Eu não imaginava usar um navegador com comandos assim.

De cara, a barra de menu do Firefox some. Você pode configurar o vimperator para mostrar os menus normalmente, mas não é essa a proposta. A ideia é tornar o Firefox um navegador modal, igual ao vim.

Aliás, se você entra no vim e não sabe o que fazer, vai sentir a mesma coisa ao usar o vimperator pela primeira vez. A parte boa é que ele mostra uma página de help com os principais comandos e links para a documentação.

Tá, e que vantagem isso tem?

A vantagem de navegar com agilidade, da mesma forma que faço ao editar meus programas. Uso alguns comandos bem parecidos, tornando minha experiência de navegação similar à experiência de edição de programas. Isso tudo contribui para o domínio sobre meu editor de programas, o que vai me tornar mais produtivo em meu trabalho.

Vale a pena experimentar. É bem diferente. Mas muito produtivo.

Update em 11/09/2011 às 02:42: O Pentadactyl promete ser um vimperator melhorado. Vale experimentá-lo.