221 lines
8.1 KiB
ReStructuredText
221 lines
8.1 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."
|
|
|
|
**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.
|
|
|
|
---
|
|
|
|
**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::
|