A Developer's Adventures of Code
The Advent of Code (AoC) is a calendar of small programming puzzles for a variety of skill sets and skill levels that can be solved in any programming language. Programming puzzles are commonly used in job interviews, in university courses, and to practice and improve programming skills. Solving programming puzzles (exercises) repeatedly, it’s known as code kata (from the Japanese concept of kata in the martial arts). Learning can be fun, for example solving programming puzzles with friends or challenge each other.
Some of my colleagues and I decided to solve the AoC puzzles and challenge each other mainly for fun and learning and then for a prize for the first three places. The challenge was to solve 25 programming puzzles (separated in two parts) which were announced at midnight EST/UTC-5 in the aforementioned website on a daily basis (from 1 to 25 of December). To solve a puzzle, you would have to read the instructions carefully, implement your solution and run it on a provided dataset to calculate an output result. If the result of each part of the puzzle is correct, you will earn a Star (total of 50 Stars), and points based on the time you spend to solve the puzzle since the announced time. In our case, the challenge was just to solve the puzzles and not a speed contest (taking account only the stars).
Our daily tickets as a developer are similar to puzzles, which we solve on a daily basis to complete a task. In this article, regardless of the challenge results, I will describe my experiences in AoC and what we can learn from such a challenge in compassion to our daily tasks and tickets.
The majority of the AoC puzzles descriptions were very informative, describing a story-adventure of a developer (background) and the final goal with examples. This was a great reminder of how a developer’s ticket should be organized to be effective. For example, a ticket should among others to:
- Describe a user story, to understand the user’s need at a high level. This will help the developer to understand why this ticket is important, how it would help the user, and which solution is appropriate.
- Clearly define its goals and scope, to fully understand what should be implemented and what it should affect (brand, site, region, etc.). Clear examples are always welcomed. A confusing goal or example may result in spending several hours to understand it. The example in AoC 2020 puzzle 17 is such a case, in which a lot of people were confused.
- Have an up-to-date list of acceptance criteria, which describes the requirements that must be met in order to mark the ticket as completed.
Solving puzzles regularly (e.g. AoC, code katas) will increase our efficiency and decrease the required time to solve them. This is the same in a working environment, in which we are solving the problems (tasks) of our tickets and we are getting better at the same time. For that purpose, we could dedicate some time to think or search on the Internet for a different solution (way of thinking, existing libraries, tools, etc.), see other people’s code, discuss it with our colleagues, etc.
The time to solve a problem is highly related to the first selected solution and not how quick you start typing (think first). To quickly select one of the best possible solutions, it needs experience gained from solving related problems and many failed attempts. This is where puzzles, katas and hobby-projects can help. We cannot all be super-fast, as shown in the next meme below, but we can keep improving ourselves.
Day 20 of the AoC 2020 has come, the weather was good and Part 1 was solved, then part 2 was… nope! and some people decided to decorate their Christmas tree and others just quit trying. Maybe day-20 puzzle was not that hard in the end, but if you stuck in a not so good idea, you are stuck.
You may be the best developer ever existed, but still, sometimes you will have to ask for help to solve a puzzle or complete a ticket at work. Maybe you could achieve it without asking and spend several hours or days, but at the end of the day, is this efficient (especially in a work environment)?
We could dedicate some time to work on the specific problem in order to have a good understanding of it, and then if we stuck, we will be able to make the right questions or search for a solution in the right direction in order to solve the problem. We have to accept that we cannot know everything!
Be humble and share your knowledge, communicate with your colleagues to provide help when needed and use their experience to improve yourself (don’t be afraid to ask). In addition, do not be afraid to check a different way of thinking or restart from scratch (depending on the context), sometimes a different perspective may help “clean” your head.
In some AoC puzzles, the second part was focused on “load testing” our implementation (of the first part). For that reason, our implementation should be optimized enough to solve the puzzle in a relatively short time.
This kind of quiz is very helpful to understand how our code will operate under heavy load (e.g. from a marketing offer). In addition, it shows the importance of load testing (e.g. for our APIs) to understand its boundaries and find bugs (e.g. from memory leaks, race conditions, etc.).
The Advent of Code (AoC) it’s a programming challenge of 25 small programming puzzles (divided into two parts), which were announced in a daily basis (at midnight EST/UTC-5). Some of my colleagues and I decided to accept the Advent of Code and challenge each other, mainly for fun and learning. This was my first time participating in AoC and I can say that I missed it when it was over. In addition, I really enjoyed the posted funny memes. The AoC provides programming puzzle events since 2015 so, there are more programming puzzles available 😉.
It was a challenging and satisfying puzzle-solving, which I recommend to give it a try. There were puzzles that required more effort (at least for me) and depending on your daily schedule it may be exhausting, but you can always solve them in your time.
Solving programming puzzles can be used for honing your programming skills, but we can learn much more because our daily tickets as a developer are puzzles too. Thus, we can see (or remember) the importance of:
- A well-described ticket (not confusing), with clear goals and scope, with an up-to-date list of acceptance criteria.
- Dedicating some time to think or search on the Internet for a different solution (way of thinking, existing libraries, tools, etc.), see other people’s code, discuss it with our colleagues, etc.
- Being humble and sharing knowledge. To communicate with colleagues to provide help when needed and use their experience (by making questions) to improve ourselves.
- Load testing our implementations to understand its boundaries, find bugs (e.g. from memory leaks, race conditions, etc.) and finally make it more efficient.
How was AoC challenge for you? Would you give it a try?