<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Software Design on Grizzlebit</title>
  <subtitle>Ray Grasso's Blog</subtitle>
  <updated>2026-08-13T08:22:37.720033+08:00</updated>
  <id>https://www.grizzlebit.com/tags/software-design/feed.xml</id>
  <link rel="alternate" type="text/html" href="https://www.grizzlebit.com/tags/software-design/"/>
  <link rel="self" type="application/atom+xml" href="https://www.grizzlebit.com/tags/software-design/feed.xml"/>
  <rights>Copyright © 2026, Ray Grasso</rights>
  <author>
    <name>Ray Grasso</name>
  </author>
  <icon>https://www.grizzlebit.com/images/icon.png</icon>
  <logo>https://www.grizzlebit.com/images/icon.png</logo>
  
  <entry>
    <id>https://www.grizzlebit.com/links/2025/11-11-no-your-domains-and-bounded-contexts-dont-map-1-on-1/</id>
    <published>2025-11-11T19:33:19+08:00</published>
    <updated>2025-11-11T19:36:27+08:00</updated>
    <author><name>Ray Grasso</name></author>
    
    <title>No, Your Domains and Bounded Contexts Don’t Map 1 on 1 ↬</title>
    <content type="html" xml:base="https://www.grizzlebit.com/links/" xml:lang="en"><![CDATA[<div>
  <p>Mathias Verraes:</p>
<blockquote>
<p>In DDD, we reason like this: The engineers need to build, maintain, and evolve secure and performant systems that serve the company. To do that, the engineers need an understanding of the domains and of the software systems. To achieve that, we leave the domains as the organisation sees them, and we draw our own Bounded Contexts to serve our need for understanding. The Bounded Contexts exist primarily for the engineers, and for the engineers’ communication with domain experts and other business functions.</p>
</blockquote>

  <p>
    
    <a href="https://www.grizzlebit.com/links/2025/11-11-no-your-domains-and-bounded-contexts-dont-map-1-on-1/">↬</a>
     ∙ Tagged in <a href="https://www.grizzlebit.com/tags/software-design/">Software Design</a>.</p>
</div>
]]></content>
    <link rel="alternate" href="https://verraes.net/2025/08/domain-and-bounded-contexts-dont-map-one-on-one/"></link>
    <link rel="related" href="https://www.grizzlebit.com/links/2025/11-11-no-your-domains-and-bounded-contexts-dont-map-1-on-1/"></link>
    
  </entry>
  
  <entry>
    <id>https://www.grizzlebit.com/links/2024/10-07-scaling-the-linear-sync-engine/</id>
    <published>2024-10-07T19:51:24+10:00</published>
    <updated>2024-10-07T19:56:21+10:00</updated>
    <author><name>Ray Grasso</name></author>
    
    <title>Scaling the Linear Sync Engine ↬</title>
    <content type="html" xml:base="https://www.grizzlebit.com/links/" xml:lang="en"><![CDATA[<div>
  <p>Fascinating deep dive into hitting and overcoming the scaling issues affecting the sync engine <a href="https://linear.app/blog/scaling-the-linear-sync-engine">Linear</a> built.</p>

  <p>
    
    <a href="https://www.grizzlebit.com/links/2024/10-07-scaling-the-linear-sync-engine/">↬</a>
     ∙ Tagged in <a href="https://www.grizzlebit.com/tags/software-design/">Software Design</a>, <a href="https://www.grizzlebit.com/tags/software-engineering/">Software Engineering</a>.</p>
</div>
]]></content>
    <link rel="alternate" href="https://www.youtube.com/watch?v=Wo2m3jaJixU"></link>
    <link rel="related" href="https://www.grizzlebit.com/links/2024/10-07-scaling-the-linear-sync-engine/"></link>
    
  </entry>
  
  <entry>
    <id>https://www.grizzlebit.com/links/2023/11-05-classnames/</id>
    <published>2023-11-05T11:40:42+08:00</published>
    <updated>2023-11-05T11:41:32+08:00</updated>
    <author><name>Ray Grasso</name></author>
    
    <title>Classnames ↬</title>
    <content type="html" xml:base="https://www.grizzlebit.com/links/" xml:lang="en"><![CDATA[<div>
  <p>Paul Robert Lloyd:</p>
<blockquote>
<p>This small website provides a list of words that you can refer to when naming something like an HTML class, custom CSS property or JavaScript function. Each word links to a page on Wordnik, an online dictionary that does the hard work of providing multiple definitions and listing related words.</p>
</blockquote>

  <p>
    
    <a href="https://www.grizzlebit.com/links/2023/11-05-classnames/">↬</a>
     ∙ Tagged in <a href="https://www.grizzlebit.com/tags/software-design/">Software Design</a>.</p>
</div>
]]></content>
    <link rel="alternate" href="https://paulrobertlloyd.com/2023/272/a1/classnames/"></link>
    <link rel="related" href="https://www.grizzlebit.com/links/2023/11-05-classnames/"></link>
    
  </entry>
  
  <entry>
    <id>https://www.grizzlebit.com/links/2023/08-13-eventual-business-consistency/</id>
    <published>2023-08-13T15:39:07+08:00</published>
    <updated>2023-08-13T16:04:00+08:00</updated>
    <author><name>Ray Grasso</name></author>
    
    <title>Eventual Business Consistency ↬</title>
    <content type="html" xml:base="https://www.grizzlebit.com/links/" xml:lang="en"><![CDATA[<div>
  <p>Kent Beck:</p>
<blockquote>
<p>The fundamental, inescapable problem? What is in the system is a flawed reflection of what is going on in reality. We want what is in the system to be as close as possible to reality, but we also need to acknowledge that consistency between the system &amp; reality will only ever be approached, not achieved. The system will record changes in reality eventually, but by then we may have made decisions that need to be undone.</p>
</blockquote>

  <p>
    
    <a href="https://www.grizzlebit.com/links/2023/08-13-eventual-business-consistency/">↬</a>
     ∙ Tagged in <a href="https://www.grizzlebit.com/tags/software-design/">Software Design</a>.</p>
</div>
]]></content>
    <link rel="alternate" href="https://tidyfirst.substack.com/p/eventual-business-consistency"></link>
    <link rel="related" href="https://www.grizzlebit.com/links/2023/08-13-eventual-business-consistency/"></link>
    
  </entry>
  
  <entry>
    <id>https://www.grizzlebit.com/links/2021/12-29-scaling-the-practice-of-architecture-conversationally/</id>
    <published>2021-12-29T14:56:56+08:00</published>
    <updated>2023-04-13T20:33:32+08:00</updated>
    <author><name>Ray Grasso</name></author>
    
    <title>Scaling the Practice of Architecture, Conversationally ↬</title>
    <content type="html" xml:base="https://www.grizzlebit.com/links/" xml:lang="en"><![CDATA[<div>
  <p>Andrew Harmel-Law:</p>
<blockquote>
<p>The moves in software delivery towards ever-increasing team autonomy have, in my mind at least, heightened the need for more architectural thinking combined with alternative approaches to architectural Decision Making.</p>
<p>Ensuring our software teams experience true autonomy raises a key problem: how might a small group of architects feed a significant number of hungry, value-stream-aligned teams? Why? Because in this environment Architects
now need to be in many, many more places at once, doing all that traditional &ldquo;architecture&rdquo;.</p>
</blockquote>
<p>…</p>
<blockquote>
<p>The Rule: anyone can make an architectural decision.</p>
<p>The Qualifier: before making the decision, the decision-taker must consult two groups: The first is everyone who will be meaningfully affected by the decision. The second is people with expertise in the area the decision is being taken.</p>
</blockquote>

  <p>
    
    <a href="https://www.grizzlebit.com/links/2021/12-29-scaling-the-practice-of-architecture-conversationally/">↬</a>
     ∙ Tagged in <a href="https://www.grizzlebit.com/tags/software-design/">Software Design</a>, <a href="https://www.grizzlebit.com/tags/teamwork/">Teamwork</a>.</p>
</div>
]]></content>
    <link rel="alternate" href="https://martinfowler.com/articles/scaling-architecture-conversationally.html"></link>
    <link rel="related" href="https://www.grizzlebit.com/links/2021/12-29-scaling-the-practice-of-architecture-conversationally/"></link>
    
  </entry>
  
  <entry>
    <id>https://www.grizzlebit.com/links/2021/11-30-the-strong-and-weak-forces-of-architecture/</id>
    <published>2021-11-30T19:38:32+08:00</published>
    <updated>2023-04-13T20:33:32+08:00</updated>
    <author><name>Ray Grasso</name></author>
    
    <title>The Strong and Weak Forces of Architecture ↬</title>
    <content type="html" xml:base="https://www.grizzlebit.com/links/" xml:lang="en"><![CDATA[<div>
  <blockquote>
<p>Good technical design decisions are very dependent on context. Teams that regularly work together on common goals are able to communicate regularly and negotiate changes quickly. These teams exhibit a strong force of alignment, and can make technology and design decisions that harness that strong force. As we zoom out in a larger organisation an increasingly weak force exists between teams and divisions that work independently and have less frequent collaboration. Recognising the differences in these strong and weak forces allows us to make better decisions and give better guidance for each level, allowing for more empowered teams that can move faster.</p>
</blockquote>

  <p>
    
    <a href="https://www.grizzlebit.com/links/2021/11-30-the-strong-and-weak-forces-of-architecture/">↬</a>
     ∙ Tagged in <a href="https://www.grizzlebit.com/tags/software-design/">Software Design</a>.</p>
</div>
]]></content>
    <link rel="alternate" href="https://martinfowler.com/articles/strong-weak-arch.html"></link>
    <link rel="related" href="https://www.grizzlebit.com/links/2021/11-30-the-strong-and-weak-forces-of-architecture/"></link>
    
  </entry>
  
  <entry>
    <id>https://www.grizzlebit.com/links/2021/05-16-islands-architecture/</id>
    <published>2021-05-16T13:34:46+08:00</published>
    <updated>2023-04-13T20:33:32+08:00</updated>
    <author><name>Ray Grasso</name></author>
    
    <title>Islands Architecture ↬</title>
    <content type="html" xml:base="https://www.grizzlebit.com/links/" xml:lang="en"><![CDATA[<div>
  <blockquote>
<p>The general idea of an “Islands” architecture is deceptively simple: render HTML pages on the server, and inject placeholders or slots around highly dynamic regions. These placeholders/slots contain the server-rendered HTML output from their corresponding widget. They denote regions that can then be &ldquo;hydrated&rdquo; on the client into small self-contained widgets, reusing their server-rendered initial HTML.</p>
</blockquote>

  <p>
    
    <a href="https://www.grizzlebit.com/links/2021/05-16-islands-architecture/">↬</a>
     ∙ Tagged in <a href="https://www.grizzlebit.com/tags/software-design/">Software Design</a>.</p>
</div>
]]></content>
    <link rel="alternate" href="https://jasonformat.com/islands-architecture/"></link>
    <link rel="related" href="https://www.grizzlebit.com/links/2021/05-16-islands-architecture/"></link>
    
  </entry>
  
  <entry>
    <id>https://www.grizzlebit.com/posts/2019/01-29-designing-data-intensive-applications/</id>
    <published>2019-01-29T17:11:00+08:00</published>
    <updated>2024-07-15T14:03:44+10:00</updated>
    <author><name>Ray Grasso</name></author>
    
    <title>Designing Data-Intensive Applications 📚</title>
    <content type="html" xml:base="https://www.grizzlebit.com/posts/" xml:lang="en"><![CDATA[<div>
  <figure class="half-wide"><a href="https://dataintensive.net/"><img src="/images/books/designing-data-intensive-applications.png"
			alt="Designing Data-Intensive Applications by Martin Kleppmann"></a>
</figure>

<p>This book surveys data storage and distributed systems and is a fantastic primer for all software developers.</p>
<p>It starts with naive approaches to storing data, quickly builds up to how transactions work, and works up to the complexities of building distributed systems.</p>
<p>I particularly enjoyed the chapter on stream processing and event sourcing. It contrasts stream processing to batch processing and highlights many of the challenges of these approaches and explores options for addressing them.</p>

  <p>
    
    <a href="https://www.grizzlebit.com/posts/2019/01-29-designing-data-intensive-applications/">🔗</a>
     ∙ Tagged in <a href="https://www.grizzlebit.com/tags/books/">Books</a>, <a href="https://www.grizzlebit.com/tags/software-design/">Software Design</a>.</p>
</div>
]]></content>
    <link rel="alternate" href="https://www.grizzlebit.com/posts/2019/01-29-designing-data-intensive-applications/"></link>
    <link rel="related" href="https://www.grizzlebit.com/posts/2019/01-29-designing-data-intensive-applications/"></link>
    
  </entry>
  
  <entry>
    <id>https://www.grizzlebit.com/posts/2018/09-13-forgetting-data-in-event-sourced-systems/</id>
    <published>2018-09-13T20:38:00+08:00</published>
    <updated>2023-04-13T20:33:32+08:00</updated>
    <author><name>Ray Grasso</name></author>
    
    <title>Forgetting Data in Event Sourced Systems</title>
    <content type="html" xml:base="https://www.grizzlebit.com/posts/" xml:lang="en"><![CDATA[<div>
  <p><a href="https://gdpr-info.eu/art-17-gdpr/">GDPR&rsquo;s right to be forgotten</a> means we have to be able to erase a person&rsquo;s data from our systems. Event sourced systems work from an immutable log of events which makes erasure difficult. You probably want to think hard about storing data you need to delete in an immutable event log but sometimes that choice is already made and you need to make it work, so let&rsquo;s dig in.</p>
<h2 id="erasing-user-data-from-current-state-projections">Erasing user data from current state projections</h2>
<p>This is relatively straightforward. A <code>RightToBeForgottenInvoked</code> event is added to the event store for the person. All projectors that depend on personal data listen for this event and prune or scrub the appropriate data for the person from their projections.</p>
<h2 id="erasing-data-from-the-event-stream-itself">Erasing data from the event stream itself</h2>
<p>This case is trickier. We need to rewrite history in a way that doesn&rsquo;t break things. Let&rsquo;s look at an option for erasing data without rebuilding the event stream. This approach is also applicable for projections that are immutable change logs.</p>
<p>We can store personal data outside of events themselves in a separate storage layer. Each event instead stores a key for retrieving the data from this layer and any event consumers request the data when they need it. Given this data is personal the storage layer should probably encrypt the data at rest.</p>
<p>Once a <code>RightToBeForgottenInvoked</code> event is added to the event store all data for that person can be erased from the storage layer. All subsequent requests for data from the secure storage layer for that person&rsquo;s data will return <a href="https://en.wikipedia.org/wiki/Null_object_pattern">null objects</a> rather than the actual data. This should make life easier for all consumers and avoid you null checking yourself to death all over the place.</p>
<p>Let&rsquo;s see what this secure storage layer might look like.</p>
<h2 id="sketch-of-a-secure-storage-layer">Sketch of a secure storage layer</h2>
<p>Our secure storage layer stores data that is scoped to a person and has a type (so we can return null objects). The store allows all data for a specific person to be erased.</p>
<p>Let&rsquo;s start with two main models: a <code>Person</code><sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> and a <code>Data</code> model.</p>
<pre tabindex="0"><code>      Data                 Person
  ┌──────────┐        ┌───────────────┐
  │    id    │   ┌───&gt;│      id       │
  ├──────────┤   │    ├───────────────┤
  │person_id │───┘    │encryption_key │
  ├──────────┤        ├───────────────┤
  │   type   │        │   is_erased   │
  ├──────────┤        └───────────────┘
  │ciphertext│
  └──────────┘
</code></pre><p>The interface to the secure storage layer is outlined below.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">SecureStorage</span>
</span></span><span class="line"><span class="cl">  <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="n">person_id</span><span class="p">,</span> <span class="n">data_id</span><span class="p">,</span> <span class="n">type</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># Find the Person model for person_id (lazily create one if needed).</span>
</span></span><span class="line"><span class="cl">    <span class="c1">#</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># Encrypt the data using the person&#39;s encryption_key and store the</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># ciphertext in the data table using the client supplied data_id and type.</span>
</span></span><span class="line"><span class="cl">    <span class="c1">#</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># Clients will store this data_id in an event body and use it to retrieve</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># the data later.</span>
</span></span><span class="line"><span class="cl">  <span class="k">end</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">def</span> <span class="nf">erase_data_for_person</span><span class="p">(</span><span class="n">person_id</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># Mark the corresponding record in the person table as erased</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># and delete the encryption key.</span>
</span></span><span class="line"><span class="cl">  <span class="k">end</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="n">data_id</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">person</span> <span class="o">=</span> <span class="no">Person</span><span class="o">.</span><span class="n">find_non_erased</span><span class="p">(</span><span class="n">person_id</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">person</span>
</span></span><span class="line"><span class="cl">      <span class="c1"># Look up the row from the data table, decrypt ciphertext using the</span>
</span></span><span class="line"><span class="cl">      <span class="c1"># key on the person model, and return the data.</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span>
</span></span><span class="line"><span class="cl">      <span class="c1"># Look up the row from the data table and return a null object for</span>
</span></span><span class="line"><span class="cl">      <span class="c1"># that data type.</span>
</span></span><span class="line"><span class="cl">    <span class="k">end</span>
</span></span><span class="line"><span class="cl">  <span class="k">end</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span>
</span></span></code></pre></div><h2 id="where-does-that-leave-us">Where does that leave us?</h2>
<p>After a person has invoked their right to be forgotten all current state projections will be updated to erase that person&rsquo;s data. The event store will return null objects for any events that contain data for the person which means that any event processors won&rsquo;t see that data as they build their projections. It will also contain the <code>RightToBeForgottenInvoked</code> event for the person so consumers can handle that explicitly if required.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>This could be expanded to be more general but we&rsquo;ll stick with person for the purpose of this post.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>

  <p>
    
    <a href="https://www.grizzlebit.com/posts/2018/09-13-forgetting-data-in-event-sourced-systems/">🔗</a>
     ∙ Tagged in <a href="https://www.grizzlebit.com/tags/software-design/">Software Design</a>.</p>
</div>
]]></content>
    <link rel="alternate" href="https://www.grizzlebit.com/posts/2018/09-13-forgetting-data-in-event-sourced-systems/"></link>
    <link rel="related" href="https://www.grizzlebit.com/posts/2018/09-13-forgetting-data-in-event-sourced-systems/"></link>
    
  </entry>
  
  <entry>
    <id>https://www.grizzlebit.com/links/2018/02-19-a-decade-of-ddd-cqrs-event-sourcing/</id>
    <published>2018-02-19T14:26:00+08:00</published>
    <updated>2023-04-13T20:33:32+08:00</updated>
    <author><name>Ray Grasso</name></author>
    
    <title>A Decade of DDD, CQRS, Event Sourcing ↬</title>
    <content type="html" xml:base="https://www.grizzlebit.com/links/" xml:lang="en"><![CDATA[<div>
  <p>From a couple years ago. The section dispelling dogma that&rsquo;s arisen around the approach was particularly interesting (from 22:40).</p>

  <p>
    
    <a href="https://www.grizzlebit.com/links/2018/02-19-a-decade-of-ddd-cqrs-event-sourcing/">↬</a>
     ∙ Tagged in <a href="https://www.grizzlebit.com/tags/software-design/">Software Design</a>.</p>
</div>
]]></content>
    <link rel="alternate" href="https://www.youtube.com/watch?v=LDW0QWie21s"></link>
    <link rel="related" href="https://www.grizzlebit.com/links/2018/02-19-a-decade-of-ddd-cqrs-event-sourcing/"></link>
    
  </entry>
  
  <entry>
    <id>https://www.grizzlebit.com/links/2017/07-14-monads-are-a-solution-to-a-problem/</id>
    <published>2017-07-14T21:46:00+08:00</published>
    <updated>2023-04-13T20:33:32+08:00</updated>
    <author><name>Ray Grasso</name></author>
    
    <title>Monads Are a Solution to a Problem ↬</title>
    <content type="html" xml:base="https://www.grizzlebit.com/links/" xml:lang="en"><![CDATA[<div>
  <p>Max Kreminski:</p>
<blockquote>
<p>Monads are a solution to a specific problem: the problem of repetitive code. If you write enough code in a functional programming language, you start to notice that you’re writing a lot of suspiciously similar code to solve a bunch of superficially different problems. Wouldn’t it be nice if you could just write this code once and then reuse it, instead of rewriting it slightly differently every time? I’m omitting a lot of detail here, but this is effectively what monads allow you to do.</p>
</blockquote>

  <p>
    
    <a href="https://www.grizzlebit.com/links/2017/07-14-monads-are-a-solution-to-a-problem/">↬</a>
     ∙ Tagged in <a href="https://www.grizzlebit.com/tags/software-design/">Software Design</a>.</p>
</div>
]]></content>
    <link rel="alternate" href="http://mkremins.github.io/blog/doors-headaches-intellectual-need"></link>
    <link rel="related" href="https://www.grizzlebit.com/links/2017/07-14-monads-are-a-solution-to-a-problem/"></link>
    
  </entry>
  
  <entry>
    <id>https://www.grizzlebit.com/links/2017/05-16-rearchitecting-airbnbs-frontend/</id>
    <published>2017-05-16T20:34:37+08:00</published>
    <updated>2026-07-24T14:03:34+08:00</updated>
    <author><name>Ray Grasso</name></author>
    
    <title>Rearchitecting Airbnb’s Frontend ↬</title>
    <content type="html" xml:base="https://www.grizzlebit.com/links/" xml:lang="en"><![CDATA[<div>
  <p>Rails to React.</p>

  <p>
    
    <a href="https://www.grizzlebit.com/links/2017/05-16-rearchitecting-airbnbs-frontend/">↬</a>
     ∙ Tagged in <a href="https://www.grizzlebit.com/tags/software-design/">Software Design</a>.</p>
</div>
]]></content>
    <link rel="alternate" href="https://medium.com/airbnb-engineering/rearchitecting-airbnbs-frontend-5e213efc24d2"></link>
    <link rel="related" href="https://www.grizzlebit.com/links/2017/05-16-rearchitecting-airbnbs-frontend/"></link>
    
  </entry>
  
  <entry>
    <id>https://www.grizzlebit.com/links/2017/05-16-jose-valim-cognicast-episode-120/</id>
    <published>2017-05-16T19:04:26+08:00</published>
    <updated>2026-07-24T14:27:45+08:00</updated>
    <author><name>Ray Grasso</name></author>
    
    <title>José Valim - Cognicast Episode 120 ↬</title>
    <content type="html" xml:base="https://www.grizzlebit.com/links/" xml:lang="en"><![CDATA[<div>
  <p>A look into some of the inspiration and decisions in the design of Elixir.</p>

  <p>
    
    <a href="https://www.grizzlebit.com/links/2017/05-16-jose-valim-cognicast-episode-120/">↬</a>
     ∙ Tagged in <a href="https://www.grizzlebit.com/tags/software-design/">Software Design</a>.</p>
</div>
]]></content>
    <link rel="alternate" href="http://blog.cognitect.com/cognicast/120"></link>
    <link rel="related" href="https://www.grizzlebit.com/links/2017/05-16-jose-valim-cognicast-episode-120/"></link>
    
  </entry>
  
  <entry>
    <id>https://www.grizzlebit.com/links/2017/05-05-good-design-is-imperfect-design/</id>
    <published>2017-05-05T11:24:24+08:00</published>
    <updated>2026-07-24T14:03:34+08:00</updated>
    <author><name>Ray Grasso</name></author>
    
    <title>Good Design is Imperfect Design ↬</title>
    <content type="html" xml:base="https://www.grizzlebit.com/links/" xml:lang="en"><![CDATA[<div>
  <p>Eric Evans on avoiding the pursuit of perfection when using DDD.</p>

  <p>
    
    <a href="https://www.grizzlebit.com/links/2017/05-05-good-design-is-imperfect-design/">↬</a>
     ∙ Tagged in <a href="https://www.grizzlebit.com/tags/software-design/">Software Design</a>.</p>
</div>
]]></content>
    <link rel="alternate" href="https://skillsmatter.com/skillscasts/9171-good-design-is-imperfect-design"></link>
    <link rel="related" href="https://www.grizzlebit.com/links/2017/05-05-good-design-is-imperfect-design/"></link>
    
  </entry>
  
  <entry>
    <id>https://www.grizzlebit.com/links/2017/02-28-stacking-theory-for-systems-design/</id>
    <published>2017-02-28T21:07:00+08:00</published>
    <updated>2026-07-24T08:41:46+08:00</updated>
    <author><name>Ray Grasso</name></author>
    
    <title>Stacking Theory for Systems Design ↬</title>
    <content type="html" xml:base="https://www.grizzlebit.com/links/" xml:lang="en"><![CDATA[<div>
  <p>Jesper L. Andersen:</p>
<blockquote>
<p>In the recent years, I have adopted a method for system design, which I think yields good results. For a lack of better word, I overloaded “stack” yet again, and use it as a metaphor for this design.</p>
</blockquote>
<blockquote>
<p>The baseline is level 0 in the stack, and now we try to move the system upwards in the stack by adding another level. It is important to stress that transitioning is a best effort method. We make an attempt at increasing the operational level of the system, but if we can’t we stay put at the current level.</p>
</blockquote>

  <p>
    
    <a href="https://www.grizzlebit.com/links/2017/02-28-stacking-theory-for-systems-design/">↬</a>
     ∙ Tagged in <a href="https://www.grizzlebit.com/tags/software-design/">Software Design</a>.</p>
</div>
]]></content>
    <link rel="alternate" href="https://medium.com/@jlouis666/stacking-theory-for-systems-design-2450e6300689#.ggva2muss"></link>
    <link rel="related" href="https://www.grizzlebit.com/links/2017/02-28-stacking-theory-for-systems-design/"></link>
    
  </entry>
  
</feed>
