Weeknotes 2025 W33: ATS compliance
Quick bits:
-
I made a grocery list where all items coincidentally started with a B — and it didn’t even have bemüse on it!
-
Remarkable how my headaches disappear after I’ve had my coffee. I might’ve developed a dependency!
-
All the documents are finally in place for the Arbeitslosengeld.1 The employment office still hasn’t been confirmed that I’ll get it, but I don’t expect it to be rejected.
If it does, then I might have a bit of a financial problem on my hands.
-
The Deutsche Telekom informed me that a new subscription is available, which offers both 50% higher bandwidth and is €5/month cheaper. Obviously I switched!
Little progress on the job search, and some setbacks even. Check out my Get me a job in 2025 page and refer me to your excellent jobs.
Oddly, I have gotten multiple rejections from jobs I did not apply to, referred by people I don’t know, to companies I’ve never heard of.
I’ve simplified my CV, with the intention of making it easier to parse for both humans and ATSes.2 It is more standard (or boring, perhaps), but it still has my flair — just a little less overwhelming so. ATS compliance is important, I hear. I am still using a two-column layout, with the (hopefully quite reasonable) assumption that ATSes have no problem parsing a two-column layout in 2025.
I’ve still got my sights set on a staff engineer or high senior engineer role. I’m also keen on finding a role that can take me to London; I still think that city would be a great fit for me in many ways.
Even though I’m okay with hybrid working for the right role, I genuinely value and prefer remote working. I’ve got my workstation set up just the way I want it, and very few office setups could come close to it.
A large desk. A split mechanical keyboard. A trackball. An ultra-wide high-resolution display. Great lighting for video calls. An excellent microphone for calls.
Sadly, I’ve worked too often in dreadful dark offices with small desks that weren’t height-adjustable, chairs that would give me back pain,3 displays that were broken beyond calibration, and people having video calls in the open office. Productivity: shot; mental and physical health: down the drain.
There are offices that are great, but they are few and far between. The SoundCloud office stood out for sure. That’s the sort of office I’d like to be in, and might even make me consider being full-time in the office. But again, that office was exceptional.
I have started using Codeberg for my recent side projects.
One thing that’s commendable about Codeberg is that it explicitly asks you to use a free or open-source license for what you publish:
Codeberg is run by a non-profit association with an explicit mission of advancing the creation and development of free content and free and open-source software.
This mission is shared by Codeberg's contributors, donors and association members. We, and our servers, work tirelessly to provide you with our free service. However, there is one thing that we expect from you in return: To contribute back to the ecosystem by attaching a suitable license to the works that you put out in public, so as to let others reuse and adapt your works.
(Emphasis mine.)
Ethical-source licenses, like the Hippocratic License, are in the grey zone, probably not permitted. I haven’t quite figured out how to feel about that, but I think I’m leaning towards such licenses being not effective or useful.4
In any case, I’ve re-licensed the source for my most recent projects, ddenv, ddwww and the work-in-progress Zig implementation of TomatenMark, under the GPL. I’ve previously used MIT as the go-to default, but the GPL feels more appropriate going forward.5
My Zig-based static site generator is paused for now, until I finish implementing a reasonably good parser for TomatenMark.
The implementation is over 3000 lines of code, though over two thirds of that are test cases. Interestingly, I am just fine with having it all mostly in a single source file.
This new implementation, while incomplete, is making good progress. I’m developing it in a TDD way, so I’m confident the test coverage is adequate. I’d love to be able to run a fuzzer against it,6 and run it through Valgrind too. Maybe at a later point in time.
I designed it to be a pull parser, which makes it memory-efficient. I can throw hundreds of megabytes of text at it and memory usage will remain consistently low — and when I say “low,” I mean below 1 MiB. Pretty good.
I am still getting used to manual memory management. This pull parser explicitly retains the memory of the parser nodes it returns, and so the memory that backs these nodes will become invalid when the next node is returned. This is fine, but needs documenting, and is a potential source for bugs. Still, I think it’s a good approach: memory-efficient and fast.
Overall, performance is decent,7 though I/O is clearly a bottleneck. I’m not a fan of Zig 0.14’s I/O interface, and I believe my current implementation is accidentally making a virtual call for every single byte it reads. Once Zig 0.15 lands, with the new reader interface, I’ll take a stab at fixing that. The async I/O, which looks like it might land in Zig 0.16, could also be beneficial.
I’ve been working with fast and energy-efficient software lately, and the difference in hot weather is noticeable. The amount of CPU throttling on my macBook Air M2 is remarkably low while I write Zig code in Zed, but when I switch to something else (e.g. live-recompiling my web site), my laptop slows down so much that even the cursor starts to stutter. This, of course, provides good motivation to continue with building fast, energy-efficient software.
For TomatenMark, there are a few things left to do. Finish the parser, document the language, document the API of the Zig parser, and expose a nice C API. Probably also update own web site to make use of this new Zig parser from Ruby. I’d also like to build a dedicated microsite for TomatenMark and its parser, though maybe that’ll have to wait until I finish the next-gen static-site generator that I have in progress.
One of the great decisions that I made very early on when creating Nanoc is that it would idiomatically use content in easily-accessible plain-text formats like Markdown.8
This might sound like an obvious approach now, but back then, a ton of content was stored in CMSes with database schemas that were undocumented and would change between versions. Import scripts were common, because extracting content manually was a pain.
I can work on my new static-site generator without having to think about how I’ll port the content over. There’ll be no need for porting any content; it can be reused as-is.9
Simple, open formats are great.
Entertainment:
- I got to 200 wins of Sawayama Solitaire in the Zachtronics Solitaire Collection.10
Links:
-
Why doesn't 2025 feel like "the future"? (struthless)
-
Debunking Transphobia (JasperDasper)
-
ChatGPT 5 power consumption could be as much as eight times higher than GPT 4 — research institute estimates medium-sized GPT-5 response can consume up to 40 watt-hours of electricity (Anton Shilov for Tom’s Hardware): Yikes.
-
The Mysteries of myhouse.wad Explained (How it works) - Part 5 (DavidXNewton): Ooh, I missed the myhouse.wad update. Exciting (and mildly terrifying).
-
Bluesky creates the world's weirdest, hardest-to-understand binding arbitration clause (Cory Doctorow): Binding arbitration genuinely sucks and I cannot believe that it is legal.
-
Unemployment benefit ↩︎
-
Hi. Welcome to the pedantry corner. It is “ATSes” and not “ATS systems” because the “S” in “ATS” already stands for “system.” So, “ATS system” would mean “applicant tracking system system.” That’s not right. If you think this is fine, I bet you’re sort of person who looks at the LCD displays on the Elizabeth Line Line while counting the money you got from an ATM machine with your PIN number. Poor you. I hope you find a cure for your RAS syndrome soon. ↩︎
-
Good ergonomics are not optional, especially when working 40 hours per week. A high-quality chair and desk are crucial, and only the foundation for a healthy workplace. ↩︎
-
Ethical-source licenses could be counterproductive, even: people who don’t care about ethics will have no problem using your software, while people who do care will steer clear of them. ↩︎
-
Not that I can explain why. It’s more a gut feeling than anything else. ↩︎
-
For now, I have a test case which generates its own random input, in a QuickCheck sort of way. That doesn’t quite give me the same that a fuzzer would, but provides a decent safety net. Or it will, once I finish up its implementation. ↩︎
-
I’m saying “decent” but it’s still absurdly faster than my go-to programming, Ruby. A night and day difference, and I haven’t even spent much time optimising anything. ↩︎
-
Nanoc is old, but Markdown is older — though not by much. Markdown had been around for three years when I created Nanoc. ↩︎
-
Not everything will be reusable as-is. The layouts/templates will need to be adjusted, because I’ve mostly been using ERB which is rather tied to Ruby. The processing rules will need to change, too, because Nanoc’s Rules file is closely tied to Ruby and Nanoc. Overall, though, it’s not a lot. ↩︎
-
The Zachtronics Solitaire Collection (Zachtronics, 2022), published by Zachtronics. ↩︎