It's been 4.5 months since I finished my year of daily commits, and only now do I actually want to talk about it.

If that isn't a good enough indicator for how nice it is to have a life again, then I don't know what is.

From June 1, 2018 to June 1, 2019, I spent at least an hour or two (or six or ten) working on a programming project every day. My main objective was to make a meaningful contribution to at least one open-source project (either someone else's or my own) every day. I was somewhat successful. If I recall correctly, I missed about 12/365 days.

In that time, I started dozens of different projects, and finished about seven or eight of them. The projects I finished were generally the least ambitious of the projects I took on- my GitLab is littered with compilers, build tools, and interpreters that are all half-finished and non-functional. The list of projects I finished that actually work (and are actually useful) consists of a couple of Nim libraries, an extension for a music streaming bot, a brainfuck interpreter, an image scraper, a couple of very basic file parsing libraries, and a repo with some of my favorite C preprocessor hacks. Not exactly impressive.

Initially, my goal was professional development, and nothing more. In order to stand out from my peers, I wanted to have more practical experience than most of them put together. On that front, my year of commits was an overwhelming success. I learned the basics of more programming languages than I care to list. Now, the only languages I use are C, Nim, and Python (and Haskell, when I feel like pretending I'm smarter than everyone else). I learned what Docker is, and how to use it. I learned how to use the Apache HTTP server. I tried to set up my own email server, then gave up and just used mail-in-a-box. I learned how to write a linker script. I became a contributor to a couple of fairly well-known open-source projects. I learned how to write a good pull request, how to manage a project with multiple contributors, how to write a good README, and how to implement effective CI pipelines. All of these skills have been useful to me outside of my year of commits.

I always feel bad giving up on a project. Early on, however, my desire to learn took priority over my desire to make a usable piece of software, so failures came often. I find that some of the projects I am most proud of are some of my most collossal failures. RyukOS is the best example. It was by far the most ambitious project I had ever undertaken. It's still the most ambitious project of mine that even does a fraction of what it was designed to do. Despite the fact that I only got around to implementing about half of the ideas I had for it, I got what I wanted out of it. I learned a great deal about the architecture underlying ARM microcontrollers. I learned how scheduling algorithms work, and I learned the finer details of embedded ABIs. The same applies to Weblisp- I never finished it, but I am proud of it. It was my first project to have another contributor. I learned how to write a proper lexer and parser, and I cooked up clever ways of creating unit tests for C projects. Most importantly, i learned how to collaborate effectively on a software project, how to write a good README, and how to structure a C project to be as easy to work with as possible.

Although I am fine with the somewhat incomplete state of Weblisp and RyukOS, there is one large project I wish I had completed. Northstar, which was to be a multithreaded UI engine, was doomed from the start. I was coming off of a couple of deeply frustrating and demoralizing project failures, and I was too short on spare time to make meaningful contributions to it on a daily basis. Northstar came about at a time when I had lost sight of my goal with the year of commits. I wanted Northstar to be a "real" piece of software, something that people would actually use. I wanted it to be the first big project to have my name on it, but I never got it off the ground in the first place. With Northstar, I dug into message-passing design and the basics of 2D graphics, two topics which I covered only in passing in my other endeavors. While my heart was in the wrong place at the time, it was a fun project to play with, the principles behind its design are sound, and I want to return to it.

While I wish I hadn't let Northstar fall to the wayside so early in its development, my 4.5 month break has been for the best. I'm happier and healthier than I was 4.5 months ago. The effects of spending such a massive portion of my free time on a solitary (and often deeply frustrating) task were inevitable. All of the lessons I have learned about good software design are punctuated by this final lesson: take a break.

If there is anything I want the reader to take from this, it's that you should not be afraid of failure, especially when it's on your own time. The lessons you learn in failure will always be more valuable than the products of success. I encourage the reader to dig into whatever project they please, no matter how ambitious or outlandish it may seem. Even if it doesn't work, the learning experiences make it all worth it.

October 2019