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

About Adriano Laranjeira

Software engineer & developer See more at http://about.me/arglbr
This entry was posted in Português. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s