Skip to content

Commit f4c1c98

Browse files
committed
Prepare article for publication
1 parent abb92d3 commit f4c1c98

2 files changed

+11
-11
lines changed

_posts/2024-03-04-the-four-tenets-of-soa-revisited.html

+2-2
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ <h3 id="96e92c4bccef4d5789bbb5d860e3ce3f">
4545
I'll do that in a series of articles, each covering one of the tenets.
4646
</p>
4747
<ul>
48-
<li>Boundaries are explicit</li>
48+
<li><a href="/2024/03/11/boundaries-are-explicit">Boundaries are explicit</a></li>
4949
<li>Services are autonomous</li>
5050
<li>Services share schema and contract, not class</li>
5151
<li>Service compatibility is determined based on policy</li>
@@ -60,6 +60,6 @@ <h3 id="ad6f66b0ac954647bebf4d288939d2ab">
6060
Ever since I first encountered the four tenets of SOA, they've stayed with me in one form or other. When helping teams to design services, even what we may today consider 'modern services', I've drawn on some of those ideas. There are insights of a general nature that are worth considering even today.
6161
</p>
6262
<p>
63-
<strong>Next:</strong> Boundaries are explicit.
63+
<strong>Next:</strong> <a href="/2024/03/11/boundaries-are-explicit">Boundaries are explicit</a>.
6464
</p>
6565
</div>

_posts/2024-03-02-boundaries-are-explicit.html _posts/2024-03-11-boundaries-are-explicit.html

