<?xml version="1.0" encoding="utf-8"?><rss version="2.0"><channel><title><![CDATA[Fabian's public notepad]]></title><link>https://holzer.online/</link><description>Thoughts on topics like software engineering, web development, blogging and the web in general</description><item><title><![CDATA[A short bleep...]]></title><description><![CDATA[<time datetime="2023-11-12 22:00"></time>

<p>
As my family and I are looking forward to move into a new home in January, the next weeks will be filled by throwing out junk that accumulated over the years, packing up our belongings into boxes, looking for new furniture etc.pp. and I'll likely be hard-pressed for time to write — therefore, as a short bleep before I go radio silent, I want to cluster some ideas that I'd like to pick up, once I have a little more time at my disposal again. 
</p>

<ul>

<li>
I'd like to finish a draft about the implementation of the little web component that <a href="/weeknotes/2023/43/">I mentioned previously</a>. This one has the strongest chance to still get done this year.
</li>

<li>
There's a pile of scattered notes on microfrontend architectures, that have accumulated over the nearly eight years that I'm working on that topic professionally. I'd like to consolidate them with my personal experience and opinions on it. As that might get out of hand and maybe deserves a longer treatment, I'm thinking about experimenting with some kind of preplanned article series.
</li>

<li>
Earlier this year I mused about the <a href="/articles/2023/06/27/se-great-books-curriculum/">great books of software engineering</a>, but the article was a bit unconclusive. I will have to pack up my library soon and thought, when I unpack the books, I'd like to do some reviews and summaries on a selected few items.
</li>

<li>
Then, and this one is a bit of a moonshot topic, earlier this year, I took some interest in the current state of rapid application development. I'm still occasionally asking myself why, a quater of a century after the final release of Visual Basic 6, nothing has emerged that lives up to its developer experience, when it comes to making UIs and wrapping them up with a datasource. I have a some hypotheses about that, though...
</li>

<li>
The quality of the major search engines have deteriorated over the last years to the point where their results are basically garbage. The rise of LLMs has, if anything, accelerated their enshittification. Plus ça change, plus c'est la même chose... I'd like to dive into the topic of curated web directories and explore whether there are lessons to be learned from the demise of Yahoo and DMOZ and if smaller directories could somehow become (again) a backbone for finding information on the web.
</li>

</ul>

<p>
If any of you'd like to talk about such stuff, feel free to shoot me a <a href="/contact.html">mail</a>. Until next time, take good care :).  
</p>]]></description><pubDate>Sun, 12 Nov 2023 21:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/weeknotes/2023/45/index.html</guid></item>
<item><title><![CDATA[October retro: Accessibility, Dev Events, Sustainability]]></title><description><![CDATA[<time datetime="2023-10-29 22:10"></time>

<p>
I've recently made a few accessibility improvements for the site. For one, I finally got around to add a skip-to-content link to the navigation, mostly following along an <a href="https://css-tricks.com/how-to-create-a-skip-to-content-link/">article from CSS Tricks</a>, with very few tweaks. And I replaced the <a href="https://www.kryogenix.org/code/browser/sorttable/">sorttable</a> script for the tables of content with a custom-element I wrote, in order to make the table columns also sortable via keyboard navigation. On the same note: some time ago I wrote that <a href="/articles/small-things-matter-for-a11y/">small things matter for accessibility</a>, which as a general principle is true, but I recently learned that the example which triggered the article is not correct anymore, because <a href="https://www.tempertemper.net/blog/bold-and-italics-arent-read-by-screen-readers">bold and italics actually aren't read by screen readers after all</a>. That was a feature of the NVDA screen reader, but not a very popular one, therefore it got disabled by default. Generally there is no audible distinction between i/em or b/strong tags for screen reader users.
</p>

<p>
Also three weeks ago, I had the pleasure to participate in my first post-pandemic in-person developer event (which incidentally has been my last pre-pandemic conference as well...), the <a href="https://unkonf.de/">unKonf</a> in Mannheim. The unKonf is basically a <a href="https://en.wikipedia.org/wiki/BarCamp">barcamp</a>, but it is traditionally opened with a keynote, which this year was given by <a href="https://www.ufried.com/blog/">Uwe Friedrichsen</a> on the topic of sustainability patterns for IT. One fact that suprised me was that the global IT landscape causes more greenhouse gas emissions than the traffic of the worldwide logistics industry. I can only recommend the <a href="https://speakerdeck.com/ufried/patterns-of-sustainability-going-green-in-it">slide deck</a>, which is filled with tons of interesting and important pointers. One take-away was that measuring and visualizing resource and energy consumption of a system is a necessary first step to move towards a more sustainable IT. Apart from that, there were many other great sessions and the "hallway track" made me realize how much I actually have missed to talk shop (outside of my actual shop).
</p>]]></description><pubDate>Sun, 29 Oct 2023 21:10:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/weeknotes/2023/43/index.html</guid></item>
<item><title><![CDATA[GDPR, gamified & a serious DX issue]]></title><description><![CDATA[<time datetime="2023-09-29 20:35" data-first-published=""></time>

<p>
Since this week my parental part-time is over, I'm back to working my standard 40 hours. With so much of my time to available to the company again, sure enough somebody deemed it a good idea to assign a training course on GDPR to me. Ok, in all fairness, that course was probably assigned to just about everybody in the department, in order to tick a box on some spreadsheet, for you know, a bit of corporate cover your ass can go a long way sometimes, but I'm digressing... Anyway as a good compliant employee, I started the course, hoping for the best. It turned out to be gamified, in - I kid you not - the form of detective's story and the look and feel and a UX of a badly programmed game, that reminded me very much on the numerous hobbyist game from the hey-days of Flash...
</p>

<p>
But on to a more serious matter of user and developer experience. My son is currently digging a bit into programming with Scratch on the Raspberry Pi. Following along a tutorial, after making the figure on the screen do some funny things, tweaking and exploring here and there, he got to the point where he had a little game that he wanted to spice up by checking for a game over condition.
</p>

<p>
So, a quick test: the player has lost their last life, tell me, why is the if branch not executed?
</p>

<img src="/weeknotes/2023/39/scratch-literal.png">

<p>
The logic looks quite sound, doesn't it? Perhaps a different notation helps to spot the problem faster:
</p>

<code><pre><intertwingle plugin="syntax-highlighting">
lives--;
if ("lives" &lt; 1) {
    console.log("Game over");
}</intertwingle></pre></code>

<p>
So, what happened? While following the tutorial he didn't drag the variable as a block, but typed it out into the field, which makes it a string literal (a legitimate thing to compare something with). Referencing the actual variable looks like that (not quite an optical difference like night and day):
</p>

<img src="/weeknotes/2023/39/scratch-variable.png">

<p>
As block-based programming languages have found their way into school curricula as well, I was wondering how many kids' enthusiasm for computing might get curbed by such little matters of affordances that cause confusion or frustration.
</p>

<p>
Last, but not least, I added two items to the site: a client-side <a href="/search/">full-text search</a> (powered by <a href="https://lunrjs.com">lunr.js</a>) and a <a href="/colophon/">Colophon</a>, because I always like to read about the website setup of other people for inspiration and also to give credit where credit is due to a few libraries I use, which were created by people who generously open-sourced them.
</p>]]></description><pubDate>Fri, 29 Sep 2023 18:35:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/weeknotes/2023/39/index.html</guid></item>
<item><title><![CDATA[First you shape your tools...]]></title><description><![CDATA[<p>
...and then your tools start to shape you.
</p>

<p>
So, after I've managed <a href="/weeknotes/2023/37/">last week</a> to switch over to <a href="https://github.com/fnh/intertwingle/">my custom SSG</a> for building the website, this week I spent time to play around and explore a few things, that I would not have done, if I needed to maintain them manually. 
</p>

<p>
The first addition, inspired by <a href="https://danilafe.com/graph/">Daniel Fedorin</a>, is a <a href="/links/internal/graph/">content graph</a>, which visualizes how connected my posts actually are. As it turned out, not that much and even less than I had thought. A lot of articles are "orphaned" (meaning, not linked to internally). The second, less pretty, but probably more useful, outcome are automatically created backlinks for each article. The last little new thing is syntax highlighting with <a href="https://prismjs.com/">Prism</a>, which yielded the philosophical question: does my css still count as <a href="/articles/benefits-of-classless-css/">classless</a>, if the classes in the markup are only created programatically?
</p>

<p>
To sum up, what started out as the musing of a <a href="/articles/2021-01-20-it-has-been-a-while/">"weird dude who writes raw HTML"</a>, is moving up on the x-axis of <a href="https://rakhim.org/honestly-undefined/19/">this chart</a> towards the static gen basin. For as, much I would like to pretend otherwise, tools matter at least a little bit.
</p>

<time datetime="2023-09-22 13:30" data-first-published=""></time>]]></description><pubDate>Fri, 22 Sep 2023 11:30:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/weeknotes/2023/38/index.html</guid></item>
<item><title><![CDATA[Everything is intertwingled]]></title><description><![CDATA[<p>
I've wanted to replace the scripts with which I create this website for quite some time now. My most important goal was to be able to build the site with a single command. Generating the RSS feed turned out to be a bit of a tyranical edge case. Within the last week I got to the point where I am satisfied enough with the result to finally ditch the two old scripts start using it for this website.
</p>

<p>
For those who read my site via the feed, this is also the reason why some old articles might have popped in your reader up all at once. The old script was heavily depending on a certain regular structure of the directory, and I would have needed to run the rss generation script for each category and then somehow properly merge the resulting xml files, which I found to be too tedious, so the weeknote category of the site was left out (which was another driver for the rewrite).
</p>

<p>
There is a great xkcd about <a href="https://xkcd.com/1205/">how much time you may spend on automation before yielding negative returns</a>. If all the tedious stuff took about 5 minutes per post and I'll write once a week, about 21 hours of programming amortize themselves over the course of five years. But even if programming a custom SSG turns out to be uneconomically from the point of timesaving, it still was fun, which is enough reason to do it. I've put both the the generator, which I named <a href="https://github.com/fnh/intertwingle/">intertwingle</a>, as well as the source of <a href="https://github.com/fnh/holzer.online/">my website</a> on github.
</p>

<p>
On to a completely different subject. This week at work, I heard that upper management is looking into establishing tools that create metrics from our repositories and issue tracker to be reported to them. I don't know whether it is merely a conincidence that a month or so ago an article about measuring developer productivity by a big management consultancy made the rounds. Kent Becks response in two articles (<a href="https://tidyfirst.substack.com/p/measuring-developer-productivity">Part 1</a> and <a href="https://tidyfirst.substack.com/p/measuring-developer-productivity-440">Part 2</a>) is quite good. In a debate on Linkedin Kent also delivered a soundbite, that sums it up up nicely: <q><a href="https://www.linkedin.com/feed/update/urn:li:activity:7107058189082230784?commentUrn=urn%3Ali%3Acomment%3A%28activity%3A7107058189082230784%2C7107115917754433536%29&amp;dashCommentUrn=urn%3Ali%3Afsd_comment%3A%287107115917754433536%2Curn%3Ali%3Aactivity%3A7107058189082230784%29">McK is offering false certainty to replace honest ambiguity</a></q>. Anyway, I think it is rather obvious why advice on software engineering from a company that mainly sells political capital and powerpoint presentations (even if the latter <a href="http://tomwildenhain.com/PowerPointTM/Paper.pdf">is Turing-complete</a>...) needs to be taken with more than just a grain of salt.
</p>

<time datetime="2023-09-15" data-first-published=""></time>]]></description><pubDate>Fri, 15 Sep 2023 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/weeknotes/2023/37/index.html</guid></item>
<item><title><![CDATA[Digital clean-up]]></title><description><![CDATA[<p>
In Gregor Hohpe's book <i>The Software Architect Elevator</i> there is a chapter with the beautiful headline: If you never kill anything, you will live among zombies - And they will eat your brain. As I hinted <a href="/weeknotes/2023/35/">last week</a>, dead and undead code isn't very satisfying to work with, so in the spirit of Ken Thompsons bonmot <q>One of my most productive days was throwing away 1000 lines of code</q>, my efforts culminated this week in a merge requests which implements a feature in negative 780 SLOC.
</p>

<p>
And as I was in digital clean-up mood, I also pruned my wiki. Consolidating notes and throwing away drafts that didn't lead anywhere left it both over a hundred entries smaller and more useful to me than before. Sometimes less is more. 
</p>

<time datetime="2023-09-08" title="That's 2023-09-08 for Non-Discordians">
Sweetmorn, the 32nd day of Bureaucracy in the YOLD 3189
</time>]]></description><pubDate>Fri, 08 Sep 2023 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/weeknotes/2023/36/index.html</guid></item>
<item><title><![CDATA[On cognitive taxes]]></title><description><![CDATA[<p>
I spent a good deal of the work week convincing myself that multiple layers of data mapping from one anemic domain model to another were indeed soundly and safely removeable. I generally try to apply Chesterton's fence when dealing with inherited code. Each layer between system boundary and internal domain model had a legitimate function, which I indeed could push down into the internal model, making it slightly less anemic. Through a lot of (partly self-, partly framework-induced) indirection the functionality was very hard to actually see, which created a hefty cognitive tax. In this particular case, that also is not a mere figure of speech, for the attempt of a rather mundane (and outwardly transparent) change caused an ungodly amount of burned engineering time. 
</p>

<p>
At home I don't have so much uninterupted leisure time (emphasis on uninterupted) available, which means for most books of my choice I need quite some time to get through. But last week I managed to read Rolf Dobellis <i>Die Kunst des klugen Handelns</i> ("The art of acting wisely" - don't know if an english translation is published) within three days. It is about cognitive biases and errors in thinking and consists of mercifully short chapters, which fitted quite neatly into many fractured timeslots, that would otherwise have been rather dead. 
</p>

<p>
Also I'm really starting to feel jaded by Substack based "blog-letters" (or how shall one call nominally newsletters with fully accessible public archives?). I hate it when the reading flow is interrupted by their annoying overlay, which is added very gradually while scrolling down, so that while you read, you know that if you want to continue, you'll have to dismiss the same damned dialog all over again in a few seconds. It totally ruptures concentration and flow. Yeah, I know, creators want to capture their audience, and free is hardly ever really free, we all have to pay our bills, but this particualar interruption in the middle of articles starts to feel for me like being hit with a hammer. There is ample evidence that forcing the brain to make decisions leads to cognitive fatigue and depletes the abilities for self-control. I'm picking on Substack here, because they are currently very popular in my online bubble, but the same could be said about many other websites and platforms. I find myself wondering, if there were a filter mechanism for all sites that apply practices that are in the end hostile to my brain, would I actually be missing out? And even if that were the case, wouldn't I be better off anyway?
</p>

<time datetime="2023-09-01" title="That's 2023-09-01 for Non-Discordians">
Prickle-Prickle, the 25th day of Bureaucracy in the YOLD 3189
</time>]]></description><pubDate>Fri, 01 Sep 2023 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/weeknotes/2023/35/index.html</guid></item>
<item><title><![CDATA[Other people's code]]></title><description><![CDATA[<p>
Hillel Wayne wrote about <a href="https://buttondown.email/hillelwayne/archive/educational-codebases/">educational codebases</a>. I find the idea quite interesting, and have been trying to gather some further thoughts into an article, but while writing it, my doubts grew on how feasible the idea beyond a certain threshold of complexity really is. While Hillel demos the idea with small, but extensively commented scripts, I was looking for programs, that are still comprehensible for a single person, but tackle a larger problem/domain. You can find a few examples, especially for system software (operating systems and compilers), that are not for production but  not toy programs as well, that are either made for teaching purposes or would at least lend themself well for study. But my current hunch is that this genre will not see significant numbers, for two reasons: it is rather hard to make and there is less demand for an analytical approach of breaking an existing system down into pieces then for for bottom-up and cookbook style material.
</p>

<time datetime="2023-08-25" title="That's 2023-08-25 for Non-Discordians">
Boomtime, the 18th day of Bureaucracy in the YOLD 3189
</time>]]></description><pubDate>Fri, 25 Aug 2023 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/weeknotes/2023/34/index.html</guid></item>
<item><title><![CDATA[A bit of progress]]></title><description><![CDATA[<p>
There is this saying, that when you aren't embarrased by the first version of a software, you have shipped too late. I am not entirely convinced of its merit, but anyway, I put the repo of the <a href="https://github.com/fnh/intertwingle/">static site generator</a> I talked about before on github. Does the world really need another static site generator? Well, maybe the world doesn't, but I like to have a tool that is <a href="https://thesephist.com/posts/tools/">built around my workflows</a>.
</p>

<time datetime="2023-07-29" title="That's 2023-07-29 for Non-Discordians">
Setting Orange, the 64th day of Confusion in the YOLD 3189
</time>]]></description><pubDate>Sat, 29 Jul 2023 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/weeknotes/2023/30/index.html</guid></item>
<item><title><![CDATA[Technical problems with non-technical solutions]]></title><description><![CDATA[<p>
Sometimes engineers have a tendency to solve problems with people by solely technical measures. Everything to avoid an unpleasant conversation. Somebody directly pushed to trunk instead of going through a code process: let's revoke right to push for all devs (instead of talking about processes with a single person). Test coverage could be better? The cop-out solution is to make the build fail under a certain percentage. A prime example of Goodhart's law in action: mindlessly chasing numbers, because that is what you can do with tools. Somebody who doesn't really knows how or what to test just writes test cases without assertions. Essentially worthless, but statistics look good, pat ourself on the back for good coverage. Anything to avoid having to sit together and teach testing strategies.  
</p>

<p>
It is also somehow true on a greater scale of things. Currently Google is attacking the open web with a <a href="https://chromestatus.com/feature/5796524191121408">proposed API</a> that will serve to stifle browser competition and lock out users who don't like to be surveilled by ad-tech. And the best defense I can currently think of is also not technical, but regulatory politics (as this also constitutes a crass violation of GDPR). I know, they ditched "Don't be evil" as motto years ago, but it is astonishing how far they want to go to own your eyeballs in order to extract ad revenue.  
</p>

<time datetime="2023-07-21" title="That's 2023-07-21 for Non-Discordians">
Boomtime, the 56th day of Confusion in the YOLD 3189
</time>]]></description><pubDate>Fri, 21 Jul 2023 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/weeknotes/2023/29/index.html</guid></item>
<item><title><![CDATA[To-do or to-don't?]]></title><description><![CDATA[<p>
Weeks pass frighteningly fast. All the worse, when you don't feel that there's much to show for it. I had a bit time to hack on my static site generator, still I don't have reached feature parity with my messy scripts. Some time ago I wrote something about keeping a <a href="/articles/write-down-your-makers-bucket-list/">prioritized list of ideas</a> you want to work on. This week I stumbled over Greg Wilsons <a href="https://third-bit.com/ideas/">"To-Don't" list of ideas</a> he found generally interesting, but ultimately decided that he won't pursue. I've got the feeling this kind of anti-list is of equal, if not even more importance than a "to make"-bucketlist (anyway, mine is rather short currently: the ssg for my site, and a little UI overhaul of the <a href="/articles/2023-05-28-side-project-lessons/">minimalist bookmark manager</a> I wrote for myself).
</p>

<time datetime="2023-07-14" title="That's 2023-07-14 for Non-Discordians ">Today is Setting Orange, the 49th day of Confusion in the YOLD 3189</time>]]></description><pubDate>Fri, 14 Jul 2023 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/weeknotes/2023/28/index.html</guid></item>
<item><title><![CDATA[Rebooting]]></title><description><![CDATA[<p>
A little bit over a year ago, I published the <a href="/weeknotes/2022-07-01.html">last weeknote</a>. It was after a very rough week, which included a bursted pipe in the appartment and a biliary colic. After that week I had lost my momentum an published neither weeknotes, nor regular articles for the following six month.
</p>

<p>
So this is the reboot of the weeknotes. Maybe this time the streak will last more than six weeks. Chances aren't bad. My little daughter has adapted well to kindergarten, still for the next three month I'll work part-time only, so I may have a little more time to spare than otherwise.
</p>

<p>
Recently I dove into the topic of full-text search and information retrieval. I've toyed around with lunr. For a small codebase (around 1800 SLOC) lunr has a good deal of great ideas in it. I've written about how I gauged the code on a high-level, but if time permits, I'd also like to do some deeper dives into the datastructures and algorithms that are used.
</p>

<p>
Also I'm currently making a static site generator custom to my needs as a replacement for the messy scripts that I currently use to build this site. The sad state of that rewrite is, well, a text-book example of the <a href="/articles/second-system-effect-excerpts/">Second System Effect</a>. So, with that, I'll use the rest of my free time today to try to get it to feature parity with my messy (but working...) scripts. 
</p>

<time datetime="2023-07-07" title="That's 2023-07-07 for Non-Discordians ">Augusta Treverorum, on Pungenday, the 42nd day of Confusion in the YOLD 3189</time>]]></description><pubDate>Fri, 07 Jul 2023 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/weeknotes/2023/27/index.html</guid></item>
<item><title><![CDATA[Gauging code complexity by visualizing SLOC metrics]]></title><description><![CDATA[<p>
I recently experimented a bit with <a href="https://lunrjs.com">lunr.js</a>, because I wanted to learn a bit about information retrieval techniques, by trying to read the codebase in depth. The library itself is comparatively small, since it doesn't aim to be everything to everyone, but still it delivers a complete feature set, which is more than a mere toy program, which makes it a great study object in my books.
</p>



<p>
What I like to do, in order to get a high-level overview and an idea on which parts I should focus, is to look at the SLOC (source lines of code) metrics. Now, this metric has a bit of a bad reputation, which stems from the days when it was used by the wrong people for the wrong reason (an in: by managers to measure developer productivity). I don't want to waste too much effort on elaborating why this is a bad idea, just so much: that is a textbook example of <a href="https://en.wikipedia.org/wiki/Goodhart%27s_law">Goodhart's law</a> in action.
</p>

<p>
Anyway, SLOC is easy to understand, quick to gather, agnostic of programming language, and a pretty good proxy for complexity. There is even <a href="https://www.scirp.org/pdf/JSEA20090300001_74742661.pdf">research</a> that suggests, that SLOC and the more complicated to measure <a href="https://en.wikipedia.org/wiki/Cyclomatic_complexity">Cyclomatic_complexity</a> metrics, actually <q>measure the same property</q>.
</p>

<p>
There are several tools available to do the actual counting. I like Al Danial's <a href="https://github.com/AlDanial/cloc">cloc</a> because it has a lot of options and output formats available. Curtis Gagliardi's <a href="https://github.com/cgag/loc/">loc</a> claims to be two orders of magnitude faster than cloc, but on small to mid-sized repositories, the execution speed is not really a limiting factor, the missing JSON output option on the other hand is, .
</p>

<p>
Having said that, the output of running cloc on lunr is the following: 
</p>

<pre>-------------------------------------------------------------------------
File                                  blank        comment           code
-------------------------------------------------------------------------
./token_set.js                           57            146            212
./query_parser.js                        49              0            206
./index.js                               56            239            197
./stemmer.js                             27             25            171
./builder.js                             45            153            162
./query_lexer.js                         38             18            153
./stop_word_filter.js                     4             30            131
./pipeline.js                            33            139             95
./vector.js                              26             76             94
./set.js                                 22             42             69
./match_data.js                          16             33             58
./query.js                               21            111             56
./token_set_builder.js                   15              2             52
./utils.js                               10             44             38
./tokenizer.js                           11             29             36
./field_ref.js                            7              0             21
./token.js                                4             39             15
./lunr.js                                 4             31             14
./idf.js                                  4              8              9
./query_parse_error.js                    1              0              7
./trimmer.js                              2             19              6
-------------------------------------------------------------------------
SUM:                                    452           1184           1802
-------------------------------------------------------------------------
</pre>

<p>
But as a wall of text and numbers is not the most intiutive representation, I exported the cloc result to json (<code>cloc . --by-file --json</code>) and adapted the <a href="https://d3-graph-gallery.com/graph/circularpacking_template.html">template for circular packing</a> from the D3.js Graph Gallery to plot the output of cloc. Also, I did a second plot, where SLOC are adjusted by a factor determined of how heavily the code is commented (with the reasoning that a lot of comment indicate complex logic). The output looks like this:
</p>

<div style="display: flex">
  <div id="loc" style="border-right: 1px solid"></div>
  <div id="locAdjusted"></div>
</div>
<div id="tt" style="height:1rem"></div>

<noscript>
<div style="display: flex">
  <div style="border-right: 1px solid">
    <img src="/articles/2023/07/03/visualize-complexity-sloc-d3/sloc.png">
  </div>
  <div>
    <img src="/articles/2023/07/03/visualize-complexity-sloc-d3/sloc-adjusted.png">
  </div>
</div>
</noscript>

<p>
Keep in mind, the intention of it was to be a quick gauge of a small code base. Which means it is not too economical to play with visualization features too much. One can see that the core data structures (drawn in red, especially index and token set) account for over 20% of the code base, but also the query language (in light green), which actually is a mere convenience feature and would actually be omittable, make up a similar portion. Also notably, the stemmer, which is a crucial module to actually build the index, is a inlined third-party implementation of <a href="https://tartarus.org/martin/PorterStemmer/">Martin Porters stemming algorithm</a>. In the second visualization this gets dialed down in size a lot, because the implementation does not make much use of comments, although it is very dense, full of regexes and short variable names.
</p>

<p>
But the fact that a map mustn't be confused with the territory doesn't render maps useless.
</p>

<time datetime="2023-07-03">2023-07-03</time>]]></description><pubDate>Mon, 03 Jul 2023 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/2023/07/03/visualize-complexity-sloc-d3/index.html</guid></item>
<item><title><![CDATA[A Great Books curriculum for Software Engineering?]]></title><description><![CDATA[<time datetime="2023-06-27"></time>



<p>
Something that I regularly think about, almost everytime I select something to read through for furthering my knowledge in my field, is if there is something like a canonical set of reading material. 
</p>
<p>
On the other side of the Atlantic ocean there is a concept of a liberal arts education that is called <a href="https://en.wikipedia.org/wiki/Classic_book#University_programs">Great books program</a>, a four year college degree that solely consists of studying a canon of Western philosophy and literature, without a major though of its immediate utilitarian value.   
</p>
<p>
As much as I find this notion of education to be romantic, I won't suggest that it would be a blue print for a technical discipline like software engineering, if only one would come up with the right set of text books and papers as canon. But I think it would be helpful, especially for those who are not at the beginning of their career anymore and outside of a formal degree program, to have some structured guidance, to maximize the value you get out of the time invested. The higher the delta to your current knowledge the better, or with the words of Alan Kay: <q>Perspective is worth 80 IQ points</q>.
</p>

<p>
When I searched for reading lists and comprehensive bibliographies, I stumbled over a list of <a href="https://kilthub.cmu.edu/articles/journal_contribution/Seminal_Papers_in_Software_Engineering_The_Carnegie_Mellon_Canonical_Collection/6625733">Seminal Papers in Software Engineering</a> published by members of the faculty of CMU. In the introduction they write: <q>To understand the context of current research, it is essential to understand how current results evolved from early fundamental papers. These classic papers develop timeless ideas that transcend technology changes, and the ideas embodied in their solutions often apply to current problems</q>. Of course, you have to keep in mind that this list was compiled in the context of post-graduate education and is a means to an end (informing the original research the students are supposed to do), which imposses a limit in size. 
</p>

<p>
Imagine somebody who does not want to go down the PhD path and has already written a fair portion of software. Which techniques and ideas should such a person study? What material would sustain the remaining 20 to 35 years of their working live in software the most? I suppose the "Great Ideas in Software Engineering" would not only comprise of books and academic papers, but also certain code bases, blog posts and probably even recordings of talks. It would inherently have to find a balance between practical and idealistic aspects.
</p>

<p>
As I didn't manage to find a compilation of material that goes into that direction, I am still not sure how much merit the idea of such a curriculum does have, yet I also cannot get rid of the feeling, that many great ideas are already out there, burried under a lot of noise, waiting to be (re-)discovered.
</p>]]></description><pubDate>Tue, 27 Jun 2023 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/2023/06/27/se-great-books-curriculum/index.html</guid></item>
<item><title><![CDATA[Preserving the web is an unsolved problem]]></title><description><![CDATA[<time datetime="2023-06-15"></time>



<p>
No website is guaranteed to exist for ever, not even for a timespan that significantly outlives its original author. Keeping one up and running is, although very cheap, not entirely free. But even loss-leader offerings like github pages or the aws free tier are payed for by somebody. And that somebody might stop doing so for many reasons. 
</p>

<p>
The web is a young medium, yet in the three decades an incredible amount of content has been created and discussed on it. Some of which had deep and lasting impact. Yet, there is a high risk that a lot of what was going in and on the open web is vanishing at an alarming rate without a trace from our colletive intellectual and cultural history. 
</p>

<p>
Take for example <a href="https://en.wikipedia.org/wiki/Ward_Cunningham">Ward Cunningham</a>, the inventor of Wiki (both the concept and its first implementation). The <a href="https://wiki.c2.com">WikiWikiWeb/C2 Wiki</a> was frozen in 2015. Its content is in read-only mode ever since. Since then Ward is remodelling its software basis, but in <a href="https://github.com/WardCunningham/remodeling/issues/51#issuecomment-832759167">an issue on github</a> he wrote: 
</p>

<blockquote>
<p>Perhaps I should explain why wiki worked.</p>
<p>
I wrote a program in a weekend and then spent two hours a day for the next five years curating the content it held. For another five years a collection of people did the same work with love for what was there. But that was the end. A third cohort of curators did not appear. Content suffered. I had visualizations. I could see it decay. That is what I mean when I say that the those of good will have passed. A security engineer has compared the open internet to the summer of love. It was neat while it was happening but it is over.
</p>
</blockquote>

<p>
I find this stance disheartening, albeit understandable. And the c2 wiki is at least still readable. But for how long will that remain so? 
</p>

<p>
There are many, too many examples of content becoming inaccessible or even destroyed on a whim. The highest risk bears everything that is hosted by commercial entities for "free": think for example of Yahoo killing Geocities. This free (as in beer) is penny-wise and pound-foolish. Single copies are single points of failure and hopeing somebody will keep the lights on is not a viable backup stragegy.
</p>

<p>
Speaking of backups: One of the very few organization that tackles the problem of preserving the web is the <a href="https://archive.org">Internet Archive</a>. Sadly, it recently <a href="https://www.npr.org/2023/03/26/1166101459/internet-archive-lawsuit-books-library-publishers">lost a lawsuit against big publishers</a>, which has the potential to completely destroy it financially. And it appears that there is no meta-backup strategy in place.
</p>

<p>
What can an invidual do? Those who create websites might want to consider to follow Jeff Huangs approach and <a href="https://jeffhuang.com/designed_to_last/">design their websites to last</a>. Probably another good idea would be to explicitely use a license <a href="https://creativecommons.org/share-your-work/public-domain/freeworks/">for free cultural works</a> to allow content to be mirrored without legal headaches.
</p>

<p>
As much as I'd like to end on a high note, it is obvious that such issues cannot be tackled by an invidiual or small idealistic non-profit groups and the economic incentives are not in the favor of an open web.
</p>]]></description><pubDate>Thu, 15 Jun 2023 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/2023/06/15/preserving-the-web/index.html</guid></item>
<item><title><![CDATA[Writing frequency and publishing cadence]]></title><description><![CDATA[<time datetime="2023-06-13"></time>


<p>
Since I started my website, I published 38 posts (this one not included), which means on average a little more than once a month, but my publishing cadence is far from being that regular. In some months I managed to put out something on a <a href="/weeknotes/">weekly basis</a>, but I've also had dry spells that lasted for several months. All the while I wrote notes privately on a more or less daily basis. This makes me wonder what causes my disconnect between the frequency of writing and publishing.
</p>

<p>
At the end of the first year of this website I tried - without success - to publish daily for a month. Derek Sivers, did a similar experiment with much better success has <a href="https://sive.rs/nod">written a retrospective</a> on his experience. He says he the he disliked the daily publishing cadence, because it made his writing worse and with it he broke a principle, that anything he posts is really worth the time of his readers.
</p>

<p>
On the other hand, there are people who consistently publish on a daily basis over many years and sometimes even decades. Seth Godin is one of them. He writes:
</p>
<blockquote>
<p>
For years, I’ve been explaining to people that daily blogging is an extraordinarily useful habit. Even if no one reads your blog, the act of writing it is clarifying, motivating and (eventually) fun. [..]
</p>
<p>
What I’ve found is this–after people get to posting #200 or beyond, they uniformly report that they’re glad they did it.
</p>
- <cite> <a href="https://seths.blog/2018/10/the-first-1000-are-the-most-difficult/">The first 1,000 are the most difficult</a></cite>
</blockquote>

<p>
On the question what constitues an appropriate blog post, Mike Crittenden, who also <a href="https://critter.blog/2021/12/09/how-to-write-a-blog-post-every-day/">publishes on a daily basis</a>, argues that <a href="https://critter.blog/2021/01/06/atomic-blog-posts/">atomic blog posts</a> are fine. He also says: <q><a href="https://critter.blog/2022/06/22/normalize-the-crappy-short-blog-post/ ">There’s space for the crappy short blog post. It’s the crappy long blog post that shouldn’t exist.</a></q>
</p>

<p>
Another person who makes the case for smaller blog posts is is Matt Gemmell. He thinks that the rise of social media had detrimental effects on the psychology of bloggers:
</p>
<blockquote>
<p>
On social, content of any length at all is fine [..]. So, perniciously, our eager-to-simplify brains have decided that the converse is true for blogs: you can write only longer, weightier stuff. The sole possible outcome of this is the one I see all the time, which is that people are reluctant to start blogs because they think they don’t have enough to say. Those who do blog will often sit on pieces for too long, because they’re waiting until they have more to say — or they shelve pieces entirely, wrongly believing they’re too brief and thus somehow trivial.
</p>
<p>
Collectively, this is all a surrendering of creative output to the whims of external platforms, and is antithetical to what makes the web so useful and potent. 
</p>
- <cite><a href="https://mattgemmell.scot/write-less/">Write less</a></cite>
</blockquote>
<p>

</p><p>
Michael Nielsen in his article <a href="https://michaelnotebook.com/wn/website_enhance.html">on his motivations for publishing his thoughts</a>, states that his goal is to enhance his abilities to think and create. He says that he thinks better when the stakes are higher and that <q>one of the best ways of raising the stakes is to make a document into something you're sharing with people whose good opinion you desire</q>. 
</p>

<p>
Reflecting on my personal approach, I think my reluctance to publish more often has to do with an internal belief system that holds quality as more important than quantity. But I am coming to think that this might be a false dichotomy. To get to quality one needs to practice. Public writing seems for me to be in a different category than private notetaking. So to get to quality there is no substitute for publishing. I don't intend to force a daily cadence, but I probably will try to take Matt Gemmells advice to <q>[w]rite less, and be at peace with it.</q>, and to do so more often. 
</p>]]></description><pubDate>Tue, 13 Jun 2023 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/2023/06/13/writing-frequency/index.html</guid></item>
<item><title><![CDATA[Some lessons from a side project]]></title><description><![CDATA[<time datetime="2023-05-28" data-first-published=""></time>


<p>
Last year one evening my whole family was asleep unusually early. On contrast, I was not particularly tired, which is equally unusual. I used the time that I unexpectedly had at my disposal to write a tiny web app for managing my bookmarks.
</p>

<p>
Initially my goal for this article was to describe the app and its making on both a technical and non-technical level, but I got a bit lost in discussing and justifying technical minutiae, which aren't that essential. What follows is an attempt to describe the psychology of writing a simple, yet useful system in a very limited amount of time.
</p>

<h2>An itch to scratch</h2>

<p>
I regularly jump between multiple browsers on several physical and virtual machines, and I bookmark quite a lot. And if it weren't for the further, I'd be happy with the browser built-in bookmarks. I never really found a solution for keeping bookmarks in sync that suited my taste. Still, my requirements are simple. I just want a single place where I can reach all of my bookmarks, and a way to add a link with a single click.
</p>

<p>
Certainly, bookmarking-as-a-web-app has been tackled many times over. I could have taken the sane persons' approach and just subscribe to some SaaS, or I could have searched for some open source solution that to host for myself. But then again, I'm a programmer, and it seems this comes with a déformation professionelle that got the better of me. I like to call it inverse vandalism (when vandalism is destroying things just because one can, then inverse vandalism is making things because one can). Those who want to take a look at the code first can do that <a href="/code/minbox/index.js">here</a>.
</p>

<h2>A few foolish assumptions</h2>

<p>
Feeling the compulsion to open the IDE and start hacking is the one thing, but there is one very hard limitation: having a chunk of uninterrupted time with good attention span available. Most of that is sold to my employer already. So when I have a good timeslot, in order to get something into a working state, its complexity must be rigorously limited. To keep the program as small as possible and overcoming the the hardest limit of all, the available tiem, deciding what is out of scope is probably more important than programming the actual features. And define a certain class of problems out of existence is a remarkable productivity boost. 
</p>

<p>
Many, if not all, of the assumptions I took are unthinkable in a commercial setting. Yet they turned out to be liberating in this little project. The most fundamental was, that I wanted to create a system, which is intended for me alone to use. This freed me from a whole lot of yak-shaving. Assuming a single user means I don't even need to explicitly model it out. It made it easy to estimate how much (or rather how little) memory my data will consume, and as a second order effect, suddenly the filesystem is justifiable as a good enough storage mechanism. 
</p>

<p>
So what remains to have a most rudimentary bookmark manager? A mechanism to add a url, to delete it again and to render the collection of all links. All of which is accomplished by a single node.js based script which reads in a file of all bookmarks into memory and provides three endpoints. One to render all bookmarks in a single page, one to add another bookmark to the file and one to delete a single bookmark. The endpoint to add a new link is meant to be called via a <a href="https://en.wikipedia.org/wiki/Bookmarklet">bookmarklet</a>.
</p>

<p></p>
From a deployment point of view, I went with what I already had in place: the nginx which serves this website, configured as a reverse proxy with <a href="https://en.wikipedia.org/wiki/Basic_access_authentication">Basic access authentication</a>. Against a certain industry adage, I treat my server more like a pet, and not like cattle. I generally don't administer a system at the time that I want to use it, which makes downtime a non-issue.
<p></p>

<p>
Of course, a system based on those assumptions is tautologically not able to scale. But the alternatives would not have potentially scalable software vs. the scrappy single-user system. It was either something I could do in a single good session, or not creating something at all.
</p>

<h2 id="learnings">Lessons learned</h2>

<p>
Hillel Wayne dedicated an issue of his fantastic Computer Things newsletter to the question <a href="https://buttondown.email/hillelwayne/archive/how-much-can-you-code/">What can you code up in an hour?</a>. He writes <q>Fast programming is a distinct skill from software engineering. Software engineering principles don’t totally map over.</q> - and this matches quite a bit with what I learned from writing this little script (and running it without major maintainance ever since).
</p>

<p>
Don't hesitate to rigorously limit scope. Make an art form out of cutting corners. Minimize the number of moving parts. YAGNI, really.
</p>

<p>
If the project is not an exercise for the sake of learning a new technology, use familiar tools. The standard library is your friend. 
</p>

<p>
Most best practices are trade-offs, which, if a certain time/complexity threshold is not reached, might not pay off.
</p>

<p>
Data &gt; API &gt; UI. If I ever wanted to evolve what I have, the only thing I would definitively want to keep are the over 1000 bookmarks I've collected.
</p>

<p>
Learn to recognise chunks of good time as they come and grasp them firmly. You don't need anybodys permission to experience the joy that comes in creating something for yourself. Just keep in mind, when project time collides with in-person time with your most important people, that the <a href="https://waitbutwhy.com/2015/12/the-tail-end.html">tail end</a> comes faster than you realize.
</p>]]></description><pubDate>Sun, 28 May 2023 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/2023-05-28-side-project-lessons/index.html</guid></item>
<item><title><![CDATA[How to calculate the contrast ratio of two colors]]></title><description><![CDATA[<p>
Picking colors for elements on a website is not merely an aesthetic detail, it also matters for accessibility. After I <a href="/articles/2023-04-29-dark-mode/">introduced a dark mode</a> for the website, <a href="https://chaoticenginerd.com/">Tosh</a> kindly provided feedback with regard to the color choices I made, or as in this case more importantly did not make.
</p>
<p>
In light mode, I go with the user-agent styles for the links, and there the contrast ratio is fine, but the same choice in dark mode, was under the level of what the <a href="https://www.w3.org/TR/WCAG/">W3C Web content accesibility guidelines</a> recommend. 
</p>
<p>
My go-to resource for figuring out the right colors with regard to the WCAG is the <a href="https://webaim.org/resources/contrastchecker/">WebAIM contrast checker</a>.
</p>
<p>
What up until now I haven't understood was how these figures are actually calculated. And it is actually all laid out in pseudocode in the WCAG recommendation. But since it is spread out, I decided to write it up for my personal reference.
</p>
<p>
So, the spec defines the <a href="https://www.w3.org/TR/WCAG/#dfn-contrast-ratio">constrast ratio</a> as 
</p><blockquote>
(L1 + 0.05) / (L2 + 0.05), where L1 is the relative luminance of the lighter of the colors, and L2 is the relative luminance of the darker of the colors. 
</blockquote>
Which leads to two more questions: What is the relative luminance and how do you know which color is the lighter one?
<p></p>
<p>
To answer the latter: the lighter color is the one with the higher relative luminance. And to answer the former, I quote the <a href="https://www.w3.org/TR/WCAG/#dfn-relative-luminance">definition</a> from the WACG again: The relative luminance is <q>the relative brightness of any point in a colorspace, normalized to 0 for darkest black and 1 for lightest white.</q>
</p>
<p>
But how do I get to this number between 0 and 1? Well, by simply reading on in the spec. There is some some pseudo code, which is easily translatable to Javascript (which I'm doing here in form of a <a href="https://www.colbyrussell.com/LP/debut/">literate program</a> again): 
</p>

<script>
/*
    For the sRGB colorspace, the relative luminance of a color is defined as 
    L = 0.2126 * R + 0.7152 * G + 0.0722 * B where R, G and B are defined as:

        if RsRGB <= 0.03928 then R = RsRGB/12.92 else R = ((RsRGB+0.055)/1.055) ^ 2.4
        if GsRGB <= 0.03928 then G = GsRGB/12.92 else G = ((GsRGB+0.055)/1.055) ^ 2.4
        if BsRGB <= 0.03928 then B = BsRGB/12.92 else B = ((BsRGB+0.055)/1.055) ^ 2.4

    and RsRGB, GsRGB, and BsRGB are defined as:

        RsRGB = R8bit/255
        GsRGB = G8bit/255
        BsRGB = B8bit/255
*/

let Color_sRGB = (Value8bit) => Value8bit / 255;

let N = (v) => {
    const val = Color_sRGB(v);
    return (val <= 0.03928) ? val / 12.92 : (((val + 0.055) / 1.055) ** 2.4);
}

function relativeLuminance({r, g, b}) {
    return 0.2126 * N(r) + 0.7152 * N(g) + 0.0722 * N(b);
}
</script>
<p>
Now, the contrast ratio is easy to implement:
</p>
<script>
function contrastRatio(firstColor, secondColor) {
    let luminance1 = relativeLuminance(firstColor);
    let luminance2 = relativeLuminance(secondColor);

    // L1 is the relative luminance of the lighter of the colors
    // the lighter color has the higher relative luminance, so:
    let L1 = Math.max(luminance1, luminance2); 
    let L2 = Math.min(luminance1, luminance2);

    return (L1 + 0.05) / (L2 + 0.05);
}
</script>
<p>
An input type color will return a string in the form "#RRGGBB". To use this as an input for the color parameters of the contrastRatio function I need another utility function.
</p>
<script>
    function hexToRGB(hexColor) {
        let r = parseInt(hexColor.slice(1, 3), 16);
        let g = parseInt(hexColor.slice(3, 5), 16);
        let b = parseInt(hexColor.slice(5, 7), 16);
        return {r, g, b};
    }
</script>

<p>
So now I can drop in two color pickers: <input type="color" id="c1" value="#F8F8FF">
<input type="color" id="c2" value="#0000EE"> and to cobble everything together:
</p>

<script>
function calculateContrastRatio() {
    let output = document.getElementById("contrastRatioOutput");
    let color1 = document.getElementById("c1");
    let color2 = document.getElementById("c2");

    output.value =
        contrastRatio(hexToRGB(color1.value), hexToRGB(color2.value));
}

document.getElementById("c1").addEventListener("change", calculateContrastRatio);

document.getElementById("c2").addEventListener("change", calculateContrastRatio);
</script>

<p>
The contrast ratio of the chosen colors is <output id="contrastRatioOutput"> : 1
</output></p>

<script>
calculateContrastRatio(); // to initialize the document properly
</script>

<p>
Coming back to the starting point, color contrast is only one aspect with regard to what affordances links should provide, but that is a topic for a different blog post.
</p>

<time datetime="2023-05-04">2023-05-04</time>]]></description><pubDate>Thu, 04 May 2023 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/calculate-contrast-ratio/index.html</guid></item>
<item><title><![CDATA[Adding dark mode]]></title><description><![CDATA[<p>
At the risk of losing a lot of nerd cred: I, by and large, prefer light mode. But I'm not dogmatic about it.
</p>

<p>
Media queries make it very easy to detect the readers preference and CSS custom properties help keeping the rest of the styling clean and non-repetitive. So I thought it would be a right neighbourly thing to add the following:
</p>

<style>
@media (prefers-color-scheme: dark) {
  :root {
    --main-bg-color: black;
    --main-text-color: #999;
    --article-bg-color: black;
    --article-code-bg-color: #888;
    --article-code-text-color: #F5F3F3;
  }
}
</style>

<p>
It looks plausible to me, but visual design isn't my strongest suit. So if someone, who prefers dark mode, has thoughts on it, I'd be thrilled to <a href="/contact.html">hear from you</a>.
</p>

<time datetime="2023-04-29">2023-04-29</time>]]></description><pubDate>Sat, 29 Apr 2023 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/2023-04-29-dark-mode/index.html</guid></item>
<item><title><![CDATA[An easteregg - literate programming style]]></title><description><![CDATA[<p>
As often, I am somewhat late to the party, but on the other hand, maybe you are one of <a href="https://xkcd.com/1053/">today's lucky ten-thousand</a>...
</p>

<p>
So, did you know, that when you type the words <q>do a barrel roll</q> (without quotation marks) into Google's search field, the page with the results does as you bid, and turns over 360 degrees.
</p>

<p>
The implementation of this behavior can be achieved by adding a little style to the body, for example the following class:
</p>

<style>
  .somersault { 
    transform: rotate(1turn); 
    transition: 2s; 
  }
</style>

<p>
If you want to try it out on this very website, you can use this input field.
</p>

<p>
<input style="width: 100%" placeholder="Ask me to do a somersault">
</p>

<p>
The necessary logic to apply the styles is provided by this script:
</p>

<script>
    let inputElement = document.getElementsByTagName("input").item(0);

    inputElement.addEventListener("input", (element) => {
        let text = element.target.value;

        if (text === "do a somersault") {
            document.body.classList.add("somersault");
            setTimeout(() => {
                document.body.classList.remove("somersault")
            }, 2000);
        }
    });
</script>

<p>
Now, these little snippets of CSS and Javascript are not the whole point of this article. More interesting is, in my eyes at least, that what you just read is a <a href="https://en.wikipedia.org/wiki/Literate_programming">literate program</a>.
</p> 

<p>
The code you read is not only a mere nicely formatted textual representation, but <strong>is</strong> the actual HTML style and script elements that control the rendering and behaviour of this website in your browser. This is achieved, by and large, by making the the script and style elements block-level elements, which makes their content visible. The tags themselves are rendered as content of the :before and :after pseudo selectors.
</p>

<p>
I've <strike>stolen</strike> adapted the styles from <a href="https://www.colbyrussell.com/LP/debut/">Colby Russell</a>, who created and documented a whole <a href="https://crussell.ichi.city/pager.app.htm">static site generator</a> in this programming style. 
</p>

<style>
    body script,
    body style {
      display: block;
      font-family: monospace;
      white-space: pre;
      background-color: #DDD;
    }

    body script::before,
    body script::after,
    body style::before,
    body style::after {
      font-family: monospace;
      color: #888;
    }

    body script::before {
      margin-bottom: -1em;
      content: '\3Cscript\3E\0A';
    }

    body script::after {
      content: '\0A\3C/script\3E';
    }

    body style::before {
      margin-bottom: -1em;
      content: '\3Cstyle\3E\0A';
    }

    body style::after {
      content: '\0A\3C/style\3E';
    }
</style>

<p>
Another nerdy application of this idea is the <a href="https://secretgeek.github.io/html_wysiwyg/html.html">naked, brutalist HTML quine</a> by <a href="https://secretgeek.net/">Leon Bambrick</a>. 
</p>
<time datetime="2023-04-27">2023-04-27</time>]]></description><pubDate>Thu, 27 Apr 2023 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/easteregg-lp-style/index.html</guid></item>
<item><title><![CDATA[In defense of internal links]]></title><description><![CDATA[<p>
Manuel has expressed some <a href="https://manuelmoreale.com/i-hate-internal-linking">strong objections against internal links</a>. While I indeed think, that Manuel is right with his call to <q>link to other websites as much as you can because that's the best way to help other people discover great content.</q> and can relate to the the overall sentiment of the post, I think condemning internal linking is a bit throwing out the baby with the bathwater.
</p>

<hr>
<p>
<em>Update after first version</em>: Manuel gave me some clarifying feedback via mail, and stated that he in fact the doesn't consider all internal linking as bad. My misunderstanding originates in my interpretation of his statement, that <q>You should only use the first type when strictly necessary</q> - which I overinterpreted as referring to something like standard navigation elements. I'll keep the rest of my reply unchanged, as I want to elaborate on the usefulness of (pontentially dense) internal linking as a design concept beyond commercial aspects. 
</p>
<hr>

<p>
Manuel identifies <q>the world of marketing, search engine optimisations, and analytics</q> as driving force of internal linking. And that might indeed be one reason. As I do not waste any time with SEO, never had analytics in place and don't plan to, I don't market anything to anyone, for I don't want to sell anything to anybody, I don't know too much about such techniques, maybe excessive internal linking in fact is a symptom of these all motives.
</p>

<p>
While I don't share these motives, I still purposefully link my former writing. I do so out of a different, and - as I hope to convince my esteemed readers - legitimate reason.
</p>

<p>
See, most of my writing starts in my private <a href="https://tiddlywiki.com/">Tiddlywiki</a> instance. Wikis as a writing medium are terrific. I've used more than half a dozen wiki softwares in my life. From the top of my head: MediaWiki, <a href="https://www.pmwiki.org/">PmWiki</a>, <a href="https://zim-wiki.org/">Zim</a>, Githubs built-in Wiki, Redmine, and - tell me you are an enterprise application developer without telling me that you are an enterprise application developer - of course Confluence and Sharepoint. What any wiki software worth using makes trivially easy by design is internal linking. In a wiki there is on a philosophical level never such a thing as a dead internal link, only a page of which gently prompts you to write its first version. 
</p>
<p>
Now, even though my website is only the subset I feel comfortable to share publically, I do like to keep the internal connections wherever it is possible. These internal connections help me to see patterns over time. 
</p>

<p>
<a href="https://michaelnielsen.org/">Michael Nielsen</a> has published some notes on <a href="https://michaelnotebook.com/wn/website_enhance.html">how to use a personal website to enhance your ability to think and create</a>, which is kind of a manifesto for his site. Here are some excerpts of this note that resonated very strongly with me (emphasis mine):

</p><blockquote>
<p>
The purpose of the site is to help me think well. This purpose is in opposition to many widely-used norms in online writing. 
</p>
<p>[..]</p>
<p>
Depth over engagement and audience-building. 
</p>
<p>[..]</p>
<p>
With this site I can design an interface that better supports my work. For one thing: the site <strong>navigation and organization should help me generate new ideas, and help me see the structure in my work. This site is an interface to my past thinking and possible future creative work.</strong> This means the organization and design of the site are first-class objects. As my understanding changes, so too will the organization, since the organization expresses that understanding. Thus, I should expect to reorganize and consolidate notes often. Both are a type of meaning-making.
</p>
</blockquote>

<p>
So, yes, I admit that my internal links have a self-serving motive, as they enhance my capabilitiy and my thinking. But that is certainly not at the expense of the rest of the world. I still very much desire to help where I can to amplify the good parts of the web. For all <a href="https://en.wikipedia.org/wiki/Dead_Internet_theory">cynical and defeatist takes</a> aside, there is still a lot of that out there. 
</p>
<p>
So that aim in mind, I've decided to treat internal and external links from now on a bit differently regarding their affordances. Internal links, that aren't part of the main navigation, will look just like the standard text and only reveal them as links when someone hovers over them, while all external links will always look like a proper link (I haven't yet figured how I will handle it on the RSS feed though, maybe in the HN endnotes style of linking?). As I consequently use relative links for everything internal, it was quite easy to achieve with a few additional styles:
</p>

<code>
<pre><intertwingle plugin="syntax-highlighting" language="css">
article &gt; * &gt; a:not([href^="http"]) {
    color: #555;
    text-decoration: none;
}

article &gt; * &gt; a:not([href^="http"]):hover {
    text-decoration: underline;
}
</intertwingle>
</pre>
</code>

<p>
And since I am on the topic of linking. In the <a href="/articles/hal-abelson-on-bduf/">previous article</a> I forgot the hat tip to <a href="https://www.curiositry.com">Curiositry</a>, who shared a tip <a href="https://autodidacts.io/link-to-segment-of-youtube-video-with-set-stop-time-using-end-url-query-parameter/">how to link to a segment of a youtube video both with a start and end time</a>. I long thought that youtube had removed that feature. As turns out, only in the standard viewer, but not in embedded mode. I hope no product manager on the other side of the big pond reads this, for such a useful feature will then likely be <a href="https://killedbygoogle.com/">killed</a> before the end of the year, which would be a pity.
</p>

<time datetime="2023-04-21">2023-04-21</time>]]></description><pubDate>Fri, 21 Apr 2023 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/in-defense-of-internal-links/index.html</guid></item>
<item><title><![CDATA[Hal Abelson on Big Design Up Front]]></title><description><![CDATA[<p>
In one lecture of <a href="https://ocw.mit.edu/courses/6-001-structure-and-interpretation-of-computer-programs-spring-2005/video_galleries/video-lectures/">Structure and Interpretation of Computer Programs</a> course, a student asked <a href="http://groups.csail.mit.edu/mac/users/hal/hal.html">Hal Abelson</a> how the technique of deferred decision making through abstraction he taught relates to <q>the axiom of 'do all your design before any of your code'</q>.
</p>

<p>
Given that Big Design Up Front and the Waterfall process were prevalent notions in introductory courses on software development for a long time - to some extent, they were still present in lectures I took during my studies, over two decades after this recording - that was a great question. I just love the answer that Hal Abelson gave:
</p>

<blockquote>
I bet that's the axiom of someone who hasn't implemented very large computer systems. [...]
<em><a href="https://www.youtube.com/embed/DrFkf-T-6Co?start=2291&amp;end=2299">In general, I think people who really believe that you design everything before you implement it, basically are people who haven't designed very many things.</a></em>
</blockquote>

<p>
But what may be a fallacy to most of those who actually write software - Uwe Friedrichsen elaborated on it very clearly in his article <a href="https://www.ufried.com/blog/industrialization_fallacy/">The Industrialization of IT fallacy</a> - is still something that I see actively pursued and pushed by a certain type of executives. Of course, it's the 21st century and its a SaFE bet that we are all more or LeSS agile. But if you are looking for today's waterfall - apart from terrible puns on waterfall-like processes in the previous sentence - you often just have to take a look at the org-chart. Those who paid attention to <a href="https://www.melconway.com/research/committees.html">Mel Conway's observations on system design from 1968</a> know, that organizational design influences the shape of the software that gets build. 
</p>

<time datetime="2023-04-20">2023-04-20</time>]]></description><pubDate>Thu, 20 Apr 2023 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/hal-abelson-on-bduf/index.html</guid></item>
<item><title><![CDATA[Introducing a blogroll]]></title><description><![CDATA[<p>
I've just added a <a href="/blogroll/">blogroll</a> to my website. I've postponed this task for so long, because - as often - of  my time budget didn't fit my ambition. I wanted to comment every entry,  pick out my favorite article(s) for each site, find proper categories, and offer it alternatively as OPML file to be imported into a feedreader.
</p>

<p>
I did nothing like that (yet), just another site with a little over a dozend links, in no particular order, to mostly personal blogs and websites, which I read and of which think other people might like them as well. But at least, now something exists, to which I can <a href="/articles/on-digital-gardening/">tend to, when the time budget permits</a>. 
</p>

<time datetime="2023-04-16">2023-04-16</time>]]></description><pubDate>Sun, 16 Apr 2023 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/2023-04-16-blogroll/index.html</guid></item>
<item><title><![CDATA[An old book and today's web]]></title><description><![CDATA[<p>
In a recent email conversation with <a href="https://manuelmoreale.com/">Manuel</a>, I mentioned this artifact from my youth:
</p>
<img src="/articles/2023-04-12-an-old-book-and-todays-web/10000+urls-web.jpg" alt="A book from the year 2000 containing over than 10000 german URLs">
<p>
This book was was edited, printed and marketed by a reputable German publishing house and bought by my mother in 2000. Neither production, nor purchase involved any kind of irony or hipster humor. And more than that tells something about some generational viewpoints and tendencies, it tells a story about a web that felt and was different than today's web: The dot-com bubble had not burst at that point in time. Neither was  Wikipedia founded, nor had Google yet become an eponym for search. Search results were incomplete and lacking. Finding information was far from feeling like a solved problem. 
</p>
<p>
Fast forward only a few years and everything had changed. Search quality improved to a point, that I started to form the assumption that I won't ever need bookmarks anymore, for I will be able to retrieve any information I want with a simple query. Just, that wasn't quite the end of history. Today both retrieval and content discovery seem to be problems that are look for a new solution. For the open flank, in the light of the stellar rise of capabilities and general availability of Large Language Models and the perverse incentives of SEO, is trust.
</p>
<p>
There is infinite storage for content, but the time to wade through it is quite finite. So whose recommendation do I trust? The service that delivers results that are okay-ish, just good enough capture my attention and promptly sell it to the highest bidder - or a person I can converse with, that might have a reputation to lose and who probably has already demonstrated their sense of taste and style to me in their writings?
</p>
<p>
Certainly, from the demise of Yahoo's directory we can draw a lesson that human edited directories don't scale with the amount of content available (which is of course trivially true). But why on earth would a sane person be interested in the whole web? What I want to see are the parts that still are a labor of love and conviction.
</p>
<p>
If I were to create a directory, my first editorial principle would be that the content must be be <a href="/articles/is-it-worth-my-time/">worth my time</a>. The second principle would be, that visitors shall be treated like humans, and not as a bunch of suckers from which one might be able to extract a few cents (as beautifully illustrated <a href="https://how-i-experience-web-today.com/">here</a>). 
</p>
<p>
Coming back to this little web directory in printed form, with 23 years of hindsight, it still manages to convey two things to me: one is that preservation of digital artifacts is a hard and pressing issue (itself serves as an example in two ways, as you see: the big Yahoo directory is gone for good, this book is still there, and of course it is largely useless for as many of its URL have rotten away) and secondly, content curation is an act that creates value. Albeit, if the price tag of 29,95 DM was an appropriate expression of that value might be a point for a whole different discussion.
</p>
<time datetime="2023-04-12">2023-04-12</time>]]></description><pubDate>Wed, 12 Apr 2023 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/2023-04-12-an-old-book-and-todays-web/index.html</guid></item>
<item><title><![CDATA[I will read it]]></title><description><![CDATA[<p>
I recently wrote about the technological <a href="/articles/barriers-against-writing-on-the-web/">barriers against writing on the web</a>. But an even bigger hurdle than technology for many potential bloggers are their own doubts.
</p>

<p>
If you ask yourself, why you should write online, for you fear you won't be read, Manuel Monreale has an answer. He offers to be <a href="https://manuelmoreale.com/i-ll-read-it/">your first reader</a>. Chris Hannah also decided that he'd like to <a href="https://chrishannah.me/ill-read-it/">read your blog</a>. I share Chris' opinion, that <q>the internet would be a more interesting place if more people blogged</q>. 
</p>

<p>
In the spirit of Derek Sivers' <a href="https://sive.rs/ff/">leadership lessons from a dancing guy</a>: <q>Three is a crowd and a crowd is news.</q> - 
If you start a new blog, or already have one and your only visitors are bots: <a href="javascript:decryptEmail('ZmFiaWFuQGhvbHplci5vbmxpbmU/c3ViamVjdD1SZWFkIG15IGJsb2c=');">send it to me</a>, I'd love to read it. If you provide <a href="/articles/content-fast-and-slow/">a feed</a> for it, even better, I'll add you to my feedreader. And when I finally find some time to create a blogroll, you'll be in there as well.

<noscript>
Since you have disabled Javascript, the former link won't work, but you can find my contact info <a href="/contact.html">here</a>.
</noscript>
</p>

<time datetime="2023-03-23">2023-03-23</time>]]></description><pubDate>Thu, 23 Mar 2023 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/i-will-read-it/index.html</guid></item>
<item><title><![CDATA[Thoughts on the barriers against writing on the web]]></title><description><![CDATA[<p>
So, even though I'm using the web for more than a quarter of a century, I only recently tumbled over Bill Beaty's website <a href="http://amasci.com/">Science Hobbyist</a>.
 It exists since 1994 and spreads an absolutely delightful old web vibe.
 Consider yourself warned: you can spend quite some time in going down 
the rabbit holes there.
</p>
<p>
Indeed, Bill has written a lot in nearly three decades. In the answer to the question <a href="http://amasci.com/faq.html#stuff">how he managed to create so much stuff</a>, one phrase struck my particularly:
</p>
<blockquote>
I don't live in XP or ME or Windows 95. Not win3.1 either. Not MSDOS. I 
live on the internet, in an ancient unix shell account which is aliased 
to look a bit like msdos. If I should ever type up a little textfile 
during other activities on the computer, it only takes me ten seconds to
 put it on my webpage. Unlike most people, <strong>for me the barriers against publishing on internet have entirely evaporated</strong>
</blockquote>
<p>
Isn't that a beautiful idea? The web as a basically immediate writing 
medium, with basically nothing stands technically in between writing 
something down and having it published. Alas, rather few people live out
 their intellectual life entirely in a unix shell. 
</p>
<p>
For most the barriers are firmly there, the friction is as real as the 
perceived need for access to the web as a medium of personal expression.
</p>
<p>
Many of today's walled gardens got big, because a part of their initial 
value proposition was to lower the barriers of entry for many. They 
generally didn't do that with the public good in mind, and the quality 
of all those platforms deteriorates in a cycle, that Cory Doctorow has 
recently sketched out, and coined the colorful and sadly adequate term <a href="https://pluralistic.net/2023/01/21/potemkin-ai/#hey-guys">enshittification</a> for.
</p>
<p>
I haven't figured out a solution for myself that I would perceive as 
frictionless yet. This website started out as a single static html file,
 something that would have indeed been manageable via ssh in a shell. 
But frankly, while I find my way around vim, I don't particularly enjoy 
the experience. Apparently, I am not enlightened enough and I like 
proper UIs maybe a bit too much. So what I have is a <a href="https://tiddlywiki.com/">Tiddlywiki</a>
 in which I write down most of my notes. And while I love Tiddlywiki as a
 writing medium, I don't want to expose all of my notes and I don't want
 to serve a metric ton of Javascript for completely static content.  So 
now I have, apart from my wiki instance, a few horrible scripts that sit
 atop of my private wiki instance, filters the parts that are meant for 
publication (as indicated by tags, which are a very useful first-class 
primitive of tiddlywiki) and transforms them to some static html. But 
still, a wiki remains a comparatively non-mainstream interface for 
writing and the site generation script is a one-off, and I still haven't
 completely automated the feed generation with that approach. The whole 
problem it certainly quite a yak to shave, but probably - hopefully - 
worthwhile. 
</p>

<time datetime="2023-03-20">2023-03-20</time>]]></description><pubDate>Mon, 20 Mar 2023 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/barriers-against-writing-on-the-web/index.html</guid></item>
<item><title><![CDATA[Is blogging back?]]></title><description><![CDATA[<p>
At the end of last year I came across the <a href="https://bringback.blog/">Bring Back Blogging</a> initiative of Ash Huang and Ryan Putnam. I think it was a terrific idea to commit to some activity on my personal website in the month of January, and apparently more than 500 other people thought so as well.   
</p>

<p>
The web, with its not quite 2<sup>5</sup> years of existence, is still a young medium. Blogging as one of its archetypical forms hasn't actually been away. Yet, that the web is an open platform is so not through a law of nature. Given the economical and political circumstances of surveillance capitalism, and the maddening drift to authoritarian forms of governance, those properties would better not be taken for granted.
</p>
<p>
But that is all the more a reason to experiment, tinker and shape the medium through usage and many more <a href="https://notes.ashsmash.com/entries/bringbackblogsomg/">cute little experiments</a>, and do what is possible to increase the signal-noise ratio of the better corners of the web. 
</p>]]></description><pubDate>Tue, 31 Jan 2023 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/2023-01-31-is-blogging-back/index.html</guid></item>
<item><title><![CDATA[Making feeds automatically discoverable]]></title><description><![CDATA[<p>
I am a big fan of reading websites via a feed reader. 
Not all websites offer one, and not all that do link it prominently. 
A good thing therefore is, that a <a href="
https://blog.whatwg.org/feed-autodiscovery">standardized way to make feeds discoverable</a> for feed readers exists. 
So, when I find a website that I'd like to subscribe to, I can simply try to copy the url into the reader of my choice and chances are the reader is able to automatically dig out the URL of the feed.
</p>

<p>
All that is needed to make it work is a single link tag added to the head. 
It has three mandatory attributes: <em>href</em> of course for the URL of the feed, <em>rel</em> with value "alternate" and <em>type</em> with a value of either "application/rss+xml", or application/atom+xml, depending on the feed format. The <em>title</em> attribute is optional, but it's useful if a site offers multiple feeds. 
</p>

<p>
In quite a lot of cases it works like a charm. It used to work here as well. Now, guess which self-proclaimed fan of feeds thought it would be a good idea to rewrite the template of his personal website and managed to forget putting in the following line into the head:
</p>
<p>
<code>
&lt;link href="https://holzer.online/feed.xml" rel="alternate" type="application/rss+xml"&gt;
</code>
</p>
<time datetime="2023-01-10">2023-01-10</time>]]></description><pubDate>Tue, 10 Jan 2023 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/autodiscovery-for-feeds/index.html</guid></item>
<item><title><![CDATA[API design rule-of-thumb: Wrap all arrays into objects]]></title><description><![CDATA[<p>
Many REST-APIs deal with collections of domain-specific objects. In development, it can be a tempting shortcut to create responses which directly return collections as JSON arrays. It is initially often the path of least resistance for both the creator and the consumer of the API.
</p>

<p>
The approach has one problem: it is difficult to extend the API without introducing a breaking change. Two common features, which can typically be omitted in the first version, but are hard to retrofit when the returned type is an array, are metadata and pagination.
</p>

<p>
The simple prevention is to wrap all collections into an object from the beginning. Existing clients can then simply ignore all new properties, if they need to be introduced, whereas a change of the type of the response from array to object is guaranteed to break those clients.
</p>

<time datetime="2023-01-09">2023-01-09</time>]]></description><pubDate>Mon, 09 Jan 2023 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/api-design-wrap-arrays-into-objects/index.html</guid></item>
<item><title><![CDATA[Happy new year - Let's bring back blogging in 2023]]></title><description><![CDATA[<p>
New year's resolutions tend to not really work out for me, so I consider the following to be a resolution I only incidentally take on the first day of this new year. 
</p>
<p>
I love personal websites (as opposed to the corporate web) and the idea of <a href="https://bringback.blog">Bring Back Blogging</a> resonated strongly with me. I just signed up to it. The project: publishing three articles in January (+an announcement at the beginning and the end) and providing a RSS feed for the site. 
</p>
<p>
So this is the announcement of the beginning. I'll keep it  short, and will use the rest of the evening to get my RSS feed generation script in order again.
</p>]]></description><pubDate>Sun, 01 Jan 2023 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/2023-01-01-bring-back-blogging/index.html</guid></item>
<item><title><![CDATA[Using ChatGPT to implement tic-tac-toe in bash]]></title><description><![CDATA[<p>
I have to admit that I'm a bit late to the party. OpenAI's ChatGPT is currently freely accessibly in a public beta, so I wanted to use the opportunity to evaluate whether I need to start looking for a new job anytime soon. After some more prosaic prompts to the system, I decided to try having it implement a little program. I thought that tic-tac-toe would be a nice experiment. 
</p>

<p>
So I prompted it to write a bash script which plays tic-tac-toe using an optimal strategy.
</p>

<p>
In the first response, I already got quite a lot of building blocks: 
</p>
<ul>
<li> a data structure for the board (more about that later...)
</li><li> a function to print the current state of the board
</li><li> a function to check for a draw
</li><li> a function to check whether any player has won
</li><li> a function to check for whether a move is valid
</li><li> and the beginning of a function to decide the move of the program.
</li></ul>

<p>
I assume the API ran in some sort of timeout, as the last function wasn't implemented fully. Therefore I prompted it a for the whole function to make the computer move, and it indeed delivered complete implementation. So I had a lot of functions, but no game to actually play. And naturally - or at least naturally for software developer - I asked if it can generate a game loop, and I wasn't let down. 
</p>
<p>
I copy-pasted the three snippets into a file, held my breath, executed the script, and: it worked. Well, at least sort of. The generated program let the human player make the first move. As the only rational opening move is to take the center field, I didn't immediately discover a subtle bug, until I tried to play a non-optimal game. 
</p>
<p>
The generated code represents the board as an array of nine strings, where an empty field is represented as a single space character. The array was only initialized with 8 strings. To be fair, there are only two hard problems in software engineering: cache invalidation, naming things and off-by-one errors. And who am I, to be too harsh in a code review? I conversationally (it's <em>Chat</em>GPT after all!) asked it whether it could spot and correct the off-by-one mistake in the initialization of the board. And here it started to become obvious that it is a gigantic correlation machine, which although it produces very impressive results (and confidently sounding one's), it has no actual concepts of the things it generates. There is - as expected - no intelligence and no learning in the human sense. Here is how the dialog went down.
</p>

<blockquote>
<p>
You are correct, there is an off-by-one error in the initialization of the board. Currently, the board is initialized as follows:
</p>
<code>board=(" " " " " " " " " " " " " " " ")</code>
</blockquote>

<p>
Just that the board wasn't initialized as quoted above. This was no reproduction for its initial error, but another one (which it continued to explain in prose - and incorrectly so).
</p>

<blockquote>
This creates an array with 13 elements, with indices ranging from 0 to 12.
</blockquote>

<p>
After that it created a description of a correct solution in prose, directly followed by yet another incorrect implementation:
</p>

<blockquote>
<p>
However, in the tic tac toe game, the board has only 9 squares, with indices ranging from 0 to 8. To fix this off-by-one error, the board should be initialized as follows:
</p>
<code>board=(" " " " " " " " " " " ")</code>
<p>
This creates an array with 9 elements, with indices ranging from 0 to 8, which corresponds to the 9 squares in the tic tac toe game.
</p>
</blockquote>
<p>
It is a fun tool to play around with and I'm not unimpressed by the results. But I don't tremble in fear of being layed off anytime soon due to its existence. For those who are not convinced, Hendrik Erz has written up <a href="https://www.hendrik-erz.de/post/i-get-your-excitement-about-chatgpt-but">a lot more good reasons not to fall for the hype</a>. 
</p>
<p>
If you are interested, you can also read the <a href="/articles/chatgpt-tic-tac-toe/transcript.txt">complete chat transcript</a> and the generated <a href="/articles/chatgpt-tic-tac-toe/ttt.sh">source code</a> (where the correction of the initialization was done manually).
</p>]]></description><pubDate>Wed, 28 Dec 2022 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/chatgpt-tic-tac-toe/index.html</guid></item>
<item><title><![CDATA[Long week - short note]]></title><description><![CDATA[<p>
Sometimes a single week has more things packed into it than a whole regular month. 
This week was one of them. 
Folks, take very good care of yourself.
</p>

<time datetime="2022-07-01" title="That's 2022-07-01 for Non-Discordians ;)">Boomtime, the 36th day of Confusion in the YOLD 3188</time>]]></description><pubDate>Fri, 01 Jul 2022 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/weeknotes/2022-07-01.html</guid></item>
<item><title><![CDATA[Leisure time, Curiosity, Book club]]></title><description><![CDATA[<p>
Leisure time is a luxury. For me it certainly was in the last days. That's why these notes come three days late. And I don't really see it getting very much better. But at least, recognising that I have a small chunk of it, is a first step to use it well. 
</p>

<p>
Lately I was thinking about the relationship between learning, teaching, schooling and curiosity, especially with regard to teaching computing. I cannot pin it down to something concret, but I strongly sense that somewhere in the system mechanisms are in place, that are detrimental to curiosity and form learners into consumerists. 
</p>

<p>
Therefore, one thing I'm looking forward to is the upcoming round of <a href="https://twitter.com/DevEdBookClub">DevEdBookClub</a>. An informal online discussion round, that will discuss Greg Wilsons <a href="http://teachtogether.tech/">Teaching Tech Together</a> over the next few month. I've read to book earlier this year, and it is well worth to be re-read. As I did not take notes on the first reading, this is a great opportunity not only to discuss it with other people, but maybe also get a summary done. 
</p>

<time datetime="2022-06-27" title="That's 2022-06-27 for Non-Discordians ;)">Today is Pungenday, the 32nd day of Confusion in the YOLD 3188</time>]]></description><pubDate>Mon, 27 Jun 2022 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/weeknotes/2022-06-27.html</guid></item>
<item><title><![CDATA[Dependecies, Writing process, Time budgets]]></title><description><![CDATA[<p>
One of the things that courses and books on software development generally do not teach is how to pick and vet dependecies. So often, before even one line of actual programming is done, tons of code from packages of varying proveninence and quality are pulled in, and it usually doesn't stop there. Any of those packages could turn out to be the next left-pad happens to be that package that some person has been <a href="https://xkcd.com/2347/">thanklessly maintaining since 2003</a>. Presumably every software-producing organization has their process to deal with their software bill of materials, but the field as a whole seems to have just given up on formulating and formalizing principles...
</p>
<p>
I've also been thinking a bit about my writing process. The fixed cadance of weekly notes has a liberating aspect: when something doesn't make it in there, there is a place for it next week, or it might even not be important after all. But having a topic for an article in mind makes it easy to move the release further and further, in the worst case until I don't see a point in putting something out anymore. I'm asking myself, if artificial deadlines might be not evil after all? Maybe I should budget a certain amount of time for a given topic I'd like to write about upfront and then just put out what ever I have once that time budget is used up?
</p>
<p>
And since the timebudget for this week's notes has basically run out and it's quite humid and hot in the appartment, I'll seek a place with more shadow now...
</p>

<time datetime="2022-06-17" title="That's 2022-06-17 for Non-Discordians ;)">Pungenday, the 22nd day of Confusion in 3188 YOLD</time>]]></description><pubDate>Fri, 17 Jun 2022 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/weeknotes/2022-06-17.html</guid></item>
<item><title><![CDATA[On the state of software development in general & coming to terms with having a lot of loose ends]]></title><description><![CDATA[<p>
This week I was pondering the question why the trade of software development seems to be ever more digressing to be a <a href="https://en.wikipedia.org/wiki/Red_Queen%27s_race">Red Queen's race</a>. Maybe my perception, that it wasn't always like this, is just plain wrong. One example: I find the state of rapid application development tools to be quite lacking and I certainly hope that Visual Basic 6 will not remain pinnacle of RAD, but I see no single integrated solution for a painless, quick, local evaluation of an idea.</p>

<p>
I've also thought a bit about how a both practical and principle-oriented introduction to software development would have to look like. Could I outline what I think to be essential? I tried and ended up with a whole lot of disparate, little aspects - it is really alarmingly easy to miss the forest for the trees. I sense that there is a lot of potential for simplification overall, but as the saying goes: simplicity is the ultimate sophistication...
</p>

<p>
Another ongoing topic of mine is coming to terms with a lot of parallel ideas and loose ends. I've started thinking in the direction of serving on-going writing in a separate folder as raw plain text. That would be quite frictionless, but it I have to make up my mind about a few details. Would I want to keep URLs of such draft/work-in-progress files stable, shall they be first-class citizens of the site, should they be indexed, how would I indicate freshness/state etc.? Also I started to think about a general restructuring of the site. After all, I've strayed away from my initial principle, that every piece of content shall live in the index.html.
</p>

<p>
And - third time's the charm - this weeknote format seems to be working for me and my schedule.
</p>

<time datetime="2022-06-10" title="That's 2022-06-10 for Non-Discordians ;)">Sweetmorn, the 15th day of Confusion in 3188 YOLD
</time>]]></description><pubDate>Fri, 10 Jun 2022 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/weeknotes/2022-06-10.html</guid></item>
<item><title><![CDATA[On unintended consequences]]></title><description><![CDATA[<p>
Consider the following scenario: an engineer demonstrates a problem and sketches a simplifying solution. 
The problem as such is accepted, but the proposed solution is rejected. 
The result is new work in the backlog that overhauls the existing functionality with something more complex. 
The new solution is slightly (but not essentially) more powerful. 
It maybe be better from a business/product management/sales/design perspective (what ever the metric of choice is).
</p>

<p>
An attempt of simplification, which results in bloat, is a perverse outcome from an engineering perspective. 
The engineering lense is of course not the only one, but a system that is to be maintained in the long run, surely shouldn't completely disregard it. 
For what could be a second-order effect of such a decision?
</p>

<p>
In the worst case: the creation of an incentive be silent. A motivation to stop contributing suggestions, and sweep issues under the mat. Such a potential breakdown of communication and feedback is a real threat for the quality and structure of any system. If a canary in the coalmine stops singing, miners know that it is time to get out.
</p>

<p>
Those who are tasked with creating systems would do good to be reflective of this, and if necessary take measures to counteract it.
</p>

<time datetime="2022-06-07">2022-06-07
</time>]]></description><pubDate>Tue, 07 Jun 2022 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/unintended-consequences/index.html</guid></item>
<item><title><![CDATA[What to do about too much work-in-progress...]]></title><description><![CDATA[<p>
Time really does fly. The topic of too much work-in-progress I wrote about <a href="/weeknotes/2022-05-27.html">last week</a> is still bugging me. Ideas keep piling up, few, if any get finished. I don't want to discard topics and i don't want to let time go to waste, therefore I think should start splitting the site up even more. Some of the works-in-progress writings could be published as seeds of a digital garden.
</p>
<p>
One of the perks of having a personal website is that I can play with web technology as much as I want. For example: I'd like to add support for webmentions, but without a third-party service. While the specification seems straight forward, I'm a programming long enough to expect the devil being in the details of even the most straight forward specifications (And life is short, while art is long.).</p> 

<p>
I also thought a bit on recurring design elements of personal websites in general, which led me down quite a rabbithole. I've collected nearly thirty of them by now and I don't think that list is exhaustive yet. This is a topic that would deserve a proper write-up. Among those elements is for example the blogroll. I think that would be something I should add one to my site as well. I believe we'd better spend more time on personal sites instead of lingering in the gated communities of the web. 
</p>


<time datetime="2022-06-03" title="That's 2022-06-03 for Non-Discordians ;)">Prickle-Prickle, Confusion 8, 3188 YOLD</time>]]></description><pubDate>Fri, 03 Jun 2022 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/weeknotes/2022-06-03.html</guid></item>
<item><title><![CDATA[You have to start somewhere...]]></title><description><![CDATA[<p>
I'm still figuring out what I enjoy putting on my website. I am struggeling to write regularly. Last year I did an experiment of writing a piece of content per day for 30 days in a row, which didn't work out. With the weeknotes I set my ambitions are a bit lower, and I'll see how far I get. I want to publish my scattered thoughts in a weekly digest. I'll allow myself any form, but it has to be published every friday. 
</p>

<h2>On Work-In-Progress</h2>
<p>
John Cutler shared a checklist on Twitter that resonated a lot with me. It is not only applicable in a work context but in the private life as well. Even if I think about this little corner of the web, I do have a few things that I've started but not yet quite finished...
</p><blockquote>   
 <a href="/weeknotes/2022-05-27-what-if-there-is-too-much-wip.jpeg" target="_blank"><img alt="What if there is too much work in progress?" src="/weeknotes/2022-05-27-what-if-there-is-too-much-wip.jpeg"></a>
 <p>
 Is your organization struggling with too much work in progress? How would you know? 
 </p>
  - <a href="https://twitter.com/johncutlefish/status/1528269492425396224">John Cutler (@johncutlefish) May 22, 2022</a>
</blockquote> 
<p>
But more pressing than gauging the question of if, the is the question what to do about it? Sadly, just creating a Kanban board in JIRA does not quite cut it... 
</p>

<h2>What aspects does a good life have?</h2>
<p>
Also via twitter I came across the article <a href="https://www.erinwestgate.com/uploads/7/6/4/1/7641726/oishi.westgate.psychrev.2021.pdf">A Psychologically Rich Life: Beyond Happiness and Meaning</a> by Eron Westgate and Shigehiro Oishi. I think their finding, that happyness, meaningfulness and "psychological richness" of life are and can be measured as separate categories, as an enligthening mental framework. It resolved for example a cognitive dissonance I had, when I first read a certain passage of Richard Hammings talk <a href="http://paulgraham.com/hamming.html">You and your research</a>, where he said that he had neglected his spouse in order to to get what he wanted done. Happyness as category can be in tension to meaningfulness or psychological richness. All aspects contribute to a good life, but each is doesn't weight equally for everyone.
</p>

<h2>Snowclones in technical articles</h2>
<p>
Sometimes titles sound strangely familiar. They follow a certain phrasal template which sounds a bit clichée. Such templates also go under the name snowclone. I think I've encountered at least half a dozen of them in the context of computer science / software engineering. It might be worth an article to collect them. 
</p>

<h2>That's not quite all folks...</h2>
<p>
There are certainly more things to be said, but as I want to put something out at a predefined time, as artificial as that might be - so I'll close it here, and in the next <a href="/weeknotes/2022-06-03.html">notes of the week</a> I may muse on some of the following questions:
</p>
<p>
</p><ul>
<li>
What can be done to make software development less of a red queen's race?
</li>
<li>
Might it be worth to take up long letter writing?
</li>
<li>
If both time and money are constrainted, what is the most effective way to learn a challenging subject/topic?
</li>
</ul>
<p></p>

<time datetime="2022-05-27" title="That's 2022-05-27 for Non-Discordians ;)">Boomtime, the 1st day of Confusion in the YOLD 3188</time>]]></description><pubDate>Fri, 27 May 2022 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/weeknotes/2022-05-27.html</guid></item>
<item><title><![CDATA[Small things matter for accessibility]]></title><description><![CDATA[<p>
Can you spot the difference between <b>bold</b>, <strong>strong</strong> and a <span style="font-weight: bold;">span with an font-weight bold</span>? How about the difference between <i>italic</i>, <em>emphasized</em> and a <span style="font-style: italic;">span with font-style italic</span>? If you do, you most likely either have opened your browsers' developer tools or you are using a screen-reader.
</p>
<p>
A colleague of mine recently reviewed a part of a UI component library I worked on with regard to accessibility. He found a line where I used a &lt;b&gt; tag instead of a &lt;strong&gt; tag and rightfully remarked that I'd better use sematic tags.
</p>
<p>
After the review, I thought about the reason I came up with the non-semantic markup in the first place. The component was developed against a designers' mockup, and when I derived the markup I translated the visual design in my head to the idea, that this part should be formatted bold, from that my mnemonic association I went straight to the &lt;b&gt; tag.
</p>
<p>
Satisfying a specification from a mere typographical point of view is not enough. What makes no difference for visually unimpaired people very much matters for users of assistive technologies. 
</p>]]></description><pubDate>Fri, 13 May 2022 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/small-things-matter-for-a11y/index.html</guid></item>
<item><title><![CDATA[Write down your makers bucket-list]]></title><description><![CDATA[<p>
Few things are certain in life, among them is the fact that you only get to create a finite number of things in your life. And if a large portion of your time is already allocated, it becomes important to <a href="/articles/is-it-worth-my-time/">prioritize rigorously</a>, so that you waste none on thinking about what to do instead of actually doing something when you have an hour to spend on something constructive, on creating, on doing a <a href="http://www.paulgraham.com/own.html">project of your own</a>. In the same manner that a lot of people keep a list of places to visit and things to experience before they join the choir invisible, it would be a good idea to have your makers bucket list ready upfront.
</p>
<p>
Sure, I‘d be hard pressed to come up with a category much more generic than „Making things“. Yet it rules out mainly consuming activities (e.g. reading books, visiting an exhibition, traveling, etc.). Those should go on different lists, but what to actively include definitively needs some thought. When that thought enables you to focus once you do have time to allocate, it would be well-spent. Dabbling around without a concrete goal likely results in spreading yourself too thin and the top-most item of a maker‘s bucket list should act as a deterrent to that kind of behavioral pattern.
</p>
<p>
A few questions to ponder, when creating your list can be:
</p><ul>
<li>
What is outside of your immediate needs that you would find fun?
</li>
<li>
Which branch your field would you like to explore?
</li>
<li>
What would you wish to have come up on your own with?
</li>
<li>
What object would be cool to have?
</li>
<li>
What was the last thing a single person came up with that I admired? 
</li>
<li>
Which off-the-shelf product does an okay, but not very good job?
</li>
</ul>
<p></p>
<p>
Personally, I‘d also love to read such lists on the websites of creative people. I have to admit, my own list is not in the best shape. Feel free to call me out for being a hypocrite if I don‘t put mine on here some time in the near future. But since I see my current top-most item staring at me, and I‘ve got a few minutes left, so I know what I‘ll do after this little piece is published.
</p>

<time datetime="2022-05-02">2022-05-02</time>]]></description><pubDate>Mon, 02 May 2022 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/write-down-your-makers-bucket-list/index.html</guid></item>
<item><title><![CDATA[Content - fast and slow]]></title><description><![CDATA[<p>
Being a employed in some kind of role that could be classified as knowledge work implies a necessity stay on top of things. And the channels of today create a current of content in which it's hard not to drown in. That hardly is a surprise, when thousands of intelligent, highly-paid peoples' personal incomes are tied to how long you stay on a platform, how much you engage and how many ads you consume. Those platforms are products which - by design, not by coincidence - resemble a slot machine. They want to capture and keep their users' attention systems. And the creators of such platforms don't have to
account for the detrimental effects on your ability to concentrate, focus and learn.
</p>

<p>
The polar opposite of these walled gardens are the many websites (mostly still operated by individuals) that still offer to subscribe to their content via a feed. Feeds empower the readers by decoupling the content consumption from the platform. No algorithm orders it for you, just a simple timeline. And a  much slower one for that.
</p>

<p>
I have roughly the same number of feeds in my feed reader as I follow people on Twitter. Yet, I refresh the former manually once a day and have maybe a dozen articles in the inbox, spending a mere five minutes on the latter I'm being nudges to refresh and see more than fifty new items. Sure, your mileage may vary and the the plural of anecdote isn't data - but that's roughly a three orders of magnitude difference in items that are presented.
</p>

<p>
With regard to that, I overhauled my own RSS feed. While the <a href="/articles/lazy-way-of-providing-a-feed/">first solution</a> was a fine exercise in <a href="/articles/satisficing/">Satisficing</a>, it had limits. It only delivered the last five articles to new subscribers and didn't serve the full content. The <a href="/feed.xml">new one</a> does all that and doesn't depend on a third party to create it.
</p>]]></description><pubDate>Sat, 16 Apr 2022 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/content-fast-and-slow/index.html</guid></item>
<item><title><![CDATA[Don't 'cd' to change directory]]></title><description><![CDATA[<p>
We all have only a finite number of <a href="https://www.keysleft.com/">keystrokes left</a> and should <a href="/articles/is-it-worth-my-time/">use them wisely</a>.
</p>
<p>
I don't know how many years I typed "cd" in the terminal to change my directory, until I learned that the shell can interpret anything you type, which is no command, to execute implicitly as argument to cd. I enable this by setting an option, with adding the following line to my .bashrc:
</p>
<code>
shopt -s autocd
</code>
<p>
I hope it might save a few keystrokes for whoever reads this.
</p>]]></description><pubDate>Thu, 07 Apr 2022 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/dont-cd-to-change-directory/index.html</guid></item>
<item><title><![CDATA[The lazy webmaster's way of providing a RSS feed]]></title><description><![CDATA[<p>
    I consciously setup my website as minimal as possible. It's liberating to have a the content immediately
    in a representation that renders <a href="/articles/benefits-of-classless-css/">good enough</a>. Yet
    I'd like to offer is a RSS feed. I could of course write it manually, but that would become a chore
    rather soon. A small tool chain could also work, but I would lose the feeling of immediacy.
</p>
<p>
    Having a regular markup structure made it possible to an <a href="https://createfeed.fivefilters.org">external service</a> derive the feed automatically. So,
    <strike>here you go</strike>.
</p>]]></description><pubDate>Wed, 22 Dec 2021 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/lazy-way-of-providing-a-feed/index.html</guid></item>
<item><title><![CDATA[Avoid collecting without acting]]></title><description><![CDATA[<p>
The amount of information which is thrust upon you is orders of magnitude larger than the capacity to absorb and make use of it. This can lead to a destructive habit, called the <a href="https://zettelkasten.de/posts/collectors-fallacy/">collector's fallacy</a>. This fallacy is a form of self-deception. It makes you feel like you are progressing where you are actually stalling. It leads to wasting your precious time on <a href="/articles/is-it-worth-my-time/">something that's not worth it</a>.
</p>

<p>
To avoid falling prey to the collector's fallacy, you need to work actively with the collection you have. Introduce some form of rate limiting: Don't buy a new book before you finished one. Don't bookmark another article before you haven't read (or at least deleted) one of those you have bookmarked.
</p>

<p>
If it would have been important, you would have already read it. Its content likely won't be lost. There are search engines and even in case the of <a href="https://www.w3.org/Provider/Style/URI">uncool urls</a> there's still the <a href="https://archive.org/web/">wayback machine</a>.
</p>]]></description><pubDate>Tue, 21 Dec 2021 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/avoid-collecting-without-acting/index.html</guid></item>
<item><title><![CDATA[On digital gardening]]></title><description><![CDATA[<p>
On content-focused websites the prevalent pattern for the organizing content is the blog format: a list  of articles/posts presented in reverse-chronologically order. Amy Hoy wrote <a href="https://stackingthebricks.com/how-blogs-broke-the-web/">a criticism of this organizational pattern</a>, which found some resonance. So nowadays - as everything old is new again - a bunch of personal websites started to conscientiously style and organize themselves as <a href="https://joelhooks.com/digital-garden">digital gardens</a>.
</p>
<p>
Now, there is no copyright to that term, but one overarching concept I see and very much like is, that articles are not seen as something that is written once and then finished after the publication, but as a seed which might grow into something that eventually becomes evergreen, more akin to a well-organized public (read-only) wiki.
</p>
<p>
I haven't yet figured out how I will this page in the long run, currently it is much more a blog than a garden, yet I find the idea to go back to existing article and enhance them over time very intriguing.
</p>]]></description><pubDate>Fri, 17 Dec 2021 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/on-digital-gardening/index.html</guid></item>
<item><title><![CDATA[On Satisficing]]></title><description><![CDATA[<p>
        Every day we need to decide many things and many of those decisions are of minor importance. Lots of
        trivial decisions to make can create neural fatigue and lead to unproductivity and loss of focus.
    </p>
    <p>
        Herbert Simon coined the word <i>satisficing</i> for a strategy that concentrates on getting an option
        that is good enough, but possibly not the very best. Satisficing is one of the foundations of productive
        human behaviour because it avoids wasting time on finding improvements that are not going to make a
        significant difference.
    </p>
    <p>
        Yet, satisficing should not be applied to very high-priority endeavours where much is at stake. There
        pursuing excellence might actually be the better strategy. But those are few and far between. To have
        the capacity to make them happen, satisficing is an imperative.
    </p>]]></description><pubDate>Tue, 14 Dec 2021 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/satisficing/index.html</guid></item>
<item><title><![CDATA[The benefits of a classless approach to CSS]]></title><description><![CDATA[<p>
I first experienced the web in the mid-nineties. At that time CSS wasn't really around and even if the first browsers supported it, many pages were just text-heavy unstyled documents. Today you would consider such an approach as luddite, yet since the H in HTML stands for hyper<i>text</i> you could argue that keeping styling concerns out of markup is the purest form of authoring a document for the web.
</p>
<p>
Today's default choices are quite distinguishably different from that. A minified version of Bootstrap 4 ships 117kB. As a comparison: I would have to write about 60 to 80 additional articles on this site to match that weight with an equal portion of content. And while at it, I'd have to clutter my markup with classes over classes. There are of course slimmer css frameworks than Bootstrap, but nonetheless, my main motivation is in the writing down useful things, therefore I decided to approach the styling of this site quite radically with classless CSS. All styling decisions are taken by CSS which is targeted by element selectors only. If I'd bother to minify it, that would clock in little over half a kilobyte, and even unminified it is less than 1% of bootstrap.
</p>
<p>
But page weight isn't the most important thing. A classless CSS approach enables me to author content without intermediate representations (e.g. the Markdown flavour du jour in combination with a static site generator) directly in HTML while still allowing me to focus on the content.
</p>]]></description><pubDate>Mon, 13 Dec 2021 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/benefits-of-classless-css/index.html</guid></item>
<item><title><![CDATA[Add expiration dates to TODO comments]]></title><description><![CDATA[<p>
When I spot an idea for a non-trivial refactoring, I often add a TODO comment. The ideas which are not acted upon immediately are often, but not always, valuable.  A problem is, that they tend to pile up without being resolved. In a mid-sized real-world code base that I maintain the ratio was roughly one such comment per 100 SLOC.
</p>

<p>
Therefore I decided to add a reasonable explicit expiration date to any such TODO (some 4 to 8 weeks in the future). When I encounter a comment that has expired, deleting it is a perfectly viable cleanup. The code structure obviously was not so bad after all, or else I would have put energy into the refactoring already.
</p>]]></description><pubDate>Wed, 19 May 2021 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/add-expiration-dates-to-todo-comments/index.html</guid></item>
<item><title><![CDATA[Is it worth my time?]]></title><description><![CDATA[<p>
        About twenty-five centuries ago Hippocrates of Kos famously stated that
        <a href="https://en.wikipedia.org/wiki/Ars_longa,_vita_brevis">life is short,
            while art is long</a>. Most knowledge workers can very much relate to that.
        While the body of knowledge in a field is ever growing,
        the time available to an individual for deliberate learning activities is limited severely.
    </p>

    <p>
        I use the following criteria to assess if a topic is worth spending my time on it.
    </p>

    <h2>Longevity and Transferability</h2>
    <p>
        I prefer evergreen knowledge and focus on topics that are not bound to a specific technology.
        As a general principle, anything with a version number attached to it should be treated with caution.
        But: Using a specific technology (even if it's non-mainstream or dated) to illustrate a concept is fine.
    </p>

    <h2>Applicability and personal usefulness</h2>
    <p>
        Many concepts are long-lived and transfer well, but when the
        chance of applying them is rather slim, then other things should take priority.
        Not applying something is detrimental to retention and time is too valuable
        to spend it on learning something that falls into oblivion.
    </p>
    <p>
        As a caveat: To some degree, it cannot be known which topics will lend themselves
        to be applied to problems presented to you due to external needs and interests.
        Chance favours the prepared mind.
    </p>

    <h2>Immediate necessity</h2>
    <p>
        Not everything which needs to be learned will be a beautiful timeless idea.
        Sometimes I need to grasp a poorly documented functionality of some obscure
        technology to get a task done. It comes down to a judgement call, which is a matter of
        experience and confidence, how deep to go. It can be beneficial to build a real understanding
        instead of just copy-pasting from the web (which might get the job done but comes at some
        loss of control).
    </p>
    <h2>Personal interest and commitment</h2>
    <p>
        There are also a few topics and technologies, to which I'm committed deeply.
        I consider it worthwhile to keep up with them, even if the criteria laid out
        before are to some extent not met. I also regularly reassess my commitment to the topics.
    </p>]]></description><pubDate>Tue, 18 May 2021 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/is-it-worth-my-time/index.html</guid></item>
<item><title><![CDATA[On the risks of quick fixes]]></title><description><![CDATA[<p>
        Every software system has its issues. Usually, at any point in time, there are many
        ideas for new features, enhancements, as well as fixes waiting to be implemented.

        A lot of them are indeed solvable with a few lines. But many of those small tasks
        are wasted work because they work around a problem, which could and actually <i>should</i>
        be solved by a slightly larger change, that requires some - but not very much - more effort.
    </p>
    <p>
        If the order of development is optimizing for throughput, the so-called quick
        wins and quick fixes will be prioritized and the effect results in a well-known
        problem in scheduling algorithms:
        <a href="https://en.wikipedia.org/wiki/Starvation_(computer_science)">starvation</a>.
    </p>

    <blockquote>
        <p>
            Resource starvation is a problem encountered in concurrent computing where a process is
            perpetually denied necessary resources to process its work.
        </p>
    </blockquote>

    <p>
        In this case, the process is the task in the backlog, which would be the fundamental solution
        to the problem, and the resource is the allocation of time to work on that task.
    </p>

    <p>
        Steve McConnell formulated yet another risk of those quick wins and fixes in his
        "Software Project Survival Guide" (p. 127):
    </p>
    <blockquote>
        <p>
            The problem with quick and dirty, as some people have said, is that dirty remains
            long after quick has been forgotten.
        </p>
    </blockquote>]]></description><pubDate>Wed, 07 Apr 2021 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/on-the-risk-of-quick-fixes/index.html</guid></item>
<item><title><![CDATA[The Second-System Effect - Excerpts]]></title><description><![CDATA[<p>
        The following is an excerpt from chapter 5 of "The Mythical Man-Month" (1995 edition) by Fred Brooks.
    </p>

    <blockquote>
        <p>
            If one separates the responsibility for functional specification
            from responsibility for for building a fast, cheap product, what discipline
            bounds the architect's inventive enthusiasm?
        </p>
        <p>
            The fundamental answer is thoroughgoing, careful, and communication between
            architect and builder.
        </p>
    </blockquote>

    <blockquote>
        The architect has two possible answers when confronted with an estimate that is too high:
        cut the design or challenge the estimate by suggesting cheaper implementations.
    </blockquote>

    <blockquote>
        For it to be successful, the architect must
        <ul>
            <li>remember that the builder has the inventive and creative responsibility for the implementation
                [..]</li>
            <li>[..] be prepared to suggest <i>a</i> way of implementing anything he specifies [..]</li>
            <li>deal quietly and privately in such suggestions</li>
            <li>be ready to forgo credit for suggested improvements</li>
        </ul>
    </blockquote>

    <blockquote>
        The builder will counter by suggesting changes to the architecture. Often [..] some minor
        feature may have [..] large costs when the implementation is worked out.
    </blockquote>

    <p>
        Brooks considers that, the first system which an architect builds is potentially clean.
        As the system is designed, there are ideas which get stored away to be used "next time".
        All the frills and embellishments which were kept out of the first design, often make it into
        the next system. Therefore, he states:
    </p>

    <blockquote>The general tendency is to over-design the second system [..]</blockquote>

    <p>and</p>

    <blockquote>
        <b>The second system ist the most dangerous system a man ever designs.</b>
    </blockquote>

    <p>
        Basic system assumptions can change. These changes make some techniques obsolete.
        The tendency to refine those can be another symptom of the second-system effect.
    </p>

    <p>
        An architect cannot skip designing a second system, but he can be conscious of it hazards.
        Self-discipline must be exercised to avoid functional ornamentation ("gold plating")
        and sinking time in obsolete areas and functions.
    </p>]]></description><pubDate>Sun, 14 Mar 2021 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/second-system-effect-excerpts/index.html</guid></item>
<item><title><![CDATA[Two classes of disagreement]]></title><description><![CDATA[<p>
    I learned about the concept of two classes of disagreement from an anecdote
    in Michael Hiltzik's book <i>Dealers of Lightning</i> on the history of Xerox PARC.
</p>

<p>
    He describes strong tensions between Robert Metcalfe and Chuck Thacker,
    who are both pioneers of the Ethernet and personal computing. Hiltzik quotes Bob Taylor,
    the manager of PARCs computer science lab, who introduces what he calls a
    "Class One disagreement" as the root cause.
</p>

<p>
    According to Taylor, two people have a Class One disagreement when they disagree
    and neither can explain to the other's satisfaction the other's point of view.
    When each person can explain to the other's satisfaction the other's point of view,
    it's a Class Two disagreement. The latter enables people to work together, even if
    they disagree, while the former is destructive.
</p>

<p>
    With that framework in mind, when you "agree to disagree", it would be
    wise to ensure that it is on a Class Two disagreement.
</p>]]></description><pubDate>Wed, 03 Feb 2021 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/two-classes-of-disagreement/index.html</guid></item>
<item><title><![CDATA[Can you ever know enough about people?]]></title><description><![CDATA[<p>
    I recently finished <i>100 Things Every Designer Needs to Know About People</i>.
</p>

<p>
    Susan Weinschenk has compiled a lot of research into a hundred short essays.
    The book covers a lot of ground with topics ranging from perception, over
    how human memory and thinking and decision making processes work to how
    humans tend to deal with errors.
</p>

<p>
    The book doesn't require any prior knowledge. It is very digestible and actionable.
    The chapters are to the point and contain a condensed list of key takeaways.
    No reading order is required. Being very broad in topics makes it rather hard to summarize -
    yet cheapskates and people in a hurry could probably even get some insights
    out of simply reading once through the table of contents.
</p>

<p>All in all: a recommended reading.</p>]]></description><pubDate>Mon, 25 Jan 2021 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/review-100-things-a-designer-should-know-about-people/index.html</guid></item>
<item><title><![CDATA[It's been a while...]]></title><description><![CDATA[<p>
Many, many years ago, I maintained a website.
It was fun.
Then life got in the way, domains expired, and that site fell into oblivion.
</p>
<p>
Meanwhile, I made a profession out of what was once my hobby.
Earning one's bread doing what one would have gladly pursued free, for passion is a privilege granted to
only a fraction of the human race, as Fred Brooks rightfully stated in the epilogue of his seminal
<i>Mythical Man-Month</i>.
So, by and large, I consider myself a very lucky man.
</p>
<p>
Yet, over the years I lost track of the passion, the fun aspect slipped away a bit.
This, therefore, is an attempt at rekindling it.
For now, in the shape of a single file, filled with random musings of some <a href="https://rakhim.org/images/honestly-undefined/blogging.jpg"> weird dude who writes raw HTML</a>.
</p>
<p>
Just for the fun of it. <i>:)</i>
</p>]]></description><pubDate>Wed, 20 Jan 2021 00:00:00 GMT</pubDate><guid isPermaLink="true">https://holzer.online/articles/2021-01-20-it-has-been-a-while/index.html</guid></item></channel></rss>