Como concluir projetos? Uma breve dissertação sobre o tema
Ou talvez uma brisa minha mesmo. Vamos ver no que dá
Tenho um leve TDAH. Descobri isso a alguns anos, pois sempre me interessei por novidades, mas nunca consegui ficar atento a mesma coisa por muito tempo. Não apenas isso, sou hiperativo e não conseguia concluir a maioria das tarefas até um certo tempo atrás. Isso me prejudicou um bocado na carreira. Graças a Deus consegui aprender como lidar com essa parte do TDAH (menos a parte da novidade. Novidade é bom demais).
Com isso, aprendi também outras coisas, e não, não é exatamente a formula ou receita de bolo de como concluir qualquer projeto. Vou explicar algo que com certeza irá ajudar algumas pessoas mais iniciantes, mas talvez também possa ajudar os mais experientes lembrando as bases.
Sou programador a um tempo, e desde sempre me encontrei no mesmo dilema, várias vezes nesses anos: tudo começava com uma ideia! "Vou criar um projeto que vai resolver todos os problemas do mundo e me dar muito dinheiro". Maravilha, vou começar a documentação!
Documentação (meia boca) feita, bora fazer um diagrama para me ajudar a desenvolver esse troço! Abro o draw.io, coloco uns 4 quadrados e algumas setas, e falo "ótimo, bora codar". Mas antes preciso me comprometer de alguma forma, ou pelo menos começar a vender a ideia, pois sem isso não vou conseguir vende-la. Vou ali no Reddit e posto minha documentação, pergunto "o que acham?". Meus colegas leitores acham a ideia ótima, de fato vai resolver todos os problemas do mundo! Alguns falam "gostaria de contribuir", outros chegam e dizem "poderia também resover os problemas relacionados a X, Y e Z". O "projeto" está a todo vapor, penso eu.
Agora sim, vou codar! Abro o Spring initialzr, coloco logo o Java 21 com o Spring 3.2, boto tudo que quero testar no projeto: hateoas (nunca usei na vida), websockets (sempre quis aprender, mas nunca tive a oportunidade), Vaadin (vou logo fazer o front no back, vai que vira tendência?), jpa, postgres, mongo, redis (vou usar 3 bancos diferentes, um pra cada coisa), e o security. Pronto! Baixo o projeto e abro no Intellij
Tudo começa com o CRUD! Uma classe User, com nome, data de nascimento, cpf e ID, uma service pra centralizar as regras de negócio, um repository para acessar o banco, e a controller com 4 endpoints. Ligo tudo, um no outro, e rodo o projeto. Tem um erro porque esqueci de colocar os dados do banco nas properties, mas coloco e sigo, tudo está perfeito! Testo o endpoint de get, subo o projeto no repo e logo olho a hora "vou dormir pois amanhã entro cedo no trabalho".
Passa-se uma semana, um mês, 6 meses.... meu projeto que iria mudar o mundo fica ali, esquecido, pegando poeira virtual, e tomando espaço no meu HD. A documentação não foi atualizada. O repositório está com o "initial commit" a 6 meses também.... meu projeto que iria mudar o mundo morreu... eu matei ele.
Sou incompetente?
Sou pretencioso demais?
Eu sou uma fraude? Sequer consigo dar continuidade em algo...
Não, meu caro! Esse relato é mais comum do que imaginamos. Existe uma infinidade de devs frustrados pela procrastinação criativa. Gosto de pensar nesse termo como o significado desse sentimento ou relação com o "fracasso" de algo que nem foi iniciado. Nós simplesmente temos ideias incríveis, mas é extremamente difícil e improvável seguirmos com seu desenvolvimento.
Deixe-me contar outra história, dessa vez um relato real. Fui levado a exaustão nesse tema:
No meu trabalho atual, me foi delegada uma demanda (a qual não darei detalhes por N motivos), e essa demanda esta sendo vista com bons olhos pela consultoria que me contratou, e pelo cliente que atendo. É uma solução que vai melhorar a vida de todos os colaboradores do cliente em 99% realizando uma única interação com o sistema X. Porém, essa demanda chegou em mim de forma pouco convencional, para dizer o mínimo.
Para resumir de forma beem resumida, o principal stakeholder solicitou a demanda diretamente a um de nossos gerentes, que imediatamente começou a correr atrás de devs para realizar. Antes de mim, 3 devs tentaram realizar a tarefa, mas ou eles saíram da empresa, ou foram desligados. Então chegou minha vez. Abracei a ideia, fui até o limite, desenvolvi todo o projeto desde os requisitos, arquitetura, até a pipeline, e corri atrás de todas as necessidades envolvidas no projeto. Em certo momento (rápido até. A demanda era muito simples e banal), tinha finalizado o projeto localmente, mas não tinha eté então uma EC2 disponível para realizar o deployment da aplicação. Então, fomos atrás disso.
Descobri que em um ambiente corporativo, a burocracia é uma constante predominante. Existem diversos documentos e aprovações necessárias para que o projeto ande. Por fim, o projeto que era "simples" de início, que realiza uma única ação e para se ter uma ideia, nem de banco necessita, demorou 8 meses (e contando) para ser desenvolvido.
Qual a moral disso tudo, e o que uma história tem a ver com a outra? Poderia dizer que simplesmente, desenvolvimento de software é dificil, e é um erro tentar concertar o mundo com algumas linhas de software. Mas irei um pouco mais além.
Eu diria que projetos são complicados. Extremamente complicados, ainda mais para um desenvolvedor back end. Ao iniciar um projeto, precisa-se ter em mente o quanto isso irá custar, o escopo, definir pequenos entregáveis e trabalhar com metas mínimas e alcançaveis.
Mas ai eu falei falei e nada de como é possível concluir um projeto...
Realmente, não disse. Concluir um projeto é uma tarefa impossível. O software nunca fica pronto. Olhando da perspectiva de produto, sempre existem melhorias a serem feitas.
Mas então, o que eu faço? Perdi meu tempo? Minhas ideias são inúteis?
NÃO! O que quero tentar ensinar (não que eu seja um professor ou mestre em algo) é algo totalmente diferente. Como é possível então se manter focado em uma única ideia ou projeto pessoal e desenvolve-lo, até quem sabe se tornar um produto?
Gosto de listas, então vou listar como eu me organizo nos projetos que já fiz:
Quando inicio um projeto pessoal, a primeira coisa que vem na minha cabeça é: não devo escrever nada em lugar nenhum, nem me comprometer com nada. Digo isso em primeiro lugar, pois é um erro escrever o que se planeja fazer sem de fato começar ou mesmo ter algo a mostrar. A não ser que queira buscar ajuda. E também não deixo de fazer isso pensando que podem roubar minha ideia. É muito legal postar meus planos, e parece que estou exercitando minha mente fazendo isso, mas entendi que esse é o principal gatilho da procrastinação criativa (no meu caso). Nesse ritmo então, eu apenas começo!
- Primeiro, faço uma POC da ideia.
- Com a POC em andamento, consigo mensurar do que preciso e até onde posso ir. Defino então apenas UMA coisa para fazer no meu projeto, e me comprometo a entregar apenas isso. Não quero criar a API mais robusta do mundo, nem me tornar o homem mais rico com meu SAAS. Eu só quero finalizar meu projeto.
- Com o requisito definido, divido o entregável em pequenos pedaços. Metas curtas e alcançáveis. Essas são as nossas sprints.
- Nas sprints, crio pelo menos 10 tarefas. Me comprometo a criar essas tarefas para não ter um objetivo muito grande. Criar a landing page é uma sprint, mas não é uma tarefa. Talvez eu possa dividir em: Inserir o Header, Inserir um texto chamativo, Inserir o botão de inscrever, Criar a chamada ao endpoint, escrever a conexão com o banco de dados, escrever testes unitários...
- Me comprometo a cumprir uma dessas tasks por dia no mínimo. Não aceito nada menos do que isso. É um dos motivos de quebrar em pedaços tão pequenos. Eu me sentirei mal comigo mesmo se não fizer pelo menos uma task por dia
- Por fim, documento tudo que fiz e começo outra sprint.
Esse método me ajudou muito em toda minha vida. Dividir para conquistar. Nunca foi tão real! Uma jornada começa com um primeiro passo, sempre.
A dica de ouro é usar ferramentas como Jira para se organizar.
E sim, tudo isso para falarmos de metodologia agil! Algumas coisas estão debaixo dos nossos narizes :)
Talvez esse texto não ajude o senior com 10 anos de carreira e já faz isso tudo de olhos fechados, mas com certeza pode ajudar um iniciante que tem ideias maravilhosas para dominar o mundo.
E vocês, o que usam para facilitar o processo de desenvolvimento de software quando estão tocando aquele projetinho pessoal?