{
	"version": "https://jsonfeed.org/version/1",
	"title": "Softly developing about software development",
	"icon": "https://avatars.micro.blog/avatars/2026/14/62453.jpg",
	"home_page_url": "https://softlydeveloping.micro.blog/",
	"feed_url": "https://softlydeveloping.micro.blog/feed.json",
	"items": [
			{
				"id": "http://softlydeveloping.micro.blog/2026/09/17/the-code-can-always-get.html",
				"title": "the code can always get worse",
				"content_html": "<p>&ldquo;The code can <em>always</em> get worse.&rdquo;</p>\n<p>&ldquo;&hellip;there is no abrupt failure threshold associated with software quality&hellip;&rdquo;</p>\n<p>From: <a href=\"https://zachkehs.com/blog/theres_no_limit_to_how_bad_code_can_get\">There&rsquo;s No Limit to How Bad Code Can Get</a></p>\n<p>A useful reminder about the endless, bottomless pit that a software project can become. The pit is not a barren void, it&rsquo;s a gorgeous geological wonder of morphologies.</p>\n",
				
				"date_published": "2026-09-17T07:31:01-07:00",
				"url": "https://softlydeveloping.micro.blog/2026/09/17/the-code-can-always-get.html"
			},
			{
				"id": "http://softlydeveloping.micro.blog/2026/06/16/morning-forage.html",
				"title": "morning forage 20260616",
				"content_html": "<p><a href=\"https://merveilles.town/@neauoire/116755947517128805\">Dillo browser&rsquo;s directory of bookmarks</a>\n<a href=\"https://indieweb.social/@jbz/116737024124716539\">Is it Time to Regulate React?</a>\n<a href=\"https://chaos.social/@indyarni/116714681972383302\">Ubiquitous language worst case. Same name, different article.</a></p>\n",
				
				"date_published": "2026-06-16T06:42:28-07:00",
				"url": "https://softlydeveloping.micro.blog/2026/06/16/morning-forage.html"
			},
			{
				"id": "http://softlydeveloping.micro.blog/2026/04/01/end-products-habiting-difference.html",
				"title": "End products, habiting difference",
				"content_html": "<h1 id=\"chapter-1\">Chapter 1</h1>\n<p>It’s Wednesday evening. Incandescence lazes out from the rectangle in the southeast corner of my home work station. Zen Master Bon Seong, a fiery bushel on screen, a big circle face in the biggest square. He is using the figurative Zen Stick to short-circuit our cognition. He is fond of saying things like “You are stardust” or “What is I?”.</p>\n<p>Jeff breathes hot air through the broom on his face. Those bits go through audio processing and seem to emanate from nowhere around the work station. “The infinite expansion of the same thing” is uttered. We’re discussing how people can interpret the same phenomena differently. As we say: “The whole world is made by mind alone.” And: “The whole world is a single flower.” As the Heart Sutra says: “form is emptiness, emptiness is form”. You cough. I’m startled. I freeze. I think you have COVID. I think I’m going to get it. Then get long COVID. Someone else sees you cough, they think it’s a sneeze and continue on. Perhaps it is.</p>\n<p>The dharma talk continues. There’s nothing wrong with our kaleidoscope of perspectives. They are regular. This is the human mind being itself, resting in its station, but painting a tale on snake, coloring it’s ridiculous karma all over “the small box” that is our little piece of understanding of the universe.</p>\n<p>Gosh, we’re talking about boxes from within boxes. Our thinking creates this separate, enclosed being. (Consciousness bound by a skin sack? Not today, the microbiome field transforms you. (Sigh. No help lugging our sacks and their biomic nerve fields closer together. We have decades of men making the Bay car-friendly, but I can’t get across conveniently. I can’t get to Berkeley from Potrero without spending as much time commuting as the duration sitting meditation with the other sacks for Wednesday night dharma talks.)) The problem is getting attached to difference. Not understanding our “universal substance” &ndash; what we say as a convenience. That’s why Zen is about returning to <em>before thinking</em>, accessing the truth before difference. So maybe instead: you cough, then I hand you a tissue.</p>\n<p>I don’t want this post to be about the negatives of the human mind’s proclivity to be a multiversal agent. It&rsquo;s not really a negative, is it? It&rsquo;s a matter of fact about our minds as atoms floating in space. Space dust. So, instead: let&rsquo;s relish in the generative creativities that difference making unleashes when multiple human minds are applied to a problem of interpretation.</p>\n<p>Zen students say: “All things return to the one.” Once again, I have returned to software. One of my favorite <em>ones</em> for organizing and observing life&rsquo;s exposures, like Scrabble tiles. Despite the one, I&rsquo;m thinking about difference. The way the <em>one</em> refracts and playfully escapes. Our turn here will be akin to Jewish monotheism &ndash; a personal return to spiritual foundations &ndash; a spiritual tradition where the only official doctrine claims one god but there&rsquo;s no consensus about what that means.</p>\n<blockquote>\n<p>An often-cited medieval midrash asserts that each of the Israelites at Mount Sinai heart God&rsquo;s revelation differently according to their own capacity to understand it. They each had their own individual experience of the Divine. &ndash; Sarah Hurwitz, <em>Here All Along</em></p>\n</blockquote>\n<blockquote>\n<p>A long time passed but the Buddha did not open his mouth to say a single word. He then reached down, picked up a flower and, without a word, held the flower aloft. Nobody in the assembly understood what the Buddha meant by this action. Only Mahakasyapa, sitting at the far back, smiled. &ndash; Gye Mun Sunim JDPS, <em>The Birth of Zen</em></p>\n</blockquote>\n<p>But not everyone smiled!</p>\n<p>This “problem” of software:</p>\n<p>The epistemological endeavor to solve challenges in the world, happening  <em>out there</em>, with(in) reason.\nThen squeezing all that into binary logics and electrical pulses.\nHolding a shared thought among humans – sometimes only the wispy thrust of a thought – and making it instructions for the computer.</p>\n<p>Zen Master Seung Sahn used to say you have to “digest your mind meal.&quot; He meant your understanding.\nMaking software is a kind of digestion of understanding.\nPushing thought stuff through a cheese cloth named Divine.\nA streetcar named Desire.</p>\n<p>The software process is messy, from beginning to middle to end.</p>\n<p>As a Zen student, I must declare: <em>Where does the one return?</em> Software&rsquo;s interpretive act is a mix up, a Deleuzian differencing that flies a-face a unifying core concept. Software is never completed, and is not easily located anywhere in particular. Is it those words on the screen, dormant? You could print them. Is it the code as it runs, sonic or electrical (im)pulses amidst fibers, plastics, and metals. Is it what the mouse clicked? When was it conceived? Was it the idea?</p>\n<p>Not the cleanest of lines, but lines in flight.</p>\n<blockquote>\n<p>I want to argue here that the distinction between the software system and its development&ndash;that is, between the process and product&ndash;is another &ldquo;point of opacity&rdquo; of software engineering since, albeit necessary, it cannot be kept up at all times. &ndash; Federica Frabetti, <em>Software Theory</em></p>\n</blockquote>\n<p>Software is subversive to hard-dick narratives. It&rsquo;s feminist, it&rsquo;s counter-cultural in its essence. That&rsquo;s why the gate-keepers are relentless trying to wrest it away from the hacker collective with a trademark.</p>\n<p>The wisp of generative artificial intelligence hallucinatory resonance is hardly surprising.\nIt&rsquo;s a re-run run amok.\nWhere does the one return inside your stolen nebula of documents?\nNo citations, indeed.\nWhere is your mind, Algorithm?</p>\n<p>Messy. Material. Just as digestion is wont to be, from mouth mashing through shitting.\nThe physical body process is mostly obscured by our containment sacks. But it leaks. It&rsquo;s hacked.</p>\n<p>The metaphor is apt. The world is messy as it is, and software is in it, made from it, made for it. This is why the end product of the software process inspires programmers of acrimonious humor, sometimes of low emotional intelligence, or of self-deprecatedness, or simply exasperated, exhausted… these programmers must declare that which comes from the butt. “This code is crap.” “Who wrote this shit code?”</p>\n<p>It’s generally a pessimistic view to call code crap. I’d offer <em>compost</em> to lift us out of the sour sap to a  corresponding brownish, molten tree sappy substance. A brighter horizon. Effluent cream - a regenerative solar punk version. Or something like “the best with what we had.” We need less snark in the industry, more heart, don&rsquo;t you think?</p>\n<p>Thankfully (we can breath a sigh) there are loving defenders of our end products out there. (Com)posters on the Net. Rachel Kroll is one, synonymously online as <em>rachelbythebay</em>. She <a href=\"https://rachelbythebay.com/w/2013/01/23/crap/\">emancipates some lines (of code) and litigates her own “crap code” through a simulated trial judged by such an exasperated panel</a>, and then performs my favorite type of “if I knew now what I knew then” refactor blogging with a <a href=\"https://rachelbythebay.com/w/2013/01/24/oldcode/\">procedural splunk</a>. It’s a beautiful example of husbanding thought stuff a second time through.</p>\n<h1 id=\"chapter-2\">Chapter 2</h1>\n<p>Regarding playful escapings of difference.</p>\n<p>Like verbalized language, programming languages provide multiplicities for getting thoughts out. In English spoken about town, adults will be overheard in conversation to utter variations on simple themes such as bipedal <em>reversal</em>, for example, with such enriched phrases as “they <em>retraced</em> their steps”, or “they went back”, or “they returned to”. Similarly, the general purpose Ruby programming language invented by Yukihiro “Matz” Matsumoto toward the end of the last century was composed with a syntax of including many lexical pathways to express its computer instructions. Of course, while these variations may not be imbued with the rich cultural context of spoken English idioms, they demonstrate what I’ve always found to be a <em>never gets old</em> trait of modern programming languages used in heterogeneous postmodern programming environments: there is creative choice!</p>\n<p>Like English speakers, Ruby programmers will follow contextual precedence and are bounded by syntax constraints. And when going about telling a computer to execute a simple command, they can still do so in ways that delight and surprise us.</p>\n<p>Let’s say a Rubyist wants to reverse a word. In programming parlance we refer to that word as a “string” which represents any sequence of characters including letters, numbers, or symbols. Such a rubyist might reach for an implementation using &ldquo;primitive,&rdquo; “imperative” syntax constructs like a <code>while loop</code>, <code>indexed lookups</code>, and <code>string concatenation</code>. These expressions are common across different programming languages. Additionally, they yield more control and flexibility back to the programmer. To wit:</p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-ruby\" data-lang=\"ruby\">    counter_index <span style=\"color:#f92672\">=</span> original_word<span style=\"color:#f92672\">.</span>length\n    <span style=\"color:#75715e\"># create empty string to contain new reversed word</span>\n    reversed_word <span style=\"color:#f92672\">=</span> <span style=\"color:#e6db74\">&#34;&#34;</span> \n    <span style=\"color:#75715e\"># start processing reversal</span>\n    <span style=\"color:#66d9ef\">while</span> counter_index <span style=\"color:#f92672\">&gt;</span> <span style=\"color:#ae81ff\">0</span>\n      <span style=\"color:#75715e\"># decrement the counter</span>\n      counter_index <span style=\"color:#f92672\">=</span> counter_index <span style=\"color:#f92672\">-</span> <span style=\"color:#ae81ff\">1</span>\n      current_letter <span style=\"color:#f92672\">=</span> original_word<span style=\"color:#f92672\">[</span>counter_index<span style=\"color:#f92672\">]</span>\n      <span style=\"color:#75715e\"># add letter to the result</span>\n      reversed_word <span style=\"color:#f92672\">&lt;&lt;</span> current_letter\n    <span style=\"color:#66d9ef\">end</span>\n</code></pre></div><p>So that’s one option. But looping over a string is such an everyday procedure that Ruby provides conveniences to do this with less code. In place of a while loop, index references, esoteric symbols like <code>&lt;&lt;</code>, the Ruby language includes <em>higher order</em> <em>methods</em>: a bit of logic slurped behind a human-readable name. Like <code>each_char</code>, which means   “loop over each character”. And <code>prepend</code>, add something to the beginning of a string. Under the hood, Ruby implements these methods with its own primitives, likely similar to what we’ve written above. Let’s try reversal using the <code>each_char</code> method and see how it fits:</p>\n<pre><code>reversed_word = &quot;&quot;\noriginal_word.each_char do |letter|\n    # optional debuggers\n    # puts letter\n    # puts reversed\n  reversed_word.prepend(letter)\nend\n</code></pre>\n<p>This code is considered easier to read by many programmers because the method names makes the code’s intent obvious. Less code to mash in the mouth also means less information to pack into the brain’s working memory.</p>\n<p>Above we see Ruby&rsquo;s <code>do block</code> syntax in action. It creates a syntactical wrapper that logically bounds each letter in a semantically associative workspace. Somewhat different than the unhinged free jazz of a while loop block with throw-away variables.</p>\n<p>Generally, declarative methods for strings can play nice together. They can be &ldquo;chained&rdquo; together and called sequentially. This makes it easy for a Rubyist to write concisely and fit a complete reversal procedure into one line. No need for instantiating a variable. Just push the word through multiple operations down an assembly line. Programmers verbalize this into <em>one lining</em>:</p>\n<pre><code>original_word\n    .chars\n    .each_with_object(&quot;&quot;) { |index, reversed_word| reversed_word.prepend(index) }\n    .join\n</code></pre>\n<p>It&rsquo;s subtle, but there&rsquo;s actually some extra processing in the above statement by transforming the original word string back and forth from an array to feed the <code>each_with_object</code>. It&rsquo;s conceptually funky, but since the complicatedness is hidden behind the alluring veil of <code>each_with_object</code>, the statement is still pleasantly terse.</p>\n<p>Of course, who even has all this time on their hands to f*** around. Let’s just make Ruby do all the work for us:</p>\n<pre><code>original_word.reverse\n</code></pre>\n<p>Well, in reality, that quotidien commercial workplace, we often have more time. Because we need to build software to last. Which mean it&rsquo;s uncommon to see these concise computational lines of code registered into a higher order architecture of collaborators. Our reversal code becomes a member of a reversing machine &ndash; a Ruby <em>object</em> &ndash; that can receive messages for requests with commands like <code>reverse_my_word</code>:</p>\n<pre><code>class WordReverseMachine\n    def initialize(word)\n        @word = word\n    end\n\n    def reverse_my_word\n        @word.reverse\n    end\nend\n\n# Somewhere else in my system...\nWordReverseMachine.new(word).reverse_my_word\n</code></pre>\n<p>Although, maybe my <code>WordReverserMachine</code> shouldn’t be so opinionated in how it reverses things. Perhaps I want to borrow a reverse engine from other distant cyberscapes. Let&rsquo;s allow our machine to swap engines as needed:</p>\n<pre><code>class WordReverseMachine\n    def initialize(word, reverse_engine)\n        @word = word\n        @reverse_engine = reverse_engine\n    end\n\n    def reverse_my_word\n        if reverse_engine? \n            [@reverse_engine.new](http://reverse_engine.new)(@word)\n        else \n            word.reverse_my_word\n        end\n    end\n\n    def reverse_engine?\n        @reverser.nil?\n    end\nend\n\n# Somewhere else in my sytem...\nWordReverseMachine.new(word).reverse_my_word\n</code></pre>\n<p>Reversing a word is a simplistic task, which is why languages like Ruby come with a <code>reverse</code> method on all <code>String</code> objects out of the box. And yet, programmers can dream wildly different expressions as demonstrated above.</p>\n<p>Let’s take a look at the diversity of expression that unfolds from interpreting a task in a more culturally rich and relevant problem space. This is one is from an actual mess in the wild &ndash; unruly realism &ndash; where the task at hand is to look at all the products currently on sale in a restaurant website product inventory database that are not assigned to any particular menu.</p>\n<p>Ok: so imagine this shop management software lets managers add products, but wait till later to figure out what menus those products go in. After all, does a croissant go in Breakfast or Pastries? It may not be obvious at first. Splitting up the administration of products this way creates efficiency for product inventory management and menu design. Which allows for more general flexibility and adaptability of a restaurant&rsquo;s ordering experience. It lets a shop not use menus at all, or have some products in menus and some just floating on their own as standalone products.</p>\n<p>These requirements imply that software developers working with this database will need to care about querying for products in a few different ways. Let&rsquo;s play with a use case where a restaurant manager wants to display a website menu with products that are both in menus as well as a section for all other products. For example, there might be menus for Breakfast, Lunch, Dinner, and then a general list of other products under an&hellip;&ldquo;Other&rdquo; heading.</p>\n<p>The software that supports this shop management software implements this data model for relating products to menus: <code>Marketplace Products</code> have many <code>Marketplace Tags</code>, and these two data types are associated with each other through a bridge table of <code>Marketplace Product Tags</code>. This is a fairly typical way of modeling a tagging system in a Ruby on Rails project with a relational database. Here&rsquo;s what the model definitions might look like in Rails code leveraging <code>ActiveRecord</code> as an ORM:</p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-ruby\" data-lang=\"ruby\"><span style=\"color:#75715e\"># Product Model</span>\n<span style=\"color:#66d9ef\">class</span> <span style=\"color:#a6e22e\">Marketplace</span><span style=\"color:#f92672\">::</span><span style=\"color:#66d9ef\">Product</span>\n\thas_many <span style=\"color:#e6db74\">:tags</span>, <span style=\"color:#e6db74\">through</span>: <span style=\"color:#e6db74\">:product_tags</span>, <span style=\"color:#e6db74\">inverse_of</span>: <span style=\"color:#e6db74\">:products</span>\n<span style=\"color:#66d9ef\">end</span>\n\n<span style=\"color:#75715e\"># Tag Model</span>\n<span style=\"color:#66d9ef\">class</span> <span style=\"color:#a6e22e\">Marketplace</span><span style=\"color:#f92672\">::</span><span style=\"color:#66d9ef\">Tag</span>\n\thas_many <span style=\"color:#e6db74\">:product_tags</span>, <span style=\"color:#e6db74\">inverse_of</span>: <span style=\"color:#e6db74\">:tag</span>, <span style=\"color:#e6db74\">dependent</span>: <span style=\"color:#e6db74\">:destroy</span>\n  has_many <span style=\"color:#e6db74\">:products</span>, <span style=\"color:#e6db74\">through</span>: <span style=\"color:#e6db74\">:product_tags</span>, <span style=\"color:#e6db74\">inverse_of</span>: <span style=\"color:#e6db74\">:tags</span>\n\tscope <span style=\"color:#e6db74\">:menu_tag</span>, <span style=\"color:#f92672\">-&gt;</span> { where(<span style=\"color:#e6db74\">is_menu</span>: <span style=\"color:#66d9ef\">true</span>) }\n\tscope <span style=\"color:#e6db74\">:not_menu</span>, <span style=\"color:#f92672\">-&gt;</span> { where(<span style=\"color:#e6db74\">is_menu</span>: <span style=\"color:#66d9ef\">false</span>) }\n<span style=\"color:#66d9ef\">end</span>\n</code></pre></div><p>Ok: so menus, or groups of products, are formed by products sharing a <code>Marketplace Tag</code> where a special boolean field called <code>is_menu</code> is set to true on that tag.</p>\n<p>For our case, where this restaurant&rsquo;s ordering page lists both products in menus and the rest beneath an &ldquo;Other&rdquo; heading, querying the right content for our <em>others</em> is the tricky part. This system allows shop managers to tag products freely. There is no restricted set of tags, or other constraints for product and tag associations. Therefore we&rsquo;ll need to join across three different tables, <code>marketplace_products</code>, <code>marketplace_products_tags</code>, and <code>marketplace_tags</code>, and then collect <em>any</em> <code>Marketplace Products</code> where <em>none</em> of their associated <code>marketplace_tags</code> have an <code>is_menu</code> flag set to <code>TRUE</code>.</p>\n<p>Lets start the beautiful differencing!</p>\n<p>With the help of my fellow coders at Zinc Coop with whom I workshopped this problem, I&rsquo;ve cooked three ways to query our postgres database for products without a menu tag with both postgres-flavored SQL and ActiveRecord ORM. (More ways left to be discovered.)</p>\n<p>Even if you&rsquo;ve got a mature ORM like ActiveRecord at hand, it can be pragmatic to express your query in SQL so the selection logic you enshrine in code is blatantly evident. What if, for our initial cook, we code with oneness. Get the data with a single select statement. Not necessarily bravado, or premature consideration for performance characteristics just yet. Let&rsquo;s see what we can do with that generative single origin <code>select</code> start point.</p>\n<p>Mario Kart starting line count down anticipation&hellip;</p>\n<pre><code> select\n            mp.*\n        from\n            marketplace_products mp\n            full join marketplace_product_tags mpt on mpt.product_id = mp.id\n            full join marketplace_tags mt on mt.id = mpt.tag_id\n        where\n            mp.marketplace_id = '#{id}'\n        group by\n            mp.id\n        having not\n            't' = any(array_agg(mt.is_menu));\n</code></pre>\n<p>The cleverness on the last line creates a collection of boolean markers for each <code>Marketplace Product</code> &ndash; <code>t</code> or <code>f</code> &ndash; representing whether the corresponding <code>Marketplace Tag</code> is a menu tag. The resulting row would look like <code>{f, f, t, f}</code>. Moving out left from the aggregate function, a filter computation is applied against the collection for any existence of a TRUE/<code>t</code> flag. The lispy parentheticals are sleek!</p>\n<p>Thought: while the above option foregoes a subquery, I find the combination of <code>group by </code> and <code>having</code> clauses with the aggregating semantics notionally similar to a subquery insofar as we are selecting over a secondary &ldquo;view&rdquo; into the data.</p>\n<p>It&rsquo;s dawning on us: <em>getting all the products without menu tags</em> is not complex, although it may have seemed tricky at the jump. We&rsquo;re only narrowing the product result set based on a single condition, it&rsquo;s just that the condition happens to live a distance away. Let&rsquo;s try again without the single select cleverness and consider nested queries:</p>\n<pre><code>select\n    mp.*\nfrom\n    marketplace_products mp\nwhere\n\t\t mp.marketplace_id = '#{id}' AND\n    mp.id not in(\n        select\n            mp.id from marketplace_products mp\n            inner join marketplace_product_tags mpt on mpt.product_id = mp.id\n            inner join marketplace_tags mt on mt.id = mpt.tag_id\n        where\n            mt.is_menu = true);\n</code></pre>\n<p>Because we now know that this query is shallow, both wide across only a few tables, and deep with only a single subquery, let&rsquo;s see if Active Record&rsquo;s query interface can provide similar conveniences like we achieved above with Ruby in our toy string reversal fractals. As it turns out, we can one-line all that SQL!:</p>\n<pre tabindex=\"0\"><code>Marketplace::Product.where.not(id: joins(:tags).merge(Tag.where(is_menu: true)))\n</code></pre><p>This is slick, but might not be easy to come by without our previous work or deep knowledge of ActiveRecord. Our subquery version is informative for getting a mental handle on this terseness. We can reverse engineer. Notice how the entire subquery is captured in the outer parens pair. Now: the need for <code>merge</code> and passing in the <code>Tag</code> model as the argument is a bit elusive because we might expect to be able to simply <code>joins(:tags).where(is_menu: true)</code>. But this would error because Active Record would think we were applying the <code>where</code> clause to <code>Product</code> instead of <code>Tag</code>, despite chaining on the join. <code>merge</code> is a logical separator that let&rsquo;s us filter across these two relations with more discreet semantics.</p>\n<p>Refine. Refine.</p>\n<p>We can utilize the <code>is_menu</code> scope on our Tag class, hiding our <code>where(is_menu: true)</code> filter behind a shorthand that minimizes keystrokes:</p>\n<pre tabindex=\"0\"><code>Marketplace::Product.where.not(id: joins(:tags).merge(Tag.is_menu))\n</code></pre><p>Ruby on Rails scopes are a brevity blessing. You can imagine where this might be going. Adding a scope for <code>without_menu_tag</code> on Product will make querying and displaying results on our restaurant odering page a triviality. Dropping into the view layer we can grab the data and splat it into components with human-readable phrasing:</p>\n<pre tabindex=\"0\"><code>&lt;h1&gt;Other&lt;/h1&gt;\n&lt;div class=&quot;grid lg:grid-cols-3 gap-3&quot;&gt;\n  &lt;%- marketplace.products.without_menu_tag.each do |product| %&gt;\n    &lt;%= render Marketplace::Menu::ProductComponent.new(product:, cart:) %&gt;\n  &lt;%- end %&gt;\n&lt;/div&gt;\n</code></pre><p>The <code>without_menu_tag</code> scope can play well with other chainable scopes for quick prototyping and iteration for restaurant managers.</p>\n<pre tabindex=\"0\"><code>&lt;h1&gt;Other&lt;/h1&gt;\n&lt;div class=&quot;grid lg:grid-cols-3 gap-3&quot;&gt;\n  &lt;%- marketplace.products.unarchived.without_menu_tag.sort_alpha.each do |product| %&gt;\n    &lt;%= render Marketplace::Menu::ProductComponent.new(product:, cart:) %&gt;\n  &lt;%- end %&gt;\n&lt;/div&gt;\n</code></pre><p>How shitty is that?</p>\n<blockquote>\n<p>Mind meal tests your mind: do you go for the bait? If you check the Ten Gates, the ten kong-ans, does hungry mind, desire mind, not-enough-mind appear? If so, you must eat your mind meal. You must completely digest your understanding. Then finishing your mind meal is possible. Then you get enough-mind, no-hindrance mind, no I-myme mind. Enough-mind does not go for the bait, so everything is clear and you can perceive any situation in your life and kong-an clearly, and save all beings. &ndash; A DOG&rsquo;S &ldquo;WOOOF WOOF” IS BETTER THAN ZEN MASTER JOJU, <em>Only Don&rsquo;t Know</em> by Zen Master Seung Sahn</p>\n</blockquote>\n",
				
				"date_published": "2026-04-01T08:38:05-07:00",
				"url": "https://softlydeveloping.micro.blog/2026/04/01/end-products-habiting-difference.html"
			},
			{
				"id": "http://softlydeveloping.micro.blog/2026/04/01/rutabagas-vol-notes-from-the.html",
				"title": "Rutabagas vol. 4: Notes from the other week",
				"content_html": "<ol>\n<li>There are too many people to listen to out there. (Not sure why I wrote this. Was I overwhelmed by my podcast feed?)</li>\n<li>The vulnerabilities of the supply chain undo software&rsquo;s hard surface. (Also, as Thomas Depierre intones in the hurdy-gurdy of <a href=\"https://www.softwaremaxims.com/blog/not-a-supplier\">I am not a supplier</a>)</li>\n<li>These first two things are about overwhelm, not being able to squeeze the gestalt in your fingers.</li>\n<li>My body is a wispy cloud all this content flows through.</li>\n<li>Ambient women.</li>\n<li>Shze-Hui  Tjoa&rsquo;s remarks from <a href=\"https://tinhouse.com/transcript/between-the-covers-shze-hui-tjoa-interivew/\">Between the Covers</a>:</li>\n</ol>\n<blockquote>\n<p>Well, I don’t want to generalize but for me, certainly I feel like fiction and non-fiction feel like they’re the same thing a lot of the time because as you said, for me, my experience of the world incorporates a lot of fiction and if I were to try and tell somebody what it feels like to be me, the most authentic thing to do would be to also tell them about the many fantasies I have in my head and that I’m brewing up all the time, sometimes without my own control or without consciously trying to do it. But they’re always there like a parallel stream of thought that’s happening in my head.</p>\n</blockquote>\n",
				
				"date_published": "2026-04-01T08:34:20-07:00",
				"url": "https://softlydeveloping.micro.blog/2026/04/01/rutabagas-vol-notes-from-the.html"
			},
			{
				"id": "http://softlydeveloping.micro.blog/2026/03/31/senior-engineering-make-things-happen.html",
				
				"content_html": "<p>Senior engineering: make things happen in the margin.</p>\n",
				
				"date_published": "2026-03-31T20:46:12-07:00",
				"url": "https://softlydeveloping.micro.blog/2026/03/31/senior-engineering-make-things-happen.html"
			},
			{
				"id": "http://softlydeveloping.micro.blog/2026/03/09/morning-forage.html",
				"title": "morning forage 202603091628",
				"content_html": "<h2 id=\"long-form\">Long form</h2>\n<ul>\n<li>✈️ <a href=\"https://americanlibrariesmagazine.org/2026/03/02/airport-libraries-take-off/\">Airport Libraries Take Off | American Libraries Magazine</a></li>\n<li>📦 <a href=\"https://zipcodefirst.com/\">ZIP Code First</a></li>\n<li>🤖 <a href=\"https://dotart.blog/cobbles/ai-and-that-guy-at-the-bar\">AI and that Guy at the bar — cobbles</a></li>\n<li>🤖 <a href=\"https://sbgeoaiphd.github.io/rotating_the_space/posture\">Amplifiers of Epistemic Posture | rotating_the_space</a></li>\n<li>🤖 <a href=\"https://stackoverflow.blog/2024/12/31/generative-ai-is-not-going-to-build-your-engineering-team-for-you/\">Generative AI is not going to build your engineering team for you - Stack Overflow</a></li>\n</ul>\n<h2 id=\"fedi-maybe-links-to-long-form\">Fedi (maybe links to long form)</h2>\n<ul>\n<li>😜 <a href=\"https://mastodon.social/@DS90210/116197063833389137\">Deep Space 90210: &ldquo;1 Miles O&rsquo;Brien is worth 1.6 K…&rdquo; - Mastodon</a></li>\n<li>👩‍🚀 <a href=\"https://mastodon.social/@GeePawHill/116197098330912913\">GeePawHill: &ldquo;Oh! I still have a little bit of time in #Internationalwomensday, don&rsquo;t I? Some of the <em>great</em> sf/f writers are/were women.&rdquo; - Mastodon</a></li>\n<li>🔤 <a href=\"https://mastodon.social/@ChrisPirillo/116190380761042358\">Chris Pirillo: I just spent the last 24 hours building&hellip; a free tool to create your very own handwriting font quickly within the browser (no logins, all local processing): </a></li>\n<li>🤠 <a href=\"https://beige.party/@OddJob/116191337420390609\">Dude: Cowboy Beepboop</a></li>\n<li>👾 <a href=\"https://mastodon.social/@Migueldeicaza/116177892634272296\">We are doomed</a></li>\n<li>🤯 <a href=\"https://social.coop/@copiesofcopies/116170677394801206\">Aaron Williamson: &ldquo;Because I was reminded this week that the etymology of “Matrix” is not widely known…&rdquo; - social.coop</a></li>\n<li>🤔 <a href=\"https://social.coop/@clayton/116171582660162093\">Clayton Dewey: &ldquo;This looks really compelling, is anyone here in the fediverse using web monetization? If so  how is it going? &quot; - social.coop</a></li>\n<li>🤖 <a href=\"https://hachyderm.io/@thomasfuchs/116131730279249940\">Being Left Behind Enjoyer: None of the &ldquo;code generation&rdquo; stuff is new by the way.</a></li>\n<li>🧠 <a href=\"https://social.coop/@nicol/116132206663179271\">Nicol Wistreich: &ldquo;How many people know that #WordPress was co-founded by a black man, Mike Little?&rdquo; - social.coop</a></li>\n<li>🤔 <a href=\"https://social.anoxinon.de/@Codeberg/116130571929793372\">Codeberg: &ldquo;The first thing that people see when visiting codeberg.org is the following: &ldquo;Software development, but free!&rdquo;&rdquo; - social.anoxinon.de - Mastodon</a></li>\n<li>🤖 <a href=\"https://mastodon.social/@baofinity/116126496096785198\">Baofinity: &ldquo;Firefox Ai kill switch is here…&rdquo; - Mastodon</a></li>\n<li>🤖 <a href=\"https://tldr.nettime.org/@tante/116125471985644426\">tante: &ldquo;The Times New Resistance font is a work of art.&rdquo; - tldr.nettime</a></li>\n<li>🙂‍↕️ <a href=\"https://indieweb.social/@jaredwhite/116104963217763125\">Jared White (ResistanceNet ✊): &ldquo;Somehow (most) software engineering culture in the past came to realize that in many cases you can&rsquo;t simply throw more warm bodies at the problems and solve them faster.&rdquo; - Indieweb.Social</a></li>\n<li>🙂‍↕️ <a href=\"https://cosocial.ca/@mhoye/116100193371749156\">mhoye: &ldquo;Once you realize it’s not “age verification”, but actually “identity verification”, then it’s easy to understand that the real goal is “papers, please” for the entire internet.&rdquo; - CoSocial</a></li>\n<li>🧛 <a href=\"https://mastodon.social/@mydadisdracula/116193893029515996\">My Dad is Dracula (and a Cursor)</a></li>\n<li>🧬 <a href=\"https://lemmy.world/post/43883347\">Self Host Personal Health Record (PHR) - Lemmy.World</a></li>\n<li>😭 <a href=\"https://mastodon.social/@GeePawHill/116129976624712032\">GeePawHill: And so but anyway, did I ever tell you about my most humiliating experience as a skilled and successful computer programmer?</a></li>\n<li>🙅‍♂️ <a href=\"https://hachyderm.io/@norootcause/116111801522632496\">Lorin Hochstein: Accidentally missing a scope for a query, resulting system behavior is &ldquo;match everything&rdquo;, with disastrous consequences. another entry in a never-ending series.</a></li>\n<li>😮 <a href=\"https://henshaw.social/@jon/116089772455782028\">Jon Henshaw: &ldquo;This site shows what modern CSS can do.&rdquo; - Henshaw Social</a></li>\n<li>🆒 <a href=\"https://masto.ai/@teacherbuknoy/116091468302896876\">Francis (is looking for work): &ldquo;Just came across one of the best #CSS talks I&rsquo;ve seen in a while.&rdquo; - Mastodon</a></li>\n<li>🫰 <a href=\"https://fosstodon.org/@eclecticpassions/116092045725002832\">Naty: &ldquo;I have been looking at different small web directories lately and joined a few (some pending).&rdquo; - Fosstodon</a></li>\n</ul>\n",
				
				"date_published": "2026-03-09T16:42:30-07:00",
				"url": "https://softlydeveloping.micro.blog/2026/03/09/morning-forage.html"
			},
			{
				"id": "http://softlydeveloping.micro.blog/2026/02/16/morning-forage.html",
				"title": "Morning forage: 1771268135",
				"content_html": "<ul>\n<li>🦺 <a href=\"https://unsung.aresluna.org/molly-guard-in-reverse/\">Molly guard in reverse – Unsung</a></li>\n<li>🤝 <a href=\"https://anytype.io/\">Anytype — A safe haven for digital collaboration</a></li>\n<li>🤖 <a href=\"https://www.developerway.com/posts/debugging-with-ai\">Debugging with AI: Can It Replace an Experienced Developer?</a></li>\n<li>🪏 <a href=\"https://shovel.js.org/blog/introducing-shovel/\">Shovel | Introducing Shovel</a></li>\n<li>🦾 <a href=\"https://shud.in/thoughts/build-bulletproof-react-components\">Building Bulletproof React Components - Shu Ding</a></li>\n<li>🦻 <a href=\"https://eli.li/screen-readers\">Oatmeal - Screen readers</a></li>\n<li>🧱 <a href=\"https://www.sanity.io/blog/the-logo-soup-problem\">The logo soup problem (and how to solve it) | Sanity</a></li>\n</ul>\n",
				
				"date_published": "2026-02-16T12:52:08-07:00",
				"url": "https://softlydeveloping.micro.blog/2026/02/16/morning-forage.html"
			},
			{
				"id": "http://softlydeveloping.micro.blog/2025/10/22/a-detailed-summary-of-technical.html",
				"title": "A detailed summary of technical work I delivered for HistoryPin.org, a project of Shift Collective",
				"content_html": "<p>At the start of 2025 I embarked on a rewrite of HistoryPin.org for Shift Collective, an Exygy Client and important place on the web where communities self-determine their stories. After being impressed with Cursor&rsquo;s ability to create a meaningful contribution <a href=\"https://internetross.space/2025/10/22/a-detailed-summary-of-technical.html\">summary</a> gleaned from the git commit history for SF&rsquo;s Our415.org code, I let Cursor loose again. Strung together, these terse paragraphs form a pretty reasonable narrativization of my work on the rewrite. Although some categories of features are bundled a little funky &ndash; like &ldquo;Development Workflow &amp; Maintenance.&rdquo; PR descriptions collapse together to the point of omission, spurred by my instruction to &ldquo;briefly summarize.&rdquo; Then there&rsquo;s hardly mention of the test harnessing I established with pytest, FactoryBoy, and playwright. That said, the breadth and depth of my impression on the project still feels substantial. In 9 months I drove the rewrite from greenfield to the wholesome organized entropy of near feature parity, and am proud of what I achieved with no (significant) previous experience in greenfield projects of this scope, the Django framework, or python programming. Infra, schema, frontend, backend, test harness, devx &ndash; these parts were me and I was these parts.</p>\n<h2 id=\"collection-management-amp-customization-features\">Collection Management &amp; Customization Features</h2>\n<p>You&rsquo;ve been instrumental in building out a comprehensive <strong>collection customization system</strong>. You added support for <strong>nested collections</strong> with an <code>is_nestable</code> field and updated forms to create collections within existing ones, leveraging query parameters for navigation. You implemented <strong>collection banner functionality</strong> including video URLs and image uploads using Django&rsquo;s form utilities, along with <strong>sponsor logos</strong> with ManyToMany relationships and dropzone file uploads. You also added <strong>background color customization</strong> and <strong>visibility toggling</strong> for various collection fields, with proper permissions management for paid features.</p>\n<h2 id=\"user-account-management-amp-security\">User Account Management &amp; Security</h2>\n<p>You implemented a complete <strong>account deletion system</strong> with proper cascade deletion starting from the user level, including form templating and view logic to handle both self-deletion and superuser deletion scenarios. You also worked on <strong>username logic</strong> for members, ensuring proper username creation through Google social login adapters and migrating routes to use member primary keys instead of usernames.</p>\n<h2 id=\"search-amp-discovery-functionality\">Search &amp; Discovery Functionality</h2>\n<p>You built out <strong>member search capabilities</strong> by refactoring code to support a <code>MembersDiscovery</code> view with query parameter handling similar to collection searching. You implemented <strong>collection theme searching</strong> with support for multiple theme selections using comma-separated query parameters, including proper database indexing with Gin indexes for array operations. You also added <strong>location searching support</strong> to the <code>DiscoverCollectionView</code> with Google Place ID integration and location autocomplete functionality.</p>\n<h2 id=\"form-architecture-amp-data-handling\">Form Architecture &amp; Data Handling</h2>\n<p>You made significant improvements to <strong>form handling patterns</strong> by refactoring complex relationship management during form submission, moving more logic to model form handlers to avoid overlapping operations between views and forms. You implemented <strong>tag support for collections</strong> using Django Taggit, enabling thematic tag filters and creating reusable <code>TagCombobox</code> components. You also added proper <strong>permissions management</strong> for paid features, ensuring correct access controls for members and collection owners.</p>\n<h2 id=\"database-amp-performance-optimization\">Database &amp; Performance Optimization</h2>\n<p>Your work included several <strong>database optimizations</strong> including adding indexes on <code>featured</code> columns for Collections and Members, implementing Gin indexes for array searching, and optimizing deletion queries using cascades. You also worked on <strong>image handling improvements</strong>, fixing conditions that allowed setting empty pin images and implementing proper image optimization.</p>\n<h2 id=\"uiux-enhancements\">UI/UX Enhancements</h2>\n<p>You implemented <strong>responsive design patterns</strong> using CSS queries and inline JavaScript to manage UI state, particularly for collection customization forms. You created <strong>reusable components</strong> like the <code>TagCombobox</code> that can be used for both Pins and Collections. You also worked on <strong>template refactoring</strong> to separate page containers from list rendering logic, making the codebase more maintainable.</p>\n<h2 id=\"development-workflow-amp-maintenance\">Development Workflow &amp; Maintenance</h2>\n<p>You contributed to <strong>development experience improvements</strong> by adding seeds to database reset processes, creating new ADRs (Architecture Decision Records) addressing testing and form logic, and implementing script loading optimizations with <code>defer</code> and <code>DOMContentLoaded</code> to prevent blocking the critical path.</p>\n<h2 id=\"paid-features-amp-monetization\">Paid Features &amp; Monetization</h2>\n<p>You worked on <strong>paid feature integration</strong> by refactoring the Donation Block toggling to use generic relationships, removing confusing admin configurations in favor of seed scripts, and implementing CSS-based show/hide functionality for donation input fields based on toggle states.</p>\n<h2 id=\"code-quality-amp-architecture\">Code Quality &amp; Architecture</h2>\n<p>Your contributions emphasized <strong>better separation of concerns</strong> and <strong>reusable component design</strong>. You refactored paid features to use generic relations, created more maintainable form handling patterns, and implemented proper permission checks by comparing evaluated object IDs. You also worked on <strong>template organization</strong> to make paginated lists more flexible and reusable.</p>\n<p>Overall, your contributions demonstrate a strong focus on <strong>user experience</strong>, <strong>data management</strong>, <strong>search functionality</strong>, and <strong>maintainable architecture</strong>. You&rsquo;ve been particularly effective at building complex features like collection customization and search/discovery systems while maintaining code quality and implementing proper security measures.</p>\n",
				
				"date_published": "2025-10-22T15:25:25-07:00",
				"url": "https://softlydeveloping.micro.blog/2025/10/22/a-detailed-summary-of-technical.html",
				"tags": ["habiting the net"]
			},
			{
				"id": "http://softlydeveloping.micro.blog/2025/10/22/142146.html",
				"title": "A detailed summary of technical work I delivered for San Francisco's public benefits portal Our415.org",
				"content_html": "<p>In the fall of 2024 I joined the Consulting division of Exygy, an agency that delivers web tech solutions for civic and non-profit organizations. My very first assignment was getting a project of the Deparment of Youth and Families &ndash;  Our415.org &ndash; launch-ready. Having a direct impact on families in SF was a very rad proposition, being a resident myself. Bringing a project home that&rsquo;s close to home.</p>\n<p>In short time I completed a gaggle of technical work on Our415.org&rsquo;s legacy React codebase, which had been forked from a similar benefits portal called the SF Service Guide. While pondering how I might proudly tell the tale of my work for the city to would-be interested parties like my mom or recruiters, I realized I might enlist the help of an LLM. Might Claude be able to make sense of all those commits? I don&rsquo;t remember the exact instructions I put in the prompt, something like &ldquo;go to <the repo link> and briefly summarize all the commits by author @rosschapman&rdquo;. Cursor did not disappoint. It output the well-organized summations you see below, clearly extrapolating from my own characterizations of the work gleaned from commit messages and PR descriptions. And then enhancing with brand-marketing expletives.</p>\n<p>What surprised me most about these commits-cum-words, is the volume of accumulated work that is reflected back. It&rsquo;s a lesson in the sheer mass of meaningful impressions a senior software engineer can have on a project&rsquo;s formation in short time. And, perhaps, equally revelatory of how much we downplay our steady stream of achievements  during a project&rsquo;s speed-run to launch. To me this feels like a valuable narrativization of the private lives and material impact of senior engineers that is often relegated to archive, work diaries, 1:1 notes, as stakeholders and end-users merely avail themselves to the gestalt of these parts in production. To shouting the minutiae from the rooftops!</p>\n<h2 id=\"development-infrastructure-amp-workflow-improvements\">Development Infrastructure &amp; Workflow Improvements</h2>\n<p>You were a key contributor to modernizing the development process. You implemented <strong>pre-commit hooks</strong> using Husky and lint-staged to catch lint errors before CI, significantly reducing build failures. You established <strong>Jest testing infrastructure</strong> with React Testing Library, migrating existing tests and setting up a proper testing foundation. You also configured <strong>Dependabot</strong> for automated dependency management and updated the target branch to <code>development</code> for better workflow integration.</p>\n<h2 id=\"performance-optimization-amp-bundle-management\">Performance Optimization &amp; Bundle Management</h2>\n<p>Your work focused heavily on <strong>bundle size reduction</strong> and <strong>dependency optimization</strong>. You reduced the lodash dependency burden by approximately 50% by switching to modular lodash functions instead of loading the entire bundle. You used tools like <code>npx knip</code> to identify and remove unused dependencies and components, including ShelterTech auth code, unused Homepage components, and WeGlot translation service code that wasn&rsquo;t being used.</p>\n<h2 id=\"search-amp-map-functionality-fixes\">Search &amp; Map Functionality Fixes</h2>\n<p>You addressed several critical bugs in the search and mapping functionality. You fixed <strong>incorrect marker location labels</strong> by properly moving marker label computation logic into the new transform. You resolved <strong>incorrect map markers on pages &gt; 1</strong> by establishing a new <code>TransformedSearchHit</code> view type/model that provides a canonical representation of search data with proper typing. You also removed algorithmic sorting of search results by urgency that was specific to SF Service Guide and not needed for the MVP.</p>\n<h2 id=\"uiux-enhancements-amp-navigation\">UI/UX Enhancements &amp; Navigation</h2>\n<p>You implemented significant <strong>navigation improvements</strong> including a new header navigation system and secondary navigation bar for listing pages. You created a <code>SecondaryNavigationLayout</code> component with <code>BackNavigation</code> functionality that uses smart routing. You also decoupled <code>SiteSearch</code> from <code>Navigation</code> and established conventions for wrapping route-level page components with secondary nav bars, including distinct mobile and desktop layouts.</p>\n<h2 id=\"data-handling-amp-error-resilience\">Data Handling &amp; Error Resilience</h2>\n<p>You improved <strong>data handling</strong> by adding proper null case handling for <code>service.long_description</code> and implementing optional lookups for missing image data to prevent page failures. You updated the homepage query to fetch <code>calendar_event</code> data and fixed date/time rendering issues. You also refactored Event/Opp card components to accommodate new <code>calendar_event</code> data from Strapi.</p>\n<h2 id=\"code-quality-amp-architecture\">Code Quality &amp; Architecture</h2>\n<p>Your contributions emphasized <strong>better component architecture</strong> and <strong>separation of concerns</strong>. You extracted the <code>SearchResult</code> component from <code>SearchResults</code> to reduce complexity and colliding terminology. You removed whitelabeling and tenant code, renaming <code>whiteLabel</code> to <code>websiteConfig</code> for clearer naming conventions. You also cleaned up old test cruft and established better naming conventions for search and map-related variables.</p>\n<h2 id=\"internationalization-amp-translation\">Internationalization &amp; Translation</h2>\n<p>You worked on <strong>translation functionality</strong> by fixing Google Translate language switching issues and removing unused WeGlot translation service code. You also removed algorithmic sorting that was specific to certain tenants and not needed for the current implementation.</p>\n<h2 id=\"development-experience\">Development Experience</h2>\n<p>You contributed to <strong>developer experience improvements</strong> by adding VSCode gitignore directives and creating pull request templates. You also worked on removing technical debt and unused code that was causing confusion and maintenance overhead.</p>\n<h2 id=\"production-amp-deployment\">Production &amp; Deployment</h2>\n<p>You updated the <strong>production build workflow</strong> with Strapi keys and worked on various fixes that required backend coordination, such as updating frontend queries to match deployed backend changes.</p>\n<p>Overall, your contributions demonstrate a strong focus on <strong>code quality</strong>, <strong>performance optimization</strong>, <strong>user experience improvements</strong>, and <strong>maintainable architecture</strong>. You&rsquo;ve been particularly effective at identifying and addressing technical debt while implementing modern development practices and fixing complex bugs in the search and mapping functionality.</the></p>\n",
				
				"date_published": "2025-10-22T14:21:46-07:00",
				"url": "https://softlydeveloping.micro.blog/2025/10/22/142146.html",
				"tags": ["habiting the net"]
			},
			{
				"id": "http://softlydeveloping.micro.blog/2024/04/16/how-to-read-a-hacker.html",
				"title": "How to read A Hacker Manifesto",
				"content_html": "<p>McKenzie Warks' <strong>A Hacker Manifesto</strong> is so <strong>bergizi</strong> (this wonderful lexical utterance meaning nutrient stuffed in standard Indonesian). So I skipped to the end notes, sue me; reading ass backwards might be the trick here. Or, if your prefer to expect the unexpected, spin a bottle to choose an entry point. Once you make progress, make sure to reprint and scatter the individuated sections that you&rsquo;ve read and then affix them to posts along Triton&rsquo;s surface.</p>\n<p>&ldquo;A free yet not merely random productivity&rdquo;: this sentence gets me thinking about open source collaborations.</p>\n<img src=\"https://internetross.space/uploads/2023/bateson-end-note-hacker-manifesto.jpg\" alt=\"End note on Gregory Bateson from McKenzie Warks' A Hacker Manifesto\">\n",
				
				"date_published": "2024-04-16T14:45:51-07:00",
				"url": "https://softlydeveloping.micro.blog/2024/04/16/how-to-read-a-hacker.html",
				"tags": ["poetry"]
			},
			{
				"id": "http://softlydeveloping.micro.blog/2023/12/22/my-sparse-margin-note-couplet.html",
				"title": "My sparse margin note couplet from Jon Bentley's Programming Pearls, also bit of a book review, and a whole ass",
				"content_html": "<img src=\"https://internetross.space/uploads/2023/batman-year-one-im-fine.png\" title=\"batman-year-one-im-fine.png\" alt=\"comic frame of Batman on top of a man who says 'I'm Fine'\" border=\"0\" width=\"598\" height=\"278\">\n<img src=\"https://internetross.space/uploads/2023/programming-pearls.png\" alt=\"keyboard laying on top of an oyster shell and a pearl necklace\" title=\"programming-pearls.png\" border=\"0\" width=\"599\" height=\"567\">\n<pre tabindex=\"0\"><code>In 2015 I bought this book.    \n7, or 8 years ago.    \nYear one into my software career.   \nThis book is canon.   \nI've had little use for its studies of algorithms. # thus far, see below     \nI don't think Bentley would be offended.    \nFirst sentence: &quot;Computer programming has many faces.&quot;    \n</code></pre><p>I&rsquo;m sure I glanced at its pages before entering the corporate interview gauntlet to get in the vigilante mood. To shake out the shoulders, find some relaxment, whilst staring down a twenty two minute treadmill run or pile of laundry Sunday evening. You must to armor up for the algos in the kingdom of men.</p>\n<p>While Bentley&rsquo;s pearls are the type of polished wisdom earned through real life experience we get on the job, this book never became the vade mecum for my quotidian affairs. Is it for others? What comes after Part I was too metallic for an early-career front-end Rails dev.</p>\n<p>Yet, the book can be pragmatic for all ages &ndash; see <em>3.2 Form-Letter Programming!</em>. The  fantastic headings are pedagogically caring. It is sensually satiated with geeked thoroughness. The cases are actually well-situated within the real-world: Bentley spoils you with further readings and sidebars, journalistic first-hand-accounts that remind you of how the metal has been worked over by a person&rsquo;s hands.</p>\n<p>It reminds you that software is not lonely, which is important.</p>\n<p>But beware: there&rsquo;s a modest amount of myth-making for his contemporaries and mentors. And yet, they are the most honest plagiarisms. Yes/and: he&rsquo;s humbler than many. (Perhaps it is worth another pass now that I have more years in the rear view).</p>\n<p>I am a visual learner and thinker: logical word-problems were always a pain. In recent years I tend to reach for Bhargava&rsquo;s <em>Grokking Algorithms</em> for a refresher on binary search or walking trees. It has cute pictures. It&rsquo;s stacked next to other faves like <em>Land of Lisp</em> and <em>Why&rsquo;s (Poignant) Guide to Ruby</em>.</p>\n<p>Hmmm (thinking emoji, I will not look you in the eye as I cock my head buried in thoughts). After all, the solstice konmari of my bookshelf &ndash; which I thought would elicit a reflection on some forgotten paper taking up space &ndash; has become the discovery of lost treasure. And yet, I&rsquo;m still tickled by the scant amount of notes taken. I can&rsquo;t read without a pen. Perhaps we&rsquo;re time-traveling, then.</p>\n<pre tabindex=\"0\"><code>It's year one. \nYoung Rails dev. \nHe makes only two liner notes in a book considered staple grocery. \nI don't remember if I even read the whole thing. \nI bet I got through Part 1's wider lens, then started to gloss over.\n</code></pre><p>One note is an exaggerated check mark next to this <em>principle</em> listed on p29 (Second Edition, published 2000):</p>\n<p>&gt; Rework repeated code into arrays. A long stretch of similar code is often best expressed by the simplest of data structures, the array.</p>\n<p>With &ldquo;the array&rdquo; also underlined from the outer left edge of the &ldquo;t&rdquo; to the outer right edge of the last &ldquo;a.&rdquo;</p>\n<p>This one has stuck. Arrays, especially <em><a href=\"https://en.wikipedia.org/wiki/Associative_array#Ordered_dictionary\">maps</a></em>, can be more durable when staring down change. Before long any thoughtful software developer will realize that the components of a software system will become ordered and/or multiple.</p>\n<p>There is no lonely software.</p>\n<p>Data, whether as scalar, &ldquo;bags&rdquo; of properties, even subroutines and processes, even the manual lever pulling human tasks must be sequenced, serial, bound, reversed, indexed, sorted. The maintenance cost of housing data in ordered collections is generally low.</p>\n<pre tabindex=\"0\"><code>[&lt;anything&gt;, &lt;anything&gt;] \n</code></pre><p>Whole ass languages, like Clojure, were designed to favor ordered, associative arrays. As I learned after finding Hickey&rsquo;s seminal talk <em>Simple Made Easy</em>. Richly simple and luxurious as Hockney&rsquo;s bathers.</p>\n<img src=\"https://internetross.space/uploads/2023/hockney-sunbather.jpg\" alt=\"hockney's sunbather painting\" title=\"hockney-sunbather.jpg\" border=\"0\" width=\"600\" height=\"598\">\n<p>A second mark: a vertical line next to the opener for section <em>12.2 One Solution</em>. This was (yet another moment in my lifetime) I learned that we never have to go it alone when staring down the void of what we&rsquo;re building next:</p>\n<p>&gt; As soon as we settled on the problem to be solved, I ran to my nearest copy of Knuth&rsquo;s <em>Seminumerical Algorithms</em> (having copies of Knuth&rsquo;s three volumes both at home and at work has been well worth the investment).</p>\n<p>This has also stuck, reified after seasons.</anything></anything></p>\n",
				
				"date_published": "2023-12-22T19:53:23-07:00",
				"url": "https://softlydeveloping.micro.blog/2023/12/22/my-sparse-margin-note-couplet.html",
				"tags": ["speculative nonfiction"]
			},
			{
				"id": "http://softlydeveloping.micro.blog/2023/12/15/rutabagas-vol-the-softest-ware.html",
				"title": "Rutabagas Vol. 3: The Softest Ware: Is",
				"content_html": "<ol>\n<li>\n<p>What are probably <a href=\"https://surfingcomplexity.blog/2023/12/10/human-error-means-they-dont-understand-how-the-system-worked/\">appropriate attacks</a> on assigning calamity to the hand-wavy concept of &ldquo;human error&rdquo;. Lorin strengthens his theory that human error <a href=\"https://surfingcomplexity.blog/2022/05/30/imagine-theres-no-human-error/\">probably doesn&rsquo;t exist</a> by considering complex, fault-tolerant systems like Amazon S3 incapable of receiving &ldquo;human error&rdquo; as apology or eulogy when there&rsquo;s a hard drive failure.</p>\n</li>\n<li>\n<p>WHAT. Secret guerrilla human rights interventions  by the artist collective GALA Committee <a href=\"https://slate.com/culture/2023/12/melrose-place-abortion-art-gala-committee-mel-chin.html\">on Melrose fucking Place</a>.</p>\n</li>\n</ol>\n<p>&gt; For three years, as the denizens of the Melrose Place apartment complex loved, lost, and betrayed one another, the GALA Committee smuggled subversive leftist art onto the set, experimenting with the relationship between art, artist, and spectator. The collective hid its work in plain sight and operated in secrecy. Outside of a select few insiders, no one—including Aaron Spelling, Melrose’s legendary executive producer—knew what it was doing.</p>\n<ol start=\"3\">\n<li>There are widely acknowledged &ldquo;hard things&rdquo; in software development, but the pith used to describe them usually falls short or flat for me. But <a href=\"https://hachyderm.io/@jenniferplusplus/111335805604859458\">in less than 100 words</a> <a href=\"https://hachyderm.io/@jenniferplusplus\">jenniferplusplus</a> achieves serious depth:</li>\n</ol>\n<p>&gt; It&rsquo;s a little bit shitposty, but it&rsquo;s 100% true. People think cache invalidation is hard because it has no right answer, so it&rsquo;s a question of iterating until you get a right-enough answer.</p>\n<p>&gt; People think naming things is hard because it&rsquo;s about communicating with each other.</p>\n<p>&gt; People don&rsquo;t even think about managing dependencies. It&rsquo;s invisible. It&rsquo;s about cooperating across time and organizations to do maintenance chores. It&rsquo;s so hard and so unglamorous that people can&rsquo;t even see it.</p>\n<p>What&rsquo;s important to observe here is (the appropriate, warranted, overlooked) framing of these software problems as <em>social problems</em>, not logical puzzles or struggles with language and framework semantics. Even cache invalidation, despite being a requirement in nearly any useful application that nearly every developer must address, escapes a general solution &ndash; meaning developers must continuously arrive at socially acceptable,  technically sufficient solutions &ndash; but not total &ndash; as the seasons change and the desires of forces  and actors in the system change. There is always more than one person at large in negotiating the solution, if even only a developer and a single someone using the software.</p>\n<ol start=\"4\">\n<li>jenniferplusplus again, but <a href=\"https://jenniferplusplus.com/losing-the-imitation-game/#programming-as-theory-building\">this time</a> bringing Peter Naur&rsquo;s lasting insights into the AI  conversation: <em>programming is theory building</em>. Software developers are quickly discovering the usefulness of LLMs trained on code to assist in some of their more menial daily work &ndash; especially when working with common constructs (languages, frameworks) that are personally unfamiliar &ndash; but it&rsquo;s hard to imagine LLMs <em>replacing</em> the core intellectual work which requires <em>understanding</em>: like the socially syrupy hardness they discuss in the above toot. Although we might imagine a generative computer program giving semi-useful suggestions for the complex|complicated|sophisticated|confusing real-world development scenarios if trained on the correct historical inputs for that milieu; and if you were stuck in a vacuum somewhere without recourse to more senior colleagues who possess similar tokens of guidance to steer you toward the right away to handle background jobs (without such an exhaustive cataloging as you&rsquo;ll see ChatGPT 3.5 vomit below):</li>\n</ol>\n<pre><code>\nHandling background jobs is a common requirement in software development, especially in scenarios where certain tasks need to be executed asynchronously or in the background to avoid blocking the main application thread. There are various ways to handle background jobs, and the choice often depends on the specific requirements and the technology stack being used. Here are some common approaches:\n\nTask Queues:\n\nMessage Queues: Use message queuing systems like RabbitMQ, Apache Kafka, or Redis to enqueue and dequeue tasks. Popular libraries for this approach include Celery (Python), Sidekiq (Ruby), and Resque (Ruby).\nJob Queues: Platforms like AWS Simple Queue Service (SQS) or Google Cloud Tasks can be utilized to manage queues of tasks.\nAsynchronous Programming:\n\nAsync/Await: In languages that support asynchronous programming (e.g., Python with asyncio, JavaScript with Node.js), you can use async/await to perform tasks concurrently without blocking the main thread.\nMultithreading/Multiprocessing: Use threads or processes to run background tasks concurrently with the main application. Be cautious with shared resources and synchronization.\nBackground Job Processing Frameworks:\n\nDelayed Job Processing: Libraries like Sidekiq, Delayed Job (Ruby), or Hangfire (.NET) allow you to schedule and execute background jobs at a specified time or after a certain delay.\nJob Scheduler: Tools like cron (Unix/Linux) or Windows Task Scheduler (Windows) can be used to schedule recurring background jobs.\nServerless Computing:\n\nFunctions as a Service (FaaS): Platforms like AWS Lambda, Azure Functions, or Google Cloud Functions enable you to run individual functions in the cloud without managing the underlying infrastructure.\nDatabase-backed Queues:\n\nDatabase Queues: Store tasks in a database table and have worker processes periodically check for and process these tasks. This approach can use a library like Active Job (Ruby on Rails) or Hangfire (C#).\nContainer Orchestration:\n\nKubernetes: Container orchestration platforms like Kubernetes can be used to deploy and manage background job processing containers.\nJob Management Services:\n\nJob Management Platforms: Use specialized services like Jenkins, CircleCI, or GitLab CI/CD for scheduling and executing background jobs.\nWebhooks and Event-Driven Architectures:\n\nEvent-Driven: Design your system as an event-driven architecture, where background tasks are triggered by events. Webhooks can be used to notify the system of events.\nChoose the approach that aligns with your application's architecture, scalability requirements, and the specific nature of the background tasks you need to handle. Keep in mind factors such as reliability, scalability, and ease of maintenance when making your decision.\n</code></pre>\n<p>Quoting Nauru&rsquo;s seminal vintage  paper (1985, the year my brother was born):</p>\n<p>&gt; The fundamental task of software development is not writing out the syntax that will execute a program. The task is to build a mental model of that complex system, make sense of it, and manage it over time.</p>\n<ol start=\"5\">\n<li>Another <a href=\"https://gts.superseriousbusiness.org/@dumpsterqueer/statuses/01HGN5KKZJKTWKGJP13F11EJ25\">entry</a> from <a href=\"https://gts.superseriousbusiness.org/@dumpsterqueer\">tobi</a> on the contempt culture of software engineers. (Where <em>does</em> this come from?)</li>\n</ol>\n<p>&gt; So anyway this post is both a big &ldquo;thank you&rdquo; to the many nerds who are chill and easygoing and joyful, and an exhortation to others to free yourself of contemptuous, competitive attitudes, and re-embrace the intellectual curiosity that presumably once brought you into programming in the first place.</p>\n",
				
				"date_published": "2023-12-15T11:12:28-07:00",
				"url": "https://softlydeveloping.micro.blog/2023/12/15/rutabagas-vol-the-softest-ware.html",
				"tags": ["rutabagas"]
			},
			{
				"id": "http://softlydeveloping.micro.blog/2023/11/28/rutabagas-vol-japan-transform-museums.html",
				"title": "Rutabagas: Vol. 2: Japan transform , museums saving the web, c apitalism makes software bad again, and more",
				"content_html": "<ol>\n<li>Aaron Straup Cope&rsquo;s <a href=\"https://www.aaronland.info/weblog/2023/11/11/therapy/#wishful\">talk notes</a> for <em>Wishful Thinking</em></li>\n</ol>\n<img src=\"https://internetross.space/uploads/2023/postcard-finnaire-sud-aviation-caravelle-1970s-sfo-museum.jpg\" alt=\"postcard finnaire Sud Aviation Caravelle 1970s sfo museum\" title=\"postcard-finnaire-Sud-Aviation-Caravelle-1970s-sfo-museum.jpg\" border=\"0\" width=\"600\" height=\"390\">\n<p>VIBES.</p>\n<p>I read this post a few days ago and have since wandered through the hyperlinks to his other stuff. It&rsquo;s clear that for some time Cope has been baking thoughts about the <em>cultural heritage sector</em> and its responsibility - &ldquo;relationship&rdquo; - to engage with emerging &ldquo;virtualization&rdquo; technologies and the techno-capitalist system.</p>\n<p>(As I&rsquo;m learning: he&rsquo;s been committed to the web writ large, you can see it through numerous cyber- and hyper- textual projects playing freely in the &ldquo;network of patient documents&rdquo;; his own delightful euphemism. In these projects he goes deep for the web&rsquo;s inherent nature of democratic, atemporal revisiting and recall.&quot; &ldquo;<em>That access to recall is what makes the Network special to me.</em>&rdquo; At first blush, these are not impossible conservationisms. As he says: &ldquo;The point is not that our relationship with technology should end with the web.&rdquo;</p>\n<p>Reminds me of Avdi Grimm&rsquo;s discussion of conservation:</p>\n<p>&gt; &ldquo;Healthy growth starts where it is, and both builds on <em>and</em> repurposes what came before. No clean slates, but also no bans on knocking down walls.&rdquo;</p>\n<p>Cope has chosen not to wave the white flag, and fends off the grievings, misgivings, and saudade of laments <a href=\"https://www.aaronland.info/weblog/2014/09/11/brand/#dconstruct\">starting a decade ago</a>.</p>\n<p>&gt; We managed to build a lot of cool shit on the back of 56Kb modems. We built a lot of cool shit – including entire communities – on top of a technical infrastructure that is a pale shadow of what we have available to us today. We know how to do this.</p>\n<p>)</p>\n<p>Cope is saying: <a href=\"https://pluralistic.net/2023/11/13/this-is-for-everyone/#revisiting\">The (open) web is good, actually</a>. Which is what Cory Doctorow picked up and so it found it&rsquo;s way into my inbox.</p>\n<p>In Cope&rsquo;s newer account at hand from the <a href=\"https://mcn.edu/annual-conference/mcn-2023/\">2023 Museum Computer Network conference</a>, we get these thoughts reapplied to emerging virtualization technologies, VR, AR, particularly the &ldquo;so called &lsquo;metaverse&rsquo;&rdquo; (the name scare-quoted out of exasperation, maybe?). He wants to remind us that we&rsquo;re not done with the web yet.</p>\n<p>At the outset, Cope moves quickly to invoke a reminder about the museum&rsquo;s networked power - it&rsquo;s webiness; at the same time its implication in the network of patient documents:</p>\n<p>&gt; &hellip;the practice of revisiting is the bedrock of the humanities. Revisiting is what distinguishes entertainment from culture.</p>\n<p>The decade+-long struggle continues. We must understand how our bargains with techno-capital hegemony (apps, ad-driven social networks) deepens the threat against ideas (I&rsquo;d add emotions, evolutions, revolutions) flourishing outside the corporate fence. What Cope describes as &ldquo;time to warm up to ideas.&rdquo;</p>\n<p>I&rsquo;m game. And Oh! The cultural heritage sector seems a perfect backdrop to wrestle with the threats of new tech. The material threats are lived: even pragmatically, the museum can not, may not, should not be able to afford the costs of bug-eye headsets and visors. The larger scheme is almost dialectic, smooth: the plunder and seizure of open-access-egress <em>recall power</em> while the cats keep entertaining my eyeballs. While Facebook&rsquo;s controlled metering of power to content creators (colonial policemen) transforms cultural value from something that moves freely across past and future, geography; that&rsquo;s cheap, abundant; that&rsquo;s allowed to take root&hellip;organically (for lack of a better term): transforms into something judged too quickly, cast away, spent, ephemeral. (Remember, DIGITAL != EPHEMERAL). Prepping us for some greedy end, like recording everything we see because Cambridge Analytica and genocide, and&hellip; He says:</p>\n<p>&gt; Namely that if you publish something online – whether it&rsquo;s a selfie, a &ldquo;hot take&rdquo;, an essay or a multi-year project; anything really – and it is not immediately successful or viral then it was a waste of time and effort. It was not worth doing.</p>\n<p>&gt; Which is insane. It is insane because that&rsquo;s not how ideas take root.</p>\n<p>&gt; It takes people time to warm up to ideas, especially new or challenging ideas, if only because we are busy just juggling the ideas and beliefs we already hold with the complexities of our lives in relation to one another.</p>\n<p>&gt; It is also hard not to understand this idea as a deliberate of attempt to gaslight the web and everything that makes the web important.</p>\n<p>Later..</p>\n<p>&gt; We would do well to understand the web not just as a notch in the linear progression of technological advancement but, in historical terms, as an unexpected gift with the ability to change the order of things; a gift that merits being protected, preserved and promoted both internally and externally.</p>\n<p>On time-traveling temporality, from back in <a href=\"https://www.aaronland.info/weblog/2014/09/11/brand/#dconstruct:\">www.aaronland.info/weblog/20&hellip;</a></p>\n<p>&gt; The web gave us the ability to return to a thing outside the shared (or master) narrative at a time of one&rsquo;s own choosing. Of shifting time in the service of one&rsquo;s own interest or in the service of simply coming to an understanding of one&rsquo;s own interests.</p>\n<ol start=\"2\">\n<li>\n<p><a href=\"https://www.theguardian.com/environment/2023/nov/14/lost-to-the-climate-crisis-japan-haiku-poets\">Japan’s haiku poets lost for words as climate crisis disrupts seasons</a></p>\n</li>\n<li>\n<p><a href=\"https://martinfowler.com/articles/ship-show-ask.html\">Ship/Show/Ask</a>: More often than not web dev shops I&rsquo;ve worked in are weighted toward the &ldquo;Ask&rdquo; strategy because of blanket policies. So even in cases where a team had reached a degree of trust that would allow for releasing with &ldquo;Ship&rdquo; or &ldquo;Show&rdquo; there were mechanical bulwarks in place. For example, physical restrictions to self-merge a Github Pull Request.</p>\n</li>\n<li>\n<p>It&rsquo;s amazing what a small amount of imagination + green can do to the built world. In Japan, the Federation of Landscape Contractors holds a contest each year for best-looking garden on the back of a pickup truck. <a href=\"https://mastodon.social/@docpop/111477704098189414\">Some winners</a>.</p>\n</li>\n<li>\n<p>Having worked tangentially to direct patient care in the health tech biz building industrial pharmacy software, these insights about how bad healthcare software can be resonate. <a href=\"https://cohost.org/mononcqc/post/3647311-paper-you-want-my-p\">Paper: You want my password or a dead patient?</a>. Good summary with pull quotes from Fred Herbert from a short draft paper.</p>\n</li>\n</ol>\n",
				
				"date_published": "2023-11-28T18:18:29-07:00",
				"url": "https://softlydeveloping.micro.blog/2023/11/28/rutabagas-vol-japan-transform-museums.html",
				"tags": ["rutabagas"]
			},
			{
				"id": "http://softlydeveloping.micro.blog/2023/11/28/rutabagas-vol-careful-with-octavia.html",
				"title": "Rutabagas: Vol. 1: Careful with Octavia Butler, the Sex Forest Movement, Nat King Cole Sampler, and of course tech doomsayers",
				"content_html": "<p>Originally posted as a micro website at <code>https://ross-rutabagas.neocities.org/</code>. Rutabagas are now sprouting here when the time is right. Volume 1 includes &ldquo;found dates&rdquo; &ndash; but later volumes will be less temporally registered (I think).</p>\n<p>(Why &ldquo;Rutabagas&rdquo;? This was Zee&rsquo;s fault when he extemporaneously blurted &ldquo;Ross' Rutabagas&rdquo; as a fake shop name to stand in for an example during a Zinc Coop ensemble sesh.)</p>\n<ol>\n    <li>\n<p>10/06/23 - <a href=\"https://www.reddit.com/r/JazzPiano/comments/112ysm6/nat_king_cole_appreciation_post/\">[r/Jazz]\n    Nat King Cole Appreciation Post</a> &amp; <a href=\"https://www.reddit.com/r/Jazz/comments/7nysng/nat_king_cole_piano_recordings/\">[r/Jazz]\n    Nat King Cole Piano Recordings</a></p>\n    <p>When you need to deep dive into the influential piano playing of\n    Nat King Cole that influenced greats like Oscar Peterson.</p>\n</li>\n    <li>\n<p>10/02/23 - <a href=\"https://thenewinquiry.com/make-the-golf-course-a-public-sex-forest/\">Make\n    the Golf Course a Public Sex Forest!: An excerpt</a> by Anna Aguiar\n    Kosicki</p>\n<pre><code>&lt;p&gt;Discovered via Sophie Lewis’ &lt;a href=&quot;https://www.patreon.com/posts/repro-utopian-11-89509663&quot;&gt;Patreon&lt;/a&gt;.\nBook ordered!&lt;/p&gt;\n</code></pre>\n</li>\n    <li><p>09/25/23 - <a href=\"https://neil-clarke.com/block-the-bots-that-feed-ai-models-by-scraping-your-website/\">Block\n    the Bots that Feed “AI” Models by Scraping Your Website</a> by Neil\n    Clarke</p></li>\n    <li>\n<p>09/25/23 - <a href=\"https://jomc.substack.com/p/the-unreal-writer\">The Unreal\n    Writer</a> by Joanne McNeil</p>\n\t\t<p>Discovered via my mastodon feed, shared by Betsy Haibel: </p>\n    <blockquote>\n<p>“This is happening with Octavia Butler in real time. Her daring and the moral\n    complexity of her characters is swept away in recent assessments to\n    create a coherent legacy—that of an earth mother tote bag\n    caricature-icon. This is reading authors as flap copy, accessing the\n    top layer of the writing, and refusing to convene with the messy\n    human elements in the work. What are their books—any books—even for,\n    other than for us to approach as humans, wandering around with their\n    words and experience the extraordinary workings of another human’s\n    mind?</p>\n    <p>The snobbery against science fiction in the past and today’s\n    cartoon icons of some of its weirdest authors comes from the same\n    root: an establishment that doesn’t know how to read or appreciate\n    it. The establishment needs the work digestible as buzzy fragments.\n    The feral elements in what are now science fiction classics—the\n    originality and experimentation—isn’t legible to them; which means\n    even the most famous authors, when you encounter the work on your\n    own, are likely to surprise you. Their mysteries as authors remain\n    mysteries and to a more generous reader—that mystery is exactly what\n    hooks you.”</p>\n    </blockquote>\n</li>\n    <li><p>09/24/23 - <a href=\"https://pluralistic.net/2023/09/22/vin-locking/#thought-differently\">Apple\n    fucked us on right to repair (again): “Parts-pairing” is a scam</a>\n    by Cory Doctorow</p></li>\n    <li><p>09/24/23 - 🎧 <a href=\"https://truthout.org/audio/bizarre-and-dangerous-utopian-ideology-has-quietly-taken-hold-of-tech-world/\">Bizarre\n    and Dangerous Utopian Ideology Has Quietly Taken Hold of Tech\n    World</a> by Kelly Hayes</p></li>\n    </ol>\n",
				
				"date_published": "2023-11-28T14:23:14-07:00",
				"url": "https://softlydeveloping.micro.blog/2023/11/28/rutabagas-vol-careful-with-octavia.html",
				"tags": ["rutabagas"]
			},
			{
				"id": "http://softlydeveloping.micro.blog/2023/11/20/but-night-software-is-not.html",
				
				"content_html": "<p>&gt; But night software is not like that. It’s not written for the day job. It’s not written to see the light of day at all. It’s not written to be looked at and scrutinized by anybody. It’s intimate and personal, it’s messy and buggy. To take a look is to transgress.</p>\n<p>Boundary cross. Sex.</p>\n<p>From a small heap software that helps make software. By way of <a href=\"https://merveilles.town/@neauoire/111416145594833059%20\">Devine Lu Linvega</a></p>\n",
				
				"date_published": "2023-11-20T22:18:04-07:00",
				"url": "https://softlydeveloping.micro.blog/2023/11/20/but-night-software-is-not.html",
				"tags": ["speculative nonfiction"]
			},
			{
				"id": "http://softlydeveloping.micro.blog/2023/11/20/dei-grieving-and-ai-skepticism.html",
				"title": "DEI Grieving and AI Skepticism",
				"content_html": "<p>IYKYK DEI in tech is all but dead. If you&rsquo;re an outsider, it&rsquo;s important to understand that employee-led efforts to make workplaces less racist &ndash; which began in earnest at the onset of the Obama years &ndash; have been steadily blotted out since Trump. The Tech aristocracy has decided to abandon DEI budgets along with other workplace perks. As @betsythemuffin notes (in the thread I&rsquo;ll be referencing below):</p>\n<p>&gt; DEI is <em>seen</em> by a sizable chunk of the funder class as an allowable luxury to keep the peons happy.</p>\n<p>It has been tragically hard to swallow this defeat. @betsythemuffin again:</p>\n<p>&gt;Regret that we didn&rsquo;t do more to build material power when we had the chance.</p>\n<p>And yet, as the movement has regrouped and recentered to reposition the struggle, some have begun to take note of a problematic adaptation in the techy left&rsquo;s rhetoric. @danilo started a thread on Mastodon that points out a new-born form of absolutist skepticism for emerging <em>technologies</em> &ndash; notably AI (of course). Regardless of why the left slips into what @glyph calls a problem of &ldquo;semasiology&rdquo; around the term &ldquo;AI&rdquo;, point is, the hurt seems to be cutting so deep that the movement has retreated into an unproductive preservationism.</p>\n<p>&gt; The abject and understandably heartbreaking defeat of DEI-type progress in tech has moved most leftist critique of the space into a technological conservatism built on denialist, magical thinking.</p>\n<p>&gt; You can’t successfully advocate for a dead end when the other side is investing in roads that lead to helpful places.</p>\n<p>&gt; You can’t win against technologies people find useful by pretending they aren’t useful.</p>\n<p>Check out the rest of the <a href=\"https://hachyderm.io/@danilo/111439397005424457\">conversation</a>. There are smart people in here thinking through this &ldquo;AI&rdquo; moment. The underlying question seems to be how we can continue the fight without completely disavowing what might be practical revolutions borne out by this albeit early phase of &ldquo;AI&rdquo; that is &ldquo;finally bearing serious fruit.&rdquo;</p>\n<p>If you&rsquo;re wondering on what side of the line I fall, my major beef with the LLMs is their wanton extractive consumption of human labor  <em>without citation</em> or, god forbid, <em>recompense</em>. Of course, a time honored tradition of slave traders and capitalists. Here is Marc Andreesen with a recent plea written to the US copyright office, hopeful we can just all ignore this blatant theft for the common good of the funder class. This is <a href=\"https://www.businessinsider.com/marc-andreessen-horowitz-ai-copyright-2023-11\">class warfare</a>:</p>\n<p>&gt; Imposing the cost of actual or potential copyright liability on the creators of AI models will either kill or significantly hamper their development.</p>\n<p>I hold that citation is feminist since it combats the authoritative mansplain that obscures collaboration, hardens selfhood, and hoards ideas. Ergo I consider the de-linkified, referent vacuum of effluvium produced by ChatGPT et al as patriarchal in its presentation of &ldquo;knowledge&rdquo; and preoccupation with mastery. I&rsquo;m scare quoting because philosophically I&rsquo;m confused about what this content even <em>is</em>, so unhinged. Although I recognize that the interplay of this text with the reader and their investigative context does produce meaning.</p>\n<p>UPDATE (minutes after the writing the above): heh, Danilo actually expounds generously about the left&rsquo;s false critique of AI in a <a href=\"https://redeem-tomorrow.com/the-average-ai-criticism-has-gotten-lazy-and-thats-dangerous\">long-form piece</a> on his blog.</p>\n",
				
				"date_published": "2023-11-20T21:32:12-07:00",
				"url": "https://softlydeveloping.micro.blog/2023/11/20/dei-grieving-and-ai-skepticism.html",
				"tags": ["speculative nonfiction"]
			},
			{
				"id": "http://softlydeveloping.micro.blog/2023/11/10/lament-for-tafteria-sailing-the.html",
				"title": "Lament for Tafteria: sailing the Apollo's docs",
				"content_html": "<img src=\"https://internetross.space/uploads/2023/the-hospital-ship-martin-bax.png\" alt=\"The hospital ship martin bax\" title=\"the-hospital-ship-martin-bax.png\" border=\"0\" width=\"386\" height=\"600\">\n<p>Documentation, naming things. Hard. Let&rsquo;s see this hardness compound at the intersection of these two phenomena in the real world.</p>\n<p>I&rsquo;m casually scanning the Apollo docs, reading up on subscriptions because my wife is writing graphql client code at work. (I had vague memories of how we worked with distributed event streaming at my last job. NestJS + Kafka. We had consolidated apis into a graphql layer, but worked with Kafka event streams through Nest with the <code>kafka-js</code> lib as a bridge. Point is, I wanted a light refreshment of how this stuff works.).</p>\n<p>It&rsquo;s a frustrating moment to jump between these two pieces of the documentation. (This is supposed to be a <em>mature framework</em> (sobbing, <em>why can&rsquo;t we have nice things</em>)). From <a href=\"https://www.apollographql.com/docs/react/data/subscriptions/#2-initialize-a-graphqlwslink\">2. Initialize a GraphQLWsLink</a> to <a href=\"https://www.apollographql.com/docs/apollo-server/data/subscriptions/#enabling-subscriptions\">Enabling subscriptions</a>.</p>\n<p>The former section, which walks us through client setup, provides a callout with a detour into the server docs for grabbing the connection <em>url</em> we need for configuring and instantiating our web socket linkage.</p>\n<p>&gt; Replace the value of the url option with your GraphQL server&rsquo;s subscription-specific WebSocket endpoint. If you&rsquo;re using Apollo Server, see Setting a subscription endpoint.</p>\n<p>If we are using Apollo&rsquo;s server, then we must pass a <code>url</code> property when creating and instantiating the  <code>GraphQLWsLink</code> object .</p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-ts\" data-lang=\"ts\"><span style=\"color:#66d9ef\">const</span> <span style=\"color:#a6e22e\">wsLink</span> <span style=\"color:#f92672\">=</span> <span style=\"color:#66d9ef\">new</span> <span style=\"color:#a6e22e\">GraphQLWsLink</span>(<span style=\"color:#a6e22e\">createClient</span>({\n  <span style=\"color:#a6e22e\">url</span><span style=\"color:#f92672\">:</span> <span style=\"color:#e6db74\">&#39;ws://localhost:4000/subscriptions&#39;</span>,\n}));\n</code></pre></div><p>HOWEVER, once we hyperlink to the server docs one simply cannot find &ndash; throughout the entire web document &ndash; a mention of &ldquo;endpoint.&rdquo; We&rsquo;re dropped into a section called &ldquo;Enabliing subscriptions&rdquo; &ndash; instruction for setting up the server side bits.</p>\n<p>Let down. Expectations missed. Problematic asymmetry, lack of consistency!</p>\n<p>Repletely kerfuffled, my synapses delivering a reminiscence of Tom Benner&rsquo;s big bird bound <em>Naming Things</em>, and his chapter on Consistency. (This so happens to be one of my favorite dogmas of Better Naming™️.) Well, the Apollo docs demonstrate a similar symptom of bad <em>naming</em>, just like the kinds of bad examples we oft find in code. Join me in considering disparate, hyperlinked documents as analogs to components of a software program that exchange messages. Readers of these texts suffer the bad naming with familiar  symptoms: frustration. Capitalists lose the most with anemic productivity.</p>\n<p>If the hyperlink is a documentation document-as-component api/interface, us readers should be allowed to charismatically move back and forth without being flung out from our flow state like starships intercepted in warp. Perhaps the doc could send me to a subsection of &ldquo;Enabling Subscriptions&rdquo; titled/anchored with &ldquo;Server endpoint&rdquo; (or the like). My instinct is that there&rsquo;s a deeper scoop here.</p>\n<p>Of course, there&rsquo;s an imperfect system to blame. When Trevor Scheer <a href=\"https://github.com/apollographql/apollo-server/commit/f04cb2f1f251f1bc9d82ad395fd520d951c4c0c4\">removed all mention</a> of &ldquo;endpoint&rdquo; in the docs update preparing users for Apollo Server version 3 back in 2021 &ndash; Apollo Server would no longer include inherent support for websocket protocols &ndash; how closely did he collaborate with Stephen Barlow who <a href=\"https://github.com/apollographql/apollo-client/commit/fbd4c253883504553ca41a080bf9d85c7dc6ed21\">initially committed</a> the instructions referencing endpoints a year or so before. Do the people matter? (They do.) And from under whatever constraints they perform these literary efforts. We can wonder, imagine, daydream about the socio-technical system that produces docs for clients and servers, and how the basic capabilities of the web link them together. The bounded contexts. The challenges of producing universal languages, ubiquitous terms across what likely are two disparate teams.</p>\n<p>There are some leaky abstractions, but it&rsquo;s not a total system failure.</p>\n<p>I&rsquo;m reading Bax.</p>\n<p>Dispatches, bulletins, papers, pinned up, spewed about The Hospital Ship.</p>\n<p>Page 15: <em>A chronic shortage of pins to fix up the reports, so that in consequence they blrew away and anyone in the stern of the ship could reach out a hand and collect bulletins from the air as they drifted by in an endless paper-chase over the stern of the boat and on into the sea.\n</em></p>\n<p>Page 98: <em>Did the programmers hope to attract some reply? The <code>Hopeful</code> did not know what replay to make so they transmitted their call signal only, but there was no response.</em></p>\n<p>Euan wants to blame Tafteria, too bad.</p>\n",
				
				"date_published": "2023-11-10T13:26:04-07:00",
				"url": "https://softlydeveloping.micro.blog/2023/11/10/lament-for-tafteria-sailing-the.html",
				"tags": ["speculative nonfiction"]
			},
			{
				"id": "http://softlydeveloping.micro.blog/2023/10/31/clojure-was-small-typescript-is.html",
				"title": "Clojure was small, TypeScript is big (thinking w/ Dan Vanderkam)",
				"content_html": "<img src=\"https://internetross.space/uploads/2023/midnight-endless-summer.jpg\" alt=\"Midnight endless summer\" title=\"midnight-endless-summer.jpg\" border=\"0\" width=\"600\" height=\"600\">\n<p>The dangers of <em>premature optimization</em> are well understood among software engineers who&rsquo;ve been frustrated by the secondary effects of code that end up compounding maintenance cost. (Does this principle play out in other milieu?).</p>\n<p>Nonetheless, there are times when optimizations are demonstrably beneficial but are difficult to implement because of system-wide or social dynamics that can&rsquo;t or won&rsquo;t accept the optimizations. Here I&rsquo;m thinking with Dan Vanderkam&rsquo;s post from back in September: <a href=\"https://effectivetypescript.com/2023/09/27/closure-compiler/\">The Saga of the Closure Compiler, and Why TypeScript Won</a>.</p>\n<p>Skipping gingerly back through through recent web and computing history, Dan discusses the now obvious demise of Google&rsquo;s Closure compiler, which at the time enjoyed merits of technical achievements in optimization. During it&rsquo;s development in the early aughts, the hardware of the time demanded Closure&rsquo;s designers focus on minification. Dan argues that contemporary typed projects, like Typescript, won&rsquo;t succeed beyond the range of Closure&rsquo;s niche usage on advancements in performance. Typescript must be built with consideration ever-increasingly diversifying ecosystem of tool chains and environments within which it can and will be run. Such as right alongside plain ole dynamically-typed JS in mixed types/non-typed codebases.  Despite the heroic campaigns of developers to slap types on everything &ndash;  see the <code>DefinitelyTyped</code> repo &ndash; the JavaScript multi-verse offers no real guarantees that imports will be typed or not. TypeScripts declared horizon of</p>\n<p>&gt; Be a cross-platform development tool</p>\n<p>must be joined by</p>\n<p>&gt; Emit clean, idiomatic, recognizable JavaScript code</p>\n<p>and further qualified by the <em>non-goal</em> of</p>\n<p>&gt; Aggressively optimize the runtime performance of programs. Instead, emit idiomatic JavaScript code that plays well with the performance characteristics of runtime platforms.</p>\n<p>I wonder how many TypeScript developers have looked at the <a href=\"https://github.com/microsoft/TypeScript/wiki/TypeScript-Design-Goals#non-goals\">TypeScript Design Goals</a>? Not to call out/in, just curious.</p>\n<p>I wonder, the Midnight&rsquo;s 2016 <em>Endless Summer</em>. Saxophone crying out from the other room.</p>\n",
				
				"date_published": "2023-10-31T11:42:32-07:00",
				"url": "https://softlydeveloping.micro.blog/2023/10/31/clojure-was-small-typescript-is.html",
				"tags": ["speculative nonfiction"]
			},
			{
				"id": "http://softlydeveloping.micro.blog/2023/10/30/language-ergonomic-studies-possession-ruby.html",
				"title": "Language ergonomic studies: Possession: Ruby, JavaScript, D/s, Mycology",
				"content_html": "<img src=\"https://internetross.space/uploads/2023/flair-anniston.png\">\n<p>There exist happy little clouds of coincidence when studying new languages. And not just across the computer ones, mind you!</p>\n<p>Ruby and Indonesian share a frugal brevity and disinterest in flairs of punctuation when managing possession.</p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-txt\" data-lang=\"txt\">Itu bukuku.\n</code></pre></div><p>vs</p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-txt\" data-lang=\"txt\">That&#39;s my book.\n</code></pre></div><p>And&hellip;</p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-ruby\" data-lang=\"ruby\">me <span style=\"color:#f92672\">=</span> <span style=\"color:#66d9ef\">Person</span><span style=\"color:#f92672\">.</span>find(my_user_id)\nmy_books <span style=\"color:#f92672\">=</span> me<span style=\"color:#f92672\">.</span>books\n</code></pre></div><p>vs</p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-js\" data-lang=\"js\"><span style=\"color:#66d9ef\">const</span> <span style=\"color:#a6e22e\">me</span> <span style=\"color:#f92672\">=</span> <span style=\"color:#66d9ef\">await</span> <span style=\"color:#a6e22e\">prisma</span>.<span style=\"color:#a6e22e\">user</span>.<span style=\"color:#a6e22e\">findUnique</span>({ \n\t<span style=\"color:#a6e22e\">where</span><span style=\"color:#f92672\">:</span> { \n\t\t<span style=\"color:#a6e22e\">id</span><span style=\"color:#f92672\">:</span> <span style=\"color:#ae81ff\">99</span>, \n\t}, \n\t<span style=\"color:#a6e22e\">include</span><span style=\"color:#f92672\">:</span> { \n\t\t<span style=\"color:#a6e22e\">books</span><span style=\"color:#f92672\">:</span> <span style=\"color:#66d9ef\">true</span> \n\t} \n});\n<span style=\"color:#a6e22e\">myBooks</span> <span style=\"color:#f92672\">=</span> <span style=\"color:#a6e22e\">me</span>.<span style=\"color:#a6e22e\">books</span>;\n</code></pre></div><p>Well, Rails AR query syntax vs Prisma (NodeJS). (Also, did I do a useful interpretation of linguistic <em>possession</em> in a soft coding expression??)</p>\n<p>This isn&rsquo;t YAOFJS (Yet Another Opprobrium for JS). I don&rsquo;t have a quarrel with English, either. Although I find it often fairly dull when it&rsquo;s not rescued by the reticulations of regional and immigrant (forced or free) anastomosis of the tongue and mouth (and whatever other maneuvers contribut to nudging the Queen&rsquo;s own verbage (I&rsquo;ve forgotten if there is anything before a body without organs, how is it done???)) that take root in everyday speech.</p>\n<p>Only a mere 30 pages (of 250) into <em>Make the Golf Course a Public Sex Forest</em> and you run headlong into Raechel Anne Jolie&rsquo;s musings on D/s, mushrooms, and mouths. There&rsquo;s probably something here to dwell on with respect to power, colonialism, oral sex, entangelment, Dulcinea Pitagora&rsquo;s &ldquo;subspace&rdquo; in BDSM play (ohhh, wonderful that this term wasn&rsquo;t entirely pre-figured by Roddenberry&rsquo;s universe expanse), etc&hellip;</p>\n<p>Cue Butler&rsquo;s <em>Xenogenesis</em>, ringing in my ears.</p>\n",
				
				"date_published": "2023-10-30T12:40:21-07:00",
				"url": "https://softlydeveloping.micro.blog/2023/10/30/language-ergonomic-studies-possession-ruby.html",
				"tags": ["speculative nonfiction"]
			},
			{
				"id": "http://softlydeveloping.micro.blog/2023/10/25/language-ergonomic-studies-brevity-fetish.html",
				"title": "Language ergonomic studies: Brevity fetish with Ruby",
				"content_html": "<p>Matz giving us many ways to do things.</p>\n<p>&gt; I want to make Ruby users free. I want to give them the freedom to choose. People are different.</p>\n<p>From:</p>\n<p>🔗 <a href=\"https://www.artima.com/articles/the-philosophy-of-ruby\">The Philosophy of Ruby: A Conversation with Yukihiro Matsumoto, Part I</a></p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-ruby\" data-lang=\"ruby\"><span style=\"color:#66d9ef\">def</span> <span style=\"color:#a6e22e\">two_lowest</span>(numbers)\n  numbers<span style=\"color:#f92672\">.</span>min(<span style=\"color:#ae81ff\">2</span>)<span style=\"color:#f92672\">.</span>sum\n<span style=\"color:#66d9ef\">end</span>\n</code></pre></div><p>Enumerable methods that can receive an operator as symbol. Glacial autumn breeze whipped up from the 101. I don&rsquo;t have a brevity fetish, like I know many of you do. Or the tendency to place the one-liner upon the highest of pedestal. It&rsquo;s the obvious natural-language-style readability of the Ruby here that is simply remarkable.</p>\n<p>Achieving this is possible in JavaScript with more fanfare. But, alas, the maintenance cost of dressing up our array in Ruby&rsquo;s fast casual couture.</p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-js\" data-lang=\"js\"><span style=\"color:#66d9ef\">class</span> <span style=\"color:#a6e22e\">NumberArray</span> {\n  <span style=\"color:#a6e22e\">constructor</span>(<span style=\"color:#a6e22e\">numbers</span>) {\n    <span style=\"color:#66d9ef\">this</span>.<span style=\"color:#a6e22e\">value</span> <span style=\"color:#f92672\">=</span> <span style=\"color:#a6e22e\">numbers</span>;\n  }\n\n  <span style=\"color:#a6e22e\">min</span>(<span style=\"color:#a6e22e\">n</span>) {\n\t<span style=\"color:#66d9ef\">function</span> <span style=\"color:#a6e22e\">compareNumbers</span>(<span style=\"color:#a6e22e\">a</span>, <span style=\"color:#a6e22e\">b</span>) {\n\t  <span style=\"color:#66d9ef\">return</span> <span style=\"color:#a6e22e\">a</span> <span style=\"color:#f92672\">-</span> <span style=\"color:#a6e22e\">b</span>\n   }\n   <span style=\"color:#66d9ef\">this</span>.<span style=\"color:#a6e22e\">value</span> <span style=\"color:#f92672\">=</span> <span style=\"color:#66d9ef\">this</span>.<span style=\"color:#a6e22e\">value</span>.<span style=\"color:#a6e22e\">sort</span>(<span style=\"color:#a6e22e\">compareNumbers</span>).<span style=\"color:#a6e22e\">slice</span>(<span style=\"color:#ae81ff\">0</span>, <span style=\"color:#a6e22e\">n</span>);\n   <span style=\"color:#66d9ef\">return</span> <span style=\"color:#66d9ef\">this</span>;\n  }\n\n  <span style=\"color:#a6e22e\">sum</span>() {\n\t<span style=\"color:#66d9ef\">function</span> <span style=\"color:#a6e22e\">add</span>(<span style=\"color:#a6e22e\">a</span>, <span style=\"color:#a6e22e\">b</span>) {\n     <span style=\"color:#66d9ef\">return</span> <span style=\"color:#a6e22e\">a</span> <span style=\"color:#f92672\">+</span> <span style=\"color:#a6e22e\">b</span>\n\t}\n    <span style=\"color:#66d9ef\">return</span> <span style=\"color:#66d9ef\">this</span>.<span style=\"color:#a6e22e\">value</span>.<span style=\"color:#a6e22e\">reduce</span>(<span style=\"color:#a6e22e\">add</span>, <span style=\"color:#ae81ff\">0</span>);\n  }\n}\n\n<span style=\"color:#66d9ef\">function</span> <span style=\"color:#a6e22e\">twoLowest</span>(<span style=\"color:#a6e22e\">numbers</span>) {\n  <span style=\"color:#66d9ef\">return</span> <span style=\"color:#66d9ef\">new</span> <span style=\"color:#a6e22e\">NumberArray</span>(<span style=\"color:#a6e22e\">numbers</span>).<span style=\"color:#a6e22e\">min</span>(<span style=\"color:#ae81ff\">2</span>).<span style=\"color:#a6e22e\">sum</span>();\n}\n\n</code></pre></div>",
				
				"date_published": "2023-10-25T13:54:02-07:00",
				"url": "https://softlydeveloping.micro.blog/2023/10/25/language-ergonomic-studies-brevity-fetish.html",
				"tags": ["habiting the net"]
			},
			{
				"id": "http://softlydeveloping.micro.blog/2023/10/25/rspec-vs-js-let-vs.html",
				"title": "Rspec vs js, let vs let",
				"content_html": "<p>Have you noticed that comprehension arrives more quickly when reading comparison pieces that juxtapose the syntaxes, rules, and shibboleths of two programming languages. Steve Hicks' article <em>What JavaScript Tests Could Learn From RSpec</em> is one such example.</p>\n<p>My preference when writing tests is to keep re-assigning and re-using variables to a minimum. Localize them as close to the assertions as possible. Beware of cross-contamination. Pollination. Sexual interops.</p>\n<p>Recreating a lazy-evaluated <code>let</code>-style block in JS, Hicks performs some clever scoping  gymnastics which makes me nervous. The declarations of <code>calculator</code>, <code>first</code>, and <code>second</code> feel visually and temporally far-flung from usage.</p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-js\" data-lang=\"js\"><span style=\"color:#a6e22e\">describe</span>(<span style=\"color:#e6db74\">&#34;Calculator&#34;</span>, () <span style=\"color:#f92672\">=&amp;</span><span style=\"color:#a6e22e\">gt</span>; {\n  <span style=\"color:#66d9ef\">let</span> <span style=\"color:#a6e22e\">calculator</span>\n  <span style=\"color:#a6e22e\">beforeEach</span>(() <span style=\"color:#f92672\">=&amp;</span><span style=\"color:#a6e22e\">gt</span>; { <span style=\"color:#a6e22e\">calculator</span> <span style=\"color:#f92672\">=</span> <span style=\"color:#66d9ef\">new</span> <span style=\"color:#a6e22e\">Calculator</span>() })\n\n  <span style=\"color:#a6e22e\">describe</span>(<span style=\"color:#e6db74\">&#34;.multiply&#34;</span>, () <span style=\"color:#f92672\">=&amp;</span><span style=\"color:#a6e22e\">gt</span>; {\n    <span style=\"color:#66d9ef\">let</span> <span style=\"color:#a6e22e\">first</span>, <span style=\"color:#a6e22e\">second</span>\n    <span style=\"color:#66d9ef\">function</span> <span style=\"color:#a6e22e\">getResult</span>() {\n      <span style=\"color:#66d9ef\">return</span> <span style=\"color:#a6e22e\">calculator</span>.<span style=\"color:#a6e22e\">multiply</span>(<span style=\"color:#a6e22e\">first</span>, <span style=\"color:#a6e22e\">second</span>)\n    }\n\n    <span style=\"color:#a6e22e\">describe</span>(<span style=\"color:#e6db74\">&#34;when the first value is negative&#34;</span>, () <span style=\"color:#f92672\">=&amp;</span><span style=\"color:#a6e22e\">gt</span>; {\n      <span style=\"color:#a6e22e\">beforeEach</span>(() <span style=\"color:#f92672\">=&amp;</span><span style=\"color:#a6e22e\">gt</span>; { <span style=\"color:#a6e22e\">first</span> <span style=\"color:#f92672\">=</span> <span style=\"color:#f92672\">-</span><span style=\"color:#ae81ff\">1</span> })\n\n      <span style=\"color:#a6e22e\">describe</span>(<span style=\"color:#e6db74\">&#34;when the second value is negative&#34;</span>, () <span style=\"color:#f92672\">=&amp;</span><span style=\"color:#a6e22e\">gt</span>; {\n        <span style=\"color:#a6e22e\">beforeEach</span>(() <span style=\"color:#f92672\">=&amp;</span><span style=\"color:#a6e22e\">gt</span>; { <span style=\"color:#a6e22e\">second</span> <span style=\"color:#f92672\">=</span> <span style=\"color:#f92672\">-</span><span style=\"color:#ae81ff\">3</span> })\n\n        <span style=\"color:#a6e22e\">it</span>(<span style=\"color:#e6db74\">&#34;returns a positive number&#34;</span>, () <span style=\"color:#f92672\">=&amp;</span><span style=\"color:#a6e22e\">gt</span>; {\n          <span style=\"color:#a6e22e\">expect</span>(<span style=\"color:#a6e22e\">getResult</span>()).<span style=\"color:#a6e22e\">toEqual</span>(<span style=\"color:#ae81ff\">3</span>)\n        })\n      })\n\n      <span style=\"color:#a6e22e\">describe</span>(<span style=\"color:#e6db74\">&#34;when the second value is positive&#34;</span>, () <span style=\"color:#f92672\">=&amp;</span><span style=\"color:#a6e22e\">gt</span>; {\n        <span style=\"color:#a6e22e\">beforeEach</span>(() <span style=\"color:#f92672\">=&amp;</span><span style=\"color:#a6e22e\">gt</span>; { <span style=\"color:#a6e22e\">second</span> <span style=\"color:#f92672\">=</span> <span style=\"color:#ae81ff\">3</span> })\n\n        <span style=\"color:#a6e22e\">it</span>(<span style=\"color:#e6db74\">&#34;returns a negative number&#34;</span>, () <span style=\"color:#f92672\">=&amp;</span><span style=\"color:#a6e22e\">gt</span>; {\n          <span style=\"color:#a6e22e\">expect</span>(<span style=\"color:#a6e22e\">getResult</span>()).<span style=\"color:#a6e22e\">toEqual</span>(<span style=\"color:#f92672\">-</span><span style=\"color:#ae81ff\">3</span>)\n        })\n      })\n    })\n  })\n})\n</code></pre></div><p>This doesn&rsquo;t really bother me though:</p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-js\" data-lang=\"js\"><span style=\"color:#66d9ef\">let</span> <span style=\"color:#a6e22e\">sharedVar</span>;\n\n<span style=\"color:#a6e22e\">before</span>(() <span style=\"color:#f92672\">=&amp;</span><span style=\"color:#a6e22e\">gt</span>; {\n  <span style=\"color:#a6e22e\">sharedVar</span> <span style=\"color:#f92672\">=</span> ...\n})\n\n<span style=\"color:#a6e22e\">describe</span>(() <span style=\"color:#f92672\">=&amp;</span><span style=\"color:#a6e22e\">gt</span>; {\n  <span style=\"color:#a6e22e\">it</span>(() <span style=\"color:#f92672\">=&amp;</span><span style=\"color:#a6e22e\">gt</span>; {\n    <span style=\"color:#a6e22e\">sharedVar</span> <span style=\"color:#f92672\">=</span> ...\n  })\n})\n</code></pre></div><p>Is rspec <code>let</code> better than JS <code>let</code>?</p>\n<p>Even rspec maintainers caution us, Hicks notes. Convenience always carries a caveat in programming. This is a substantial pillar of the &ldquo;readability&rdquo; discussion: durability of convenience.</p>\n<p>&gt; Note: let can enhance readability when used sparingly (1,2, or maybe 3 declarations) in any given example group, but that can quickly degrade with overuse. YMMV.</p>\n<p>Cool find: <a href=\"https://github.com/enova/givens\">givens</a>. Shoutout to the translators, the transcribers, the interpreters.</p>\n",
				
				"date_published": "2023-10-25T11:57:43-07:00",
				"url": "https://softlydeveloping.micro.blog/2023/10/25/rspec-vs-js-let-vs.html",
				"tags": ["speculative nonfiction"]
			},
			{
				"id": "http://softlydeveloping.micro.blog/2023/07/04/with-annemarie-willis-professor-of.html",
				"title": "With Anne-Marie Willis, professor of design theory at the German University in Cairo.",
				"content_html": "<p>Another world is possible. But what of worlding? How to world?</p>\n<p>When a Farley&rsquo;s barista is a strong current; wow the level of shine escaping her mouth. And I loved it. The slightest tickle of maple syrup was a great recommendation!</p>\n<p>Per usual I sent myself something to read and didn&rsquo;t cite the source so I&rsquo;ve been having that weird kind of drifty, but tethered, Pong ball experience. Was it mentioned by someone in a Paper in Systems discussion? Maybe a content of the fediverse&rsquo;s systems thinkers briefly held in place by my thumb.</p>\n<p>As I like to say (with often different verses), I do software development because it&rsquo;s a phenomenological wonder of people, text, code, time travel, non-determinism &ndash; and always pluckily avoids fitting neatly into capitalist fetish.</p>\n<p>Like, software <em>projects</em> (already &ldquo;bad&rdquo; (incomplete, inaccurate) lexicon) of any substantial scope are only delivered on time accidentally.</p>\n<p>Frederica Frabetti supports this axiomatic <em>chiste</em> of software, noting in her book <em>Software Theory</em>:</p>\n<p>&gt; &ldquo;The central problem of software development is thus the impossibility of following a sure path in which a system is completely and exhaustively specified <em>before</em> it can be realized.&rdquo;</p>\n<p>and</p>\n<p>&gt; &ldquo;Stability is something that <em>happens</em> to the system, rather than being scheduled and worked towards.&rdquo;</p>\n<p>Look how software was virtually helpless to build complex systems that are designed to become <em>eventually consistent</em>.</p>\n<p>For me, software is philosophical-ing. An ontological milieu. Therefore Willis' essay is soooo good for those of us who are philosophical-ing, but not academically trained &ndash; and who can drift into this kind of theoretical reasoning easily, especially in an essay like <em>Ontological Designing</em> which onboards us you into hardcore theory with a ton of grace. Willis doesn&rsquo;t need to spend her initial breaths on defining &ldquo;ontological&rdquo; and and Heidegger&rsquo;s &ldquo;being&rdquo;, and (re)introducing us to the failure of the <em>Western</em> metaphysical tradition. But she is generous; and that&rsquo;s likely the point. A broader appeal.</p>\n<p>Which, in turn, helps the mind Pong around during an essay about pervasive push and pull.</p>\n<p>I&rsquo;m reading this essay about how we effect social change but also thinking through the systems reasoning and how it vibrates into software ontology. Well, there are references to IT infrastructure and other &ldquo;equipment&rdquo; of our present epoch &ndash; though they do not supersede other kinds of equipment. For Willis, our contemporary technologies can function both as examples of any designed material, as well as juxtapose with the immaterial (organizational structures, administrative systems, etc&hellip;) to demonstrate how they are equivalent as objects/outcomes of the ontological design circularity/looping, bi-directional reach &ndash; Heidegger&rsquo;s grabbing Cartesian dualism by the shoulders and shaking them.\n(&ldquo;Ontological designing refuses such one dimensional understandings of (human) being-in-the-world, which are worn-out fragments of enlightenment thinking and Christian morality sloppily stitched together.&quot;) As Willis notes, Heidegger themself reaches for the simple household jug to work with in his pursuit of how <em>things, thing</em>.</p>\n<p>&gt; &ldquo;The jug gathers and unites these.&rdquo;</p>\n<p>These being: water, wine, sky, earth. Gathered/outpoured.</p>\n<p>But she talks about tech in a way that tickles, for sure. Especially it&rsquo;s excess as it frenetically infinite loops rather than unlocks potential:\n&gt; Rather than inducing us into a world of multiple creative possibilities (as software advertisers would have it), [computers] design us as users into their horizons of possibility &ndash; which by the very nature of horizons (in Gadamer&rsquo;s sense) always have a limit. In fact, the proliferation of options within even a basic operating system or software application becomes a tyranny of choice, a maze of seemingly endless possibilities, a dazzling instrumentation for its own sake, all means with no end in sight.&rdquo;</p>\n<p>Maybe free software never will be truly free.</p>\n<img src=\"https://internetross.space/uploads/2023/farley-mug.webp\" width=\"600\" height=\"600\" alt=\"\">\n",
				
				"date_published": "2023-07-04T15:03:38-07:00",
				"url": "https://softlydeveloping.micro.blog/2023/07/04/with-annemarie-willis-professor-of.html",
				"tags": ["speculative nonfiction"]
			},
			{
				"id": "http://softlydeveloping.micro.blog/2023/06/08/naur-goodies-years-after-jesus.html",
				"title": "Naur, goodies, 1985 years after Jesus Christ",
				"content_html": "<p>There are so many goodies in Naur, 1985. Filter, some():</p>\n<ul>\n<li>Declares there&rsquo;s no right way to write software</li>\n<li>(Further) rebukes the scientific method</li>\n<li>Calls out lack of empirical study of software methods</li>\n<li>The programmer as &ldquo;manager&rdquo; of computer activity</li>\n</ul>\n<p>Thank you ceejbot for <a href=\"https://blog.ceejbot.com/posts/programming-as-theory-building/\">further distillations</a>.</p>\n",
				
				"date_published": "2023-06-08T09:29:54-07:00",
				"url": "https://softlydeveloping.micro.blog/2023/06/08/naur-goodies-years-after-jesus.html",
				"tags": ["speculative nonfiction"]
			},
			{
				"id": "http://softlydeveloping.micro.blog/2023/06/08/naur-the-optimist-years-after.html",
				"title": "Naur, the optimist, 1985 years after Jesus Christ",
				"content_html": "<p>The year is 1985. Certain kinds of optimism abound in programming circles. From Peter Naur&rsquo;s Programming as Theory Building:</p>\n<blockquote>\"It may be noted that the need for revival of an entirely dead program probably will rarely arise, since it is hardly conceivable that the revival would be assigned to new programmers without at least some knowledge of the theory had by the original team.\" </blockquote> \n<p>The infamous &ldquo;shit mouse&rdquo; bug that I pushed to production in 2018 &ndash; which subsequently became an iconic team joke with its own concomitant laptop sticker swag &ndash; was the direct result of software abandoned in the wake of absconding team members. Picking up dust-laden software seems like a common occurrence these days, no?</p>\n<p>In their <em>reading-with</em> of Naur, Ceejbot <a href=\"https://blog.ceejbot.com/posts/programming-as-theory-building/\">offers</a> a valuable remediation technique for deleterious  knowledge vacancies. It&rsquo;s one that I personally strive for in everyday software practice: gross amounts of maintainer documentation.</p>\n<p>&gt; Don’t waste time documenting what can be seen through simple reading. Document why that function exists and what purpose it serves in the software. When might I call it? Does it have side effects? Is there anything important about the inputs and outputs that I might not be able to deduce by reading the source of the function? All of those things are clues about the thinking of the original author of the function that can help their successor figure out what that author’s theory of the program was.</p>\n<p>and</p>\n<p>&gt; &hellip;the program exists to solve a problem, some “affair of the world” that Naur refers to. What was that problem? Is there a concise statement of that problem anywhere? What approach did you take to solving that problem statement? What tradeoffs did you make and why? What values did you hold as you made those tradeoffs? Why did you organize the source code in that particular way? What belongs where?</p>\n",
				
				"date_published": "2023-06-08T08:56:20-07:00",
				"url": "https://softlydeveloping.micro.blog/2023/06/08/naur-the-optimist-years-after.html",
				"tags": ["speculative nonfiction"]
			},
			{
				"id": "http://softlydeveloping.micro.blog/2023/06/06/power-moves.html",
				"title": "Power Moves",
				"content_html": "<p>During her novel workshop on estate planning, Sarah Deluca of Move Money Shift Power poses the question:</p>\n<p><em>Is holding onto control after your death something you want?</em></p>\n<p>If part of our life&rsquo;s work is to strengthen connection, relinquish power, share power, redistribute, does a Trust actually violate the moves we&rsquo;ve been making at the speed of small &ldquo;t&rdquo; trust? Individualistic posthumous scheming is not the invention of communities, but of corrupted powerfuls. It would seem.</p>\n<p>A few days later I found myself in the next Paper in Systems discussion led by Dawn Ahukanna and Shauna Gordon-McKeon. On the table was Shauna&rsquo;s essay <em>Interpretive Labor: Bridging the Gap Between Map and Territory</em>. Wherein you&rsquo;ll find a rich investigation &ndash; and then interrogation &ndash; of the lopsided power distribution between those that labor to imagine, construct models, maps, and those that sit with the effects of the implementation &ndash; who interpret, navigate, bridge the chasm between theory and material outcomes.</p>\n<p>I was called in. Software engineers do wield an outsized power from behind the desk. Although the tower isn&rsquo;t deathly bleached, because 1) we do some interpretive labor at the seam between business requirements and software building (system design, theory of, code/text writing), and 2) failures reverberate back to us pretty hard (midnight pages) &ndash; at least more acutely than through the beauracratic layers. (Do the capitalists get to feel much of anything?) Nonetheless, we probably aren&rsquo;t the ones screaming during the scream test. What do we do with this power?</p>\n<figure>\n<img src=\"https://internetross.space/uploads/2023/3f903ee582.png\" width=\"402\" height=\"600\" alt=\"Jorge Luis Borges self portait\">\n    <figcaption>Jorge Luis Borges - Self Portrait</figcaption>\n</figure>\n",
				
				"date_published": "2023-06-06T06:00:51-07:00",
				"url": "https://softlydeveloping.micro.blog/2023/06/06/power-moves.html",
				"tags": ["speculative nonfiction"]
			}
	]
}
