<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Deciphering Glyph</title><link href="https://blog.glyph.im/" rel="alternate"></link><link href="https://blog.glyph.im/feeds/all.atom.xml" rel="self"></link><id>https://blog.glyph.im/</id><updated>2024-09-11T12:43:00-07:00</updated><entry><title>Python macOS Framework Builds</title><link href="https://blog.glyph.im/2024/09/python-macos-framework-builds.html" rel="alternate"></link><published>2024-09-11T12:43:00-07:00</published><updated>2024-09-11T12:43:00-07:00</updated><author><name>Glyph</name></author><id>tag:blog.glyph.im,2024-09-11:/2024/09/python-macos-framework-builds.html</id><summary type="html">&lt;p&gt;Building Python with &lt;code&gt;--enable-framework&lt;/code&gt; changes some stuff around;
should you care?&lt;/p&gt;</summary><content type="html">&lt;body&gt;&lt;p&gt;When you build Python, you can pass various options to &lt;code&gt;./configure&lt;/code&gt; that
change aspects of how it is built.  There is &lt;a href="https://docs.python.org/3.12/using/configure.html"&gt;documentation for all of these
options&lt;/a&gt;, and they are
things like &lt;code&gt;--prefix&lt;/code&gt; to tell the build where to install itself,
&lt;code&gt;--without-pymalloc&lt;/code&gt; if you have some esoteric need for everything to go
through a custom memory allocator, or &lt;code&gt;--with-pydebug&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;One of these options only matters on macOS, and its effects are generally
poorly understood.  The official documentation just says “Create a
Python.framework rather than a traditional Unix install.”  But… do you need a
Python.framework?  If you’re used to running Python on Linux, then a
“traditional Unix install” might sound pretty good; more consistent with what
you are used to.&lt;/p&gt;
&lt;p&gt;If you use a non-Framework build, most stuff seems to work, so why should
anyone care?  I have mentioned it as a detail &lt;a href="https://blog.glyph.im/2023/08/get-your-mac-python-from-python-dot-org.html"&gt;in my previous post about Python
on macOS&lt;/a&gt;, but even I
didn’t really explain why you’d want it, just that it was generally desirable.&lt;/p&gt;
&lt;p&gt;The
&lt;a href="https://www.mail-archive.com/pythonmac-sig@python.org/msg08954.html"&gt;traditional&lt;/a&gt;
answer to this question is that you need a Framework build “if you want to use
a GUI”, but this is demonstrably not true.  At first it might not seem so,
since the go-to Python GUI test is “run IDLE”; many non-Framework builds also
omit Tkinter because they don’t ship a Tk dependency, so IDLE won’t start. But
other GUI libraries work fine.  For example, &lt;code&gt;uv tool install runsnakerun&lt;/code&gt; /
&lt;code&gt;runsnake&lt;/code&gt; will happily pop open a GUI window, Framework build or not.  So it bears some explaining&lt;/p&gt;
&lt;h2 id=wait-what-is-a-framework-anyway&gt;Wait, what is a “Framework” anyway?&lt;/h2&gt;
&lt;p&gt;Let’s back up and review an important detail of the mac platform.&lt;/p&gt;
&lt;p&gt;On macOS, GUI applications are not just an executable file, they are organized
into a &lt;em&gt;bundle&lt;/em&gt;, which is a directory with a particular layout, that includes
metadata, that launches an executable.  A thing that, on Linux, might live in a
combination of &lt;code&gt;/bin/foo&lt;/code&gt; for its executable and &lt;code&gt;/share/foo/&lt;/code&gt; for its
associated data files, is instead on macOS bundled together into &lt;code&gt;Foo.app&lt;/code&gt;, and
those components live in specified locations within that directory.&lt;/p&gt;
&lt;p&gt;A
&lt;a href="https://developer.apple.com/documentation/xcode/bundles-and-frameworks"&gt;framework&lt;/a&gt;
is also a bundle, but one that contains a &lt;em&gt;library&lt;/em&gt;.  Since they are
directories, Applications can contain their own Frameworks and Frameworks can
contain helper Applications.  If &lt;code&gt;/Applications&lt;/code&gt; is roughly equivalent to the
Unix &lt;code&gt;/bin&lt;/code&gt;, then &lt;code&gt;/Library/Frameworks&lt;/code&gt; is roughly equivalent to the Unix
&lt;code&gt;/lib&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;App bundles are contained in a directory with a &lt;code&gt;.app&lt;/code&gt; suffix, and frameworks
are a directory with a &lt;code&gt;.framework&lt;/code&gt; suffix.&lt;/p&gt;
&lt;h2 id=so-what-do-you-need-a-framework-for-in-python&gt;So what do you need a Framework for in Python?&lt;/h2&gt;
&lt;p&gt;The truth about Framework builds is that there is not really one specific thing
that you can point to that works or doesn’t work, where you “need” or “don’t
need” a Framework build.  I was not able to quickly construct an example that
trivially fails in a non-framework context for this post, but I didn’t try that
many different things, and there are a &lt;em&gt;lot&lt;/em&gt; of different things that might
fail.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;biggest&lt;/em&gt; issue is not actually the &lt;code&gt;Python.framework&lt;/code&gt; itself.  The
metadata on the framework is not used for much outside of a build or linker
context.  However, Python’s Framework builds also ship with a &lt;em&gt;stub application
bundle&lt;/em&gt;, which places your Python process into a normal application(-ish)
execution context all the time, which allows for various platform APIs like
&lt;a href="https://developer.apple.com/documentation/foundation/nsbundle/1410786-mainbundle?language=objc"&gt;&lt;code&gt;[NSBundle
mainBundle]&lt;/code&gt;&lt;/a&gt;
to behave in the normal, predictable ways that &lt;a href="https://developer.apple.com/documentation?language=objc"&gt;&lt;em&gt;all&lt;/em&gt; of the numerous, various
frameworks included on Apple platforms
expect&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Various Apple platform features might want to ask a process questions like
“what is your unique &lt;a href="https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleidentifier?language=objc#"&gt;bundle
identifier&lt;/a&gt;?”
or “&lt;a href="https://developer.apple.com/documentation/bundleresources/entitlements?language=objc"&gt;what entitlements are you authorized to
access&lt;/a&gt;”
and even beginning to answer those questions requires information stored in the
application’s bundle.&lt;/p&gt;
&lt;p&gt;Python does not ship with a wrapper around the core macOS “cocoa” API itself,
but we can use pyobjc to interrogate this.  After installing
&lt;code&gt;pyobjc-framework-cocoa&lt;/code&gt;, I can do this&lt;/p&gt;
&lt;div class=highlight&gt;&lt;table class=highlighttable&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=linenos&gt;&lt;div class=linenodiv&gt;&lt;pre&gt;&lt;span class=normal&gt;1&lt;/span&gt;
&lt;span class=normal&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=code&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=go&gt;&amp;gt;&amp;gt;&amp;gt; import AppKit&lt;/span&gt;
&lt;span class=go&gt;&amp;gt;&amp;gt;&amp;gt; AppKit.NSBundle.mainBundle()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On a non-Framework build, it might look like this:&lt;/p&gt;
&lt;div class=highlight&gt;&lt;table class=highlighttable&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=linenos&gt;&lt;div class=linenodiv&gt;&lt;pre&gt;&lt;span class=normal&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=code&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=go&gt;NSBundle &amp;lt;/Users/glyph/example/.venv/bin&amp;gt; (loaded)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;But on a Framework build (even in a venv in a similar location), it might look
like this:&lt;/p&gt;
&lt;div class=highlight&gt;&lt;table class=highlighttable&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=linenos&gt;&lt;div class=linenodiv&gt;&lt;pre&gt;&lt;span class=normal&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=code&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=go&gt;NSBundle &amp;lt;/Library/Frameworks/Python.framework/Versions/3.12/Resources/Python.app&amp;gt; (loaded)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is why, at various points in the past, GUI access &lt;em&gt;required&lt;/em&gt; a framework
build, since connections to the window server would just be rejected for
Unix-style executables.  But that was an annoying restriction, so it was
removed at some point, or at least, the behavior was changed.  As far as I can
tell, this change was not documented.  But other things like &lt;a href="https://developer.apple.com/documentation/usernotifications?language=objc"&gt;user
notifications&lt;/a&gt;
or
&lt;a href="https://developer.apple.com/documentation/CoreLocation?language=objc"&gt;geolocation&lt;/a&gt;
might need to identity an application for preferences or permissions purposes,
respectively.  Even something as basic as “what is your app icon” for what to
show in alert dialogs is information contained in the bundle.  So if you use a
library that wants to make use of any of these features, it might work, or it
might behave oddly, or it might silently fail in an undocumented way.&lt;/p&gt;
&lt;p&gt;This might seem like undocumented, unnecessary cruft, but it is that way
because it’s just &lt;em&gt;basic stuff the platform expects to be there&lt;/em&gt; for a lot of
different features of the platform.&lt;/p&gt;
&lt;h2 id=etc-builds&gt;&lt;code&gt;/etc/&lt;/code&gt; builds&lt;/h2&gt;
&lt;p&gt;Still, this might seem like a strangely vague description of this feature, so
it might be helpful to examine it by a metaphor to something you are more
familiar with.  If you’re familiar with more Unix style application development,
consider a junior developer — let’s call him Jim — asking you if they should
use an “&lt;code&gt;/etc&lt;/code&gt; build” or not as a basis for their Docker containers.&lt;/p&gt;
&lt;p&gt;What is an “&lt;code&gt;/etc&lt;/code&gt; build”?  Well, base images like &lt;code&gt;ubuntu&lt;/code&gt; come with a bunch
of files in &lt;code&gt;/etc&lt;/code&gt;, and Jim just doesn’t see the point of any of them, so he
likes to delete everything in &lt;code&gt;/etc&lt;/code&gt; just to make things simpler.  It seems to
work so far.  More experienced Unix engineers that he has asked react
negatively and make a face when he tells them this, and seem to think that
things will break.  But their app seems to work fine, and none of these
engineers can demonstrate some simple function breaking, so what’s the problem?&lt;/p&gt;
&lt;p&gt;Off the top of your head, can you list all the features that all the files that
&lt;code&gt;/etc&lt;/code&gt; is needed for?  Why not?  Jim thinks it’s weird that all this stuff is
undocumented, and it must just be unnecessary cruft.&lt;/p&gt;
&lt;p&gt;If Jim were to come back to you later with a problem like “it seems like
hostname resolution doesn’t work sometimes” or “&lt;code&gt;ls&lt;/code&gt; says all my files are
owned by &lt;code&gt;1001&lt;/code&gt; rather than the user name I specified in my Dockerfile” you’d
probably say “please, put &lt;code&gt;/etc&lt;/code&gt; back, I don’t know exactly what file you need
but lots of things just expect it to be there”.&lt;/p&gt;
&lt;p&gt;This is what a framework vs. a non-Framework build is like.  A Framework build
just includes all the pieces of the build that the macOS platform expects to be
there.  What pieces do what features need?  It depends.  It changes over time.
And the stub that Python’s Framework builds include may not be sufficient for
some more esoteric stuff anyway.  For example, if you want to use a feature
that needs a bundle that has been &lt;a href="https://developer.apple.com/documentation/bundleresources/entitlements?language=objc"&gt;signed with custom
entitlements&lt;/a&gt;
to access something specific, like &lt;a href="https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_virtualization?language=objc#"&gt;the virtualization
API&lt;/a&gt;,
you might need to build &lt;a href="https://blog.glyph.im/2023/03/py-mac-app-for-real.html"&gt;your own&lt;/a&gt; app
bundle.  To extend our analogy with Jim, the fact that &lt;code&gt;/etc&lt;/code&gt; exists and has
the default files in it won’t always be sufficient; sometimes you have to add
&lt;em&gt;more&lt;/em&gt; files to &lt;code&gt;/etc&lt;/code&gt;, with quite specific contents, for some features to work
properly.  But “don’t get rid of &lt;code&gt;/etc&lt;/code&gt; (or your application bundle)” is pretty
good advice.&lt;/p&gt;
&lt;h2 id=do-you-ever-want-a-non-framework-build&gt;Do you ever want a non-Framework build?&lt;/h2&gt;
&lt;p&gt;macOS does have a Unix subsystem, and many Unix-y things work, for Unix-y
tasks.  If you are developing a web application that mostly runs on Linux
anyway and never care about using any features that touch the macOS-specific
parts of your mac, then you probably don’t have to care all &lt;em&gt;that&lt;/em&gt; much about
Framework builds.  You’re not going to be surprised one day by non-framework
builds suddenly being unable to use some basic Unix facility like sockets or
files.  As long as you are aware of these limitations, it’s fine to install
non-Framework builds.  I have a dozen or so Pythons on my computer at any given
time, and many of them are not Framework builds.&lt;/p&gt;
&lt;p&gt;Framework builds do have some small drawbacks.  They tend to be larger, they
can be a bit more annoying to relocate, they typically want to live in a
location like &lt;code&gt;/Library&lt;/code&gt; or &lt;code&gt;~/Library&lt;/code&gt;.  You can move &lt;code&gt;Python.framework&lt;/code&gt; into
an application bundle according to certain rules, as any bundling tool for
macOS will have to do, but it &lt;em&gt;might&lt;/em&gt; not work in random filesystem locations.
This may make managing really large number of Python versions more annoying.&lt;/p&gt;
&lt;p&gt;Most of all, the main reason to use a non-Framework build is if you are
building a tool that manages a fleet of Python installations to perform some
automation that needs to know about Python installs, and you want to write one
simple tool that does stuff on Linux and on macOS.  If you &lt;em&gt;know&lt;/em&gt; you don’t
need any platform-specific features, don’t want to spend the (&lt;a href="https://github.com/indygreg/python-build-standalone/issues/274"&gt;not
insignificant!&lt;/a&gt;)
effort to cover those edge cases, and you get a lot of value from that level of
consistency (for example, a teaching environment or interdisciplinary
development team with a lot of platform diversity) then a non-framework build
might be a better option.&lt;/p&gt;
&lt;h2 id=why-do-i-care&gt;Why do &lt;em&gt;I&lt;/em&gt; care?&lt;/h2&gt;
&lt;p&gt;Personally, I think it’s important for Framework builds to be the default &lt;em&gt;for
most users&lt;/em&gt;, because I think that as much stuff should work out of the box as
possible.  Any user who sees a neat library that lets them get control of some
chunk of data stored on their mac - map data, health data, game center high
scores, whatever it is - should be empowered to call into those APIs and deal
with that data for themselves.&lt;/p&gt;
&lt;p&gt;Apple already makes it hard enough with their thicket of code-signing and
notarization requirements for distributing software, aggressive privacy
restrictions which prevents API access to some of this data in the first place,
all these weird Unix-but-not-Unix filesystem layout idioms, sandboxing that
restricts access to various features, and the use of esoteric abstractions like
mach ports for communications behind the scenes.  We don't need to make it even
harder by making &lt;em&gt;the way that you install your Python&lt;/em&gt; be a surprise gotcha
variable that determines &lt;em&gt;whether or not you can use&lt;/em&gt; an API like “show me a
user notification when my data analysis is done” or “don’t do a power-hungry
data analysis when I’m on battery power”, especially if it kinda-sorta works
most of the time, but only fails on certain patch-releases of certain versions
of the operating system, becuase an implementation detail of a proprietary
framework changed in the meanwhile to require an application bundle where it
didn’t before, or vice versa.&lt;/p&gt;
&lt;p&gt;More generally, I think that we should care about empowering users with local
computation and platform access on &lt;em&gt;all&lt;/em&gt; platforms, Linux and Windows included.
This just happens to be one particular quirk of how native platform integration
works on macOS specifically.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=acknowledgments&gt;Acknowledgments&lt;/h2&gt;
&lt;p class=update-note&gt;Thank you to &lt;a href="/pages/patrons.html"&gt;my patrons&lt;/a&gt; who are supporting my writing on
this blog.  For this one, &lt;a href="https://hynek.me"&gt;thanks especially to long-time patron
Hynek&lt;/a&gt; who requested it specifically.  If you like what you’ve
read here and you’d like to read more of it, or you’d like to support my
&lt;a href="https://github.com/glyph/"&gt;various open-source endeavors&lt;/a&gt;, you can &lt;a href="/pages/patrons.html"&gt;support my
work as a sponsor&lt;/a&gt;!  I am also &lt;a href=mailto:consulting@glyph.im&gt;available for consulting
work&lt;/a&gt; if you think your organization could benefit
from expertise on topics like “how can we set up our Mac developers’ laptops
with Python”.&lt;/p&gt;&lt;/body&gt;</content><category term="misc"></category><category term="python"></category><category term="macos"></category></entry><entry><title>On The Defense Of Heroes</title><link href="https://blog.glyph.im/2024/08/on-the-defense-of-heroes.html" rel="alternate"></link><published>2024-08-16T12:53:00-07:00</published><updated>2024-08-16T12:53:00-07:00</updated><author><name>Glyph</name></author><id>tag:blog.glyph.im,2024-08-16:/2024/08/on-the-defense-of-heroes.html</id><summary type="html">&lt;p&gt;How should we defend those people who have done great work that has inspired us, when they stand accused?&lt;/p&gt;</summary><content type="html">&lt;body&gt;&lt;p&gt;If a high-status member of a community that you participate in is accused of
misbehavior, you may want to defend them. You may even write a long essay in
their defense.&lt;/p&gt;
&lt;p&gt;In that essay, it may seem only natural to begin with a lengthy enumeration of
the accused’s positive personal qualities.  To extol the quality of their
career and their contributions to your community. To talk about how &lt;em&gt;nice&lt;/em&gt; they
are.  To be a &lt;a href="https://en.wikipedia.org/wiki/Character_evidence"&gt;character
witness&lt;/a&gt; in the court of
public opinion.&lt;/p&gt;
&lt;p&gt;If you do this, you are not defending them. You are proving the point.  This is
exactly how &lt;a href="https://en.wikipedia.org/wiki/Missing_stair"&gt;missing stairs&lt;/a&gt; come
to exist. People don’t get away with bad behavior if they &lt;em&gt;don’t&lt;/em&gt; have high
status and a good reputation already.&lt;/p&gt;
&lt;p&gt;Sometimes, someone with antisocial inclinations seeks out status, in order to
facilitate their bad behavior. Sometimes, a good, but, flawed person does a lot
of really good work and thereby accidentally ends up with more status than they
were expecting to have, and they don’t know how to handle it. In either case,
bad behavior may ensue.&lt;/p&gt;
&lt;p&gt;If you truly believe that your fave is being accused or punished unjustly,
focus on the facts. What, specifically, has been alleged? How are these
allegations substantiated? What verifiable evidence exists to the contrary? If
you feel that someone is falsely accusing them to ruin their reputation, is
there &lt;em&gt;evidence&lt;/em&gt; to support your claim that the accusation is false?  Ask
yourself the question: what information do &lt;em&gt;you&lt;/em&gt; have, that is leading to your
correct analysis of the situation, that the people making the accusations &lt;em&gt;do
not have&lt;/em&gt;, which might be leading them into error?&lt;/p&gt;
&lt;p&gt;But, also, maybe just… don’t?&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;urge&lt;/em&gt; to defend someone like this is much more likely to come from a sense
of personal grievance than justice.  Consider: does it &lt;em&gt;feel&lt;/em&gt; like &lt;em&gt;you&lt;/em&gt; are
being attacked, when your fave has been attacked?  Is there a tightness in your
chest, heat rising on your cheeks?  Do you feel suddenly defensive?&lt;/p&gt;
&lt;p&gt;Do you think that defensiveness is likely to lead to you making &lt;em&gt;good,
rational&lt;/em&gt; decisions about what steps to take next?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Let your heroes face accountability.&lt;/strong&gt;  If they are really worth your
admiration, they might accept responsibility and make amends.  Or they might
fight the accusations with their own real evidence — evidence that you, someone
peripheral to their situation, are unlikely to have — and prove the accusations
wrong.&lt;/p&gt;
&lt;p&gt;They might not &lt;em&gt;want&lt;/em&gt; your defense.  Even if they feel like they do want it in
the moment — they are human too, after all, and facing accountability does not
feel &lt;em&gt;good&lt;/em&gt; to us humans — is the intensified feeling that they can’t let down
their supporters who &lt;em&gt;believe in them&lt;/em&gt; likely to make &lt;em&gt;them&lt;/em&gt; feel less
defensive and panicked?&lt;/p&gt;
&lt;p&gt;In either case, your character defense is unlikely to serve them.  At best it
helps them stay on an ego trip, at worst it muddies the waters and might
confuse the collection of facts that would, if considered dispassionately,
properly exonerate them.&lt;/p&gt;
&lt;p&gt;Do you think that I am pretending to speak in generalities but really talking
about one specific recent event?&lt;/p&gt;
&lt;p&gt;Wrong!&lt;/p&gt;
&lt;p&gt;Just in this last week, I have read 2 different blog posts about 2 completely
different people in completely unrelated communities and both of their authors
need to read this. But each of those were already of a type, one that I’ve read
dozens of instances of in the past.&lt;/p&gt;
&lt;p&gt;It is a very human impulse to perceive a threat to someone we think well of,
and to try to defend against that threat.  But the consequences of someone’s
own actions are not a threat you can defend them from.&lt;/p&gt;&lt;/body&gt;</content><category term="misc"></category><category term="politics"></category></entry><entry><title>Against Innovation Tokens</title><link href="https://blog.glyph.im/2024/07/against-innovation-tokens.html" rel="alternate"></link><published>2024-07-03T15:58:00-07:00</published><updated>2024-07-04T12:54:00-07:00</updated><author><name>Glyph</name></author><id>tag:blog.glyph.im,2024-07-03:/2024/07/against-innovation-tokens.html</id><summary type="html">&lt;p&gt;The “innovation token” model for selecting technologies is bad, and here’s why.&lt;/p&gt;</summary><content type="html">&lt;body&gt;&lt;p class=update-note&gt;Updated 2024-07-04: After some discussion, added an &lt;a href=#epilogue&gt;epilogue&lt;/a&gt; going
into more detail about the value of the distinction between the two types of
tokens.&lt;/p&gt;
&lt;p&gt;In 2015, &lt;a href="https://mcfunley.com/choose-boring-technology"&gt;Dan McKinley laid out a model for software teams selecting
technologies&lt;/a&gt;.  He proposed that
each team have a limited supply of “innovation tokens”, and, when selecting a
technology, they can choose boring ones for free but “innovative” ones cost a
token.  This implies that we all know which technologies are innovative, and we
assume that they are inherently costly, so we want to restrict their supply.&lt;/p&gt;
&lt;p&gt;That model has become popular to the point that it is now part of the
vernacular.  In many discussions, it is accepted as received wisdom, or even
common sense.&lt;/p&gt;
&lt;p&gt;In this post I aim to show you that despite being superficially helpful, this
model is wrong, and in fact, may be counterproductive.  I believe it is an
&lt;a href="https://en.wikipedia.org/wiki/Attractive_nuisance_doctrine"&gt;attractive
nuisance&lt;/a&gt; in
computer programming discourse.&lt;/p&gt;
&lt;p&gt;In fairness to Mr. McKinley, the model he described in this post is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;nearly a decade old at this point, and&lt;/li&gt;
&lt;li&gt;much more nuanced in its description of the problem with “innovation” than
   the subsequent memetic mutation of the concept.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;While I will be referencing McKinley’s post, and I do take some issue with it,
