My 2020 Annual Review: Strange Ride

· 10 min read

For a few days I debated whether there is much point in writing this review. I had a lot of enthusiasm going into 2020 and couldn’t wait to begin working on my ideas. But then this C letter thing happened, spelling the end for all of my best laid plans. I went from feeling what can best be described as an emoji face with starry eyes to looking like the Edvard Munch’s screamer.

Despite all the turmoil, there were many good events and experiences that had a positive influence on me and provided valuable insights worth sharing. Similar to the previous year, my process will be guided by the following questions:

  1. What went well this year?
  2. What didn’t go so well this year?
  3. What did I learn?

So, grab your favourite beverage and make yourself comfortable. We’re going to look through some of my personal highlights and disappointments. We will finish by trying to tease out some lessons and talk about my aspirations for the future.

1. What went well this year?

Here’s how I turned these chaotic times into positive outputs:

Open-source software. This was probably one of the most productive times I had in open source. Compared to previous years, I didn’t publish as many new Ruby gems. Instead, my focus shifted to maintenance and improving the quality of what I already created.

I resolved many outstanding issues. Without being exact, I think I’ve dealt with more than a hundred open tickets and pull requests. On top of that, I worked on many long requested features. As a result, there are many projects without any open issues now. An open source maintainer dream turning into reality.

All this activity resulted in 56 Ruby gem releases. To my surprise, by the end of the year the total gem download count crossed the 150 million mark. A 50 million increase in one year alone feels crazy. Knowing that more and more people use my libraries motivates me.

My main focus went to updating all of the TTY toolkit components. That’s nearly 25 gems. Whilst doing the various updates, I couldn’t resist creating new components. So in February, I released the tty-exit gem. This is a relatively small but essential gem that will fill a need in the TTY framework for more readable exit codes.

In May, I published the tty-option gem for parsing command line arguments, flags and environment variables. I put tons of work into the release. More than 300 commits made it into the first 0.1 version. This is probably the most solid first release I’ve ever done. It brings many powerful features like parsing map arguments which is a common way of specifying flag values in terminal tools like the Docker.

Now that all of the TTY components are updated(as evidenced in the image below), the plan is to release a new version of the toolkit in 2021. I’m excited about the future and where the TTY ecosystem of gems is going to be!

TTY Ruby gems and their dependency graph
TTY Ruby gems and their dependency graph

Sponsorship. GitHub made it super easy for individual developers and now companies to sponsor open source projects and their creators. This has a huge potential to make open source more sustainable. I’m grateful and feel fortunate to have gained a few new sponsors. I appreciate their generosity and support!

To me, the sponsorship is more than money, it’s a real vote of confidence and shows approval that what I create matters. I’m humbled to learn that there are people wanting for the TTY and the newer Strings ecosystem of gems to succeed. I hope that companies will also contribute to supporting the future development.

Reading. What do you do when there is nowhere to go? You stay home and read books! I read more than 50 books. Honestly, I haven’t planned to read that many but they served as a great escape. The topics that I’ve picked were a true mixture. Sticking with the more technical theme of this review, a couple of books stood out for me the most.

The first book that I enjoyed a lot is the Phoenix Project. A tale about DevOps that didn’t disappoint and lived up to its hype. I never read a book that introduces technical concepts by telling a fictional story. Who could expect that telling a story is such a good concept, heh? Though the characters were made up, the story felt real and very believable. I could relate to many issues found in bridging the gap between IT services and the Development team. I’d even say that’s where I spent most of my energy in the recent years. So yes, sometimes, the dialogues and problems really felt close to the bone.

The Working in Public was also a very relatable book. Nadia Eghbal did a great job analysing the open source community and discussing the evolution of open source. I felt a bit like a lab rat in an experiment. It was a weird feeling being in a way analysed as part of an open source ecosystem. The quadrant diagram that explains four different ways that open source projects are structured was particularly novel and interesting. As I recall, I classified myself as the Stadium type open source developer. The book definitely grew my awareness and strengthened my thoughts around maintenance and long-term sustainability in open source.

Coding. Given the extra hours in the day, I dove into Crystal programming language. Even though Crystal is still below major release, I haven’t had any issues with it. The experience felt rather smooth. The language has Ruby inspired syntax but you would be wrong to think that it doesn’t offer much beyond that. Quite the contrary. Crystal is a compiled language and thus super fast. It also provides strong type guarantees that lead to features not present in Ruby. For example, you can overload method definitions. In most cases, the compiler doesn’t force you to provide type signatures as the type inference is very good.

At last, I also dipped my toes into a Lisp-like language. I chose to learn the Racket language. This experience certainly felt like a bigger departure than Crystal. Even though it is a dynamic language, it’s hard to find parallels with any languages that I had a chance to code in so far. The syntax feels rather strange to type and look at in my editor. Writing an equivalent of a class is a journey into many nested methods in an ever growing forest of brackets. It is an aesthetic that I haven’t had to deal with before. I like it though when a language stretches my coding skills.

2. What didn’t go so well this year?

Now let’s look at some things from my “not so great” list.

Blogging. I started the year with an intention of publishing one article per month. This seemed like a reasonable goal given my workloads and past experience. But I managed to only write three articles which includes a yearly review.

Out of the three articles, the Writing a Ruby Gem Specification article attracted the most interest. It was featured in a prominent Ruby community newsletter Ruby Weekly underneath a biblical image with a prophetic feel to it. I got a chuckle out of it. Based on comments, emails and reviews a lot of people found the article useful. In the third and, as it turned out, the last article of 2020 titled Looking Inside a Ruby Gem, I further built on the topic of explaining RubyGems packaging system.

