Weeknotes 2022 W52:

December 26, 2022​–​January 1, 2023
← previous weeknotes
next weeknotes →

Happy new year!

It is still week 52 of 2022, even though it’s 2023 already. Weeks are weird… wait… didn’t I talk about the exact same thing last year — Week­notes 2021 W52?

I spent NYE at home by myself, because I have a strong dislike for fireworks and I was not keen at all on being anywhere else but home. The fireworks turned out a lot milder than I anticipated; either people have been holding back or they’re not as much of a problem for me anymore. Perhaps next NYE, I’ll hang out with friends.

I was considering a “year in review” section in these week­notes, but I’ve not quite found the energy for it. It wouldn’t be too difficult, but it would be time-consuming.

Especially because this week’s week­notes have, accidentally, a lot of thoughts in them. This week’s week­notes are the longest ever. I apologize.

I’ve been in a mild crisis regarding friendship, social life, purpose, and community. It has been brewing for a while, starting even before the COVID-19 pandemic.

I’ve got a handful of loosely-connected thoughts. Hold on, this is going to be quite a read:

Friendship: My close social circle is fairly small and that is on purpose. I’m picky when it comes to friends: friendship has to mean something. For me, it’s quality over quantity (and I’ve got some quality friends).

That small group of friends has shrunk considerably over the pandemic. I would love to get that group of friends back to at least its original size, but I find myself struggling to figure out how to do that. It is as if the pandemic has hampered my ability to build strong friendships.

Formerly solid connections have broken down. Conversations often are awkward; words miss their target; communication is difficult as the signal-to-noise ratio seems higher than ever before. Either I have changed considerably, or other people have changed. On multiple occasions, I have experienced the shock of realizing that a close friendship simply no longer exists.

Why the communication struggle? Has language changed in the last two–three years? I can’t imagine isolation and disconnectedness has done much good for people’s ability to converse.

Social life: I’ve kept the amount of physical meetups low in these pandemic years, for obvious reasons. This has not been great for my social life, even though I’ve had plenty of phone calls instead of physical meetups. I’ve had plenty of video calls too, though less often, as they tend to be considerably more exhausting.

I’ve been preferring to call it physical distancing, not social distancing. Stay physically distant, keep socially close. That’s the idea, at least.

My need for a social life would in the past be satisfied in no small amount by office life. As I’ve been working remotely for two and a half years now, that is gone entirely. I strangely also don’t miss that aspect of a social life: the thought of regularly going to an office fills me with dread.

I picked up Tinder again, to see where it takes me this time. Perhaps in these mature pandemic years, Tinder will be different. I’m not too optimistic, but we shall see.

Purpose and employment: This is where things get a bit icky. What is my purpose? What are my goals? What grand things do I want to achieve?

I’m employed at the moment, though I don’t have a particularly strong connection with the product I’m helping to build. My employer is both a product and a service company, but neither the product or service is something I’d use myself. (I don’t even work on the product itself.)

I do good work, though. I don’t work on the product itself, but on everything that helps make the product better, safer, faster. That’s a worthy goal, and I learn from it. The skills I get from this work are transferable, too.

But there is a problem with this. I can keep doing this work at my current employer, and get them to a point where the engineering department is on a much more mature level. The issue that so many other companies I’ve spoken to have similar issues. I could eventually move on to another company, and do the same sort of work there. And then move on the next company, and so on. It’s a Sisyphean effort.

I would rather like to apply my skills on a larger scale, in a systematic way. I don’t know how to do that, however.

Purpose and personal interests: I would also like to work on my own projects, some of which can be quite experimental. Being an indie developer is quite tough, however. I need money to sustain myself and at the moment I have a runway of a few months. I can’t take time off (or quit my job) — I cannot afford it, even though the idea of spending time on something that truly matters is very appealing to me.

I created the Nanoc static-site generator a long time ago, and that has been highly influential. After its release, more and more people started creating their own static-site generators, iterating on the idea. These days, static-site generator are a solid default choice for building web sites. New concepts have risen out of the original idea (Jamstack), conferences were held around it, and companies have sprung up around the idea (Netlify). I wasn‘t too involved in the whole concept, but I was there at the very beginning, and seeing others build on that initial idea, continuously evolving it, has been exhilarating.

Nanoc mattered. Not too much the software itself, mind you, but the concept, and all the thought that went into it. So many people used it and took inspiration from it. Plenty of people also didn’t like it and built their own variant of the static-site generator concept, which I think is fantastic: at the end of the day, what matters is that we improve our tools, our processes, our ways of thinking.

For me, that is what drives me: building tools and figuring out ways of working that drive us forward — as human beings, as a community, as a society. I’m well aware that it sounds a little megalomanic to aim for improving society as a whole, but it can be with the tiniest nudges, with the right people to iterate an idea to carry it forward.

