<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Service Boundaries and Ownership on Brian Faust</title><link>https://vacua.dev/series/service-boundaries-and-ownership/</link><description>Recent content in Service Boundaries and Ownership on Brian Faust</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Mon, 01 Jan 0001 00:00:00 +0000</lastBuildDate><atom:link href="https://vacua.dev/series/service-boundaries-and-ownership/rss.xml" rel="self" type="application/rss+xml"/><item><title>Boundaries Follow Work Without Becoming Destiny</title><link>https://vacua.dev/boundaries-follow-work-without-becoming-destiny/</link><pubDate>Tue, 01 Oct 2024 00:00:00 +0000</pubDate><guid>https://vacua.dev/boundaries-follow-work-without-becoming-destiny/</guid><description>&lt;p&gt;We had a small team, so every service was officially owned by everyone. In
practice, a developer could finish five hours of work in a specialist
application and then spend three weeks integrating and testing it against the
legacy API.&lt;/p&gt;
&lt;p&gt;The delay was not a queue in front of another team. There was no other team. It
came from a system which had evolved across years, changing commercial
priorities, agencies, freelancers, and eventually an internal development
team. Each period left decisions which made sense under its own pressure. Their
combined cost appeared in the next change.&lt;/p&gt;</description></item><item><title>Enforce Architecture at the Cheapest Reliable Layer</title><link>https://vacua.dev/enforce-architecture-at-the-cheapest-reliable-layer/</link><pubDate>Sun, 01 Sep 2024 00:00:00 +0000</pubDate><guid>https://vacua.dev/enforce-architecture-at-the-cheapest-reliable-layer/</guid><description>&lt;p&gt;The rule says Domain must not depend on Infrastructure.&lt;/p&gt;
&lt;p&gt;Code review misses this reference:&lt;/p&gt;
&lt;figure class="code-figure"&gt;
 &lt;div class="code-block" data-copy-code&gt;
 &lt;button class="copy-code" type="button" aria-label="Copy code"&gt;copy&lt;/button&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;final&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt; &lt;span class="k"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;\Illuminate\Database\Eloquent\Model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/figure&gt;
&lt;p&gt;A quick substring scan catches it. The same scan also rejects a harmless
docblock which names &lt;code&gt;EloquentOrderRepository&lt;/code&gt; while explaining what Domain
must not do.&lt;/p&gt;
&lt;p&gt;The first check is unreliable because a person must notice every occurrence.
The second is unreliable because text is not a PHP dependency. A token-aware
source check catches the executable reference and ignores the prose.&lt;/p&gt;</description></item><item><title>Name the Independent Thing</title><link>https://vacua.dev/name-the-independent-thing/</link><pubDate>Thu, 01 Aug 2024 00:00:00 +0000</pubDate><guid>https://vacua.dev/name-the-independent-thing/</guid><description>&lt;p&gt;Both diagrams say &lt;code&gt;microservices&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The first has four HTTP endpoints and four repositories. They share one
database, move on one release train, page one on-call rotation, and require a
coordinated deployment when the shared schema changes.&lt;/p&gt;
&lt;p&gt;The second can release Payments without Ordering, lose the Payments process
without losing unrelated Ordering work, rotate payment credentials inside one
data zone, and send repair to a staffed Payments owner.&lt;/p&gt;
&lt;p&gt;The label is identical. The operating contract is not.&lt;/p&gt;</description></item><item><title>A Module Is Cheaper Than a Network Boundary</title><link>https://vacua.dev/a-module-is-cheaper-than-a-network-boundary/</link><pubDate>Mon, 01 Jul 2024 00:00:00 +0000</pubDate><guid>https://vacua.dev/a-module-is-cheaper-than-a-network-boundary/</guid><description>&lt;p&gt;The payment was captured. Ordering does not know that.&lt;/p&gt;
&lt;p&gt;Its request reached Payments, the capture became durable, and the response
disappeared on the way back. Ordering now has a pending order and a timeout.
Retrying without a stable identity may charge twice. Treating the timeout as a
decline may abandon a real capture.&lt;/p&gt;
&lt;p&gt;Inside one process and transaction, that particular ambiguity does not exist.
The payment and order commit together or roll back together. Moving Payments
across a network has bought a separate release and failure boundary. It has
also replaced a return value with a protocol for identity, uncertainty, and
repair.&lt;/p&gt;</description></item><item><title>Decompose by Change, Not by Layer</title><link>https://vacua.dev/decompose-by-change-not-by-layer/</link><pubDate>Sat, 01 Jun 2024 00:00:00 +0000</pubDate><guid>https://vacua.dev/decompose-by-change-not-by-layer/</guid><description>&lt;p&gt;A cancellation rule changes: refuse cancellation after warehouse handoff.&lt;/p&gt;
&lt;p&gt;In a conventional layered application, the work touches a controller, an
application service, a domain policy, a repository, a migration, and tests. If
the organization mirrors those directories, one business decision becomes a
project for API, backend, and database teams.&lt;/p&gt;
&lt;p&gt;The next change adds a covering index for order lookup. It touches only the
persistence layer and changes no business decision.&lt;/p&gt;</description></item></channel></rss>