I am reacting more strongly to the life of its own that this idea has taken on
once it escaped its original context.  There are a zillion &lt;em&gt;worse&lt;/em&gt; posts
rehashing this concept, on blogs and LinkedIn, but I won’t be linking to them
because the goal is not to call anybody out.&lt;/p&gt;
&lt;p&gt;To some extent I am re-raising McKinley’s own caveats and reinforcing them.  So
I may be arguing with a strawman, but it’s a strawman I have seen deployed with
some regularity over the years.&lt;/p&gt;
&lt;p&gt;To reduce it to its core, this strawman is “don’t use new or interesting
technology, and if you have to, only use a little bit”.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Within the broader culture of programmers, an “innovation token” has become a
shorthand to smear any technology perceived — almost always based on vibes, not
data — as risky, and the adoption of novel approaches as pretentious and
unserious.  Speaking of programmer culture though, I do have to acknowledge
there is &lt;em&gt;also&lt;/em&gt; a pervasive tendency for us to get distracted by novelty and
waste time on puzzles rather than problem-solving, so I understand where the
reactionary attitude represented by the concept of an innovation token comes
from.&lt;/p&gt;
&lt;p&gt;But it &lt;em&gt;is&lt;/em&gt; reactionary.&lt;/p&gt;
&lt;p&gt;At its worst, it borders on anti-intellectualism.  I have heard it used on more
than one occasion as a thought-terminating cliche to discard a potentially
promising new tool.  But before I get into that, let me try to give a
sympathetic summary of the idea, because the model is not &lt;em&gt;entirely&lt;/em&gt; bad.&lt;/p&gt;
&lt;p&gt;It has been popular for a long time because it &lt;em&gt;does&lt;/em&gt; work okay as an
heuristic.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;The real problem that McKinley is describing is &lt;em&gt;operational overhead&lt;/em&gt;.  When
programmers make a technology selection, we are often considering how difficult
it will make the &lt;em&gt;programming&lt;/em&gt;.  Innovative technology selections are, by
definition, less mature.&lt;/p&gt;
&lt;p&gt;That lack of maturity — particularly in the open source world — often means
that the project is in a part of its lifecycle where it is concerned with
&lt;em&gt;development&lt;/em&gt; affordances more than &lt;em&gt;operational&lt;/em&gt; ones.  Therefore, the
stereotypical innovative project, even one which might legitimately be a big
improvement to development velocity, will create more operational
overhead. That operational overhead creates a &lt;em&gt;hidden&lt;/em&gt; cost for the operations
team later on.&lt;/p&gt;
&lt;p&gt;This is a point I emphatically agree with.  When selecting a technology, you
should consider its ease of operation &lt;em&gt;more&lt;/em&gt; than its ease of development. If
your team is successful, they will be operating and maintaining it far longer
than they are initially integrating and deploying it.&lt;/p&gt;
&lt;p&gt;Furthermore, some operational overhead is inevitable.  You will need to hire
people to mitigate it.  More popular, more mature projects will have
a bigger talent pool to hire from, so your training costs will be lower, and
those training costs are part of your operational cost too.&lt;/p&gt;
&lt;p&gt;Rationing innovation tokens therefore &lt;em&gt;can&lt;/em&gt; work as a reasonable heuristic,
or proxy metric, for avoiding a mess of complex operational problems associated
with dependencies that are expensive to operate and hard to hire for.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;There are some minor issues I want to point out before getting to the
overarching one.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;“has a lot of operational overhead” is a &lt;em&gt;stereotype&lt;/em&gt; of a new technology,
   not an inherent property.  If you want to reject a technology on the basis
   of being too high-overhead, at least look into its &lt;em&gt;actual&lt;/em&gt; overhead a
   little bit.  Sometimes, especially in 2024 as opposed to 2015, the point of
   a new, shiny piece of tech &lt;em&gt;is to address operational issues&lt;/em&gt; that the more
   boring, older one had.&lt;/li&gt;
&lt;li&gt;“hard to learn” is also a stereotype; if “newer” meant “harder” then we
   would all be using &lt;a href="https://en.wikipedia.org/wiki/Troff"&gt;&lt;code&gt;troff&lt;/code&gt;&lt;/a&gt; rather
   than Google Docs. Actually ask if the innovativeness is making things harder
   or easier; don’t assume.&lt;/li&gt;
&lt;li&gt;You are going to have to train people on your stack no matter what.  If a
   technology is adding a lot of value, it’s absolutely worth hiring for
   general ability and making a plan to teach people about it.  You are going
   to have to do this with the core technology of your product anyway.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As I said, though, these are minor issues. The &lt;em&gt;big&lt;/em&gt; problem with modeling
