<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://brokenco.de//atom.xml" rel="self" type="application/atom+xml" /><link href="https://brokenco.de//" rel="alternate" type="text/html" /><updated>2026-07-12T13:39:01+00:00</updated><id>https://brokenco.de//atom.xml</id><title type="html">rtyler</title><subtitle>a moderately technical blog</subtitle><author><name>R. Tyler Croy</name></author><entry><title type="html">The async stall</title><link href="https://brokenco.de//2026/07/12/compute-on-coroutines.html" rel="alternate" type="text/html" title="The async stall" /><published>2026-07-12T00:00:00+00:00</published><updated>2026-07-12T00:00:00+00:00</updated><id>https://brokenco.de//2026/07/12/compute-on-coroutines</id><content type="html" xml:base="https://brokenco.de//2026/07/12/compute-on-coroutines.html"><![CDATA[<p>I am loving the proliferation of async/await-style cooperative multitasking
across different language ecosystems. My first job in San Francisco was
building with greenthreads in Python (2.4!) in an era where Stackless,
Greenlets, and Twisted were all fringe communities inhabited by oddballs like
myself. Nowadays it’s a little embarrassing to adopt a toolchain that doesn’t
support some form of I/O-evented cooperative multitasking. Node.js, Rust, and
Python all have native support, Ruby’s Fiber’s seem to have missed the mark but
receive points for effort. All of these tools allow developers to write
simple code that appears procedural but <em>isn’t actually</em> at runtime.</p>

<p>The old do-it-mostly-yourself approaches forced the idea of an “event loop” in to our code in a way that the newer async/await semantics hide. 
Deep under the
covers there is a
<a href="https://man.freebsd.org/cgi/man.cgi?query=kevent&amp;apropos=0&amp;sektion=0&amp;manpath=FreeBSD+15.1-RELEASE+and+Ports.quarterly&amp;format=html">kqueue</a>
or an
<a href="https://man.freebsd.org/cgi/man.cgi?query=epoll&amp;apropos=0&amp;sektion=0&amp;manpath=openSUSE+42.3&amp;format=html">epoll</a>
which is doing a <em>lot</em> of work for you, and the abstractions are hiding a for
loop that is iterating over file descriptors selecting whichever one is ready
to continue execution.</p>

<p>The naming of the package <code class="language-plaintext highlighter-rouge">asyncio</code> in Python helps convey that it’s for I/O —
network calls, disk reads, waiting on things. That framing is mostly right, but
it invites a failure mode I keep seeing: someone discovers <code class="language-plaintext highlighter-rouge">asyncio</code> solves
their concurrency problems and but as time goes on they loose track of how it
works, and start CPU-heavy work inside coroutines. It does not end well. The
event loop stalls, tail latencies balloon, and suddenly your health check is
timing out in Kubernetes while your process is contentedly crunching data.</p>

<p>Once <code class="language-plaintext highlighter-rouge">asyncio</code> bites, the knee-jerk reaction I have seen is to rip out the
<code class="language-plaintext highlighter-rouge">asyncio</code> code and go back to the comfortable domain of <code class="language-plaintext highlighter-rouge">multiprocessing</code> or
equivalent. Hiding from the problem rather than addressing it.</p>

<p><strong>We can have our cake</strong> while still using <code class="language-plaintext highlighter-rouge">asyncio</code> for CPU-heavy applications.</p>

<p>Andrew Lamb <a href="https://www.youtube.com/watch?v=FeqRdDG1Y7g">spoke about exactly this
problem</a> in the context of Tokio:
the fix isn’t to avoid the async runtime for CPU work, it’s to <strong>stop mixing your
latency-sensitive and compute-heavy work on the same executor</strong>.</p>

<p>The pattern that actually works
is a dedicated <code class="language-plaintext highlighter-rouge">ProcessPoolExecutor</code> for the heavy lifting, submitted via
<code class="language-plaintext highlighter-rouge">loop.run_in_executor()</code>, while your event loop stays unblocked and responsive.
Python still has a GIL so there may be some use-cases that still require multi-processing to achieve high levels of performance but a better segmentation of low-latency and compute heavy workload in the <code class="language-plaintext highlighter-rouge">asyncio</code> eventloop can go a long way.</p>

<p>Some tips to consider:</p>

<ol>
  <li>
    <p><strong>Don’t block the event loop — ever</strong> Async code should never spend a long
time without yielding. In Python, CPU-bound work in a coroutine starves the
event loop. Use <code class="language-plaintext highlighter-rouge">await asyncio.sleep(0)</code> periodically, or offload entirely.</p>
  </li>
  <li>
    <p><strong>Use a separate executor for CPU work</strong> I have seen errors where an
applications’ health check got blocked by CPU heavy work, leading to
seemingly interruptions of service as the container orchestrator killed
unresponsive containers.</p>

    <p>Run CPU tasks on a <em>separate</em> thread/process pool,
not the same one handling I/O. In Python: <code class="language-plaintext highlighter-rouge">loop.run_in_executor(executor,
fn)</code> with a dedicated <code class="language-plaintext highlighter-rouge">ProcessPoolExecutor</code>. Don’t share it with your I/O
event loop.</p>
  </li>
  <li>
    <p><strong>GIL means processes, not threads</strong> Unlike Tokio’s work-stealing thread
pool, Python threads don’t get true parallelism for CPU work due to the GIL.
Use <code class="language-plaintext highlighter-rouge">concurrent.futures.ProcessPoolExecutor</code> instead of <code class="language-plaintext highlighter-rouge">ThreadPoolExecutor</code>
for CPU-bound tasks.</p>
  </li>
  <li>
    <p><strong>Amortize overhead with chunked work</strong> For CPU-heavy workloads in Python
consider making larger batches when possible,. A method call with a single
row in a runtime like Python is going to have higher wasted overhead when
invoking that method 100k times in a tight loop compared to invoking a
method which is able to handle a batch of 100k rows <em>outside</em> of Python
(e.g. in a Rust or C extension).</p>
  </li>
  <li>
    <p><strong>Cancellation and shutdown are hard</strong> Kind of niche advice, but 
hard with custom schedulers are easy to get 99.9% right but corner cases
(shutdown, cancellation, draining) waste a bunch of time. Just use the
off-the-shelf schedulers. In Python, lean on <code class="language-plaintext highlighter-rouge">asyncio.Task.cancel()</code> and
<code class="language-plaintext highlighter-rouge">executor.shutdown(wait=True)</code> rather than rolling your own.</p>
  </li>
</ol>

