Engenharia reversa no GBA: E aí? O que obtemos? — Parte Final

Bruno Macabeus
9 min readDec 18, 2019

Essa postagem faz parte da série intitulada Engenharia Reversa num jogo de Gameboy Advance. Leia a introdução aqui. Leia a postagem anterior aqui.

Especificamente para essa última postagem, não é preciso ter lido as outras — apesar de eu recomendar muito, por serem só o filé.

Fan art do Klonao feita pelo Ian Dimas

E então, enfim chegamos aqui na nossa última postagem de nossa longa série. É até difícil de acreditar que enfim estou escrevendo a conclusão desse projeto da qual comecei final de 2017, e somente agora, no começo de 2020, devo encerrá-lo.

É até estranho de escrever isso, pois várias coisas mudaram em minha vida, mas continuei firme em desenvolver na mesma codebase de um projeto puramente pessoal e de também documentá-lo aqui. Isso levou mais que um ano.

Hey! Essa minha última postagem é 100% opinionated.

Nessa nossa última postagem falarei dos aprendizados técnicos, mas principalmente de soft skill, pois é algo que vejo que precisamos refletir mais. Não adianta apenas saber lidar com computador, mas também é necessário aprender a lidar consigo mesmo!
Assim começarei falando de soft skill, partindo do aspecto "tempo". ⌛️

Soft skill

No decorrer desse projeto várias pessoas me perguntavam a quanto tempo estava desenvolvendo-o, e ficavam surpresas com o que respondia, afinal, eu falava que estava desenvolvendo desde o final do ano passado.
É esperado que fiquem surpresas, pois o klo-gba.js é um projeto pessoal. Eu não tenho obrigação alguma de me focar nele por tanto tempo, e assim poderia muito bem parar de uma hora para outra — e convenhamos, esse é o fim da maioria dos projetos pessoais.
E é exatamente pelo fato de que um projeto pessoal naturalmente não tem obrigação que nós precisamos criá-las! Metas externas é uma excelente forma para tal, e deadline são importantes, pois tornam o abandono mais difícil.
Com esse racional em mente, após experimentar algumas outras ideias de projetos, percebi que o klo-gba.js era o mais viável de todos. Assim apliquei esse projeto para palestrar em diversas conferências, para apresentá-lo e falar sobre engenharia reversa.
Nessa época eu ainda estava longe de ter o primeiro alfa rodando, mas consegui criar a responsabilidade desejada ("eu preciso ter algo foda para apresentar nessa conferência!"). Como eu não tinha como alterar a data da conferência, o deadline era externo, o que me criava mais senso de obrigação e responsabilidade com o que eu mesmo me propus.

Essa é uma das principais razões de porquê apresento em conferências: criar metas externas. Isso me motiva em manter a peteca no ar.
Eu sei que fico realmente nervoso e ansioso quando vou apresentar algo numa conferência, especialmente se for para centenas de pessoas e que será gravada. Passo semanas só pensando nesse grande dia, e se não estiver na qualidade que almejo, ficarei desapontado e me remoendo pela péssima experiência. Por isso eu sei que me dedicarei dia e noite no meu projeto pessoal para apresentar na melhor qualidade que puder.
Conhecer a si mesmo é fundamental, e por conhecer esse aspecto de mim posso usá-lo em meu proveito. Eu sei que apresentar talk é algo que me motiva bastante a estudar; não necessariamente essa mesma motivação valerá para ti, e por isso você também deve buscar algo que também te motive a estudar! Eu levei um tempo para conhecer esse aspecto de mim mesmo, e sei que ainda tem mais o que se descobrir para poder tirar mais proveito das minhas próprias características.

A necessidade de apresentar em conferências me obrigou a me focar em apenas um único projeto pessoal, que por si só já é excelente. E somado a isso também criou a necessidade de ensaiar em meetups para ir praticando até lá — ou seja, criei cadências.
É fundamental manter pequenas entregas contínuas, para ter uma noção de progresso e sensação de recompensa. Eu continuamente divulgava novas versões do klo-gba.js para a comunidade do Klonoa, e assim obtinha feedback de usuários, que comentavam, faziam vídeos, etc. Isso é motivador.
Outro aspecto fundamental é ter um objetivo claro em mente, pois só assim terá noção do que pode medir como progresso. Desde do começo do klo-gba.js eu tinha um objetivo claro em mente: quero esticar essa ponte. Com esse objetivo claro em mente eu conseguia medir o quão eu estava progredindo.