operational overhead as an “innovation token” is that an even bigger concern
than selecting an innovative tool is selecting &lt;em&gt;too many tools&lt;/em&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;The impulse to select more tools and make your operational environment more
complex can be made &lt;em&gt;worse&lt;/em&gt; by trying to avoid innovative tools.  The important
thing is not “less innovation”, but &lt;em&gt;more consistency&lt;/em&gt;.  To illustrate this,
let’s do a simple thought experiment.&lt;/p&gt;
&lt;p&gt;Let’s say you’re going to make a web app.  There’s a tool in Haskell that you
really like for a critical part of your app’s problem domain. You don’t want to
spend more than one innovation token though, and everything in Haskell is
&lt;a href="https://discourse.haskell.org/t/what-does-avoid-success-at-all-costs-mean-to-you/5832"&gt;inherently
innovative&lt;/a&gt;,
so you write a little service that just does that one part and you write the
rest of your app in Ruby, calling into that service whenever you need to use
that thing.  This will appropriately restrict your “innovation token”
expenditure.&lt;/p&gt;
&lt;p&gt;Does doing this actually reduce your operational overhead, though?&lt;/p&gt;
&lt;p&gt;First, you will have to find a team that likes both Ruby and Haskell and sees
no problem using both. If you are not familiar with the cultural proclivities
of these languages, suffice it to say that this is &lt;em&gt;unlikely&lt;/em&gt;.  Hiring for
Haskell programmers is hard because there are fewer of them than Ruby
programmers, but hiring for polyglot Haskell/Ruby programmers who are happy to
do either is going to be &lt;em&gt;really&lt;/em&gt; hard.&lt;/p&gt;
&lt;p&gt;Since you will need to find different people to write in the different
languages, even in the best case scenario, you will have two teams: the Haskell
team and the Ruby team.  Even if you are incredibly disciplined about
inter-service responsibilities, there will be &lt;em&gt;some&lt;/em&gt; areas where duplication of
code is necessary across those services.  Disagreements will arise and every
one of these disagreements will be a source of social friction and software
defects.&lt;/p&gt;
&lt;p&gt;Then, you need to set up separate CI pipelines for each language, separate
deployment systems, and of course, &lt;a href="https://martinfowler.com/articles/microservices.html#DecentralizedDataManagement"&gt;separate
databases&lt;/a&gt;.
Right away you are effectively doubling your workload.&lt;/p&gt;
&lt;p&gt;In the worse, and unfortunately more likely scenario, there will be enormous
infighting between these two teams. Operational incidents will be more
difficult to manage because rather than learning the Haskell tools for
operational visibility and disseminating that institutional knowledge amongst
your team, you will be half-learning the lessons from two separate ecosystems
and attempting to integrate them.  Every on-call engineer will be frantically
trying to learn a language ecosystem they don’t use regularly, or you will
double the size of your on-call rotation.  The Ruby team may start to resent
the Haskell team for getting to exclusively work on the fun parts of the
problem while they are doing things that look more like rote grunt work.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;A better way to think about the problem of managing operational overhead is,
rather than “innovation tokens”, consider “boundary tokens”.&lt;/p&gt;
&lt;p&gt;That is to say, rather than evaluating the general sense of weird vibes from
your architecture, consider the &lt;em&gt;consistency&lt;/em&gt; of that architecture. If you’re
using Haskell, use Haskell. You should be all-in on Haskell web frameworks,
Haskell ORMs, Haskell OAuth integrations, and so on.&lt;sup id=fnref:1:against-innovation-tokens-2024-7&gt;&lt;a class=footnote-ref href=#fn:1:against-innovation-tokens-2024-7 id=fnref:1&gt;1&lt;/a&gt;&lt;/sup&gt;  To cross the boundary out
of Haskell, you need to spend a boundary token, and you shouldn’t have many of
those.&lt;/p&gt;
&lt;p&gt;I submit that the increased operational overhead that you might experience with
an all-Haskell tool selection will be dwarfed by the savings that you get by
having a team that is aligned with each other, that can communicate easily, and
that can share programs with each other without needing to first strategize
about a channel for the two pieces of work to establish bidirectional
communication.  The ability to simply call a function when you need to call it
is very powerful, and extremely underrated.&lt;/p&gt;
&lt;p&gt;Consistency ought to apply at each layer of the stack; it is perhaps most
obvious with programming languages, but it is true of web frameworks, test
frameworks, cryptographic libraries, you name it.  Make a choice and stick with
it, because every deviation from that choice carries a significant cost.
Moreover this cost is a &lt;em&gt;hidden&lt;/em&gt; cost, in the same way that the operational
downsides of an “innovative” tool that hasn’t seen much production use might be
hidden.&lt;/p&gt;
&lt;p&gt;Discarding a more standard tool in favor of a tool more consistent with your
architecture extends even to fairly uncontroversial, ubiquitous tools.  For
example, one of my favorite architectural patterns is to forego the use of the
venerable — and very boring – Cron, the UNIX task-scheduler.  Instead of Cron,
it can make a lot of sense to have hand-written bespoke code for scheduling
tasks within the application.  Within the “innovation tokens” model, this is a
very silly waste of a token!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Just use Cron! Everybody knows how to use Cron!&lt;/p&gt;
&lt;p&gt;Except… &lt;em&gt;does&lt;/em&gt; everybody know how to use Cron? Here are some questions to
consider, if you’re about to roll out a big dependency on Cron:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;How do you write a unit test for a scheduling rule with Cron?&lt;/li&gt;
&lt;li&gt;Can you even &lt;a href="https://crontab.guru"&gt;remember how to write a cron rule&lt;/a&gt; that
   runs at the times you want?&lt;/li&gt;
&lt;li&gt;How do you inject secrets and configuration variables into the distinct and
   somewhat idiosyncratic runtime execution environment of Cron?&lt;/li&gt;
&lt;li&gt;How do you know that you did that variable-injection &lt;em&gt;properly&lt;/em&gt; until the
   job actually runs, possibly in the middle of the night?&lt;/li&gt;
&lt;li&gt;How do you deploy your monitoring and error-logging frameworks to observe
   your scripts run under Cron?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Granted, this architectural choice is less controversial than it once was. Cron
used to be ambiently available on whatever servers you happened to be
running. As container-based deployments have increased in popularity, this
sense that Cron is just kinda &lt;em&gt;around&lt;/em&gt; has gone away, and if you need to run a
container that &lt;em&gt;just&lt;/em&gt; runs Cron, much of the jankiness of its deployment is a
lot more immediately visible.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;There is friction at the boundary between things.  That friction is a cost, but
sometimes it’s a cost worth paying.&lt;/p&gt;
&lt;p&gt;If there’s a really good library in Haskell and a really good library in Ruby
and you really do want to use them both, maybe it makes sense to actually have
multiple services.  As your team gets larger and more mature, the need to bring
in more tools, and the ability to handle the associated overhead, will only
increase over time.  But the place that the cost comes in the most is at the
boundary between tools, not in the operational deficiencies of any one
particular tool.&lt;/p&gt;
&lt;p&gt;Even in a bog-standard web application with the most boring, least innovative
tech stack imaginable (PHP, MySQL, HTML, CSS, JavaScript), many of the annoying
points of friction are where different, inconsistent technologies make contact.
If you are a programmer working on the web yourself, consider your own
impression of the level of controversy of these technologies:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CSS frameworks that attempt to bridge the gap between CSS and JavaScript,
  like
  &lt;a href="https://nsemboo.medium.com/to-those-saying-devs-who-use-bootstrap-are-lazy-shut-your-smelly-mouth-1bd95f9364e4"&gt;Bootstrap&lt;/a&gt;
  or
  &lt;a href="https://www.aleksandrhovhannisyan.com/blog/why-i-dont-like-tailwind-css/"&gt;Tailwind&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.codinghorror.com/object-relational-mapping-is-the-vietnam-of-computer-science/"&gt;ORMs&lt;/a&gt;
  that
  &lt;a href="https://dev.to/harshhhdev/why-orms-arent-always-a-great-idea-41kg"&gt;attempt&lt;/a&gt;
  to &lt;a href="https://chanind.github.io/2020/01/13/awesome-orms.html"&gt;bridge&lt;/a&gt; the gap
  between SQL and your backend language of choice&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apievangelist.com/2019/12/02/grpcs-potentially-fatal-weakness/"&gt;RPC
  systems&lt;/a&gt;
  that attempt to
  &lt;a href="https://stackoverflow.blog/2022/11/28/when-to-use-grpc-vs-graphql/"&gt;connect&lt;/a&gt;
  disparate services
  &lt;a href="https://blog.logrocket.com/graphql-vs-rest-api-why-you-shouldnt-use-graphql/"&gt;together&lt;/a&gt;
  using &lt;a href="https://cohost.org/tef/post/1601060-restful-is-antimemet"&gt;simple
  abstractions&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Consider that there are far more complex technical tools in terms of required
