SlideShare a Scribd company logo
1 of 80
Download to read offline
2
Share docs with
other systems
3
Which protocol?
4
5
1 month later…
6
7
Done!
8
1 month later…
9
10
Done!
11
+
12
The secrets of
13
Hexagonal

Architecture
Separate Domain
& Infrastructure
14
Maintainable Software
=
Domain 

vs
Infrastructure
Twitter 

GitHub 

Medium
16
}@nicoespeon
Nicolas Carlo
17
80 countries
18
Seat
Stop
Departure
Roundtrip
Leg
Taxes
Discount code
Fees
Domain is our
business
19
We could do our
business without
software!
20
21
Infrastructure is
how we make it work
22
Infrastructure 

is a detail
23
Put the Domain
at the heart of
the software
24
Problems mixing
Domain & Infra.
Get a poem from a
poetry library, or return
the default one.
26
27
class PoetryReader {
giveMeSomePoetry(): string {
}
}
28
import * as fs from "fs";
import * as path from "path";
class PoetryReader {
giveMeSomePoetry(): string {
const pathToPoem = path.join(!__dirname, "poem.txt");
let poem = fs.readFileSync(pathToPoem, { encoding: "utf8" });
}
}
29
import * as fs from "fs";
import * as path from "path";
class PoetryReader {
giveMeSomePoetry(): string {
const pathToPoem = path.join(!__dirname, "poem.txt");
let poem = fs.readFileSync(pathToPoem, { encoding: "utf8" });
if (!poem) {
poem =
"If you could read a leaf or treernyou’d have no need of books.
rn!-- © Alistair Cockburn (1987)";
}
return poem;
}
}
30
import * as fs from "fs";
import * as path from "path";
class PoetryReader {
giveMeSomePoetry(): string {
const pathToPoem = path.join(!__dirname, "poem.txt");
let poem = fs.readFileSync(pathToPoem, { encoding: "utf8" });
if (!poem) {
poem =
"If you could read a leaf or treernyou’d have no need of books.
rn!-- © Alistair Cockburn (1987)";
}
return poem;
}
}
31
import * as fs from "fs";
import * as path from "path";
class PoetryReader {
giveMeSomePoetry(): string {
const pathToPoem = path.join(!__dirname, "poem.txt");
let poem = fs.readFileSync(pathToPoem, { encoding: "utf8" });
if (!poem) {
poem =
"If you could read a leaf or treernyou’d have no need of books.
rn!-- © Alistair Cockburn (1987)";
}
return poem;
}
}
Domain
32
import * as fs from "fs";
import * as path from "path";
class PoetryReader {
giveMeSomePoetry(): string {
const pathToPoem = path.join(!__dirname, "poem.txt");
let poem = fs.readFileSync(pathToPoem, { encoding: "utf8" });
if (!poem) {
poem =
"If you could read a leaf or treernyou’d have no need of books.
rn!-- © Alistair Cockburn (1987)";
}
return poem;
}
}
Infrastructure
33
import * as fs from "fs";
import * as path from "path";
class PoetryReader {
giveMeSomePoetry(): string {
const pathToPoem = path.join(!__dirname, "poem.txt");
let poem = fs.readFileSync(pathToPoem, { encoding: "utf8" });
if (!poem) {
poem =
"If you could read a leaf or treernyou’d have no need of books.
rn!-- © Alistair Cockburn (1987)";
}
return poem;
}
}
const pathToPoem = path.join(!__dirname, "poem.txt");
let poem = fs.readFileSync(pathToPoem, { encoding: "utf8" });
Hard to 

see
the Business
34
const pathToPoem = path.join(!__dirname, "poem.txt");
let poem = fs.readFileSync(pathToPoem, { encoding: "utf8" });
Hard to 

test
the Business
35
const pathToPoem = path.join(!__dirname, "poem.txt");
let poem = fs.readFileSync(pathToPoem, { encoding: "utf8" });
Hard to 

change
the Business
36
37
import FileReader from "lib/file-reader";
class PoetryReader {
giveMeSomePoetry(): string {
let poem = FileReader.read("poem.txt");
if (!poem) {
poem =
"If you could read a leaf or treernyou’d have no need of books.
rn!-- © Alistair Cockburn (1987)";
}
return poem;
}
}
import FileReader from "lib/file-reader";
class PoetryReader {
giveMeSomePoetry(): string {
let poem = FileReader.read("poem.txt");
if (!poem) {
poem =
"If you could read a leaf or treernyou’d have no need of books.
rn!-- © Alistair Cockburn (1987)";
}
return poem;
}
}
Same 

