← Extractions

Business logic in Ruby — Andrzej Krzywda at wroclove.rb 2019

Andrzej Krzywda, Arkency founder and wroclove.rb organizer, traces his journey from Java POJOs through Rails' Active Record to a decoupled approach to business logic based on aggregates, events, and state machines. He walks through three implementations of a JIRA-like state machine (aggregate_root gem, polymorphic classes, duck typing), announces the public release of Arkency's 'aggregates' repository, and argues that business logic is mostly about state machines that can be expressed without frameworks or libraries.

Model
claude-opus-4-7
Ingestion
6c543ac7
Input tokens
318,864
fresh
213,537
cached
97,713
cache write
7,614
Output tokens
12,037
Duration
189.2s
Roundtrips
9
Tool calls
24
Cost
$0.00
Nodes/edges extracted
22 / 51
Read set (nodes/edges)
111 / 2

Nodes (22)

update Business logic in Ruby talk
description Talk at wroclove.rb 2019. Talk at wroclove.rb 2019 by Andrzej Krzywda (Arkency). A personal journey from Java's Plain Old Java Objects through ...
short_description Talk at wroclove.rb 2019. Andrzej Krzywda on extracting business logic from Rails into pure state machines.
update Andrzej Krzywda person
attrs (empty) {"role" => "speaker"}
description Arkency founder and frequent wroclove.rb speaker. Referenced in the lightning talks as 'Andre', who convinced Adam to... Arkency founder, wroclove.rb organizer, and frequent speaker. Former Java developer from the agile-code-quality wing ...
update Arkency company
description Ruby consultancy that maintains rails_event_store and related gems. Granted the speaker direct slack access and commi... Ruby consultancy founded by Andrzej Krzywda that maintains rails_event_store, the aggregate_root gem, and the aggrega...
create Plain Old Java Object concept
kind (empty) concept
name (empty) Plain Old Java Object
slug (empty) plain-old-java-object
attrs (empty) {"category" => "practice"}
description (empty) Term from the early-2000s Java community (POJO) for business classes that are not bogged down by framework extensions...
short_description (empty) Java business class with no framework or library imports.
create Java tool
kind (empty) tool
name (empty) Java
slug (empty) java
attrs (empty) {"category" => "language"}
description (empty) Programming language in which Krzywda worked before switching to Ruby. He was part of the Java community's agile/code...
short_description (empty) General-purpose object-oriented programming language.
create aggregate_root tool
kind (empty) tool
name (empty) aggregate_root
slug (empty) aggregate_root
attrs (empty) {"category" => "library"}
description (empty) Ruby gem from Arkency (ships with rails_event_store) that provides a small module to build event-sourced aggregates —...
short_description (empty) Arkency Ruby gem for building event-sourced aggregates.
create aggregates repository project
kind (empty) project
name (empty) aggregates repository
slug (empty) aggregates-repository
attrs (empty) {"status" => "active", "license" => "open-source", "repository" => "github.com/arkency/aggregates"}
description (empty) Repository originally created privately at Arkency by Paweł for the Rails Architect Master Class. Contains multiple i...
short_description (empty) Arkency reference repo comparing implementations of a JIRA-like aggregate.
create State Machine concept
kind (empty) concept
name (empty) State Machine
slug (empty) state-machine
attrs (empty) {"category" => "pattern"}
description (empty) Pattern where an object has a finite set of states and a set of permitted transitions between them. Krzywda argues bu...
short_description (empty) Model of system behavior as states and permitted transitions.
create Polymorphic Aggregate concept
kind (empty) concept
name (empty) Polymorphic Aggregate
slug (empty) polymorphic-aggregate
attrs (empty) {"category" => "pattern"}
description (empty) Implementation technique inspired by Szymon Kulec's functional aggregate blog series. Instead of a single issue class...
short_description (empty) Aggregate split into one class per state, each exposing only valid transitions.
create Duck Typing concept
kind (empty) concept
name (empty) Duck Typing
slug (empty) duck-typing
attrs (empty) {"category" => "pattern"}
description (empty) Ruby technique where callers rely on whether an object responds to a given message rather than on its class. Krzywda ...
short_description (empty) Ruby dispatch style based on whether an object responds to a method.
create Read-Write Split concept
kind (empty) concept
name (empty) Read-Write Split
slug (empty) read-write-split
attrs (empty) {"category" => "pattern"}
description (empty) Krzywda's refactoring recipe for shrinking Active Record models: split each model into a write object (decisions only...
short_description (empty) Splitting Active Record models into write-side decision objects and read-side display objects.
create Rails Architect Master Class resource
kind (empty) resource
name (empty) Rails Architect Master Class
slug (empty) rails-architect-master-class
attrs (empty) {"type" => "course"}
description (empty) Arkency master class aimed at developers who want to understand DDD, CQRS, and related patterns. Internal preparation...
short_description (empty) Arkency training program on DDD, CQRS, and event sourcing in Rails.
create Paweł Pacana person
kind (empty) person
name (empty) Paweł Pacana
slug (empty) pawel-pacana
attrs (empty) {"role" => "developer"}
description (empty) Arkency developer (referred to in the talk as 'Pavel') who created the internal 'aggregates' repository, structuring ...
short_description (empty) Arkency developer; creator of the aggregates reference repository.
create Szymon Kulec person
kind (empty) person
name (empty) Szymon Kulec
slug (empty) szymon-kulec
description (empty) Polish programmer from the .NET community (rendered as 'Shimon culottes' in the transcript) who wrote a blog-post ser...
short_description (empty) .NET developer and blogger on functional aggregates.
update Markus Schirp person
description Creator of Mutant — mutation testing tool for Ruby. Creator of Mutant, the mutation-testing tool for Ruby. Ran a mutation-testing workshop at wroclove.rb 2019. Krzywda c...
create Mutant tool
kind (empty) tool
name (empty) Mutant
slug (empty) mutant
attrs (empty) {"category" => "tool"}
description (empty) Ruby mutation-testing tool. The 'aggregates' repository ships a mutation-testing script so contributors can run Mutan...
short_description (empty) Mutation testing tool for Ruby created by Markus Schirp.
update Nathan Ladd person
description Conference speaker. Conference speaker. At wroclove.rb 2018 gave a talk critiquing aggregates and their coupling to events, which signifi...
short_description Conference speaker. Ruby conference speaker, Eventide co-maintainer.
create JIRA tool
kind (empty) tool
name (empty) JIRA
slug (empty) jira
attrs (empty) {"category" => "service"}
description (empty) Atlassian issue tracker. Used in the 'aggregates' repository as a realistic, business-friendly example domain: the is...
short_description (empty) Atlassian issue tracker used as a business-logic modeling example.
create Business logic is mostly about state machines takeaway
kind (empty) takeaway
name (empty) Business logic is mostly about state machines
slug (empty) business-logic-is-mostly-about-state-machines
attrs (empty) {"type" => "insight"}
description (empty) Krzywda's central claim: once you strip away persistence, events, and framework plumbing, almost all business logic i...
short_description (empty) Most business logic reduces to state machines that can be implemented without libraries.
create Split Active Record into write and read objects takeaway
kind (empty) takeaway
name (empty) Split Active Record into write and read objects
slug (empty) split-active-record-into-write-and-read-objects
attrs (empty) {"type" => "recommendation"}
description (empty) Practical refactoring: turn each Active Record model into two objects. The write object contains only the business de...
short_description (empty) Extract decisions into a pure write object; leave display/associations to Active Record.
create Keep business classes free of framework dependencies takeaway
kind (empty) takeaway
name (empty) Keep business classes free of framework dependencies
slug (empty) keep-business-classes-free-of-framework-dependencies
attrs (empty) {"type" => "recommendation"}
description (empty) Carried over from Krzywda's Java/POJO background: business classes should not import or include framework/library cod...
short_description (empty) Don't infect business objects with framework or library imports.
create Contribute to Arkency aggregates repository takeaway
kind (empty) takeaway
name (empty) Contribute to Arkency aggregates repository
slug (empty) contribute-to-arkency-aggregates-repository
attrs (empty) {"type" => "recommendation"}
description (empty) Call to action at the end of the talk: the 'aggregates' repository on Arkency's GitHub is now public, and the structu...
short_description (empty) Add new aggregate implementations to the public Arkency aggregates repo.

