Back to skills

Way of working

Application architecture

I do not choose architecture by the name of a pattern, but by the complexity of the problem. The goal is clear boundaries, safe changes, and a solution proportionate to the application.

  • Clean Architecture
  • DDD
  • Hexagonal Architecture
  • Dependency Injection
  • SOLID

Structure should make change easier, not more complex.

In larger applications developed over the long term, I separate UI, Application, Domain, and Infrastructure. Domain rules are then not attached to a framework, database, or a particular API, and each part has clearer responsibility.

That does not mean every part of an application needs full Clean or hexagonal architecture. For a simple problem with a few inputs and no complex rules, a direct service-based solution is often clearer and less costly to maintain.

How my approach evolved

From Controller → Facade → Service to proportionate boundaries.

  1. Earlier

    Controller → Facade → Service

    This style gave my earlier projects a clear structure. Over time, with more complex flows and more integrations, I found that responsibilities and dependencies needed stronger boundaries.
  2. More complex system parts

    Separating business rules from technology

    When an application has more use cases, integrations, or rules, I separate domain and application logic from HTTP, the database, and the framework. It then becomes easier to test, change, and extend.
  3. Today

    Clean and hexagonal principles when needed

    I use principles of Clean Architecture, DDD, dependency injection, and ports with adapters. I am not aiming for a label or a number of layers, but for clear responsibility and controlled dependencies.
  4. A pragmatic choice

    When a simpler solution is better

    A small module without complex rules does not need a separate domain model, ports, or several adapters. In that case, I choose a direct structure and add complexity only when it solves a real problem.

Boundaries and dependencies

Business rules inward, technical details outward.

Layers are not an end in themselves. They show how dependencies may flow: UI calls an application use case, the use case uses the domain, and technical details implement the interfaces the application needs.

I adjust the approach according to the risk of change, application lifetime, number of integrations, and the team’s ability to maintain the architecture in practice.

Layered application

Where responsibility and transactions belong

  1. UI: HTTP, Console, or message handler
  2. Application: use case and transaction boundary
  3. Domain: rules, entities, and value objects
  4. Infrastructure: database, queue, and framework

Port and adapter

An example of connecting an external data source

  1. Application: pickup-point import
  2. Port: CarrierPointSource
  3. Adapter: carrier XML feed or API
  4. Infrastructure: HTTP client, parser, and storage

Principles I use

Architecture based on application needs

  • Clean Architecture
  • DDD
  • Hexagonal Architecture
  • Dependency Injection
  • SOLID
  • KISS
  • YAGNI
  • Deptrac

Need clearer application boundaries, not more layers?

I can help assess where architecture brings real value and where it is better to keep a simple, readable solution.

Request a call

I will call you on the next working day between 9:00 and 17:00.

You can also call me directly.

+420 605 181 728

Leave your phone number and send a callback request.

By sending, you agree to processing your data in order to handle your request.