<p>I love to advocate the use of
<a href="https://rust-lang.org">Rust</a> for lots of projects, but modern Python with
judicious use of <code class="language-plaintext highlighter-rouge">asyncio</code> and a lot of the more modern APIs available since
Python 3.10-ish make it a much better option for high-performance applications
with a low barrier to entry.</p>]]></content><author><name>R. Tyler Croy</name></author><category term="software" /><category term="rust" /><category term="python" /><summary type="html"><![CDATA[I am loving the proliferation of async/await-style cooperative multitasking across different language ecosystems. My first job in San Francisco was building with greenthreads in Python (2.4!) in an era where Stackless, Greenlets, and Twisted were all fringe communities inhabited by oddballs like myself. Nowadays it’s a little embarrassing to adopt a toolchain that doesn’t support some form of I/O-evented cooperative multitasking. Node.js, Rust, and Python all have native support, Ruby’s Fiber’s seem to have missed the mark but receive points for effort. All of these tools allow developers to write simple code that appears procedural but isn’t actually at runtime.]]></summary></entry><entry><title type="html">If I Did It: Reyden</title><link href="https://brokenco.de//2026/07/10/if-i-did-it.html" rel="alternate" type="text/html" title="If I Did It: Reyden" /><published>2026-07-10T00:00:00+00:00</published><updated>2026-07-10T00:00:00+00:00</updated><id>https://brokenco.de//2026/07/10/if-i-did-it</id><content type="html" xml:base="https://brokenco.de//2026/07/10/if-i-did-it.html"><![CDATA[<p>Databricks announced a new low-latency product powered by a super
fast engine they’re calling “Reyden.”  The product itself is called 
<a href="https://www.databricks.com/blog/introducing-lakehousert-real-time-performance-unified-lakehouse">Lakehouse//RT</a>
and I am both supremely excited to see this in the wild <strong>and</strong> academically
really interested in their approach(es) for implementing Reyden.</p>

<blockquote>
  <p>Lakehouse//RT is powered by Reyden, a breakthrough new engine for real-time
workloads that require immediate responsiveness at high concurrency.</p>
</blockquote>

<p>One of the things I have been working on at <a href="https://tech.scribd.com">Scribd</a>
has been building a low-latency data retrieval system for <em>arbitrarily large
datasets</em>. While not as generally applicable as Reyden, the systems likely share a lot of
the same ingredients. I <a href="/2026/03/10/based-lake.html">submitted a talk</a> which was not accepted to the event, which makes more sense in hindsight. From my abstract:</p>

<blockquote>
  <p>Using the same Delta Lake architecture we offer both direct data access for
data scientists in Databricks Notebooks and online data retrieval in
milliseconds for user-facing web services.</p>
</blockquote>

<p>Keynote presentations for me are not <em>typically</em> something I pay attention to,
but I knew that Reyden was going to be announced ahead of time and Reynold’s
segment was the only one I really paid attention to.</p>

<p>Some points about Reyden which were mentioned are worth revisiting:</p>

<ul>
  <li>Databricks used a vast dataset of queries and telemetry from their DBR and
Photon engines to train a new model for creating optimized query plans. Using
their back catalog of query information, they were able to experiment with
different optimization approaches to really tune for different query patterns
in novel ways.</li>
  <li>The architecture behind the scenes was built in such a way to allow for
sustaining very high transactions per second while preserving the low latency
for <em>all</em> queries.</li>
</ul>

<p>From their post on the subject:</p>

<blockquote>
  <p>Preview participants have seen up to 16x better performance vs. real-time
serving layers, with response times as low as 10ms on smaller datasets and
sub-100ms performance on larger ones. On standard analytical benchmarks,
Lakehouse//RT delivers sub-100 millisecond latency at 12,000 queries per
second.</p>
</blockquote>

<p><strong>Incredible</strong>.</p>

<p>I believe that I have an above-average understanding of how <em>hard this actually
was</em>, which also makes me proud for Reynold and the team who built his Dream
Engine; it is quite an accomplishment.</p>

<p>I wanted to share some <em>wild speculation</em> on what types of techniques could be
at play to make Reyden so <em>consistently fast</em>.</p>

<h2 id="what-we-know">What we know</h2>

<p>There are a few different ingredients we know play a role in high-throughput
low-latency systems like Reyden. Despite not knowing how Reyden was
implemented, we can be sure they incorporate some of the same properties we see
in other systems:</p>

<ul>
  <li>
    <p><strong>Intelligent query planning</strong>: Reynold mentioned as much in his keynote, but
one property of every data system is coming up with increasingly intelligent
ways to retrieve only the data that is needed. The stuff most people learn
about creating indexes in traditional relational data systems gets tilted on
its head when building intelligent query planning for large-scale data
systems like Reyden. I have seen some systems describe “adaptive query
planning” which is flavor of what I believe Reynold discussed: using
machine-learning to build models for intelligently improving query plans over
time and usage.  There is great precedent for this type of work in
interpreted languages which I would argue is related. Adaptive query planning
reminds me of the work done by Oracle around <a href="https://en.wikipedia.org/wiki/GraalVM">Graal and
Truffle</a> which allowed interpreted
code to get <em>faster</em> as runtime went on and the runtime could introspect and
adaptively optimize based on real-world usage.</p>
  </li>
  <li>
    <p><strong>Caching</strong>: caching is not rocket surgery but the cost of cloud-based RAM
<em>was</em> insane before “AI” and it has only gotten worse. Large data-systems
must implement tiered caching solutions. Honeycomb has <a href="https://www.youtube.com/watch?v=tpoeJiXTVU0">shared some of their
work on Retriever</a> which has
some novel approaches for storing segments of query results in S3 for reduced
retrieval time. Improving the speed of something like Reyden requires
consideration of what data to cache but also <em>where to cache it</em>.</p>
  </li>
  <li>
    <p><strong>Object storage</strong>: The eighth wonder of the world, as Corey Quinn would like
you to believe is S3. The magic sauce that makes some truly incredible data
systems possible is commodity object storage with S3. Technologies like
<a href="https://delta.io">Delta Lake</a> and <a href="https://parquet.apache.org">Apache
Parquet</a> when wielded appropriately can lead to
some pretty <a href="/2025/06/24/low-latency-parquet.html">incredible low-latency
reads</a>.</p>
  </li>
</ul>

<h2 id="the-hard-parts">The Hard Parts</h2>

<p>InfluxDB, Lance, Databricks, Scribd, Turbopuffer, and a number of other
companies have built and deployed compelling and <em>fast</em> data systems using some
of the same underlying technologies that Reyden likely uses. But there are some
<strong>real limitations</strong> that whet my appetite for more details on how exactly did
Reyden overcome or <em>hide</em> these realities.</p>

<h3 id="s3-latency">S3 Latency</h3>

<p>S3 is the foundational building block of almost <em>anything</em> data in AWS. You can
build ridiculously fast data systems <em>only</em> using S3 if you know how to
structure your writes. S3 is very fast but single object requests still live in
the tens of milliseconds range. Personally I have not seen Standard storage
requests below around <strong>20ms</strong>.</p>