skills to implement them, like &lt;a href="https://opencv.org"&gt;computer vision&lt;/a&gt; or
&lt;a href="https://github.com/bulletphysics/bullet3"&gt;physics simulation&lt;/a&gt;, tools which are
also pretty widely used, which consistently generate lower levels of
controversy. People do have strong feelings about these things as well, of
course, and it’s hard to find things to link to that show “this &lt;em&gt;isn’t&lt;/em&gt;
controversial”, but, like, search your feelings, you know it to be true.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;You can see the benefits of the boundary token approach in programming language
design.  Many of the most influential and best-loved programming languages had
an impact not by bundling together lots of tools, but by making everything into
&lt;em&gt;one thing&lt;/em&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LISP: everything is a list&lt;/li&gt;
&lt;li&gt;Smalltalk: everything is an object&lt;/li&gt;
&lt;li&gt;ML: everything is an algebraic data type&lt;/li&gt;
&lt;li&gt;Forth: everything is a stack&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There is a tremendous power in thinking about everything as a single kind of
thing, because then you don’t have to juggle lots of different ideas about
&lt;em&gt;different&lt;/em&gt; kinds of things; you can just think about your problem.&lt;/p&gt;
&lt;p&gt;When people
&lt;a href="https://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/"&gt;complain&lt;/a&gt; about
&lt;a href="https://en.wikipedia.org/wiki/Criticism_of_C%2B%2B#Uniform_initialization_syntax"&gt;programming
languages&lt;/a&gt;,
they’re often complaining about how many &lt;em&gt;different kinds of thing&lt;/em&gt; they have
to remember in order to use it.&lt;/p&gt;
&lt;p&gt;If you keep your boundary-token budget small, and allow your developers to
accomplish as much as possible while staying within a solution space delineated
by a single, clean cognitive boundary, I promise you can innovate as much as
you want and your operational costs will remain manageable.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=epilogue&gt;Epilogue&lt;/h2&gt;
&lt;p&gt;In &lt;a href="https://mastodon.social/@meejah/112729335630376894"&gt;subsequent Mastodon discussion of this
post&lt;/a&gt; on with &lt;a href="https://toot.cafe/@matt"&gt;Matt
Campbell&lt;/a&gt; and
&lt;a href="https://mastodon.social/@meejah"&gt;Meejah&lt;/a&gt;, I realized that I may not have made
it entirely clear why I feel the distinction between “boundary” and
“innovation” tokens is &lt;em&gt;important&lt;/em&gt;.  I do say above that the “innovation token”
model can be a useful heuristic, so why bother with a new, but slightly
different heuristic?  Especially since most experienced engineers - indeed,
McKinley himself - would budget “innovation” quite similarly to “boundaries”,
and might even consider the use of more “innovative” Haskell tools in my
hypothetical scenario to &lt;a href="https://lobste.rs/s/mk05nz/against_innovation_tokens#c_4iqsbs"&gt;not even be an expenditure of innovation tokens at
all&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To answer that, I need to highlight the purpose of having heuristics like this
in the first place.  These are vague, nebulous guidelines, not hard and fast
rules.  I cannot give you a token calculator to plug your technical decisions
into.  The purpose of either token heuristic is to &lt;em&gt;facilitate discussions
among a team&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;With a team of skilled and experienced engineers, the distinction is
meaningless.  Senior and staff engineers (at least, the ones who deserve their
level) will intuit the goals behind “innovation tokens” and inherently consider
things like operational overhead anyway.  In practice, a high-performing,
well-aligned team discussing innovation tokens and one discussing boundary
tokens will look functionally indistinguishable.&lt;/p&gt;
&lt;p&gt;The distinction starts to be important when you have management pressures,
nervous executives, inexperienced engineers, a fresh team without existing
consensus about core technology choices, and so on.  That is to say, most teams
that exist in the messy, perpetually &lt;em&gt;in medias res&lt;/em&gt; world of the software
industry.&lt;/p&gt;
&lt;p&gt;If you are just getting started on a project and you have a bunch of competent
but disagreeable engineers, the words “innovation” and “boundaries” function
very differently.&lt;/p&gt;
&lt;p&gt;If you ask, “is this an innovation” about a particular technical tool, you are
asking your interlocutor to pull in a bunch of their skills and experience to
subjectively evaluate the relative industry-wide, or maybe company-wide, or
maybe team-wide&lt;sup id=fnref:2:against-innovation-tokens-2024-7&gt;&lt;a class=footnote-ref href=#fn:2:against-innovation-tokens-2024-7 id=fnref:2&gt;2&lt;/a&gt;&lt;/sup&gt; newness of the thing being discussed.  The discussion of
whether it counts as boring or innovative is immediately fraught with a ton of
subjective, difficult-to-quantify information about costs of hiring, difficulty
of learning, and your impression of the feelings of hundreds or thousands of
people outside of your team.  And, yes, ultimately you do need to have an
estimate of all that stuff, but starting your “is it OK to use this”
conversation by simultaneously arguing about all those subjective judgments is
setting yourself up for failure.&lt;/p&gt;
&lt;p&gt;Instead, if you ask “does this introduce a boundary between two different
technologies with different conceptual models”, while that is not a &lt;em&gt;perfectly&lt;/em&gt;
objective question, it is much easier for your team to answer, with much
crisper intermediary factual questions.  What are the two technologies?  What
are the models? How much do they differ? You can just hash out the answers to
each one within the team directly, rather than needing to sift through the last
few years of Stack Overflow developer surveys to determine relative adoption or
popularity of technologies in the world at large.&lt;/p&gt;
&lt;p&gt;Restricting your supply of either boundary or innovation tokens is a good idea,
but achieving unanimity within your team about what your boundaries are is
always going to be easier than deciding what your innovations are.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=acknowledgments&gt;Acknowledgments&lt;/h2&gt;
&lt;p class=update-note&gt;Thank you to &lt;a href="/pages/patrons.html"&gt;my patrons&lt;/a&gt; who are supporting my writing on
this blog.  If you like what you’ve read here and you’d like to read more of
it, or you’d like to support my &lt;a href="https://github.com/glyph/"&gt;various open-source
endeavors&lt;/a&gt;, you can &lt;a href="/pages/patrons.html"&gt;support my work as a
sponsor&lt;/a&gt;!  I am also &lt;a href=mailto:consulting@glyph.im&gt;available for consulting
work&lt;/a&gt; if you think your organization could benefit
from expertise on topics like “how can we make our architecture more
consistent”.&lt;/p&gt;
&lt;div class=footnote&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=fn:1:against-innovation-tokens-2024-7&gt;
&lt;p id=fn:1&gt;&lt;a href="https://pyvideo.org/djangocon-us-2011/djangocon-2011--keynote---glyph-lefkowitz.html"&gt;I gave a talk about this once, a very long time
ago&lt;/a&gt;,
where Haskell was Python. &lt;a class=footnote-backref href=#fnref:1:against-innovation-tokens-2024-7 title="Jump back to footnote 1 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=fn:2:against-innovation-tokens-2024-7&gt;
&lt;p id=fn:2&gt;It’s not clear, that’s a big part of the problem. &lt;a class=footnote-backref href=#fnref:2:against-innovation-tokens-2024-7 title="Jump back to footnote 2 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;/body&gt;</content><category term="misc"></category><category term="programming"></category><category term="deployment"></category><category term="ops"></category><category term="architecture"></category></entry><entry><title>A Grand Unified Theory of the AI Hype Cycle</title><link href="https://blog.glyph.im/2024/05/grand-unified-ai-hype.html" rel="alternate"></link><published>2024-05-22T09:58:00-07:00</published><updated>2024-05-22T09:58:00-07:00</updated><author><name>Glyph</name></author><id>tag:blog.glyph.im,2024-05-22:/2024/05/grand-unified-ai-hype.html</id><summary type="html">&lt;p&gt;I’m sorry, but as an AI language model, I cannot repeat history
exactly. However, I can rhyme with it.&lt;/p&gt;</summary><content type="html">&lt;body&gt;&lt;h2 id=the-cycle&gt;The Cycle&lt;/h2&gt;
&lt;p&gt;The history of AI goes in cycles, each of which looks at least a &lt;em&gt;little&lt;/em&gt; bit like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Scientists do some basic research and develop a promising novel mechanism, &lt;code&gt;N&lt;/code&gt;. One important detail is that &lt;code&gt;N&lt;/code&gt; has a specific name; it may or may not be carried out under the general umbrella of “AI research” but it is not itself “AI”.  &lt;code&gt;N&lt;/code&gt; always has a few properties, but the most common and salient one is that it &lt;em&gt;initially&lt;/em&gt; tends to require about 3x the specifications of the average computer available to the market at the time; i.e., it requires three times as much RAM, CPU, and secondary storage as is shipped in the average computer.&lt;/li&gt;
&lt;li&gt;Research and development efforts begin to get funded on the hypothetical potential of &lt;code&gt;N&lt;/code&gt;.  Because &lt;code&gt;N&lt;/code&gt; is so resource intensive, this funding is used to purchase more computing capacity (RAM, CPU, storage) for the researchers, which leads to immediate results, as the technology was previously resource constrained.&lt;/li&gt;
&lt;li&gt;Initial successes in the refinement of &lt;code&gt;N&lt;/code&gt; hint at truly revolutionary possibilities for its deployment.  These revolutionary possibilities include a dimension of cognition that has not previously been machine-automated.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Leaders&lt;/em&gt; in the field of this new development — specifically leaders, like lab administrators, corporate executives, and so on, as opposed to practitioners like engineers and scientists — recognize the sales potential of referring to this newly-“thinking” machine as “Artificial Intelligence”, often speculating about science-fictional levels of societal upheaval (specifically in a period of 5-20 years), now that the “hard problem” of machine cognition has been solved by &lt;code&gt;N&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Other technology leaders, in related fields, also recognize the sales potential and begin adopting elements of the novel mechanism to combine with their own areas of interest, also referring to their projects as “AI” in order to access the pool of cash that has become available to that label.  In the course of doing so, they incorporate &lt;code&gt;N&lt;/code&gt; in increasingly unreasonable ways.&lt;/li&gt;
&lt;li&gt;The scope of “AI” balloons to include pretty much all of computing technology. Some things that do not even include &lt;code&gt;N&lt;/code&gt; start getting labeled this way.&lt;/li&gt;
&lt;li&gt;There’s a massive economic boom within the field of “AI”, where “the field of AI” means any software development that is plausibly adjacent to &lt;code&gt;N&lt;/code&gt; in any pitch deck or grant proposal.&lt;/li&gt;
&lt;li&gt;Roughly 3 years pass, while those who control the flow of money gradually become skeptical of the overblown claims that recede into the indeterminate future, where &lt;code&gt;N&lt;/code&gt; precipitates a robot apocalypse somewhere between 5 and 20 years away.  Crucially, because of the aforementioned resource-intensiveness, the &lt;a href="https://wiki.c2.com/?GoldOwner"&gt;gold owners&lt;/a&gt; skepticism grows &lt;em&gt;slowly&lt;/em&gt; over this period, because their own personal computers or the ones they have access to do not have the requisite resources to actually run the technology in question and it is challenging for them to observe its performance directly.  Public critics begin to appear.&lt;/li&gt;
&lt;li&gt;Competent &lt;em&gt;practitioners&lt;/em&gt; — not leaders — who have been successfully using &lt;code&gt;N&lt;/code&gt; in research or industry quietly stop calling their tools “AI”, or at least stop emphasizing the “artificial intelligence” aspect of them, and start getting funding under other auspices.  Whatever &lt;code&gt;N&lt;/code&gt; does that &lt;em&gt;isn’t&lt;/em&gt; “thinking” starts getting applied more seriously as its limitations are better understood. Users begin using more specific terms to describe the things they want, rather than calling everything “AI”.&lt;/li&gt;
&lt;li&gt;Thanks to the relentless march of Moore’s law, the specs of the average computer improve. The CPU, RAM, and disk resources required to actually run the software locally come down in price, and everyone upgrades to a new computer that can actually run the new stuff.&lt;/li&gt;
&lt;li&gt;The investors and grant funders update their personal computers, and they start personally running the software they’ve been investing in.  Products with long development cycles are finally released to customers as well, but they are disappointing.  The investors quietly get mad. They’re not going to publicly trash their own investments, but they stop loudly boosting them and they stop writing checks.  They &lt;a href="https://en.wikipedia.org/wiki/Theranos"&gt;pivot to biotech&lt;/a&gt; for a while.&lt;/li&gt;
&lt;li&gt;The field of “AI” becomes increasingly desperate, as it becomes the label applied to uses of &lt;code&gt;N&lt;/code&gt; which are &lt;em&gt;not&lt;/em&gt; productive, since the productive uses are marketed under their application rather than their mechanism. Funders lose their patience, the polarity of the “AI” money magnet rapidly reverses.  Here, the AI winter is finally upon us.&lt;/li&gt;
&lt;li&gt;The remaining AI researchers who still have funding via mechanisms less vulnerable to hype, who are genuinely thinking about automating aspects of cognition rather than simply &lt;code&gt;N&lt;/code&gt;, quietly move on to the next impediment to a truly thinking machine, and in the course of doing so, they discover a &lt;em&gt;new&lt;/em&gt; novel mechanism, &lt;code&gt;M&lt;/code&gt;.  Go to step 1, with &lt;code&gt;M&lt;/code&gt; as the new &lt;code&gt;N&lt;/code&gt;, and our current &lt;code&gt;N&lt;/code&gt; as a thing that is now “not AI”, called by its own, more precise name.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=the-history&gt;The History&lt;/h2&gt;
&lt;p&gt;A non-exhaustive list of previous values of &lt;code&gt;N&lt;/code&gt; have been:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Neural networks and symbolic reasoning in the 1950s.&lt;/li&gt;
&lt;li&gt;Theorem provers in the 1960s.&lt;/li&gt;
&lt;li&gt;Expert systems in the 1980s.&lt;/li&gt;
&lt;li&gt;Fuzzy logic and hidden Markov models in the 1990s.&lt;/li&gt;
&lt;li&gt;Deep learning in the 2010s.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each of these cycles has been larger and lasted longer than the last, and I want to be clear: each cycle has produced &lt;em&gt;genuinely useful technology&lt;/em&gt;.  It’s just that each follows the progress of a &lt;a href="https://en.wikipedia.org/wiki/Sigmoid_function"&gt;sigmoid curve&lt;/a&gt; that everyone mistakes for an &lt;a href="https://en.wikipedia.org/wiki/Exponential_growth"&gt;exponential one&lt;/a&gt;.  There is an initial burst of rapid improvement, followed by gradual improvement, followed by a plateau.  Initial promises imply or even state outright “if we pour more {compute, RAM, training data, money} into this, we’ll get improvements forever!” The reality is always that these strategies inevitably have a limit, usually one that does not take too long to find.&lt;/p&gt;
&lt;h2 id=where-are-we-now&gt;Where Are We Now?&lt;/h2&gt;
&lt;p&gt;So where are we in the current hype cycle?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=dDUC-LqVrPU"&gt;Here’s a Computerphile video which explains some recent research into LLM performance&lt;/a&gt;.  I’d highly encourage you to have &lt;a href="https://arxiv.org/pdf/2404.04125"&gt;a look at the paper itself&lt;/a&gt;, particularly Figure 2, “Log-linear relationships between concept frequency and CLIP zero-shot performance”.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://simonwillison.net/series/llms-on-personal-devices/"&gt;Here’s a series of posts by Simon Willison explaining the trajectory of the practicality of actually-useful LLMs on personal devices&lt;/a&gt;.  He hasn’t written much about it recently because it is now fairly pedestrian for an AI-using software developer to have a bunch of local models, and although we haven’t quite broken through the price floor of &lt;a href="https://www.youtube.com/watch?v=8bhsUO2D938"&gt;the gear-acquisition-syndrome prosumer market&lt;/a&gt; in terms of the requirements of doing so, we are getting close.&lt;/li&gt;
&lt;li&gt;The Rabbit R1 and Humane AI Pin were both released; were they disappointments to their customers and investors? I think &lt;a href="https://techcrunch.com/2024/04/17/mkbhd-humane-ai-review-fisker/"&gt;we all know how that went&lt;/a&gt; at this point.&lt;/li&gt;
&lt;li&gt;I hear &lt;a href="https://www.crunchbase.com/organization/karius/company_financials"&gt;Karius just raised a series C&lt;/a&gt;, and they’re an “emerging unicorn”.&lt;/li&gt;
&lt;li&gt;It does appear that &lt;a href="https://trends.google.com/trends/explore?date=today%205-y&amp;amp;geo=US&amp;amp;q=large%20language%20model,artificial%20intelligence&amp;amp;hl=en"&gt;we are all still resolutely calling these things “AI” for now, though&lt;/a&gt;, much as I wish, as a semasiology enthusiast, that we would be more precise.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=some-qualifications&gt;Some Qualifications&lt;/h2&gt;
&lt;p&gt;History does not repeat itself, but it does rhyme. This hype cycle is unlike any that have come before in various ways. There is more money involved now. It’s much more commercial; I had to phrase things above in very general ways because many previous hype waves have been based on research funding, some really being &lt;em&gt;exclusively&lt;/em&gt; a phenomenon at one department in &lt;a href="https://en.wikipedia.org/wiki/DARPA"&gt;DARPA&lt;/a&gt;, and not, like, the &lt;a href="https://www.statista.com/statistics/1446052/worldwide-spending-on-ai-by-industry/"&gt;entire economy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I cannot tell you when the current mania will end and this bubble will burst. If I could, you’d be reading this in my $100,000 per month subscribers-only trading strategy newsletter and not a public blog. What I &lt;em&gt;can&lt;/em&gt; tell you is that computers cannot think, and that the problems of the current instantation of the nebulously defined field of “AI” will not all be solved within “5 to 20 years”.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=acknowledgments&gt;Acknowledgments&lt;/h2&gt;
&lt;p class=update-note&gt;Thank you to &lt;a href="/pages/patrons.html"&gt;my patrons&lt;/a&gt; who are supporting my writing on
this blog.  Special thanks also to Ben Chatterton for a brief pre-publication
review; any errors remain my own.  If you like what you’ve read here and you’d
like to read more of it, or you’d like to support my &lt;a href="https://github.com/glyph/"&gt;various open-source
endeavors&lt;/a&gt;, you can &lt;a href="/pages/patrons.html"&gt;support my work as a
sponsor&lt;/a&gt;!  I am also &lt;a href=mailto:consulting@glyph.im&gt;available for consulting
work&lt;/a&gt; if you think your organization could benefit
from expertise on topics like “what are &lt;strong&gt;we&lt;/strong&gt; doing that history will condemn us
for”.  Or, you know, Python programming.&lt;/p&gt;&lt;/body&gt;</content><category term="misc"></category><category term="ai"></category><category term="llm"></category><category term="hype"></category><category term="history"></category><category term="semasiology"></category></entry><entry><title>How To PyCon</title><link href="https://blog.glyph.im/2024/05/how-to-pycon.html" rel="alternate"></link><published>2024-05-15T02:12:00-07:00</published><updated>2024-05-15T02:12:00-07:00</updated><author><name>Glyph</name></author><id>tag:blog.glyph.im,2024-05-15:/2024/05/how-to-pycon.html</id><summary type="html">&lt;p&gt;Since I am headed to PyCon tomorrow, let’s talk about conference tips.&lt;/p&gt;</summary><content type="html">&lt;body&gt;&lt;p&gt;These tips are not the “right” way to do PyCon, but they are suggestions based
on how &lt;em&gt;I&lt;/em&gt; try to do PyCon.  Consider them reminders to myself, an experienced
long-time attendee, which you are welcome to overhear.&lt;/p&gt;
&lt;h2 id=see-some-talks&gt;See Some Talks&lt;/h2&gt;
&lt;p&gt;The hallway track is awesome.  But the best version of the hallway track is not
just bumping into people and chatting; it’s the version where you’ve all
recently seen the same thing, and thereby have a shared context of something to
react to.  &lt;a href="https://hynek.me/articles/hallway-track/"&gt;If you aren’t going to talks, you aren’t going to get a good
hallway track.&lt;/a&gt;.  Therefore: choose
talks that interest you, attend them and pay close attention, then find people
to talk to about them.&lt;/p&gt;
&lt;p&gt;Given that you will want to see some of the talks, make sure that you have the
schedule downloaded and available offline on your mobile device, or printed out
on a piece of paper.&lt;/p&gt;
&lt;p&gt;Make a list of the talks you think you want to see, but have that schedule with
you in case you want to &lt;a href="https://en.wiktionary.org/wiki/call_an_audible#:~:text=To%20change%20plans"&gt;call an
audible&lt;/a&gt;
in the middle of the conference, switching to a different talk you didn’t
notice based on some of those “hallway track” conversations.&lt;/p&gt;
&lt;h2 id=participate-in-open-spaces&gt;Participate In Open Spaces&lt;/h2&gt;
&lt;p&gt;The name “hallway track” itself is antiquated, in a way which is relevant and
important to modern conferences.  It used to be that conferences were
exclusively oriented around their scheduled talks; it was called the “hallway”
track because the way to access it was to linger in the hallways, outside the
official structure of the conference, and just talk to people.&lt;/p&gt;
&lt;p&gt;But however, at PyCon and many other conferences, this unofficial track is now
much more of an integrated, official part of the program.  In particular, &lt;a href="https://us.pycon.org/2024/events/open-spaces/"&gt;open
spaces&lt;/a&gt; are not only a more
official hallway track, they are considerably &lt;em&gt;better&lt;/em&gt; than the historical
“hallway” experience, because these ad-hoc gatherings can be convened with a
prepared topic and potentially a loose structure to facilitate productive
discussion.&lt;/p&gt;
&lt;p&gt;With open spaces, sessions can have an agenda and so conversations are easier
to start.  Rooms are provided, which is more useful than you might think;
&lt;em&gt;literally&lt;/em&gt; hanging out in a hallway is actually surprisingly disruptive to
speakers and attendees at talks; us nerds tend to get pretty loud and can be
quite audible even through a slightly-cracked door, so avail yourself of these
rooms and don’t be a disruptive jerk outside somebody’s talk.&lt;/p&gt;
&lt;p&gt;Consult the open space board, and put up your own proposed sessions.  Post them
as early as you can, to maximize the chance that they will get noticed.  Post
them on social media, using the conference's official hashtag, and ask any
interested folks you bump into help boost it.&lt;sup id=fnref:1:how-to-pycon-2024-5&gt;&lt;a class=footnote-ref href=#fn:1:how-to-pycon-2024-5 id=fnref:1&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Remember that open spaces are not talks.  If you want to give a mini-lecture on
a topic and you can find interested folks you &lt;em&gt;could&lt;/em&gt; do that, but the format
lends itself to more peer-to-peer, roundtable-style interactions.  Among other
things, this means that, unlike proposing a talk, where &lt;em&gt;you&lt;/em&gt; should be an
expert on the topic that you are proposing, you can suggest open spaces where
you are &lt;em&gt;curious&lt;/em&gt; — but ignorant — about something, in the hopes that some
experts will show up and you can listen to their discussion.&lt;/p&gt;
&lt;p&gt;Be prepared for this to fail; there’s a lot going on and it’s always possible
that nobody will notice your session.  Again, maximize your chances by posting
it as early as you can and promoting it, but be prepared to just have a free 30
minutes to check your email.  Sometimes that’s just how it goes.  The corollary
here is not to always balance attending others’ spaces with proposing your own.
After all if someone else proposed it you know at least &lt;em&gt;one&lt;/em&gt; other person is
gonna be there.&lt;/p&gt;
&lt;h2 id=take-care-of-your-body&gt;Take Care of Your Body&lt;/h2&gt;
&lt;p&gt;Conferences can be surprisingly high-intensity physical activities.  It’s not a
marathon, but you will be walking quickly from one end of a large convention
center to another, potentially somewhat anxiously.&lt;/p&gt;
&lt;p&gt;Hydrate, hydrate, hydrate.  Bring a water bottle, and have it with you at all
times. It might be helpful to set repeating timers on your phone to drink
water, since it can be easy to forget in the middle of engaging
conversations. If you take advantage of the hallway track as much as you
should, you will talk more than you expect; talking expels water from your
body. All that aforementioned walking might make you sweat a bit more than you
realize.&lt;/p&gt;
&lt;p&gt;Hydrate.&lt;/p&gt;
&lt;p&gt;More generally, pay attention to what you are eating and drinking.  Conference
food isn’t always the best, and in a new city you might be tempted to load up
on big meals and junk food.  You &lt;em&gt;should&lt;/em&gt; enjoy yourself and experience the
local cuisine, but do it intentionally.  &lt;em&gt;While&lt;/em&gt; you enjoy the local fare, do
so in whatever moderation works best for you.  Similarly for boozy night-time
socializing.  Nothing stings quite as much as missing a morning of talks
because you’ve got a hangover or a migraine.&lt;/p&gt;
&lt;p&gt;This is worth emphasizing because in the enthusiasm of an exciting conference
experience, it’s easy to lose track and overdo it.&lt;/p&gt;
&lt;h2 id=meet-both-new-and-old-friends-plan-your-socializing&gt;Meet Both New And Old Friends: Plan Your Socializing&lt;/h2&gt;
&lt;p&gt;A lot of the advice above is mostly for first-time or new-ish conferencegoers,
but this one might be more useful for the old heads.  As we build up a
long-time clique of conference friends, it’s easy to get a bit insular and lose
out on one of the bits of magic of such an event: meeting new folks and hearing
new perspectives.&lt;/p&gt;
&lt;p&gt;While open spaces can address this a little bit, there's one additional thing
I've started doing in the last few years: dinners are for old friends, but
lunches are for new ones.  At least half of the days I'm there, I try to go to
a new table with new folks that I haven't seen before, and strike up a
conversation.  I even have a little canned icebreaker prompt, which I would
suggest to others as well, because it’s worked pretty nicely in past years:
“what is one fun thing you have done with Python recently?”&lt;sup id=fnref:2:how-to-pycon-2024-5&gt;&lt;a class=footnote-ref href=#fn:2:how-to-pycon-2024-5 id=fnref:2&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Given that I have a pretty big crowd of old friends at these things, I actually
tend to &lt;em&gt;avoid&lt;/em&gt; old friends at lunch, since it’s so easy to get into multi-hour
conversations, and meeting new folks in a big group can be intimidating.
Lunches are the time I carve out to try and meet new folks.&lt;/p&gt;
&lt;h2 id=ill-see-you-there&gt;I’ll See You There&lt;/h2&gt;
&lt;p&gt;I hope some of these tips were helpful, and I am looking forward to seeing some
of you at PyCon US 2024!&lt;/p&gt;
&lt;p class=update-note&gt;Thank you to &lt;a href="/pages/patrons.html"&gt;my patrons&lt;/a&gt; who are
supporting my writing on this blog.  If you like what you’ve read here and
you’d like to read more of it, or you’d like to support my &lt;a href="https://github.com/glyph/"&gt;various open-source
endeavors&lt;/a&gt;, you can &lt;a href="/pages/patrons.html"&gt;support my work as a sponsor&lt;/a&gt;!&lt;/p&gt;
&lt;div class=footnote&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=fn:1:how-to-pycon-2024-5&gt;
&lt;p id=fn:1&gt;In PyCon2024's case, &lt;a href="https://mastodon.social/@hugovk/112439353262432818"&gt;#PyConUS&lt;/a&gt; on &lt;a href="https://fosstodon.org/@pycon"&gt;Mastodon&lt;/a&gt; is probably the way to go.  Note, also, that it is #PyConUS and &lt;a href="https://mastodon.social/@hugovk/112439558165008054"&gt;not #pyconus&lt;/a&gt;, which is much less legible for users of screen-readers. &lt;a class=footnote-backref href=#fnref:1:how-to-pycon-2024-5 title="Jump back to footnote 1 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=fn:2:how-to-pycon-2024-5&gt;
&lt;p id=fn:2&gt;Obviously that is specific to this conference.  At the O’Reilly Software
Architecture conference, my prompt was “What is software architecture?”
which had some &lt;em&gt;really&lt;/em&gt; fascinating answers. &lt;a class=footnote-backref href=#fnref:2:how-to-pycon-2024-5 title="Jump back to footnote 2 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;/body&gt;</content><category term="misc"></category><category term="pycon"></category></entry><entry><title>Hope</title><link href="https://blog.glyph.im/2024/05/hope.html" rel="alternate"></link><published>2024-05-07T15:26:00-07:00</published><updated>2024-05-07T15:26:00-07:00</updated><author><name>Glyph</name></author><id>tag:blog.glyph.im,2024-05-07:/2024/05/hope.html</id><summary type="html">&lt;p&gt;Your words are doing something. Do you know what that something is?&lt;/p&gt;</summary><content type="html">&lt;body&gt;&lt;p&gt;Humans are pattern-matching machines.  As a species, it is our superpower.  To
summarize the core of my own epistemic philosophy, here is a brief list of the
activities in the core main-loop of a human being:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;stuff happens to us&lt;/li&gt;
&lt;li&gt;we look for patterns in the stuff&lt;/li&gt;
&lt;li&gt;we weave those patterns into narratives&lt;/li&gt;
&lt;li&gt;we turn the narratives into models of the world&lt;/li&gt;
&lt;li&gt;we predict what will happen based on those models&lt;/li&gt;
&lt;li&gt;we do stuff based on those predictions&lt;/li&gt;
&lt;li&gt;based on the stuff we did, more stuff happens to us; return to step 1&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;While this ability lets humans do lots of great stuff, like math and physics
and agriculture and so on, we can just as easily build bad stories and bad
models.  We can easily trick ourselves into thinking that our predictive
abilities are more powerful than they are.&lt;/p&gt;
&lt;p&gt;The existence of magic-seeming levels of prediction in fields like chemistry
and physics and statistics, in addition to the practical usefulness of rough
estimates and heuristics in daily life, itself easily creates a misleading
pattern.  “I see all these patterns and make all these predictions and I’m
right a lot of the time, so if I just kind of wing it and predict some more
stuff, I’ll also be right about that stuff.”&lt;/p&gt;
&lt;p&gt;This leaves us very vulnerable to things like &lt;a href="https://en.wikipedia.org/wiki/Mean_world_syndrome"&gt;mean world
syndrome&lt;/a&gt;.  Mean world
syndrome itself is specifically about &lt;em&gt;danger&lt;/em&gt;, but I believe it is a
manifestation of an even broader phenomenon which I would term “the apophenia
of despair”.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Confirmation_bias"&gt;Confirmation bias&lt;/a&gt; is an
inherent part of human cognition, but the internet has turbocharged it.  Humans
have immediate access to more information than we ever had in the past. In
order to cope with that information, we have also built ways to &lt;em&gt;filter&lt;/em&gt; that
information.  Even disregarding things like algorithmic engagement maximization
and social media filter bubbles, the simple fact that when you search for
things, you are a lot more likely to find the thing that you’re searching for
than to find arguments refuting it, can provide a very strong sense that you’re
right about whatever you’re researching.&lt;/p&gt;
&lt;p&gt;All of this is to say: if you decide that something in the world is getting
worse, you can &lt;em&gt;very easily&lt;/em&gt; convince yourself that it is getting much, much
worse, very rapidly.  Especially because there are things which are,
unambiguously, getting worse.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;However, Pollyanna-ism is just the same phenomenon in reverse and I don’t want
to engage in that. &lt;a href="https://www.epa.gov/climate-indicators/climate-change-indicators-ice-sheets"&gt;The ice sheets really are
melting&lt;/a&gt;,
&lt;a href="https://www.cambridge.org/core/journals/british-journal-of-political-science/article/populist-a-database-of-populist-farleft-and-farright-parties-using-expertinformed-qualitative-comparative-classification-eiqcc/EBF60489A0E1E3D91A6FE066C7ABA2CA"&gt;globally, fascism really is on the
rise&lt;/a&gt;.
I am not here to deny reality or to &lt;a href="https://www.buzzsprout.com/2040953/14551597-the-better-angels-of-our-nature-part-1-you-re-not-wrong-pinker-you-re-just-an-sshole"&gt;cherry pick a bunch of statistics to lull
people into
complacency&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I believe that while &lt;em&gt;dwelling&lt;/em&gt; on a negative reality is bad, I also believe
that in the face of constant denial, it &lt;em&gt;is&lt;/em&gt; sometimes necessary to simply
&lt;em&gt;emphasize&lt;/em&gt; those realities, however unpleasant they may be.  Distinguishing
between unhelpful rumination on negativity and repetition of an unfortunate but
important truth to correct popular perception is subjective and subtle, but the
difference is nevertheless important.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;As our ability to acquire information about things getting worse has grown, our
ability to affect those things has not. Knowledge is not power; power is power,
and most of us don’t have a lot of it, so we need to be strategic in the way
that we deploy our limited political capital and personal energy.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.apa.org/monitor/2022/11/strain-media-overload"&gt;Overexposure to negative news can cause symptoms of
depression&lt;/a&gt;;
depressed people have reduced executive function and find it harder to &lt;em&gt;do
stuff&lt;/em&gt;.  One of the most effective interventions against this general feeling
of malaise?
&lt;a href="https://www.apa.org/monitor/2024/01/trends-hope-greater-meaning-life"&gt;Hope.&lt;/a&gt;.
Not “hope” in the sense of wishing.  As this article in the American
Psychological Association’s “Monitor on Psychology” puts it:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“We often use the word ‘hope’ in place of wishing, like you hope it rains
today or you hope someone’s well,” said Chan Hellman, PhD, a professor of
psychology and founding director of the Hope Research Center at the
University of Oklahoma. “But wishing is passive toward a goal, and hope is
about taking action toward it.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here, finally, I can get around to my point.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you have an audience, and you have some negative thoughts about some social
trend, talking about it in a way which is vague and non-actionable is
potentially &lt;em&gt;quite harmful&lt;/em&gt;.  If you are doing this, you are engaged in the
political project of robbing a large number of people of hope.  You are saying
that the best should have less conviction, while the worst will surely remain
just as full of passionate intensity.&lt;/p&gt;
&lt;p&gt;I do not mean to say that it is unacceptable to ever publicly share thoughts of
sadness, or even hopelessness.  If everyone in public is forced to always put
on a plastic smile and pretend that everything is going to be okay if we have
grit and determination, then we have an Instagram culture of fake highlight
reels where anyone having their &lt;em&gt;own&lt;/em&gt; struggles with hopelessness will just
feel even worse in their isolation.  I certainly posted my way through my fair
share of pretty bleak mental health issues during the worst of the pandemic.&lt;/p&gt;
&lt;p&gt;But we should recognize that while sadness is a feeling, hopelessness is a
&lt;em&gt;problem&lt;/em&gt;, a bad reaction to that feeling, one that needs to be addressed if we
are going to collectively dig ourselves out of the problem that creates the
sadness in the first place.  We may not be able to conjure hope all the time,
but we &lt;em&gt;should&lt;/em&gt; always be &lt;em&gt;trying&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;When we try to address these feelings, as I said earlier, Pollyanna-ism doesn’t
help. The antidote to hopelessness is not optimism, but &lt;em&gt;curiosity&lt;/em&gt;. If you
have a strong thought like “people these days just don’t care about other
people&lt;sup id=fnref:1:hope-2024-5&gt;&lt;a class=footnote-ref href=#fn:1:hope-2024-5 id=fnref:1&gt;1&lt;/a&gt;&lt;/sup&gt;”, yelling “YES THEY DO” at yourself (or worse, your audience) is
unlikely to make much of a change, and certainly not likely to be convincing to
an audience. Instead, you could ask yourself some questions, and use them for a
jumping-off point for some research:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Why do I think this — is the problem in my perception, or in the world?&lt;/li&gt;
&lt;li&gt;If there is a problem in my perception, is this a common misperception?  If
   it’s common, what is leading to it being common?  If it’s unique to me, what
   sort of work do I need to do to correct it?&lt;/li&gt;