problem
38
Hexagonal
Architecture
The simplest way to
40
Separate Domain 

& Infrastructure
41
Infra.
Domain
42
Infra.
Domain
dependency
43
Infra.
Domain
dependency
44
Interface
Adapter
use
implement
45
Port
Adapter
46
Port
Adapter
Ports & Adapters architecture
47
Business
language

only
48
Left-side Right-side
49
Left-side Right-side
Adapter
Adapter
50
Left-side Right-side
Adapter
Adapter
Adapter
Adapter
A concrete
example
class PoetryReader {
}
Domain
52
class PoetryReader {
poetryLibrary: ObtainPoems;
constructor(poetryLibrary!?: ObtainPoems) {
this.poetryLibrary = poetryLibrary;
}
}
Domain
53
class PoetryReader {
poetryLibrary: ObtainPoems;
constructor(poetryLibrary!?: ObtainPoems) {
this.poetryLibrary = poetryLibrary;
}
}
Domain
54
Dependency
Injection
class PoetryReader {
poetryLibrary: ObtainPoems;
constructor(poetryLibrary!?: ObtainPoems) {
this.poetryLibrary = poetryLibrary;
}
giveMeSomePoetry(): Poem {
if (!this.poetryLibrary) {
return "If you could read a leaf or treernyou’d have no need of books.
rn!-- © Alistair Cockburn (1987)";
}
return this.poetryLibrary.getAPoem();
}
}
Domain
55
class PoetryReader {
poetryLibrary: ObtainPoems;
constructor(poetryLibrary!?: ObtainPoems) {
this.poetryLibrary = poetryLibrary;
}
giveMeSomePoetry(): Poem {
if (!this.poetryLibrary) {
return "If you could read a leaf or treernyou’d have no need of books.
rn!-- © Alistair Cockburn (1987)";
}
return this.poetryLibrary.getAPoem();
}
}
Domain
56
giveMeSomePoetry(): Poem {
if (!this.poetryLibrary) {
return "If you could read a leaf or treernyou’d have
no need of books.rn!-- © Alistair Cockburn (1987)";
}
return this.poetryLibrary.getAPoem();
}
57
giveMeSomePoetry(): string {
let poem = FileReader.read("poem.txt");
if (!poem) {
poem =
"If you could read a leaf or treernyou’d have
no need of books.rn!-- © Alistair Cockburn (1987)";
}
return poem;
}
Implementation
Intention
Domain
type Poem = string;
interface ObtainPoems {
getAPoem(): Poem
}
58
import * as fs from "fs";
import * as path from "path";
import ObtainPoems from "!../domain/obtain-poems";
class ObtainPoemsFromFS implements ObtainPoems {
getAPoem() {
const pathToPoem = path.join(!__dirname, "poem.txt");
const poem = fs.readFileSync(pathToPoem, { encoding: "utf8" });
return poem;
}
}
Infra.
59
!// 1. Instantiate the right-side adapter(s)
!// 2. Instantiate the hexagon (domain)
!// 3. Instantiate the left-side adapter(s)
60
import ObtainPoemsFromFS from "./infrastructure/obtain-poems-from-fs";
!// 1. Instantiate the right-side adapter(s)
const poetryLibrary = new ObtainPoemsFromFS();
!// 2. Instantiate the hexagon (domain)
!// 3. Instantiate the left-side adapter(s)
61
import PoetryReader from "./domain/poetry-reader";
import ObtainPoemsFromFS from "./infrastructure/obtain-poems-from-fs";
!// 1. Instantiate the right-side adapter(s)
const poetryLibrary = new ObtainPoemsFromFS();
!// 2. Instantiate the hexagon (domain)
const poetryReader = new PoetryReader(poetryLibrary);
!// 3. Instantiate the left-side adapter(s)
62
import PoetryReader from "./domain/poetry-reader";
import ObtainPoemsFromFS from "./infrastructure/obtain-poems-from-fs";
import ConsoleApi from "./infrastructure/console-api";
!// 1. Instantiate the right-side adapter(s)
const poetryLibrary = new ObtainPoemsFromFS();
!// 2. Instantiate the hexagon (domain)
const poetryReader = new PoetryReader(poetryLibrary);
!// 3. Instantiate the left-side adapter(s)
const consoleApi = new ConsoleApi(poetryReader);
63
import PoetryReader from "./domain/poetry-reader";
import ObtainPoemsFromFS from "./infrastructure/obtain-poems-from-fs";
import ConsoleApi from "./infrastructure/console-api";
!// 1. Instantiate the right-side adapter(s)
const poetryLibrary = new ObtainPoemsFromFS();
!// 2. Instantiate the hexagon (domain)
const poetryReader = new PoetryReader(poetryLibrary);
!// 3. Instantiate the left-side adapter(s)
const consoleApi = new ConsoleApi(poetryReader);
!// App logic is only using left-side adapter(s).
console.log("Here is some poetry:n");
consoleApi.ask();
64
const poetryReader = new PoetryReader();
65
const poetryReader = new PoetryReader(poetryLibrary);
66
Pros and cons
This ain't new
68
"Program to an Interface" − OOP
"Isolate side effects" − FP
The Onion Architecture
Plug different adapters
to the Domain
69
A good architect
defers decisions
70
Start with
something simple
71
But… it's only
the first step!
72
73
More layers
74
Ubiquitous Language 