Edges (51)

create Business logic in RubyaboutPlain Old Java Object
context (empty) Krzywda frames his ideal (business classes free of library imports) through the Java POJO tradition.
relation (empty) about
source_node_id (empty) cce5665c-3d3d-473a-9eab-170d47c868a7
target_node_id (empty) 33972900-98f7-48fb-9bb9-edf1d7eb123a
create Business logic in RubyaboutDomain-Driven Design
context (empty) Arkency adopted DDD terminology ('aggregates') for their business-logic classes.
relation (empty) about
source_node_id (empty) cce5665c-3d3d-473a-9eab-170d47c868a7
target_node_id (empty) 6e2f88bd-e521-41a3-91d4-aeb5f8fd2486
create Business logic in RubyaboutDuck Typing
context (empty) Third implementation uses respond_to? checks as a duck-typing style of dispatch.
relation (empty) about
source_node_id (empty) cce5665c-3d3d-473a-9eab-170d47c868a7
target_node_id (empty) ba1b876d-f3aa-4e60-aab2-5b33047ba9d2
update Andrzej KrzywdaauthoredBusiness logic in Ruby
context (empty) Krzywda introduces himself as both organizer and speaker and delivers this talk.
update Business logic in Rubypresented_atwroclove.rb 2019
context (empty) Talk delivered at wroclove.rb 2019.
create Andrzej Krzywdaattendedwroclove.rb 2019
attrs (empty) {"role" => "organizer"}
context (empty) Co-organizer and speaker at the conference.
relation (empty) attended
source_node_id (empty) 337ffd2c-5847-4b23-9ef7-e8f70aa4c66a
target_node_id (empty) 8bcc988a-785d-4dfa-a063-1daa7ba349c0
update Andrzej Krzywdaworks_atArkency
context Founder of Arkency. Founder of Arkency; refers to 'our Arkency' when describing internal discussions.
create Paweł Pacanaworks_atArkency
context (empty) Arkency developer who created the internal aggregates repository.
relation (empty) works_at
source_node_id (empty) 5e812f9d-e89d-4969-83f1-9d9fdfd36436
target_node_id (empty) f8b4b616-ffd6-4eaa-a7b9-fdc07bb2cb27
create Paweł Pacanaworks_onaggregates repository
attrs (empty) {"role" => "creator"}
context (empty) Created the repository internally and structured it to host multiple implementations under a shared test suite.
relation (empty) works_on
source_node_id (empty) 5e812f9d-e89d-4969-83f1-9d9fdfd36436
target_node_id (empty) 2c1f344a-3a1f-40e9-b298-769fc3f41873
create Arkencyworks_onaggregates repository
context (empty) Repository belongs to Arkency; made public on Arkency's GitHub during the talk.
relation (empty) works_on
source_node_id (empty) f8b4b616-ffd6-4eaa-a7b9-fdc07bb2cb27
target_node_id (empty) 2c1f344a-3a1f-40e9-b298-769fc3f41873
create Arkencyworks_onaggregate_root
context (empty) aggregate_root is Arkency's own gem shipped with rails_event_store.
relation (empty) works_on
source_node_id (empty) f8b4b616-ffd6-4eaa-a7b9-fdc07bb2cb27
target_node_id (empty) 570146e3-03be-459c-8ceb-e88dad04ef52
update Arkencyworks_onrails_event_store
context Arkency maintains Rails Event Store. Arkency maintains rails_event_store, which ships the aggregate_root gem.
create Arkencyworks_onRails Architect Master Class
context (empty) Arkency runs the Rails Architect Master Class, the context in which the aggregates repo was created.
relation (empty) works_on
source_node_id (empty) f8b4b616-ffd6-4eaa-a7b9-fdc07bb2cb27
target_node_id (empty) d96cb020-912e-47a5-b770-ed05f25af75e
create Andrzej Krzywdaworks_onRails Architect Master Class
attrs (empty) {"role" => "instructor"}
context (empty) Teaches the master class; it triggered creation of the aggregates repository.
relation (empty) works_on
source_node_id (empty) 337ffd2c-5847-4b23-9ef7-e8f70aa4c66a
target_node_id (empty) d96cb020-912e-47a5-b770-ed05f25af75e
create Business logic in Rubyaboutaggregates repository
context (empty) The talk walks through multiple implementations from this repository and announces its public release.
relation (empty) about
source_node_id (empty) cce5665c-3d3d-473a-9eab-170d47c868a7
target_node_id (empty) 2c1f344a-3a1f-40e9-b298-769fc3f41873
create Business logic in RubyaboutState Machine
context (empty) Central claim: business logic is mostly about state machines; the JIRA issue example is a state machine.
relation (empty) about
source_node_id (empty) cce5665c-3d3d-473a-9eab-170d47c868a7
target_node_id (empty) f12d397b-1144-4c0b-b90d-3fde61472b70
create Business logic in RubyaboutAggregate Root
context (empty) First implementation uses the aggregate_root gem and the aggregate-root pattern from DDD.
relation (empty) about
source_node_id (empty) cce5665c-3d3d-473a-9eab-170d47c868a7
target_node_id (empty) 09c37511-f144-42de-a3e8-abae18862f96
create Business logic in RubyaboutActive Record
context (empty) Discusses the coupling and 'infinite API' problems of inheriting from ActiveRecord::Base.
relation (empty) about
source_node_id (empty) cce5665c-3d3d-473a-9eab-170d47c868a7
target_node_id (empty) 633eeea8-2026-4906-b512-1e239f3db152
create Business logic in RubyaboutPolymorphic Aggregate
context (empty) Second implementation has one class per state, inspired by Szymon Kulec's functional aggregates.
relation (empty) about
source_node_id (empty) cce5665c-3d3d-473a-9eab-170d47c868a7
target_node_id (empty) 068ac2f7-cb04-4f42-a3e8-e7590dd2be2a
create Business logic in RubyaboutRead-Write Split
context (empty) Describes splitting Active Record models into decision-making write objects and display-oriented read objects.
relation (empty) about
source_node_id (empty) cce5665c-3d3d-473a-9eab-170d47c868a7
target_node_id (empty) a57b1a6b-9999-459b-8969-eb568b2cfaa3
create Business logic in RubyaboutEvent Sourcing
context (empty) First implementation uses event sourcing via aggregate_root; later implementations move events out of the aggregate.
relation (empty) about
source_node_id (empty) cce5665c-3d3d-473a-9eab-170d47c868a7
target_node_id (empty) 687c9da2-de87-4fb2-a758-c7498f394fd5
create Business logic in RubyaboutCQRS
context (empty) The read/write split motivates reading via Active Record and writing via pure aggregates — a CQRS shape.
relation (empty) about
source_node_id (empty) cce5665c-3d3d-473a-9eab-170d47c868a7
target_node_id (empty) 8918002a-9def-4449-a187-e3052bf175b5
create Business logic in Rubyaboutaggregate_root
context (empty) First implementation relies on Arkency's aggregate_root module for event sourcing.
relation (empty) about
source_node_id (empty) cce5665c-3d3d-473a-9eab-170d47c868a7
target_node_id (empty) 570146e3-03be-459c-8ceb-e88dad04ef52
create Business logic in RubyaboutJIRA
context (empty) The aggregate example in the repository models JIRA issue states and transitions.
relation (empty) about
source_node_id (empty) cce5665c-3d3d-473a-9eab-170d47c868a7
target_node_id (empty) 269a1523-fc04-4286-8c81-890a5e423d7a
create Business logic in RubyaboutMutant
context (empty) The repository includes a mutation-testing script using Mutant, which exposed flaws in the modeled state machine.
relation (empty) about
source_node_id (empty) cce5665c-3d3d-473a-9eab-170d47c868a7
target_node_id (empty) ab45ac79-e626-4dbb-b938-be653956e6e5
create Business logic in RubyaboutRuby on Rails
context (empty) Narrative starts from the early Rails experience of inheriting from ActiveRecord::Base.
relation (empty) about
source_node_id (empty) cce5665c-3d3d-473a-9eab-170d47c868a7
target_node_id (empty) 7aac705a-0987-49f2-b665-9d4e08a6acee
create Business logic in RubyaboutRuby
context (empty) All implementations are in Ruby; discusses idiomatic Ruby (duck typing).
relation (empty) about
source_node_id (empty) cce5665c-3d3d-473a-9eab-170d47c868a7
target_node_id (empty) c7f25b33-06c9-460e-aca7-fe993123ebee
create aggregate_rootrelated_torails_event_store
context (empty) aggregate_root is the gem Arkency ships for building event-sourced aggregates on top of rails_event_store.
relation (empty) related_to
source_node_id (empty) 570146e3-03be-459c-8ceb-e88dad04ef52
target_node_id (empty) 9e5cb718-6f86-4937-9b4c-eb77da3aede8
create aggregates repositoryusesaggregate_root
context (empty) One of the implementations in the repository uses the aggregate_root gem.
relation (empty) uses
source_node_id (empty) 2c1f344a-3a1f-40e9-b298-769fc3f41873
target_node_id (empty) 570146e3-03be-459c-8ceb-e88dad04ef52
create aggregates repositoryusesMutant
context (empty) Repository ships a script to run mutation testing against implementations.
relation (empty) uses
source_node_id (empty) 2c1f344a-3a1f-40e9-b298-769fc3f41873
target_node_id (empty) ab45ac79-e626-4dbb-b938-be653956e6e5
create aggregates repositoryaboutJIRA
context (empty) Uses a JIRA-like issue lifecycle as the non-trivial business example.
relation (empty) about
source_node_id (empty) 2c1f344a-3a1f-40e9-b298-769fc3f41873
target_node_id (empty) 269a1523-fc04-4286-8c81-890a5e423d7a
create Polymorphic Aggregaterelated_toState Machine
context (empty) Encodes state into the type system by using one class per state.
relation (empty) related_to
source_node_id (empty) 068ac2f7-cb04-4f42-a3e8-e7590dd2be2a
target_node_id (empty) f12d397b-1144-4c0b-b90d-3fde61472b70
create Read-Write Splitrelated_toCQRS
context (empty) Separating decision-making write objects from display-oriented read objects is a form of command-query separation.
relation (empty) related_to
source_node_id (empty) a57b1a6b-9999-459b-8969-eb568b2cfaa3
target_node_id (empty) 8918002a-9def-4449-a187-e3052bf175b5
create Read-Write Splitrelated_toActive Record
context (empty) Proposed specifically as a way to shrink bloated Active Record models.
relation (empty) related_to
source_node_id (empty) a57b1a6b-9999-459b-8969-eb568b2cfaa3
target_node_id (empty) 633eeea8-2026-4906-b512-1e239f3db152
create Andrzej Krzywdahas_skillJava
attrs (empty) {"level" => "expert"}
context (empty) Former Java developer in the agile/code-quality wing of the community before moving to Ruby.
relation (empty) has_skill
source_node_id (empty) 337ffd2c-5847-4b23-9ef7-e8f70aa4c66a
target_node_id (empty) cdbc1aa7-a335-4041-a41e-afc95c3b42d5
create Andrzej KrzywdausesRuby on Rails
context (empty) Switched from Java to Rails around 2004 and has worked in Rails ever since.
relation (empty) uses
source_node_id (empty) 337ffd2c-5847-4b23-9ef7-e8f70aa4c66a
target_node_id (empty) 7aac705a-0987-49f2-b665-9d4e08a6acee
create Andrzej KrzywdarecommendsDomain-Driven Design
context (empty) Arkency adopted DDD and refers to business-logic classes as aggregates.
relation (empty) recommends
source_node_id (empty) 337ffd2c-5847-4b23-9ef7-e8f70aa4c66a
target_node_id (empty) 6e2f88bd-e521-41a3-91d4-aeb5f8fd2486
create Andrzej KrzywdarecommendsPlain Old Java Object
context (empty) Holds up the POJO ideal — business classes free of framework imports — as the standard to aspire to in Ruby.
relation (empty) recommends
source_node_id (empty) 337ffd2c-5847-4b23-9ef7-e8f70aa4c66a
target_node_id (empty) 33972900-98f7-48fb-9bb9-edf1d7eb123a
create Andrzej KrzywdarecommendsState Machine
context (empty) Argues most business logic is a state machine and should be implemented as such without libraries.
relation (empty) recommends
source_node_id (empty) 337ffd2c-5847-4b23-9ef7-e8f70aa4c66a
target_node_id (empty) f12d397b-1144-4c0b-b90d-3fde61472b70
create Andrzej Krzywdarecommendsaggregates repository
context (empty) Invites the audience to explore and contribute to the newly public repository.
relation (empty) recommends
source_node_id (empty) 337ffd2c-5847-4b23-9ef7-e8f70aa4c66a
target_node_id (empty) 2c1f344a-3a1f-40e9-b298-769fc3f41873
create Markus Schirpattendedwroclove.rb 2019
context (empty) Ran a mutation-testing workshop at wroclove.rb 2019, referenced by Krzywda during the talk.
relation (empty) attended
source_node_id (empty) 6d1416eb-8271-4024-8c67-28d9e5513683
target_node_id (empty) 8bcc988a-785d-4dfa-a063-1daa7ba349c0
create Markus SchirpauthoredMutant
context (empty) Schirp is the creator of Mutant.
relation (empty) authored
source_node_id (empty) 6d1416eb-8271-4024-8c67-28d9e5513683
target_node_id (empty) ab45ac79-e626-4dbb-b938-be653956e6e5
create Business logic is mostly about state machinesfrom_talkBusiness logic in Ruby
context (empty) Central thesis stated explicitly in the talk.
relation (empty) from_talk
source_node_id (empty) a98c7e16-2ea6-41c7-a831-2bb808102dfc
target_node_id (empty) cce5665c-3d3d-473a-9eab-170d47c868a7
create Split Active Record into write and read objectsfrom_talkBusiness logic in Ruby
context (empty) Refactoring recipe presented in the talk.
relation (empty) from_talk
source_node_id (empty) ad631ed2-7758-4a4e-8b91-b0034ad728be
target_node_id (empty) cce5665c-3d3d-473a-9eab-170d47c868a7
create Keep business classes free of framework dependenciesfrom_talkBusiness logic in Ruby
context (empty) Recurring principle driving the progression of implementations.
relation (empty) from_talk
source_node_id (empty) 9d41cbbd-4cd1-472f-874e-6232cb19717d
target_node_id (empty) cce5665c-3d3d-473a-9eab-170d47c868a7
create Contribute to Arkency aggregates repositoryfrom_talkBusiness logic in Ruby
context (empty) Explicit call to action at the end of the talk.
relation (empty) from_talk
source_node_id (empty) e44ac977-1cf3-479f-a035-e862a3dc7281
target_node_id (empty) cce5665c-3d3d-473a-9eab-170d47c868a7
create Business logic is mostly about state machinesaboutState Machine
context (empty) The takeaway is that business logic reduces to state machines.
relation (empty) about
source_node_id (empty) a98c7e16-2ea6-41c7-a831-2bb808102dfc
target_node_id (empty) f12d397b-1144-4c0b-b90d-3fde61472b70
create Split Active Record into write and read objectsaboutActive Record
context (empty) Addresses the problem of bloated Active Record models.
relation (empty) about
source_node_id (empty) ad631ed2-7758-4a4e-8b91-b0034ad728be
target_node_id (empty) 633eeea8-2026-4906-b512-1e239f3db152
create Split Active Record into write and read objectsaboutRead-Write Split
context (empty) Direct formulation of the read-write split pattern.
relation (empty) about
source_node_id (empty) ad631ed2-7758-4a4e-8b91-b0034ad728be
target_node_id (empty) a57b1a6b-9999-459b-8969-eb568b2cfaa3
create Keep business classes free of framework dependenciesaboutPlain Old Java Object
context (empty) Applies the POJO principle to Ruby business objects.
relation (empty) about
source_node_id (empty) 9d41cbbd-4cd1-472f-874e-6232cb19717d
target_node_id (empty) 33972900-98f7-48fb-9bb9-edf1d7eb123a
create Contribute to Arkency aggregates repositoryaboutaggregates repository
context (empty) Invites contributions to the public repository.
relation (empty) about
source_node_id (empty) e44ac977-1cf3-479f-a035-e862a3dc7281
target_node_id (empty) 2c1f344a-3a1f-40e9-b298-769fc3f41873

