<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Adam Banaszkiewicz</title>
    <description>The latest articles on DEV Community by Adam Banaszkiewicz (@adam-banaszkiewicz).</description>
    <link>https://dev.to/adam-banaszkiewicz</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1102447%2F7275647d-cc3a-4b5e-bee7-cac94b69566b.png</url>
      <title>DEV Community: Adam Banaszkiewicz</title>
      <link>https://dev.to/adam-banaszkiewicz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/adam-banaszkiewicz"/>
    <language>en</language>
    <item>
      <title>Why ADRs Matter: Capturing Architectural Decisions with Purpose</title>
      <dc:creator>Adam Banaszkiewicz</dc:creator>
      <pubDate>Mon, 07 Apr 2025 09:30:00 +0000</pubDate>
      <link>https://dev.to/adam-banaszkiewicz/why-adrs-matter-capturing-architectural-decisions-with-purpose-47n4</link>
      <guid>https://dev.to/adam-banaszkiewicz/why-adrs-matter-capturing-architectural-decisions-with-purpose-47n4</guid>
      <description>&lt;h1&gt;
  
  
  Why ADRs Matter: Capturing Architectural Decisions with Purpose
&lt;/h1&gt;

&lt;p&gt;Have you ever looked at a piece of code and asked yourself, &lt;em&gt;"Why did we do it this way?"&lt;/em&gt;&lt;br&gt;&lt;br&gt;
Welcome to the world of &lt;strong&gt;Architecture Decision Records (ADR)&lt;/strong&gt; — a simple but powerful technique to preserve the "why" behind technical decisions in your projects.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Problem Does ADR Solve?
&lt;/h2&gt;

&lt;p&gt;In every software project, decisions are made. We decide which framework to use, why a service communicates over REST instead of gRPC, or why a particular domain model was split into two bounded contexts. But over time, people leave, contexts shift, and the reasoning behind those choices gets lost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ADR is the answer to the question “Why did we do this?”&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
It gives a voice to decisions, capturing not just the &lt;em&gt;what&lt;/em&gt;, but more importantly, the &lt;em&gt;why&lt;/em&gt;. It’s not enough to read the code — ADRs give you the intent behind it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is an ADR?
&lt;/h2&gt;

&lt;p&gt;An &lt;strong&gt;Architecture Decision Record&lt;/strong&gt; is a short text document describing a single architectural decision. That’s it. Each ADR should be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Immutably stored&lt;/strong&gt; – Once created, the document should not change. And should not be removed!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dated and versioned&lt;/strong&gt; – You need to know &lt;em&gt;when&lt;/em&gt; the decision was made.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Status-driven&lt;/strong&gt; – A decision can be &lt;code&gt;Proposed&lt;/code&gt;, &lt;code&gt;Accepted&lt;/code&gt;, &lt;code&gt;Deprecated&lt;/code&gt;, &lt;code&gt;Superseded&lt;/code&gt;, or &lt;code&gt;Obsolete&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tracked over time&lt;/strong&gt; – The collection of ADRs forms a historical timeline of the architecture.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Structure of an ADR
&lt;/h2&gt;

