2021: Year in Review
I wrote my first-ever annual review at the end of 2020, reflecting on what I worked on and learnt during the year. Here’s what I was up to in 2021:
At the end of 2020, I left Lagos, where I had lived all my life, and moved to work and live full-time in London. It was somewhat challenging—due, in no small part, to the still-ongoing pandemic. But overall, I’ve enjoyed living in the new city so far: making new friends and trying out new experiences.
I also had a good year at work. I worked remotely for most of the year, and I got to work on a few projects I found exciting and challenging. I also got promoted to associate (like mid-level) at the end of the year.
This past year, I wrote sixteen blog posts (including three newsletter issues), twice as much as the eight posts I wrote in 2020. (I started this blog in May 2020.) In total, I wrote about 25k words, which is also about twice as much as the 12k words I wrote in 2020.
I don’t have writing volume/frequency goals, so I can’t quite say the number of posts was good or bad. But throughout the year, I tried to keep a steady pace: publishing when I learn something I think someone else might find interesting. So far, it’s been great to hear good feedback from a few people for whom the posts have been helpful.
Here’s a quick recap of the posts from 2021:
- Building an expression evaluator (Part 1*, Part 2): A guide on building expression evaluators. The first post covered the three stages of evaluating simple expressions: tokenization, RPN conversion, and RPN evaluation. The second extended the evaluator with functions, relational operators, and variables.
- GOTO Reconsidered: Reminiscing on my early days of programming with BASIC, I wrote about the history of the GOTO statement and its relationship with other constructs, like conditional blocks, loops, breaks and continues.
- Gifts and Games: On my experience trying out the Oculus Quest 2.
- The Proof-of-Work Spam Filter*: Some notes from learning about the history and implementation of Hashcash, an early proof-of-work system.
- Why Chrome Runs So Many Processes: Trying to figure out why Chrome was using up so much of my computer’s resources, I spent some time learning about the architecture of Google Chrome and other browsers.
- The Tradeoffs We Make*: What are some typical tradeoffs we make when building software? How do we get better at making tradeoffs?
- Quadtrees in the Wild*: First part of a series on data structures and algorithms and the problems they solve. In this one, I talk about the quadtree and its application in location indexing and image compression.
- The Game Called Life: I can’t remember when I first heard of the Game of Life, but I’ve been fascinated by it for some time. This post discusses how the game works.
- Redraw Only The Diff: A reflection on the diffing pattern I sometimes use for the animations in my blog posts.
- Introductions, Math Games, and UI Optimizations: The first issue of the newsletter; a digest of the previous two blog posts.
- Text Search with Tries*: Second part of the series on data structures and algorithms focused on the trie and its applications in text search.
- Fooled by Complexity: For the second newsletter issue, I wrote about how complex software feels like effective software even when it isn’t.
- 25 Days of Advent: On my experience participating in Advent of Code.
- The Humane Representation of Programs: After listening to a talk by Bret Victor, I got inspired to think about better ways to teach programming.
- A Refresher on Software Vulnerabilities: A review of some common vulnerabilities from the 2021 CWE Top 25 list.
(The posts marked with asterisks were the five most popular.)
I also tried out a few experiments with the blog’s format within the year. The tech stack (Hugo static site running on Netlify) is still the same, but I made minor design changes. I also started sending out a newsletter based on the blog. I’ve sent out five emails so far, and the newsletter currently has about 90 subscribers. I like the medium as a way to directly reach readers who want to keep up with the blog.
I also (casually) started a Substack newsletter a few months ago. I’d initially wanted it as a place to write about topics unrelated to programming. But after publishing one article, a book review, I don’t think I’ll be writing there anymore. Managing two different newsletters feels like more work than necessary at the moment. And I still prefer hosting and controlling my own work myself.
I didn’t get to work on as many new hobby projects as I would have liked this past year. But I enjoyed building the interactive programs I use to illustrate blog posts, like the programs for Conway’s Game of Life and the data structures and algorithms series. I also open-sourced all my Advent of Code solutions.
I try to keep a regular reading habit and read across different genres based on my interests and curiosity. This year, in particular, I got to read a lot more fiction. I’ve found fiction a bit more challenging to work through than non-fiction after childhood. But this past year, I found a few books in the genre that were fun and rewarding to read.
Some of my favourite reads of the year were:
- The Outsider - Albert Camus
- The Great Gatsby - F. Scott Fitzgerald
- Skin in the Game, Fooled by Randomness, The Bed of Procrustes - Nassim Nicholas Taleb
And a few books from my anti-library this year (books I added to my shelf but haven’t yet read or completed):
- Economic Facts and Fallacies, Intellectuals and Society - Thomas Sowell
- A Room of One’s Own - Virginia Woolf
- Finite and Infinite Games - James Carse
- The Trial, The Castle, Metamorphosis - Franz Kafka
Next year, I’d like to:
- Do more learning experiments. Try new technology and become a better software engineer. I recently got Robert Nystrom’s Crafting Interpreters, and I’m looking forward to reading it and writing a programming language and interpreter soon. I also plan to spend more time learning about peer-to-peer/decentralized technology.
- Write more posts. I’ve enjoyed writing on this blog this past year. Among other things, it’s helped me share what I’m learning and find other people with similar interests to mine. And I plan to continue into the new year. I also plan to write a comprehensive tutorial on the HTML Canvas, specifically on how I use it to make the interactive programs on this blog.
(Plus a few other professional goals at work and personal goals that don’t fit nicely into a public list.)
I’m grateful for all I got to do this past year. And I’m excited to explore more of what I can learn, build, and share in the new year!
I hope you had a good year as well. I’d love to hear about your reflections and goals. Have a wonderful new year!