<p>Each S3 request has some IAM overhead and object routing overhead. This overhead
you pay before you get the first byte of data back from the service. 
The roughly 20ms latency that I have seen is time-to-first-byte, if you need
to transfer megabytes of data from S3 to a query/search service the
time-to-<strong>last</strong> byte is the more important metric.</p>

<p>Once you get to the point of streaming bytes, it is possible to stream bytes
<strong>extremely fast</strong> from S3. Multipart objects uploaded with an approximately 8MiB part size will be
automatically fetched in parallel by AWS S3 client SDKs. This means that for a
64MiB file, your client can hit multiple backend services simultaneously and
stream the parts of that object into memory at what is effectively line-speed
of the network interface of the machine.</p>

<p>You can get blazingly fast reads, once you’re reading, but there’s <em>always</em>
that 20-30ms latency to begin with.</p>

<p>This sets the <strong>floor</strong> of latency for a <strong>cold request</strong> to object storage.</p>

<p>To work around this you <strong>must</strong> build a multi-tier storage architecture where
“interesting data” is being promoted to faster storage like S3 Express OneZone,
Aurora/PostgreSQL, Valkey, or other in-memory stores. Meanwhile “uninteresting
data” needs to be demoted <em>downward</em> to slower storage, otherwise cost blows
up.</p>

<h3 id="predictive-io">Predictive I/O</h3>

<p>Databricks groups a couple different techniques under the umbrella of
<a href="https://docs.databricks.com/aws/en/optimizations/predictive-io">Predictive
I/O</a> which in
its most simple incantation can be considered “predicate push-down to storage.”
I have written about this approach before in <a href="/2025/06/24/low-latency-parquet.html">Low latency Parquet
reads</a> and applied some of these
techniques inspired by Andrew and Raphael’s work <a href="https://www.influxdata.com/blog/querying-parquet-millisecond-latency">at
Influxdata</a>.</p>

<p>Applying a “predictive I/O” approach in an engine like Reyden is likely
extending the “predictiveness” to address a multi-tier storage architecture.  I
would imagine that underneath the covers there is something along the lines of
<a href="https://github.com/duckdb/ducklake0">DuckLake</a> which is denormalizes existing
Delta Lake or Iceberg transaction logs into an online storage engine like
<a href="https://postgresql.org">PostgreSQL</a>. Variants of the work that DuckDB has
shared with DuckLake exist elsewhere in the ecosystem and improve performance
for high-speed read scenarios with the trade-off of implementation complexity.
Inside the walls of Databricks, something like DuckLake could <em>probably</em> be
built on top of their <a href="https://www.databricks.com/product/lakebase">Lakebase</a>
or <a href="https://neon.com/">Neon</a> to offload that part of the storage/retrieval
problem.</p>

<h3 id="massive-distributed-compute">Massive distributed compute</h3>

<p>The largest most expensive workloads that I have seen on the Databricks
platform end up being massive joins across datasets which must all be
“considered” by the engine. If the user wants to compare nested JSON values
joined between two datasets that are terabytes large, it is difficult to avoid
loading or streaming terabytes of data and bringing compute online.</p>

<p>Optimize the I/O and query plan all you want, at some point somebody
somewhere will have to do some hard work and actually <em>compute something</em>.</p>

<p>The unsung hero of Reyden is probably the <a href="https://www.databricks.com/product/photon">Databricks
Photon</a> engine. If you are trying to
build something super-fast, starting with a <em>pretty fast</em> engine that’s already
in your toolbox is a good place to start.</p>

<p>In my work on a similar but less-generally-applicable system, I have been
giving a lot of thought to <a href="https://datafusion.apache.org">Apache Datafusion</a>
and its ability to serialize logical plans over the wire via Protobuf. I’m not
yet sure how I am going to abuse this capability, but I know that it’s a key
ingredient in distributing query execution across compute resources in new and
novel ways.</p>

<p>In a bespoke cloud environment Databricks has a myriad of ways to distribute
compute workloads available to a system designed in 2025/2026. These could
operate much more efficiently than <a href="https://spark.apache.org">Apache Spark</a>
operates today, with its driver/worker VM topology. Calling back again to the
work that Honeycomb has done, I think they have really demonstrated that
extremely bursty compute designs on AWS Lambda are both possible and
cost-effective.</p>

<hr />

<h2 id="make-sure-to-cheat">Make sure to cheat</h2>

<p>Even with a clever query plan, great predictive I/O, and bursty but powerful
compute, there are still some laws of physics that have to be respected. Data
locality and affinity to compute plays a big role in the speed of data
processing engines.</p>

<p>In my own work I have been considering the totality of the stack, which I am
sure Reyden does as well. The interaction between a client and server becomes
important. What parts of the puzzle are computed on the client versus server?
What data is sent back to the client and how?</p>

<p>Imagine you have a very fast engine for your users and they are primarily using
it in your Notebook product.</p>

<p>You would be foolish not to <em>*cheat a _little_</em>.</p>

<p>The primary user interface for Reyden is a Databricks notebook. In a vertically
integrated stack, it is possible to start preloading data or <em>anticipating</em>
user behavior before they actually hit “Run.”</p>

<p>For a totally new notebook, I might start pre-filling caches or moving data into
warmer storage as soon as the user has typed a table name in, e.g. once the
editor has completed <code class="language-plaintext highlighter-rouge">SELECT * FROM gold.schema.table ..</code> I know with high
confidence that the user is going to query <code class="language-plaintext highlighter-rouge">gold.schema.table</code> and can start to
preload.</p>

<p>For an existing notebook that is being revisited, I can cheat slightly
differently by preloading the necessary data for all the tables referenced by
the cells. If I am feeling <em>very</em> fancy I might rely on a user-behavior-model
to anticipate whether they’re going to “Run All”, “Run” one by one, or simply
review prior computed results.</p>

<p>Databricks also has been heavily promoting their in-notebook AI Assistant to
where I would also cheat a little bit by seeding that AI assistant with
instructions on how to write queries that are more efficient on my very fast
engine. The AI Assistant should produce code which is going to demonstrate the
best possible query patterns for the given user intent.</p>

<p>Unlike general purpose database engines, Reyden has so much <em>other</em> options
available to it to give the user the <em>illusion</em> of speed without needing to do
as much hard or occasionally <em>impossible</em> work.</p>

<p>“Work smarter, not harder” as the saying goes.</p>

<hr />

<p>Building a system like Reyden sounds like it was a tremendous amount of fun, with all
kinds of unique and interesting constraints. Reyden would not be possible had
Databricks not had a strong technology leadership to build from. In that
respect both Reynold, Matei, and Ali deserve a tremendous amount of credit for
their continued investment in Databricks’ technology platform.</p>