Bounded Contexts

Domain modelling
Separate Domain
& Infrastructure
75
🙏
Twitter 

GitHub 

Medium
}@nicoespeon
Nicolas Carlo
@swcraftmontreal
Software Crafters Montréal
Every 1st Tuesday of the month.
Bonuses
test("give verses when asked for poetry", () !=> {
const poetryReader = new PoetryReader();
const verses = poetryReader.giveMeSomePoetry();
expect(verses).toEqual(
"If you could read a leaf or treernyou’d have no
need of books.rn!-- © Alistair Cockburn (1987)"
);
});
Tests
test("give verses from a PoetryLibrary", () !=> {
const poetryLibrary: ObtainPoems = {
getAPoem() {
return "I want to sleep…rn!-- Masaoka Shiki (1867-1902)";
}
};
const poetryReader = new PoetryReader(poetryLibrary);
const verses = poetryReader.giveMeSomePoetry();
expect(verses).toEqual(
"I want to sleep…rn!-- Masaoka Shiki (1867-1902)"
);
});
Tests

More Related Content

What's hot

SOLID Principles and The Clean Architecture
SOLID Principles and The Clean ArchitectureSOLID Principles and The Clean Architecture
SOLID Principles and The Clean ArchitectureMohamed Galal
 
Introducing Clean Architecture
Introducing Clean ArchitectureIntroducing Clean Architecture
Introducing Clean ArchitectureRoc Boronat
 
Hexagonal architecture with Spring Boot
Hexagonal architecture with Spring BootHexagonal architecture with Spring Boot
Hexagonal architecture with Spring BootMikalai Alimenkou
 
Clean Architecture
Clean ArchitectureClean Architecture
Clean ArchitectureBadoo
 
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023Steve Pember
 
Clean architecture - Protecting the Domain
Clean architecture - Protecting the DomainClean architecture - Protecting the Domain
Clean architecture - Protecting the DomainVictor Rentea
 
Clean architecture
Clean architectureClean architecture
Clean architectureandbed
 
Clean architecture
Clean architectureClean architecture
Clean architecture.NET Crowd
 
Arquitectura hexagonal
Arquitectura hexagonalArquitectura hexagonal
Arquitectura hexagonal540deg
 
Hexagonal Architecture.pdf
Hexagonal Architecture.pdfHexagonal Architecture.pdf
Hexagonal Architecture.pdfVladimirRadzivil
 
The aggregate is dead! Long live the aggregate! - SpringIO.pdf
The aggregate is dead! Long live the aggregate! - SpringIO.pdfThe aggregate is dead! Long live the aggregate! - SpringIO.pdf
The aggregate is dead! Long live the aggregate! - SpringIO.pdfSara Pellegrini
 
Domain Driven Design (DDD)
Domain Driven Design (DDD)Domain Driven Design (DDD)
Domain Driven Design (DDD)Tom Kocjan
 
A Separation of Concerns: Clean Architecture on Android
A Separation of Concerns: Clean Architecture on AndroidA Separation of Concerns: Clean Architecture on Android
A Separation of Concerns: Clean Architecture on AndroidOutware Mobile
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven DesignNader Albert
 
Domain-Driven Design
Domain-Driven DesignDomain-Driven Design
Domain-Driven DesignAndriy Buday
 
Designing APIs and Microservices Using Domain-Driven Design
Designing APIs and Microservices Using Domain-Driven DesignDesigning APIs and Microservices Using Domain-Driven Design
Designing APIs and Microservices Using Domain-Driven DesignLaunchAny
 

What's hot (20)

SOLID Principles and The Clean Architecture
SOLID Principles and The Clean ArchitectureSOLID Principles and The Clean Architecture
SOLID Principles and The Clean Architecture
 
Introducing Clean Architecture
Introducing Clean ArchitectureIntroducing Clean Architecture
Introducing Clean Architecture
 
