Skip to content

Commit 96bfb1a

Browse files
committed
Format the html and I'm done touching this for now
1 parent e2adb75 commit 96bfb1a

File tree

1 file changed

+64
-61
lines changed

1 file changed

+64
-61
lines changed

out/www/2025/09/25/abstractionholics-anonymous.html

Lines changed: 64 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,22 @@
1515
</nav>
1616
</header>
1717
<main>
18-
<article>
19-
<header>
20-
<h1 id="abstractionholics-anonymous">Abstractionholics Anonymous</h1>
21-
<time class="meta" datetime="2025-09-25">Sep 25, 2025</time>
22-
</header>
23-
<p>Hello, everyone, my name is Theodore, and I’m an
18+
<article>
19+
<header>
20+
<h1 id="abstractionholics-anonymous">Abstractionholics Anonymous</h1>
21+
<time class="meta" datetime="2025-09-25">Sep 25, 2025</time>
22+
</header>
23+
<p>Hello, everyone, my name is Theodore, and I’m an
2424
Abstractionholic.</p>
25-
<blockquote>
26-
<p>The first step to recovery is admitting that one has a problem.
25+
<blockquote>
26+
<p>The first step to recovery is admitting that one has a problem.
2727
Admitting that one is powerless over their desire to abstract. Admitting
2828
that one’s usage of abstraction has made their life unmanageable.</p>
29-
</blockquote>
30-
<p>I’m here to admit that I have a problem. I am powerless over my
29+
</blockquote>
30+
<p>I’m here to admit that I have a problem. I am powerless over my
3131
compulsion toward abstraction.</p>
32-
<h2 id="the-dream-stream">The Dream Stream</h2>
33-
<p>Let’s take a step back. I think event streaming (à la Apache Kafka)
32+
<h2 id="the-dream-stream">The Dream Stream</h2>
33+
<p>Let’s take a step back. I think event streaming (à la Apache Kafka)
3434
is great. Systems are easy to reason about when the problem is decomposed
3535
into a pipeline of transformations. Just as a compiler has well defined stages,
3636
which can be reasoned about independently, many kinds of problems which require
@@ -39,72 +39,76 @@ <h2 id="the-dream-stream">The Dream Stream</h2>
3939
By doing so, the components in the pipeline can add batching,
4040
caching and maintain idempotency with little effort. However, I’ve yet to find
4141
a streaming system which provides all of the following:</p>
42-
<ul>
43-
<li>User-defined partitioning.</li>
44-
<li>Within a partition, in-order delivery.</li>
45-
<li>Throughput up to millions of requests per second.</li>
46-
<li><strong>Correctness-preserving horizontal scaling</strong>.</li>
47-
</ul>
48-
<p>Scaling a topic by adding partitions is commonly supported; however,
42+
<ul>
43+
<li>User-defined partitioning.</li>
44+
<li>Within a partition, in-order delivery.</li>
45+
<li>Throughput up to millions of requests per second.</li>
46+
<li><strong>Correctness-preserving horizontal scaling</strong>.</li>
47+
</ul>
48+
<p>Scaling a topic by adding partitions is commonly supported; however,
4949
applications which rely on user-defined partitioning and are sensitive
5050
to event order may struggle to gracefully handle events moving between
5151
partitions.</p>
52-
<p>Teams have a few options to handle this, none of which seem
52+
<p>Teams have a few options to handle this, none of which seem
5353
ideal:</p>
54-
<ul>
55-
<li>Over provision partitions to avoid needing to perform scaling.
54+
<ul>
55+
<li>Over provision capacity and never adjust scaling.
5656
Underutilize these resources indefinitely.
57-
<ul>
58-
<li>If you’re trying to empty out an uncomfortably full bank account,
57+
<ul>
58+
<li>If you’re trying to empty out an uncomfortably full bank account,
5959
this is a great option for you.</li>
60-
</ul></li>
61-
<li>Remove user-defined partitioning, rely on external systems to manage
60+
</ul></li>
61+
<li>Remove user-defined partitioning, rely on external systems to manage
6262
operations.
63-
<ul>
64-
<li>In-memory caching, batching and idempotency become difficult or
63+
<ul>
64+
<li>In-memory caching, batching and idempotency become difficult or
6565
impossible. Concurrent consumers must coordinate transactions, and this
6666
contention is expensive to scale.</li>
67-
</ul></li>
68-
<li>Build a stream management layer to handle upgrades.
69-
<ul>
70-
<li>I’ve not seen this done in practice, but imagine it to be the most
67+
</ul></li>
68+
<li>Build a stream management layer to handle upgrades.
69+
<ul>
70+
<li>I’ve not seen this done in practice, but imagine it to be the most
7171
practical solve this problem. However, it comes at increased development
7272
effort and operational complexity.</li>
73-
</ul></li>
74-
</ul>
75-
<p>My “Dream Stream” is a system which manages event partitioning so
73+
</ul></li>
74+
</ul>
75+
<p>My “Dream Stream” would be a system which manages event partitioning so
7676
that scaling is completely opaque to consumers. And I think I have some
77-
good ideas for how that might work. So for the past few months, I’ve
78-
been trying to put my money where my mouth is.</p>
79-
<h2 id="realization">Realization</h2>
80-
<p>Look, I’ve only been a software developer for seven years. I’ve had
77+
good ideas for how that might work. For the past few months, I’ve
78+
been trying to get something working; however, I'm having a lot of problems
79+
working without any pre-existing constraints.</p>
80+
<h2 id="realization">Realization</h2>
81+
<p>Look, I’ve only been a software developer for seven years. I’ve had
8182
the fortunate opportunity to build some pretty neat things, but I have a
82-
<strong>lot</strong> left to learn. My recent venture into building the
83-
<a href="https://github.com/sackosoft/frieze">Dream Stream</a> has made
84-
clear to me an unhealthy relationship with Abstraction.</p>
85-
<p>The first meaningful commit was <a
86-
href="https://github.com/sackosoft/frieze/commit/f0a4ecb394f8438a23533cec06e4637b975d6ec3">add
83+
<strong>lot</strong>
84+
more to learn. In the vast majority of projects I've worked on,
85+
there is already a pre-existing structure. The job is usually to learn
86+
the structrue and replicate it.
87+
However, My recent venture into
88+
building the <a href="https://github.com/sackosoft/frieze">Dream Stream</a>
89+
has made clear to me an unhealthy relationship with Abstraction.</p>
90+
<p>The first meaningful commit was
91+
<a href="https://github.com/sackosoft/frieze/commit/f0a4ecb394f8438a23533cec06e4637b975d6ec3">add
8792
the initial hosting abstractions</a>! Wow! “It’s poor design for an
8893
application to know about the source of configuration,” I told myself!
8994
“An application shouldn’t have to know that it is using a UDP socket to
9095
talk to another node, it should be abstracted!” After all, you never
9196
know how much time you can save if you decide to switch to something
9297
else later! Wow.</p>
93-
<p>Embarassingly, these hosting abstractions consumed my focus for the
98+
<p>Embarassingly, these hosting abstractions consumed my focus for the
9499
first week or so of development on the project.</p>
95-
<p>Eventually, I moved on to add implementations of <a
96-
href="https://ferd.ca/interval-tree-clocks.html">Interval Tree
97-
Clocks</a> and the <a
98-
href="https://en.wikipedia.org/wiki/SWIM_Protocol">SWIM Protocol</a>
99-
with the impression that I would need these components to build the
100+
<p>Eventually, I moved on to add implementations of
101+
<a href="https://ferd.ca/interval-tree-clocks.html">Interval Tree Clocks</a>
102+
and the
103+
<a href="https://en.wikipedia.org/wiki/SWIM_Protocol">SWIM Protocol</a>
104+
with the impression that I would need these components to build the
100105
Dream Stream.</p>
101-
<a href="/2025/09/25/swim-demo.gif">
102-
<figure>
103-
<img src="/2025/09/25/swim-demo.gif"
104-
alt="An animated video of the SWIM protocol simulator in the abandoned sackosoft/frieze project. A user interacts with buttons to add nodes to a circle representing a cluster. Each node that joins contacts a seed node to join the cluster. The nodes then gossip information between themselves as they run a failure detection protocol based on pinging each other. The user clicks a button to stop a node, within a few seconds some nodes learn of the node failure due to failed ping requests, they gossip this information to other nodes, and each node eventually drops the information for the stopped node." />
105-
</figure>
106-
</a>
107-
<p>While these were great learning experiences, they make it so
106+
<a href="/2025/09/25/swim-demo.gif">
107+
<figure>
108+
<img src="/2025/09/25/swim-demo.gif" alt="An animated video of the SWIM protocol simulator in the abandoned sackosoft/frieze project. A user interacts with buttons to add nodes to a circle representing a cluster. Each node that joins contacts a seed node to join the cluster. The nodes then gossip information between themselves as they run a failure detection protocol based on pinging each other. The user clicks a button to stop a node, within a few seconds some nodes learn of the node failure due to failed ping requests, they gossip this information to other nodes, and each node eventually drops the information for the stopped node." />
109+
</figure>
110+
</a>
111+
<p>While these were great learning experiences, they make it so
108112
painfully obvious that I only have one ‘tool in the toolbox’, so to say.
109113
Every step along the way I was drawing boxes and arrows; pondering
110114
metaphyical code responsibilities coming up with ways to split things
@@ -113,9 +117,8 @@ <h2 id="realization">Realization</h2>
113117
friction. Every every bundle imposes constraints. Every decision made to
114118
offer myself flexibility for a future decision may actually defer the
115119
benefit of making a decision at all.</p>
116-
<p>I can’t help but feel there must be a better way. I have a problem.
120+
<p>I can’t help but feel there must be a better way. I have a problem.
117121
I’m an Abstractionholic.</p>
118-
</article>
122+
</article>
119123
</main>
120-
</body>
121-
</html>
124+
</body></html>

0 commit comments

Comments
 (0)