&lt;p&gt;A typical ADR document includes the following sections:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Title&lt;/strong&gt; – Short and descriptive (e.g. “Use PostgreSQL as main data store”)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Status&lt;/strong&gt; – Current state of the decision (&lt;code&gt;Accepted&lt;/code&gt;, &lt;code&gt;Rejected&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context&lt;/strong&gt; – &lt;em&gt;The background and forces at play when the decision was made.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decision&lt;/strong&gt; – What was decided, clearly stated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consequences&lt;/strong&gt; – What happens as a result of this decision.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're wondering where the "why" is captured — it's mainly in the &lt;strong&gt;Context&lt;/strong&gt; section. This is where you describe the situation, constraints, trade-offs, or previous options that led to this particular choice. Without it, the decision is just a fact. With it, it becomes a rationale.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Not Just Use Jira Tickets or Docs?
&lt;/h2&gt;

&lt;p&gt;Because those are too broad or ephemeral. ADRs are focused, atomic, and always close to the codebase. They’re typically stored in the repository itself, usually in a folder like &lt;code&gt;/docs/adr/&lt;/code&gt;, making them accessible to everyone in the team — including reviewers, future contributors, and stakeholders.&lt;/p&gt;

&lt;p&gt;They’re also &lt;strong&gt;just Markdown&lt;/strong&gt;. This simplicity ensures they’re easy to read, version, and integrate into your tooling.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sylius ADRs
&lt;/h2&gt;

&lt;p&gt;Looking for real-world examples? Sylius, an open-source e-commerce platform, uses ADRs to capture and document its architectural decisions. These records are publicly available in their GitHub repository and provide a great reference for how ADRs can be structured and written in practice.&lt;/p&gt;

&lt;p&gt;👉 Check out the full list here: &lt;a href="https://github.com/Sylius/Sylius/tree/2.1/adr" rel="noopener noreferrer"&gt;https://github.com/Sylius/Sylius/tree/2.1/adr&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  GitHub ❤️ ADRs
&lt;/h2&gt;

&lt;p&gt;Did you know that GitHub officially encourages the use of ADRs?&lt;br&gt;&lt;br&gt;
Check out &lt;a href="https://adr.github.io/" rel="noopener noreferrer"&gt;GitHub’s own ADR guide&lt;/a&gt; which provides templates and best practices for writing and managing ADR documents. This standardization is helping teams across the world stay aligned on their architectural decisions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Make ADRs Work For You: Pistacy.io
&lt;/h2&gt;

&lt;p&gt;If you're looking for a more structured and collaborative approach to managing your ADRs, &lt;a href="https://pistacy.io" rel="noopener noreferrer"&gt;Pistacy.io&lt;/a&gt; has you covered.&lt;/p&gt;

&lt;p&gt;Pistacy is a free &lt;strong&gt;Software Architecture Platform&lt;/strong&gt; for developers and architects, focused on organizing and maintaining software architecture documentation in one place. The platform includes a dedicated &lt;strong&gt;ADR management module&lt;/strong&gt; that supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Creating and editing ADR documents
&lt;/li&gt;
&lt;li&gt;🔄 Managing document lifecycle using &lt;strong&gt;state machines&lt;/strong&gt; (e.g. from &lt;code&gt;Proposed&lt;/code&gt; → &lt;code&gt;Accepted&lt;/code&gt; → &lt;code&gt;Obsolete&lt;/code&gt;)
&lt;/li&gt;
&lt;li&gt;🔁 Replacing, archiving, or marking ADRs as obsolete
&lt;/li&gt;
&lt;li&gt;🔄 Converting accepted RFCs into ADRs
&lt;/li&gt;
&lt;li&gt;📥 Importing Markdown ADRs directly from your repository using the Pistacy API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes ADRs not just useful, but manageable at scale.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Don’t let important decisions fade into git history. Start writing ADRs — and if you want to level up your documentation game, give Pistacy.io a try.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>architecture</category>
      <category>adr</category>
      <category>documentation</category>
      <category>pistacyio</category>
    </item>
    <item>
      <title>5 tips: How to find time to improve dev skills?</title>
      <dc:creator>Adam Banaszkiewicz</dc:creator>
      <pubDate>Wed, 12 Jul 2023 06:23:44 +0000</pubDate>
      <link>https://dev.to/adam-banaszkiewicz/5-tips-how-to-find-time-to-improve-dev-skills-i77</link>
      <guid>https://dev.to/adam-banaszkiewicz/5-tips-how-to-find-time-to-improve-dev-skills-i77</guid>
      <description>&lt;p&gt;Developer's life is difficult. Neverending need of improving skills and learning new things can be painful, especially when You have familly, school, or other time consuming private things.&lt;/p&gt;

&lt;p&gt;This small tips are proposals of how to find time in life, which is full of private time consuming things.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Buy Yourself a book
&lt;/h2&gt;

&lt;p&gt;First step, something that is required to begin. What do You want to know, to learn? Find a book of that topic and buy it. Remember, this book will be Your trigger to do something. Place this book in some visible place. For example I placed book next to my monitor. This reminds me that I need to use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Read a book when "sitting over the water"
&lt;/h2&gt;

&lt;p&gt;This is not a Joke - but looks like :) Man has some behavior, that forces us to read something while sitting on the toilet seat :D Why not use that 10 minutes to read few pages of book? The book that lies next to monitor ;)&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Watch 10-15 minutes tutorials/vlogs/dev videos awaiting for wife/kids before bed
&lt;/h2&gt;