&lt;li&gt;If the problem is real, what are its causes?  Is there anything that I, or
   my audience, could do to &lt;em&gt;address&lt;/em&gt; those causes?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The answers to these questions also inform step 6 of the process I outlined
above: the &lt;em&gt;doing stuff&lt;/em&gt; part of the process.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;At some level, all communication is persuasive communication.  Everything you
say that another person might hear, everything you say that a person might
hear, is part of a
&lt;a href="https://en.wikipedia.org/wiki/Language_game_(philosophy)"&gt;sprachspiel&lt;/a&gt; where
you are attempting to achieve something.  There is always an implied call to
action; even “do nothing, accept the status quo” is itself an action.  &lt;em&gt;My&lt;/em&gt;
call to action right now is to ask you to never make &lt;em&gt;your&lt;/em&gt; call to action “you
should feel bad, and you should feel bad about feeling bad”.  When you
communicate in public, your words have power.&lt;/p&gt;
&lt;p&gt;Use that power for good.&lt;/p&gt;
&lt;h2 id=acknowledgments&gt;Acknowledgments&lt;/h2&gt;
&lt;p class=update-note&gt;Thank you to &lt;a href="/pages/patrons.html"&gt;my patrons&lt;/a&gt; who are supporting my writing on
this blog.  If you like what you’ve read here and you’d like to read more of
it, or you’d like to support my &lt;a href="https://github.com/glyph/"&gt;various open-source
endeavors&lt;/a&gt;, you can &lt;a href="/pages/patrons.html"&gt;support my work as a
sponsor&lt;/a&gt;!  Special thanks also to Cassandra Granade, who
provided some editorial feedback on this post; any errors, of course, remain my
own.&lt;/p&gt;
&lt;div class=footnote&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=fn:1:hope-2024-5&gt;
&lt;p id=fn:1&gt;I should also note that vague sentiments of this form, “things used to be
better, now they’re getting worse”, are at their core a reactionary
yearning for a prelapsarian past, which is both &lt;a href="https://www.youtube.com/watch?v=MZHN-OFdEtM"&gt;not a good
look&lt;/a&gt; and also often wrong in
a very common way. Complaining about how “people” are getting worse is a
very short journey away from complaining about &lt;a href="https://www.mentalfloss.com/article/52209/15-historical-complaints-about-young-people-ruining-everything"&gt;kids these
days&lt;/a&gt;,
which has a long and embarrassing history of being comprehensively
incorrect in every era. &lt;a class=footnote-backref href=#fnref:1:hope-2024-5 title="Jump back to footnote 1 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;/body&gt;</content><category term="misc"></category><category term="politics"></category><category term="posting"></category><category term="sprachspiel"></category></entry><entry><title>Software Needs To Be More Expensive</title><link href="https://blog.glyph.im/2024/03/software-needs-to-be-more-expensive.html" rel="alternate"></link><published>2024-03-30T16:00:00-07:00</published><updated>2024-03-30T16:00:00-07:00</updated><author><name>Glyph</name></author><id>tag:blog.glyph.im,2024-03-30:/2024/03/software-needs-to-be-more-expensive.html</id><summary type="html">&lt;p&gt;Software, like coffee, is too artificially cheap, and we need to make
it more expensive.  I have one suggestion for how to do that.&lt;/p&gt;</summary><content type="html">&lt;body&gt;&lt;h2 id=the-cost-of-coffee&gt;The Cost of Coffee&lt;/h2&gt;
&lt;p&gt;One of the ideas that &lt;a href="https://www.youtube.com/@jameshoffmann"&gt;James Hoffmann&lt;/a&gt;
— probably the most influential… influencer in the coffee industry — works hard
to popularize is that “coffee needs to be more expensive”.&lt;/p&gt;
&lt;p&gt;The coffee industry is famously exploitative.  Despite relatively thin margins
for independent café owners&lt;sup id=fnref:1:software-needs-to-be-more-expensive-2024-3&gt;&lt;a class=footnote-ref href=#fn:1:software-needs-to-be-more-expensive-2024-3 id=fnref:1&gt;1&lt;/a&gt;&lt;/sup&gt;, there are no shortage of horrific stories
about &lt;a href="https://www.theguardian.com/business/2020/mar/01/children-work-for-pittance-to-pick-coffee-beans-used-by-starbucks-and-nespresso"&gt;labor
exploitation&lt;/a&gt;
and even
&lt;a href="https://www.dol.gov/agencies/ilab/addressing-child-labor-and-forced-labor-coffee-supply-chain-honduras"&gt;slavery&lt;/a&gt;
in the coffee supply chain.&lt;/p&gt;
&lt;p&gt;To summarize a point that Mr. Hoffman has made over a quite long series of
videos and interviews&lt;sup id=fnref:2:software-needs-to-be-more-expensive-2024-3&gt;&lt;a class=footnote-ref href=#fn:2:software-needs-to-be-more-expensive-2024-3 id=fnref:2&gt;2&lt;/a&gt;&lt;/sup&gt;, some of this can be fixed by regulatory efforts.
Enforcement of supply chain policies both by manufacturers and governments can
help spot and avoid this type of exploitation.  Some of it can be fixed by
discernment on the part of consumers.  You can try to buy fair-trade coffee,
avoid brands that you know have problematic supply-chain histories.&lt;/p&gt;
&lt;p&gt;Ultimately, though, even if there is perfect, universal, zero-cost enforcement
of supply chain integrity… consumers still have to be willing to, you know,
&lt;em&gt;pay more for the coffee&lt;/em&gt;.  It costs more to pay wages than to have slaves.&lt;/p&gt;
&lt;h2 id=the-price-of-software&gt;The Price of Software&lt;/h2&gt;
&lt;p&gt;The problem with the coffee supply chain deserves your attention in its own
right.  I don’t mean to claim that the problems of open source maintainers are
as severe as those of literal child slaves.  But the principle is the same.&lt;/p&gt;
&lt;p&gt;Every tech company uses huge amounts of open source software, which they get
for free.&lt;/p&gt;
&lt;p&gt;I do not want to argue that this is straightforwardly exploitation.  There is a
complex bargain here for the open source maintainers: if you create open source
software, you can &lt;a href="https://opensource.com/article/19/5/how-get-job-doing-open-source"&gt;get a job more
easily&lt;/a&gt;.  If
you create open source infrastructure, you can make choices about the
architecture of your projects which are more long-term sustainable from a
technology perspective, but would be harder to justify on a shorter-term
commercial development schedule.  You can collaborate with a wider group across
the industry.  You can build your personal brand.&lt;/p&gt;
&lt;p&gt;But, in light of the recent &lt;a href="https://boehs.org/node/everything-i-know-about-the-xz-backdoor"&gt;xz Utils / SSH backdoor
scandal&lt;/a&gt;, it is
clear that while the bargain may not be entirely one-sided, it is &lt;em&gt;not&lt;/em&gt;
symmetrical, and significant bad consequences may result, both for the
maintainers themselves and for society.&lt;/p&gt;
&lt;p&gt;To fix this problem, open source software needs to get more expensive.&lt;/p&gt;
&lt;p&gt;A &lt;em&gt;big&lt;/em&gt; part of the appeal of open source is its implicit permission structure,
which derives both from its zero up-front cost and its zero marginal cost.&lt;/p&gt;
&lt;p&gt;The zero up-front cost means that you can just get it to try it out.  In many
companies, individual software developers do not have the authority to write a
purchase order, or even a corporate credit card for small expenses.&lt;/p&gt;
&lt;p&gt;If you are a software engineer and you need a new development tool or a new
library that you want to purchase for work, it can be a maze of bureaucratic
confusion in order to get that approved.  It might be &lt;em&gt;possible&lt;/em&gt;, but you are
likely to get strange looks, and someone, probably your manager, is quite
likely to say “isn’t there a free option for this?”  At worst, it might just be
impossible.&lt;/p&gt;
&lt;p&gt;This makes sense.  Dealing with purchase orders and reimbursement requests is
annoying, and it only feels worth the overhead if you’re dealing with a large
enough block of functionality that it is worth it for an entire team, or better
yet an org, to adopt.  This means that most of the purchasing is done by
management types or “architects”, who are empowered to make decisions for
larger groups.&lt;/p&gt;
&lt;p&gt;When individual engineers need to solve a problem, they look at open source
libraries and tools specifically &lt;em&gt;because&lt;/em&gt; it’s quick and easy to incorporate
them in a pull request, where a proprietary solution might be tedious and
expensive.&lt;/p&gt;
&lt;p&gt;That’s assuming that a proprietary solution to your problem even exists.  In
the infrastructure sector of the software economy, free options from your
operating system provider (Apple, Microsoft, maybe Amazon if you’re in the
cloud) and open source developers, small commercial options have been
marginalized or outright destroyed by zero-cost options, for this reason.&lt;/p&gt;
&lt;p&gt;If the zero up-front cost is a paperwork-reduction benefit, then the zero
&lt;em&gt;marginal&lt;/em&gt; cost is almost a requirement.  One of the perennial complaints of
open source maintainers is that companies take our stuff, build it into a
product, and then make a zillion dollars and give us nothing.  It seems fair
that they’d give us some kind of royalty, right? Some tiny fraction of that
windfall?  But once you realize that individual developers don’t have the
authority to put $50 on a corporate card to buy a tool, they &lt;em&gt;super&lt;/em&gt; don’t have
the authority to make a technical decision that &lt;em&gt;encumbers the intellectual
property of their entire core product&lt;/em&gt; to give some fraction of the company’s
revenue away to a third party.  Structurally, there’s no way that this will
ever happen.&lt;/p&gt;
&lt;p&gt;Despite these impediments, keeping those dependencies maintained does cost
money.&lt;/p&gt;
&lt;h2 id=some-solutions-already-exist&gt;Some Solutions Already Exist&lt;/h2&gt;
&lt;p&gt;There are various official channels developing to help support the maintenance
of critical infrastructure.  If you work at a big company, you should probably
have a corporate &lt;a href="https://tidelift.com"&gt;Tidelift&lt;/a&gt; subscription.  Maybe ask your
employer about that.&lt;/p&gt;
&lt;p&gt;But, &lt;a href="https://social.coop/@luis_in_brief/112185864683054685"&gt;as they will readily
admit&lt;/a&gt; there are a &lt;em&gt;LOT&lt;/em&gt;
of projects that even Tidelift cannot cover, with no official commercial
support, and no practical way to offer it in the short term.  Individual
maintainers, like yours truly, trying to figure out how to maintain their
projects, either by making a living from them or incorporating them into our
jobs somehow.  People with a Ko-Fi or a Patreon, or maybe just an Amazon
wish-list to let you say “thanks” for occasional maintenance work.&lt;/p&gt;
&lt;p&gt;Most importantly, there’s no path for them to &lt;em&gt;transition&lt;/em&gt; to actually making a
living from their maintenance work.  For most maintainers, Tidelift pays a
sub-hobbyist amount of money, and even setting it up (and GitHub Sponsors, etc)
is a huge hassle.  So even making the transition from “no income” to “a little
bit of side-hustle income” may be prohibitively bureaucratic.&lt;/p&gt;
&lt;p&gt;Let’s take myself as an example.  If you’re a developer who is nominally
profiting from &lt;a href="https://pypi.org/user/glyph/"&gt;my infrastructure work&lt;/a&gt; in your
own career, there is a very strong chance that you are &lt;em&gt;also&lt;/em&gt; a contributor to
the open source commons, and perhaps you’ve even contributed more to that
commons than I have, contributed more to my own career success than I have to
yours.  I can ask you to pay me&lt;sup id=fnref:3:software-needs-to-be-more-expensive-2024-3&gt;&lt;a class=footnote-ref href=#fn:3:software-needs-to-be-more-expensive-2024-3 id=fnref:3&gt;3&lt;/a&gt;&lt;/sup&gt;, but really &lt;em&gt;you&lt;/em&gt; shouldn’t be paying me,
your employer should.&lt;/p&gt;
&lt;h2 id=what-to-do-now-make-it-easy-to-just-pay-money&gt;What To Do Now: Make It Easy To Just Pay Money&lt;/h2&gt;
&lt;p&gt;So if we just need to give open source maintainers more money, and it’s really
the employers who ought to be giving it, then what can we do?&lt;/p&gt;
&lt;p&gt;Let’s not make it complicated.  Employers should &lt;em&gt;just give maintainers money&lt;/em&gt;.
Let’s call it the “JGMM” benefit.&lt;/p&gt;
&lt;p&gt;Specifically, every employer of software engineers should immediately institute
the following benefits program: each software engineer should have a monthly
discretionary budget of $50 to distribute to &lt;em&gt;whatever open source dependency
developers they want&lt;/em&gt;, in whatever way they see fit.  Venmo, Patreon, PayPal,
Kickstarter, GitHub Sponsors, whatever, it doesn’t matter.  Put it on a corp
card, put the project name on the line item, and forget about it.  It’s only
for open source maintenance, but it’s a small enough amount that you don’t need
intense levels of approval-gating process. You can do it on the honor system.&lt;/p&gt;
&lt;p&gt;This preserves zero up-front cost.  To start using a dependency, you still just
use it&lt;sup id=fnref:4:software-needs-to-be-more-expensive-2024-3&gt;&lt;a class=footnote-ref href=#fn:4:software-needs-to-be-more-expensive-2024-3 id=fnref:4&gt;4&lt;/a&gt;&lt;/sup&gt;.  It also preserves zero marginal cost: your developers choose which
dependencies to support based on perceived need and popularity.  It’s a fixed
overhead which doesn’t scale with revenue or with profit, just headcount.&lt;/p&gt;
&lt;p&gt;Because the whole point here is to &lt;em&gt;match&lt;/em&gt; the easy, implicit, no-process,
no-controls way in which &lt;em&gt;dependencies can be added&lt;/em&gt; in most companies.  It
should be easier to pay these small tips than it is to use the software in the
first place.&lt;/p&gt;
&lt;p&gt;This sub-1% overhead to your staffing costs will massively de-risk the open
source projects you use.  By leaving the discretion up to your engineers, you
will end up supporting those projects which are really struggling and which
your executives won’t even hear about until they end up on the news.  Some of
it will go to projects that you don’t use, things that your engineers find
fascinating and want to use one day but don’t yet depend upon, but that’s fine
too.  Consider it an extremely cheap, efficient R&amp;amp;D expense.&lt;/p&gt;
&lt;p&gt;A lot of the options for developers to support open source infrastructure are
already tax-deductible, so if they contribute to something like one of &lt;a href="https://www.python.org/psf/fiscal-sponsorees/"&gt;the
PSF’s fiscal sponsorees&lt;/a&gt;, it’s
probably even more tax-advantaged than a regular business expense.&lt;/p&gt;
&lt;p&gt;I also strongly suspect that if you’re one of the first employers to do this,
you can get a round of really positive PR out of the tech press, and attract
engineers, so, the race is on.  I don’t really count as the “tech press” but
nevertheless &lt;a href=mailto:oss-support-471610@glyph.im&gt;drop me a line&lt;/a&gt; to let me
know if your company ends up doing this so I can shout you out.&lt;/p&gt;
&lt;h2 id=acknowledgments&gt;Acknowledgments&lt;/h2&gt;
&lt;p class=update-note&gt;Thank you to &lt;a href="/pages/patrons.html"&gt;my patrons&lt;/a&gt; who are supporting my writing on
this blog.  If you like what you’ve read here and you’d like to read more of
it, or you’d like to support my &lt;a href="https://github.com/glyph/"&gt;various open-source
endeavors&lt;/a&gt;, you can &lt;a href="/pages/patrons.html"&gt;support my work as a
sponsor&lt;/a&gt;!  I am also &lt;a href=mailto:consulting@glyph.im&gt;available for consulting
work&lt;/a&gt; if you think your organization could benefit
from expertise on topics such as “How do I figure out which open source
projects to give money to?”.&lt;/p&gt;
&lt;div class=footnote&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=fn:1:software-needs-to-be-more-expensive-2024-3&gt;
&lt;p id=fn:1&gt;I don’t have time to get into the margins for Starbucks and friends,
their relationship with labor, economies of scale, etc. &lt;a class=footnote-backref href=#fnref:1:software-needs-to-be-more-expensive-2024-3 title="Jump back to footnote 1 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=fn:2:software-needs-to-be-more-expensive-2024-3&gt;
&lt;p id=fn:2&gt;While this is a theme that pervades much of his work, the only place I
can easily find where he says it in so many words is on a podcast that
sometimes also promotes right-wing weirdos and pseudo-scientific quacks
spreading misinformation about autism and ADHD.  So, I obviously don’t want
to link to them; you’ll have to take my word for it. &lt;a class=footnote-backref href=#fnref:2:software-needs-to-be-more-expensive-2024-3 title="Jump back to footnote 2 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=fn:3:software-needs-to-be-more-expensive-2024-3&gt;
&lt;p id=fn:3&gt;and I will, since &lt;a href="https://blog.glyph.im/2024/03/the-hat.html"&gt;as I just recently wrote
about&lt;/a&gt;, I need to make sure that people are at
least &lt;em&gt;aware of the option&lt;/em&gt; &lt;a class=footnote-backref href=#fnref:3:software-needs-to-be-more-expensive-2024-3 title="Jump back to footnote 3 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=fn:4:software-needs-to-be-more-expensive-2024-3&gt;
&lt;p id=fn:4&gt;Pending whatever legal approval program you have in place to vet the
license.  You &lt;em&gt;do&lt;/em&gt; have a nice streamlined legal approvals process, right?
You’re not just putting &lt;a href="http://www.wtfpl.net"&gt;WTFPL&lt;/a&gt; software into
production, are you? &lt;a class=footnote-backref href=#fnref:4:software-needs-to-be-more-expensive-2024-3 title="Jump back to footnote 4 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;/body&gt;</content><category term="misc"></category><category term="software"></category><category term="supported"></category><category term="open-source"></category></entry><entry><title>The Hat</title><link href="https://blog.glyph.im/2024/03/the-hat.html" rel="alternate"></link><published>2024-03-29T16:56:00-07:00</published><updated>2024-03-29T16:56:00-07:00</updated><author><name>Glyph</name></author><id>tag:blog.glyph.im,2024-03-29:/2024/03/the-hat.html</id><summary type="html">&lt;p&gt;If you want me to keep doing… whatever this is… now’s the time to
support it!&lt;/p&gt;</summary><content type="html">&lt;body&gt;&lt;p&gt;This year I will be going to two conferences: &lt;a href="https://us.pycon.org/2024/"&gt;PyCon
2024&lt;/a&gt;, and &lt;a href="https://2024.northbaypython.org"&gt;North Bay Python
2024&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;At PyCon, I will be promoting my open source work and my writing on this blog.
As I’m not giving a talk this year, I am looking forward to organizing and
participating in some open spaces about topics like software architecture, open
source sustainability, framework interoperability, and event-driven
programming.&lt;/p&gt;
&lt;p&gt;At North Bay Python, though, I will &lt;em&gt;either&lt;/em&gt; be:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;doing a lot more of that, &lt;em&gt;or&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;looking for new full-time employment, pausing the patreon, and winding down
   this experiment.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you’d like to see me doing the former, now would be a great time to sign up