Closecontact mattered, too. Even though the concept was simple, I think we executed it really well. It didn’t have the biggest reach, but it was well-received and it was influential — as evidenced by at least two other products partially copying the idea. A lot of credit goes to Kat here, whose vision and connections made this project as fantastic as it was. My personal highlight: being promoted by Richie Hawtin on his Instagram — absolutely mind-blowing.

This is the sort of thing I want to do more of: things that matter. Implement ideas that are fresh; do things that have never been done before. Build things that people want.

I’m honestly fine with people taking something I made and iterating over it, improving it. It means I was on to something, and it means that what I did mattered. (I’m less OK with people taking an idea and monetizing it.)

I’ve got my Perpetual interests, which I keep working on, doing research on, coming up with ideas for. Lately, I have been — on and off — creating prototypes for programming languages, finance apps, and budgeting apps. They’re different from anything else that already exist, and if all goes well, I’ll get these projects to a reasonable level where I can publish them.

I’m not limited to the list of perpetual interests I mentioned earlier, though. Maybe you’ve got an idea that you think is new and fresh, and could have a larger impact. If so, we need to talk.

Communities and employment: This one is icky, too. There is no community where I feel like I really belong. This is in small part by choice, but also just how things end up happening.

I found that for all companies that I’ve worked for or spoken to, it’s true that they aim to create a sense of community. People, certainly in software-oriented companies, tend to identify with their employer. People want to know who you work for, and dropping a big company name is a point of pride. People happily share their employers’ LinkedIn posts.

Why are we okay with being corporate drones?!

I keep the name of my employer out of conversation. I don’t reveal it even when people ask me. I deliberately don’t want people to know where I work, because it genuinely should not matter. My identity is not, and should not be, coupled to who I happen to work for.

This is not a slight on my employer. They’re no different: this company does pretty much the same as all other companies I know. My employer is doing well, my coworkers are great, and I enjoy the work I do. I’ve got no intention of leaving any time soon.

The workplace — even in pandemic years — has been the central place where people find their community, belonging, social life, friendship, and purpose. Employers know this, and actively work towards making this even more true. I think it’s vile.

So, if I don’t get (and don’t want to get) my sense of community from whatever company happens to employ me, I need to look elsewhere. But the communities I’ve been part of don’t quite fit me.

Communities and commitment: I used to play Javanese Gamelan, which I certainly enjoyed. I stopped when the COVID-19 pandemic hit, and never returned. This is in large part because it was physically uncomfortable. Sitting on a floor for hours over instruments made for people quite a bit shorter than me ended up in back pain far too often. On occasion, the back pain lasted into the next day, which made me realize this is too physically unhealthy for me.

A problem I had with Gamelan is that I didn’t feel like I fit so well in the group. The other players seemed to be much more committed than me. I was in it because I enjoyed it, without having the desire or expectation to turn it into something more. It is possible this is just an incorrect perception on my part, and that it’s absolutely fine to be just in it for the fun. I’d have to have a conversation about that with the organizers, though there probably wouldn’t be too much of a point since I’ve got no plan on returning due to the back pain anyway.

So, I left this community in part by necessity (COVID-19, back pain) and in part by choice (perceived expectation mismatch).

In 2022, I picked up fiction writing as a hobby. I’ve written a few short stories, though I’m too insecure about sharing them publicly just yet. (Ask me about them in private.) I’d like to find a community of fiction writers, ideally in Berlin, that I could become part of.

I’ve been thinking about the expectations that a community has of the people in it. For me, it should be enough to just show up. It’s not a club membership; there are no roles and responsibilities. A community is a space (physical or otherwise) to find like-minded people and connect.

This is what makes online communities so awkward. A subreddit, for example, isn’t a community, despite what people call them. A Mastodon server is not a community either. Communities are too organic and self-organizing that any attempt at codifying them in stable structures is bound to fail.

Communities and purpose: I am on Mastodon as @denis@ruby.social, on the Ruby.social Mastodon server. It felt like the most appropriate server for me, as I most strongly associate myself with the Ruby community. This is ironic, because I don’t feel strongly associated with the Ruby community, and there are people whom I strongly associate with the Ruby community and aren’t on the Ruby.social Mastodon server.

I don’t feel like I belong to any programming-language-specific communities. I feel like the entire concept of programming-language-specific communities is broken. A programming language is a tool to achieve a purpose, and if a community is oriented around a tool rather than a purpose, it’s not going to be a healthy community.

All the software engineering communities I know are organized around tools. The Ruby people vs. the Java people. The microservices people vs. the monolith people. The way these lines between groups of people is counterproductive and unhealthy.