+9-9
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
layout: post
33
title: "Boundaries are explicit"
44
description: "A reading of the first Don Box tenet, with some commentary."
5-
date: 2024-03-02 13:16 UTC
5+
date: 2024-03-11 8:03 UTC
66
tags: [Services, Architecture]
77
---
88
{% include JB/setup %}
@@ -12,7 +12,7 @@
1212
<em>{{ page.description }}</em>
1313
</p>
1414
<p>
15-
This article is part of a series titled <a href="">The four tenets of SOA revisited</a>. In each of these articles, I'll pull one of <a href="https://en.wikipedia.org/wiki/Don_Box">Don Box</a>'s <em>four tenets of service-oriented architecture</em> (SOA) out of the <a href="https://learn.microsoft.com/en-us/archive/msdn-magazine/2004/january/a-guide-to-developing-and-running-connected-systems-with-indigo">original MSDN Magazine article</a> and add some of my own commentary. If you're curious why I do that, I cover that in the introductory article.
15+
This article is part of a series titled <a href="/2024/03/04/the-four-tenets-of-soa-revisited">The four tenets of SOA revisited</a>. In each of these articles, I'll pull one of <a href="https://en.wikipedia.org/wiki/Don_Box">Don Box</a>'s <em>four tenets of service-oriented architecture</em> (SOA) out of the <a href="https://learn.microsoft.com/en-us/archive/msdn-magazine/2004/january/a-guide-to-developing-and-running-connected-systems-with-indigo">original MSDN Magazine article</a> and add some of my own commentary. If you're curious why I do that, I cover that in the introductory article.
1616
</p>
1717
<p>
1818
In this article, I'll go over the first tenet, quoting from the MSDN Magazine article unless otherwise indicated.
@@ -35,7 +35,7 @@ <h3 id="3d25f37d4da8482fa846b8660823b8cd">
3535
</p>
3636
</blockquote>
3737
<p>
38-
Notice that there's nothing here about Windows Communication Framework (WCF), or any other specific technology. This is common to all four tenets, and one of the reasons that I think they deserve to be lifted out of their original context and put on display as the general ideas that they are.
38+
Notice that there's nothing here about <a href="https://en.wikipedia.org/wiki/Windows_Communication_Foundation">Windows Communication Framework</a> (WCF), or any other specific technology. This is common to all four tenets, and one of the reasons that I think they deserve to be lifted out of their original context and put on display as the general ideas that they are.
3939
</p>
4040
<p>
4141
I'm getting the vibe that the above description was written under the impression of the disenchantment with distributed objects that was setting in around that time. The year before, <a href="https://martinfowler.com/">Martin Fowler</a> had formulated his
@@ -44,13 +44,13 @@ <h3 id="3d25f37d4da8482fa846b8660823b8cd">
4444
<p>
4545
"<strong>First Law of Distributed Object Design:</strong> Don't distribute your objects!"
4646
</p>
47-
<footer><cite>Martin Fowler, <a href="https://blog.ploeh.dk/ref/peaa">Patterns of Enterprise Application Architecture</a>, (his emphasis)</cite></footer>
47+
<footer><cite>Martin Fowler, <a href="/ref/peaa">Patterns of Enterprise Application Architecture</a>, (his emphasis)</cite></footer>
4848
</blockquote>
4949
<p>
50-
The way that I read this then, and the way I <em>still</em> read it today, is that in contrast to distributed objects, you should treat any service invocation as a noticeable operation, somehow distinct from normal code.
50+
The way that I read the tenet then, and the way I <em>still</em> read it today, is that in contrast to distributed objects, you should treat any service invocation as a noticeable operation, <em>"putting a premium on boundary crossings"</em>, somehow distinct from normal code.
5151
</p>
5252
<p>
53-
Perhaps I read to much into that, because WCF immediately proceeded to convert any SOAP service into a lot of auto-generated C# code that would then enable you to invoke operations on a remote service using (you guessed it) a method invocation.
53+
Perhaps I read to much into that, because WCF immediately proceeded to convert any <a href="https://en.wikipedia.org/wiki/SOAP">SOAP</a> service into a lot of auto-generated C# code that would then enable you to invoke operations on a remote service using (you guessed it) a method invocation.
5454
</p>
5555
<p>
5656
Here a code snippet from the <a href="https://learn.microsoft.com/dotnet/framework/wcf/how-to-use-a-wcf-client">WCF documentation</a>:
@@ -61,7 +61,7 @@ <h3 id="3d25f37d4da8482fa846b8660823b8cd">
6161
<span style="color:blue;">double</span>&nbsp;<span style="font-weight:bold;color:#1f377f;">result</span>&nbsp;=&nbsp;client.Add(value1,&nbsp;value2);</pre>
6262
</p>
6363
<p>
64-
What happens here is that <code>client.Add</code> creates and sends a SOAP message to a service, receives the response, unpacks it, and returns it as a <code>double</code> value. Even so, it looks just like any other method call.
64+
What happens here is that <code>client.Add</code> creates and sends a SOAP message to a service, receives the response, unpacks it, and returns it as a <code>double</code> value. Even so, it looks just like any other method call. There's no <em>"premium on boundary crossings"</em> here.
6565
</p>
6666
<p>
6767
So much for the principle that boundaries are explicit. They're not, and it bothered me twenty years ago, as it bothers me today.
@@ -73,7 +73,7 @@ <h3 id="55bd772540a047a3b8db0d1aee373e87">
7373
How do you make boundaries explicit? <a href="#55bd772540a047a3b8db0d1aee373e87">#</a>
7474
</h3>
7575
<p>
76-
This problem isn't isolated to WCF or SOAP. Network calls are slow and unreliable. Perhaps you're connecting to a system on the other side of the Earth. Perhaps the system is unavailable. This is true regardless of protocol.
76+
This problem isn't isolated to WCF or SOAP. <a href="https://en.wikipedia.org/wiki/Fallacies_of_distributed_computing">Network calls are slow and unreliable</a>. Perhaps you're connecting to a system on the other side of the Earth. Perhaps the system is unavailable. This is true regardless of protocol.
7777
</p>
7878
<p>
7979
From the software architect's perspective, the tenet that boundaries are explicit is a really good idea. The clearer it is where in a code base network operations take place, the easier it is to troubleshot and maintain that code. This could make it easier to spot <em>n + 1</em> problems, as well as give you opportunities to <a href="/2020/03/23/repeatable-execution">add logging</a>, <a href="https://martinfowler.com/bliki/CircuitBreaker.html">Circuit Breakers</a>, etc.
@@ -181,7 +181,7 @@ <h3 id="fffc782323e746ef9a7b662132e17257">
181181
<p>
182182
"Abstraction is <em>the elimination of the irrelevant and the amplification of the essential.</em>"
183183
</p>
184-
<footer><cite>Robert C. Martin, <a href="/ref/doocautbm">Designing Object-Oriented C++ Applications Using The Booch Method</a>, chapter 00, (his emphasis)</cite></footer>
184+
<footer><cite>Robert C. Martin, <a href="/ref/doocautbm">Designing Object-Oriented C++ Applications Using The Booch Method</a>, chapter 00 (sic), (his emphasis)</cite></footer>
185185
</blockquote>
186186
<p>
187187
The existence of a boundary is essential, so while we might want to eliminate various other irrelevant details, this is a property that we should retain and surface in APIs. Even better, it'd be best if we could do it in such a way that it can't easily be swept under the rug, as shown above.

0 commit comments

Comments
 (0)