to my &lt;a href="https://www.patreon.com/creatorglyph"&gt;Patreon&lt;/a&gt; to support the
continuation of my independent open source work and writing.&lt;/p&gt;
&lt;h2 id=the-bad-news&gt;The Bad News&lt;/h2&gt;
&lt;p&gt;It has been nearly a year since I &lt;a href="https://blog.glyph.im/2023/03/what-would-you-say-you-do-here.html"&gt;first mentioned that I have a Patreon on
this blog&lt;/a&gt;.  That year has been
a busy one, with consulting work and personal stuff consuming more than enough
time that I have never been full time on independent coding &amp;amp; blogging.  As
such, I’ve focused more on &lt;a href="https://github.com/glyph/fritter"&gt;small&lt;/a&gt;
&lt;a href="https://github.com/glyph/dbxs"&gt;infrastructure projects&lt;/a&gt; and less on
&lt;a href="https://github.com/glyph/Pomodouroboros/"&gt;user-facing apps&lt;/a&gt; than I’d like, but
I have spent the &lt;em&gt;plurality&lt;/em&gt; of my time on it.&lt;/p&gt;
&lt;p&gt;For that to continue, let alone increase, this work needs to—at the very
least—pay for health insurance.  At my current consulting rate, a conservative
estimate based on some time tracking is that I am currently doing this work at
something like a 98.5% discount.  I do love doing it!  I would be happy to
continue doing it at a &lt;em&gt;significant&lt;/em&gt; discount!  But “significant” and
“catastrophic” are different thresholds.&lt;/p&gt;
&lt;p&gt;As I have said previously, this is an appeal to support &lt;em&gt;my independent work&lt;/em&gt;;
&lt;a href="https://mastodon.social/@glyph/109441548070856621"&gt;not to support &lt;em&gt;me&lt;/em&gt;&lt;/a&gt;.  &lt;em&gt;I&lt;/em&gt;
will be fine; what you will be voting for with your wallet is not my well-being
but a choice about where I spend my time.&lt;/p&gt;
&lt;h2 id=hiding-the-hat&gt;Hiding The Hat&lt;/h2&gt;
&lt;p&gt;When people ask me what I do these days, I sometimes struggle to explain.  It
&lt;em&gt;is&lt;/em&gt; confusing.  I might say I have a Patreon, I do a combination of
independent work and consulting, or if I’m feeling particularly sarcastic I
might say I’m an ✨influencer✨.  But recently I saw the very inspiring &lt;a href="https://www.youtube.com/watch?v=EBxqmWQGVVk"&gt;Matt
Ricardo&lt;/a&gt; describing the way he
thinks about his own Patreon, and I realized what I am actually trying to do,
which is &lt;em&gt;software development
&lt;a href="https://en.wikipedia.org/wiki/Street_performance"&gt;busking&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Previously, when I’ve been thinking about making this “okay, it’s been a year
of Patreon, let’s get serious now” post, I’ve been thinking about adding more
reward products to my Patreon, trying to give people better value for their
money before asking for anything more, trying to finish more projects to make a
better sales pitch, maybe making merch available for sale, and so on.  So aside
from irregular weekly posts on Friday and acknowledgments sections at the
bottom of blog posts, I’ve avoided mentioning this while I think about adding
more private rewards.&lt;/p&gt;
&lt;p&gt;But busking is a &lt;em&gt;public&lt;/em&gt; performance, and if you want to support my work then
it is that public aspect that you presumably want to support.  And thus, an
important part of the busking process is to actually &lt;em&gt;pass the hat&lt;/em&gt; at the end.
The people who don’t chip in still get to see the performance, but everyone
else need to know that they &lt;em&gt;can&lt;/em&gt; contribute if they liked it.&lt;sup id=fnref:1:the-hat-2024-3&gt;&lt;a class=footnote-ref href=#fn:1:the-hat-2024-3 id=fnref:1&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;I’m going to try to stop hiding the metaphorical hat.  I still don’t want to
overdo it, but I will trust that you’ll tell me if these reminders get
annoying.  For my part today, in addition to this post, I’m opening up a new
$10 tier on Patreon for people who want to provide a higher level of support,
and officially acknowledging the rewards that I already provide.&lt;/p&gt;
&lt;h2 id=whats-the-deal&gt;What’s The Deal?&lt;/h2&gt;
&lt;p&gt;So, what would you be supporting?&lt;/p&gt;
&lt;h3 id=what-you-give-the-public-part&gt;What You Give (The Public Part)&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;I have tended to focus on my &lt;a href="https://github.com/glyph/"&gt;software&lt;/a&gt;, and
   there has been a lot of it!  You’d be supporting me writing libraries and
   applications and build &lt;a href="https://github.com/glyph/Encrust/issues/2"&gt;infrastructure to help others do the same with
   Python&lt;/a&gt;, as well as maintaining
   existing libraries (like the Twisted ecosystem libraries) sometimes.  If I
   can get enough support together to more than bare support for myself, I’d
   really like to be able to do things like pay people to others to help with
   aspects of applications that I would struggle to complete myself, like
   accessibility or security audits.&lt;/li&gt;
