Hitting the books
Why building stuff is not always enough
June 2, 2025 · Felipe Vogel ·tl;dr I’ve been spending time on foundational skills, like practicing SQL and building an HTTP server from scratch, and next I’ll go back to learning computer science.
A break from building stuff
“Just build stuff.”
That’s what I’ve done over the past two or three years. I spent most of my outside-of-work-programming time (much reduced now that I have children) on “practical” projects such as:
- A CLI framework for doing Advent of Code in Ruby
- A Ruby gem for parsing a reading log
- Learning some Haskell
(That last one is debatable in its practicality 😅)
What to work on next? I’m not sure. I’m stumped. Even to the point that I wondered what it would be like to learn one of the “boring” languages. I listed out learning resources for C# and for Java. I’m not sure I’ll go ahead with either of those.
Disclaimer to prevent angry emails from C# and Java developers: there are some very intriguing things about both languages, like concurrency. The other day I went down a rabbit hole comparing C#’s stackless coroutines (async/await) to Java’s stackful coroutines (Virtual Threads). C# might even evolve to the point of its stackless coroutines not needing async/await written out 😲 And of course, either is great for high performance while being memory-safe and garbage-collected, without having to write Go. *Ducks away from Go afficionados.*
UPDATE: I dug up some old notes on Elixir learning resources, updated them, and put them in a repo as well. Maybe I’ll make a zoo for these lists 😂
There is one language I definitely do want to spend time on: Roc, a functional language without the baggage of Haskell. But Roc is at pre-0.1 (only nightly builds) and I’m waiting until it stabilizes somewhat.
Why look to another language? There’s a ton of fun stuff I could do in Ruby:
- 🤖 Build Starcraft II bots with the SC2 AI gem.
- 🕹️ Make a graphical game with DragonRuby.
- 📃 Continue making a text-based game that I started a while back.
- 🎵 Make music with Sonic Pi.
- 🎄 Do Advent of Code from previous years. I made a gem for that, after all.
But, I don’t know… right now I’m craving more structure and a sense of progression.
Plus, there are specific skill/knowledge gaps that I want to fill in. What gaps? I’m glad you asked! 😁
SQL and databases
I hand-write SQL almost every day at work for data exploration purposes, but there are a lot of concepts I feel I’m missing. To address that, I’m working through practice sites and doing some reading beyond the basics.
(If you’re brand new to SQL and need more basic practice, try SQL Teaching, SQLBolt, and Select Star SQL.)
I’m learning techniques that aren’t applicable every day but are good to know anyway, such as:
- FOR UPDATE locks and their Active Record implementation
- Common Table Expressions and their Active Record implementation
- LATERAL JOIN, which isn’t implemented in Active Record, but is used in the activerecord-has_some_of_many gem for the common use case of “top N” queries (here’s an example with a manual LATERAL JOIN)
- Postgres prepared statements can improve the performance of repeated similar queries by caching their execution plan.
- Obfuscated conditions (where an index can’t be applied) result from using a function on a column, e.g. on dates.
Here are the SQL and database resources (most of them free) that I’ve been using and would recommend:
- SQL practice:
- Databases:
About the Web
Recently I realized I didn’t know (or had forgotten) what an HTTP request actually looks like as it’s being sent over the wire. So it was time to relearn the basics.
Along the way I’m also learning some neat tricks. I’m particularly enjoying the hands-on exploration afforded by building an HTTP server from scratch, where I’m going on little side-quests of my own making, like implementing live reloading and starting a test server without a sleep or runtime limit (unlike the suggested test setup).
You may have noticed, but these examples of things I’ve learned are from hands-on practice and, yes, building stuff like an HTTP server. The point of this post is not to pontificate against side projects, just to lay out a different way of practicing fundamental skills.
Anyway, these are the Web-related resources I’m using:
- HTTP:
- Hypermedia Systems, Part I: Hypermedia Concepts by the creator of htmx, one of many libraries that take a hypermedia-oriented approach to web development.
- Noah Gibbs - Rebuilding HTTP (his last book 😢)
- Networking:
- Security:
- Hacksplaining and/or the accompanying book Grokking Web Application Security
- PortSwigger - web security exercises
What next?
Once I get through all of the above resources, I will finally have finished the “Foundations” section of my Learn Ruby list. From there I could start focusing on a different section.
More likely, I’ll spend some time on my Learn Computer Science list. It’s been a while since I last chipped away at it.
And I’m excited to give Roc another try in a few months. As for C# and Java… I’ll save them for when I need a career pivot.