&lt;p&gt;This tip is little dificult when You have more than one kid. When You kid or wife is taking a bath, You have 15 minutes to take some action. Why not watch some short videos on Youtube? There are plenty channels with short videos, just take it!&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Watch 5-10 minutes tutorials/vlogs/dev videos at breakfast
&lt;/h2&gt;

&lt;p&gt;That's my favourite! My wife goes to work when I eat breakfast. I have 10 minutes, which I can use to watch tutorials lesson or some vlog.&lt;/p&gt;

&lt;h1&gt;
  
  
  5. Make use of break at work
&lt;/h1&gt;

&lt;p&gt;Nowadays, working remotely we don't have stimulants outside, so we can focus on ourselves in home and use break at work to whatever we want to. While eating dinner, You can also listen some audiobook.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;As You probably notice, the point is to &lt;strong&gt;find small periods of time in Your routine, and place there some additional activity&lt;/strong&gt;. I've started reading a book when "sitting over the water" and in that way I've readed 3 books over past year.&lt;/p&gt;

&lt;p&gt;Most important thing is to start, and do the baby steps. Remember, take one day at a time. If this small activities begin Your new routine, after one Year you'll notice that You have learned new technology and You have read couple times more books then in last year.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>It is possible to create CMS using DDD?</title>
      <dc:creator>Adam Banaszkiewicz</dc:creator>
      <pubDate>Tue, 20 Jun 2023 06:44:08 +0000</pubDate>
      <link>https://dev.to/adam-banaszkiewicz/it-is-possible-to-create-cms-using-ddd-d3</link>
      <guid>https://dev.to/adam-banaszkiewicz/it-is-possible-to-create-cms-using-ddd-d3</guid>
      <description>&lt;p&gt;CMS on it's basis is a software that resolve one generic problem - managing content on website. Joomla, WordPress and other popular systems are simple and generic, there is no domain there - just creating posts, showing them at partcular URL... But, are You sure?&lt;/p&gt;

&lt;p&gt;When I started writing own CMS, I decided to try to do this using Domain Driven Design. At the beginning it was really painful, because of the mindset that was set by popular systems. Now, after research, hours of modelling and prototyping, I changed my mindset. Let me show You how I've done that.&lt;/p&gt;

&lt;p&gt;From this article You will find out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where is Domain in CMS?&lt;/li&gt;
&lt;li&gt;How to change thinking to find Domain in CMS?&lt;/li&gt;
&lt;li&gt;How to crystalize behaviors from CMS?&lt;/li&gt;
&lt;li&gt;Does every CMS needs a DDD?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;This article assumes You have basic knowledge of DDD and software architecture. Some parts of the research and analysis of Domain will be ommited here, to allows author create short but contentfull article.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where is the Domain in CMS?
&lt;/h2&gt;

&lt;p&gt;The basic functionality of CMS is to create some content and show it in browser. To create content You need some form and controller that handles that request, and saves data in database. CRUD right? But, there is a catch - what If You could describe "how system behaves" instead of how it's build or where it stores data? System creates content, publish this content upon URL, assigns content to category etc. So, what not just think of how system behaves instead of where to save the data?&lt;/p&gt;

&lt;p&gt;Every software system is built to provide some solution to business problem. CMS is same thing - here the business problem is to allow users to add and modyfy content of the website. Just like in shop, You can "add product to cart" or "increase quantity of product in cart". In CMS You can "create new post" and "publish it".&lt;/p&gt;

&lt;p&gt;Every behavior of the system is already a part of Your Domain. The point is, You have to think of any system in categories of behaviors, not technical things. From those behaviors You can find out the Bounded Contexts, new Aggregates came up as new flowers on spring :)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Yes, You are right, not everywhere :) Part of Our job as an architects is to decide where, in system, will be better to use DDD, and where simple CRUD. When You have 'save node', 'update node' "behaviors" - You don't need DDD :)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The better way to find the "domain" is a Event Storming - it is a powerfull modelling method. But it works only when You can do the session with at least Your one coleague - doing sessions alone is a terrible idea :D&lt;/p&gt;

&lt;h2&gt;
  
  
  DDD in CMS in real project
&lt;/h2&gt;

&lt;p&gt;To show You real project, I need to describe You the business logic that stands upon that project. I'll show You my way of doing this in the Tulia CMS.&lt;/p&gt;