&lt;li&gt;I also do quite a bit of writing though, about software and about other
   things.  To make it easier to see what sort of writing I’m talking about,
   I’ve collected &lt;em&gt;just&lt;/em&gt; the stuff that I’ve written during the period where I
   have had some patrons, under the &lt;a href="/tag/supported.html"&gt;supported&lt;/a&gt; tag.&lt;/li&gt;
&lt;li&gt;Per my earlier sarcastic comment about being an “influencer”, I also do
   quite a bit of posting on &lt;a href="https://mastodon.social/@glyph"&gt;Mastodon&lt;/a&gt; about
   software and the tech industry.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=what-you-get-just-for-patrons&gt;What You Get (Just For Patrons)&lt;/h3&gt;
&lt;p&gt;As I said above, I will be keeping member benefits somewhat minimal.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I will add you to &lt;a href="https://github.com/glyph/sponcom"&gt;SponCom&lt;/a&gt; so that your
   name will be embedded in &lt;a href="https://github.com/glyph/DBXS/commit/a31fb0069cdc4713224244a1723a9a7f141b3ad8"&gt;commit messages like this
   one&lt;/a&gt;
   on a cadence appropriate to your support level.&lt;/li&gt;
&lt;li&gt;You will get access to my private Patreon posts where I discuss what I’ve
   been working on.  As one of my existing patrons put it:&lt;blockquote&gt;
&lt;p&gt;I figure I’m getting pretty good return on it, getting not only targeted
project tracking, but also a peek inside your head when it comes to Sores
Business Development. Maybe some of that stuff will rub off on me :)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;This is a somewhat vague and noncommittal benefit, but it might be the best
   one: if you are interested in the various different projects that I am
   doing, you can help me &lt;em&gt;prioritize&lt;/em&gt;!  I have a lot of things going on.  What
   would you prefer that I focus on?  You can make suggestions in the comments
   of Patreon posts, which I pay a &lt;em&gt;lot&lt;/em&gt; more attention to than other feedback
   channels.&lt;/li&gt;
&lt;li&gt;In the near future&lt;sup id=fnref:2:the-hat-2024-3&gt;&lt;a class=footnote-ref href=#fn:2:the-hat-2024-3 id=fnref:2&gt;2&lt;/a&gt;&lt;/sup&gt; I am also planning to start doing some “office hours”
   type live-streaming, where I will take audience questions and discuss
   software design topics, or maybe do some live development to showcase my
   process and the tools I use.  When I figure out the mechanics of this, I
   plan to add some rewards to the existing tiers to select topics or problems
   for me to work on there.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If that sounds like a good deal to you, please &lt;a href="https://www.patreon.com/creatorglyph"&gt;sign up
now&lt;/a&gt;.  If you’re already supporting me,
sharing this and giving a brief testimonial of something good I’ve done would
be really helpful.  Github is not an algorithmic platform like YouTube, despite
my occasional jokey “remember to like and subscribe”, nobody is getting
recommended DBXS, or Fritter, or Twisted, or Automat, or this blog unless
someone goes out and shares it.&lt;/p&gt;
&lt;div class=footnote&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=fn:1:the-hat-2024-3&gt;
&lt;p id=fn:1&gt;A year into this, after what &lt;em&gt;feels&lt;/em&gt; like endlessly repeating this sales
pitch to the point of obnoxiousness, I still routinely interact with people
who do not realize that I have a Patreon at all. &lt;a class=footnote-backref href=#fnref:1:the-hat-2024-3 title="Jump back to footnote 1 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=fn:2:the-hat-2024-3&gt;
&lt;p id=fn:2&gt;Not &lt;em&gt;quite&lt;/em&gt; comfortable putting this on the official patreon itemized
inventory of rewards yet, but I do plan to add it once I’ve managed to
stream for a couple of weeks in a row. &lt;a class=footnote-backref href=#fnref:2:the-hat-2024-3 title="Jump back to footnote 2 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;/body&gt;</content><category term="misc"></category><category term="patreon"></category><category term="open-source"></category><category term="blogging"></category><category term="supported"></category></entry><entry><title>DBXS 0.1.0</title><link href="https://blog.glyph.im/2024/03/dbxs-0.1.0.html" rel="alternate"></link><published>2024-03-29T15:19:00-07:00</published><updated>2024-03-29T15:19:00-07:00</updated><author><name>Glyph</name></author><id>tag:blog.glyph.im,2024-03-29:/2024/03/dbxs-0.1.0.html</id><summary type="html">&lt;p&gt;Today there is a new release of my database access and query organizer
library with support for MySQL, PostgreSQL, and asyncio.&lt;/p&gt;</summary><content type="html">&lt;body&gt;&lt;h2 id=new-release&gt;New Release&lt;/h2&gt;
&lt;p&gt;Yesterday I published a new release of
&lt;a href="https://pypi.org/project/dbxs/0.1.0/"&gt;DBXS&lt;/a&gt; for you all.  It’s still
&lt;a href="https://0ver.org"&gt;ZeroVer&lt;/a&gt;, but it has graduated from double-ZeroVer as this
is the first nonzero minor version.&lt;/p&gt;
&lt;p&gt;More to the point though, the &lt;em&gt;meaning&lt;/em&gt; of that version increment this version
introduces some critical features that I think most people would need to give
it a spin on a hobby project.&lt;/p&gt;
&lt;h2 id=whats-new&gt;What’s New&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;It has support for
  &lt;a href="https://github.com/glyph/DBXS/blob/a31fb0069cdc4713224244a1723a9a7f141b3ad8/src/dbxs/adapters/async_mysql.py"&gt;MySQL&lt;/a&gt;
  and
  &lt;a href="https://github.com/glyph/DBXS/blob/a31fb0069cdc4713224244a1723a9a7f141b3ad8/src/dbxs/adapters/async_psycopg.py"&gt;PostgreSQL&lt;/a&gt;
  using &lt;em&gt;native &lt;code&gt;asyncio&lt;/code&gt; drivers&lt;/em&gt;, which means you don’t need to take a
  &lt;a href="https://twisted.org"&gt;Twisted&lt;/a&gt; dependency in production.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;While Twisted is still used for some of the testing internals,
  &lt;a href="https://docs.twistedmatrix.com/en/stable/api/twisted.internet.defer.Deferred.html"&gt;&lt;code&gt;Deferred&lt;/code&gt;&lt;/a&gt;
  is no longer exposed anywhere in the public API, either; your tests can
  happily pretend that they’re doing asyncio, as long as they can run against
  SQLite.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There is a new &lt;code&gt;repository&lt;/code&gt; convenience function that automatically wires
  together multiple accessors and transaction discipline.  Have a look at &lt;a href="https://github.com/glyph/DBXS/blob/a31fb0069cdc4713224244a1723a9a7f141b3ad8/src/dbxs/_repository.py#L24-L49"&gt;the
  docstring&lt;/a&gt;
  for a sense of how to use it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Several papercuts, like confusing error messages when messing up query result
  handling, and lack of proper handling of default arguments in access
  protocols, are now addressed.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=its-a-good-time-to-contribute&gt;It’s A Good Time To Contribute!&lt;/h2&gt;