Hexagonal architecture with Spring Boot
Hexagonal architecture with Spring BootHexagonal architecture with Spring Boot
Hexagonal architecture with Spring Boot
 
Clean Architecture
Clean ArchitectureClean Architecture
Clean Architecture
 
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023
 
Clean architecture - Protecting the Domain
Clean architecture - Protecting the DomainClean architecture - Protecting the Domain
Clean architecture - Protecting the Domain
 
Clean architecture
Clean architectureClean architecture
Clean architecture
 
Clean architecture
Clean architectureClean architecture
Clean architecture
 
Arquitectura hexagonal
Arquitectura hexagonalArquitectura hexagonal
Arquitectura hexagonal
 
Clean architecture
Clean architectureClean architecture
Clean architecture
 
Hexagonal Architecture.pdf
Hexagonal Architecture.pdfHexagonal Architecture.pdf
Hexagonal Architecture.pdf
 
The aggregate is dead! Long live the aggregate! - SpringIO.pdf
The aggregate is dead! Long live the aggregate! - SpringIO.pdfThe aggregate is dead! Long live the aggregate! - SpringIO.pdf
The aggregate is dead! Long live the aggregate! - SpringIO.pdf
 
Domain Driven Design (DDD)
Domain Driven Design (DDD)Domain Driven Design (DDD)
Domain Driven Design (DDD)
 
Domain Driven Design 101
Domain Driven Design 101Domain Driven Design 101
Domain Driven Design 101
 
A Separation of Concerns: Clean Architecture on Android
A Separation of Concerns: Clean Architecture on AndroidA Separation of Concerns: Clean Architecture on Android
A Separation of Concerns: Clean Architecture on Android
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
SOLID principles
SOLID principlesSOLID principles
SOLID principles
 
Domain-Driven Design
Domain-Driven DesignDomain-Driven Design
Domain-Driven Design
 
Designing APIs and Microservices Using Domain-Driven Design
Designing APIs and Microservices Using Domain-Driven DesignDesigning APIs and Microservices Using Domain-Driven Design
Designing APIs and Microservices Using Domain-Driven Design
 

Similar to The Secrets of Hexagonal Architecture

java question Fill the add statement areaProject is to wo.pdf
java question Fill the add statement areaProject is to wo.pdfjava question Fill the add statement areaProject is to wo.pdf
java question Fill the add statement areaProject is to wo.pdfdbrienmhompsonkath75
 
Rust Mozlando Tutorial
Rust Mozlando TutorialRust Mozlando Tutorial
Rust Mozlando Tutorialnikomatsakis
 
Integrating libSyntax into the compiler pipeline
Integrating libSyntax into the compiler pipelineIntegrating libSyntax into the compiler pipeline
Integrating libSyntax into the compiler pipelineYusuke Kita
 
Vapor – Swift is not only for iOS anymore
Vapor – Swift is not only for iOS anymoreVapor – Swift is not only for iOS anymore
Vapor – Swift is not only for iOS anymoreMilan Vít
 
Migrating Babel from CommonJS to ESM
Migrating Babel     from CommonJS to ESMMigrating Babel     from CommonJS to ESM
Migrating Babel from CommonJS to ESMIgalia
 
Echtzeitapplikationen mit Elixir und GraphQL
Echtzeitapplikationen mit Elixir und GraphQLEchtzeitapplikationen mit Elixir und GraphQL
Echtzeitapplikationen mit Elixir und GraphQLMoritz Flucht
 

Similar to The Secrets of Hexagonal Architecture (7)

java question Fill the add statement areaProject is to wo.pdf
java question Fill the add statement areaProject is to wo.pdfjava question Fill the add statement areaProject is to wo.pdf
java question Fill the add statement areaProject is to wo.pdf
 
Rust Mozlando Tutorial
Rust Mozlando TutorialRust Mozlando Tutorial
Rust Mozlando Tutorial
 
Integrating libSyntax into the compiler pipeline
Integrating libSyntax into the compiler pipelineIntegrating libSyntax into the compiler pipeline
Integrating libSyntax into the compiler pipeline
 
Vapor – Swift is not only for iOS anymore
Vapor – Swift is not only for iOS anymoreVapor – Swift is not only for iOS anymore
Vapor – Swift is not only for iOS anymore
 
Migrating Babel from CommonJS to ESM
Migrating Babel     from CommonJS to ESMMigrating Babel     from CommonJS to ESM
Migrating Babel from CommonJS to ESM
 
Echtzeitapplikationen mit Elixir und GraphQL
Echtzeitapplikationen mit Elixir und GraphQLEchtzeitapplikationen mit Elixir und GraphQL
Echtzeitapplikationen mit Elixir und GraphQL
 
