← Extractions

Counterintuitive Rails pt. 1 — Ivan Nemytchenko (wroclove.rb 2018)

Ivan Nemytchenko's first-day wroclove.rb 2018 talk challenges common Rails habits. He argues flat model and controller folders, respond_to misuse, and the 'fat model, skinny controller' mantra hide conditional complexity, and recommends namespace-based folders grouped by entity dependencies and bounded contexts, plus distinguishing application logic, business logic, and domain models, using stateless services and dry-container instead of instance-state service objects.

Model
claude-opus-4-7
Ingestion
d71e208b
Input tokens
697,210
fresh
559,776
cached
129,029
cache write
8,405
Output tokens
14,748
Duration
247.0s
Roundtrips
11
Tool calls
26
Cost
$0.00
Nodes/edges extracted
27 / 47
Read set (nodes/edges)
304 / 2

Nodes (27)

update Counterintuitive Rails pt. 1 talk
attrs {"type" => "talk"} → {"part" => "1 of 2", "type" => "talk"}
description Talk at wroclove.rb 2018. → Day-one talk by Ivan Nemytchenko at wroclove.rb 2018 (part 1 of 2; part 2 delivered the next day). Opens with a surve...
short_description Talk at wroclove.rb 2018. → Ivan Nemytchenko's wroclove.rb 2018 talk challenging common Rails habits.
create nemytchenko.ru resource
kind (empty) → resource
name (empty) → nemytchenko.ru
slug (empty) → nemytchenko-ru
attrs (empty) → {"type" => "blog-post"}
description (empty) → Ivan Nemytchenko's personal website where he wrote down a few things he learned and understood about patterns, SOLID ...
short_description (empty) → Ivan Nemytchenko's personal site with Rails patterns notes and an unfinished book.
update Ivan Nemytchenko person
attrs (empty) → {"role" => "GitLab developer advocate (European)", "nationality" => "Russian", "rails_since" => "2006"}
description Conference speaker. → Russian Rails developer who started using Rails in 2006. Has done freelancing, agency work, conference organizing, Le...
short_description Conference speaker. → Russian Ruby/Rails developer, GitLab developer advocate, conference speaker.
create GitLab company
kind (empty) → company
name (empty) → GitLab
slug (empty) → gitlab
attrs (empty) → {"industry" => "DevOps / software"}
description (empty) → DevOps platform company. Mentioned in Counterintuitive Rails pt. 1 as Ivan Nemytchenko's employer (European developer...
short_description (empty) → DevOps platform company and creator of the GitLab Rails application.
create Redmine tool
kind (empty) → tool
name (empty) → Redmine
slug (empty) → redmine
attrs (empty) → {"category" => "platform"}
description (empty) → Open-source Rails-based project management tool. Used in Counterintuitive Rails pt. 1 as a small-codebase example wit...
short_description (empty) → Open-source Ruby on Rails project management application.
create Discourse tool
kind (empty) → tool
name (empty) → Discourse
slug (empty) → discourse
attrs (empty) → {"category" => "platform"}
description (empty) → Open-source Rails forum platform described in the talk as 'the best Ruby on Rails forum solution'. Cited as having 17...
short_description (empty) → Open-source Ruby on Rails forum and discussion platform.
create dry-container tool
kind (empty) → tool
name (empty) → dry-container
slug (empty) → dry-container
attrs (empty) → {"category" => "library"}
description (empty) → Inversion-of-control container from the dry-rb family. Ivan recommends using it to centralize swappable external-depe...
short_description (empty) → dry-rb IoC container for registering and resolving dependencies.
create interactor tool
kind (empty) → tool
name (empty) → interactor
slug (empty) → interactor
attrs (empty) → {"category" => "library"}
description (empty) → Ruby gem for encapsulating business use cases as small classes, with an 'interactor organizer' to run steps in order ...
short_description (empty) → Ruby gem for composing multi-step business interactions as small classes.
create Flat Model Structure concept
kind (empty) → concept
name (empty) → Flat Model Structure
slug (empty) → flat-model-structure
attrs (empty) → {"category" => "practice"}
description (empty) → Default Rails practice of placing every model directly under app/models. Fine for small projects but breaks down at s...
short_description (empty) → Rails habit of dumping all models into a single app/models folder.
create Namespace-Based Folder Hierarchy concept
kind (empty) → concept
name (empty) → Namespace-Based Folder Hierarchy
slug (empty) → namespace-based-folder-hierarchy
attrs (empty) → {"category" => "practice"}
description (empty) → Ivan Nemytchenko's recommendation: instead of flat folders, create namespaces based on entity dependencies (loosely r...
short_description (empty) → Grouping Rails models and controllers into folders by entity dependencies or bounded context.
create REST Representations concept
kind (empty) → concept
name (empty) → REST Representations
slug (empty) → rest-representations
attrs (empty) → {"category" => "architecture"}
description (empty) → Ivan Nemytchenko's reading of REST: you never get the resource itself, only one of many possible representations, and...
short_description (empty) → A REST resource is accessed only through different representations.
create respond_to Anti-Pattern concept
kind (empty) → concept
name (empty) → respond_to Anti-Pattern
slug (empty) → respond_to-anti-pattern
attrs (empty) → {"category" => "practice"}
description (empty) → Rails pattern of responding with multiple formats (HTML, JSON, XML, PDF, RSS) from one action using respond_to. Ivan ...
short_description (empty) → Serving multiple output formats from a single controller action via respond_to.
create Application Logic vs Business Logic concept
kind (empty) → concept
name (empty) → Application Logic vs Business Logic
slug (empty) → application-logic-vs-business-logic
attrs (empty) → {"category" => "practice"}
description (empty) → Ivan Nemytchenko's distinction: asking users to confirm their password or rendering a CAPTCHA checkbox is application...
short_description (empty) → Distinguishing framework/input-level logic from true domain rules.
create Domain Model (vs Active Record Model) concept
kind (empty) → concept
name (empty) → Domain Model (vs Active Record Model)
slug (empty) → domain-model-vs-active-record-model
attrs (empty) → {"category" => "architecture"}
description (empty) → Ivan Nemytchenko's definition: the 'main model' is a system that imitates the structure and functioning of the explor...
short_description (empty) → Language- and framework-agnostic model imitating the problem domain.
create Stateless Service Object concept
kind (empty) → concept
name (empty) → Stateless Service Object
slug (empty) → stateless-service-object
attrs (empty) → {"category" => "pattern"}
description (empty) → Ivan Nemytchenko's take on services, aligned with DDD's 'service is an action, not a thing'. Implement services as cl...
short_description (empty) → Service as an action expressed by class or singleton methods, without instance state.
create MVC Modularity Violations concept
kind (empty) → concept
name (empty) → MVC Modularity Violations
slug (empty) → mvc-modularity-violations
attrs (empty) → {"category" => "architecture"}
description (empty) → Ivan Nemytchenko frames modularity as the absence of circular dependencies between modules. In Rails this means contr...
short_description (empty) → Rails patterns that break MVC by creating circular dependencies between layers.
create Ideal Rails System Properties concept
kind (empty) → concept
name (empty) → Ideal Rails System Properties
slug (empty) → ideal-rails-system-properties
attrs (empty) → {"category" => "methodology"}
description (empty) → Three properties an ideal software system should have, per Ivan Nemytchenko: (1) it opposes/resists bad code, like Re...
short_description (empty) → Three properties Ivan Nemytchenko proposes for an ideal software system.
create acts_as_api tool
kind (empty) → tool
name (empty) → acts_as_api
slug (empty) → acts_as_api
attrs (empty) → {"category" => "library"}
description (empty) → Rails gem that lets developers declare API response representations inside their ActiveRecord model. Used in Counteri...
short_description (empty) → Rails gem declaring API view representations inside ActiveRecord models.
create Group models into folders by entity dependency takeaway
kind (empty) → takeaway
name (empty) → Group models into folders by entity dependency
slug (empty) → group-models-into-folders-by-entity-dependency
attrs (empty) → {"type" => "recommendation"}
description (empty) → Actionable recommendation from Counterintuitive Rails pt. 1: rather than keeping a flat app/models, group models into...
short_description (empty) → Create model folders by aggregation-root-style entity dependencies from day one.
create Use top-level controller namespaces per wave takeaway
kind (empty) → takeaway
name (empty) → Use top-level controller namespaces per wave
slug (empty) → use-top-level-controller-namespaces-per-wave
attrs (empty) → {"type" => "recommendation"}
description (empty) → Instead of a single controller action serving many formats via respond_to, create top-level controller namespaces for...
short_description (empty) → Replace respond_to with top-level namespaces like Web, API, RSS, PDF.
create Introduce bounded-context controller namespaces takeaway
kind (empty) → takeaway
name (empty) → Introduce bounded-context controller namespaces
slug (empty) → introduce-bounded-context-controller-namespaces
attrs (empty) → {"type" => "recommendation"}
description (empty) → Applying DDD bounded contexts to Rails controllers: a universal 'article' model with conditional validations for edit...
short_description (empty) → Model bounded contexts like moderation as their own controller namespaces.
create Avoid complexity before fighting it takeaway
kind (empty) → takeaway
name (empty) → Avoid complexity before fighting it
slug (empty) → avoid-complexity-before-fighting-it
attrs (empty) → {"type" => "recommendation"}
description (empty) → First rule of dealing with complexity: avoid it. When a task looks hard to implement straightforwardly in Rails, prog...
short_description (empty) → Push back on business requests before accepting days-long implementation detours.
create Use dry-container for swappable dependencies takeaway
kind (empty) → takeaway
name (empty) → Use dry-container for swappable dependencies
slug (empty) → use-dry-container-for-swappable-dependencies
attrs (empty) → {"type" => "recommendation"}
description (empty) → To avoid passing payment adapters and similar collaborators through the call stack, create a global config container ...
short_description (empty) → Register real/stub implementations in a dry-container instead of threading adapters through calls.
create Prefer class-method services over stateful service objects takeaway
kind (empty) → takeaway
name (empty) → Prefer class-method services over stateful service objects
slug (empty) → prefer-class-method-services-over-stateful-service-objects
attrs (empty) → {"type" => "recommendation"}
description (empty) → When a service is implemented as an instantiable class, someone inexperienced will eventually add state to it. Implem...
short_description (empty) → Implement services as class methods to structurally prevent instance state.
create Isn't asking password confirmation business logic? question
kind (empty) → question
name (empty) → Isn't asking password confirmation business logic?
slug (empty) → isn-t-asking-password-confirmation-business-logic
attrs (empty) → {"answer_summary" => "Sometimes yes — but often it is an application/framework detail, not a domain rule; Rails lets ...
description (empty) → An audience member objects to Ivan's example, noting that requiring password confirmation could be part of the domain...
short_description (empty) → Audience pushback on the application-vs-business-logic distinction.
create Isn't the dry-container recipe global state? question
kind (empty) → question
name (empty) → Isn't the dry-container recipe global state?
slug (empty) → isn-t-the-dry-container-recipe-global-state
attrs (empty) → {"answer_summary" => "Yes, it is global state, but scoped to dependency swapping — a dirty trick justified by consoli...
description (empty) → An audience member points out that the dry-container approach relies on global state. Ivan concedes it is a global an...
short_description (empty) → Audience question challenging dry-container's global container.
create Power is dangerous without constraints takeaway
kind (empty) → takeaway
name (empty) → Power is dangerous without constraints
slug (empty) → power-is-dangerous-without-constraints
attrs (empty) → {"type" => "insight"}
description (empty) → Ruby is a powerful language, but power is dangerous and can be harmful. Good teams develop explicit constraints to co...
short_description (empty) → Good teams develop explicit constraints to control Ruby's power.

Edges (47)

update Ivan Nemytchenko → authored → Counterintuitive Rails pt. 1
context (empty) → Speaker of the talk at wroclove.rb 2018 (part 1 of 2).
update Counterintuitive Rails pt. 1 → presented_at → wroclove.rb 2018
context (empty) → Presented on day one of wroclove.rb 2018; part 2 followed the next day.
create Ivan Nemytchenko → attended → wroclove.rb 2018
context (empty) → Delivered the two-part Counterintuitive Rails talk there.
relation (empty) → attended
source_node_id (empty) → 042242c9-ad5a-4afd-a4f3-196eb52fec1d
target_node_id (empty) → 9243ef2c-21bb-4f23-b450-9ecd87882dfe
create Ivan Nemytchenko → works_at → GitLab
attrs (empty) → {"role" => "developer advocate (European)"}
context (empty) → European GitLab developer advocate at the time of the talk.
relation (empty) → works_at
source_node_id (empty) → 042242c9-ad5a-4afd-a4f3-196eb52fec1d
target_node_id (empty) → 2051dd64-70af-4d5f-9f67-c4401c69a0cd
create Ivan Nemytchenko → uses → Ruby on Rails
context (empty) → Rails developer since 2006; main framework discussed in the talk.
relation (empty) → uses
source_node_id (empty) → 042242c9-ad5a-4afd-a4f3-196eb52fec1d
target_node_id (empty) → 7aac705a-0987-49f2-b665-9d4e08a6acee
create Ivan Nemytchenko → authored → nemytchenko.ru
context (empty) → Personal site where he documented patterns and started a Rails book.
relation (empty) → authored
source_node_id (empty) → 042242c9-ad5a-4afd-a4f3-196eb52fec1d
target_node_id (empty) → d147b6a1-c69c-4daa-933f-e581e373a486
create Counterintuitive Rails pt. 1 → about → Ruby on Rails
context (empty) → Entire talk critiques common Rails conventions.
relation (empty) → about
source_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
target_node_id (empty) → 7aac705a-0987-49f2-b665-9d4e08a6acee
create Counterintuitive Rails pt. 1 → about → Flat Model Structure
context (empty) → First belief Ivan challenges — flat app/models folder.
relation (empty) → about
source_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
target_node_id (empty) → 1c7d5a72-c610-45da-84a7-e864193c7dd2
create Counterintuitive Rails pt. 1 → about → Namespace-Based Folder Hierarchy
context (empty) → Recommended alternative to flat folders for both models and controllers.
relation (empty) → about
source_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
target_node_id (empty) → 875a92f3-cfc1-4184-b8e1-09e132e8b5ae
create Counterintuitive Rails pt. 1 → about → REST Representations
context (empty) → Argues REST is about representations, not respond_to formats.
relation (empty) → about
source_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
target_node_id (empty) → 96f020e5-b2b1-4b7d-991b-aefb1b3ad5d9
create Counterintuitive Rails pt. 1 → about → respond_to Anti-Pattern
context (empty) → Critiques respond_to for mixing incompatible waves of usage in one controller.
relation (empty) → about
source_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
target_node_id (empty) → c7c3d22b-f4d7-4f79-88ef-d3b97a0b8454
create Counterintuitive Rails pt. 1 → about → Bounded Context
context (empty) → Applies DDD bounded contexts to Rails controllers via namespacing.
relation (empty) → about
source_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
target_node_id (empty) → bb2674d4-360e-4ac8-84a1-85be3230a187
create Counterintuitive Rails pt. 1 → about → MVC Modularity Violations
context (empty) → Lists Rails features and gems that violate MVC and create circular dependencies.
relation (empty) → about
source_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
target_node_id (empty) → c99f8c68-447c-4a54-be7d-dc471a706977
create Counterintuitive Rails pt. 1 → about → Application Logic vs Business Logic
context (empty) → Argues application-level concerns end up in domain models.
relation (empty) → about
source_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
target_node_id (empty) → e79c288b-9149-42ba-a299-547c1819b819
create Counterintuitive Rails pt. 1 → about → Domain Model (vs Active Record Model)
context (empty) → Contrasts framework/language-agnostic domain models with Active Record models.
relation (empty) → about
source_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
target_node_id (empty) → eb88dec0-c8aa-4a8f-8b59-91b9df55cbd9
create Counterintuitive Rails pt. 1 → about → Stateless Service Object
context (empty) → Proposes class-method services instead of stateful service classes.
relation (empty) → about
source_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
target_node_id (empty) → 983561ee-b05e-4222-852e-cbb810c95643
create Counterintuitive Rails pt. 1 → about → Ideal Rails System Properties
context (empty) → Opens the talk with three properties of an ideal system.
relation (empty) → about
source_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
target_node_id (empty) → e4b8b86c-5950-482c-ab59-1e745e468a70
create Counterintuitive Rails pt. 1 → about → dry-container
context (empty) → Recommends dry-container for swapping external dependencies per environment.
relation (empty) → about
source_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
target_node_id (empty) → 79be886d-b7bf-4b7a-b133-d0335d9ced86
create Counterintuitive Rails pt. 1 → about → interactor
context (empty) → Describes collapsing an interactor-gem scenario into a four-line method.
relation (empty) → about
source_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
target_node_id (empty) → 047e3d48-95ea-4128-81f7-18166f44c711
create Counterintuitive Rails pt. 1 → about → acts_as_api
context (empty) → Cited as an example of a gem that violates MVC by embedding views inside models.
relation (empty) → about
source_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
target_node_id (empty) → c760f4fe-4cc2-4e70-83ef-06fdf4f18684
create Counterintuitive Rails pt. 1 → related_to → Tyrant
context (empty) → Ivan cites Devise as an MVC-violating gem (not Tyrant — Devise is not yet in graph).
relation (empty) → related_to
source_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
target_node_id (empty) → 7c4b671b-e55e-45b7-9217-2fd36a32d511
create Counterintuitive Rails pt. 1 → about → React
context (empty) → Cited as a model of a framework that opposes bad code even for juniors.
relation (empty) → about
source_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
target_node_id (empty) → 5026a4fc-0c6e-49d7-bb7d-29be23b72b24
create Counterintuitive Rails pt. 1 → about → Redmine
context (empty) → Used as example of a 17-model flat Rails codebase.
relation (empty) → about
source_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
target_node_id (empty) → 03ebbbf2-e858-4d87-97c8-4a7b9db49963
create Counterintuitive Rails pt. 1 → about → GitLab
context (empty) → Used as example of a large Rails codebase (~130 top-level models).
relation (empty) → about
source_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
target_node_id (empty) → 2051dd64-70af-4d5f-9f67-c4401c69a0cd
create Counterintuitive Rails pt. 1 → about → Discourse
context (empty) → Cited as 'best Ruby on Rails forum solution' with 170 flat models.
relation (empty) → about
source_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
target_node_id (empty) → fafffc33-82c5-494a-962a-2c6aedd7de32
create Counterintuitive Rails pt. 1 → about → DHH
context (empty) → Ivan criticizes DHH's Getting Real screencasts for advocating current_user globals in models.
relation (empty) → about
source_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
target_node_id (empty) → 51ed6191-ce15-4ca5-9eed-d55908e5ab88
create Ivan Nemytchenko → recommends → dry-container
context (empty) → Recommends dry-container for concentrating swappable dependency implementations.
relation (empty) → recommends
source_node_id (empty) → 042242c9-ad5a-4afd-a4f3-196eb52fec1d
target_node_id (empty) → 79be886d-b7bf-4b7a-b133-d0335d9ced86
create Ivan Nemytchenko → recommends → Namespace-Based Folder Hierarchy
context (empty) → Core recommendation to structure models and controllers via namespaces from day one.
relation (empty) → recommends
source_node_id (empty) → 042242c9-ad5a-4afd-a4f3-196eb52fec1d
target_node_id (empty) → 875a92f3-cfc1-4184-b8e1-09e132e8b5ae
create Ivan Nemytchenko → recommends → Stateless Service Object
context (empty) → Prefers class-method services over instantiable, stateful ones.
relation (empty) → recommends
source_node_id (empty) → 042242c9-ad5a-4afd-a4f3-196eb52fec1d
target_node_id (empty) → 983561ee-b05e-4222-852e-cbb810c95643
create Ivan Nemytchenko → recommends → Bounded Context
context (empty) → Advocates bounded-context-based controller namespaces (e.g. moderation).
relation (empty) → recommends
source_node_id (empty) → 042242c9-ad5a-4afd-a4f3-196eb52fec1d
target_node_id (empty) → bb2674d4-360e-4ac8-84a1-85be3230a187
create Group models into folders by entity dependency → from_talk → Counterintuitive Rails pt. 1
context (empty) → Takeaway extracted from the talk's first 'belief' section.
relation (empty) → from_talk
source_node_id (empty) → 20a68ec9-b06e-48a7-ad75-6553e1a3df89
target_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
create Use top-level controller namespaces per wave → from_talk → Counterintuitive Rails pt. 1
context (empty) → Takeaway from the critique of respond_to.
relation (empty) → from_talk
source_node_id (empty) → 7e58a84c-e3ea-43b8-ad8a-0b832a3c57d7
target_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
create Introduce bounded-context controller namespaces → from_talk → Counterintuitive Rails pt. 1
context (empty) → Takeaway from the Moderation::Articles example.
relation (empty) → from_talk
source_node_id (empty) → 4ae84eb0-9e6e-4e9c-af8f-a49ae60e3b64
target_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
create Avoid complexity before fighting it → from_talk → Counterintuitive Rails pt. 1
context (empty) → 'First rule is to avoid it' — negotiate with the business before coding.
relation (empty) → from_talk
source_node_id (empty) → 5074475c-c608-4992-81b5-8aece54744f4
target_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
create Use dry-container for swappable dependencies → from_talk → Counterintuitive Rails pt. 1
context (empty) → Takeaway from the dry-container demonstration.
relation (empty) → from_talk
source_node_id (empty) → 984c9315-8b61-4d78-828c-05ca7bd38a0f
target_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
create Prefer class-method services over stateful service objects → from_talk → Counterintuitive Rails pt. 1
context (empty) → Takeaway from the interactor-to-four-lines anecdote.
relation (empty) → from_talk
source_node_id (empty) → 95424a01-fddf-4757-b30c-f2e3275b4985
target_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
create Power is dangerous without constraints → from_talk → Counterintuitive Rails pt. 1
context (empty) → Framing statement early in the talk about controlling Ruby's power.
relation (empty) → from_talk
source_node_id (empty) → f02952c2-5694-4dfa-8fca-a4669e26a264
target_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
create Group models into folders by entity dependency → about → Flat Model Structure
context (empty) → Directly addresses the flat-models anti-pattern.
relation (empty) → about
source_node_id (empty) → 20a68ec9-b06e-48a7-ad75-6553e1a3df89
target_node_id (empty) → 1c7d5a72-c610-45da-84a7-e864193c7dd2
create Use top-level controller namespaces per wave → about → respond_to Anti-Pattern
context (empty) → Replacement for respond_to-based multi-format actions.
relation (empty) → about
source_node_id (empty) → 7e58a84c-e3ea-43b8-ad8a-0b832a3c57d7
target_node_id (empty) → c7c3d22b-f4d7-4f79-88ef-d3b97a0b8454
create Introduce bounded-context controller namespaces → about → Bounded Context
context (empty) → Applies DDD bounded contexts at the controller layer.
relation (empty) → about
source_node_id (empty) → 4ae84eb0-9e6e-4e9c-af8f-a49ae60e3b64
target_node_id (empty) → bb2674d4-360e-4ac8-84a1-85be3230a187
create Use dry-container for swappable dependencies → about → dry-container
context (empty) → Recommends the dry-container tool.
relation (empty) → about
source_node_id (empty) → 984c9315-8b61-4d78-828c-05ca7bd38a0f
target_node_id (empty) → 79be886d-b7bf-4b7a-b133-d0335d9ced86
create Prefer class-method services over stateful service objects → about → Stateless Service Object
context (empty) → Concrete articulation of the stateless-service pattern.
relation (empty) → about
source_node_id (empty) → 95424a01-fddf-4757-b30c-f2e3275b4985
target_node_id (empty) → 983561ee-b05e-4222-852e-cbb810c95643
create Isn't asking password confirmation business logic? → asked_at → Counterintuitive Rails pt. 1
context (empty) → Audience pushback during the application-logic section.
relation (empty) → asked_at
source_node_id (empty) → 321c2712-74b6-472f-a6ce-7ebfd69d6501
target_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
create Isn't the dry-container recipe global state? → asked_at → Counterintuitive Rails pt. 1
context (empty) → Audience challenge during the dry-container demonstration.
relation (empty) → asked_at
source_node_id (empty) → 9c0749c4-06c6-4084-bd9f-ca61b55f22a8
target_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
create Isn't asking password confirmation business logic? → about → Application Logic vs Business Logic
context (empty) → Questions the boundary between application and business logic.
relation (empty) → about
source_node_id (empty) → 321c2712-74b6-472f-a6ce-7ebfd69d6501
target_node_id (empty) → e79c288b-9149-42ba-a299-547c1819b819
create Isn't the dry-container recipe global state? → about → dry-container
context (empty) → Challenges dry-container's use of a global container.
relation (empty) → about
source_node_id (empty) → 9c0749c4-06c6-4084-bd9f-ca61b55f22a8
target_node_id (empty) → 79be886d-b7bf-4b7a-b133-d0335d9ced86
create Counterintuitive Rails pt. 1 → related_to → Counterintuitive Rails pt. 2
context (empty) → Part 1 of a two-part talk; part 2 is delivered the following day and will analyze the audience survey results.
relation (empty) → related_to
source_node_id (empty) → b8a4884a-2f2b-46c8-b90a-76e2c0b57b80
target_node_id (empty) → c003bf86-a312-4839-b314-24bd84a8f3f4

Read set

304 nodes

person Eric Evans list_nodes_by_kind person Erwin Kroon list_nodes_by_kind person Ethan Garofolo list_nodes_by_kind person Greg Molnar list_nodes_by_kind person Greg Young list_nodes_by_kind person Ismael Celis list_nodes_by_kind person Ivan Nemytchenko list_nodes_by_kind+search_nodes person Jakub Rodzik list_nodes_by_kind person Janko Marohnic list_nodes_by_kind person Joel Drapper list_nodes_by_kind person John Gallagher list_nodes_by_kind person Josef Strzibny list_nodes_by_kind person José Valim list_nodes_by_kind person Julik Tarkhanov list_nodes_by_kind person Karol Szuster list_nodes_by_kind person Koichi Sasada list_nodes_by_kind person Krzysztof Hasiński list_nodes_by_kind person Kuba Suder list_nodes_by_kind person Louis Antonopoulos list_nodes_by_kind person Łukasz Reszke list_nodes_by_kind event EmberConf list_nodes_by_kind+search_nodes event KanDDDinsky list_nodes_by_kind event wroclove.rb 2018 list_nodes_by_kind event wroclove.rb 2019 list_nodes_by_kind event wroclove.rb 2022 list_nodes_by_kind event wroclove.rb 2023 list_nodes_by_kind event wroclove.rb 2024 list_nodes_by_kind event wroclove.rb 2025 list_nodes_by_kind event wroclove.rb 2026 list_nodes_by_kind person Aaron Patterson list_nodes_by_kind person Adam Okoń list_nodes_by_kind+search_nodes person Adam Piotrowski list_nodes_by_kind person Adrian Marin list_nodes_by_kind person Agnieszka Małaszkiewicz list_nodes_by_kind person Akira Matsuda list_nodes_by_kind person Alberto Brandolini list_nodes_by_kind person Amelia Walter-Dzikowska list_nodes_by_kind person Andrei Bondarev list_nodes_by_kind person Andrei Kaleshka list_nodes_by_kind person Andrzej Krzywda list_nodes_by_kind person Andrzej Śliwa list_nodes_by_kind person Andy Maleh list_nodes_by_kind person Anita Jaszewska list_nodes_by_kind person Anton Davydov list_nodes_by_kind person Armin Pašalić list_nodes_by_kind person Arturo Herrero list_nodes_by_kind person Ayush Newatia list_nodes_by_kind person Bartosz Blimke list_nodes_by_kind person Bertrand Meyer list_nodes_by_kind person Caio Almeida list_nodes_by_kind person Charles Nutter list_nodes_by_kind person Chikahiro Tokoro list_nodes_by_kind person Claude Lévi-Strauss list_nodes_by_kind person Damir Zekić list_nodes_by_kind person David Halasz list_nodes_by_kind person DHH list_nodes_by_kind person Dimitry Salahutdinov list_nodes_by_kind person Emiliano Della Casa list_nodes_by_kind person Łukasz Szydło list_nodes_by_kind person Maciej Rząsa list_nodes_by_kind person Maciek list_nodes_by_kind person Marco Heimeshoff list_nodes_by_kind person Mariusz Gil list_nodes_by_kind person Markus Schirp list_nodes_by_kind person Martin Gamsjaeger list_nodes_by_kind person Mateusz Nowak list_nodes_by_kind person Matthias Verraes list_nodes_by_kind person Matz list_nodes_by_kind person Michal Matyas list_nodes_by_kind person Michał Młoźniak list_nodes_by_kind person Michał Zajączkowski de Mezer list_nodes_by_kind person Miron Marczuk list_nodes_by_kind person Nathan Ladd list_nodes_by_kind person Nick Sutterer list_nodes_by_kind person Nicolò Rebughini list_nodes_by_kind person Norbert Wójtowicz list_nodes_by_kind person Paweł Dąbrowski list_nodes_by_kind person Paweł Pacana list_nodes_by_kind person Paweł Pokrywka list_nodes_by_kind person Paweł Strzałkowski list_nodes_by_kind person Piotr Solnica list_nodes_by_kind person Radoslav Stankov list_nodes_by_kind person Rafał Cymerys list_nodes_by_kind person Rafał Rothenberger list_nodes_by_kind person Ryan Townsend list_nodes_by_kind person Scott Bell list_nodes_by_kind person Scott Bellware list_nodes_by_kind person Scott Wlaschin list_nodes_by_kind person Sebastian Wilgosz list_nodes_by_kind person Sergey Ivanov list_nodes_by_kind person Sergey Sergyenko list_nodes_by_kind person Seth Horsley list_nodes_by_kind person Sharon Rosner list_nodes_by_kind person Shugo Maeda list_nodes_by_kind person Stefan Wintermeyer list_nodes_by_kind person Stephen Margheim list_nodes_by_kind person Stephen Wolfram list_nodes_by_kind person Steve Ballmer list_nodes_by_kind person Szymon Fiedler list_nodes_by_kind person Szymon Kulec list_nodes_by_kind person Tomasz Donarski list_nodes_by_kind person Victor Shepelev list_nodes_by_kind person Vladimir Dementyev list_nodes_by_kind person Wojtek Wrona list_nodes_by_kind person Yaroslav Shmarov list_nodes_by_kind person Yatish Mehta list_nodes_by_kind person Yehuda Katz list_nodes_by_kind talk Nightmare neighbours caveats of Rails based mutlitenancy search_nodes+list_nodes_by_kind talk Scientific Ruby Lightning Talk search_nodes+list_nodes_by_kind talk Multi-region data governance in Rails application search_nodes+list_nodes_by_kind talk Building LLM powered applications in Ruby search_nodes+list_nodes_by_kind talk No-build Utopia: Modern User Experiences with Rails & Web Standards search_nodes+list_nodes_by_kind talk An Introduction to Test Bench search_nodes+list_nodes_by_kind project granite search_nodes talk Counterintuitive Rails pt. 2 search_nodes+list_nodes_by_kind talk Toolbelt of a Seasoned Bug Hunter search_nodes+list_nodes_by_kind talk 10 Things You Never Wanted To Know About Reform 3 list_nodes_by_kind talk 18 months of using hotwire and viewcomponent in production list_nodes_by_kind talk Accidentally building a neural network — A Ruby product recommendation journey list_nodes_by_kind talk Adventures in durable execution list_nodes_by_kind talk Applying CQRS & Event Sourcing on Rails applications list_nodes_by_kind talk Better WebPerformance with Rails list_nodes_by_kind talk Beyond the current state Time travel to the rescue! list_nodes_by_kind talk Building a Production-Ready AI App: MCP & OAuth on Rails list_nodes_by_kind talk Building Beautiful UIs with Ruby A Rails-Native Approach list_nodes_by_kind+search_nodes talk Building on Bluesky's AT Protocol with Ruby list_nodes_by_kind+search_nodes talk Building Rails SPAs in Frontend Ruby with Glimmer DSL for Web list_nodes_by_kind talk Building uls for microservices list_nodes_by_kind talk Business logic in Ruby list_nodes_by_kind+search_nodes talk Cables! Cables! Cables! list_nodes_by_kind talk Component Driven UI with ViewComponent list_nodes_by_kind talk Counterintuitive Rails pt. 1 list_nodes_by_kind+get_node_edges+search_nodes talk Data Management With Ruby list_nodes_by_kind talk Dealing With A Project's Complexity In A Changing Environment list_nodes_by_kind talk Debug like a scientist list_nodes_by_kind talk Developer, Programmer, and AI list_nodes_by_kind+search_nodes talk Development with axioms list_nodes_by_kind talk Devise pitfalls and way to tighten security list_nodes_by_kind+search_nodes talk Doctrine of Useful Objects Separate Fact from Fiction in OOD list_nodes_by_kind+search_nodes talk Enterprise Rails Panel list_nodes_by_kind talk Events events events list_nodes_by_kind+search_nodes talk Event Sourcing and Actor model in Ruby list_nodes_by_kind talk Event Sourcing Anti Patterns and Failures list_nodes_by_kind talk Ever shorter feedback loop list_nodes_by_kind talk Extracting logic from templates with Hanami Views list_nodes_by_kind talk FaaS for Ruby Lightning Talk list_nodes_by_kind talk Fantastic Databases and Where to Find Them list_nodes_by_kind talk Fix Production Bugs 20x Faster list_nodes_by_kind talk Forms Are Dead: Building Agentic Workflows in Ruby list_nodes_by_kind talk From open source to IPO list_nodes_by_kind talk From PostgreSQL to SQLite in Rails list_nodes_by_kind talk Gregorian Calendar list_nodes_by_kind talk Grokking FP For The Practicing Rubyist list_nodes_by_kind talk Handling file uploads for modern developer list_nodes_by_kind+search_nodes talk How (and why) to run SQLite in production list_nodes_by_kind talk How I brought LCP down to under 350 ms list_nodes_by_kind talk How To Ensure Systems Do What We Want And Take Care Of Themselves list_nodes_by_kind talk How to hijack list_nodes_by_kind talk How To Package A Rails Engine Generation To Automation list_nodes_by_kind talk How wroclove.rb impacts developers and companies list_nodes_by_kind talk International cooperation in IT teams list_nodes_by_kind talk Introducing Sorbet into your Ruby codebase list_nodes_by_kind talk Introduction To Event Sourcing How To Use It With Ruby list_nodes_by_kind talk Is the monolith a problem list_nodes_by_kind talk It is not so bad, after all list_nodes_by_kind talk JavaScript and Frontend Panel list_nodes_by_kind talk JRuby: Professional-Grade Ruby list_nodes_by_kind talk Kamal is not harder than your PaaS list_nodes_by_kind talk Lightning Talk on Email Leaks and Senior Developer Titles list_nodes_by_kind talk Methods Gem for Ruby Method References list_nodes_by_kind+search_nodes talk Might & Magic of Domain-Driven Design list_nodes_by_kind+search_nodes talk Mutant on steroids list_nodes_by_kind talk MVCC for Ruby developers list_nodes_by_kind+search_nodes talk My core skill never was the typing list_nodes_by_kind talk Native apps are dead, long live native apps list_nodes_by_kind talk Next Token! list_nodes_by_kind talk No 'Pundit' Intended list_nodes_by_kind talk One machine please, make it Turing list_nodes_by_kind talk On the tasteful journey to Yippee list_nodes_by_kind talk Optimistic ul list_nodes_by_kind talk Optimizing performance in Rails apps with GraphQL layer list_nodes_by_kind talk Orchestrating video transcoding in ruby list_nodes_by_kind talk Outdated Browser Detection list_nodes_by_kind talk Performance of Distributed Applications list_nodes_by_kind talk Prevent account sharing list_nodes_by_kind talk Reforging (or rather rebrewing) the support for open-source list_nodes_by_kind talk Removing Code with Breadth-First Search list_nodes_by_kind talk Rewrite with confidence list_nodes_by_kind talk Rubyana Gems and the Ractorous Rubetta Stones! list_nodes_by_kind+search_nodes talk Ruby has literally always had types list_nodes_by_kind talk Ruby on a $4 Computer list_nodes_by_kind talk Ruby Rendezvous Method Call, Proc, and Beyond list_nodes_by_kind talk Securing Rails applications list_nodes_by_kind+search_nodes talk Setup and operation of mutation testing in agentic world list_nodes_by_kind talk Sonic Pi Music Performance list_nodes_by_kind talk Spice up your life with eql list_nodes_by_kind talk SUPER AIN'T SUPER From OOP To FP and Beyond! list_nodes_by_kind talk Testing Randomness list_nodes_by_kind talk The Curse of Service Object list_nodes_by_kind+search_nodes talk The good, the bad and the remote — collaborative domain modeling with EventStorming list_nodes_by_kind talk The pillars of Domain Driven Design list_nodes_by_kind+search_nodes talk To Refine or Not to Refine list_nodes_by_kind talk Towards the post framework future list_nodes_by_kind talk Typical DDDomains In Rails Apps list_nodes_by_kind talk Understanding coupling list_nodes_by_kind talk Under The Hood And On The Surface Of Sidekiq list_nodes_by_kind talk UringMachine — High Performance Concurrency for Ruby Using io_uring list_nodes_by_kind talk Webmock unmocked list_nodes_by_kind talk When REST is Not Enough: Implementing Alternative Protocols in Ruby on Rails list_nodes_by_kind+search_nodes talk Working with RailsEventStore in Cashflow Management System list_nodes_by_kind tool ruby-contracts search_nodes tool dry-types search_nodes tool dry-struct search_nodes tool dry-validation search_nodes tool aggregate_root search_nodes tool CarrierWave search_nodes tool heapy search_nodes tool Rails 5.2 search_nodes concept Interface Wrapper for Ruby search_nodes tool Celluloid search_nodes tool JSON API Resources search_nodes concept Global Interpreter Lock search_nodes tool async search_nodes tool Ruby Event Store search_nodes concept Bounded Context search_nodes concept Domain-Driven Design search_nodes resource Implementing Domain-Driven Design search_nodes takeaway Bounded Contexts Are Not Microservices search_nodes takeaway One Ubiquitous Language Per Bounded Context search_nodes takeaway Bounded Contexts Are Natural Microservice Seams search_nodes concept Context Map search_nodes resource Domain-Driven Rails search_nodes resource Rails Architect Master Class search_nodes concept Active Record search_nodes concept Rails Reload-Safe ES Configuration search_nodes concept Read-Write Split search_nodes project monolith framework search_nodes tool Reform search_nodes concept Command Form search_nodes tool Paperclip search_nodes tool Active Storage search_nodes takeaway Split Active Record into write and read objects search_nodes tool Refile search_nodes concept JSON API search_nodes takeaway Don't follow JSON API religiously search_nodes question JSON API or GraphQL — what do you recommend? search_nodes tool GraphQL search_nodes project aggregates repository search_nodes concept tus protocol search_nodes concept Real-time Web Applications search_nodes takeaway Sign serverlessforruby.org petition search_nodes takeaway Stable commits enable bisect search_nodes tool RealtimeBoard search_nodes takeaway Contribute to Arkency aggregates repository search_nodes tool Heroku search_nodes tool JIRA search_nodes tool find-slow script search_nodes concept Developer vs Programmer search_nodes takeaway AI Will Not Replace Developer-Client Empathy search_nodes question Is MVC enough for a successful enterprise app? search_nodes takeaway Don't Bring MVC-CRUD Thinking To Services search_nodes concept Embrace The Evented Model search_nodes tool Ember.js search_nodes concept Reactive Programming search_nodes concept Sometimes Nothing Is Enough search_nodes concept Distributed Monolith search_nodes concept CQRS search_nodes question How to do DDD remotely? search_nodes project Petri Nets Performance Prediction Gem search_nodes concept Trailblazer Workflow search_nodes project ManageIQ search_nodes tool webpagetest.org search_nodes resource Rocket Real-Time Benchmark search_nodes concept Unique Per-Site Email Leak Detection search_nodes project AnyCable search_nodes company Transloadit search_nodes takeaway Use Refinements for Dependency Reduction search_nodes question Can parts of Eventide, Rails Event Store and Trailblazer be combined in one project? search_nodes tool Ruby on Rails search_nodes tool Rack search_nodes tool Ruby search_nodes tool Tyrant search_nodes tool Faker search_nodes tool React search_nodes tool Preact search_nodes tool MobX search_nodes concept CSS-in-JS search_nodes takeaway Adopt CSS-in-JS for modern component-based frontends search_nodes tool Elm search_nodes concept Virtual DOM search_nodes tool Babel search_nodes tool Flow search_nodes takeaway Don't create controllers at Rails boot time search_nodes concept Duck Typing search_nodes question Does DDD require object-oriented programming? search_nodes resource Object-Oriented Software Construction search_nodes concept Dependency Injection search_nodes takeaway Prefer conventions over custom code search_nodes concept Architecture Drivers search_nodes question How to detect coupling in a large existing project? search_nodes concept Weasel Words search_nodes resource Domain-Driven Design: Patterns, Principles and Practices search_nodes takeaway Eliminate Primitives With Value Types search_nodes resource Stefan Wintermeyer's Rails 5.2 Book search_nodes

2 edges