<p>Their investments compound in ways that are difficult to envision in <em>detail</em>
“we need to do X, so that we can build Reyden.”  The compounding benefits are
more easy to imagine in the abstract “making this part of the stack
faster/cheaper unlocks new capabilities to build from.”</p>

<p>Delta Lake was needed to move away from CSV, Parquet, Hive, and all manners of
other junk holding Apache Spark back from beating Apache Hadoop. Photon was a
no-brainer, a fast engine that beats Apache Spark for Databricks users is a
foundational component that served an immediate customer need. Lakebase/Neon
helps solve a data movement problem faced by every organization with a data
lake.</p>

<p>The list of platform investments that are compounding in Reyden is probably
much longer than I can imagine. I believe that Reyden could not have existed at
Databricks in 2020, 2022, or 2024, but I do think the right pieces of were
there in 2025 because of an astute <strong>platform-thinking</strong> that members of the
technology organization have.</p>

<p>From my perspective, I recognize how challenging impressive Reyden is to build,
and the long road that a <em>lot</em> of people have been on to make it a reality.</p>

<p>Well done y’all!</p>]]></content><author><name>R. Tyler Croy</name></author><category term="software" /><category term="databricks" /><summary type="html"><![CDATA[Databricks announced a new low-latency product powered by a super fast engine they’re calling “Reyden.” The product itself is called Lakehouse//RT and I am both supremely excited to see this in the wild and academically really interested in their approach(es) for implementing Reyden.]]></summary></entry><entry><title type="html">Butterflia</title><link href="https://brokenco.de//2026/05/02/butterflia.html" rel="alternate" type="text/html" title="Butterflia" /><published>2026-05-02T00:00:00+00:00</published><updated>2026-05-02T00:00:00+00:00</updated><id>https://brokenco.de//2026/05/02/butterflia</id><content type="html" xml:base="https://brokenco.de//2026/05/02/butterflia.html"><![CDATA[<p>There’s a dead deer in the bin. The burial while unceremonious was not without
a deep sadness for an animal that didn’t know I exist.</p>

<p>My house is in the shockingly short boundary where city turns into wild. Troops
of wild turkeys march through, the jack rabbits scurry away when you walk up
the hill, and deer leap across the road heading from the creek on one side to
the hills on the other.</p>

<p>I purchased this house from the woman who built it with her husband. Frank
passed away about 20 years ago, but he still visits. His wife Marilyn moved to
Sacramento and is an avid gardener. She cultivated a rich variety of flowers,
bushes, and trees under the towering oaks of the home she built.</p>

<p>I let most of the non-native plants wither, encouraging and those which could
survive the wet winters and dry summers. Continuing Marilyn’s garden would have
taken too much time and water, neither of which are in abundance these days.
Nonetheless I still feel a sense of responsibility to the land, the animals,
and the oaks.</p>

<p>Returning from a week of travel, I was shocked to spot a fat doe lounging on
the hillside. Deer are common but I have never seen a deer <em>just lying on the
ground</em>. A couple days later walking through the backyard the doe, who was
given the name “Butterflia” was just as surprised to see me as I was to see
her. Later that evening I noticed her again further down the hill, a tiny fawn
wobbling between her legs.</p>

<p>Last year a doe was struck and killed by a car on the road that runs alongside
my house. The following day I discovered a fawn with a broken hind leg in the
backyard. The nice woman from <a href="https://www.fawnrescue.org/">Fawn Rescue of Sonoma
County</a> and I cautiously crept through the woods
with outstretched beach towels but could not catch the injured fawn and it
escaped.</p>

<p>I called them back to see if they could help me relocate this doe and fawn. The
same nice woman assured me that they would probably move on in a week or so,
and to call back if their situation deteriorated.</p>

<p>Over the weekend I spotted a second fawn. Butterflia had twins! The backyard
was off limits to ensure that neither Butterflia nor her fawns would be scared
into the road. I am happy to share my space with such relatively benign neighbors.</p>

<p>By the end of the following week there was only one fawn that I regularly saw
with Butterflia.  During the day when I knew she was out I swept through the
backyard to see if I could find a body, but never learned what happened with
that fawn.</p>

<p>For whatever reason Butterflia had decided to call the backyard home.</p>

<p>A week later, on a Sunday while carefully walking through the backyard to get
something from the shed I discovered the other fawn’s newly deceased body
behind a rock near the house. The job of coroner would have to wait until
Monday after work, Sunday’s plans did not include a dead fawn.</p>

<p>Butterflia discovered the body Monday morning around 4am. I was awaken by the
mournful bellowing of a mother discovering the body of her child. It was
absolutely <strong>gut-wrenching</strong>. I busied myself on the other side of
the house, periodically checking back in the bedroom, only to hear Butterflia’s
continued sorrow. She painfully wailed for almost three hours and spent the
rest of the day near the rock. I would see her revisiting the body, poking her
head under the leaves of the bushes as if in disbelief.</p>

<p>She was mourning and I found myself mourning as well.</p>

<p>I let the body rest for a couple days. I wanted to make sure Butterflia had
left before I did anything, out of some sense of respect. Using an old spade I
scooped up the fawn and gently placed it in the bin, covered it with dirt, and
then some leaves and straw.</p>

<p>The week came and went without any additional sightings of Butterflia.  Her
sadness affected me more deeply than I anticipated. I don’t know if she mourned
the first fawn, or even knew it was gone. I imagined her grief was compounded
by losing both of her babies, the early morning anguish heavy with the
knowledge that they both died.</p>

<p>She must have moved on, hopefully to greener pastures.</p>

<p>I swept through the yard this weekend to see if there were other
remnants of deer habitation to be cleaned up. After completing my 
yard work, I startled Butterflia as she gingerly walked through the yard.</p>

<p>I said hello with a warm smile, pleased to see her, because I’m human.</p>

<p>She turned and looked at me dumbly, because she’s a deer.</p>]]></content><author><name>R. Tyler Croy</name></author><category term="opinion" /><summary type="html"><![CDATA[There’s a dead deer in the bin. The burial while unceremonious was not without a deep sadness for an animal that didn’t know I exist.]]></summary></entry><entry><title type="html">2026 April: Recently Studied Stuff</title><link href="https://brokenco.de//2026/04/30/fresh-from-rss.html" rel="alternate" type="text/html" title="2026 April: Recently Studied Stuff" /><published>2026-04-30T00:00:00+00:00</published><updated>2026-04-30T00:00:00+00:00</updated><id>https://brokenco.de//2026/04/30/fresh-from-rss</id><content type="html" xml:base="https://brokenco.de//2026/04/30/fresh-from-rss.html"><![CDATA[<p>Similar to last month I have given more intention to some of the interesting
things that I have stumbled across in my feed reader or the fediverse. Rather
than just a quip, boost, or reply, I have wanted to consolidate these thoughts
with more permanance here to my blog.</p>

