← 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 NemytchenkoauthoredCounterintuitive Rails pt. 1
context (empty) Speaker of the talk at wroclove.rb 2018 (part 1 of 2).
update Counterintuitive Rails pt. 1presented_atwroclove.rb 2018
context (empty) Presented on day one of wroclove.rb 2018; part 2 followed the next day.
create Ivan Nemytchenkoattendedwroclove.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 Nemytchenkoworks_atGitLab
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 NemytchenkousesRuby 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 Nemytchenkoauthorednemytchenko.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. 1aboutRuby 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. 1aboutFlat 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. 1aboutNamespace-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. 1aboutREST 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. 1aboutrespond_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. 1aboutBounded 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. 1aboutMVC 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. 1aboutApplication 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. 1aboutDomain 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. 1aboutStateless 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. 1aboutIdeal 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. 1aboutdry-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. 1aboutinteractor
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. 1aboutacts_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. 1related_toTyrant
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. 1aboutReact
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. 1aboutRedmine
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. 1aboutGitLab
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. 1aboutDiscourse
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. 1aboutDHH
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 Nemytchenkorecommendsdry-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 NemytchenkorecommendsNamespace-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 NemytchenkorecommendsStateless 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 NemytchenkorecommendsBounded 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 dependencyfrom_talkCounterintuitive 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 wavefrom_talkCounterintuitive 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 namespacesfrom_talkCounterintuitive 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 itfrom_talkCounterintuitive 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 dependenciesfrom_talkCounterintuitive 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 objectsfrom_talkCounterintuitive 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 constraintsfrom_talkCounterintuitive 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 dependencyaboutFlat 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 waveaboutrespond_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 namespacesaboutBounded 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 dependenciesaboutdry-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 objectsaboutStateless 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_atCounterintuitive 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_atCounterintuitive 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?aboutApplication 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?aboutdry-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. 1related_toCounterintuitive 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