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.