Writing After Twitter, Conference Life, and Turbo-Charging tox
Hello friend!
It's been a while again, but I did promise to keep the list low-volume! Unfortunately, once again, the low volume doesn't apply to this particular instance of the newsletter. 😅 Please remember that you can open this newsletter on the web ("view this email online" at the bottom of the newsletter) and add it to your reading list / keep it as an open tab forever!
Writing Post Ubiquitous Twitter
Firstly, let me thank you for subscribing and staying subscribed! As I wrote across the social sites: Twitter's demise as a universal hangout space has made it much harder for writers like myself to get our articles actually read. People have been complaining about algorithms a lot, and as a Twitter Completionist™ that never touched the algorithmic timeline with a ten-foot pole, I'm not innocent of that. But the now-obvious truth is that we've lost discoverability with nothing in return1.
Given what's happening at Reddit, the only significant driver of traffic one can hope for now is hitting the Hacker News front page, which is difficult as it is, but also doesn't work for more niche content. Twitter's biggest strength was the ability to design communities around one's interests. Reddit came close in second – now both are severely hamstrung, if not gone (as of writing, /r/python
is still dark).
Looking at my own website, it's virtually only living off Google traffic now, which creates the perverse incentive to write SEO fodder which I emphatically do not want to do. But it makes you think when you realize your most read article is one you wrote in 15 minutes, while the latest piece that took you more than a weekend to write and polish is read by nobody.
This somewhat raises the question Why do you write/speak, Hynek!? And it's a good question I ask myself sometimes, too. I'm not an artist that creates art for the sake of art. My motivations are usually:
- Writing something properly down, so I don't have to keep repeating myself (most famously, of course, Semantic Versioning Will Not Save You).
- Solving or understanding a problem that vexed me for a long time and wanting to save others the work (long time can be hours like Why Your Dockerized Application Isn’t Receiving Signals or decades like Subclassing in Python Redux).
- Seeing something going wrong and wanting to improve the state of the world (most of my security / TLS content).
All three reasons hinge on someone reading the content and coming to my talks. This isn't about basking in praise, this is about producing content for a specific purpose and that purpose not materializing. That's also why I don't put up paywalls around my content: I derive meaning from what I'm doing – if it works out.
I guess what I'm saying is that if you're interested in some type of content, make sure to share that content with others because nobody enjoys to write for / speak to an empty room. The great liberation from the algorithm may actually have a chilling effect on what even gets written, while algorithmic content like video is going through the roof.
Again, thanks for being here! ❤️
PyCon US & Subclassing, Composition, Python, and You
Since we spoke the last time, I went back to Salt Lake City for PyCon US 2023, and it was absolutely fantastic to see my Python friends again and get a sense of community that I consider myself part of and am trying to contribute to.
This year I’ve spent a lot of time at various summits, including the language summit:
And of course, I've also had the chance to give my first big talk since 2019: Subclassing, Composition, Python, and You
I know about recency bias, but I still think that, in many ways, this might be my best talk so far. Even though, as you may be able to hear in the video, I caught a light cold on my trip to the US, which made me hide all Saturday in my hotel room, taking COVID tests, and trying to get better. Still, it distills so much I've learned about object design over the years and takes detours to explain interconnections and consequences.
It's a bummer that conferences frown on 45-minute talks, and I have problems placing it elsewhere. I agree that many 45-minute talks should've been 30 minutes, but talks like this can't deliver their full value in a shorter time.
After the talk, we did an open space on subclassing and composition, which was very well attended and led to interesting discussions. This is why I've submitted this talk to PyCon UK as a lecture room event that goes 90 minutes. If they accept it, I will give an extended version of the talk followed by a room discussion – that would be great fun! Either way, I'm fully booked and attend regardless of the outcome. I'm using funds I've gotten through GitHub Sponsors to finance this trip, so thank you, thank you, thank you everyone who made this possible! I couldn't be more grateful!
Another chance to see the talk live, hopefully without me losing my voice, will be on July 21 at EuroPython in Prague (OMG that's in two weeks 😱). My first chance to give a talk at my birthplace, so I'm very excited! It looks like I'm getting the biggest room on the last day, so please come in huge numbers!
One fun fact is that Brett Cannon stayed throughout the talk despite initially wanting to go to the traditional PSF lunch, and it inspired him (together with Bruce Eckel's Rethinking Objects) to propose a new struct syntax for Python. Not sure it will lead anywhere, but it's always nice to see when one makes an impact.
While I'm thrilled with how the talk has turned out, I have to admit that I had an extremely hard time putting it together this time. Surprisingly so! After all, it's "just" a talk version of my Subclassing in Python Redux article – how hard can it be!?
Turns out: very. I always knew (and said) there's a big difference between a good article and a good talk. But this time, it was more overwhelming than before. I had to restructure the flow entirely and sometimes felt almost desperate at how difficult it was to transform my slides as my thoughts formed.
I might've gone nuts if I wasn't so lucky to snatch a pre-release of iA Presenter (big fan of iA – I'm writing these lines in iA Writer – neither is an affiliate link). While iA Presenter isn't adequate for the kind of presentations I'm giving, its affordance to quickly move slides around by moving Markdown text blocks helped me to iterate much faster with less friction.
Once I had a rough idea of a good flow (the most important attribute of a good talk), I started building my slides in Keynote as usual, but I'm super grateful I had a much shorter feedback loop before doing so. Side note: I can't believe I don't have to ever convert SVGs into PDFs anymore after ten years:
I'm so happy, I could cry.
I haven't tried it yet, but it looks like there's already an open-source... alternative ...available called Slidev. Try it out if you ever felt the desperation of the way from your brain to your screen being too long.
Turbo-Charging tox
While my last blog post was on Why I like Nox (I still do!), I also like tox's brevity and still use it in most projects. I love what the maintainers did to it for version 4, and despite its parallel mode being broken for me right now, I've found two ways to make local development a lot faster, so I'm sharing them with the world:
The (lack of) resonance to it led to the interminable preamble, so pls read. ;)
Podcast Appearance: Test & Code #202
I mentioned in the last issue that I've gotten more involved with Towncrier. And because nobody else wanted to go, Brian invited me to Test & Code Episode 202 to talk about it.
While we talked primarily about changelogs in general and Towncrier in particular, we also ended up talking about a lot of other things including how I work and Python packaging (of course).
Hope you like it!
stamina
Another thing I've mentioned in the last issue is stamina, my opinionated interface to Tenacity, Python's great-but-unopinionated retry package. And I've had it in production in almost all my applications ever since and am very happy with it.
So, I've decided to make it a proper project and added support for asyncio
, retrying random code blocks using context managers, a backward-compatibility policy, and proper documentation: https://stamina.hynek.me/
Yeah, I'm using a subdomain on my own domain, because "stamina" is already taken on Read the Docs – and also why not.
Check out the tutorial to get started (and learn more about retries)!
Tidbits
TILs
Yes, I should eat more veggies and write more TILs.
FOSS
Apart from stamina, I have undusted and modernized a bunch of projects of mine that were on the back burner in the past. Most notably service-identity and pem.
Having to modernize packaging, CI, et cetera in one go has gone to show how much work ongoing maintenance is without adding a single feature and fixing a single bug.
But I couldn't restrain myself and added a handful of features to both.
If you, dear reader, ever have to deal with PEM files in any way, I urge you to look at it. Whenever I mention pem online, someone tells me they've needed it in the past five years.
structlog had a big release, bringing the hybrid approach of async logging to the stdlib. No more configuration, just await log.ainfo("hi")
!
Finally, attrs had a release, too, with many smaller fixes and features. Currently it's mostly a game of whack-a-mole with supporting the latest versions of Mypy and Pyright.
One Last Thing
I've gotten the feedback from several readers that apparently clicking on links in my newsletter gives them the warning that "the domain" has been used for distributing malware. I'm 100% sure hynek.me was never used for that and every website scan under the sun gives me the thumbs up. I'm not sure if I can do anything about it, but if you're getting that warning too, please let me know with some details (app, email program, ...) so I have a fighting chance to figure this out.
And that's all for this time, have a wonderful summer, everyone in the northern hemisphere, and a tolerable winter, my friends in the south!
Best,
—h
-
To be clear: I'm still posting my content to Twitter. It's just that people left and not all of them landed on Mastodon or Bluesky or what-have-you. ↩