<?xml version="1.0" encoding="UTF-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title>Chemaclass - architecture</title><subtitle>Tech Lead sharing practical insights on software craftsmanship, TDD, leadership, Bitcoin, and AI. Blog posts, book summaries, and conference talks.</subtitle><link rel="self" type="application/atom+xml" href="https://chemaclass.com/tags/architecture/atom.xml"/><link rel="alternate" type="text/html" href="https://chemaclass.com"/><generator uri="https://www.getzola.org/">Zola</generator><updated>2023-04-14T00:00:00+00:00</updated><id>https://chemaclass.com/tags/architecture/atom.xml</id><entry xml:lang="en"><title>Introducing a New Tech Stack</title><subtitle>How to introduce new technologies in your team</subtitle><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="architecture" scheme="https://chemaclass.com/tags/architecture/" label="Architecture"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><published>2023-04-14T00:00:00+00:00</published><updated>2023-04-14T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/introducing-a-new-tech-stack/"/><id>https://chemaclass.com/blog/introducing-a-new-tech-stack/</id><summary type="html">To introduce a new tech stack for the entire team, it's important to bring "why?" and a strategy to make it happen among the team because it will affect everyone.</summary><content type="html">&lt;p>To introduce a new tech stack for the entire team, it’s important to bring “why?” and a strategy to make it happen among the team because it will affect everyone.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="why-that-new-tech-stack">Why that new tech stack?
&lt;a class="heading-anchor" href="#why-that-new-tech-stack" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>To decide whether to use a new tech stack or not, remember that it is a team decision, according to the standardization and maintainability of the project when introducing such a new tech stack. But, most importantly, what problem do you want to solve by introducing it? Is it because it is “cool”? Or is there an actual “necessity” that this tech helps you with?&lt;/p>
&lt;h3 id="the-direction-of-the-technology">The direction of the technology
&lt;a class="heading-anchor" href="#the-direction-of-the-technology" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>When proposing adopting a new library, framework, or entire new technology, an important aspect to consider is to be aware of its background and the direction where they are moving forward.&lt;/p>
&lt;p>What is the motivation for that tech, and why are you considering introducing it in your current stack?&lt;/p>
&lt;h3 id="coupling-and-dependencies">Coupling and dependencies
&lt;a class="heading-anchor" href="#coupling-and-dependencies" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>When adopting new technologies in our daily business, it’s not rare that we tend to couple ourselves with them. This makes it harder later to roll back if, after a while, we regret that decision.&lt;/p>
&lt;p>Don’t get me wrong, learning and experimenting with new technologies is great, but introducing it in your daily work is another story because it will affect the whole team. So we need to be more careful with this.&lt;/p>
&lt;p>&lt;img src="/images/blog/2023-04-14/middle.webp" alt="blog-middle" />&lt;/p>
&lt;h2 id="the-focus-of-the-conversation">The focus of the conversation
&lt;a class="heading-anchor" href="#the-focus-of-the-conversation" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>What does this new tech contribute to the project?&lt;/li>
&lt;li>What problem do we want to solve by introducing it?&lt;/li>
&lt;li>Can we solve that problem with our current tech?&lt;/li>
&lt;li>If we already have a similar tech, do we want to have a mix of both?&lt;/li>
&lt;li>What are the tradeoffs when using it vs. not using it?&lt;/li>
&lt;li>Is it worth the incremental complexity over time?&lt;/li>
&lt;li>What is the team strategy to onboard everyone if we aim to use it?&lt;/li>
&lt;/ul>
&lt;h3 id="architectural-decision-records-adrs">Architectural Decision Records (ADRs)
&lt;a class="heading-anchor" href="#architectural-decision-records-adrs" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Whatever the outcome, you should write it down as an &lt;a rel="external" href="https://adr.github.io/">ADR&lt;/a> to revisit it as time passes. An ADR will record your team’s decisions regarding the pros and cons, among any other arguments you have found together, to decide what to do and why.&lt;/p>
&lt;p>ADRs are useful to understand old decisions and keep them in the version control, in the same project if possible. They are helpful for the current team, but also for new joiners.&lt;/p>
&lt;p>&lt;img src="/images/blog/2023-04-14/footer.webp" alt="blog-footer" />&lt;/p>
&lt;aside class="kudos">
&lt;span class="kudos__icon" aria-hidden="true">🧠&lt;/span>
&lt;div class="kudos__content">
&lt;p>Thanks to my friends &lt;a rel="external" href="https://x.com/evrtrabajo">Manu&lt;/a>, &lt;a rel="external" href="https://x.com/Tito_Kati">Antonio&lt;/a>, and &lt;a rel="external" href="https://x.com/JesusValera96">Jesus&lt;/a>, who helped me come up with this summary of ideas after brainstorming together.&lt;/p>
&lt;/div>
&lt;/aside></content></entry><entry xml:lang="en"><title>Recipes for Decoupling</title><category term="php" scheme="https://chemaclass.com/tags/php/" label="Php"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="architecture" scheme="https://chemaclass.com/tags/architecture/" label="Architecture"/><category term="clean-code" scheme="https://chemaclass.com/tags/clean-code/" label="Clean Code"/><published>2022-11-28T00:00:00+00:00</published><updated>2022-11-28T00:00:00+00:00</updated><author><name>
Matthias Noback</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/recipes-for-decoupling/"/><id>https://chemaclass.com/readings/recipes-for-decoupling/</id><summary type="html">What is coupling, and why is it bad? What is decoupling, and how to do it efficiently? This book is a compilation of strategies to decouple your domain code from those infrastructure details, so you can enjoy a healthier system in the long run.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>What is coupling, and why is it bad? What is decoupling, and how to do it efficiently? This book is a compilation of
strategies to decouple your domain code from those infrastructure details, so you can enjoy a healthier system in the
long run.&lt;/p>
&lt;p>This book will teach you how to create &lt;a rel="external" href="https://phpstan.org/">&lt;strong>PHPStan&lt;/strong>&lt;/a> rules from no knowledge, and then it will
guide you across many decoupling opportunities like, for example:&lt;/p>
&lt;ul>
&lt;li>web framework&lt;/li>
&lt;li>cli frameworks&lt;/li>
&lt;li>form validation&lt;/li>
&lt;li>orm and database&lt;/li>
&lt;li>test framework&lt;/li>
&lt;/ul>
&lt;p>Read more about the book: &lt;a rel="external" href="https://matthiasnoback.nl/book/recipes-for-decoupling/">matthiasnoback.nl/book/recipes-for-decoupling/&lt;/a>&lt;/p>
&lt;blockquote>
&lt;p>Buy it here: &lt;a rel="external" href="https://leanpub.com/recipes-for-decoupling">leanpub.com/recipes-for-decoupling&lt;/a>&lt;/p>
&lt;/blockquote></content></entry><entry xml:lang="en"><title>Modern Software Engineering</title><subtitle>Doing What Works to Build Better Software Faster</subtitle><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="testing" scheme="https://chemaclass.com/tags/testing/" label="Testing"/><category term="architecture" scheme="https://chemaclass.com/tags/architecture/" label="Architecture"/><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><published>2022-06-29T00:00:00+00:00</published><updated>2022-06-29T00:00:00+00:00</updated><author><name>
David Farley</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/modern-software-engineering/"/><id>https://chemaclass.com/readings/modern-software-engineering/</id><summary type="html">This book presents software development as an engineering practice at every level. To master software engineering, we must become experts at learning and managing complexity.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>This book presents software development as an engineering practice at every level.
To master software engineering, we must become experts at learning and managing complexity.&lt;/p>
&lt;h3 id="optimize-for-learning">Optimize for learning
&lt;a class="heading-anchor" href="#optimize-for-learning" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>To optimize for learning, the book presents five behaviors to consider:&lt;/p>
&lt;ul>
&lt;li>Working iteratively&lt;/li>
&lt;li>Feedback&lt;/li>
&lt;li>Incrementalism&lt;/li>
&lt;li>Empiricism&lt;/li>
&lt;li>Being Experimental&lt;/li>
&lt;/ul>
&lt;p>The main idea is to work on small steps, collect feedback, and adjust.&lt;/p>
&lt;h3 id="optimize-for-managing-complexity">Optimize for managing complexity
&lt;a class="heading-anchor" href="#optimize-for-managing-complexity" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>The book presents other five ideas to manage complexity:&lt;/p>
&lt;ul>
&lt;li>Modularity&lt;/li>
&lt;li>Cohesion&lt;/li>
&lt;li>Separation of Concerns&lt;/li>
&lt;li>Information Hiding and Abstraction&lt;/li>
&lt;li>Managing Coupling&lt;/li>
&lt;/ul>
&lt;p>We need to manage the complexity of our systems.&lt;/p>
&lt;h3 id="tools-to-support-engineering-in-software">Tools to support engineering in software
&lt;a class="heading-anchor" href="#tools-to-support-engineering-in-software" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Going deeper into some ideas that were already discussed in the book, like:&lt;/p>
&lt;ul>
&lt;li>Testability&lt;/li>
&lt;li>Deployability&lt;/li>
&lt;li>Controlling the variables&lt;/li>
&lt;li>Continuous Delivery&lt;/li>
&lt;/ul>
&lt;hr />
&lt;p>A great video explaining the core ideas behind this book by his author:&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/TRqYQnCfgH8"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Team Topologies</title><subtitle>Organizing Business and Technology Teams for Fast Flow</subtitle><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="architecture" scheme="https://chemaclass.com/tags/architecture/" label="Architecture"/><category term="devops" scheme="https://chemaclass.com/tags/devops/" label="Devops"/><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><published>2022-03-31T00:00:00+00:00</published><updated>2022-03-31T00:00:00+00:00</updated><author><name>
Matthew Skelton</name></author><author><name>
Manuel Pais</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/team-topologies/"/><id>https://chemaclass.com/readings/team-topologies/</id><summary type="html">Team Topologies focuses on how to set up dynamic team structures and interaction modes that can help teams adapt quickly to new conditions, and achieve fast and safe software delivery.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>Team Topologies focuses on how to set up dynamic team structures and interaction modes that can help teams adapt quickly to new conditions, and achieve fast and safe software delivery.&lt;/p>
&lt;h2 id="team-structure">Team structure
&lt;a class="heading-anchor" href="#team-structure" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>High cohesion: Group related things together.&lt;/li>
&lt;li>Loose coupling: There must be clear boundaries between the teams.&lt;/li>
&lt;li>Cognitive load: It’s like the RAM of the team. The team can burn down if you load with more than the team can handle.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>In order to avoid bottleneck teams, you need to make sure their cognitive load is not very high.&lt;/p>
&lt;/blockquote>
&lt;h2 id="conway-s-law">Conway’s Law
&lt;a class="heading-anchor" href="#conway-s-law" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>The organization structure will influence the architecture of the team.&lt;/li>
&lt;li>Conway’s Law says that organizations will design systems that copy their communication structure.&lt;/li>
&lt;li>In other words, there will be no focus on the optimal architecture for the project.&lt;/li>
&lt;li>First you need to define the architecture of the project, and then form the teams.&lt;/li>
&lt;/ul>
&lt;h2 id="team-first-thinking">Team-First Thinking
&lt;a class="heading-anchor" href="#team-first-thinking" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>Who is in the team matters less than the team dynamics.&lt;/li>
&lt;li>When measuring performance, teams matter more than individuals.&lt;/li>
&lt;li>Team = group of 5-9 who work towards a shared goals as a unit.
&lt;ul>
&lt;li>Check &lt;a href="/blog/dunbar-number/">Dunbar number&lt;/a>.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Forming a team takes from 2 weeks to 3 months.&lt;/li>
&lt;li>Cognitive load is the total amount of mental effort being used in the working memory.&lt;/li>
&lt;li>3 Types of cognitive load:
&lt;ul>
&lt;li>Intrinsic: Fundamentals of the problem space. Example: programming language.&lt;/li>
&lt;li>Extraneous: Environment related. Example: how to deploy.&lt;/li>
&lt;li>Germane: Special attention is required. Example: business domain.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Heuristics:
&lt;ul>
&lt;li>3 types of domain: Simple, complicated, complex.&lt;/li>
&lt;li>If the domain is too big, split it into subdomains.&lt;/li>
&lt;li>One team, either:
&lt;ul>
&lt;li>2-3 simple domains.&lt;/li>
&lt;li>1 complex domain.&lt;/li>
&lt;li>Avoid 2 complicated domains, better split the team.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Define a Team API:
&lt;ul>
&lt;li>Code: endpoints, libraries, clients, …&lt;/li>
&lt;li>Versioning.&lt;/li>
&lt;li>Documentation.&lt;/li>
&lt;li>Practices and principles.&lt;/li>
&lt;li>Communication tools.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="team-topologies">Team Topologies
&lt;a class="heading-anchor" href="#team-topologies" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;blockquote>
&lt;p>Instead of structuring teams according to know-how or activities, organize teams according to business domain areas.&lt;/p>
&lt;/blockquote>
&lt;ul>
&lt;li>Success of topology depends both on team members and surrounding environment, teams and interactions.&lt;/li>
&lt;li>Split responsibilities to breakdown silos.&lt;/li>
&lt;li>Types of dependencies: Knowledge, task, and resource.&lt;/li>
&lt;li>Four types of teams:
&lt;ul>
&lt;li>Stream-aligned: deliver features, projects, products to the market asap.&lt;/li>
&lt;li>Enabling: grow the capabilities for the Stream-aligned team(s).&lt;/li>
&lt;li>Complicated-subsystem: reduce the cognitive load of the Stream-aligned team(s).&lt;/li>
&lt;li>Platform: make the Stream-aligned team(s) autonomous.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="team-interactions">Team Interactions
&lt;a class="heading-anchor" href="#team-interactions" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>Collaboration. Work closely between teams with different skill sets.&lt;/li>
&lt;li>X-as-a-Service. Clear ownership, small cognitive load.&lt;/li>
&lt;li>Facilitation. Helping to clear impediments, focus on quality interactions between other teams.&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>Principles of package design</title><subtitle>Creating Reusable Software Components</subtitle><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="architecture" scheme="https://chemaclass.com/tags/architecture/" label="Architecture"/><category term="clean-code" scheme="https://chemaclass.com/tags/clean-code/" label="Clean Code"/><published>2020-11-12T00:00:00+00:00</published><updated>2020-11-12T00:00:00+00:00</updated><author><name>
Matthias Noback</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/packaging-design/"/><id>https://chemaclass.com/readings/packaging-design/</id><summary type="html">Apply design principles to your classes, preparing them for reuse. You will use package design principles to create packages that are just right in terms of cohesion and coupling, and are user- and maintainer-friendly at the same time.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>Apply design principles to your classes, preparing them for reuse. You will use package design principles to create
packages that are just right in terms of cohesion and coupling, and are user- and maintainer-friendly at the same time.&lt;/p>
&lt;p>The first part of this book walks you through the five SOLID principles that will help you improve the design of your
classes. The second part introduces you to the best practices of package design, and covers both package cohesion
principles and package coupling principles. Cohesion principles show you which classes should be put together in a
package, when to split packages, and if a combination of classes may be considered a “package” in the first place.
Package coupling principles help you choose the right dependencies and prevent wrong directions in the dependency graph
of your packages.&lt;/p>
&lt;h3 id="what-you-ll-learn">What You’ll Learn
&lt;a class="heading-anchor" href="#what-you-ll-learn" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>Apply the SOLID principles of class design&lt;/li>
&lt;li>Determine if classes belong in the same package&lt;/li>
&lt;li>Know whether it is safe for packages to depend on each other&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>Domain-Driven Design Distilled</title><category term="ddd" scheme="https://chemaclass.com/tags/ddd/" label="Ddd"/><category term="architecture" scheme="https://chemaclass.com/tags/architecture/" label="Architecture"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><published>2020-09-10T00:00:00+00:00</published><updated>2020-09-10T00:00:00+00:00</updated><author><name>
Vaughn Vernon</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/domain-driven-design-distilled/"/><id>https://chemaclass.com/readings/domain-driven-design-distilled/</id><summary type="html">Domain-Driven Design Distilled brings DDD to life. Whether you're a developer, consultant, or customer, it will help you understand it, so you can benefit from its power.</summary><content type="html">&lt;p>Domain-Driven Design Distilled brings DDD to life. Whether you’re a developer, consultant, or customer, it will help
you understand it, so you can benefit from its power.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;hr />
&lt;p>This book delivers powerful results in practice, which is why developers worldwide are rapidly moving to adopt it.
This is an accessible guide to the basics:&lt;/p>
&lt;ul>
&lt;li>What is DDD?&lt;/li>
&lt;li>What problems does it solve?&lt;/li>
&lt;li>How does it work?&lt;/li>
&lt;li>How to quickly gain value from it?&lt;/li>
&lt;/ul>
&lt;p>You’ll learn how to segregate domain models using the powerful &lt;strong>Bounded Contexts&lt;/strong> pattern, to develop a &lt;strong>Ubiquitous
Language&lt;/strong> within an explicitly bounded context and help &lt;strong>domain experts&lt;/strong> and &lt;strong>developers work together&lt;/strong> to create
that language.&lt;/p>
&lt;p>How to use Subdomains to handle legacy systems and integrate multiple Bounded Contexts to define team relationships and
technical mechanisms.&lt;/p>
&lt;blockquote>
&lt;p>Domain-Driven Design Distilled brings &lt;strong>DDD&lt;/strong> to life.&lt;/p>
&lt;/blockquote></content></entry><entry xml:lang="en"><title>Advanced Web Application Architecture</title><subtitle>The best guide that brings your coding skills a level up.</subtitle><category term="architecture" scheme="https://chemaclass.com/tags/architecture/" label="Architecture"/><category term="php" scheme="https://chemaclass.com/tags/php/" label="Php"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="refactoring" scheme="https://chemaclass.com/tags/refactoring/" label="Refactoring"/><published>2020-08-16T00:00:00+00:00</published><updated>2020-08-16T00:00:00+00:00</updated><author><name>
Matthias Noback</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/advance-web-application-architecture/"/><id>https://chemaclass.com/readings/advance-web-application-architecture/</id><summary type="html">The best guide that brings your coding and architecture skills a level up. All the modern PHP features combined with the elegance of a well designed modular design.</summary><content type="html">&lt;p>This book helps you get your web applications back in shape. It contains many techniques for decoupling from
infrastructure (like the framework or the database).&lt;/p>
&lt;p>“The best guide that brings your coding and architecture skills a level up. All the modern PHP features combined with the elegance of a well-designed modular design.”&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>In Part 1 we unlock a collection of design patterns which help you establish a clean separation between core and
infrastructure code. Part 2 shows how these design patterns resonate at a higher level with architectural concepts like
layers, ports and adapters (a.k.a. Hexagonal architecture). The book finishes with a discussion of testing strategies and design trade-offs.&lt;/p>
&lt;h3 id="what-you-ll-learn">What you’ll learn
&lt;a class="heading-anchor" href="#what-you-ll-learn" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>Separating mixed code into core and infrastructure code by refactoring into patterns.&lt;/li>
&lt;li>Dividing your code into layers, and making a clear distinction between an application’s ports and adapters.&lt;/li>
&lt;li>Testing decoupled applications.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Buy the book: &lt;a rel="external" href="https://leanpub.com/web-application-architecture">https://leanpub.com/web-application-architecture&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;hr />
&lt;h3 id="design-patterns-for-modernizing-legacy-code-bases">Design patterns for modernizing legacy code bases
&lt;a class="heading-anchor" href="#design-patterns-for-modernizing-legacy-code-bases" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/WI1QY6OMglE"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Symfony 5</title><subtitle>Symfony 5: The Fast Track</subtitle><category term="php" scheme="https://chemaclass.com/tags/php/" label="Php"/><category term="symfony" scheme="https://chemaclass.com/tags/symfony/" label="Symfony"/><category term="architecture" scheme="https://chemaclass.com/tags/architecture/" label="Architecture"/><published>2020-02-20T00:00:00+00:00</published><updated>2020-02-20T00:00:00+00:00</updated><author><name>
Fabien Potencier</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/symfony-5/"/><id>https://chemaclass.com/readings/symfony-5/</id><summary type="html">Fabien Potencier's official guide to building web applications with Symfony 5, covering the framework from scratch to production deployment.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>This book, written by Symfony’s creator, lays out a pragmatic approach to developing web applications with Symfony 5:
from scratch to production. Whether you are discovering Symfony for the first time or refreshing your knowledge, this
practical guide provides the definitive introduction to modern Symfony applications.&lt;/p></content></entry><entry xml:lang="en"><title>Clean Architecture</title><subtitle>A Craftsman's Guide to Software Structure and Design</subtitle><category term="architecture" scheme="https://chemaclass.com/tags/architecture/" label="Architecture"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="clean-code" scheme="https://chemaclass.com/tags/clean-code/" label="Clean Code"/><category term="ddd" scheme="https://chemaclass.com/tags/ddd/" label="Ddd"/><published>2018-06-04T00:00:00+00:00</published><updated>2018-06-04T00:00:00+00:00</updated><author><name>
Robert C. Martin</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/clean-architecture/"/><id>https://chemaclass.com/readings/clean-architecture/</id><summary type="html">Robert C. Martin's guide to SOLID principles, component design, and architectural boundaries that keep software systems flexible, testable, and maintainable over time.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>&lt;h3 id="code-design-principles-solid">Code design principles (SOLID)
&lt;a class="heading-anchor" href="#code-design-principles-solid" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Single Responsibility&lt;/strong>: a class should have one, and only one, reason to change. Or the new version: a module
should be responsible to one, and only one, actor.&lt;/li>
&lt;li>&lt;strong>Open-closed&lt;/strong>: a class should be open for extension but closed for modification.&lt;/li>
&lt;li>&lt;strong>Liskov’s Substitution&lt;/strong>: objects in a program should be replaceable with instances of their subtypes without
altering the correctness of that program.&lt;/li>
&lt;li>&lt;strong>Interface Segregation&lt;/strong>: many client-specific interfaces are better than one general-purpose interface.&lt;/li>
&lt;li>&lt;strong>Dependency Inversion&lt;/strong> : one should depend upon abstractions, not concretions.&lt;/li>
&lt;/ul>
&lt;h3 id="component-principles">Component principles
&lt;a class="heading-anchor" href="#component-principles" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;h4 id="component-cohesion">Component cohesion
&lt;a class="heading-anchor" href="#component-cohesion" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h4>
&lt;ul>
&lt;li>&lt;strong>Reuse/Release Equivalence&lt;/strong> Principle: classes and modules (i.e. a component) reused together should be released
together. They should have the same version number and there should be proper documentation such as changelogs.&lt;/li>
&lt;li>&lt;strong>Common Closure&lt;/strong> Principle: classes that change together should be grouped together, and vice versa. The single
responsibility principle at component-level.&lt;/li>
&lt;li>&lt;strong>Common Reuse&lt;/strong> Principle: don’t force users of a component to depend on things they don’t need. The Interface
Segregation Principle at component-level.&lt;/li>
&lt;/ul>
&lt;h4 id="component-coupling">Component coupling
&lt;a class="heading-anchor" href="#component-coupling" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h4>
&lt;ul>
&lt;li>&lt;strong>Acyclic Dependencies&lt;/strong> Principle: no cycle in the dependency graph. Cycles couple components and, among other
things, force them to be to released together. Use the dependency inversion principle to break cycles.&lt;/li>
&lt;li>&lt;strong>The Stable Dependency&lt;/strong> Principle: less stable components should depend on more stable components. Depend on the
direction of stability.&lt;/li>
&lt;li>&lt;strong>Stable Abstractions&lt;/strong> Principle: stable components should be abstract, and vice versa. An example of an abstract
stable component is a high-level policy which is changed by extension following the open-closed principle.&lt;/li>
&lt;/ul>
&lt;h3 id="architecture-principles">Architecture principles
&lt;a class="heading-anchor" href="#architecture-principles" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;h4 id="setting-boundaries">Setting boundaries
&lt;a class="heading-anchor" href="#setting-boundaries" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h4>
&lt;p>Boundaries are lines that separate software elements. They separate things that matter from things that don’t, i.e.
high-level components from low-level components. If a high-level component depends on a low-level component at the
source level, changes in the low-level components will spread to the high-level component. Therefore, we place a
boundary between the two, using polymorphism to invert the logic flow. This is the Dependency Inversion Principle in the
SOLID principles.&lt;/p>
&lt;h4 id="separating-layers">Separating layers
&lt;a class="heading-anchor" href="#separating-layers" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h4>
&lt;p>We can identify four main layers, although the number may vary:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Entities&lt;/strong>: objects containing critical business logic. For example, a bank could establish that no loans are
granted to customers not satisfying some credit score requirements. Entities may be shared across apps in the same
enterprise.&lt;/li>
&lt;li>&lt;strong>Use-cases&lt;/strong>: app-specific business rules. For example, the sequence of screens to execute a bank transfer.&lt;/li>
&lt;li>&lt;strong>Interface adapters&lt;/strong>: Gateways, presenters and controllers. For example, this layer will contain the MVC
architecture of the GUI and also objects that transform data between the format of the database and the use-cases.&lt;/li>
&lt;li>&lt;strong>Frameworks and drivers&lt;/strong>: web frameworks, database, the view of MVC.&lt;/li>
&lt;/ul></content></entry></feed>