← Extractions

Testing Randomness — Jakub Rodzik at wroclove.rb 2023

Jakub Rodzik's wroclove.rb 2023 talk walks through a dice-game story-developer 'Fredo' who learns to test non-determinism by progressing from conditional tests, to stubs, to dependency injection with a fake dice, to event logging. Closes with tradeoffs of each technique and the core message: don't test randomness — understand it, extract it, and control it.

Model
claude-opus-4-7
Ingestion
2fe730c4
Input tokens
371,454
fresh
251,430
cached
110,777
cache write
9,247
Output tokens
11,782
Duration
184.0s
Roundtrips
9
Tool calls
24
Cost
$0.00
Nodes/edges extracted
21 / 43
Read set (nodes/edges)
135 / 4

Nodes (21)

update Testing Randomness talk
description Talk at wroclove.rb 2023. Jakub Rodzik's wroclove.rb 2023 talk, framed as a bedtime story about developer 'Fredo' writing a two-player dice gam...
short_description Talk at wroclove.rb 2023. Talk on testing non-deterministic code using stubs, dependency injection, and event logging.
update Jakub Rodzik person
description Conference speaker. Ruby developer and conference speaker. At wroclove.rb 2023 presented 'Testing Randomness', using a story about develo...
short_description Conference speaker. Ruby developer; wroclove.rb 2023 speaker on testing randomness.
create Test Driven Development concept
kind (empty) concept
name (empty) Test Driven Development
slug (empty) test-driven-development
attrs (empty) {"category" => "methodology"}
description (empty) Discipline of writing a failing test first, then implementing the minimum code to make it pass, then refactoring. In ...
short_description (empty) Practice of writing tests before production code and letting them drive design.
create Open-Closed Principle concept
kind (empty) concept
name (empty) Open-Closed Principle
slug (empty) open-closed-principle
attrs (empty) {"category" => "pattern"}
description (empty) The 'O' in SOLID — software entities should be open for extension but closed for modification. In Rodzik's talk, 'Fre...
short_description (empty) SOLID principle: software entities should be open for extension, closed for modification.
create Fake Object concept
kind (empty) concept
name (empty) Fake Object
slug (empty) fake-object
attrs (empty) {"category" => "pattern"}
description (empty) A test double implemented as a full class (not just a stub on a method) that mimics the interface of a production col...
short_description (empty) Test double implemented as a real class with controllable behavior replacing a collaborator.
create Event Logging for Testability concept
kind (empty) concept
name (empty) Event Logging for Testability
slug (empty) event-logging-for-testability
attrs (empty) {"category" => "practice"}
description (empty) Technique of appending an entry to an events/audit log on every state change (dice rolls, winner assignment, etc.) so...
short_description (empty) Recording state-change events so tests and operators can assert on what actually happened.
create Logic in Tests concept
kind (empty) concept
name (empty) Logic in Tests
slug (empty) logic-in-tests
attrs (empty) {"category" => "practice"}
description (empty) Anti-pattern covered in Rodzik's talk. Tests that contain conditionals (`if p1_score > p2_score then expect ping else...
short_description (empty) Anti-pattern of putting conditionals, loops, or production helpers inside test code.
create Time.current Testing Trap concept
kind (empty) concept
name (empty) Time.current Testing Trap
slug (empty) time-current-testing-trap
attrs (empty) {"category" => "practice"}
description (empty) Pattern Rodzik singles out at the end of the talk: `Time.current` (or `Time.now`) looks simple but is functionally a ...
short_description (empty) Using Time.current/Time.now as a hidden source of non-determinism in tests.
create RBS tool
kind (empty) tool
name (empty) RBS
slug (empty) rbs
attrs (empty) {"category" => "tool"}
description (empty) Ruby's official type-signature system (`.rbs` files). Suggested by an audience member in the Testing Randomness Q&A a...
short_description (empty) Ruby's official type-signature language.
create Datadog tool
kind (empty) tool
name (empty) Datadog
slug (empty) datadog
attrs (empty) {"category" => "service"}
description (empty) Observability SaaS mentioned in Rodzik's talk as one place where events/state-change logs can be stored — with the ca...
short_description (empty) SaaS observability platform for metrics, logs and traces.
create Sumo Logic tool
kind (empty) tool
name (empty) Sumo Logic
slug (empty) sumo-logic
attrs (empty) {"category" => "service"}
description (empty) Log-management SaaS mentioned in Rodzik's talk as a destination for event logs, with a warning that extensive logging...
short_description (empty) SaaS log management and analytics platform.
create Practical Object-Oriented Design in Ruby resource
kind (empty) resource
name (empty) Practical Object-Oriented Design in Ruby
slug (empty) practical-object-oriented-design-in-ruby
attrs (empty) {"type" => "book"}
description (empty) Sandi Metz's book on object-oriented design in Ruby, commonly abbreviated POODR. Rodzik references it (alongside 99 B...
short_description (empty) Sandi Metz's foundational book on OO design in Ruby (POODR).
create 99 Bottles of OOP resource
kind (empty) resource
name (empty) 99 Bottles of OOP
slug (empty) 99-bottles-of-oop
attrs (empty) {"type" => "book"}
description (empty) Book by Sandi Metz and Katrina Owen on incremental object-oriented design and refactoring. Rodzik cites it as a sourc...
short_description (empty) Sandi Metz and Katrina Owen's book on incremental OO refactoring.
create Don't test randomness — understand, extract, control it takeaway
kind (empty) takeaway
name (empty) Don't test randomness — understand, extract, control it
slug (empty) don-t-test-randomness-understand-extract-control-it
attrs (empty) {"type" => "recommendation"}
description (empty) Rodzik's closing prescription for testing non-deterministic code: don't try to test randomness directly. Instead unde...
short_description (empty) Closing message: rather than testing random output, isolate randomness behind an abstraction you can control.
create Avoid logic in tests takeaway
kind (empty) takeaway
name (empty) Avoid logic in tests
slug (empty) avoid-logic-in-tests
attrs (empty) {"type" => "warning"}
description (empty) Logic inside tests — if/else branches mirroring production, loops that mechanically multiply assertions, or calls to ...
short_description (empty) Conditionals, loops, and production helpers inside tests produce green-but-wrong suites.
create Inject test doubles via dependency injection takeaway
kind (empty) takeaway
name (empty) Inject test doubles via dependency injection
slug (empty) inject-test-doubles-via-dependency-injection
attrs (empty) {"type" => "recommendation"}
description (empty) When stubbing methods couples tests to implementation, extract an interface (e.g. `Dice`) and dependency-inject an im...
short_description (empty) Replace ad-hoc stubs with an injected fake collaborator behind an extracted interface.
create Log state changes to make tests assert on behavior takeaway
kind (empty) takeaway
name (empty) Log state changes to make tests assert on behavior
slug (empty) log-state-changes-to-make-tests-assert-on-behavior
attrs (empty) {"type" => "recommendation"}
description (empty) Recording an event on every state change (roll, assignment, winner decision) gives tests something richer than the fi...
short_description (empty) Append events on every state change so tests and debuggers can see the full execution trace.
create Keep fake implementations out of production code takeaway
kind (empty) takeaway
name (empty) Keep fake implementations out of production code
slug (empty) keep-fake-implementations-out-of-production-code
attrs (empty) {"type" => "recommendation"}
description (empty) Rodzik's personal rule: never ship fake implementations alongside production code, even if it means duplicating them ...
short_description (empty) Test doubles belong in the test suite, not shipped alongside production files.
create Are fake-dice tests enough, or should the real dice be tested too? question
kind (empty) question
name (empty) Are fake-dice tests enough, or should the real dice be tested too?
slug (empty) are-fake-dice-tests-enough-or-should-the-real-dice-be-tested-too
attrs (empty) {"answer_summary" => "Unit tests with fake dice are fine for the unit level, but real-world code should also have end...
description (empty) Audience asks whether tests using the fake dice are sufficient. Rodzik agrees that in the real world you should compl...
short_description (empty) Q&A on whether unit tests with fake dice need complementary end-to-end tests.
create Is time travel the only way to test Time.current? question
kind (empty) question
name (empty) Is time travel the only way to test Time.current?
slug (empty) is-time-travel-the-only-way-to-test-time-current
attrs (empty) {"answer_summary" => "No. Algebraic effects and dependency injection of a per-request current-time object are better ...
description (empty) An audience member challenges Rodzik's assertion that time-travel helpers are the only way to test `Time.current`/`Ti...
short_description (empty) Challenge to Rodzik's claim that time-travel helpers are the only way to test current-time code.
create Should fake implementations live with production code? question
kind (empty) question
name (empty) Should fake implementations live with production code?
slug (empty) should-fake-implementations-live-with-production-code
attrs (empty) {"answer_summary" => "Rodzik keeps fakes out of production code even at the cost of duplication. Audience adds: run t...
description (empty) Audience asks whether reusable test-only objects (fake dice, fake current-time) should live with production files so ...
short_description (empty) Q&A on where to keep reusable test-only objects like a fake dice or fake time.

Edges (43)

update Jakub RodzikauthoredTesting Randomness
context (empty) Presented the talk at wroclove.rb 2023.
update Testing Randomnesspresented_atwroclove.rb 2023
context (empty) Single-track Ruby conference where the talk was delivered.
create Jakub Rodzikattendedwroclove.rb 2023
context (empty) Spoke at the conference.
relation (empty) attended
source_node_id (empty) 7d93f41a-54c6-470a-90e3-895b8f2b5f92
target_node_id (empty) f1adcf6d-780c-4418-8a81-c88da8b4e631
create Testing RandomnessaboutTest Driven Development
context (empty) Fredo begins by writing RSpec tests first and labels his approach TDD.
relation (empty) about
source_node_id (empty) 29ada8a8-1437-4b9a-a87f-effe60e93a93
target_node_id (empty) 1c2ff90e-39e6-496e-b94d-6234d545033e
create Testing RandomnessaboutLogic in Tests
context (empty) First iteration of tests uses conditionals that mirror production logic, demonstrating the anti-pattern.
relation (empty) about
source_node_id (empty) 29ada8a8-1437-4b9a-a87f-effe60e93a93
target_node_id (empty) a231bdc6-11fd-4ac1-827f-a82c3acefa3e
create Testing RandomnessaboutStubs over Mocks
context (empty) Second iteration stubs `rand` with `allow(...).to receive(:rand).and_return(...)` and the talk analyzes the tradeoffs...
relation (empty) about
source_node_id (empty) 29ada8a8-1437-4b9a-a87f-effe60e93a93
target_node_id (empty) 6dc3fc23-bfbb-4939-a0e0-1e11a4c5426e
create Testing RandomnessaboutOpen-Closed Principle
context (empty) Third iteration applies OCP to extract a Dice abstraction so new dice variants don't require modifying the Game class.
relation (empty) about
source_node_id (empty) 29ada8a8-1437-4b9a-a87f-effe60e93a93
target_node_id (empty) 0b38b4a5-ea02-4abf-a40d-54674387398a
create Testing RandomnessaboutDependency Injection
context (empty) Injecting a FakeDice into Game is presented as the clean solution, and DI is named explicitly at the end of that sect...
relation (empty) about
source_node_id (empty) 29ada8a8-1437-4b9a-a87f-effe60e93a93
target_node_id (empty) 06941a97-6c62-4450-8f9a-16cf172f5dd8
create Testing RandomnessaboutFake Object
context (empty) FakeDice is introduced as a full class substituted for the real Dice.
relation (empty) about
source_node_id (empty) 29ada8a8-1437-4b9a-a87f-effe60e93a93
target_node_id (empty) 9dd74a65-29d6-491b-a049-bfdc0b52807c
create Testing RandomnessaboutEvent Logging for Testability
context (empty) Fourth iteration adds an events log on every state change so tests can assert on the execution trace.
relation (empty) about
source_node_id (empty) 29ada8a8-1437-4b9a-a87f-effe60e93a93
target_node_id (empty) 2c6ce9f3-c799-4d32-97d4-f1e26816f8cb
create Testing RandomnessaboutEvent Sourcing
context (empty) Rodzik notes event sourcing gives the event-log benefit 'for free'.
relation (empty) about
source_node_id (empty) 29ada8a8-1437-4b9a-a87f-effe60e93a93
target_node_id (empty) 687c9da2-de87-4fb2-a758-c7498f394fd5
create Testing RandomnessaboutDuck Typing
context (empty) FakeDice is justified with 'if it looks like a dice and rolls like a dice, it's a dice'.
relation (empty) about
source_node_id (empty) 29ada8a8-1437-4b9a-a87f-effe60e93a93
target_node_id (empty) ba1b876d-f3aa-4e60-aab2-5b33047ba9d2
create Testing RandomnessaboutTime.current Testing Trap
context (empty) Closing example: Time.current is a hidden random source and motivates the 'understand, extract, control' prescription.
relation (empty) about
source_node_id (empty) 29ada8a8-1437-4b9a-a87f-effe60e93a93
target_node_id (empty) 3d040983-41c9-47e0-837a-979aa39fc788
create Testing RandomnessaboutRSpec
context (empty) All examples are written in RSpec and use `allow`/`receive`/`instance_double`/time-travel helpers.
relation (empty) about
source_node_id (empty) 29ada8a8-1437-4b9a-a87f-effe60e93a93
target_node_id (empty) 91c45bda-6818-4a05-962e-8c4531264e44
create Testing RandomnessaboutRBS
context (empty) Audience Q&A suggests RBS to keep fake and production class signatures aligned.
relation (empty) about
source_node_id (empty) 29ada8a8-1437-4b9a-a87f-effe60e93a93
target_node_id (empty) bbf22e30-34ab-40fd-964c-783bf88a65a4
create Testing RandomnessaboutDatadog
context (empty) Mentioned as a possible destination for state-change events/metrics.
relation (empty) about
source_node_id (empty) 29ada8a8-1437-4b9a-a87f-effe60e93a93
target_node_id (empty) 1ac68a55-87d0-4b79-93cf-cbdb1e49d853
create Testing RandomnessaboutSumo Logic
context (empty) Mentioned as a log sink whose bill can balloon under heavy traffic.
relation (empty) about
source_node_id (empty) 29ada8a8-1437-4b9a-a87f-effe60e93a93
target_node_id (empty) e3fb62f3-7ff9-46c0-9065-4f1c8b84005f
create Testing RandomnessaboutPractical Object-Oriented Design in Ruby
context (empty) Cited (with 99 Bottles) as a source recommending running the same suite against both fake and real implementations.
relation (empty) about
source_node_id (empty) 29ada8a8-1437-4b9a-a87f-effe60e93a93
target_node_id (empty) 226c4a1d-b99d-4706-b999-4c24b9225a7a
create Testing Randomnessabout99 Bottles of OOP
context (empty) Cited alongside POODR as a source for the 'test both fake and real' technique.
relation (empty) about
source_node_id (empty) 29ada8a8-1437-4b9a-a87f-effe60e93a93
target_node_id (empty) e2def2e9-a91d-4329-b5b0-fd9a4f9c0a77
create Don't test randomness — understand, extract, control itfrom_talkTesting Randomness
context (empty) Closing prescription of the talk.
relation (empty) from_talk
source_node_id (empty) b27dfeee-e1f8-4adf-a202-1de82bea9024
target_node_id (empty) 29ada8a8-1437-4b9a-a87f-effe60e93a93
create Avoid logic in testsfrom_talkTesting Randomness
context (empty) Summary of the first-iteration analysis.
relation (empty) from_talk
source_node_id (empty) 36816310-8750-4cee-98ab-5b41014b8406
target_node_id (empty) 29ada8a8-1437-4b9a-a87f-effe60e93a93
create Inject test doubles via dependency injectionfrom_talkTesting Randomness
context (empty) Summary of the third-iteration analysis.
relation (empty) from_talk
source_node_id (empty) dc74e8cf-41bd-4dcf-9ba3-021bf26f3440
target_node_id (empty) 29ada8a8-1437-4b9a-a87f-effe60e93a93
create Log state changes to make tests assert on behaviorfrom_talkTesting Randomness
context (empty) Summary of the fourth-iteration analysis.
relation (empty) from_talk
source_node_id (empty) ad70c7aa-8263-4e3c-a6bc-86cfb554dbad
target_node_id (empty) 29ada8a8-1437-4b9a-a87f-effe60e93a93
create Keep fake implementations out of production codefrom_talkTesting Randomness
context (empty) Rodzik's stated personal rule, reinforced by Q&A.
relation (empty) from_talk
source_node_id (empty) 93578209-57fc-4c77-bcbe-b03570ec430b
target_node_id (empty) 29ada8a8-1437-4b9a-a87f-effe60e93a93
create Don't test randomness — understand, extract, control itaboutTime.current Testing Trap
context (empty) Closing example making the general principle concrete.
relation (empty) about
source_node_id (empty) b27dfeee-e1f8-4adf-a202-1de82bea9024
target_node_id (empty) 3d040983-41c9-47e0-837a-979aa39fc788
create Inject test doubles via dependency injectionaboutDependency Injection
context (empty) Recommendation is a direct application of DI to testing.
relation (empty) about
source_node_id (empty) dc74e8cf-41bd-4dcf-9ba3-021bf26f3440
target_node_id (empty) 06941a97-6c62-4450-8f9a-16cf172f5dd8
create Inject test doubles via dependency injectionaboutFake Object
context (empty) The injected collaborator is a fake implementation.
relation (empty) about
source_node_id (empty) dc74e8cf-41bd-4dcf-9ba3-021bf26f3440
target_node_id (empty) 9dd74a65-29d6-491b-a049-bfdc0b52807c
create Avoid logic in testsaboutLogic in Tests
context (empty) Recommendation targets this anti-pattern.
relation (empty) about
source_node_id (empty) 36816310-8750-4cee-98ab-5b41014b8406
target_node_id (empty) a231bdc6-11fd-4ac1-827f-a82c3acefa3e
create Log state changes to make tests assert on behavioraboutEvent Logging for Testability
context (empty) Recommendation is the practice itself.
relation (empty) about
source_node_id (empty) ad70c7aa-8263-4e3c-a6bc-86cfb554dbad
target_node_id (empty) 2c6ce9f3-c799-4d32-97d4-f1e26816f8cb
create Log state changes to make tests assert on behavioraboutEvent Sourcing
context (empty) Rodzik notes event sourcing provides the event log automatically.
relation (empty) about
source_node_id (empty) ad70c7aa-8263-4e3c-a6bc-86cfb554dbad
target_node_id (empty) 687c9da2-de87-4fb2-a758-c7498f394fd5
create Are fake-dice tests enough, or should the real dice be tested too?asked_atTesting Randomness
context (empty) Audience question during Q&A.
relation (empty) asked_at
source_node_id (empty) 5a72e2cb-0ac3-4ed3-8f86-bfdb4926f4f0
target_node_id (empty) 29ada8a8-1437-4b9a-a87f-effe60e93a93
create Is time travel the only way to test Time.current?asked_atTesting Randomness
context (empty) Audience challenged the 'only option' claim about time-travel helpers.
relation (empty) asked_at
source_node_id (empty) 22356144-96be-42ce-94f0-cf571659485e
target_node_id (empty) 29ada8a8-1437-4b9a-a87f-effe60e93a93
create Should fake implementations live with production code?asked_atTesting Randomness
context (empty) Audience question during Q&A.
relation (empty) asked_at
source_node_id (empty) 79895da2-f9fa-496d-94f3-2b327531483a
target_node_id (empty) 29ada8a8-1437-4b9a-a87f-effe60e93a93
create Are fake-dice tests enough, or should the real dice be tested too?aboutFake Object
context (empty) Asks about the scope where fakes are sufficient.
relation (empty) about
source_node_id (empty) 5a72e2cb-0ac3-4ed3-8f86-bfdb4926f4f0
target_node_id (empty) 9dd74a65-29d6-491b-a049-bfdc0b52807c
create Is time travel the only way to test Time.current?aboutTime.current Testing Trap
context (empty) Discusses how to properly test current-time dependencies.
relation (empty) about
source_node_id (empty) 22356144-96be-42ce-94f0-cf571659485e
target_node_id (empty) 3d040983-41c9-47e0-837a-979aa39fc788
create Is time travel the only way to test Time.current?aboutDependency Injection
context (empty) Proposes DI of a current-time object as an alternative to time-travel helpers.
relation (empty) about
source_node_id (empty) 22356144-96be-42ce-94f0-cf571659485e
target_node_id (empty) 06941a97-6c62-4450-8f9a-16cf172f5dd8
create Should fake implementations live with production code?aboutFake Object
context (empty) Asks where fake implementations should physically reside.
relation (empty) about
source_node_id (empty) 79895da2-f9fa-496d-94f3-2b327531483a
target_node_id (empty) 9dd74a65-29d6-491b-a049-bfdc0b52807c
create Should fake implementations live with production code?aboutPractical Object-Oriented Design in Ruby
context (empty) Referenced in the answer as a source for the 'test both fake and real' approach.
relation (empty) about
source_node_id (empty) 79895da2-f9fa-496d-94f3-2b327531483a
target_node_id (empty) 226c4a1d-b99d-4706-b999-4c24b9225a7a
create Should fake implementations live with production code?about99 Bottles of OOP
context (empty) Referenced in the answer as a source for the 'test both fake and real' approach.
relation (empty) about
source_node_id (empty) 79895da2-f9fa-496d-94f3-2b327531483a
target_node_id (empty) e2def2e9-a91d-4329-b5b0-fd9a4f9c0a77
create Should fake implementations live with production code?aboutRBS
context (empty) Follow-up audience suggestion to use RBS to keep real and fake signatures aligned.
relation (empty) about
source_node_id (empty) 79895da2-f9fa-496d-94f3-2b327531483a
target_node_id (empty) bbf22e30-34ab-40fd-964c-783bf88a65a4
create Jakub RodzikusesRSpec
context (empty) All examples in the talk are written in RSpec.
relation (empty) uses
source_node_id (empty) 7d93f41a-54c6-470a-90e3-895b8f2b5f92
target_node_id (empty) 91c45bda-6818-4a05-962e-8c4531264e44
create Jakub RodzikrecommendsPractical Object-Oriented Design in Ruby
context (empty) Cited approvingly for the 'run the same suite against fake and real' approach.
relation (empty) recommends
source_node_id (empty) 7d93f41a-54c6-470a-90e3-895b8f2b5f92
target_node_id (empty) 226c4a1d-b99d-4706-b999-4c24b9225a7a
create Jakub Rodzikrecommends99 Bottles of OOP
context (empty) Cited approvingly for the 'run the same suite against fake and real' approach.
relation (empty) recommends
source_node_id (empty) 7d93f41a-54c6-470a-90e3-895b8f2b5f92
target_node_id (empty) e2def2e9-a91d-4329-b5b0-fd9a4f9c0a77

Read set

135 nodes

talk Testing Randomness search_nodes+get_node_edges resource HotBits search_nodes takeaway Replay-Based Debugging search_nodes tool Faker search_nodes resource Rocket Real-Time Benchmark search_nodes tool ChatGPT search_nodes tool Sonic Pi search_nodes talk Development with axioms search_nodes concept Axiom-Driven Development search_nodes concept Rails Testing Pyramid (Ivan's version) search_nodes concept Params-Driven Development search_nodes concept DDD Whirlpool search_nodes takeaway Avoid params-driven development search_nodes resource awesome-ddd search_nodes talk Ever shorter feedback loop search_nodes concept Data-Dictated Development search_nodes takeaway Cut Test Suites Under 15 Minutes search_nodes concept Dependency Injection search_nodes takeaway Use Refinements for Dependency Reduction search_nodes tool dry-container search_nodes question Can service objects and command handlers call each other? search_nodes concept Opaque Dependencies search_nodes takeaway Purity Is The Wrong Lens; Dependency On Time Is The Right One search_nodes concept Call Graph Visualization search_nodes takeaway Use dry-container for swappable dependencies search_nodes takeaway Prefer class-method services over stateful service objects search_nodes tool RSpec search_nodes takeaway Rails Tests Are Mostly Integration Tests search_nodes tool FactoryBot search_nodes tool power_assert search_nodes tool minitest search_nodes tool test-prof search_nodes tool Crystal Ball search_nodes tool parallel_tests search_nodes event wroclove.rb 2023 search_nodes talk On the tasteful journey to Yippee search_nodes event wroclove.rb 2022 search_nodes event wroclove.rb 2024 search_nodes talk An Introduction to Test Bench search_nodes+get_node_edges talk It is not so bad, after all search_nodes event wroclove.rb 2019 search_nodes event wroclove.rb 2018 search_nodes talk No 'Pundit' Intended search_nodes event wroclove.rb 2025 search_nodes event wroclove.rb 2026 search_nodes talk Building LLM powered applications in Ruby search_nodes talk How wroclove.rb impacts developers and companies search_nodes concept Event Sourcing search_nodes takeaway Event Sourcing Is Not A Silver Bullet search_nodes takeaway Hiring For Event Sourcing Trade-off search_nodes takeaway Event Sourcing Is About State Not Distribution search_nodes takeaway Event Sourcing Enables Distribution search_nodes concept Snapshotting search_nodes takeaway Event Sourcing Mind Shift Trade-off search_nodes question Can you do DDD without event sourcing? search_nodes question How to persist commands in an event-sourced system? search_nodes question What is an entity? search_nodes concept Minimal Interface search_nodes takeaway Prefer conventions over custom code search_nodes takeaway Eliminate Primitives With Value Types search_nodes concept Aspect-Oriented Programming search_nodes question How to detect coupling in a large existing project? search_nodes resource Object-Oriented Software Construction search_nodes question Is the sufficient-funds check a feature envy smell? search_nodes concept Boolean Flags as Implicit State search_nodes concept Stubs over Mocks search_nodes concept Build vs Create in Tests search_nodes takeaway Prefer fixtures and stubs over factories and mocks search_nodes concept Mock Third-Party Services Locally search_nodes concept Fixtures over Factories search_nodes question Do fixtures beat factories? search_nodes talk Webmock unmocked search_nodes talk Scientific Ruby Lightning Talk search_nodes talk Introducing Sorbet into your Ruby codebase search_nodes tool Standard RB search_nodes talk Methods Gem for Ruby Method References search_nodes resource My Ruby Story search_nodes talk Rubyana Gems and the Ractorous Rubetta Stones! search_nodes talk Ruby Standard Library Hidden Gems Lightning Talk search_nodes person Akira Matsuda search_nodes tool ruby-contracts search_nodes resource Short Ruby Newsletter search_nodes person Jakub Rodzik search_nodes+get_node_edges person Jan search_nodes person Julik Tarkhanov search_nodes person Michał Bronikowski search_nodes person Mateusz Nowak search_nodes person Miron Marczuk search_nodes person Maciej Rząsa search_nodes person Adam Okoń search_nodes talk Doctrine of Useful Objects Separate Fact from Fiction in OOD search_nodes resource Domain-Driven Design: Patterns, Principles and Practices search_nodes concept Service Object search_nodes resource Implementing Domain-Driven Design search_nodes talk To Refine or Not to Refine search_nodes question Does DDD require object-oriented programming? search_nodes concept Ruby Module Customization Mechanics search_nodes concept Null Object Pattern search_nodes question Local storage for tests search_nodes concept Factory Cascades search_nodes talk Beyond the current state Time travel to the rescue! search_nodes takeaway Time Travel Superpower search_nodes concept Logux Time-Shift Ordering search_nodes concept Page Load Time Budget search_nodes tool dry-types search_nodes concept Duck Typing search_nodes tool dry-struct search_nodes concept Method References in Ruby search_nodes takeaway Use Refinements for Coordinated Modernization search_nodes tool Ruby search_nodes question How does naming an abstraction relate to OOP design? search_nodes concept respond_to Anti-Pattern search_nodes takeaway Silver Bullet Anti-Pattern search_nodes concept Aggregate Root Anti-Pattern search_nodes question How to optimize tests around callbacks without refactoring? search_nodes tool RuboCop search_nodes tool Distributed Ruby search_nodes concept ObjectSpace heap dumps search_nodes talk Setup and operation of mutation testing in agentic world search_nodes takeaway Mutation testing replaces dumb review questions search_nodes takeaway Buy Faster Hardware search_nodes question Avoiding model duplication across engines search_nodes tool Heckle search_nodes concept Weasel Words search_nodes talk Offline Sandwich Focus Workflow search_nodes concept Logux Proxy search_nodes tool Grafana search_nodes tool New Relic search_nodes takeaway Sign serverlessforruby.org petition search_nodes tool AppSignal search_nodes tool ThingSpeak search_nodes concept Command UUID Deduplication search_nodes tool Elasticsearch search_nodes concept Direct Upload to Cloud search_nodes tool webpagetest.org search_nodes

4 edges