Andrey Listopadov

2021 Recap

@random-thoughts ~9 minutes read

Some blogs I read occasionally post monthly and yearly status updates. From now on I’ve decided to do a recap of what’s happened during the year, to see what I’ve achieved, and maybe plan something for the upcoming year as well. So without further ado, let’s jump straight to January 2021!

The first major event happened right after the year have started. Because Fennelconf 2020 was delayed due to COVID19 it happened online on January 2nd. This was my first public talk in English, so I was a little rough with the pronunciation, but I’m still glad I was able to participate. There were a lot of cool talks, and I was talking about my library for Fennel that implements a lot of core functions from Clojure.

Closely after the event, I did a full rewrite of Fennel’s pretty-printer for a more Lispy formatting and richer extensibility. It wasn’t particularly hard but did require some design decisions, which I’ve later changed a bit, as I was using the pretty printer for my custom data structures. The implementation was quickly merged into the core and is used ever since.

After that, I wasn’t writing new posts for some months, mainly due to the fact that there were a lot of things to do at work, and I was working on my first Emacs package isayt.el It was right when I tried from Parinfer interfering with buffer formatting so I’ve migrated to Smartparens, but I still wanted that automatic alignment that it does to the code. So I’ve made a package, that runs the indent-sexp function on each keystroke, and I’m using it for a whole year in every Lisp-related mode. It’s been great, and I can’t see myself writing code without it. I knew about the aggressive-indent-mode package, but I didn’t like that it used a timer, as I want instantaneous feedback.

I’ve continued to work on the fennel-cljlib project, but around that time I got interested in Common Lisp and its condition system. Naturally, I’ve first explored this concept in Clojure, thanks to this talk, but then I’ve started working on my own implementation of this facility in Fennel. I have written a somewhat in-depth look at how this library works, trying to explain everything mostly for myself, as I tend to forget some important implementation details. Sure, I’m writing docs for everything and trying to cover the whole public API with tests, but some details still can be lost in time.

Around that time the Freenode drama happened. Most channels I was hanging in migrated to, and I’ve left Freenode completely too. Not looking back, provided a really solid service, without any noticeable hiccups!

Then, in the middle of the year, I decided to create a Patreon page so that anyone who likes what I do or find my projects useful could support me if they want. I wasn’t pushing or advertising my Patreon page though - I write things very infrequently, and I’m not sure what kind of exclusive content I could produce for patrons. I was thinking about private posts, which can be directly shared via links (something like what does), so patrons could read it and share if they want to, but I don’t have this kind of content right now, and for now, I’m not sure if I want to do it. So I blog mostly for fun, not for profit. Except I do have a profit from it, as I improve my English with every post.

After not being able to move freely due to pandemic restrictions, I and my wife finally managed to fly to Cuba during the summer! Seeing the ocean was great, and we managed to blow off some steam. A vacation is necessary for maintaining your sanity, that’s for sure. We were quite lucky, and we managed to fly in a small window, where the overall COVID cases went down a bit, but right after we came back the situation got worse again. I hope it’ll get better the next year.

Shortly after that, I did a major rewrite of my Emacs configuration, ditching org-mode-based config in favor of plain old elisp. This was motivated by an amazing Mastering Emacs book, which taught me some important Emacs design philosophies. I’ve actually turned off transient-mark-mode completely and even wrote a little rant about Paredit because I’ve thought that it breaks these design principles.

I did a few more Fennel-related projects this year. Besides working on cljlib and condition system libraries, I’ve also written a library for manipulating immutable tables called itable. It is written in Fennel but can be used in Lua as well. I also made another Clojure-inspired library for manipulating lazy sequences and wrote a small post about the differences between these and more conventional iterators. Fennel doesn’t have a list data type, so this library is quite handy when you need one. Then I decided to improve my testing library, adding a test runner, that can write formatted reports and run tests in random order.

One more Fennel project - love-fabrik. It is an implementation of a simple inverse kinematics algorithm, rendered with the help of the LÖVE 2D game engine. I really like LÖVE, and hoping to actually make some games with it in the future.

This year was a lot about Fennel. I’ve become a co-maintainer of the fennel-mode package. And did another sort of a rewrite, by changing the parent mode. Modes in Emacs can inherit from other modes, and originally Fennel mode inherited from Lisp mode. This seemed natural, given that Fennel is a Lisp-like syntax for Lua, but it had some unexpected problems. So we’ve changed it to inherit from prog-mode instead, but this required reimplementing some of the lisp-mode features.