<p>Chris’ talk below at <a href="https://northbaypython.org/">North Bay Python</a> was, as
his always are, well-delivered and worth consideration.</p>

<center><iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/d7AeWFbOTHg?si=zW0bHhRpj--dsrdW" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe></center>

<p>The conclusion that he
draws towards the end is similar to something I was <a href="/2025/09/20/sacrificing-the-understanding.html">noodling last
year</a>:</p>

<blockquote>
  <p>At some point somebody, somewhere, is going to have to actually understand
how things work.</p>
</blockquote>

<p>Chris makes the point, as he typically does, much more thoughtfully and with a
stronger philosophical base.</p>

<hr />

<p>Had some discussions with the <a href="https://github.com/delta-io/delta-kernel-rs">delta-kernel-rs</a> developers after they mistakenly added a <em>ton</em> of new files to <code class="language-plaintext highlighter-rouge">tests/</code> blowing up test cycle times. Another community member shared <a href="https://matklad.github.io/2021/02/27/delete-cargo-integration-tests.html">this great overview</a> about <strong>not</strong> using Cargo integration tests.</p>

<hr />

<p>Catching up on <a href="https://open.substack.com/pub/dataengineeringcentral/p/revisiting-data-quality?utm_source=share&amp;utm_medium=android&amp;r=cxg56">Daniel’s thoughts on Data
Quality</a>
and reconsidering the domain. The generation of slop has resulted in renewed
discussions of “but how do we ensure correctness?” which is a great question to
be trying to answer, but I am still rather disappointed with the state of the
art for data quality tooling.</p>

<hr />

<p>I recommend <a href="https://etbe.coker.com.au/2026/03/29/communication-hostile-ais/">this blog
post</a> which
has some good citations for negative AI behaviors affecting free and open
source communities.</p>

<blockquote>
  <p>This is going to be a difficult problem to solve, more difficult than the
email spam problem we have been unable to solve after 30
years of working on it.</p>

  <p>This is also a very important problem, we are currently in an age where we have
access to information that most people couldn’t even dream of 30 years ago. We
also have disinformation that combines some of the worst aspects of
authoritarian regimes throughout history combined with the worst aspects of
cult brainwashing. If we lose access to the information but the disinformation
remains (or get worse) then the result will be terrible.</p>
</blockquote>

<hr />

<p>I really enjoy <a href="https://planet.debian.org">Planet Debian</a> as an aggregator of an international set of voices from the Debian community. I get exposed to so many different view points from around the free software ecosystem, which I really value. This past week I read 
<a href="https://blog.bofh.it/debian/id_473">this blog post</a> by a debian maintainer which I was so flummoxed by I <a href="/2026/03/25/do-not-comply.html">wrote out my thoughts on the topic here</a></p>

<hr />

<p>Streaming tar over SSH is one of the more novel Unix tricks I don’t get to use
much anymore. <a href="https://drewdevault.com/2026/03/28/2026-03-28-rsync-without-rsync.html">Drew
Devault</a>
shared some helpful tips for using it without needing to use incantations of
<code class="language-plaintext highlighter-rouge">rsync(1)</code>.</p>]]></content><author><name>R. Tyler Croy</name></author><category term="rss" /><category term="deltalake" /><category term="data" /><category term="dataengineering" /><category term="opensource" /><summary type="html"><![CDATA[Similar to last month I have given more intention to some of the interesting things that I have stumbled across in my feed reader or the fediverse. Rather than just a quip, boost, or reply, I have wanted to consolidate these thoughts with more permanance here to my blog.]]></summary></entry><entry><title type="html">Unity Catalog with S3 Access Points</title><link href="https://brokenco.de//2026/04/25/unity-s3-access-points.html" rel="alternate" type="text/html" title="Unity Catalog with S3 Access Points" /><published>2026-04-25T00:00:00+00:00</published><updated>2026-04-25T00:00:00+00:00</updated><id>https://brokenco.de//2026/04/25/unity-s3-access-points</id><content type="html" xml:base="https://brokenco.de//2026/04/25/unity-s3-access-points.html"><![CDATA[<p>Governance is the synergy of our era. If I could go one week without a
discussion around governance that really just boils down to classic role-based
access control practices..</p>

<p>The bad news I have for you is that today, in the year 2026 <strong>Unity Catalog
does not work with S3 Access Points.</strong></p>

<p><em>However</em> it does show a different pathology than it once did, which leads me
to believe that it <em>could</em>, if not for one silly little piece of technical
debt.</p>

<hr />

<p>The system I am building utilizes <a href="https://aws.amazon.com/s3/features/access-points/">Amazon S3 Access
Points</a> for <em>governance</em> but
must integrate into the <a href="https://databricks.com">Databricks</a> platform. A
platform which has its <em>own</em> ideas about governance: <a href="https://docs.databricks.com/aws/en/data-governance/unity-catalog/">Unity
Catalog</a>. It
should come as no surprise that a system which was named <em>unity</em> would go to
great strides to make itself the center of the universe.</p>

<p>How troublesome!</p>

<p>Years ago a colleague and I tried to integrate Databricks Unity Catalog and S3
Access Points only for the approach to crash and burn. Integrating two
different opaque tools like IAM permissions and Unity Catalog led to all sorts
of attempted incantations, none of which actually succeeded.</p>

<p>The Databricks product team told us that the system did not support S3 Access
Points “by design.” I found the reasoning <em>very</em> patronizing because it was
presented as “we don’t support S3 Access Points by design to prevent users from
circumventing Unity access controls.”</p>

<p>What I understand now is how that “by design” was more of an excuse  “we just
don’t want to test it” rather than something more substantive.</p>

<p>S3 Access Points can be <a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points-naming.html">referenced a number of
ways</a>
like S3 Access Point Aliases to where even the most legacy system can integrate
with them.</p>

<blockquote>
  <p>An access point alias name meets all the requirements of a valid Amazon S3
 bucket name and consists of the following parts:</p>
</blockquote>

<p>The first time we bounced off this problem <a href="https://aws.amazon.com/about-aws/whats-new/2021/07/amazon-s3-access-points-aliases-allow-application-requires-s3-bucket-name-easily-use-access-point/">S3 Access Point
Aliases</a>
had been only recently released;</p>

<p>Despite all Unity Catalog’s protestations the errors we ended up seeing don’t
convey a structural limitation when using S3 Access Point Aliases, instead they
point to simply out-dated SDK support in the underlying Databricks Runtime.</p>

<p>My hunch is that the AWS SDK v1 being <a href="https://aws.amazon.com/blogs/developer/announcing-end-of-support-for-aws-sdk-for-java-v1-x-on-december-31-2025/">announced as deprecated over two years
ago</a>
and being <em>completely</em> deprecated as of the end of 2025. Lots of Databricks and
other Spark <a href="https://hadoop.apache.org/docs/current3/hadoop-aws/tools/hadoop-aws/aws_sdk_upgrade.html">libraries still interact with S3 via the v1
SDK</a>. 
That SDK was originally released in 2010 (lol) and so it’s likely that the
issue we were authentication issue we were seeing was mixed up in the support
for S3 Access Point Aliases with this old SDK.</p>

<p>Since we bounced off this problem a number of years ago one thing that has
changed for the better in Unity Catalog is that it is now possible to grant
Unity a completely read-only configuration in IAM-based S3 bucket policies.
While we cannot use S3 Access Points as part of our governance strategy, we can
at least still grant a fairly limited permission to Unity for read-only
operations.</p>

<p>Now I can have my esoteric <a href="https://delta.io">Delta Lake</a> datastores present in
Unity without any risk of misconfiguration or error in Unity leading to data
corruption!</p>

<p><strong>Governance</strong> to a lot of enterprise vendors is about <em>centralization of
control</em>, but for me it’s about <a href="https://en.wikipedia.org/wiki/Defence_in_depth">defense in
depth</a>.
I never want a business-critical system to be a single
misconfiguration away from granting read or write access to the wrong
principal.</p>]]></content><author><name>R. Tyler Croy</name></author><category term="databricks" /><category term="deltalake" /><summary type="html"><![CDATA[Governance is the synergy of our era. If I could go one week without a discussion around governance that really just boils down to classic role-based access control practices..]]></summary></entry><entry><title type="html">Private Open Source</title><link href="https://brokenco.de//2026/04/01/private-open-source.html" rel="alternate" type="text/html" title="Private Open Source" /><published>2026-04-01T00:00:00+00:00</published><updated>2026-04-01T00:00:00+00:00</updated><id>https://brokenco.de//2026/04/01/private-open-source</id><content type="html" xml:base="https://brokenco.de//2026/04/01/private-open-source.html"><![CDATA[<p>Open source communities depend on a fundamental assumption that is no longer
true: the presumption of good faith actors. The hosts serving free and open
source code are scraped relentlessly, denying service to developers. Once that
code has been assimilated into various models it is washed of all attribution
and license information, denying rights of the developers. Some subset of users
then feel empowered, emboldened, I’m not sure what exactly by these models and
lob massive thousand line changes back at the developers. Nearly every
technology has the possibility to be used for positive and negative effects,
but free and open source communities are being harmed from multiple directions
right now.</p>

<p>I am a big believer in <a href="https://openinfra.org/four-opens/">the four opens</a>:</p>

<blockquote>
  <p>The Four Opens are a set of principles guidelines that were created by the
OpenStack community as a way to guarantee that the users get all the benefits
associated with open source software, including the ability to engage with the
community and influence future evolution of the software.</p>

  <ul>
    <li>Open Source</li>
    <li>Open Design</li>
    <li>Open Development</li>
    <li>Open Community</li>
  </ul>
</blockquote>

<p>There is an implied “to the public” in each of the four opens, at least how I
have understood it over the past many (<em>many</em>) years. I have repeatedly
advocated for open (to the public) discourse and transparency when working with
companies like <a href="https://cloudbees.com">CloudBees</a> and
<a href="https://databricks.com">Databricks</a> as they have engaged with open source
projects.</p>

<p>The mounting negative pressures and in some cases <a href="https://theshamblog.com/an-ai-agent-published-a-hit-piece-on-me/">outright
hostility</a>
towards free and open source projects has me reconsidering the implied “to the
public” and how these communities may need to evolve in the future.</p>

<p>While I have never been a fan of invite-only Discord or Slack servers, both of
which are used by the <a href="https://datafusion.apache.org/contributor-guide/communication.html">Apache
Datafusion</a>
project for some odd reason. There are good reasons to put the project’s shared
spaces in slightly more private and slightly less AI-accessible systems. A
little bit of privacy can lead to more candid conversations and <em>potentially</em> a
stronger feeling of community and safety.</p>

<p>My first line of thinking led me to the idea of “vouching” which I recall
<a href="https://mitchellh.com/writing">mitchellh</a> posting about in the fediverse, but
I couldn’t find a good linkable reference.</p>

<p>Vouching is what we did as kids when a new friend was suggested to join the
mischief, somebody would vouch for the new kid and say “hey, they’re my
neighbor, they’re cool” and then we would go start new trouble together. In the
context of an open source community vouching can:</p>

<ul>
  <li>Help build a web of trust without every person necessarily knowing each new person</li>
  <li>But <em>also</em> vouching means there is a higher tendency for a community to be
homogeneous, since it will be less welcoming to random new-comers.</li>
</ul>

<p>I think vouching could also exacerbate the likelihood of a <a href="https://en.wikipedia.org/wiki/XZ_Utils_backdoor">Jia
Tan</a> where the web of trust
within the community is compromised by a malicious actor. Getting <em>one</em> member
to vouch for you may lower the guard of all of the other members of the
community making these style of attacks easier to pull off.</p>

<p>Since I started writing this post a whole week has passed by, without any new
ideas or patterns popping into mind. I’m curious how others are thinking about
it, so please let me know <a href="https://hacky.town/@rtyler/116329725989266400">on Mastodon</a> or via
email <code class="language-plaintext highlighter-rouge">rtyler@</code>~</p>]]></content><author><name>R. Tyler Croy</name></author><category term="opensource" /><category term="buoyantdata" /><category term="ai" /><summary type="html"><![CDATA[Open source communities depend on a fundamental assumption that is no longer true: the presumption of good faith actors. The hosts serving free and open source code are scraped relentlessly, denying service to developers. Once that code has been assimilated into various models it is washed of all attribution and license information, denying rights of the developers. Some subset of users then feel empowered, emboldened, I’m not sure what exactly by these models and lob massive thousand line changes back at the developers. Nearly every technology has the possibility to be used for positive and negative effects, but free and open source communities are being harmed from multiple directions right now.]]></summary></entry><entry><title type="html">The problem is obeying in advance</title><link href="https://brokenco.de//2026/03/25/do-not-comply.html" rel="alternate" type="text/html" title="The problem is obeying in advance" /><published>2026-03-25T00:00:00+00:00</published><updated>2026-03-25T00:00:00+00:00</updated><id>https://brokenco.de//2026/03/25/do-not-comply</id><content type="html" xml:base="https://brokenco.de//2026/03/25/do-not-comply.html"><![CDATA[<p>Linux power-users tend to have strong opinions about two things: distribution
and systemd. The bazaar of distributions means
competing implementations or different perspectives end up expressed
through the curation of the packaged software. <code class="language-plaintext highlighter-rouge">systemd</code> ended up so
contentious because it’s a decent piece of technology which suffers from
persistent scope creep that became a foundational component in a <em>lot</em> of
distributions. The drama du jour is that systemd is somehow implicated in “age
verification laws.”</p>

<p><code class="language-plaintext highlighter-rouge">systemd</code> as an init system is pretty good. Once upon a time I worked on
porting <a href="https://en.wikipedia.org/wiki/Launchd">launchd</a> to
<a href="https://freebsd.org">FreeBSD</a> and so I have <em>some</em> familiarity with the
silliness of most init systems.</p>

<p><code class="language-plaintext highlighter-rouge">systemd</code> as a <a href="https://en.wikipedia.org/wiki/Katamari_Damacy">katamari</a> at the
root level of most Linux systems is <em>not</em> “pretty good.” There have been
<em>numerous</em> tendrils of what is understood to be “systemd” which are of lesser
quality and have resulted in security issues.</p>

<p>Anyways, I hope you get the point. systemd as an init system: good. systemd as a operating system: bad.</p>

<p>The drama du jour is about the latter.</p>

<hr />

<p>One should not <a href="https://timothysnyder.org/on-tyranny">obey in advance</a>.
Especially in the domain free and open source software which is <em>literally a
political project</em>.</p>

<p>I stumbled into <a href="https://blog.bofh.it/debian/id_473">this blog post</a> through
<a href="https://planet.debian.org">Planet Debian</a> by a debian maintainer which is
patently absurd.</p>

<blockquote>
  <p>Recently, the free software Nazi bar crowd styling themselves as “concerned
citizens” has tried to start a moral panic by saying that systemd is
implementing age verification checks or that somehow it will require
providing personally identifiable information.</p>
</blockquote>

<p>The author is correct insofar that <code class="language-plaintext highlighter-rouge">systemd</code> did <strong>not</strong> add age verification.
<strong>However</strong> most of the folks upset with the change are upset that their Linux
systems are obeying in advance.</p>

<p>systemd
<strong>did</strong> make changes in order to obey. To take part in anti-free restrictions
under the guise of “age verification” From the <a href="https://github.com/systemd/systemd/pull/40954">pull
request</a></p>

<blockquote>
  <p>Stores the user’s birth date for age verification, as required by recent laws
in California (AB-1043), Colorado (SB26-051), Brazil (Lei 15.211/2025), etc.</p>
</blockquote>

<p>The whole motivation of the change was to <em>obey in advance</em> to these unjust laws.</p>

<p>The author then goes on to make some equally absurd claims about how this
functionality is <em>important for porents</em> to implement controls on computers, for
the children! Clearly this person must not know any actual children, or
even parents for that matter. Children are <em>excellent</em> at finding ways
to circumvent restrictions. The idea that a user-modifiable piece of data on
a local machine should be trusted for “parental controls” is so detached from
reality that I originally thought they were making a sarcastic joke.</p>

<p>I think this <a href="https://lists.debian.org/debian-legal/2026/03/msg00018.html">tongue-in-cheek systemd-censord</a> post does better than anybody to exclaim how absolutely ludicrous this obeying in advance is:</p>

<blockquote>
  <p>Systemd units will be created for every desired censorship function, and will
be started based on the user’s location. For example, a unit for Kazakhstan
will implement the government-required backdoor, a unit for China will
implement keyword scans and web access blocks (more on this later), a unit
for Florida will ban all packages with “trans” in the name (201 packages in
current stable distribution), a unit for Oklahoma will ensure all educational
software is compliant with the Christian Holy Bible, a unit for the entire
United States will prevent installation of any program capable of decoding
DVD or BluRay media, and a unit for California will provide the user’s age to
all applications and all web sites from which applications may be downloaded.
As can be seen, multiple units may be started for a given location.</p>
</blockquote>

<p>Do not obey in advance.</p>]]></content><author><name>R. Tyler Croy</name></author><category term="software" /><category term="opinion" /><category term="linux" /><summary type="html"><![CDATA[Linux power-users tend to have strong opinions about two things: distribution and systemd. The bazaar of distributions means competing implementations or different perspectives end up expressed through the curation of the packaged software. systemd ended up so contentious because it’s a decent piece of technology which suffers from persistent scope creep that became a foundational component in a lot of distributions. The drama du jour is that systemd is somehow implicated in “age verification laws.”]]></summary></entry><entry><title type="html">35E</title><link href="https://brokenco.de//2026/03/22/a-poem-for-united.html" rel="alternate" type="text/html" title="35E" /><published>2026-03-22T00:00:00+00:00</published><updated>2026-03-22T00:00:00+00:00</updated><id>https://brokenco.de//2026/03/22/a-poem-for-united</id><content type="html" xml:base="https://brokenco.de//2026/03/22/a-poem-for-united.html"><![CDATA[<p>35E, 35E.<br />
Stuck here in the middle<br />
of the middle,<br />
35E.</p>

<p>At my height any seat<br />
can feel like misery.</p>

<p>I wouldn’t be here today,<br />
if not for last night’s delay.</p>

<p>35E, 35E<br />
trapped in this humid<br />
sneeze of<br />
humanity.</p>

<p>Everything is expensive, and still it sucks.<br />
The cheapest coffee was four lousy  bucks.</p>

<p>The grumpiness was extreme at the TSA<br />
acting in their theatre for deferred pay</p>

<p>35E, 35E<br />
I’m not sure in which<br />
timezone<br />
I should be.</p>

<p>United customer support has been totally outsourced,<br />
hour seventeen on the phone; just the worst.</p>

<p>For the shareholders the texts all lie,<br />
about being powered by GenAI.</p>

<p>35E, 35E<br />
all of the staff<br />
on this flight and the last<br />
have been really kind and patient which is a testament to their professionalism and hospitality despite the overtly customer-hostile environment of modern American commercial aviation.</p>]]></content><author><name>R. Tyler Croy</name></author><summary type="html"><![CDATA[35E, 35E. Stuck here in the middle of the middle, 35E.]]></summary></entry><entry><title type="html">2026 March: Recently Studied Stuff</title><link href="https://brokenco.de//2026/03/21/fresh-from-rss.html" rel="alternate" type="text/html" title="2026 March: Recently Studied Stuff" /><published>2026-03-21T00:00:00+00:00</published><updated>2026-03-21T00:00:00+00:00</updated><id>https://brokenco.de//2026/03/21/fresh-from-rss</id><content type="html" xml:base="https://brokenco.de//2026/03/21/fresh-from-rss.html"><![CDATA[<p>Over the past week I have made a more conscious effort to keep track of some
really interesting articles that came through my feed reader. I am a big fan of
the open web and the power of RSS for disseminating interesting information
from actual people. Below are some really interesting posts I have read recently!</p>

<p><strong><a href="https://felipe.rs/2024/10/23/arrow-over-http/">Compressed Apache Arrow tables over HTTP</a></strong></p>