Okay… E porque exatamente optei em me focar a estudar engenharia reversa num jogo de Gameboy Advance? Simples: é muito divertido!
"Engenharia reversa" é algo que não aplico no meu dia a dia de trabalho, pois enfim, eu sou apenas um desenvolvedor! Eu não sou um hacker que trabalha na KGB.
Eu realmente acredito que, idealmente, nas horas de trabalho devemos se focar em estudar assunto relacionados ao trabalho. Já nas horas pessoais devemos se focar em estudar coisas diferentes da que aplicamos no trabalho. Isso ajuda a termos as melhores ideias por pensarmos fora da caixa e, eventualmente, poder mudar de carreira para alguma outra que se sentiremos melhor.

Envolver jogo em um assunto denso como engenharia reversa torna o assunto mais palatável de se trabalhar e apresentar numa talk (algo que, como falei, me motiva a estudar e criar foco).
Somando a isso, eu gosto do Klonoa. E havia nada de engenharia reversa envolvendo os jogo dele. Optar por ele dá um gostinho a mais, por ser algo inédito e mais desafiante. Não teria graça alguma fazer apenas mais uma coisa que já existia, como mais um editor de fases para os jogos de Pokémon.
Em 2018 eu me debrucei dia e noite em estudar compiladores. Como respectivo projeto fiz um compilador que envolvia o jogo online Ragnarok. Se você tiver nascido nos anos 90, certamente deve ter jogado Ragnarok Online. Apresentar compiladores envolvendo um jogo nostálgico como ele ajuda a tornar o assunto mais cativante e menos cansativo. Tenho certeza que essa escolha de tema me ajudou a ser selecionado para apresentar na The Conf 2018 (veja a talk aqui 📽).

Reparou que ano passado fiz um projeto de compilador e esse ano foi um projeto de editor de fases? Pois como já falei, conhecer a si mesmo é fundamental. Eu já descobri que sou uma pessoa que gosta de criar projetos, de criar produtos, de pôr a mão na massa, ver algo funcionando e usuários usando. Somente ler teorias e mais teorias de compiladores ou engenharia reversa é um saco para mim. Por isso estudar sob demanda enquanto desenvolvo um projeto de ponta a ponta é o que descobri que funciona melhor para mim.
Eu precisei passar tempos lendo livros e aproveitando muito pouco para enfim descobrir que eu rendo bem mais criando projetos. Conheço outras pessoas que preferem outras abordagens, mas essa é a que funciona melhor para mim. O que importa é conhecer a melhor para ti, e para tal precisa experimentar várias.

Ah, e reparou também que ambos projetos foram ~1 ano de duração? Pois esse é o tempo necessário para ter alguma coisa legal o suficiente para mostrar para as outras pessoas — e com uma boa densidade de conteúdo para transmitir para pessoas de todos os níveis de senioridade. É algo bem desafiante conseguir transmitir numa mesma talk um conteúdo maneiro tanto para juniors, plenos e seniors. Todos esses públicos são igualmente importantes e devem ser atingidos.

Okay, e por qual razão venho escrevendo esse manual que você está lendo?
Pois algo que me incomoda muito quando vejo outras pessoas fazerem é estudar, estudar, estudar, e nunca produzir algo nem terem isso como meta! De nada adianta estudar e não gerar alguma coisa com o aprendizado! Apenas levará o conhecimento ao caixão. Por isso é importante criar algo. Não importa o formato: pode ser vídeo, blog, lib, talk, meetup, podcast… o que importa é gerar algo para as outras pessoas. Se esforce em estudar até que o que você produza algo bacana o suficiente para compartilhar.
Escrever essas postagens, além de me ajudar a revisar o conteúdo e aprender mais, é uma forma que tenho de contribuir com a comunidade, de fazer a roda girar.

Hard skill

Okay, bora falar agora dos aprendizados de hard skill 🧱

Interessantimente, esse projeto envolveu vários assuntos, desde usar um pouco de máquina virtual para rodar o no$gba e o IDA, assim como programar usando WebAssembly, Canvas, WebGL, ARMv4T, JS, React Hooks, arquitetura de monorepo…