(I remain confused as to how is it possible that people can get so incredibly excited about the concept of microservices. People talk about it as if the microservices pattern is the purpose itself, rather than a tool. My eyes are glazing over.)

If my purpose is to find ways for people to automate tasks, then the tool could be Ruby, running on macOS, for building a textual programming language. Or, the tool could be Java, running on Windows, for building a graphical programming language. The purpose is the same, but the approach (the toolset) isn’t. Switching the approach means switching three entirely different communities (with rivalries between them), making such a switch nigh impossible.

Again: I want communities around purposes, not tools. I don’t know where to find those. I don’t even know those exist. I also don’t know how to create those.

That’s my crisis regarding friendship, social life, purpose, and community.

Gremlins: As I wrote last week in Week­notes 2022 W51: Xmas avocado, I switched form Firefox to Safari so that I could use Stage Manager properly. Safari’s autocomplete turned out to be quite broken, however: maps autocompletes to maps.app.goo.gl rather than maps.google.com, and goog autocompletes to knol.google.com, for Knol, Google’s Wikipedia competitor that shut down 10 years ago. I still had a bookmark for a Knol page, but it’s bizarre that Safari would still autocomplete to that a decade after the fact.

Anyway, I nuked ~/Library/Safari and I’m starting with a clean slate. It’s mildly weird to have no bookmarks anymore at all, but I still have my Firefox bookmarks, in case I miss anything. I’ll live.


I converted most of Gex from Crystal into Go. I already wrote about this in the previous week­notes, but the semantic analysis phase as it exists in the Go codebase now is so much better than what the Crystal version had. I think I’m getting the hang of how this works.

Each AST node now has an instance variable which gets populated with the lexical scope (the symbol table) during a symbol definition phase. I used to struggle to figure out where to store the symbol table, but putting all the symbol tables in the AST nodes makes the most sense.

This approach is much more imperative than functional, which put me off initially. After all, having AST nodes where some fields just aren’t populated for a while feels a bit weird. I’d rather have a different node type — like a ResolvedASTNode derived from of ASTNode — but sticking everything in ASTNode is just fine.

During the symbol definition phase, each AST node that defines something, like a variable, a function, or a struct type, also gets a symbol instance variable containing the unique instance for the thing it defines. Later, in the symbol resolution phase, references to previously defined things get resolved.

Here’s what that looks like for variable definition statements (like var amount = 210):

type VarStmt struct {
  Token token.Token // The `var` token

  Symbol sem.Symbol // Filled in later
  Scope  sem.Scope  // Filled in later

  NameToken token.Token
  Value     Expr

Two of these fields have the comment // Filled in later. These are filled in during the symbol definition phase.

Variable reference expressions (like in amount * 0.21) also have two fields, that get filled in later. The scope gets filled in during the definition phase, and the name symbol gets filled in during the name resolution phase that comes later:

type IdentifierExpr struct {
  Token token.Token // The identifier token

  Symbol sem.Symbol // Filled in later
  Scope  sem.Scope  // Filled in later

  Value string

This is how a name (like amount) in a variable expression (like amount * 0.21) gets connected up to its original definition (like var amount = 210). Click!

The Go implementation of Gex has structs, too:

struct Person {

fn main() {
  var denisD = new Person {
    firstName = "Denis", lastName = "Defreyne" };
  var denisV = new Person {
    firstName = "Denis", lastName = "Villeneuve" };
  var firstName = denisD.firstName;

This transpiles to the following Ruby code:

Person_1 = Struct.new(
:firstName, :lastName, keyword_init: true)

def main_4()
denisD_5 = Person_1.new(
firstName: "Denis", lastName: "Defreyne") 
denisV_6 = Person_1.new(
firstName: "Denis", lastName: "Villeneuve") 
firstName_7 = (denisD_5).firstName

Oh yeah, I’m transpiling to Ruby instead of C for now — at least until there is a type system in place.

There is no indentation in the output, because I haven’t gotten around to that yet, and it’s also by far not the most important.

I still think it would be interesting to have a language that can transpile to both Ruby and C. While certainly more work, it might lead the language design in an interesting direction, and it would teach me a lot about Ruby and C semantics.

The Go implementation of Gex no longer lives in a directory called “go experiment”. The directory is now called go-gex. It’s got its own place now!

I’ve been drafting a new article around using the state pattern in Ruby. It’s not the biggest, but I think it’ll be useful, and hopefully a fresh take on the subject.

I’ve been making extensive use of my training budget at work. I’ve bought about a dozen books, with the last two arriving just earlier this week. Training budgets are great and I intend to make even more use of it in the coming year.



Tech links: