Weeknotes 2024 W18: Opportunity costs

April 29​–​May 5, 2024
1400 words

Happy 17th birthday, Nanoc! The 1.0 release of Nanoc was on May 3rd, 2007.

Coincidentally, Nanoc crossed one million downloads earlier this week. Neat.

Nanoc is still such a nice tool to use. Its flexibility is what keeps me using it. For example, being able to write articles in my own markup language, or importing content from the note-taking app I use, or integrating KaTeX so I can show mathematical formulas. I can do all of that without needing to change Nanoc itself; it’s all plugins.

If you like the work that I do, whether it is Nanoc or otherwise, consider leaving a tip on my new Ko-fi page.


My unemployment has officially started this month. Getting the Arbeitslosengeld1 has been an adventure, and it’s not over just yet: one Arbeitsbescheinigung2 is still missing.

No other job search news to share just yet, but hopefully soon.


I struggle with opportunity costs when writing fiction. In other words, when I am writing one story, then it bothers me that I am not following up on ideas for other stories.

I have plenty of ideas, and they come in all shapes and sizes. Some ideas are for horror stories, some for weird fiction, some for mysteries. Some story ideas are short and self-contained, while others are for longer stories or serialized ones. Some are low-key, almost slice-of-life, while others are high concept and fantastical.3

Whenever I am writing one story, I find myself longing to write a story of a different kind. Plenty of writing I don’t finish because my interests have shifted onto new, more exciting stories — and then the unfortunate cycle continues.

I don’t know how to combat this. One way of getting a piece of writing to the end is to do it as quickly as possible: get the first draft written, a second draft written and edited and published before my interests shift. That is exhausting and not sustainable, though — especially for longer writing.


When it comes to fiction writing, I also struggle to combine all the skills needed to put a story together.

Writing is not just putting words on a page. It involves creating believable characters, in a believable world, responding to external events in a believable way. It’s crafting a plot with the right levels of tension, and dynamism in tension, that makes for engaged reading. And only then is it about writing down words. When it comes to writing down words, there are challenges too: point of view, tense, scene (with dialogue) versus summary, and more.

It’s a lot. A good piece of fiction writing is good at all these aspects, and I’m often overwhelmed, not knowing what exactly to focus on. I don’t even really know what exactly my strengths and weaknesses are.

Still, all of that comes with practice, yeah?


I’ve written before4 about how I miss Shopify’s dev tool for setting up local developer environments. I’ve finally gotten around to implementing a local development environment setup tool for myself. This tool is ddenv and it works a bit like this:

% cat ddenv.yaml
up:
  - homebrew: overmind
  - ruby
  - bundle
  - node: 20.12.2
  - npm

% ddenv up
Installing Homebrew package overmind       skipped
Installing Homebrew package ruby-install   skipped
Installing Ruby v3.3.0                     skipped
Initializing Shadowenv                     skipped
Creating .shadowenv.d                      done
Adding .shadowenv.d to .gitignore          done
Adding Ruby to shadowenv                   done
Installing Ruby gem bundler                skipped
Installing bundle                          working...
Installing Homebrew package node-build     pending
Installing Node v20.12.2                   pending
Adding Node to shadowenv                   pending
Installing npm packages                    pending

This tool solves a few problems I have frequently:

I want to spend as few brain cycles as possible trying to figure out how to get a development environment set up, and this tool is the solution.

There’s no magic in ddenv:

This tool purposefully avoids using VMs and containers (like Docker). Those approaches can come with significant performance hits,5 and tight feedback loops are crucial. Sharing files and environment variables across VMs and containers is also not trivial.

For it to become stable and mature, it needs high test coverage and support for handling more dependencies (Python, PostgreSQL, Redis, etc).

There is one big change I’m already making. The current implementation is in Ruby and so it requires a Ruby environment, which creates conflicts because the ddenv tool itself is also used to manage a Ruby environment — one that ddenv itself isn’t part of. This leads to funky situations. As a result, I’m moving the implementation to Go.6 Having a native executable is simpler in so many ways.

I am writing this tool for myself first and foremost. I believe I’ll get it to the point where it’s mature enough to be usable by others, but it might take a while.


Entertainment:


Links:

Tech links:


  1. Unemployment benefit. ↩︎

  2. Certificate of employment. This is a requirement for the Arbeitslosengeld, and needs to be provided by (former) employers. ↩︎

  3. Most of the stories I write end up unfinished and not polished enough to publish them. A handful of stories have ended up on my Fiction page, but plenty just lie around in draft folders on my laptop. ↩︎

  4. See Week­notes 2022 W34: Insomnia and Week­notes 2022 W45: Burn II↩︎

  5. If you’re on macOS and you use Docker for local development, you’ll incur a performance penalty of 1000%–2000%. It’s akin to using a laptop from a decade or two ago. ↩︎

  6. I settled on Go because it’s the compiled language I am most familiar with, but was considering other languages too. Rust could’ve been nice, and Crystal would have been straightforward given how similar it is to Ruby. ↩︎

  7. Anno 1800 (Ubisoft Blue Byte, 2019), published by Ubisoft. ↩︎

  8. Andrzej Sapkowski, The Last Wish, trans. Danusia Stok (New York, NY: Orbit, 2019). ↩︎

  9. Shirley Jackson, The Lottery and Other Stories (New York: Farrar, Straus and Giroux, 2005). ↩︎

You can reply to this weeknotes entry by email. I’d love to hear your thoughts!
If you like what I write, stick your email address below and subscribe. I send out my weeknotes every Sunday morning. Alternatively, you can subscribe to the web feed.