Um bom aniversário

Fiquei muito feliz, faltou pouco para um dia perfeito.

Falei com a família toda.

Os amigos com quem me importo também lembraram, ligaram, mandaram mensagens.

Tive uma longa conversa com meu pai, pude agradecer por ter me ensinado o que ensinou.

Visitei minha mãe, passei um tempinho com ela (é sempre curto) e com meus irmãos. Ganhei bolo, o “parabéns pr’a vc” e abraços.

Pessoal do apê cantou parabéns também.

Pr’a ficar perfeito, só faltou a Lelê, com quem falei bastante durante o dia.

E o estúpido do Falk.

Como se tornar um ótimo desenvolvedor

Ultimamente várias pessoas me procuraram buscando orientação para se tornar um desenvolvedor.

Montei uma trilha, compartilho aqui com todos e já aviso que ela segue a regra dos Piratas do Caribe: é muito mais um guia para se orientar do que algo que deva ser seguido à risca. 🙂

Mas vamos começar. Há duas perspectivas básicas que precisam ser trabalhadas:

  • Mentalidade;
  • Conhecimento técnico.

 

MENTALIDADE 

Para se tornar um ótimo desenvolvedor de software é preciso:

  1. Cultivar um pensamento analítico;
  2. Acreditar que trabalho repetitivo é penoso, chato e toma tempo precioso;
  3. Ver diversão nos problemas e acreditar que cavar soluções para eles será igualmente divertido;
  4. Entender que não há mágica: um software nada mais é do que a execução automatizada e idempotente de algo;
  5. Ser capaz de fatiar um problema para isolar a causa. Já dizia Julio Cesar e Napoleão: “Divide et impera”;
  6. Saber inglês. No mínimo o necessário para ler este idioma;
  7. Gostar de ler;
  8. Ser auto didata;
  9. Saber formar uma sequência de atividades para atingir um objetivo;

Os aspectos de mentalidade são tão importantes quanto os de técnica mas serão deixados para um próximo artigo. Neste aqui daremos atenção aos aspectos técnicos pois são os que geram mais curiosidade.

 

CONHECIMENTO TÉCNICO 

