Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Architecting for Scale

Architecting for Scale

Serverless Architecture Conference Berlin

SQUER Solutions

October 17, 2023
Tweet

More Decks by SQUER Solutions

Other Decks in Technology

Transcript

  1. @duffleit
    Architecting for
    Scale
    David Leitner

    View full-size slide

  2. @duffleit
    DAVID LEITNER
    Principal Engineer
    👋 [email protected]
    🌎 @duffleit

    View full-size slide

  3. @duffleit
    📦
    👧 🧑 👧 🧑 👧
    🔥
    Safely and sustainably reduce
    lead time to thank you.
    Daniel Terhorst-North
    Complex System

    View full-size slide

  4. @duffleit
    Simple System

    View full-size slide

  5. @duffleit
    Complicated System

    View full-size slide

  6. @duffleit
    Complicated System

    View full-size slide

  7. @duffleit
    Complicated System
    Module A Module B
    Module C

    View full-size slide

  8. @duffleit
    Complicated System
    Distributed
    Systems
    Service A Service B
    Service C

    View full-size slide

  9. @duffleit
    Deployment Units
    Monolithic Distributed
    Modularisa3on
    Bad
    Well
    Big Ball
    Of Mud

    View full-size slide

  10. @duffleit
    “Sadly, architecture has
    been undervalued for so
    long that many
    engineers regard life
    with a Big Ball of Mud
    as normal.“
    Foote & Yoder

    View full-size slide

  11. @duffleit
    Deployment Units
    Monolithic Distributed
    Modularisa3on
    Bad
    Well
    Big Ball
    Of Mud
    Distributed
    MOnolith
    WelL-Structured
    MOdulith

    View full-size slide

  12. @duffleit
    There is a multitude of reasons
    to go for Distributed Systems.
    Modularisation is none of them.

    View full-size slide

  13. @duffleit
    If you can’t build a well-structured
    monolith, what makes you think
    microservices are the answer?
    Simon Brown

    View full-size slide

  14. @duffleit
    Module A Module B
    Module C
    Single Deployment Unit

    View full-size slide

  15. @duffleit
    Service A Service B
    Serivice C

    View full-size slide

  16. @duffleit
    Service A Service B
    Serivice C
    Individual
    Scaling Demand
    10x Users
    Usual Traffic

    View full-size slide

  17. @duffleit
    Service A Service B
    Serivice C
    Individual
    Scaling Demand
    Technology
    Segmentation

    View full-size slide

  18. @duffleit
    Service A Service B
    Serivice C
    Individual
    Scaling Demand
    Technology
    Segmentation
    🇩🇪
    🇩🇪
    🇺🇸
    CO-Locating

    View full-size slide

  19. @duffleit
    Service A Service B
    Serivice C
    Individual
    Scaling Demand
    Technology
    Segmentation
    CO-Locating
    Technical
    Benefits

    View full-size slide

  20. @duffleit
    Service A Service B
    Serivice C
    👧 🧑
    🧑
    👧 🧑
    🧑
    👧 🧑
    🧑 Ownership
    You build it,
    You Own it
    You build it,
    You Run it

    View full-size slide

  21. @duffleit
    Single Deployment Unit
    MOdule A MOdule B
    MOdule C
    👧 🧑
    🧑
    👧 🧑
    🧑
    👧 🧑
    🧑 Ownership
    You build it,
    You Own it
    You build it,
    You Run it
    🔥

    View full-size slide

  22. @duffleit
    Single Deployment Unit
    MOdule A MOdule B
    MOdule C
    👧 🧑
    🧑
    👧 🧑
    🧑
    👧 🧑
    🧑 Ownership
    You build it,
    You Own it
    You build it,
    You Run it
    🔥
    🔥

    View full-size slide

  23. @duffleit
    Service A Service B
    Serivice C
    👧 🧑
    🧑
    👧 🧑
    🧑
    👧 🧑
    🧑 Enable Teams to
    work autonomously

    View full-size slide

  24. @duffleit
    Technical
    Benefits
    Team
    Autonomoy
    Scale Engineering
    CO-Locating
    Technology
    Segmentation
    Individual
    Scaling Demand
    80%

    View full-size slide

  25. @duffleit
    We optimize for Autonomy.

    View full-size slide

  26. @duffleit
    Responsibility
    The ops will
    hate it Zone
    The Devs will
    Quit Zone
    Autonomy
    You build it
    you Own it
    You build it
    you run it
    You build it
    you care it

    View full-size slide

  27. @duffleit
    Responsibility
    The ops will
    hate it Zone
    The Devs will
    Quit Zone
    Autonomy
    You build it
    you Own it
    You build it
    you run it
    You build it
    you care it

    View full-size slide

  28. @duffleit
    We optimize for Responsibility.
    Therefore, teams strive for Autonomy.

    View full-size slide

  29. @duffleit
    👧 🧑
    🧑 👧 🧑
    🧑
    👧 🧑
    🧑
    📦

    View full-size slide

  30. @duffleit
    📦
    📦
    👧 🧑
    🧑
    📦
    👧 🧑
    🧑
    👧 🧑
    🧑

    View full-size slide

  31. @duffleit
    Deployment Units
    Monolithic Distributed
    Modularisa3on
    Bad
    Well
    Big Ball
    Of Mud
    WelL-Structured
    Modulith
    Distributed
    Monolith
    Autonomous
    Service-Based
    SYSTEMS

    View full-size slide

  32. @duffleit
    Deployment Units
    Monolithic Distributed
    Modularisa3on
    Bad
    Well
    Big Ball
    Of Mud
    WelL-Structured
    Modulith
    Distributed
    Monolith
    Autonomous
    Service-Based
    SYSTEMS
    Decomposition Fallacy

    View full-size slide

  33. @duffleit
    Deployment Units
    Monolithic Distributed
    Modularisation
    Bad
    Well
    Big Ball
    Of Mud
    WelL-Structured
    Modulith
    Distributed
    Monolith
    Autonomous
    Service-Based
    SYSTEMS
    Decomposition Fallacy

    View full-size slide

  34. @duffleit
    Deployment Units
    Monolithic Distributed
    Modularisa3on
    Bad
    Well
    Big Ball
    Of Mud
    WelL-Structured
    Modulith
    Distributed
    Monolith
    Autonomous
    Service-Based
    SYSTEMS
    Decomposition Fallacy

    View full-size slide

  35. @duffleit
    Deployment Units
    Monolithic Distributed
    Modularisation
    Bad
    Well
    Big Ball
    Of Mud
    WelL-Structured
    Modulith
    Distributed
    Monolith
    Autonomous
    Service-Based
    SYSTEMS
    Decomposition Fallacy

    View full-size slide

  36. @duffleit
    Deployment Units
    Monolithic Distributed
    Modularisa3on
    Bad
    Well
    Big Ball
    Of Mud
    WelL-Structured
    Modulith
    Distributed
    Monolith
    Autonomous
    Service-Based
    SYSTEMS
    Decomposition Fallacy

    View full-size slide

  37. @duffleit
    Deployment Units
    Monolithic Distributed
    Modularisation
    Bad
    Well
    Big Ball
    Of Mud
    WelL-Structured
    Modulith
    Distributed
    Monolith
    Autonomous
    Service-Based
    SYSTEMS
    Change in Cause of Failure
    Reliabilty

    View full-size slide

  38. @duffleit
    Deployment Units
    Monolithic Distributed
    Modularisa3on
    Bad
    Well
    Big Ball
    Of Mud
    WelL-Structured
    Modulith
    Distributed
    Monolith
    Autonomous
    Service-Based
    SYSTEMS
    Change in Cause of Failure
    Reliabilty Availability

    View full-size slide

  39. @duffleit
    What’s the difference between a
    method call within a single deployment unit

    View full-size slide

  40. @duffleit
    What’s the difference between a
    method call within a single deployment unit
    Deployment Unit
    Module A Module B
    moduleB.createUser() fun createUser() { /*...*/ }

    View full-size slide

  41. @duffleit
    What’s the difference between a
    method call within a single deployment unit,
    and a method call across the network.
    Deployment Unit
    Deployment Unit
    Service A Service B
    restClient.user() fun createUser() { /*...*/ }

    View full-size slide

  42. @duffleit
    What’s the difference between a
    method call within a single deployment unit,
    and a method call across the network.
    Everything.

    View full-size slide

  43. @duffleit
    👧 🧑
    🧑
    🔥
    👧 🧑
    🧑
    👧 🧑
    🧑
    🔴

    View full-size slide

  44. @duffleit
    👧 🧑
    🧑
    🔥
    👧 🧑
    🧑
    👧 🧑
    🧑
    🔴
    https://en.wikipedia.org/wiki/Fallacies_of_distributed_computing

    View full-size slide

  45. @duffleit
    📦
    📦
    👧 🧑
    🧑
    📦
    👧 🧑
    🧑
    👧 🧑
    🧑

    View full-size slide

  46. @duffleit
    📦
    📦
    👧 🧑
    🧑
    📦
    👧 🧑
    🧑
    👧 🧑
    🧑
    🔥

    View full-size slide

  47. @duffleit
    To enable teams to strive for Autonomy.
    We need to Optimize for Availability.

    View full-size slide

  48. @duffleit
    Deployment Units
    Monolithic Distributed
    Modularisa3on
    Bad
    Well
    Big Ball
    Of Mud
    WelL-Structured
    Modulith
    Distributed
    Monolith
    Autonomous
    Service-Based
    SYSTEMS
    Change in Cause of Failure
    Reliabilty Availability

    View full-size slide

  49. @duffleit
    Deployment Units
    Monolithic Distributed
    Modularisation
    Bad
    Well
    Big Ball
    Of Mud
    WelL-Structured
    Modulith
    Distributed
    Monolith
    Autonomous
    Service-Based
    SYSTEMS
    Change in Cause of Failure
    Reliabilty Availability

    View full-size slide

  50. @duffleit
    👧 🧑
    🧑
    🔥
    👧 🧑
    🧑
    🔴
    Complex Distributed System
    👧 🧑
    🧑
    Loan
    Team
    Lending System

    View full-size slide

  51. @duffleit
    👧 🧑
    🧑
    🔥
    👧 🧑
    🧑
    🔴
    🔥
    Complex Distributed System
    👧 🧑
    🧑
    🟢
    Account Team
    Loan
    Team
    Lending System

    View full-size slide

  52. @duffleit
    👧 🧑
    🧑
    🔥
    👧 🧑
    🧑
    Complex Distributed System
    👧 🧑
    🧑
    🔴
    Loan
    Team
    Lending System
    Account Team

    View full-size slide

  53. @duffleit
    We strive for a stable environment.

    View full-size slide

  54. @duffleit
    There is no stable environment.

    View full-size slide

  55. @duffleit
    There is no stable environment.
    * The sooner we accept this, the better.

    View full-size slide

  56. @duffleit
    👧 🧑
    🧑
    👧 🧑
    👧 🧑
    🧑
    Payment Service
    🧑
    Account Service

    View full-size slide

  57. @duffleit
    👧 🧑
    🧑
    👧 🧑
    👧 🧑
    🧑
    🔴
    Payment Service
    🧑
    Account Service
    🔥
    Users[]
    🔥

    View full-size slide

  58. @duffleit
    👧 🧑
    🧑
    👧 🧑
    👧 🧑
    🧑
    🔴
    Payment Service
    🧑
    Account Service
    Users[]
    🔥

    View full-size slide

  59. @duffleit
    👧 🧑
    🧑
    👧 🧑
    👧 🧑
    🧑
    🔴
    Payment Service
    🧑
    Account Service
    Users[]
    cache

    View full-size slide

  60. @duffleit
    👧 🧑
    🧑
    👧 🧑
    👧 🧑
    🧑
    🔴
    Payment Service
    🧑
    Account Service
    Users[]
    stream
    UserChanged

    View full-size slide

  61. @duffleit
    👧 🧑
    🧑
    👧 🧑
    👧 🧑
    🧑
    🔴
    Payment Service
    🧑
    Account Service
    readmodel
    stream
    Users[]
    UserChanged

    View full-size slide

  62. @duffleit
    👧 🧑
    🧑
    👧 🧑
    👧 🧑
    🧑
    🔴
    Payment Service
    🧑
    Account Service
    readmodel
    stream
    Users[]
    UserChanged

    View full-size slide

  63. @duffleit
    👧 🧑
    🧑
    👧 🧑
    👧 🧑
    🧑
    Payment Service
    🧑
    Account Service
    readmodel
    stream
    🔥🔥
    🔥
    🔥
    Users[]

    View full-size slide

  64. @duffleit
    👧 🧑
    🧑
    👧 🧑
    👧 🧑
    🧑
    Payment Service
    🧑
    Account Service
    🔥
    🚀
    Caching
    LBs
    CBs

    View full-size slide

  65. @duffleit
    Chaotic Environments
    Architect for
    🔥

    View full-size slide

  66. @duffleit
    👧 🧑
    🧑
    👧 🧑
    👧 🧑
    🧑
    Payment Service
    🧑
    Account Service
    🔥
    🔥
    🔥
    🔥

    View full-size slide

  67. @duffleit
    we need to
    start dacining
    with the beast
    and embrace Choas.

    View full-size slide

  68. @duffleit
    👧 🧑
    🧑
    👧 🧑
    🧑
    👧 🧑
    🧑
    Gamedays
    🤡
    🤡
    🤡

    View full-size slide

  69. @duffleit
    A Services
    that can run in a
    stable environment
    can run only there.

    View full-size slide

  70. @duffleit
    A Services
    that can run in a
    chaotic environment
    can run everywhere.

    View full-size slide

  71. @duffleit
    Chaotic Environments
    Architect for
    🔥

    View full-size slide

  72. @duffleit
    👧 🧑
    🧑
    🔥
    👧 🧑
    👧 🧑
    🧑
    🔴
    Payment Team
    🧑
    Account Team
    Execute
    Payment
    Payment
    Gateway
    Team

    View full-size slide

  73. @duffleit
    👧 🧑
    🧑
    👧 🧑
    🧑
    👧 🧑
    Payment Team
    🧑
    Account Team
    🤯

    View full-size slide

  74. @duffleit
    <
    👧 🧑
    🧑
    SEPA Payment Team
    Account Team
    CREDITCARD
    Payment
    Team
    <
    👧 🧑
    🧑
    🧑
    👧 🧑

    View full-size slide

  75. @duffleit
    <
    👧 🧑
    🧑
    End2End Responsibility
    SEPA Payment Team
    Account Team
    CREDITCARD
    Payment
    Team
    <
    End2End Responsibility
    👧 🧑
    🧑
    🧑
    👧 🧑
    😌

    View full-size slide

  76. @duffleit
    <
    👧 🧑
    🧑
    End2End Responsibility
    SEPA Payment Team
    Account Team
    CREDITCARD
    Payment
    Team
    <
    End2End Responsibility
    👧 🧑
    🧑
    🧑
    👧 🧑
    😌
    We need to keep
    depenedencies in mind
    Accounts

    View full-size slide

  77. @duffleit
    Customer Journey and Entity Data
    Mismatch Problem

    View full-size slide

  78. @duffleit
    Customer
    Journey
    Entities
    User Accounts Transactions
    User
    Onboarding
    Payment
    Execution
    Fraud
    Detection

    View full-size slide

  79. @duffleit
    <
    👧 🧑
    🧑
    End2End Responsibility
    Account Team
    <
    End2End Responsibility
    👧 🧑
    🧑
    🧑
    👧 🧑
    Accounts

    View full-size slide

  80. @duffleit
    <
    👧 🧑
    🧑
    End2End Responsibility
    Account Team
    <
    End2End Responsibility
    👧 🧑
    🧑
    🧑
    👧 🧑
    Accounts
    cache
    🔥

    View full-size slide

  81. @duffleit
    <
    👧 🧑
    🧑
    End2End Responsibility
    Account Team
    <
    End2End Responsibility
    👧 🧑
    🧑
    🧑
    👧 🧑
    Accounts
    Account
    Changed
    readmodel
    🔥

    View full-size slide

  82. @duffleit
    End-2-End Responsibilities.
    Architect for
    🛶

    View full-size slide

  83. @duffleit
    End-to-End
    Autonomy

    Dependencies
    Decrease
    Cognitive Load

    View full-size slide

  84. @duffleit
    <
    SEPA Payment Team
    Account Team
    FRAUD
    CHECK
    <
    👧 🧑
    🧑
    Check
    Payment
    Complicated
    Subsystem
    👧 🧑
    🧑
    🧑
    👧 🧑

    View full-size slide

  85. @duffleit
    <
    SEPA Payment Team
    Account Team
    FRAUD
    CHECK
    <
    👧 🧑
    🧑
    Check
    Payment
    Complicated
    Subsystem
    👧 🧑
    🧑
    🧑
    👧 🧑
    💁🙋

    View full-size slide

  86. @duffleit
    <
    SEPA Payment Team
    Account Team
    FRAUD
    CHECK
    <
    👧 🧑
    🧑
    Check
    Payment
    Complicated
    Subsystem
    👧 🧑
    🧑
    🧑
    👧 🧑
    Availability
    How many
    Nines? Nines Percentage Yearly Outage
    1 Nine 90% 36,5 days
    2 Nines 99% 3,65 days
    3 Nines 99,9% 8,76 hours
    4 Nines 99,99% 52,56 minutes
    5 Nines 99,999% 5,26 minutes
    6 Nines 99,9999% 31,5 seconds
    MTBF

    View full-size slide

  87. @duffleit
    Can our stream aligned team still have a
    99,99% availability
    if our complex subsystem dependency has a
    99,9% availability?

    View full-size slide

  88. @duffleit
    <
    SEPA Payment Team
    Account Team
    FRAUD
    CHECK
    <
    👧 🧑
    🧑
    Check
    Payment
    Complicated
    Subsystem
    👧 🧑
    🧑
    🧑
    👧 🧑
    Availability
    How many
    Nines? Nines Percentage Yearly Outage
    1 Nine 90% 36,5 days
    2 Nines 99% 3,65 days
    3 Nines 99,9% 8,76 hours
    4 Nines 99,99% 52,56 minutes
    5 Nines 99,999% 5,26 minutes
    6 Nines 99,9999% 31,5 seconds
    rescheduler

    View full-size slide

  89. @duffleit
    <
    SEPA Payment Team
    Account Team
    FRAUD
    CHECK
    <
    👧 🧑
    🧑
    Check
    Payment
    Complicated
    Subsystem
    👧 🧑
    🧑
    🧑
    👧 🧑
    Availability
    How many
    Nines? Nines Percentage Yearly Outage
    1 Nine 90% 36,5 days
    2 Nines 99% 3,65 days
    3 Nines 99,9% 8,76 hours
    4 Nines 99,99% 52,56 minutes
    5 Nines 99,999% 5,26 minutes
    6 Nines 99,9999% 31,5 seconds
    🔄
    rescheduler

    View full-size slide

  90. @duffleit
    <
    Account Team
    FRAUD
    CHECK
    <
    👧 🧑
    🧑
    Check
    Payment
    Complicated
    Subsystem
    👧 🧑
    🧑
    Availability
    How many
    Nines? Nines Percentage Yearly Outage
    1 Nine 90% 36,5 days
    2 Nines 99% 3,65 days
    3 Nines 99,9% 8,76 hours
    4 Nines 99,99% 52,56 minutes
    5 Nines 99,999% 5,26 minutes
    6 Nines 99,9999% 31,5 seconds
    🔄
    rescheduler
    Platform Teams
    Developer Experience
    SLOs

    View full-size slide

  91. @duffleit
    Pain = Strength x Distance x Volatility
    Vladik Khononov
    Dependencies
    their three main aspects:

    View full-size slide

  92. @duffleit
    Pain = Strength x Distance x Volatility
    Vladik Khononov
    Dependencies

    View full-size slide

  93. @duffleit
    Dependencies as a Service
    Architect for
    9⃣

    View full-size slide

  94. @duffleit
    <
    SEPA Payment Team
    Account Team
    FRAUD
    CHECK
    <
    👧 🧑
    🧑
    Legacy
    System
    👧 🧑
    🧑
    👧 🧑
    🧑

    View full-size slide

  95. @duffleit
    <
    SEPA Payment Team
    Account Team
    FRAUD
    CHECK
    <
    👧 🧑
    🧑
    Legacy
    System
    👧 🧑
    🧑

    View full-size slide

  96. @duffleit
    User Fraud
    Data
    Readers
    Writers
    Readers
    Writers

    View full-size slide

  97. @duffleit
    User Fraud
    Data
    Readers
    Writers
    Readers
    Writers
    API

    View full-size slide

  98. @duffleit
    User Fraud
    Data
    Readers
    Writers
    Readers
    Writers
    API
    Downtime

    View full-size slide

  99. @duffleit
    User Fraud
    Data
    Readers
    Writers
    Readers
    Writers
    API
    Downtime

    View full-size slide

  100. @duffleit
    Readers
    Writers
    Readers
    Writers
    API
    User Fraud
    Data
    🔥

    View full-size slide

  101. @duffleit
    Readers
    Writers
    Readers
    Writers
    API
    User Fraud
    Data
    🔥

    View full-size slide

  102. @duffleit
    User Fraud
    Data
    Readers
    Writers
    API
    🔥
    Readers
    Writers

    View full-size slide

  103. @duffleit
    User Fraud
    Data
    Readers
    Writers
    API
    Readers
    Writers

    View full-size slide

  104. @duffleit
    Event
    User Fraud
    Data
    Readers
    Writers
    Readers
    Writers
    API
    User Fraud
    Data
    CDC

    View full-size slide

  105. @duffleit
    Event
    User Fraud
    Data
    Readers
    Readers
    Writers
    API
    User Fraud
    Data
    Event
    Writers

    View full-size slide

  106. @duffleit
    Event
    User Fraud
    Data
    Readers
    Writers
    Readers
    Writers
    API
    User Fraud
    Data
    Event
    🔥

    View full-size slide

  107. @duffleit
    Event
    User Fraud
    Data
    Readers
    Readers
    Writers
    API
    User Fraud
    Data
    Event
    Writers
    👷

    View full-size slide

  108. @duffleit
    Event
    User Fraud
    Data
    Readers
    Writers
    Readers
    Writers
    API
    User Fraud
    Data
    Event

    View full-size slide

  109. @duffleit
    Event
    User Fraud
    Data
    Readers
    Writers
    API
    User Fraud
    Data
    Event
    Readers
    Writers

    View full-size slide

  110. @duffleit
    CDC
    User Fraud
    Data
    Readers
    Writers
    API
    User Fraud
    Data
    Event
    Readers
    Writers
    Canary Releases
    Zero Downtime
    Migration
    Dark Launching
    Scientist Pattern

    View full-size slide

  111. @duffleit
    Change Anxiety
    Architect against
    🦜

    View full-size slide

  112. @duffleit
    So many thing to consider,
    Let’s sum up.

    View full-size slide

  113. @duffleit
    Modularisation is no
    reason to go for
    Distributed Systems.
    Deployment Units
    Monolithic Distributed
    Reliabilty Availability
    Autonomy is.

    View full-size slide

  114. @duffleit
    👧 🧑
    🧑
    👧 🧑
    👧 🧑
    🧑
    🧑

    View full-size slide

  115. @duffleit
    👧 🧑
    🧑
    👧 🧑
    👧 🧑
    🧑
    🧑
    Chaotic Environments
    Architect for
    🔥

    View full-size slide

  116. @duffleit
    👧 🧑
    🧑
    👧 🧑
    👧 🧑
    🧑
    🧑
    Chaotic Environments
    Architect for
    🔥
    End-2-End Responsibilities
    Architect for
    🛶

    View full-size slide

  117. @duffleit
    👧 🧑
    🧑
    👧 🧑
    👧 🧑
    🧑
    🧑
    Chaotic Environments
    Architect for
    🔥
    End-2-End Responsibilities
    Architect for
    🛶
    COMPLICATED
    Subsystem
    Teams
    Dependencies as a Service
    Architect for
    9⃣

    View full-size slide

  118. @duffleit
    👧 🧑
    🧑
    👧 🧑
    👧 🧑
    🧑
    🧑
    Chaotic Environments
    Architect for
    🔥
    End-2-End Responsibilities
    Architect for
    🛶
    COMPLICATED
    Subsystem
    Teams
    Change Anxiety
    Architect against
    🦜
    Dependencies as a Service
    Architect for
    9⃣

    View full-size slide

  119. @duffleit
    👧 🧑
    🧑
    👧 🧑
    🧑
    👧 🧑
    🧑
    🔥

    View full-size slide

  120. @duffleit
    📦
    👧 🧑
    🧑
    📦
    📦
    keep the flow of value high
    & the number of outages low.
    👧 🧑
    🧑
    👧 🧑
    🧑

    View full-size slide

  121. @duffleit
    Keep the lead time
    to thank you low,
    even at scale.

    View full-size slide

  122. @duffleit
    DAVID LEITNER
    Principal Engineer
    👋 [email protected]
    🌎 @duffleit
    Slides

    View full-size slide