Em 2018 criei uma mentoria para programadores de software iniciantes contratados por um dos meus clientes. Na época ele não tinha o conhecimento e nem tempo para treiná-los e torná-los uma equipe de desenvolvimento capaz de entregar software com a qualidade e frequência necessária.

Eu já prestava serviço ao cliente a algum tempo e ele estava acostumado com o fluxo e qualidade do trabalho que eu entrego. Por isso a proposta era que eu pudesse transferir meu conhecimento técnico e métodos para a nova equipe. Para que eles pudessem seguir o mesmo processo que já estava implantado no cliente.

Resumidamente o meu desafio era: “Dar as condições à programadores inexperientes de se tornarem uma equipe de desenvolvimento capaz de entregar software funcionando e frequentemente”. Não era uma tarefa fácil, mas eu acreditava que era possível. Principalmente por causa de dois fatores:

Primeiro que eu já tinha o processo bem definido, replicável e atendia perfeitamente o cliente. E em segundo lugar, os programadores tinham mais ou menos o mesmo nível de conhecimento adquirido na universidade. O que faltava era preencher algumas lacunas de conhecimento e um processo para que pudessem ganhar confiança e organização no trabalho.

O “buraco negro” entre a universidade e o mercado de trabalho.

Eu acredito que existe um “buraco negro” entre a formação universitária e o mercado de trabalho. Ou seja, o que aprendemos e principalmente o que praticamos na universidade não é o suficiente para sermos imediatamente produtivos e eficientes quando assumimos o desenvolvimento de software profissionalmente.

Isso acontece principalmente por conta da rapidez da evolução que ocorre todos os anos em nossa área. E também pelo alto nível de exigência que o mercado tem com relação a qualidade de um software para que ele possa chegar em produção.

Quando um programador se forma e começa a trabalhar muitas vezes ele não encontra na empresa um processo definido para orientação e apoio a sua atividade. E de quebra encontra várias demandas para o desenvolvimento de software. Então ele fica perdido diante dos vários conceitos e ferramentas que existem para resolver os problemas em meio a cobrança por resultado rápido.

Eu passei por isso no início da minha carreira também. E acredito que para diminuir o “buraco negro”, ou seja, passar o mais rápido possível por essa fase e se tornar produtivo e eficiente. É preciso adotar um processo de trabalho com o mínimo de conceitos e ferramentas necessárias para atender a demanda de software exigido pela empresa.

Programação exige prática deliberada para se obter produtividade.

Desenvolvimento de software é uma atividade que exige muita prática. Por isso depois de selecionar os conceitos e ferramentas é necessário que o programador treine muito. Não adianta só ter o conhecimento teórico, somente com a prática deliberada em programação o programador atinge a produtividade e eficiência.

Foi baseado nesse pensamento que eu criei uma espécie de mentoria para os programadores do cliente, que durou aproximadamente 9 meses. Como a demanda do cliente era software para web eu selecionei o que considero ser o mínimo necessário aprender e exercitar. Dividindo a mentoria em 3 fases:

1 – Base para o desenvolvimento Frontend e Backend.

Apesar deles já terem uma formação que contemplava muita coisa. Eu precisava completar e nivelar esse conhecimento entre todos os programadores da equipe.

Nessa fase para cada tema eu passei um desafio para eles tentarem resolver individualmente em casa. E semanalmente nos reuníamos presencialmente para criar uma solução em conjunto, tirar dúvidas e trocar experiências. Por exemplo:

Para o Frontend pedi que criassem páginas usando HTML puro, em seguida adicionar estilo com CSS, depois adicionar alguma interatividade usando o Javascript e por fim simplificassem o que tinham feito através da adoção de frameworks como JQuery e Bootstrap.

Já para o Backend, comecei com alguns desafios lógicos como fizzbuzz e calculadora de expressão utilizando a linguagem PHP. Também pedi que evoluíssem esses programas adotando o paradigma de Orientação a Objeto. Em seguida fiz com que exercitassem a mesma lógica introduzindo o TDD (Test Driven Development).