<p>When discussing transport protocols for sending data between services at work
recently, a colleague asked “why can’t we just yeet Arrow over HTTP?” It turns out, you <a href="https://github.com/apache/arrow-experiments/tree/main/http/get_simple/python">absolutely can</a> and Arrow IPC streams even have a registered MIME type:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Content-Type: application/vnd.apache.arrow.stream
</code></pre></div></div>

<p><strong><a href="https://blog.dataexpert.io/p/parquet-can-shrink-your-data-100x">Understanding Parquet format for beginners</a></strong></p>

<p>A great introduction to the <a href="https://parquet.apache.org">Apache Parquet</a> format
and why it makes so many things better with large data storage systems like
<a href="https://delta.io">Delta Lake</a>. I have written on this
<a href="/tag/parquet.html">topic</a> before and encourage you to take another read
through <a href="https://arrow.apache.org/blog/2022/12/26/querying-parquet-with-millisecond-latency/">this blog
post</a>
by some maintainers of the <a href="https://crates.io/crates/parquet">parquet</a> crate.</p>

<p><strong><a href="https://apenwarr.ca/log/20260316">Every layer of review makes you 10x slower</a></strong></p>

<blockquote>
  <p>Every layer of approval makes a process 10x slower [..]</p>

  <p>Just to be clear, we’re counting “wall clock time” here rather than effort. Almost all the extra time is spent sitting and waiting.</p>

  <ul>
    <li>Code a simple bug fix: 30 minutes</li>
    <li>Get it code reviewed by the peer next to you: 300 minutes → 5 hours → half a day</li>
    <li>Get a design doc approved by your architects team first: 50 hours → about a week</li>
    <li>Get it on some other team’s calendar to do all that (for example, if a customer requests a feature): 500 hours → 12 weeks → one fiscal quarter</li>
  </ul>
</blockquote>

<p>This inspired these thoughts which I shared with the <a href="https://github.com/delta-io/delta-rs">delta-rs</a> community:</p>

<p>“what if we didn’t require code review for merging into main”</p>

<p>I’m exploring the thought more about what we might need to make that happen.
“Why would you do such a thing, code review is so valuable!”  I do find code
reviews valuable but we do seem to lose a lot of flow time due to timezones,
differing work schedules, and a number of other things. For something without a
lot of changes, especially bug fixes that come with tests I would be much more
comfortable with maintainers merging once CI goes green.</p>

<p>Some pieces of the puzzle that I think would be needed:</p>

<ul>
  <li>Soft caps on pull requests. I saw this mentioned somewhere else, but implementing a soft cap of &lt;500 lines per pull request can help people avoid massive unreviewable changes that are simpler to integrate.</li>
  <li>Incorporating some of the benchmarking work into CI that has already been explored. If performance of key operations is not affected and the build is green, go for it.</li>
  <li>Stronger semantic version checks: if our APIs have not changed and all tests pass, I’m generally comfortable with landing stuff by maintainers.</li>
  <li>Implementing Apache Software Foundation style release candidates and voting: this is where we would put a mandatory bottleneck, rather than some jokey slack emojis like I tend to do, implementing a true release candidate process that requires review and vote before we push something to users.</li>
</ul>

<p>All of this is to say that reviews can still be requested, but I would love to
see us land more improvements faster and I think we have a bunch of different
schedules that can make pushing each change through a review queue a lot slower
than necessary.</p>

<p><strong><a href="https://www.possiblerust.com/pattern/conditional-impls">Conditional Impls in Rust</a></strong></p>

<blockquote>
  <p>It’s possible in Rust to conditionally implement methods and traits based on
the traits implemented by a type’s own type parameters. While this is used
extensively in Rust’s standard library, it’s not necessarily obvious that
this is possible.</p>
</blockquote>

<p>I have been vaguely aware of this functionality but haven’t really taken the
time to consider it, so I really appreciated this post walking through the
conditional impl functionality in Rust.</p>]]></content><author><name>R. Tyler Croy</name></author><category term="rss" /><category term="arrow" /><category term="parquet" /><category term="rust" /><summary type="html"><![CDATA[Over the past week I have made a more conscious effort to keep track of some really interesting articles that came through my feed reader. I am a big fan of the open web and the power of RSS for disseminating interesting information from actual people. Below are some really interesting posts I have read recently!]]></summary></entry><entry><title type="html">Only so many sunrises</title><link href="https://brokenco.de//2026/03/15/so-many-sunrises.html" rel="alternate" type="text/html" title="Only so many sunrises" /><published>2026-03-15T00:00:00+00:00</published><updated>2026-03-15T00:00:00+00:00</updated><id>https://brokenco.de//2026/03/15/so-many-sunrises</id><content type="html" xml:base="https://brokenco.de//2026/03/15/so-many-sunrises.html"><![CDATA[<p>With a lot of discussion around intelligence lately, I find myself thinking a lot more about <strong>wisdom</strong>.
Age doesn’t necessarily beget wisdom, but I do think that experience can.
I am always impressed by those who are able to reflect and grow wise from the
varied joys and traumas that shape each one of us.</p>

<p><a href="https://www.youtube.com/watch?v=ZJEnQOsMtsU">This video</a> struck a chord for
me. Contrasting the Bay Area hustle culture to the things that make life worth
living:</p>

<center><iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/ZJEnQOsMtsU?si=fmlv30bzptgNgN_t" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe></center>

<hr />

<p>San Francisco has always a destination for those seeking their fortunes. The
frenetic enthusiasm radiates through seemingly everything there.</p>

<p>I also really enjoyed the energy of San Francisco when I first moved
there. I had nothing else but work.</p>

<p>The trade-off for my relentless focus on my career was a tremendous level up in
a short amount of time. I wouldn’t be where I am today without a few years of
judicious networking and workaholism.</p>

<p>San Francisco was “Lord of the Flies” when I described it to friends from
elsewhere. Awash in adult boys, untethered from the real world. I would hang
out with men 10 years older then me who were doing the same dumb shit I was,
except I was in my early twenties, a commonly accepted time to be foolish.</p>

<p>I did not want to end up like them and increasingly put both physical and
mental distance between the them and myself.</p>

<p>There is more to life than panning for gold.</p>

<hr />

<p>Today I was talking with an elder almost twice as old as me, who casually
offered:</p>

<blockquote>
  <p>I still get up at 5am; at this age there are only so many sunrises left to
see.</p>
</blockquote>

<p>I’m going to try to not stay up too late dwelling on the comment, lest I miss
tomorrow’s sunrise.</p>]]></content><author><name>R. Tyler Croy</name></author><summary type="html"><![CDATA[With a lot of discussion around intelligence lately, I find myself thinking a lot more about wisdom. Age doesn’t necessarily beget wisdom, but I do think that experience can. I am always impressed by those who are able to reflect and grow wise from the varied joys and traumas that shape each one of us.]]></summary></entry></feed>