Every year, on December 25, a new Ruby version is released. In 2022, Ruby reached version 3.2.

Every year since 2018 (Ruby 2.6), I follow the release with a “comprehensive changelog”: the description and explanation of all notable changes in the language with examples and links.

This is not a small amount of work and typically takes several weeks, if not more. Frequently, it also leads to noticing minor glitches in new features, behaviors, and docs and reporting or fixing those glitches.

This is just one of the ways I am involved in Ruby’s development.

Last year, I did a comprehensive write-up on this involvement, which explained my changelog’s work, and how it led me to get disenchanted and then re-enchanted back in the ways the language lives and grows and my journey as a contributor, which culminated in becoming Ruby core team member. Here are those articles:

  1. What you can learn by merely writing a programming language changelog
  2. Following the programming language evolution, and taking it personally
  3. Programming language evolution: with all that, we are still flying

A year has passed since.

Last week, I published a fresh Ruby 3.2’s changelog (a month later than I should, but you’ll get why), and wanted to accompany it with some reflections on my involvement into the language throughout this last year.

But with a twist (that is easy to guess).

How I spent my 2022

After publishing the articles I linked to above and briefly diverting to my other hobby project, I decided to pursue a deeper dive into Ruby writing.

I had many competing plans and ideas, including even writing a book (which I proudly announced in the last “changelog” article). But two of the most immediate activities I saw in front of me were. First was creating a higher-level changelog of my version-by-version ones, codenamed “Ruby Evolution.” The second task was to become more active as a contributor/reviewer of the Ruby documentation process.

I didn’t expect it to be easy. In the early stages of work on Ruby documentation consolidation, I got into a passionate argument with other core team members about the goals and approaches to documentation quality. I planned to start a good-hearted public discussion about it—

That was the evening of February 23.

The next morning, I woke up at 5 am to a call from my wife, telling me that the “hybrid” war Russia had waged against my country for eight years had just turned into a full-scale invasion. Russians advanced from multiple directions. Cities, including mine, were bombed indiscriminately, and there was a very real possibility for some of them—including mine—to fall soon.

By a weird chain of circumstances, I was on Crete for a couple of days at that time.

It took me some 50 hours, two planes, two buses, one train, one subway, and two taxi rides, a decent amount of money, and an indecent amount of luck to get back to my family. All the while following the news of more bombs falling on my city, nervous messages from my wife taking my kids into the cellar to shelter, and not knowing whether my home would be behind the front lines when I’ll get there. Or whether it will still exist.

(My family as I met them. I already published this one on several occasions, but it is not that I have many more from that period to share.)

Thankfully, the Armed Forces of Ukraine never allowed the enemy to take over the city.

We spent two weeks alternating between home and cellar, and then, the night of the most fierce aerial bombing of my district, we decided to evacuate. With the help of volunteers and, again, an indecent amount of luck, my family moved to Poltava—which, by some pessimistic opinions, wasn’t nearly far enough. Still, we decided it would do for now.

The next day, I returned to Kharkiv to volunteer at any humanitarian cause, which quickly presented itself.

During the spring, I brought food, medication, and other necessities on foot throughout my district. It took some 4-5 hours a day, during which I at least felt useful.

(Some of my regular “customers.” On the height of the need, there were some 50 to 60 addresses per week.)

The city was still shelled regularly, but my part of it not as fiercely as in the first two weeks. Just, you know, an occasional rocket or two a day. Nothing to tell about unless you were in the building that was hit today.

The frontline was pretty close during most of the spring. This close:

(DeepStateMap circa Apr 2022. It doesn’t have March data, I believe it was even closer in March.)

By the end of March, I gathered myself enough to start doing some of my pre-war software development work. (To the honor of my company, and, again, to my luck, my employer continued to pay the big part of my regular salary even when I wasn’t able to do anything meaningful.)

Somewhere at that time, I also tried to look into finishing my “Ruby Evolution” project— And couldn’t remember why I should care. Like, you know, there is an air raid alert, there is an explosion nearby, there is a genocidal army raising Mariupol to the ground, and all the world leaders continue to discuss the delicate nature of the situation— and there you are, with your self-imposed task to decide how to render best the timeline of the appearance of new methods in Hash class.

I did finish and published the Ruby Evolution eventually, in June. By that time, it was somewhat safer in Kharkiv (the frontline was 15, not 10 kilometers from us); my oldest daughter got back to volunteer, too. My wife lived between Kharkiv and Poltava, dividing her time between our other two daughters and her work with Kharkiv Human Rights Protection Group, dedicated to documenting war crimes.

Since August, my volunteering has changed: the streets safer, the shops open, and state financial help system working, there was less need to deliver food. I joined another volunteer organization, and since then working on evacuations from Kharkiv (when it was less safe in the autumn) and the surrounding area (which is pretty much still unsafe).

(Me and an elderly disabled Kupiansk woman, just loaded into our ambulance to move to Kharkiv hospital.)

During the rest of the year, I participated in Ruby development to some extent and even got two important features designed and implemented: the already famous new Data class, and pattern matching support in Time. As well as some minor feature discussions, documentation improvements, educative articles, alpha-review of the upcoming Pickaxe book revival, etc., etc.

Why?