Pude também introduzir o conceito de programação em pares e realizar alguns Coding Dojo para que eles pudessem exercitar o que aprenderam em conjunto e como uma equipe. Foi uma fase de descoberta e aprendizado muito grande, principalmente ajudou muito a “destravar” os programadores e a melhorar sua comunicação.

2 – Framework para desenvolvimento mínimo de um CRUD.

Agora que eles já estavam com a base nivelada e minimamente treinada, estavam prontos para começar a utilizar um framework para o desenvolvimento de um CRUD. Todo software com base de dados relacional tem que realizar no mínimo 4 operações; criação, leitura, atualização e exclusão. É daí que vem a sigla CRUD (Create, Read, Update e Delete).

Para isso adotamos a linguagem PHP e um framework desenvolvido no modelo MVC que seria o CakePHP. Apesar de não estarem atualmente na vanguarda, são ferramentas que continuam em constante evolução e com uma comunidade bastante ativa. E que eu tenho profundo conhecimento e utilizo sem problemas a muito tempo.

Nessa fase eu criei uma série de aulas no formato “baby steps” e na sequencia eles replicaram o que eu fiz em cada aula para exercitar e tirar dúvidas. Essas aulas foram desde um simples “hello world” até melhorias na interface do usuário e técnicas de refatoração de código.

Aqui eu pude aproximá-los mais dos problemas que eles enfrentariam no mundo real. E em paralelo às aulas eu criei um repositório no github onde eu mantenho o projeto implementado ao longo da mentoria. Para que ele pudesse ser utilizado como base de aprendizado e consulta no início.

3 – Gestão de projeto de desenvolvimento de software.

A terceira e última fase da mentoria foi focada na gestão de projeto de desenvolvimento de software. É uma parte imprescindível para uma equipe de desenvolvimento adquirir a organização e fluxo de trabalho necessários para entregar software.

No começo eu mostrei como eu implantei o git flow no meu processo. E também expliquei cada detalhe de como funcionava o processo de integração contínua que utilizo. Sempre com um job acompanhando cada aula para que eles pudessem exercitar o que foi passado.

Em seguida, apresentei a eles os métodos ágeis de desenvolvimento de software e a metodologia Scrum. E eles colocaram em prática através de um Lego for Scrum Game que foi bem divertido e com certeza puderam tirar dali um aprendizado valioso sobre organização, trabalho em equipe e fluxo de trabalho.

Para concluir a mentoria foi necessário colocar em prática tudo o que foi aprendido, através do desenvolvimento de um projeto piloto de um software já determinado pelo cliente. Esse primeiro projeto foi de grande importância para fixar todo conhecimento transferido durante a mentoria.

Segue abaixo a stack de todos os conceitos e ferramentas que foram apresentados e treinados durante a mentoria:

  • Ambiente de desenvolvimento (Xampp, MySQL Front, Visual Studio Code)
  • Gestão de código fonte, versionamento e git flow (Github)
  • Frontend (HTML, CSS, Javascript, JQuery e Bootstrap)
  • Programação Orientada a Objetos (PHP)
  • Programação Orientada a Testes (TDD)
  • Conceitos de MVC (Model View Controller) e CRUD (Create, Read, Update, Delete)
  • Programação em Par (Coding Dojo)
  • Persistência em Banco de Dados Relacional (PHP + MySQL)
  • Framework CakePHP: Implementação de CRUD
  • Framework CakePHP: Regras de validação de entidades
  • Framework CakePHP: Associação e relacionamento entre entidades.
  • Framework CakePHP: Melhorando interface de usuário com Bootstrap e aplicando Ajax.
  • Framework CakePHP: Autenticação e autorização de usuários.
  • Framework CakePHP: Geração e impressão de PDFs.
  • Framework CakePHP: Técnicas de refatoração e código limpo.
  • Conceito e implantação de Integração Contínua e Deploy Automatizado (Jenkins).
  • Métodos Ágeis de Desenvolvimento de Software e Scrum.

Foi muito gratificante pra mim acompanhar a evolução da equipe e ver eles conseguindo entregar software e consequentemente retornar o investimento do cliente. Isso mostra que eles conseguiram absorver o mínimo de conhecimento transmitido e entenderam a importância do que foi passado.