&lt;p&gt;If you’ve been looking for an open source project to try your hand at
contributing to, DBXS might be a great opportunity, for a few reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The team is quite small (just me, right now!), so it’s easy to get involved.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It’s quite generally useful, so there’s a potential for an audience, but
   right now it doesn’t really have any production users; there’s still time to
   change things without a lot of ceremony.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Unlike many other small starter projects, it’s got a test suite with 100%
   coverage, so you can contribute with confidence that you’re not breaking
   anything.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There’s not that much code (a bit over 2 thousand
   &lt;a href="https://en.wikipedia.org/wiki/Source_lines_of_code"&gt;SLOC&lt;/a&gt;), so it’s not
   hard to get your head around.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There are a few obvious next steps for improvement, which &lt;a href="https://github.com/glyph/dbxs/issues"&gt;I’ve filed as
   issues&lt;/a&gt; if you want to pick one up.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Share and enjoy, and please &lt;a href=mailto:dbxs-894741@glyph.im&gt;let me know&lt;/a&gt; if you
do something fun with it.&lt;/p&gt;
&lt;h2 id=acknowledgments&gt;Acknowledgments&lt;/h2&gt;
&lt;p class=update-note&gt;Thank you to &lt;a href="/pages/patrons.html"&gt;my patrons&lt;/a&gt; who are supporting my writing on
this blog.  If you like what you’ve read here and you’d like to read more of
it, or you’d like to support my &lt;a href="https://github.com/glyph/"&gt;various open-source
endeavors&lt;/a&gt;, you can &lt;a href="/pages/patrons.html"&gt;support my work as a
sponsor&lt;/a&gt;!  I am also &lt;a href=mailto:consulting@glyph.im&gt;available for consulting
work&lt;/a&gt; if you think your organization could benefit
from expertise on topics such as “How &lt;em&gt;do&lt;/em&gt; I shot SQL?”.&lt;/p&gt;&lt;/body&gt;</content><category term="misc"></category><category term="supported"></category><category term="python"></category><category term="programming"></category><category term="databases"></category><category term="sql"></category></entry><entry><title>Let Me Tell You A Secret</title><link href="https://blog.glyph.im/2024/02/let-me-tell-you-a-secret.html" rel="alternate"></link><published>2024-02-05T14:36:00-08:00</published><updated>2024-02-05T14:36:00-08:00</updated><author><name>Glyph</name></author><id>tag:blog.glyph.im,2024-02-05:/2024/02/let-me-tell-you-a-secret.html</id><summary type="html">&lt;p&gt;In which I provide you with hundreds of dollars worth of software
consulting, for free, in a single blog post.&lt;/p&gt;</summary><content type="html">&lt;body&gt;&lt;p&gt;I do consulting&lt;sup id=fnref:1:let-me-tell-you-a-secret-2024-2&gt;&lt;a class=footnote-ref href=#fn:1:let-me-tell-you-a-secret-2024-2 id=fnref:1&gt;1&lt;/a&gt;&lt;/sup&gt; on software architecture, network protocol development,
python software infrastructure, streamlined cloud deployment, and open source
strategy, among other nerdy things.  I enjoy solving challenging, complex
technical problems or contributing to the open source commons. On the best
jobs, I get to do both.&lt;/p&gt;
&lt;p&gt;Today I would like to share with you a secret of the software technology
consulting trade.&lt;/p&gt;
&lt;p&gt;I should note that this secret is not specific to me. I have several colleagues
who have also done software consulting and have reflected versions of this
experience back to me.&lt;sup id=fnref:2:let-me-tell-you-a-secret-2024-2&gt;&lt;a class=footnote-ref href=#fn:2:let-me-tell-you-a-secret-2024-2 id=fnref:2&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;We’ll get to the secret itself in a moment, but first, some background.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Companies do not go looking for consulting when things are going great.  This
is particularly true when looking for high-level consulting on things like
system architecture or strategy.  Almost by definition, there’s a problem that
I have been brought in to solve.  Ideally, that problem is a technical
challenge.&lt;/p&gt;
&lt;p&gt;In the software industry, your team probably already has some software
professionals with a variety of technical skills, and thus they know what to do
with technical challenges.  Which means that, as often as not, the problem is
to do with &lt;em&gt;people&lt;/em&gt; rather than technology, even it appears otherwise.&lt;/p&gt;
&lt;p&gt;When you hire a staff-level professional like myself to address your software
team’s general problems, that consultant will need to gather some information.
If I am that consultant and I start to suspect that the purported technology
problem that you’ve got is in fact a people problem, here is the &lt;em&gt;secret
technique&lt;/em&gt; that I am going to use:&lt;/p&gt;
&lt;p&gt;I am going to go get a pen and a pad of paper, then schedule a 90-minute
meeting with the most senior IC&lt;sup id=fnref:3:let-me-tell-you-a-secret-2024-2&gt;&lt;a class=footnote-ref href=#fn:3:let-me-tell-you-a-secret-2024-2 id=fnref:3&gt;3&lt;/a&gt;&lt;/sup&gt; engineer that you have on your team. I will
bring that pen and paper to the meeting.  I will then ask one question:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What is fucked up about this place?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I will then write down their response in as much detail as I can manage.  If I
have begun to suspect that this meeting is necessary, 90 minutes is typically
not enough time, and I will struggle to keep up.  Even so, I will usually
manage to capture the highlights.&lt;/p&gt;
&lt;p&gt;One week later, I will schedule a meeting with executive leadership, and during
that meeting, I will read back a &lt;em&gt;very&lt;/em&gt; lightly edited&lt;sup id=fnref:4:let-me-tell-you-a-secret-2024-2&gt;&lt;a class=footnote-ref href=#fn:4:let-me-tell-you-a-secret-2024-2 id=fnref:4&gt;4&lt;/a&gt;&lt;/sup&gt; version of the
transcript of the previous meeting.  This is then routinely praised as a keen
strategic insight.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I should pause here to explicitly note that — obviously, I hope — this is not
an oblique reference to any current or even recent client; if I’d had this
meeting recently it would be pretty awkward to answer that “so, I read your
blog…” email.&lt;sup id=fnref:5:let-me-tell-you-a-secret-2024-2&gt;&lt;a class=footnote-ref href=#fn:5:let-me-tell-you-a-secret-2024-2 id=fnref:5&gt;5&lt;/a&gt;&lt;/sup&gt; But talking about clients in this way, no matter how
obfuscated and vague the description, is always a bit professionally risky.  So
why risk it?&lt;/p&gt;
&lt;p&gt;The thing is, I’m not a people manager.  While I &lt;em&gt;can&lt;/em&gt; do this kind of work,
and I do not begrudge doing it if it is the thing that needs doing, I find it
stressful and unfulfilling. I am a technology guy, not a people person.  This
is generally true of people who elect to go into technology consulting; we know
where the management track is, and we didn’t pick it.&lt;/p&gt;
&lt;p&gt;If you are going to hire me for my highly specialized technical expertise, I
want you to get the maximum value out of it.  I know my value; my rates are not
low, and I do not want clients to come away with the sense that I only had a
couple of “obvious” meetings.&lt;/p&gt;
&lt;p&gt;So the intended audience for this piece is potential clients, leaders of teams
(or organizations, or companies) who have a general technology problem and are
wondering if they need a consultant with my skill-set to help them fix it.
Before you decide that your issue is the need to implement a complex
distributed system consensus algorithm, check if that is really what’s at
issue.  Talk to your ICs, and — taking care to make sure they understand that
you want honest feedback and that they are safe to offer it — ask them what
problems your organization has.&lt;/p&gt;
&lt;p&gt;During this meeting it is important to &lt;em&gt;only listen&lt;/em&gt;.  Especially if you’re at
a small company and you are regularly involved in the day-to-day operations,
you might feel immediately defensive.  Sit with that feeling, and process it
later.  Don’t unload your emotional state on an employee you have power
over.&lt;sup id=fnref:6:let-me-tell-you-a-secret-2024-2&gt;&lt;a class=footnote-ref href=#fn:6:let-me-tell-you-a-secret-2024-2 id=fnref:6&gt;6&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;“Only listening” doesn’t exclusively mean “don’t push back”.  You also
shouldn’t be committing to fixing anything.  While the information you are
gathering in these meetings is extremely valuable, and you should probably act
on more of it than you will initially want to, your ICs won’t have the full
picture.  They really may not understand why certain priorities are set the way
they are.  You’ll need to take &lt;em&gt;that&lt;/em&gt; as feedback for improving internal comms
rather than “fixing” the perceived problem, and you certainly don’t want to
make empty promises.&lt;/p&gt;
&lt;p&gt;If you have these conversations directly, you can get something from it that no
consultant can offer you: credibility.  If you can actively listen, the
conversation alone can improve morale.  People like having their concerns
heard.  If, better still, you manage to make meaningful changes to &lt;em&gt;address&lt;/em&gt;
the concerns you’ve heard about, you can inspire true respect.&lt;/p&gt;
&lt;p&gt;As a consultant, I’m going to be seen as some random guy wasting their time
with a meeting.  Even if you make the changes I recommend, it won’t resonate
the same way as someone remembering that they &lt;em&gt;personally&lt;/em&gt; told you what was
wrong, and you took it seriously and fixed it.&lt;/p&gt;
&lt;p&gt;Once you know what the problems are with your organization, and you’ve got
solid technical understanding that you really &lt;em&gt;do&lt;/em&gt; need that event-driven
distributed systems consensus algorithm implemented using Twisted, I’m
absolutely your guy.  Feel free to &lt;a href=mailto:consulting@glyph.im&gt;get in touch&lt;/a&gt;.&lt;/p&gt;
&lt;div class=footnote&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=fn:1:let-me-tell-you-a-secret-2024-2&gt;
&lt;p id=fn:1&gt;While I immensely value &lt;a href="/pages/patrons.html"&gt;my
patrons support&lt;/a&gt; and am eternally grateful
for their support, at — as of this writing — less than $100 per month it
doesn’t exactly pay the SF bay area cost-of-living bill. &lt;a class=footnote-backref href=#fnref:1:let-me-tell-you-a-secret-2024-2 title="Jump back to footnote 1 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=fn:2:let-me-tell-you-a-secret-2024-2&gt;
&lt;p id=fn:2&gt;When I reached out for feedback on a draft of this essay, every other
consultant I showed it to said that something similar had happened to them
&lt;em&gt;within the last month&lt;/em&gt;, all with different clients in different sectors of
the industry.  I really cannot stress how common it is. &lt;a class=footnote-backref href=#fnref:2:let-me-tell-you-a-secret-2024-2 title="Jump back to footnote 2 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=fn:3:let-me-tell-you-a-secret-2024-2&gt;
&lt;p id=fn:3&gt;“individual contributor”, if this bit of jargon isn’t universal in your
corner of the world; i.e.: “not a manager”. &lt;a class=footnote-backref href=#fnref:3:let-me-tell-you-a-secret-2024-2 title="Jump back to footnote 3 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=fn:4:let-me-tell-you-a-secret-2024-2&gt;
&lt;p id=fn:4&gt;Mostly, I need to remove a bunch of profanity, but sometimes I will also
need to have another interview, usually with a more junior person on the
team to confirm that I’m not relaying only a single person’s
perspective. It is pretty rare that the top-of-mind problems are specific
to one individual, though. &lt;a class=footnote-backref href=#fnref:4:let-me-tell-you-a-secret-2024-2 title="Jump back to footnote 4 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=fn:5:let-me-tell-you-a-secret-2024-2&gt;
&lt;p id=fn:5&gt;To the extent that this is about anything saliently recent, I am perhaps
grumbling about how
&lt;a href="https://techcrunch.com/2023/03/26/tech-company-layoffs-2023-morale/"&gt;tech&lt;/a&gt;
&lt;a href="https://www.cnbc.com/2024/01/03/2023-layoffs-will-continue-to-affect-workers-in-2024-report-says.html"&gt;CEOs&lt;/a&gt;
&lt;a href="https://www.nytimes.com/2023/04/12/technology/meta-layoffs-employees-management.html"&gt;aren’t&lt;/a&gt;
&lt;a href="https://www.businessinsider.com/snap-layoffs-staff-expecting-more-next-week-2024-2"&gt;taking&lt;/a&gt;
morale problems generated by the &lt;a href="https://www.bloomberg.com/opinion/articles/2024-02-05/mass-layoffs-have-become-alarmingly-routine"&gt;constant
drumbeat&lt;/a&gt;
of layoffs &lt;a href="https://blog.pragmaticengineer.com/layoffs-push-down-scores-on-glassdoor/"&gt;seriously
enough&lt;/a&gt;. &lt;a class=footnote-backref href=#fnref:5:let-me-tell-you-a-secret-2024-2 title="Jump back to footnote 5 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=fn:6:let-me-tell-you-a-secret-2024-2&gt;
&lt;p id=fn:6&gt;I am not always in the role of a consultant. At various points in my
career, I have &lt;em&gt;also&lt;/em&gt; been a leader needing to sit in this particular
chair, and believe me, I know it sucks.  This would not be a common problem
if there weren’t a common reason that leaders tend to avoid this kind of
meeting. &lt;a class=footnote-backref href=#fnref:6:let-me-tell-you-a-secret-2024-2 title="Jump back to footnote 6 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;/body&gt;</content><category term="misc"></category><category term="consulting"></category><category term="software"></category><category term="management"></category><category term="supported"></category></entry></feed>