Read set

111 nodes

person Andrzej Krzywda search_nodes company Arkency search_nodes person Adam Okoń search_nodes talk Events events events search_nodes talk Business logic in Ruby search_nodes+get_node_edges concept Nested Aggregates search_nodes project granite search_nodes concept Active Record search_nodes tool Ruby Event Store search_nodes tool rails_event_store search_nodes talk Working with RailsEventStore in Cashflow Management System search_nodes talk Event Sourcing and Actor model in Ruby search_nodes talk Multi-region data governance in Rails application search_nodes talk Forms Are Dead: Building Agentic Workflows in Ruby search_nodes event wroclove.rb 2019 search_nodes event wroclove.rb 2018 search_nodes event wroclove.rb 2024 search_nodes event wroclove.rb 2022 search_nodes event wroclove.rb 2023 search_nodes event wroclove.rb 2025 search_nodes event wroclove.rb 2026 search_nodes talk Building LLM powered applications in Ruby search_nodes talk Towards the post framework future search_nodes concept Event Sourcing search_nodes concept Aggregate Root search_nodes concept Event Store search_nodes concept Snapshotting search_nodes question How to persist commands in an event-sourced system? search_nodes takeaway Use CQRS And Event Sourcing Independently search_nodes talk Event Sourcing Anti Patterns and Failures search_nodes talk Setup and operation of mutation testing in agentic world search_nodes concept Breadth-First Search for Code Removal search_nodes question How to detect coupling in a large existing project? search_nodes takeaway Replay-Based Debugging search_nodes tool git bisect search_nodes person Markus Schirp search_nodes talk My core skill never was the typing search_nodes talk An Introduction to Test Bench search_nodes takeaway Metrics Alone Don't Fix a Coupled Legacy Codebase search_nodes takeaway Stable commits enable bisect search_nodes resource Implementing Domain-Driven Design search_nodes concept Domain-Driven Design search_nodes resource Domain-Driven Design: Patterns, Principles and Practices search_nodes concept CQRS search_nodes talk The pillars of Domain Driven Design search_nodes talk Might & Magic of Domain-Driven Design search_nodes question Does DDD require object-oriented programming? search_nodes resource Domain-Driven Rails search_nodes question How to apply DDD when the client refuses to learn ubiquitous language? search_nodes talk Fix Production Bugs 20x Faster search_nodes tool RealtimeBoard search_nodes talk Is the monolith a problem search_nodes takeaway Silver Bullet Anti-Pattern search_nodes concept Cynefin Framework search_nodes concept Waterfall Analysis search_nodes concept Pipeline Operator search_nodes person Nathan Ladd search_nodes project Eventide search_nodes resource Rocket Real-Time Benchmark search_nodes tool Ruby on Rails search_nodes person DHH search_nodes concept Majestic Monolith search_nodes tool Heroku search_nodes talk When REST is Not Enough: Implementing Alternative Protocols in Ruby on Rails search_nodes tool Ruby search_nodes talk Toolbelt of a Seasoned Bug Hunter search_nodes talk How wroclove.rb impacts developers and companies search_nodes talk Securing Rails applications search_nodes talk Building Rails SPAs in Frontend Ruby with Glimmer DSL for Web search_nodes concept Ruby Module Customization Mechanics search_nodes person Akira Matsuda search_nodes concept Method References in Ruby search_nodes tool ruby-contracts search_nodes tool dry-types search_nodes concept Refinements search_nodes takeaway Use Refinements for Coordinated Modernization search_nodes tool dry-struct search_nodes concept Current State search_nodes concept Saga Pattern search_nodes concept Process Manager search_nodes concept Trailblazer Workflow search_nodes concept Railway Oriented Programming search_nodes concept BPMN search_nodes question When is a command considered processed? search_nodes concept Trailblazer Activity search_nodes talk Adventures in durable execution search_nodes concept Aggregate-Scoped Sequence Number search_nodes concept Idempotent Projectors and Reactors search_nodes concept Aggregator search_nodes talk Doctrine of Useful Objects Separate Fact from Fiction in OOD search_nodes concept Dependency Injection search_nodes concept Weasel Words search_nodes resource Object-Oriented Software Construction search_nodes concept Commands, Queries, and Events search_nodes concept DDD Whirlpool search_nodes concept Domain Storytelling search_nodes talk Rubyana Gems and the Ractorous Rubetta Stones! search_nodes talk Orchestrating video transcoding in ruby search_nodes question Would you recommend TypeScript or Flow? search_nodes tool Flow search_nodes tool GraphQL search_nodes takeaway Sign serverlessforruby.org petition search_nodes takeaway Time Travel Superpower search_nodes talk Building a Production-Ready AI App: MCP & OAuth on Rails search_nodes question Is MVC enough for a successful enterprise app? search_nodes talk No-build Utopia: Modern User Experiences with Rails & Web Standards search_nodes question What is an enterprise Rails application? search_nodes tool Cells search_nodes talk Testing Randomness search_nodes talk Introducing Sorbet into your Ruby codebase search_nodes question Can parts of Eventide, Rails Event Store and Trailblazer be combined in one project? search_nodes

2 edges