Way back at the beginning of December 2019, I started a coding challenge called Advent of Code. The premise is simple: like a traditional advent calendar, each day leading up to Christmas Day in December provides a new surprise, but instead of candy one finds a new problem designed to test programming acumen.
However, as Rich Hickey has famously explained, "simple" is not synonymous with "easy," and only after nearly six months can I finally say that I completed all 50 challenges. All of the code can be found on my GitHub, along with instructions on how to attain the solution for any given day's problems.
Before shutting the door on this project, I wanted to take the time to gather some thoughts, impressions, and learnings from this entire experience:
- Probably the toughest part of any given problem was just getting started. I would often read the prompt and think, "How am I even supposed to solve this?" and then set it aside. Once I started writing code in an editor, I always was able to find the solution eventually, even if it took all day. Getting some code down, even it's trivial, gave me something to build off of and always lead to progress.
- I used these challenges as a way to learn Python, a popular language I wasn't super familiar with. I figured that it would be a good tool for this, since it has simple syntax for string and list manipulation, which came in handy for most of the problems. Overall, I wouldn't say Python is my favorite language, and I would rather not build an API or web application with it like I would with Typescript or C#. Despite this, I definitely learned how great that language can be at wrangling data, and even Python's object-oriented classes grew on me towards the end. It'll be good to have some Python experience in my toolbox if I ever do want to perform more data or analytics-oriented work.
- In addition to learning a new language, these challenges forced me to heavily consider data structures and algorithms more than I typically do, since many of these problems can simply not be solved in a reasonable time without optimization. I had to refresh myself on algorithms and other CS concepts I hadn't worked with much since college, so it was a lot of fun to get out of my comfort zone of building typical web applications. I feel like I have gained a new appreciation for the theoretical aspects of computer science now that I have years of software engineering experience under my belt.
- I really enjoyed the problems that made use of the IntCode computer first introduced on the second day. At first, I loathed these problems, but as I continued to improve my
IntCode class I soon found these to be some of the most fun. Having a recurring component pop up in nearly half the problems encouraged writing code that is maintainable, rather than something that was ugly but functional.
- There were some problems where I was clearly over my head, and I wound up having to look for help in the Advent of Code subreddit. At first, I was rather ashamed of having to find help, but I came to terms with seeking out help as long as I was still learning and not just cooking copy-pasta. That said, Day 22's second part was absolutely brutal and required modular math that I'm not even sure I saw in college. Without the help of others, I'd likely never even have had a realistic chance to solve that problem.
- One downside to looking at the AoC subreddit was that it gave me a mild case of Imposter Syndrome. There were a bunch of other programmers out there who seemingly were able to solve the problems both more quickly (clearly, since it took me months to finish) and efficiently. While it was a bit discouraging at first, I tried to remember that relatively few even attempted this challenge, and fewer still stuck with it to the end. Out of everything, just seeing this challenge through to completion is probably my proudest accomplishment.
At this point, I'm not sure if I'll take on 2020's challenge when December rolls around. While I enjoyed many of the problems and learned a lot along the way, there were also many hours of frustration during the holidays and beyond. Advent of Code has taken up a lot of the free time that I can allocate to coding for fun, and now that I'm done I'm looking forward to moving on to something new.