Close Menu
    Trending
    • Data Science as Engineering: Foundations, Education, and Professional Identity
    • From Connections to Meaning: Why Heterogeneous Graph Transformers (HGT) Change Demand Forecasting
    • Layered Architecture for Building Readable, Robust, and Extensible Apps
    • In-House vs Outsourced Data Labeling: Pros & Cons
    • Inside OpenAI’s big play for science 
    • Why chatbots are starting to check your age
    • How Cursor Actually Indexes Your Codebase
    • Ray: Distributed Computing For All, Part 2
    ProfitlyAI
    • Home
    • Latest News
    • AI Technology
    • Latest AI Innovations
    • AI Tools & Technologies
    • Artificial Intelligence
    ProfitlyAI
    Home » Layered Architecture for Building Readable, Robust, and Extensible Apps
    Artificial Intelligence

    Layered Architecture for Building Readable, Robust, and Extensible Apps

    ProfitlyAIBy ProfitlyAIJanuary 27, 2026No Comments11 Mins Read
    Share Facebook Twitter Pinterest LinkedIn Tumblr Reddit Telegram Email
    Share
    Facebook Twitter LinkedIn Pinterest Email


    : your code works however confidence is low, so that you hesitate to the touch it. Including a function means performing open-heart surgical procedure on the appliance, modifying current enterprise logic relatively than extending the system. Over time, the price of change retains rising.

    Does this really feel acquainted?

    • Modifications really feel dangerous since you concern modifying the code may set off unintended negative effects.
    • You spend a number of time scrolling by massive recordsdata, discovering or understanding code.
    • You could have features that “do all the things” and have 10+ parameters.
    • Assessments are skipped or require spinning up a database, manually making ready data and cleansing up afterwards.
    • FastAPI routes that assemble SQL queries.

    The appliance should be delivering worth, but it surely feels brittle. Construction is unclear, obligations are blurred, and small modifications really feel disproportionately costly.

    If this resonates, this publish is for you.


    TL;DR

    • If including options feels dangerous or sluggish, the issue is usually construction, not code high quality
    • Layered structure separates obligations and retains enterprise logic impartial of frameworks and infrastructure
    • Vertical slicing by area prevents layers from turning into dumping grounds as programs develop
    • Software layers orchestrate workflows; area layers outline that means and constraints
    • Clear boundaries cut back cognitive load, enhance testability, and make change cheaper over time

    Good construction doesn’t add ceremony. It preserves momentum.


    The purpose of this text

    Debating whether or not a bit of code belongs in a single layer or one other misses the purpose. The purpose isn’t excellent categorization however…

    to architect an utility with ideas of loosely coupled layers of duty that make the system simpler to perceive, take a look at and evolve.

    We intention for functions which can be:

    • Readable: straightforward to navigate and motive about, with low cognitive load
    • Strong: failures are contained, predictable, and comprehensible
    • Extensible: new performance is added by extension, not by rewriting current logic. Current elements are loosely coupled, modular and replaceable.

    To get there we’re going to construction the app into layers, every with a transparent duty. This separation and the best way layers relate to one another permits the system to evolve over time.


    Disclaimer:

    This isn’t one of the best or solely approach to construction an utility and it’s not a one-size-fits-all resolution.

    What follows is a method I arrived at by refining it over a number of years throughout completely different initiatives. I took inspiration from DDD, SOLID ideas, onion, hexagonal and layered structure however mixed all the things into one thing that works for the varieties of programs I usually construct.


    The Layers

    Within the picture beneath you’ll discover an summary of the layered structure:

    Layer relationships (picture by creator)

    Earlier than diving into the obligations of every layer, it helps to first perceive how they relate to one another.

    Layer Relationships (inward flowing dependencies)

    The outer layer could be cut up in two sides:

    • Enter aspect
      The interface layer, which receives information and acts because the entry level of the app
    • Output aspect:
      The repository and infrastructure layers, which can talk with exterior programs corresponding to API, database and message queues

    The interface layer calls the appliance layer, which is the core of the system, the place enterprise logic lives. The appliance layer, in flip, calls into the repository and infra layers to persist information or talk externally.

    Crucial take-away is that dependencies move inward.

    Enterprise logic doesn’t depend upon frameworks, database or transport mechanisms. By isolating enterprise logic, we acquire readability and make testing considerably simpler.


    Area layer

    The area layer primarily focuses on constraints, not orchestration or negative effects. It comprises definitions that ought to mirror enterprise that means and ought to be comprehensible by enterprise folks. Take into consideration dataclasses or Pydantic fashions.

    These fashions outline the form and constraints of the information flowing by the system. They need to be strict and fail early when assumptions are violated. Heavy validation ensures prime quality information within the core of our system.

    A helpful aspect impact is that area fashions turn out to be a shared language. Non-technical stakeholders could not learn the code line-by-line however they will typically perceive the construction and intent.


    Software layer

    That is the guts of the system.

    The app layer is accountable for orchestrating enterprise logic and workflows. It could get referred to as from the interface layer and coordinates area fashions, repositories and infrastructure companies to realize a particular enterprise final result. As well as it’s accountable for dealing with application-level failures whereas retaining area and infrastructure issues remoted.

    A very good rule of thumb: If you happen to can unit-test this layer with out spinning up a database or internet server, you’re heading in the right direction.


    Infrastructure layer

    This layer comprises something that helps the app however comprises no enterprise logic. Consider this layer as “instruments for the app layer”; it solely must know what to name, not how it’s carried out. For instance, it ought to have the ability to name send_email(...) with out understanding something about SMTP configuration.

    By decoupling these issues you localize complexity and make integrations simpler to exchange, improve or debug.

    Examples:

    • logging setup
    • hashing and crypto utilities
    • http shoppers
    • message queue shoppers
    • electronic mail senders

    Interface layer

    The interface layer is how the surface world talks to your system and may act as a gateway for proper information. Consider an API, CLI, queue shopper or one thing {that a} CRON job can name.

    I preserve these layers skinny and void of enterprise logic. I intention for just some obligations:

    1. Receiving enter
    2. Validating and normalizing (transport-level) enter (sorts, format e.g.)
    3. Calling the appliance layer
    4. Formatting the response

    Repository layer

    The repository layer defines persistence boundaries (e.g. communication with a database). The intention is to decouple your utility/enterprise logic from a specific database implementation. This consists of ORM fashions, database schemas, SQL queries, and persistence-related transformations.

    The appliance layer shouldn’t be accountable for:

    • Which database you utilize
    • How queries are written
    • Whether or not information comes from SQL, a cache or one other service

    The app layer ought to have the ability to simply name e.g. get_customer_id(customer_id) and obtain a website object in return. This separation actually pays of when that you must swap database, transfer persistence behind an API, add caching or need to take a look at with no actual database.

    a very large building that has been destroyed
    Is your utility prepared for change? (Photograph by Jade Koroliuk / Unsplash)

    The best way to begin layering?

    It’s fairly straightforward to get began. You don’t even need to refactor your complete app immediately. It may be so simple as simply 5 folders in your src folder on the root of your undertaking:

    - src/
      - utility/
        - core.py
      - area/
        - buyer.py
      - infrastructure/
        - weather_api_client.py
      - interface/
        - api/
          - (recordsdata that include FastAPI or Flask e.g.)
        - cli/
        - internet/
          - (recordsdata for a streamlit app e.g.
      - repository/
        - schemas.py
        - customer_repo.py

    Bear in mind: the purpose is not to pedantically categorize each bit of code in a file and name it a day; the separate recordsdata and folders ought to mirror the truth that your system is layered and decoupled.


    Bigger apps: Horizontal layering per area boundary

    The instance above reveals a reasonably small utility that’s layered horizontally solely. This works effectively at first, however bigger initiatives can rapidly collapse into “God-modules”.

    Engineers are good and can take shortcuts below time strain. To keep away from your layers turning into dumping grounds, it’s best to explicitly add vertical slicing by area.

    Horizontal layering improves construction; vertical slicing by area improves scalability.

    The principles will not be about restriction or purity however act as guard rails to protect architectural intent over time and preserve the system comprehensible because it grows.

    a pile of rocks sitting on top of a mountain
    A small utility with 3 layers (Photograph by Oghenevwede Okuma / Unsplash)

    Making use of horizontal and vertical layers

    In apply, this implies splitting your utility by area first, after which layering inside every area.

    The app within the instance beneath has two area: subscriptions and customers that are each sliced into layers.

    src/
      utility/                    <-- that is the composition root (wiring)
        important.py
        
      subscriptions/                  <-- this can be a area
        area/
          subscription.py
          cancellation_reason.py
        utility/
          cancel_subscription.py
        repository/
          subscription_repo.py
        infrastructure/
          subscription_api_client.py
        interface/
          api.py
    
      customers/                           <-- one other area
        area/
        utility/
        repository/
        interface/

    Within the construction above important.py is the composition root which imports and calls features from the appliance layer within the subscriptions and customers domains and connects them to infrastructure and interfaces. This dependency flows inward, retaining the domains themselves impartial.

    Core guidelines

    Layering and area boundaries give our app construction however with out some fundamental guidelines the structure collapses quietly. With out guidelines the codebase slowly drifts again to hidden coupling, round dependencies and area logic leaking throughout boundaries.

    To protect construction over time I exploit three guidelines. These guidelines are deliberately easy. Their worth comes from constant utility, not strict enforcement:

    Rule 1: Domains don’t import one another’s internals.
    If subscriptions imports customers.area.Person straight you’ll be able to not change customers with out affecting subscriptions. Since you lose clear possession, this makes testing this area in isolation quite a bit tougher.

    • Transfer really shared ideas right into a shared area or
    • cross information explicitly through interfaces or DTO’s (typically as IDs relatively than objects)

    Rule 2: Shared ideas go in a shared area
    This makes coupling specific and intentional to keep away from “shared” issues getting duplicated inconsistently or worse: one area silently turns into the “core” all the things will depend on.

    • preserve the area small and secure
    • it ought to change slowly
    • it ought to include abstractions and shared sorts, not workflows

    Rule 3: Dependencies move inward inside every slice
    This retains enterprise logic impartial of supply and infrastructure.

    You’ll discover when this rule is damaged when area or utility code begins relying on FastAPI or a database, take a look at will turn out to be sluggish and brittle and framework upgrades ripple by the codebase.

    Hold dependencies flowing inward to make sure that:

    • You’ll be able to swap interfaces and infrastructure
    • You’ll be able to take a look at core logic in isolation
    • Your small business logic survives change on the edges
    low angle photography of high rise building under white clouds during daytime
    Tall buildings required a well-considered structure (Photograph by Clay LeConey / Unsplash)

    Sensible instance: refactoring an actual endpoint

    For example the advantages, take into account an endpoint that cancels {a magazine} subscription and returns different ideas.

    The preliminary implementation put all the things in a single FastAPI endpoint:

    • Uncooked SQL
    • Direct calls to exterior APIs
    • Enterprise logic embedded within the HTTP handler

    The code labored, but it surely was tightly coupled and arduous to check. Any take a look at required an online server, an actual database, and in depth setup and cleanup.

    Refactored design

    We refactored the endpoint by separating obligations throughout layers.

    • Interface layer
      API route that validates enter, calls the appliance operate, maps exceptions to HTTP responses.
    • Software layer
      Orchestrates the cancellation workflow, coordinates repositories and exterior companies, and raises use-case degree errors.
    • Repository layer
      Centralizes database entry, easy features like get_user_email(user_id).
    • Infrastructure layer
      Comprises API shoppers for exterior SubscriptionAPI and SuggestionAPI, remoted from enterprise logic.
    • Area layer
      Defines core ideas corresponding to Person and Subscription utilizing strict fashions.

    End result

    The endpoint grew to become a skinny adapter as a substitute of a God-function. Enterprise logic can now be examined with out spinning up an API server or a database. Infrastructure is replaceable and the code-base is extra readable.

    Change is less expensive; new options are constructed by including new code as a substitute of rewriting current logic. New engineers ramp up quicker as a result of lowered cognitive load. This makes for a much more sturdy app that may safely evolve.


    Conclusion

    Layered design isn’t about including ceremony or chasing a textbook very best. It’s about guaranteeing your system stays comprehensible and adaptable because it grows.

    By separating obligations and retaining layers loosely coupled, we cut back the cognitive load of navigating the codebase. This makes failures simpler to isolate, and permits new performance to be added by extension relatively than by rewriting current logic.

    These advantages compound over time. Early on, this construction may really feel like double work or pointless overhead. However as complexity will increase the payoff turns into clear: modifications turn out to be safer, testing turns into cheaper and groups transfer quicker with higher confidence. The system stays secure whereas interfaces, infrastructure and necessities are capable of change round it.

    Finally, a well-layered utility makes change cheaper. And in the long term, that’s what retains software program helpful.


    I hope this text was as clear as I supposed it to be but when this isn’t the case please let me know what I can do to make clear additional. Within the meantime, try my other articles on all types of programming-related subjects.

    Joyful coding!

    — Mike

    P.s: like what I’m doing? Observe me!



    Source link

    Share. Facebook Twitter Pinterest LinkedIn Tumblr Email
    Previous ArticleIn-House vs Outsourced Data Labeling: Pros & Cons
    Next Article From Connections to Meaning: Why Heterogeneous Graph Transformers (HGT) Change Demand Forecasting
    ProfitlyAI
    • Website

    Related Posts

    Artificial Intelligence

    Data Science as Engineering: Foundations, Education, and Professional Identity

    January 27, 2026
    Artificial Intelligence

    From Connections to Meaning: Why Heterogeneous Graph Transformers (HGT) Change Demand Forecasting

    January 27, 2026
    Artificial Intelligence

    How Cursor Actually Indexes Your Codebase

    January 26, 2026
    Add A Comment
    Leave A Reply Cancel Reply

    Top Posts

    The Hidden Dangers of Open-Source Data: Rethinking Your AI Training Strategy

    June 10, 2025

    The Misconception of Retraining: Why Model Refresh Isn’t Always the Fix

    July 30, 2025

    How to Generate Synthetic Data: A Comprehensive Guide Using Bayesian Sampling and Univariate Distributions

    May 26, 2025

    RAG Explained: Understanding Embeddings, Similarity, and Retrieval

    September 17, 2025

    ElevenLabs nya AI-röstassistent kan automatisera dina favorituppgifter

    June 25, 2025
    Categories
    • AI Technology
    • AI Tools & Technologies
    • Artificial Intelligence
    • Latest AI Innovations
    • Latest News
    Most Popular

    Learnings from a Machine Learning Engineer — Part 6: The Human Side

    April 11, 2025

    Microsoft’s Quiet AI Layoffs, US Copyright Office’s Bombshell AI Guidance, 2025 State of Marketing AI Report, and OpenAI Codex

    May 20, 2025

    AI Agents: From Assistants for Efficiency to Leaders of Tomorrow?

    October 26, 2025
    Our Picks

    Data Science as Engineering: Foundations, Education, and Professional Identity

    January 27, 2026

    From Connections to Meaning: Why Heterogeneous Graph Transformers (HGT) Change Demand Forecasting

    January 27, 2026

    Layered Architecture for Building Readable, Robust, and Extensible Apps

    January 27, 2026
    Categories
    • AI Technology
    • AI Tools & Technologies
    • Artificial Intelligence
    • Latest AI Innovations
    • Latest News
    • Privacy Policy
    • Disclaimer
    • Terms and Conditions
    • About us
    • Contact us
    Copyright © 2025 ProfitlyAI All Rights Reserved.

    Type above and press Enter to search. Press Esc to cancel.