Crafted Design

Created by Sandro Mancuso

For experienced developers who want to get better at designing well-crafted solutions. This training addresses design from the most micro level (via TDD) all the way up to micro services definition by analsying buisness requirements. The mission is to learn how to design software that is responsive to changing requirements and new functionally, avoiding some of the pitfalls that lead to legacy code.

More courses Contact

Course Duration

2 days

Why attend?

  • Learn design techniques applied in successful projects.
  • Use TDD as a design tool, learning about the two main TDD styles (Classicist and Outside-In) and how they differ when driving the design of your code.
  • Drive out a flexible design at different levels, from details of code all the way up to micro services.
  • Build software that is not bound to a specific technology or framework by keeping them at the boundaries of your system.
  • Express your business domain in every facet of your application, not just methods and classes.
  • Keep your design clean as your application grows and requirements change.
  • Let your architecture emerge, rather than designing a rigid and unchangeable structure up-front.
  • Learn how to derive a micro services architecture from business requriements and bounded contexts.
  • Learn how to model behaviour intead of state keeping your design more aligned to business goals.


Day 1

The first day is dedicated to software design at coding level. Developers will work in pairs on two large exercises, using different TDD styles and comparing their solutions. The day is also full of design discussions around the exercises and real world scenarios.

  • Write tests focused on behaviour instead of state.
  • Emergent design through classicist TDD.
  • SOLID principles.
  • BAP - Balanced Abstraction Principle.
  • Use TDD as a design tool with Outside-In TDD.
  • Tell, Don't Ask.
  • Commands, Queries, and Open/Close Principle compliance.

Day 2

The second day is dedicated to software design at application level (internal structure, layers, components, delivery mechanism, core domain) and also at micro services level using business requirements to drive their design (define the responsibility of each service, how services collaborate, their internal and external visibility, number of services we need to create, etc.) Developers will work in groups of 4 and come up with design solutions that later are shared with the wider group. Many design discussions during exercises focused on real world scenarios.

  • Principles of Domain Driven Design.
  • IDD - Interaction Driven Design.
  • Structure projects in a way that expresses what the application does and what it is about.
  • Differences between layers, hexagons, features, and components.
  • Modeling behaviour using Outside-In Design.
  • Identifying services from business rules.
  • Express design and architecture in code, but keeping your domain clear
  • Understanding Impact Mapping and how a services architecture can be derived from it.


Software developers that:

  • Have at least a couple of years of experience developing software commercially.
  • Are familiar with at least one Object Oriented Programming language (such as Java, C#, or C++).
  • Are comfortable using TDD to build software.
  • Understand mock objects and know how to use a mocking library
  • Have a general understanding of different architectural styles, including micro services.


We strongly recommend that developers and teams first attend the Crafting Code training before.

Developers must:

  • Bring their own laptops
  • Be using TDD regularly in their projects. In case they are not very proficient with TDD, they may struggle during the first day of this training. This course is NOT an introduction to TDD.
  • Be able to create projects, tests, and code and run them in their local environment.

In addition a distributed version control system such as Git is desirable.

Talk to us about your training needs

Software is our passion.

We are software craftspeople. We build well-crafted software for our clients, we help developers to get better at their craft through training, coaching and mentoring, and we help companies get better at delivering software.

Latest Blogs