25 Days of Advent
Every December since 2015, as a countdown to Christmas Day, thousands of software programmers around the world participate in a daily programming challenge called Advent of Code. I had heard about the challenge from a few people I follow in the dev community on Twitter, but I only got around to participating for the first time this year.
The structure of the challenge is pretty straightforward: every day, by midnight GMT-5, a new programming puzzle appears on the website. Each puzzle has two parts, and you earn a star for completing each part—a total of 50 stars if you complete every part of every puzzle—and points for finishing the questions quickly.
The puzzles have varying difficulty levels, but they don’t require knowledge of any particular tool. They test for general problem-solving skills and not specific knowledge about a language or framework. According to the creator of the challenge, “Many of the solutions (that is, the code to solve the puzzle) aren’t very large, and don’t rely on fancy language features…You don’t need to understand prototypal inheritance, model-view-controller, object-oriented programming, or that a monad is just a monoid in the category of endofunctors.”
The questions are similar to the problems you find on programming assessment sites like HackerRank and Codility. And so, they can be a great way to practice if you’re interviewing for software engineering roles.
Something else I’ve liked about the Advent of Code experience is that it invites you to learn about and try out unconventional programming languages and techniques. I’ve found this series written in Ivy (a MATLAB-like calculator) fascinating. And, out of curiosity, I’ve also tried solving the first three parts of this year’s challenge in Google Sheets.
The benefit of using unconventional tools to solve problems like this is that it challenges you to think outside the box and devise creative solutions. Even after solving the problems with techniques you’re comfortable with, asking questions like “Is there a different way to think about this problem?” and “How would I solve this in X tool I’ve been learning to use?” can help stretch your understanding.
And because several other programmers are participating in the challenge at the same time and sharing their solutions online, you can learn from their different approaches even if you’re not participating yourself. I spent a few minutes yesterday comparing solutions with some of my friends on Zoom, and it was interesting to see all the different approaches one might take to solve even the simplest problems.
If you would like to follow along for the rest of this year’s challenge, share and discuss solutions, or ask any questions related to the challenge, please say hi on Twitter.