No campo técnico, ser um bom desenvolvedor envolve:

  1. Conhecer profundamente um sistema operacional, preferencialmente GNU/Linux. A quantidade de material na Internet sobre o assunto é quase infinita, mas cursos podem direcionar e acelerar este item. Recomendo que busque um com meus amigos e amigas da 4Linux (http://cursos4linux.com.br/linux/);
  2. Ser confortável em conceitos de rede (DNS, DHCP, HTTP, SNMP, etc.). Aqui quanto mais, melhor. Existe a referência acadêmica clássica do Tanenbaum: https://is.gd/qafuxi, mas o melhor livro que li sobre o assunto foi o do Farrel: https://is.gd/jufura;
  3. Conhecer alguma plataforma cloud. Hoje em dia, a AWS é quem lidera esta área e a melhor forma de aprende-la é utilizar o primeiro ano grátis que ela oferece para mergulhar nos seus produtos: https://aws.amazon.com/;
  4. Ser capaz de automatizar a entrega de uma infraestrutura usando código. Há várias frameworks por aí, mas sugiro que conheça bem pelo menos uma delas. Sugiro o Ansible: https://www.ansible.com/. Há um ótimo curso no Udemy sobre ele: https://www.udemy.com/mastering-ansible/;
  5. Conhecer pelo menos uma linguagem de programação. Isso vai muito da época, hoje em dia Java ainda é relevante, Javascript com Node.js tem ganhado espaço, PHP & Python sempre estiveram por ai mas este último tem ganhado mais relevância pela sua aplicação em soluções de Big Data. Tem Microsoft com .NET também. A linguagem Go também tem ganho um espaço relevante e vale a pena aprende-la;
  6. Conhecer lógica de programação: É como fazer um bolo doce ou salgado. Um livro de algoritmos é na prática um guia de receitas que você pode consultar para encontrar uma solução pronta para problemas já conhecidos. Quanto mais você cozinha, mais as receitas estão na sua cabeça e menos você precisa recorrer a estes livros, embora seja ótimo folheá-los de vez em quando. Aqui há uma vasta relação, o melhor é escolher um material que discorra na linguagem de programação que você tenha interesse: https://is.gd/xafeje. O mais importante é a prática. Você precisa praticar o conhecimento de uma linguagem e de algoritmos para resolver problemas reais, desta forma você ganha confiança e agilidade de pensamento. Sugiro aqui que faça uma conta em alguma plataforma de desafios e a insira em sua rotina para que possa praticar. Sugestões: https://www.codility.com e https://www.hackerrank.com/;
  7. Versionar código com Git – não estou falando só de instala-lo, sim de utiliza-lo dentro de uma rotina de desenvolvimento (clonar um repo ou criar um novo do zero, alterar arquivos, realizar commits, lidar com branches, realizar merge de código, rebase, push, revert, etc.). Sugiro o livro “Pro Git”: https://git-scm.com/book/pt-br/v2;
  8. Conhecer um fluxo de versionamento – Fluxos de versionamento são importantes principalmente para organizar trabalhos que envolvem mais de um desenvolvedor. Há vários, mas há uma certa convergência para o modelo sugerido pelo Vincent Driessen: https://nvie.com/posts/a-successful-git-branching-model/. Há até uma extensão Git para aplica-lo: https://github.com/nvie/gitflow/;
  9. Lidar com dados: é preciso saber escrever um programa que solicite dados, que grave-os em outro lugar, recupere-os, altere-os e que consiga exclui-los. Livros aqui são importantes, cursos facilitam e aceleram, mas nada como a prática para entender a infinidade de assuntos que surgem quando falamos de lidar com dados. Inicie montando um programa que faça isso com arquivos em disco, depois com bancos de dados relacionais (SQL, como o MySQL) e por último com bancos de dados não-relacionais (NoSQL, como o MongoDB e o Cassandra). Comece criando um cadastro dos livros de uma biblioteca, de seus usuários e de sua movimentação (usuários emprestam livros e os devolvem, isso é a movimentação);
  10. Entender a mecânica de montagem e consumo de filas: este conceito ganhou muita força nos últimos anos, por isso é preciso conhecê-lo bem para se tornar um bom desenvolvedor. Além disso é preciso saber construir rotinas para consumir dados que estejam numa fila para serem lidos. Softwares de fila mais conhecidos hoje em dia são RabbitMQ, Kafka (meu preferido) e o ActiveMQ;
  11. Escrever uma aplicação web. É preciso entender a complexidade e os vários detalhes que existem ao construir uma. Isso o/a fará lidar com tecnologias bem antigas, mas ainda atuais, como HTML, CSS e Javascript. Como existe uma dependência com a linguagem de sua escolha, faça buscas no Google como “construir uma aplicação web com {Java, PHP, Python, Node, etc..}”;
  12. Lidar com APIs externas: Aqui vai aprender a consumir dados de uma API publicada em qualquer lugar. Foco em REST, mas saber SOAP também é importante. Há também dependência com a linguagem de sua escolha, então realize buscas como “Como consumir API {REST, SOAP} com {Java, PHP, Python, Node, etc..}”;
  13. Conhecer algum framework de testes: cada linguagem traz uma. PHPUnit, JUnit, Mocha, PyUnit. Há também diversos tipos de teste que um software pode implementar: white box, black box, testes de integração, unitários, regressão, etc. Entenda para que serve cada um deles, faça buscas no Google para buscar exemplos na linguagem de sua escolha. Há todo um capítulo nos clássicos do Pressman e do Sommerville para testes: https://is.gd/lovazu e https://is.gd/xamiqu. Testes ganhou muita importância depois que Kent Beck trouxe a sigla TDD (Test-Driven Development), para compor a rotina diária de quem trabalha desenvolvendo software;
  14. Conhecer frameworks de build & packaging para entrega numa esteira de deploy. Cada linguagem também tem a sua: PHP-Composer, Gradle, Maven, NPM, etc. Será fundamental saber aplica-las para tornar mais fácil a instalação e configuração do seu software;
  15. Construir esteiras de automação para entrega contínua (DevOps). Aqui é preciso entender as diversas ferramentas existentes que entregam o seu pacote de software para a infraestrutura em que será executada. Jenkins é o mais utilizado atualmente mas não é o único, então saber montar uma esteira mínima utilizando uma destas ferramentas fará diferença em sua vida profissional;
  16. Conhecer uma plataforma de containerização. A adoção de plataformas como Kubernetes ou Docker traz vantagens como portabilidade de aplicações de software entre diferentes ambientes e outros pontos que fazem deste um caminho sem volta. Sugiro os cursos online da Udemy: Kubernetes (https://www.udemy.com/learn-devops-the-complete-kubernetes-course/) e Docker (https://www.udemy.com/docker-mastery/);
  17. Conhecer alguma metodologia de trabalho de desenvolvimento (Cascata, SCRUM, Kanban, TDD, etc.). Você com certeza já participa no seu dia-a-dia de trabalho com uma delas. Entender os papéis e responsabilidades envolvidos vai lhe dar mais entendimento sobre o processo de desenvolvimento;
  18. Participar da comunidade open source. Esta comunidade requer constantemente voluntários para atuar em softwares lançados sob esta licença. Há oportunidade para ajudar a documentar, testar, revisar, ajustar defeitos e até melhora-los construindo mais funcionalidades. É uma oportunidade fantástica para se integrar, conhecer um bando de malucos bem legais e de quebra trabalhar juntos em caráter de voluntariado. Isso me permitiu conhecer pessoas por todo o mundo e expandir a visão sob os mais variados assuntos, já que esta integração provoca a constante troca de ideias. Sugiro que escolha um software que goste tanto que tope participar de forma voluntariada; 🙂

O mundo de desenvolvimento de software é imenso. Há toda uma vertente de trabalho para quem gosta de projetar sistemas, onde se lida com siglas como DDD (Domain Driven Design), cuja preocupação é como dividir um software para entrega-lo da melhor forma, sob muitos aspectos técnicos e não técnicos. Mas você vai sentir a necessidade de partir para isso depois de programar bastante.

Caminhar nesta jornada vai ajuda-lo a definir qual área de desenvolvimento você é melhor e/ou lhe provoca mais interesse. Tenho amigos muito especializados em monitoração de aplicações, outros em integração, outros em arquitetura, outros em testes, outros em web, outros em dados, etc. E cada uma delas é uma porta para um mundo cheio de problemas já resolvidos, com vários ainda para resolver, cheios de softwares e frameworks para experimentar e aprender. Junto a isso, aos poucos perceberá que determinadas áreas de negócio te chamam mais a atenção do que outras, por exemplo, tenho amigos que são apaixonados em resolver problemas da área de Telecom, outros pela área Financeira, e por aí vai. Natural, só deixe fluir.

Por fim, sugiro fortemente que se preocupe muito mais na cadência e perseverança para seguir esta lista do que no tempo que vai levar para cumpri-la. Tenho 22 anos de experiência e continuo trabalhando nela.

 

Até 😉

Como instalar o Skype no Fedora

Há um tempo utilizo este script bash para instalar o Skype num box Fedora e ele tem funcionado muito bem. A instalação por ele traz recursos como Skype Video funcionando de forma perfeita, então, passou da hora de compartilhar :-).

Para instalar, você pode clonar o repo do Git ou baixa-lo diretamente de lá:

git clone https://github.com/arglbr/SkypeOnFedora.git

Descompacte-o em qualquer canto, e execute o script installskype. Ele fará a instalação em seu /opt, com um script executável no seu /usr/bin.

Divirta-se!

OMomento.Esperteza.01

You can see this post in english.

Vou elogiar cada um daqueles momentos envergonhantes em que deixamos a orelha cair sobre os olhos e não vemos o óbvio.

Quando se encontrar com o erro “FATAL INT18 BOOT FAILURE” ao ligar uma VM, apenas remova qualquer media de boot anexada à ela antes de iniciar.

Virtualbox screenshot - Fatal Int18 Boot Failure
Virtualbox screenshot – Fatal Int18 Boot Failure

Até 😉

geeklist-php 0.1 lançado

You can see this post in english too.

Olá!

Eu gostaria de lhe apresentar geeklist-php. Esta biblioteca LGPL é capaz de retornar o conteúdo dos “Cards” de um username da rede social Geekli.st e retorná-los como uma string JSON ou um array simples para você. O truque desta lib é que ela não requer uma API do Geeklist para funcionar.

A intenção é que ela seja 100% aderente aos recentes padrões PSR-[0|1|2], traz um autoloader para tornar o trabalho com ela mais simples, e está pronta para usar com o Composer. Simplesmente adicione no composer.json de seu projeto:

{
   "require": {
   "arglbr/geeklist-php": "dev-master"
   }
}

Pegue-a, faça fork, use-a, melhore-a! À primeira vista, pode-se notar a falta de PHPDoc no código.

🙂

Até!

Mozilla BrowserID: Mais um mecanismo de login

You can see this post in english too.

Recentemente testei o mecanismo de autenticação lançado pela Mozilla em Julho/2011.

À primeira vista, a idéia é excelente e simples. Oferece uma alternativa fácil de ser implementada, segura, portável e descentralizada. É mais uma alternativa para o OpenID e ao oAuth, com a vantagem de que praticamente todos possuem uma conta de e-mail e por isso lidam com estas de forma muito mais natural.

Em sua proposta, a Mozilla Labs sugere que a autenticação seja de primeiro fator utilizando quaisquer endereço de e-mail do usuário como sua identidade. Reza também que a autenticação seja descentralizada e baseada em servidores de e-mail, ao invés de domínios e websites. Este método libera as aplicações de guardar os atributos de login e senha dos usuários, e os usuários de guardar o usuário/senha para cada serviço na web que utilizem.

A implementação

Implementação
  • A especificação pode ser lida aqui;
  • Utiliza sistema de chaves pública/privada;
  • O navegador do usuário gerencia os artefatos de autenticação localmente (todos acessíveis via DOM com [window|session].localStorage), ou seja, nada relacionado a certificados ou dispositivos de segurança;
  • O pop-up de autententicação é implementado em HTML5.

Prós

Prós
  • Facilidade de implementação;
  • Tempo de vida curta para as chaves pública/privada (são apenas algumas horas);
  • Troca de dados via JSON.

Contras

Contras
  • Ainda é de primeiro fator;
  • Revela o endereço de e-mail do usuário para o website que está autenticando-o. Não é um efeito colateral ou algo não esperado, informar o endereço de e-mail para o website é uma decisão de arquitetura tomada pelo pessoal da Mozilla Labs e explicada por Ben Adida. O OpenID aqui leva vantagem pois não revela os endereços de e-mail do usuário;
  • Não existe uma forma de realizar logout, ele deve ser feito do lado da aplicação invalidando os dados de sessão;
  • A usabilidade do recurso me incomoda em alguns pontos, como disparar um janela pop-up e o processo adotado quando trata-se da primeira vez do usuário.
  • Outro ponto incômodo é sobre a descentralização. Se há mais de um ponto autenticador, como a autenticação funcionará quando o usuário navegar em duas aplicações com pontos autenticadores diferentes?

Conclusão

A idéia é excelente, a minha primeira sensação foi de “É só isso?” de tão simples que é. Apesar de ter apresentado mais contras do que prós sinto que disponibilizaria mais esta forma de login se tivesse a chance. Torço para que existam mais autenticadores para fazer valer o efeito da descentralização.

Só é preciso lembrar que este mecanismo é apenas uma parte do processo: a autenticação. O trabalho de identificação e autorização do usuário ainda deve ser realizado pela aplicação.

Quer testar?

Testei o mecanismo na minha garagem virtual (é sua inauguração também, meus testes poderão ser testados “ao vivo” neste local). Além de minha garagem, a Mozilla oferece o website MyFavoriteBeer onde o login já utiliza este recurso.

ZCE 5.3 – Certificação Zend: Minha feliz experiência

You can see this post into english too.

Todos ficaram sabendo que obtive a certificação da Zend (ZCE 5.3). Fiquei bastante feliz com o resultado e com as congratulações recebidas, obrigado gente.

Aplausos!
Aplausos!

Deixarei aqui minha impressão sobre a prova, e sobre o que fiz para obter a certificação.

A PROVA

  • Fique calmo, a prova nem é tão difícil! Acho que o único ponto importante é que você deve ser um programador PHP, utilizá-lo no dia-a-dia, e de alguma forma (seja no trabalho ou em seus projetos pessoais) estar em contato com itens como closures, namespaces e OOP;
  • Não deixe questões em branco! Segundo o próprio pessoal da Zend, é melhor errar do que deixar de responder;
  • Com certeza a prova irá além do dia-a-dia da grande maioria dos programadores PHP. Então estude. Matemática binária / hexadecimal / octal é uma ótima pedida;
  • O teste para a versão 5.3 removeu todas as questões referentes às diferenças entre PHP 4 e 5. Então não perca tempo estudando-as;
  • O teste é cheio de armadilhas, coisas como:
    <?php
    $a = function($var)
    {
       $b = "Hello $var";
       return $b;
    }
    $c = $a('Adriano');
    print $c;
    ?>
    são normais. E se acha que este código imprime ‘Hello Adriano’, você tem um problema… rs…;
  • Faça várias leituras nas páginas String functions e Array functions, isso lhe garantirá uns pontos extras na prova;
  • Serão aproximadamente um minuto e 14 segundos por questão. Ganhe tempo lendo as questões conceituais somente uma vez. Utilize o recurso de “flag” que a prova disponibiliza para retornar à questão mais tarde;
  • Você terá um ano para realizar a prova após confirmar a compra do voucher. É bastante tempo, por isso sugiro que faça a compra e marque a prova para forçar-lhe a estudar com uma data limite definida. Todas as instruções para o processo são bem tranquilas (abrir conta no PearsonVue, etc.), apenas certifique-se de que há um centro PearsonVue próximo para realizar a prova.

O PROCESSO ADOTADO

 
Uma breve introdução: Em 2011 tive um grande susto quando comprei o voucher e abri o livro Zend PHP 5.3 Certification Guide: o PHP vai muito além de quase tudo que tinha lido até então. Decidi que deveria ler e testar muito! Foi quando elegi, adquiri e li os livros contidos no final deste post.

Após ver que tinha muito que estudar, esqueci um pouco a prova e decidi que tinha que explorar o PHP, e foi o que fiz. Li os livros, testava os códigos que me pareciam estranhos, fiz muitas (mas muitas!) anotações, e experimentei muito! Admito que foi a fase mais prazerosa de tudo isso. O website do PHP foi o melhor apêndice/anexo durante a leitura dos livros.

Ler os livros me levou muito tempo. Já quase no fim do ano, juntei todas as anotações e rabiscos nos livros e criei um super resumo, agora já com foco para a certificação. Com o resumo pronto, o li novamente. Os pontos em dúvida foram revisitados. Faltando 5 dias para a prova, separei todas as perguntas do livro guia num PDF, respostas em outro e realizei um simulado, permitindo-me somente um minuto e 14 segundos para responder cada questão, e algo entre 10 e 20 questões por dia. A intenção era buscar um “aquecimento” para a prova.

Entre um livro e outro, ouvi os podcasts do PHPSP (sinto muita falta deles!!). O foco deste podcast é PHP, então há dicas valiosas para quem quer fazer a prova. Embora confesso certo desconforto (popular: cagaço!) quando ouvi que o Rafael Dohms não passou na primeira vez que fez o exame. :-

CONCLUSÕES

 
Após essa mega-operação para obter o “The logo”, vi que exagerei na dose desta vez: estudei além do que realmente precisava, mas veja: hoje em dia me sinto um programador muito, mas muito melhor. Só que longe de onde gostaria estar. 😛

The logo - Zend Certified Engineer (PHP 5.3)
"The logo"

Sou recém certificado então não sei de verdade o que ser “ZCE” me trará de bom. Já tive duas boas notícias: ganhei uma licença de Zend Server e outra de Zend Studio por ter passado na prova. Passei a fazer parte de um grupo exclusivo no Linkedin, onde parece que as discussões melhoram de nível. Minha primeira impressão.

Quanto à empregabilidade, torço um pouco o nariz. Compare com uma certificação da Microsoft: você pode competir por uma vaga com uma pessoa que, como você, possui mais de 10 anos de experiência em sistemas. Se você tem um MCSE e ele/ela não, você está à frente. Mas concluir isso implica que a pessoa que realiza a seleção sabe disso. E é aqui que reside minha preocupação: será que os selecionadores e headhunters conhecem a Zend e suas certificações como sabem da Microsoft? Eu duvido. Então se quer se certificar para obter melhor emprego, minha opinião: não sei se funciona. Na dúvida, faça.

Enfim, estou MUITO feliz.

LEITURA RECOMENDADA

  • [Indispensável] Zend. Zend PHP 5.3 Certification. Zend Technologies. 155 páginas. Sem ISBN;
  • Shafik D, Ramsey B. Zend PHP 5 Certification. Study Guide. php|architect’s. 259 páginas. ISBN: 0-9738621-4-9;
  • Alshanetsky L. Guide to PHP Security. A step-by-step guide to writing secure and reliable PHP applications. php|architect’s. 197 páginas. ISBN: 0-9738621-0-6;
  • Sweat J. Guide to PHP Design Patterns. A practical approach to design patterns for the PHP4 and PHP5 Developer. php|architect’s. 338 páginas. ISBN: 0-9735898-2-5;
  • [Indispensável] Gutmans A, Bakken S, Rethans D. PHP 5 Power Programming. Bruce Perens’ Open Source series. Prentice Hall. 720 páginas. ISBN: 0-131-47149-X
  • [Indispensável] Williams J, Wichers D. OWASP Top 10 – 2010. The ten most critical web application security risks. Aspect, Mitre, Softtek, WhiteHat. 22 páginas. Sem ISBN.

Até 😉

Como configurar rotas estáticas no Fedora

You can see this post in english too.

Rotas. A única forma que eu gosto de vê-las:

Sinais e Rotas

Recentemente tiver que realizar um acerto na tabela de rotas de um servidor. Descobri um jeito mais elegante que o abaixo:

touch /etc/rc.d/rc.local
echo "touch /var/lock/subsys/local" > /etc/rc.d/rc.local
echo "route add default gw 10.10.0.1 eth0" > /etc/rc.d/rc.local
echo "route add -net 10.1.0.0 netmask 255.255.0.0 gw 10.2.0.1 eth0" > /etc/rc.d/rc.local

No GNU/Linux Fedora, rotas estáticas podem ser adicionadas em arquivos específicos para cada uma de suas interfaces, localizados em /etc/sysconfig/network-scripts/. O nome do arquivo deve obrigatoriamente ter o formato route-ifname. Então se pretende adicionar uma rota à interface eth0, o nome do arquivo deve ser /etc/sysconfig/network-scripts/route-eth0. Isso é importante, pois um erro aqui não produzirá log em lugar algum.

O formato do arquivo é bem simples, os exemplos abaixo valem mais que a explicação:

#Rota para uma rede:
10.1.0.0/16 via 10.2.0.1

#Rota para um host:
10.1.2.3 via 10.0.0.5

É possível testar suas novas rotas utilizando o comando ifup-routes ifname. Ele adiciona as rotas configuradas nos arquivos acima.

 

Até 😉