← 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 Rodzik → authored → Testing Randomness
context (empty) → Presented the talk at wroclove.rb 2023.
update Testing Randomness → presented_at → wroclove.rb 2023
context (empty) → Single-track Ruby conference where the talk was delivered.
create Jakub Rodzik → attended → wroclove.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 Randomness → about → Test 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 Randomness → about → Logic 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 Randomness → about → Stubs 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 Randomness → about → Open-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 Randomness → about → Dependency 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 Randomness → about → Fake 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 Randomness → about → Event 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 Randomness → about → Event 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 Randomness → about → Duck 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 Randomness → about → Time.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 Randomness → about → RSpec
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 Randomness → about → RBS
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 Randomness → about → Datadog
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 Randomness → about → Sumo 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 Randomness → about → Practical 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 Randomness → about → 99 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 it → from_talk → Testing 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 tests → from_talk → Testing 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 injection → from_talk → Testing 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 behavior → from_talk → Testing 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 code → from_talk → Testing 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 it → about → Time.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 injection → about → Dependency 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 injection → about → Fake 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 tests → about → Logic 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 behavior → about → Event 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 behavior → about → Event 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_at → Testing 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_at → Testing 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_at → Testing 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? → about → Fake 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? → about → Time.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? → about → Dependency 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? → about → Fake 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? → about → Practical 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? → about → 99 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? → about → RBS
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 Rodzik → uses → RSpec
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 Rodzik → recommends → Practical 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 Rodzik → recommends → 99 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