&lt;h3&gt;
  
  
  Domain logic of Tulia CMS
&lt;/h3&gt;

&lt;p&gt;The content elements are called Nodes. Those Nodes can be translatable to foreign languages, can has attribites that store simple details of the Node (for example: image, some links, content of the node etc.). Nodes can be assigned and unassigned to categories. Nodes has titles and slugs, that are generated from the titles. Nodes also have purposes that describes what for this node was created, and one Node can have imposed multiple purposes. Ok, let's move on.&lt;/p&gt;

&lt;p&gt;From the description above You can pick behaviors that describe the system. We have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;create node&lt;/li&gt;
&lt;li&gt;add/update/remove attribute&lt;/li&gt;
&lt;li&gt;assign/unassign category&lt;/li&gt;
&lt;li&gt;change title&lt;/li&gt;
&lt;li&gt;impose/discontinue purpose&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Aggregate
&lt;/h3&gt;

&lt;p&gt;We have behaviors, so we can create aggregate! For this article I select only the Node behaviors, so is simpler to find the Aggregate, but always be aware of the "Aggregate rules" when You create it!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;final class Node {
    public static function create(
        string $id,
        string $title,
        array $locales,
    ): self;

    public function changeTitle(
        string $title,
        ?string $alias = null,
    ): void;

    public function addAttribute(
        string $code,
        mixed $value,
    ): void;

    public function publish(
        ImmutableDateTime $publishedAt,
        ?ImmutableDateTime $publishedTo = null,
    ): void;

    /** Replace all purposes with new ones **/
    public function persistPurposes(
        string ...$purposes,
    ): void;

    public function assignToMainCategory(
        string $category,
    ): void;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Above code is a simplified version of real life Aggregate, that You can see here: &lt;a href="https://github.com/tuliacms/cms/blob/master/src/Cms/Node/Domain/WriteModel/Model/Node.php" rel="noopener noreferrer"&gt;https://github.com/tuliacms/cms/blob/master/src/Cms/Node/Domain/WriteModel/Model/Node.php&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The Node has title, attributes, category and purposes. As You might notice, there is no "content" - because content in Tulia CMS is a one of the Attributes. Static factory method is used to create objects in Tulia CMS, and &lt;em&gt;$locales&lt;/em&gt; store all available locales in system (remember? Node is translatable).&lt;/p&gt;

&lt;p&gt;The most important lesson here, there are no "technical things" here, such save/update, setters etc. - only behaviors. This is how system behaves, this is how system allows users to do anything with it. It helps You to find the Domain in any business problem, even so generic as CMS. You just have to stop thinking about things as technical system and force Yourself to think about the systems behaviors.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does every CMS has a Domain?
&lt;/h2&gt;

&lt;p&gt;Yes. Every system, because business has own Domain, is specialized in something. Not even CMS but every system, has some domain. Every system that solves any business problem has a domain, but question is... Does every CMS needs a DDD?&lt;/p&gt;

&lt;h2&gt;
  
  
  Does every CMS needs a DDD?
&lt;/h2&gt;

&lt;p&gt;No, not every. If You build system that is simple, have only CRUD-like operations, or is way too generic (like reusable component for example), You do not need a DDD here. DDD affects of how much the code You need to write, and it's not worth it.&lt;/p&gt;

&lt;p&gt;But, if Your system has specific behaviors, like in Tulia CMS, if exposes places where developers can extend this behavior - this is a good way to think about DDD here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Every business-specific problem can be modelled with DDD, only if is not a CRUD :) Developing Tulia CMS was a really different approach to modelling system with DDD, because it wasn't obvious at first look where the domain in CMS is. When I changed my thinking to behaviour of system, everything changed.&lt;/p&gt;

&lt;p&gt;If You are interested in how the whole domain od Tulia CMS is made, feel free to go here: &lt;a href="https://github.com/tuliacms/cms/tree/master/src/Cms/Node" rel="noopener noreferrer"&gt;https://github.com/tuliacms/cms/tree/master/src/Cms/Node&lt;/a&gt;. You can find whole Domain Model, with Aggregates, relationships between Entities, separation to Read Model and Write Model, and much more.&lt;/p&gt;

</description>
      <category>ddd</category>
      <category>cms</category>
      <category>php</category>
    </item>
  </channel>
</rss>
