Minha jornada como programador competitivo
Meu pitch para algoritmos
Algoritmos são a essência da computação. Qualquer cientista da computação de respeito deve entender o que é a complexidade (tanto tempo como espaço) de um algoritmo.
É uma das matérias mais divertidas também. Normalmente as pessoas são atraídas a programação com um fim em mente: construir um jogo, um aplicativo, uma startup bilionária, etc. Normalmente perseguir esses objetivos cegamente sem entender a ferramenta que você está utilizando se torna cansativo. Pelo menos para mim se tornou. Foram os algoritmos que me fizeram reavivar minha paixão por programação.
Entender de algoritmos e estruturas de dados é um processo puro, difícil, mas extremamente recompensador.
O (software) que eu escrevi para programação competitiva
Além de resolver os problemas (que são inúmeros), eu escrevi bastante código para me ajudar a me tornar um programador competitivo melhor. Eu escrevi um script em Python que extraia os gabaritos dos problemas da OBI e comparava as respostas da minha solução com os da OBI automaticamente.
Além disso, eu percebi que muitos dos problemas da OBI não tinham boas explicações online sobre a lógica de resolução. Com o fim das minhas participações, eu escrevi vários editoriais - documentos contendo as explicações por trás dos programas que solucionam os desafios de programação.
Minha jornada participando da Olimpíada Brasileira de Informática
Eu participei da OBI 2 anos seguidos. Nos 2 eu consegui chegar na final, mas nunca consegui me classificar para a seletiva, que é uma última fase que seleciona programadores para participar da IOI - a olímpiada internacional de informática.
A OBI cobra dos competidores conhecimentos de algoritmos e estruturas de dados. Durante 2 anos no meu ensino médio eu estudei esses assuntos, por prazer próprio, e aproveitei a oportunidade de me testar participando da olimpíada.
Minha rotina de estudos era intensa. Eu estudava os assuntos da escola durante a aula para que quando eu chegasse em casa eu pudesse me dedicar totalmente à OBI. O primeiro ano da minha participação, 2021, foi o melhor de todos. Eu nunca parei de crescer e progredir. Pouco antes da final minha rotina de estudos era tão intensa que eu programava e estudava até ter sono suficiente para apagar a luz e eu mesmo apagar na minha cama.
Em 2021 eu cheguei na final e por 1 questão não fiquei no ranking dos 50 melhores do país. Nunca vou esquecer essa questão: conte os diâmetros de uma árvore. Eu lembro vividamente de durante minha preparação ter visto esse problema mas ter decidido priorizar outros assuntos porque, afinal, “Quem que cobraria algo de maneira tão direta e específica?”. Os outros problemas foram uma luta mas eu consegui resolver muitos deles, pelo menos parcialmente (ou seja, corretos porém sem a complexidade desejada) e eu fiquei profundamente feliz com minha evolução como programador. Eu fiquei em 54º lugar nacional nesse ano.
Em 2022 a história foi um pouco diferente. Eu fiz uma longa pausa entre a final de 2021 e o início da OBI em 2022. Muito do meu tempo estudando não foi incorporado a uma evolução minha como programador, apenas fez parte do processo de “desenferrujar”. Eu também já não estava mais gostando tanto do esforço de melhorar como programador competitivo. O grind constante de resolver questões e aprender algoritmos novos se tornou um pouco chato para mim. Consegui chegar na final novamente porém dessa vez fui bem mal. Não consegui lidar bem com a pressão da final e acabei em 154º - bem pior que no meu primeiro ano.
Mesmo assim, foram 2 anos de imenso crescimento intelectual tanto em teoria quanto na prática de programação. Eu com certeza sou um engenheiro de software melhor hoje em dia por conta desses 2 anos.
A parte ruim da programação competitiva
Uma das melhores coisas da programação competitiva também é uma das piores. Os problemas a serem resolvidos são normalmente simples o suficiente para serem resolvidos em menos de 1 hora. Você abre um arquivo, escreve seu código em main() recebendo os inputs, e printa os outputs.
Isso é bom para aprender e por em prática seu conhecimento teórico de algoritmos em curtos ciclos de iteração. Porém isso não reflete o mundo real. Os problemas de informação no mundo real envolvem muito mais que escrever código diretamente relacionado com um algoritmo com inputs e outputs bem definidos. Você precisa pensar em arquitetura, em como as peças vão se encaixar, em como você vai iterar as funcionalidades. Documentação, debugging, … A lista continua.
Mesmo assim, programação competitiva treina algo que vai estar presente a todo momento: resolução de problemas com código - e isso não pode ser desvalorizado.