Abstract factory
Abstract factoryAbstract factory
Abstract factory
 

More from Nicolas Carlo

Hexagonal architecture & Elixir
Hexagonal architecture & ElixirHexagonal architecture & Elixir
Hexagonal architecture & ElixirNicolas Carlo
 
À la découverte des Observables - HumanTalks Paris 2017
À la découverte des Observables - HumanTalks Paris 2017À la découverte des Observables - HumanTalks Paris 2017
À la découverte des Observables - HumanTalks Paris 2017Nicolas Carlo
 
À la découverte des observables
À la découverte des observablesÀ la découverte des observables
À la découverte des observablesNicolas Carlo
 
Testing Marionette.js Behaviors
Testing Marionette.js BehaviorsTesting Marionette.js Behaviors
Testing Marionette.js BehaviorsNicolas Carlo
 
Chaining and function composition with lodash / underscore
Chaining and function composition with lodash / underscoreChaining and function composition with lodash / underscore
Chaining and function composition with lodash / underscoreNicolas Carlo
 
Les générateurs de code, pour se simplifier la vie au quotidien
Les générateurs de code, pour se simplifier la vie au quotidienLes générateurs de code, pour se simplifier la vie au quotidien
Les générateurs de code, pour se simplifier la vie au quotidienNicolas Carlo
 
Kanban et Game Development avec Trello
Kanban et Game Development avec TrelloKanban et Game Development avec Trello
Kanban et Game Development avec TrelloNicolas Carlo
 
Plop : un micro-générateur pour se simplifier la vie au quotidien
Plop : un micro-générateur pour se simplifier la vie au quotidienPlop : un micro-générateur pour se simplifier la vie au quotidien
Plop : un micro-générateur pour se simplifier la vie au quotidienNicolas Carlo
 
Tester ses Behaviors Marionette.js
Tester ses Behaviors Marionette.jsTester ses Behaviors Marionette.js
Tester ses Behaviors Marionette.jsNicolas Carlo
 
Chaining et composition de fonctions avec lodash / underscore
Chaining et composition de fonctions avec lodash / underscoreChaining et composition de fonctions avec lodash / underscore
Chaining et composition de fonctions avec lodash / underscoreNicolas Carlo
 
Comment organiser un gros projet backbone
Comment organiser un gros projet backboneComment organiser un gros projet backbone
Comment organiser un gros projet backboneNicolas Carlo
 

More from Nicolas Carlo (11)

Hexagonal architecture & Elixir
Hexagonal architecture & ElixirHexagonal architecture & Elixir
Hexagonal architecture & Elixir
 
À la découverte des Observables - HumanTalks Paris 2017
À la découverte des Observables - HumanTalks Paris 2017À la découverte des Observables - HumanTalks Paris 2017
À la découverte des Observables - HumanTalks Paris 2017
 
À la découverte des observables
À la découverte des observablesÀ la découverte des observables
À la découverte des observables
 
Testing Marionette.js Behaviors
Testing Marionette.js BehaviorsTesting Marionette.js Behaviors
Testing Marionette.js Behaviors
 
Chaining and function composition with lodash / underscore
Chaining and function composition with lodash / underscoreChaining and function composition with lodash / underscore
Chaining and function composition with lodash / underscore
 
Les générateurs de code, pour se simplifier la vie au quotidien
Les générateurs de code, pour se simplifier la vie au quotidienLes générateurs de code, pour se simplifier la vie au quotidien
Les générateurs de code, pour se simplifier la vie au quotidien
 
Kanban et Game Development avec Trello
Kanban et Game Development avec TrelloKanban et Game Development avec Trello
Kanban et Game Development avec Trello
 
Plop : un micro-générateur pour se simplifier la vie au quotidien
Plop : un micro-générateur pour se simplifier la vie au quotidienPlop : un micro-générateur pour se simplifier la vie au quotidien
Plop : un micro-générateur pour se simplifier la vie au quotidien
 
Tester ses Behaviors Marionette.js
Tester ses Behaviors Marionette.jsTester ses Behaviors Marionette.js
Tester ses Behaviors Marionette.js
 
Chaining et composition de fonctions avec lodash / underscore
Chaining et composition de fonctions avec lodash / underscoreChaining et composition de fonctions avec lodash / underscore
Chaining et composition de fonctions avec lodash / underscore
 
Comment organiser un gros projet backbone
Comment organiser un gros projet backboneComment organiser un gros projet backbone
Comment organiser un gros projet backbone
 

Recently uploaded

Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 

Recently uploaded (20)

Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 

The Secrets of Hexagonal Architecture