In the article dedicated to the Ruby Evolution release, I stated:

Probably, the result is worth your attention. I definitely hope so, but it is hard to judge by myself: I am still struggling to remember why I considered it important. I am happy I finished and got rid of the “outstanding homework” feeling; that’s it.

That being said, I am in no mood for theoretical reminiscences planned as an accompanying article. (I still feel my #RubyFriends😍 have failed me with their indifference. And probably will feel that for a long time.)

Before the full-scale invasion, I enjoyed the feeling of being a part of the Ruby community. I enjoyed the illusion of this community being humane and empathetic, dedicating blog posts, discussions, and conference talks not only to technical topics but also to inequality, bigotry, and reducing human suffering in general.

Well, I was to be disillusioned in the most straightforward way.

During February and March, I maintained a hope that full-scale genocidal war wouldn’t leave anybody untouched and that my hundreds of followers from the community and many personal acquaintances wouldn’t remain indifferent. I hoped prominent Rubyists I didn’t know personally but knew to be championing all the good causes to say something. I wrote blog posts (1, 2), tweeted almost daily with situation updates, translation of the most important news and personal observations, I even spoke to a few European journalists on occasion.

I was mostly wrong. There were several people from the community who showed their support when I needed it (by a weird coincidence, most, though not all of them, were Eastern European). But mostly, nobody gave a flying fuck. At least publicly. Not as much as pressing the “retweet” button under the tweet of the person from a shelled city begging for a retweet.

(It became especially telling almost immediately in early March when the whole US Ruby Twitter condemned in the strongest terms a certain enfant terrible framework creator for one transgression or another but didn’t find a spare tweet for full-blown genocide.)

The bitter realization was later confirmed multiple times—say, when I watched the videos from the EuRuKo, European Ruby Conference (which I dreamed of attending and maybe speaking before it became impossible), and neither of them gave as much as a passing remark on the ongoing war. Even though the conference happened in Finland that year: a country that welcomed hundreds of thousands of Ukrainian refugees.

* * *

And yet, I got back—if not to be in the community, then to the language itself.

Despite death and destruction. Despite learning that one of my former colleagues (who, I only later was told, considered me as his “teacher”) was killed near Bakhmut in September—and many other deaths, buildings ruined, fallen cities, critical delays in arms delivery, and international meddling.

I feel a lot of derealization about how insignificant my Ruby participation is in this background, but I still continue. Why?

This is still about empathy

I have thought about language and culture a lot all my life. (I identify mostly as a writer who accidentally also writes in a programming language.)

I’ll spare you the culturological studies of the Russian colonialism which caused this war—as well as why I grew up in a Russian-speaking family (despite my dad’s Donbas miners parents having Ukrainian as their primary language and my mom’s grandparents being primarily Yiddish-speaking shoemakers).

I’ll spare you a long rant about the language of lies, vile propaganda, and all that Orwellian tales about “liberating people of the province from the nazi Kievan regime.”

I’ll tell you that instead. Now, more than ever, I know that language is important. Its clarity and sincerity, a honest attempt to explain yourself and to understand the Other.

It is true for programming languages, too.

Ruby, with its expressive powers and “designed for developer’s happiness” motto, can be a great vessel of clarity and sincerity (and, as any powerful tool, also for pretending and obscuring the meaning, willingly or unwillingly, but that’s not the point).

That’s what I am in it for. The “human” part of the “human-computer language.” The opportunity of participating in the evolution of the means of expression towards easier, clearer communication. The opportunity I am grateful for.

It is a big challenge, too.

Working on the language API and docs with an attempt to make it more expressive and more accessible at the same time is more cultural work than engineering. It is hard to prove what’s right, and it requires a lot of patience and persistence to get a new feature into the language. It also requires empathy for the Other: trying to imagine the way people of various backgrounds and persuasions would like to read or write something, what could possibly improve their life, and their mutual understanding.

I have reasons to believe that my attitude towards the language brought me a reputation of an annoying person who is frequently pushy about unnecessary small things—both in the core team and in the broader community—but I am at peace with this, as long as at least some of my activity results in a meaningful change.

It might be that I just transferred my inability to fight the great evil in any notable way to my passion for the programming language. It very well might be.

What’s next?

I have a huge backlog of Ruby-related things I want to do.

A few separate articles on topics big and small. That damn book. A couple of projects of “explanatory rewrite” of notable software (like my “Rebuilding the spellcheker” or “Grok {Shan, Shui}*” ones, but this time fully utilizing the power of my beloved language).

I still hope to be able to work on a better representation of the official language reference. And I have quite a few ideas of the new and improved features for the future Ruby: some already submitted, some still forming in my head.

But I don’t look forward to it all too seriously.

It is finally my turn to join the army, and in a few weeks (when there would be an opening on the retraining course for my assigned specialty), I probably will have much less time on my hands for my primary or open-source work. In any case, planning anything long-term for the upcoming months would be meaningless.

But probably, I’ll still be writing.

* * *

Thank you for reading. Please support Ukraine with your donations and lobbying for military and humanitarian help. Here, you’ll find a comprehensive information source and many links to state and private funds accepting a donation.

If you don’t have time to process it all, donating to Come Back Alive foundation is always a good choice.