A good birthday

I’m pretty happy, there was a tiny left towards a perfect day.

I had good chats with the whole family.

The friends I care about also remembered, called me, sent messages.

I had a long conversation with my father, I could thank him for teaching me what he taught.

I visited my mother, spent some time with her (time passes so quick) and with my brothers. I got cake, “happy birthday to you” and hugs.

Guys of the apartment also sang.

To be perfect, I just miss Lelê, who I talked a lot during the day.

And that stupid dog, Falk.

Posted in English | Tagged | Leave a comment

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.

Posted in Português | Tagged

How to become a great software developer

Easy, fella! It is being translated from portuguese category:
https://argl.eng.br/2018/10/21/como-se-tornar-um-otimo-desenvolvedor/

It will be ready soon 😉

 

Posted in English | Leave a comment

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é 😉

Posted in Português | Leave a comment

Neural Networks – First steps

~10 lines of code = algorithm to predict numbers within an image!!

Cool huh?! I still suffering with Octave / Matlab, but today’s progress tells me I’m on track. 🙂

Neural Networking predicting

Neural Networking predicting numbers 🙂

Posted in English | Leave a comment

Redes Neurais – Primeiros passos

~10 linhas de código = algoritmo para prever números dentro de uma imagem!!

Legal né?! Ainda apanho bastante do Octave/Matlab, mas o progresso de hoje me diz estar no caminho certo. 🙂

Neural Network - Predicting numbers :-)

Neural Network – Predicting numbers 🙂

Posted in Português | Leave a comment

How to install Skype on Fedora

I’ve been using this bash script for a certain time to install Skype on my Fedora boxes and it has been working very well. The install brings resources like Skype Video working like a charm, so, it needs to be shared :-).

To do the install, you’re able to clone the Git repo or download it from Github:

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

Uncompress the zip and execute the “installskype” bash script. It will do the installation on your /opt, with a bash script to execute it at your /usr/bin..

Have fun!!

Posted in English | Tagged , | Leave a comment