Rebuilding My Foundations - An Engineering Experiment

I've spent my entire professional career building apps for myself and others. During this time I built authentication systems from the ground up, used authentication platforms, built out magnificent monoliths, managed many microservices, you name it and if it involves web/apis/mobile I've done it... Well... insofar as the tools these frameworks or languages explicitly gave me the ability to do those things.

When I first started programming (much later than a lot of the people in this field) I learned C. This was the first exposure I had to what programming was and what I could do. The problem was.. C was a beautiful language... And I was an 'ugly' student. Conestoga College originally was a BRUTAL program. This was before the Conestoga College fallout of basically turning into a diploma mill and pushing as many people through classes and raising grades as much as possible for all that sweet moolah.

Anyways, the point is. The program I took was brutal and I learned a ton from it. My first semester culminated in writing the traveling salesman (opens in a new tab) problem in C. I at this point had literally no experience with DSA or even knowing that DSA existed. Yet... Somehow.... I managed to do it. How did I accomplish this? I simply locked myself in my office in 2017 for 16 hours a day, 7 days a week, for 3 weeks. I emerged victorious and even got a "Good Job" from my professor. Since then I always attribute the growth I've had to that project.

Afterwards we moved onto newer things, C#, Java, C++, JS, ASM, Ruby, etc. but the goal always being breadth of knowledge. College was great for that. Co-op was when I first got to see some "real" code. I got to build a weather api in Node. This was awesome and I was immediately hooked. Imagine this, I could build sites for people and they would pay me to write code!!!

Well that then led to a brutal learning curve as well, after all, I couldnt knowingly hand over a codebase to a client without knowing how to safely store passwords, test the app, right??

Well here I am, 8~ years later and I'm in a rut. I love programming, I am ok with AI writing code based on my steering and suggestions, and I want to move forward. AI trivializing a lot of the CRUD apps gives me a chance to tweak my goals here. Thats where a tool called Herb (opens in a new tab) and an awesome OSS Contributor named Marco Roth (opens in a new tab) come in.

I was scrolling Youtube like a mindless degenerate when I came across a fully AI podcast (opens in a new tab) that was talking about new Ruby projects. One of them was Herb. I was intrigued, I F&*(Ing hated formatting .html.erb. I reached out, I was completely lost. I added Marco, he was more than happy to give me a tour and vision for what he wanted to build. I loved it and simply started opening PR's.

This was not exactly what I should have done. The problem is, when you sit in a domain for as long as I have you start to forget things. Things like AST's, Parsers, Scanners, etc. are all very foreign to me. I know they exist and thats the depth of my knowledge. Well Marco did a terrific job designing Herb but I couldnt reason about any of it to save my life. I was however, in love. I loved the idea that I could write code that made other's lives easier and this really opened up something for me. It made me realize I have been blind to an entire category of problems. How do the tools I use work??? I immediately decided to learn Rust. LOL

Then my wife and I moved to Brazil. I quit my job because even though it was fully remote... They didn't want the full time employees working from out of the country (thats for contractors after all LOL). Ive been walking back and forth here for months unsure what to do. I'm beginning to cut a rut in the floor. I'm building out a React Native/ Rails app and loving it but one thing I'm missing is that adventure of learning something new.

The gaps I have are very obvious: Leetcode, string manipulation, basically anything that isn't involved in day-to-day fullstack work i am crap at. Give me a codebase and I can navigate it, debug it, change it, and reason about its architecture.

Moving any further down that stack though and things are bad (to put it nicely). So, I'm going to run an experiment.

The Experiment

For my next trick.... I will turn this source code into an object!

For the next phase of my career, I'm going to be deliberately splitting my dev work into 3 areas:

1. Learn how programming languages and the related dev tools actually work.

I put together a large prompt with ChatGPT to help me plan this out and I've come up with some really nice plan here.

Slight detour here, I am as AI skeptical as the next guy but one thing is. It's currently here. With that, why not use it? For me, I still have problems with the codegen it spits out but ok, I can manually code the designs and have it then follow those patterns since most of Fullstack dev is repeatable.

One thing I am happy with is the GooGoo (google) effect. That being, it knows literally everything I tell it. So with that I can build MAGNIFICENT study sessions and they are always related to other things I've asked it. Now keep reading.

I asked it to help explain to me the categories of problems Marco's Herb (opens in a new tab) deals with. How does it solve them, why use this Visitor Pattern (opens in a new tab). How do these apps start? Do i need a main function? How does it format the source code and save it? LSP's WHAT??? Remember, I've been in webserver mobile app land for YEAR'S never having to think about these things.

ChatGPT is great at acting as a waypoint for me on these topics. Sure I get overwhelmed and my brain feels like its on fire after me violently prompting around for 8 hours like a psychopath, but at the end of the day, it can point me to the sky and I can map the stars myself.

So that's what I did. Here's the plan:

I'm starting with Crafting Interpreters (opens in a new tab) and working through both implementations of the book. The first half is writing an interpreter for the Lox programming language in Java. Then the second half is writing a bytecode vm in C for that same Lox language.

The goal here isn't really to become a compiler engineer or anything. I want to understand the stuff underneath the tools I've been using this whole time. There's just something to be said about literally typing the code out yourself instead of Copy Pasting for building that memory of it. Also this book touches all those top level areas I want to know if I want to get into this domain of dev tooling type work (Scanning, Parsing, AST's etc.).

2. Get better at raw programming problems

I'm also going to be putting some time into LeetCode.

Man my whole life I've been skeptical of this type of stuff because so many of these types of problems have such a small impact to the work I've actually professionally been doing. And to be clear, I still think this criticism is fair.

But I've also realized that yelling at the sky isn't a solution (my wife is a VERY smart woman). Also, with the intro of more and more AI coding, I think having these raw skills fills that niche where I am prompting, designing, critiquing, tweaking the AI output, but then also writing as close to 'code' code as you would want (DSA nerd stuff).

3. Start contributing seriously to open source.

This is where I'm seeing those two earlier paths converging. Instead of building out the toy projects and not knowing what to do. I want to contribute to real dev tools and lang infra. For now, thats working with the AWESOME Shopify Infra team. Honestly take a look at any of their codebases, take an issue and watch how helpful they are... Honestly, honestly, honestly, I cannot recommend enough just simply asking to help random strangers online with their codebases and watch as they give you everything you could ever need! (Not opening an AI slop PR that you didnt review or work on yourself)

This means I'm reading foreign codebases, looking at decisions made by engineers far smarter than me, fixing things, getting reviews, meeting people working directly on those systems I'm trying to know, and worst of all.... being wrong in public (YUCK). just look at this PR i opened fairly recently not understanding rails or rbis (opens in a new tab) YIKES.

I also think theres a cool intersection here I would like others to take away. I'm using AI to build and guide these plans after deliberately telling it what I think I want, and then after how I feel having actually tried it. Additionally, having AI scope out issues for me based on the current state of my learning is a NEXT LEVEL way to actually apply those meaningless problems you learn in school, or leetcode or in a book, to an actual codebase.

Why Am I Writing this?

Idk, it's kinda cool when I poke around other devs like the guy who wrote Crafting Interpreters Bob Nystrom and I see commits from way back when and go man look how far he's come. I am hoping maybe that could happen in my life too. Something where I look back years from now and go... Man he really did not take the threat of AGI coming and wiping out humanity serious enough... LOL but honestly being able to look back years from now and see that growth is something very hard to express. Let's see if it comes out that way!