russell.ballestrini.net/content/2026-03-20-i-am-a-software-mechanic.rst

224 lines
8.2 KiB
ReStructuredText

I Am a Software Mechanic
########################
:author: Russell Ballestrini
:slug: i-am-a-software-mechanic
:date: 2026-03-20 12:00
:tags: Opinion, Code
:status: published
That job title doesn't exist yet on any W-2.
But it describes exactly what I do.
You call me when a machine-generated tool breaks something real.
A harvest lost. A contract mispriced. A greenhouse running dry.
I show up. I read the spec. I find the gap between what someone told the machine to do & what the world actually did.
Then I fix it. Unfortunately, not every job arrives as a Jira ticket.
Some come undisciplined & urgent, undergoing triage in a Slack room without a number.
One of those could terminate you into unemployment.
One of those could fire you.
**The pay reflects the gap between what this work actually does & what people think it costs.**
Software mechanics don't write code.
We maintain code that writes code.
Nobody budgeted for that role yet.
So most of us patch things on a handshake & call it consulting.
I keep a box of $4 toggle switches in my basement.
Not for the wiring.
For the clients who need to feel like they still have a hand on the wheel.
---
**Life as a software mechanic sucks. Let me explain.**
Every upstream dependency mutates without a release note.
Weather models recalibrate. Pricing APIs shift. ML models get quietly retrained.
Your client's tool keeps running. Keeps returning confident outputs.
Nobody notices until someone loses $25,000 in undersized cabbage.
Then they call you. You charge $200 for the visit.
You spend 4 hours diagnosing a spec that never mentioned the weather service it silently relied on.
You bill 4 hours. You eat 2.
The client balks at the invoice because "it's just a setting."
I never haggle. I work on my own ideas & try to sell them.
Never works.
**This happens every week.**
Tools get better. Specifications don't keep pace.
The world underneath the specs never simplifies.
So the gap between intent & execution keeps widening.
Someone has to crawl into that gap.
That someone doesn't have a union. Doesn't have a job board.
Doesn't have a standard rate card.
Mostly posts on forums & waits for DMs.
This blog goes back to 2010.
Every post, a spec against territory.
Most technical posts need no update. Ground beneath them held.
Others aged out quietly. A Minikube guide. A CircleCI config. A FreeNAS fallback tutorial. Accurate when written. Overtaken soon after.
Not failure. Just terrain. Most stays. Some shifts while you stand on it. An unquake.
---
**Why this matters right now:**
A post on `nearzero.software <https://nearzero.software/p/warranty-void-if-regenerated>`_ by Scott Werner called "Warranty Void If Regenerated" nails the shape of this work.
Tom Hartmann, a fictional software mechanic in rural Wisconsin, visits three clients in a day.
Three different failure modes. Three different root causes.
All of them trace back to specifications that didn't account for a world that moves.
Read it. Then come back for your homework.
---
---
HOMEWORK ASSIGNMENT
===================
.. class:: center
**Word Hunt — "Warranty Void If Regenerated"**
.. class:: center
*For students learning about software, language, & the `un` prefix*
|
**Your mission:**
Scrape `https://nearzero.software/p/warranty-void-if-regenerated <https://nearzero.software/p/warranty-void-if-regenerated>`_.
Find every word that starts with ``un``.
List them alphabetically.
Write your best definition for each word.
Then check your answers below.
|
**Scraping starter (Python):**
.. code-block:: python
import urllib.request
from html.parser import HTMLParser
import re
url = "https://nearzero.software/p/warranty-void-if-regenerated"
with urllib.request.urlopen(url) as response:
html = response.read().decode("utf-8")
# strip tags, split on whitespace, find un* words
text = re.sub(r"<[^>]+>", " ", html)
words = text.split()
un_words = sorted(set(
w.strip(".,;:!?\"'()[]").lower()
for w in words
if w.lower().startswith("un")
))
for word in un_words:
print(word)
|
**Define each word you find. Write your definitions before clicking the answer sheet.**
|
.. raw:: html
<details>
<summary style="cursor:pointer; font-weight:bold; font-size:1.1em; padding:0.5em 0; user-select:none;">
▶ Click to reveal answer sheet
</summary>
<div style="margin-top:1em; padding:1em; border-left:3px solid #666;">
<p><strong>Words starting with <code>un</code> found in the article:</strong></p>
<ol>
<li>
<strong>under-watered</strong><br>
Past tense: Carol under-watered the clay spot. Not a mistake. Thirty years of site knowledge encoded in action, never in words.
</li>
<li>
<strong>under-watering</strong><br>
The act of applying less water than a baseline recommends. Carol does this on purpose. Tyler's spec doesn't know. Neither does the sensor.
</li>
<li>
<strong>underlying</strong><br>
The foundation below what you see. The "underlying weather models" power the harvest tool but live outside its spec. When they change, the tool breaks. Nobody planned for that.
</li>
<li>
<strong>underneath</strong><br>
Below the surface, literally & figuratively. Clay sits underneath Carol's greenhouse soil. And underneath client resistance, Tom finds a real question every time.
</li>
<li>
<strong>underpriced</strong><br>
Sold for less than actual value. Ethan's miswired feed tool caused automated contracts to lock in milk prices below market. A small parsing error. A three-month loss.
</li>
<li>
<strong>undersized</strong><br>
Below the grade threshold. Margaret's early-harvested cabbage came in undersized. Undersized gets a discount. $25,000 worth of discount.
</li>
<li>
<strong>understand</strong><br>
To grasp deeply enough to use. Tom's central argument: a software mechanic in a farming town needs to understand farming. Not software. Farming.
</li>
<li>
<strong>understood</strong><br>
Past tense of understand. Hardware people understood atoms. Software people understood bits. People understood coffee. Coffee became Tom's benchmark for explaining spec complexity.
</li>
<li>
<strong>uneventful</strong><br>
Nothing went wrong. Tom's afternoon checkups ran uneventful. He appreciated that more than his clients probably knew. An uneventful visit means the spec held. That's a win.
</li>
<li>
<strong>unexpected</strong><br>
Something that arrived without warning. Carol's reaction to her grandson's irrigation upgrade matched "the expression people reserve for wasps' nests & unexpected tax bills." Technically superior. Emotionally disastrous.
</li>
<li>
<strong>unfortunately</strong><br>
Signals a gap between how things should work & how they do. "Unfortunately, software maintenance was a next-Tuesday problem in a world that was very good at producing lions."
</li>
<li>
<strong>unkindly</strong><br>
Without harshness. Tom delivers the spaghetti diagnosis "not unkindly." The word does quiet work: it marks him as someone who fixes things without making people feel broken.
</li>
<li>
<strong>unless</strong><br>
A conditional that marks the edge of machine knowledge. "That's a detail the AI has no way of knowing matters <em>unless</em> you tell it." One word. The whole argument.
</li>
<li>
<strong>until</strong><br>
The moment a static spec meets a dynamic world. "The tool worked perfectly <em>until</em> the world shifted underneath it." Until signals latent failure. The gap existed before the loss. You just couldn't see it yet.
</li>
</ol>
<p><em>14 unique words. 35 total occurrences. <code>understood</code> appears 8 times. <code>underneath</code> appears 5 times. All the same prefix. All pointing at the same problem: something below, something before, something outside the spec.</em></p>
</div>
</details>
|
---
Software mechanics study language too.
Prefixes carry meaning. ``un`` signals what sits below the surface, before the failure, outside the specification.
Good luck.
.. contents::