Then my enthusiasm waned. I lost momentum and found it hard to get back into writing again. I tried writing for a while on a few other topics but nothing felt solid enough or ready to be published. Maybe the weight of expectations that I put on myself gave me the famous writer’s block? Not sure. Despite my meagre effort my blog readership has tripled. I want to turn the corner in 2021 and write more but without expectation of a regular publishing schedule. The bar is set very low indeed.

Travel and conferences. By the end of 2019, I made a grand plan to visit a few countries mostly in Europe. France, Finland, Russia and Japan were top of my list. I was excited! Well… as you probably expect the grand tour of Europe didn’t happen. I visited only one country from the list, France. In the middle of February, I boarded the Eurostar train from London to Paris to attend the ParisRB conference. The first and only conference I attended in person that year. At that point I was still blissfully unaware.

The ParisRB was a two day conference held in a university setting. I travelled on the crowded metro and trams to reach the venue which now feels surreal. The conference hosted many great speakers. In particular, Paolo “Nusco” Perrotta told a great origin story of what we now know as a deep learning domain. I was impressed with his presentation skills and the ability to draw in the audience. In another talk I liked a lot, a duet of Mélanie and Alexandre from the Doctolib company talked about challenges with onboarding new developers to a large codebase. I enjoyed hearing about how they structure their inhouse mentoring programs and automate workflows to keep their large codebase consistent.

In between the presentations, I talked to many developers and had a chance to speak with some of the speakers. Being able to talk to like-minded people in real life is what I miss the most from the conference. Only now I realise what a privilege that was. The conference ended in quite an emotional way and a few people had tears as if they knew that this could be the last such conference in a long time.

All attendees at the end of the two-day ParisRB conference
All attendees at the end of the two-day ParisRB conference

Exercising. I continued going to the gym until the middle of March. I kept my gym membership for a few months longer expecting this whole pandemic will end soon and normal life resume. It shouldn’t be a surprise that my general well being plummeted. I continued exercising at home, but lack of weights and a small space made it impossible to match my prior training routines.

During the summer, I bought a basketball and started playing at a nearby court. Initially, I had little stamina and gassed out pretty quickly. I didn’t give up though as basketball was always my number one sport. Playing has rekindled my passion and I even got to do a few dunks. In autumn, I bought some cycling gear and rode my bike regularly around woods and lakes.

3. What did I learn?

My monk-like living has made me realise and stressed the importance of some things.

Keep reaching out. I can be a bit of hermit and I’m generally fine with minimal social interactions. This pandemic made me realise that more than ever it’s important to keep frequently in touch with friends and loved ones. But it is equally key to seek out virtual opportunities to meet new people. In 2021 I want to engage more with the Ruby community via social media and other means.

Cook your meals. Self-isolation has made it clear to me that one cannot subsist for a very long time on porridge and fish and chips diet. If anything, eating the same thing every day gets boring. The nutritious value of my meals was also questionable. I developed a craving for soups. So with the help of my mum, I dedicated myself to learning how to cook a different soup every week. Every time, I cooked a big pot that lasted me a few days. Cooking is one of the survival skills that I view as essential to living a better quality of life. It can also save you a bit of money.

Lower your standards. Hear me out before you cast your look of disdain at me. I’m not suggesting you release crappy work. Far from it. This is to say that whatever you wish to do, whether it is writing a piece of code or a blog article, you need to let go of expectations and dive straight in. Leave perfection out the door. Don’t worry about applying design patterns or figuring out domain models. Just write that piece of code and have fun. You can always come back and make things better. Once an initial version exists, you can improve the design and refactor messy code.

Become more decisive. I can be stuck in a perpetual circle of indecision. Debating, sometimes for days, whether I should go ahead and do something or not. Should I include this feature in a library? Should I write this article? Should I buy this? What’s worse, I may never actually pull the trigger and instead let the decision sit there for weeks. I need to stop this and learn how to make quicker and better decisions. The guidance from basketball’s greatest really resonates with me:

“I always say, decisions I make, I live with them. There are always ways you can correct them or ways you can do them better. At the end of the day, I live with them.” - LeBron James

Execute on your ideas. I have ideas. You have them. Everyone has them. Time passes and nothing happens. I research, think and procrastinate. The list of ideas I wish to tackle is constantly growing. The only way out is to start working on the stuff. Create a quick code spike. Write an article outline. Record a video intro. Whatever. Nothing will give you more clarity than a dose of action. My new motto comes from Thomas Edison who said “Vision without execution is hallucination.”.

Onwards and upwards

What a year it was! As I mentioned in my last review I’m not keen on setting goals. After 2020 that’s probably even more true than ever. But this doesn’t mean I don’t have a vision for what I’d like 2021 to be like. I’d like to dedicate more time to help and encourage more people to write command line applications in Ruby. I want to build resources and a community of Ruby terminal applications enthusiasts.

I have many thoughts around how this can be done. I will try to promote and highlight Ruby projects that are meant to be used in the terminal. I plan to increase my participation in other open source projects. I’d especially like to provide support for people using TTY components. I receive questions on how to use my various libraries and I feel I could be doing more to help. Making more code contributions to other projects, giving feedback or making suggestions for improvements are a few that come to mind.

I think we can all agree that 2020 has been a strange ride, but one thing I’ve learned for sure is to embrace the uncertainty. Whatever comes my way I will do my best to turn it into a positive. Let’s make 2021 a good one!

I'm Piotr Murach. I document my programming journey and share my coding experiences with practical examples to improve your day-to-day work. If you enjoy my articles or open source projects, please consider supporting what I do. Be sure to also subscribe to my newsletter and feed.