We’re slowly approaching the year’s end. I gave a talk at work, though this time about Clojure, in which I mostly talked about what kind of problems I think Clojure helps to solve when programming. The talk was in Russian, and right now I’m working on an article (also in Russian) which I maybe will translate and publish here. Though I’m not sure.

And shortly after that, there was another Fennelconf 2021! I was talking about the condition system library I’ve written earlier. What I’m going to say, it was pretty hard to come up with some meaningful and yet simple enough examples to showcase this library. The condition system concept is pretty foreign for most programming languages, as languages tend to a more simple exception model instead. But I hope I’ve managed to interest someone in trying something new!

Around this time Advent of Code began. I’ve decided to participate and also to write a small post for each day, explaining my thought process and the solution. It was hard. A lot of tasks were pretty hard, and maintaining the pace for 25 days straight was not an easy task. Especially since I have never written that many posts in a single month. Looking at my blog right now, I wrote almost as many posts during December alone ad I did in the last two years! I’m really sorry if this was a spam-like activity to anyone, but I generally enjoyed it. On December 26 It felt rather weird that I don’t need to wake up early and solve a puzzle while continuing to write another post right after that, haha. Well, it was fun.

And I’ve figured out why my RSS feed for the blog contained every single post in every category instead of only posts that belong to this category. So if you’re only interested in reading about a single topic I write about, you can subscribe to a specific feed now!

Speaking of reading. I’ve read a lot of books this year! As I’ve mentioned, I’ve read “Mastering Emacs”, “Practical Common Lisp”, and “Clojure in production”. Continued reading SICP, and started reading “Atlas Shrugged”. There were some other books, but I don’t remember what I read in 2021 and what in 2020.

I’ve also played and completed a lot of games, including “Super Mario 3D Land”, and “Metroid: Samus Returns” on my 3DS. Finally completed Master Quest in “The Legend of Zelda: Ocarina of Time 3D”. And I’ve had an enormous amount of satisfaction from playing “NieR Replicant ver.1.22474487139”. This game is really awesome.

There were some Metroidvanias this year that I’ve completed too. I’ve finally managed to get 100% in “Super Metroid”. Really enjoyed “Axiom Verge”, and “Owlboy”. The latter isn’t strictly a Metroidvania but still feels kinda like it to me. Started playing “Axiom Verge 2” but haven’t finished it yet. So I plan to do it the next year!

Plans for 2022

I remember a silly joke that was going around when the pandemic started in 2020. It went like this:

If you had any plans for 2020 leave them for 2022. Because 2022 is 2020 too.

Well, I hope 2022 will be a better year than 2020 and 2021! As for my plans for the upcoming year, I have already some projects in mind.

First, I want to migrate from Hugo to a pure Org-mode-based blog. This is a long-wanted goal of mine, as I’ve got frustrated with the current theme, and an inability to change it since I’ve tweaked it way too much already. So, since I’m writing my blog in Org ever since I started, I want a bit more control over how it gets rendered, and I don’t want to mess with Hugo’s theme engine. A blog should be simple, and right now I don’t like that my blog is too busy. So I hope I’ll manage to redesign it!

I want to continue evolving as a speaker. I’ve planned some more talks that I hope to give at work, teaching Clojure. I’m not an expert, but I think that Clojure is still a bit underrated in the space we’re using it, so I could expand on it. And maybe will plan another talk for next Fennelconf too!

Finally, I think I should focus on some projects that are not libraries or editor plugins. These projects are fun but were my main area for almost 5 years, and I want to do something else. I’ve been working on a game idea for a few years, and my improved skills with Fennel and LÖVE will surely come in handy! Initially, I thought that I will implement an engine for it in C and SDL2, but after some attempts, I’ve understood that I’ll end up with something very similar to love2d, so I’ve abandoned the idea for now. I have no game design experience at all, so it might not be the greatest thing, but I still think it’ll be a fun project to do!

Overall 2021 thoughts

This was a good year. I feel that I managed to do a lot of stuff, and more is to come! There were a lot of events in my life this year - I made some new friends and changed the apartment where we lived for 5 years to a more comfortable (and a bit more expensive) one. I’ve grown a bit tired at the year’s end, as there was a lot of work plus moving from one apartment to another, paired with several talks I needed to prepare for. But thankfully everything went pretty well. And I’m really thankful for everyone who made this year special for me! And for all kind readers, who occasionally email me and encourage me to continue writing and doing what I do - thanks to you all. I wish you happy holidays and a great next year!

See you there!