Apesar de achar bem improvável que em algum dia no meu trabalho eu vá precisar programar em, sei lá, ARMv4T, só o fato de conhecer um pouco mais como isso funciona ajuda a ter uma visão mais ampla da computação em si.
Outros aspectos, como WebGL e Canvas, já são mais prováveis de que algum dia usarei no trabalho. Assim, por ter estudado e já aplicado em um projeto pessoal, me antecipa a uma eventual necessidade no trabalho.
Já React Hooks e arquitetura de monorepo são tecnologias que consegui estudar e praticar muito durante o klo-gba.js — e isso me preparou bem para quando fui aplicar em projetos reais que atuei em meu emprego.

Usando como exemplo o React Hooks: quando comecei a programar o frontend do klo-gba.js, os hooks tinham sido lançados a pouco tempo. Até então, nunca havia usado e era novidade para todos. Com o klo-gba.js eu pude experimentar bem os hooks, explorar bem os limites e aplicações dele, fugindo de fazer apenas um hello world. Assim, quando enfim tive uma oportunidade de aplicá-lo no meu trabalho, já estava mais bem preparado.
Um caso legal é que, após várias horas sofrendo com hooks no klo-gba.js, eu percebi que realmente não há como um functional componente segurar um ref, realmente precisando criar um class component. Agora que já sei disso, não precisarei gastar esse tempo no trabalho.
Eu ainda não usei WebAssembly profissionalmente, mas considerando que está crescendo e cada vez mais em alta, creio que isso seja algo que acontecerá em breve.

Começar a aplicar WebAssembly (ou qualquer outra nova tecnologia) num projeto do trabalho é algo que gera uma certa insegurança. Por isso poder testar num ambiente seguro, tal como num projeto pessoal, é o ideal.
Eventualmente alguma das experiências poderá ser aproveitada profissionalmente. Repito: eventualmente isso poderá acontecer.
Se não guiar o seu projeto pessoal pensando em aplicar no trabalho te dará mais asas para explorar assuntos diferentes. Eu optei por várias dessas tecnologias por ser divertido experimentar coisas novas. Em nenhum momento me guiei pelo o que seria mais ou menos provável de usar no emprego. O que me importa é o processo de desenvolver e aprender coisas novas e aleatórias, e não a finalidade do que elas podem me prover num futuro improvável.
Por exemplo, eu não faço ideia de como o no$gba poderá algum dia ser útil para meu dia a dia de trabalho, e provavelmente nunca será, e foda-se isso.

Essa é uma abordagem da qual me ajuda a estudar e aprimorar as minhas hard skills, e tenho certeza que podem ser úteis para ti também: cogitar menos na finalidade de determinada tecnologias que deseja estudar; e passar a se focar em gostar do processo, de sentir o gosto de experimentar coisas novas e estudá-las pelo simples fato de ser legal.

Outro aspecto relevante é ter a liberdade no roadmap. Aquela experiência que tive primeiro sofrendo com Canvas e somente depois aplicando WebGL e constatar que com WebGL é mais performático foi algo interessante. Não sei se eu teria tido toda essa liberdade de otimizar o que gostaria de otimizar num projeto tendo que atender diferentes demandas de clientes. Além de que eu tive muita liberdade em tomar decisões arriscadas que depois se provaram ruins — e foi importante ver que essa decisão é ruim e o que a torna ruim!

Tal liberdade só é alcançada num projeto puramente pessoal como é o klo-gba.js. Essa é uma das razões de por que sempre gosto de ter um projeto pessoal e recomendo que todos tenham também, para assim ter essa liberdade de roadmap.

E finalmente…

Encerre toda essa longa história com essa música do Klonoa 😋

Muito obrigado por enfim ter lido tudo isso aqui! Se puder escrever algum comentário eu ficaria radiante. Pode falar sobre o que achou do projeto, das postagens, como isso te ajudou…

Caso queira ver mais projetos pessoais meu, veja esse compilador escrito em Elixir e o meu perfil do GitHub. Também pode assistir as talks do klo-gba.js; há uma experiência diferente vendo as talks se comparado à ler essas postagens.

Ah, e me siga no Twitter! 🐦
De vez em quando faço tweet sobre os meus projetos e outros assuntos de computação.

Se você gostou desse conteúdo, você deve gostar dos cursos da Code Crafters. Aprenda sobre fazer seu próprio BitTorrent, SQLite, e outras coisas divertidas. Se inscreva usando meu link para me pagar um café!

Até mais ~~ 🐠 👋

--

--