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

Side-Effects Are The Complexity Iceberg

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers. →

Side-Effects Are The Complexity Iceberg

Many of us have a rough idea of what side-effects are and a vague sense that they're bad. It's a shame we're not more precise about it, because when you really understand side-effects you have an excellent new lens through which you can judge individual blocks of code, larger architectural patterns, and even whole system designs.

So let's start by clarifying our understanding of what side-effects are and how to spot them. We'll see how easily they arise, leaving code that's harder to understand, harder to test and harder to decouple. Then we'll look at tools and techniques for eliminating those side-effects where it's possible and managing them where it isn't. Finally we'll zoom out to see how those ideas get expressed in every field of computing, yielding fundamentally different approaches to programming language design, DevOps, system architecture, and database design.

There's an iceberg of complexity hiding in your systems' side-effects and by the end of this talk you'll be able to spot it and start tackling it, rethinking the way we deal with data and the systems around it.

Avatar for Kris Jenkins

Kris Jenkins

February 16, 2022

Other Decks in Programming

Transcript

  1. SIDE-EFFECTS ARE THE COMPLEXITY ICEBERG @krisajenkins 1 @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  2. @krisajenkins HELLO Kris Jenkins @krisajenkins 3 @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  3. @krisajenkins @krisajenkins xkcd.com/1015 @krisajenkins 5 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  4. @krisajenkins @krisajenkins @krisajenkins LET'S TALK ABOUT SIDE EFFECTS @krisajenkins 7

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  5. @krisajenkins @krisajenkins @krisajenkins @krisajenkins EVERY FUNCTION YOU WRITE …has two

    sets of inputs & outputs. @krisajenkins 9 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  6. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins THE FAMILIAR PAIR public int

    add(int x, int y) { return x + y; } @krisajenkins 10 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  7. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins THE HIDDEN PAIR public

    Boolean deleteBySearchTerm(Regex searchTerm) { Message[] messages = InboxManager.find(searchTerm); int deleteCount = InboxManager.delete(messages); return (deleteCount > 0); } @krisajenkins 11 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  8. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins SECOND EXAMPLE public

    Optional<Programme> whatsOnTv(ChannelId channel) { LocalDateTime t = LocalDateTime.now(); return this.programmes .stream() .filter(p -> p.getChannel().equals(channel)) .filter(p -> p.getTimeslot().contains(t)) .findFirst(); } @krisajenkins 12 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  9. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins SIDE EFFECTS

    The hidden inputs & outputs that a function secretly depends on. @krisajenkins 13 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  10. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins SO

    WHAT? @krisajenkins 15 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  11. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    AFFECT ON TESTING How do we test this? Boolean deleteBySearchTerm(Regex searchTerm); @krisajenkins 16 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  12. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins AFFECT ON TESTING How do we test this? Boolean deleteBySearchTerm(Regex searchTerm); Pair<Boolean,InboxState> deleteBySearchTerm( Regex searchTerm, InboxState inbox ); @krisajenkins 16 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  13. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins APIS AND CONTRACTS Aren't the whole story. @krisajenkins 17 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  14. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins COMPONENTS AND COMPOSITION @krisajenkins 18 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  15. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins COMPONENTS AND COMPOSITION @krisajenkins 19 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  16. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins HIDDEN DEPENDENCY GRAPHS For code this is a huge source of hidden complexity. @krisajenkins 20 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  17. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins EVEN WORSE - DATA! @krisajenkins 21 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  18. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins QUIZ TIME What will this print? public void addCats(ArrayList<String> things) { things.add(2, "Cats"); System.out.print("Element number 2 is:\t"); System.out.println(things.get(2)); } @krisajenkins 22 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  19. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins QUIZ TIME What will this print? public void addCats(ArrayList<String> things) { things.add(2, "Cats"); System.out.print("Element number 2 is:\t"); System.out.println(things.get(2)); } Element number 2 is: Dogs @krisajenkins 22 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  20. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins QUIZ TIME What will this print? public void addCats(ArrayList<String> things) { things.add(2, "Cats"); System.out.print("Element number 2 is:\t"); System.out.println(things.get(2)); } Element number 2 is: Dogs Because threads. @krisajenkins 22 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  21. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins SO WHAT CAN WE DO ABOUT IT? @krisajenkins 24 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  22. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins PUT A WALL AROUND IT @krisajenkins 25 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  23. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins ONE STYLE OF MICROSERVICES @krisajenkins 26 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  24. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins ARE THERE OTHER SOLUTIONS? @krisajenkins 28 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  25. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins THERE'S RUST @krisajenkins 29 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  26. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins TRACKING OWNERSHIP MAKES CONCURRENCY EASIER …because now you know the side effect of changing something is contained. @krisajenkins 30 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  27. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins WHAT IF WE WENT FURTHER? @krisajenkins 32 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  28. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins IMMUTABLE DATA STRUCTURES …vs… public void addCats(List<String> things) public List<String> addCats(List<String> things) @krisajenkins 33 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  29. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins PUBLISHED 1998 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  30. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins ISBN-13: 978-0521663502 @krisajenkins 34 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  31. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins THIS IS A GOOD IDEA - OFFICIALLY Maximum reliance on immutable objects is widely accepted as a sound strategy for creating simple, reliable code. docs.oracle.com @krisajenkins 35 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  32. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins THIS OPENS UP DATA Who are we protecting data for? @krisajenkins 36 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  33. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins WHAT ABOUT OTHER SIDE- EFFECTS? @krisajenkins 38 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  34. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins HASKELL @krisajenkins 39 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  35. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins QUICK SYNTAX PRIMER public List<String> addCats( List<String> things, Int position ) @krisajenkins 40 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  36. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins QUICK SYNTAX PRIMER public List<String> addCats( List<String> things, Int position ) List<String> addCats( List<String> , Int ) @krisajenkins 40 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  37. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins QUICK SYNTAX PRIMER public List<String> addCats( List<String> things, Int position ) List<String> addCats( List<String> , Int ) addCats(List<String>, Int) -> List<String> @krisajenkins 40 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  38. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins QUICK SYNTAX PRIMER public List<String> addCats( List<String> things, Int position ) List<String> addCats( List<String> , Int ) addCats(List<String>, Int) -> List<String> addCats :: List String -> Int -> List String @krisajenkins 40 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  39. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins QUICK SYNTAX PRIMER (2) deleteBySearchTerm :: Regex -> InboxState -> (Boolean, InboxState) @krisajenkins 41 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  40. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins QUICK SYNTAX PRIMER (2) deleteBySearchTerm :: Regex -> InboxState -> (Boolean, InboxState) deleteBySearchTerm :: Regex -> InboxState -> Optional InboxState @krisajenkins 41 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  41. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins QUICK SYNTAX PRIMER (2) deleteBySearchTerm :: Regex -> InboxState -> (Boolean, InboxState) deleteBySearchTerm :: Regex -> InboxState -> Optional InboxState deleteBySearchTerm :: Regex -> InboxState -> ctx InboxState @krisajenkins 41 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  42. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins SYSTEMS FOR TRACKING SIDE-EFFECTS registerUser :: UserName -> Password -> DB User @krisajenkins 42 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  43. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins NOW THE COMPUTER CAN HELP calculateTaxPayment :: List Transaction -> Amount recordTaxPayment :: UserId -> Amount -> Logging (HTTP ReceiptId) @krisajenkins 43 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  44. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins NOW THE COMPUTER CAN HELP calculateTaxPayment :: List Transaction -> Amount recordTaxPayment :: UserId -> Amount -> Logging (HTTP ReceiptId) handleTax :: UserId -> List Transaction -> ReceiptId handleTax userId txns = recordTaxPayment userId (calculateTaxPayment txns) @krisajenkins 43 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  45. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins NOW THE COMPUTER CAN HELP calculateTaxPayment :: List Transaction -> Amount recordTaxPayment :: UserId -> Amount -> Logging (HTTP ReceiptId) handleTax :: UserId -> List Transaction -> ReceiptId handleTax userId txns = recordTaxPayment userId (calculateTaxPayment txns) handleTax :: UserId -> List Transaction -> Logging (HTTP ReceiptId) @krisajenkins 43 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  46. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins CONTROVERSY WARNING @krisajenkins 44 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  47. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins ANYTHING ELSE? @krisajenkins 46 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  48. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins WHAT IS STATE? @krisajenkins 47 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  49. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins STATE MACHINES @krisajenkins 48 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  50. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins STATES, TRANSITIONS, REPORTING system :: Fact -> State -> ctx State observe :: State -> View @krisajenkins 49 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  51. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins AND DOCKERFILES FROM node:12-alpine RUN apk add --no-cache python3 g++ make RUN useradd kris @krisajenkins 50 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  52. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins AND NIX @krisajenkins 51 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  53. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins WHY THROW HISTORY AWAY? Why hide those inputs? @krisajenkins 53 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  54. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins EVENT SOURCING Facts are expensive to acquire, cheap & reliable to store. @krisajenkins 54 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  55. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins LET'S TALK ABOUT DATABASES @krisajenkins 55 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  56. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins LET'S BUILD A DATABASE THAT WAY @krisajenkins 56 @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  57. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins THAT'S APACHE KAFKA® @krisajenkins 57 @krisajenkins @krisajenkins @krisajenkins @krisajenkins
  58. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins REASSEMBLING THE DATABASE @krisajenkins 58 @krisajenkins @krisajenkins @krisajenkins
  59. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins BACK TO MICROSERVICES Opening Data org-wide. @krisajenkins 59 @krisajenkins @krisajenkins
  60. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins SO LET'S TALK ABOUT SIDE EFFECTS @krisajenkins 61 @krisajenkins
  61. @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins

    @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins @krisajenkins THANK YOU Questions? Contact me: Learn More About Kafka: Things to search for: Side effects, Rust, "Purely Functional Data Structures", Haskell, Elm, Redux, Nix, Event Sourcing, Apache Kafka, Confluent @krisajenkins developer.confluent.io @krisajenkins 63