Summarized using AI

Not Invented Here: Things Rails Didn't Innovate

Caleb Hearth • July 10, 2025 • Philadelphia, PA • Talk

Introduction

"Not Invented Here: Things Rails Didn't Innovate" by Caleb Hearth at RailsConf 2025 explores how Ruby on Rails (Rails), while known for innovation, is deeply rooted in foundational software design patterns and concepts developed by others. The talk highlights key elements Rails is famous for, but did not originally invent, demonstrating how iteration and adaptation drive successful frameworks.

Key Points

  • Model-View-Controller (MVC):

    • Originally developed by Trygve Reenskaug in 1979 at Xerox PARC, not by Rails.
    • Early MVC concepts differ from Rails' implementation, such as how views and controllers interact, and the use of editors.
    • Rails' structure (app/models, app/views, app/controllers) closely follows the MVC pattern but adapts it for web development.
  • REST (Representational State Transfer):

    • Concept formalized by Roy Fielding in his 2000 Ph.D. dissertation.
    • REST predates Rails, but Rails helped popularize RESTful patterns (such as the seven default routes: index, show, new, create, edit, update, destroy).
    • Rails' approach encourages stateless communication and standardized resource routing, influencing many other frameworks.
  • Convention Over Configuration:

    • Principle promoting sensible defaults over manual configuration, allowing quicker setup and less boilerplate.
    • While Rails and Java's Spring Boot popularized this principle, the idea traces back to Eric S. Raymond, Rob Lanphier, and even the "law of least astonishment" from older programming texts.
    • Rails’ generators and assumed naming patterns exemplify this philosophy.
  • Active Record Pattern:

    • Martin Fowler introduced the Active Record pattern in 2003, just before Rails’ official release.
    • Rails’ Active Record gem extends the pattern to include validations, callbacks, and type mapping; though it occasionally blurs lines with other patterns like Data Mapper.
    • The gem's adoption led to conventions and some criticism (e.g., "God objects").
  • Merb Framework and Rails 3:

    • Merb, a modular Ruby framework developed as a "clean room" rewrite of Action Pack, contributed key ideas to Rails.
    • In 2008, the Merb and Rails teams merged, leading to the more modular, extensible Rails 3.
    • This transition enabled public APIs, plugin extensibility, and broad improvements in Rails' architecture and performance.

Illustrative Anecdotes and Reflections

  • The speaker shares personal reflections on influential community members, such as Sandi Metz, Katrina Owen, and why the lucky stiff, and how their contributions and ideas impacted the Ruby community.
  • The practical impact of these rules and philosophies is discussed, such as guidelines for maintainable code and the personal benefits of learning from established best practices.

Conclusion & Takeaways

  • Rails' strength lies not in inventing core programming concepts, but in skillfully integrating proven ideas to create a productive web framework.
  • Understanding the origins and evolution of these key ideas enriches developers and advocates for building on the accumulated wisdom of the software community.
  • Developers are encouraged to learn from and iterate on the best ideas, just as Rails did, ensuring lasting success and maintainability in software projects.

Not Invented Here: Things Rails Didn't Innovate
Caleb Hearth • Philadelphia, PA • Talk

Date: July 10, 2025
Published: July 23, 2025
Announced: unknown

Rails is a mixture of design patterns, practices, and magic. In this talk, we'll explore how Rails embraces ideas from other frameworks and projects.

Active Record was born of Martin Fowler. MVC was the brainchild of Trygve Reenskaug. Rails 3 completely absorbed the Merb project, gaining modularity and extensibility that it previously lacked.

We all learn by standing on the shoulders of giants, even Rails. By understanding the inception of design patterns, we are more likely to be able to create ideas of our own. This helps us to not only grow in our own ability, but to help others improve as well.

RailsConf 2025

00:00:17.199 Uh yes, I am Caleb Hearth. Um today
00:00:19.439 we're going to go over five main things
00:00:21.199 that Rails is well known for but which
00:00:23.760 it did not invent. uh model view
00:00:26.640 controller rest convention over
00:00:29.679 configuration active record and MERB and
00:00:32.800 I promise it's the only bullet point
00:00:34.960 slide that you'll see.
00:00:37.600 Uh model view controller or MVC was uh
00:00:41.200 originally written up by Trigva Renscog
00:00:44.320 in 1979. So it predates Rails quite a
00:00:46.800 bit.
00:00:48.320 Renscog spent 1978 through79 at the
00:00:51.760 Xerox I'm going to switch mics.
00:00:57.280 Xerox uh Palo Alta Research Center,
00:00:59.760 better known as Xerox Park. After as a
00:01:02.640 visiting scientist with the learning
00:01:04.080 research group while there he spent time
00:01:06.560 working on programs for the Dynabook,
00:01:08.960 specifically a project management tool
00:01:10.960 called Procon, which provided the frame
00:01:13.439 for the model view controller pattern.
00:01:15.439 This is not Triba. This is Alen K
00:01:21.280 uh holding the the DAB book.
00:01:25.920 Zeract Park famously incubated a number
00:01:27.840 of other influential products and ideas
00:01:29.920 including laser printers,
00:01:32.640 bit mapap graphics, graphable user
00:01:35.040 interfaces including windows icons and
00:01:38.000 mice as pointer devices,
00:01:41.520 object-oriented programming including
00:01:43.439 class and prototype inheritance
00:01:44.799 patterns,
00:01:46.320 the small talk programming language
00:01:47.759 which Ruby is heavily inspired by, and
00:01:51.040 even integrated development environments
00:01:52.880 or ids.
00:01:55.119 While at park, uh, Reinscog worked with
00:01:58.320 Adele Goldberg, Dave Robson, and others,
00:02:00.560 and wrote several letters describing
00:02:02.560 thing model view editor and tracing its
00:02:05.200 evolution into model view controller as
00:02:06.880 we know it.
00:02:08.879 MVC for Recogn
00:02:15.599 uh, in Rails of
00:02:18.480 and browsers.
00:02:20.720 MVC was conceived as a general solution
00:02:23.200 to the problem of users controlling a
00:02:25.520 large and complex data set.
00:02:28.640 A model represented knowledge at some
00:02:30.800 level of abstraction. An example of
00:02:33.599 different levels of abstraction he
00:02:35.040 mentions in models use controllers is a
00:02:37.680 calendar appointment versus a paragraph.
00:02:39.440 So slightly different than you might be
00:02:41.200 used to.
00:02:42.959 Reinsk's views and controllers are even
00:02:44.720 less analogous to rails similar uh
00:02:47.440 concepts. In his paper, a view was
00:02:49.599 purely representational and wouldn't
00:02:51.599 have contained something like a form
00:02:54.720 and a controller coordinated many views,
00:02:57.440 not just one, uh, and represented
00:02:59.599 different parts of the guey visible to
00:03:01.440 the viewer.
00:03:04.080 Sometimes the views could provide
00:03:06.000 editors, a concept present in MVC, but
00:03:09.120 more or less absent in our modern
00:03:10.640 representation, especially uh, in Rails.
00:03:13.519 Um, you can see it a little bit more
00:03:15.040 clearly in other MVC frameworks.
00:03:17.920 An editor was a special kind of
00:03:19.440 controller that could provide uh that a
00:03:23.840 view could provide to a controller as an
00:03:25.920 ephemeral object used to modify data.
00:03:28.560 The only uh valid way of getting a
00:03:31.680 controller an editor was for a
00:03:34.080 controller to ask a view for it.
00:03:37.519 The closest analogy I've thought of to a
00:03:39.680 view passing a controller to an editor
00:03:41.519 is an HTML form element. uh where an
00:03:45.360 HTML view renders an HTML form which
00:03:48.400 sends data over HTTP to a controller on
00:03:51.120 the server. In a sense, the controller
00:03:52.879 has requested this when it rendered the
00:03:55.360 page that uh view itself renders that
00:03:59.040 form inside.
00:04:02.879 Um, and the view creates it by
00:04:04.560 structuring the markup uh as part of
00:04:06.400 itself. And the browser then handles
00:04:07.920 that glue to connect the changes that
00:04:10.640 the editor wants to make
00:04:13.360 to the model layer.
00:04:17.519 Of the concepts that we're going to go
00:04:18.799 over today, MVC is probably the most
00:04:20.479 straightforward to see how it manifests
00:04:22.560 in Ruby on Rails because it's right in
00:04:24.800 how we structure our code uh
00:04:26.720 subdirectories under app for our models,
00:04:29.040 views, and controllers. And this is how
00:04:31.440 everybody's app folder looks, right?
00:04:37.520 Rails models abstract SQL operations,
00:04:40.639 provide validations, map columns to the
00:04:42.720 database uh to Ruby's data types, and
00:04:44.800 hold a lot of business logic.
00:04:50.560 We'll get more into that in the active
00:04:51.840 record section. That sounds so much
00:04:53.120 better.
00:04:54.800 Should I start over?
00:04:57.280 Its views are usually abstractions
00:04:58.720 around HTML or JSON representations of
00:05:01.280 data in that model, sometimes including
00:05:04.240 interactive elements.
00:05:06.960 Controllers provide a glue layer that
00:05:08.800 converts browser or client requests over
00:05:11.199 HTTP to messages that the model
00:05:13.360 understands and passes the result back
00:05:14.800 to the view layer. In most cases,
00:05:22.000 rest
00:05:24.400 education was once described to me by a
00:05:26.240 professor as exploring within a sphere
00:05:28.960 of knowledge representing all human
00:05:30.800 understanding. We start in the middle
00:05:33.120 knowing nothing and then expand in all
00:05:35.440 directions as we're exposed to all sorts
00:05:37.680 of information by teachers and
00:05:39.120 professors and parents and friends but
00:05:41.919 limited in that knowledge to which we
00:05:44.320 already have the tools to understand.
00:05:47.919 As we learn more, we're provided with
00:05:50.000 deeper learning in areas of knowledge
00:05:52.560 that are now accessible to us.
00:05:55.360 And hopefully some of that pies our
00:05:56.720 interest as we seek out even more in
00:05:58.639 these areas and we expand our area
00:06:01.440 within that sphere as we uh that we as
00:06:05.039 individuals understand and almost every
00:06:07.120 individual is going to have a unique
00:06:08.720 pattern within that sphere.
00:06:14.000 In order to receive a post-secary degree
00:06:15.759 like a masters or a doctorate we have to
00:06:18.400 write thesis or dissertations.
00:06:20.880 In doing so, we finally have to reach
00:06:22.639 the edge of what that sphere of
00:06:24.880 knowledge and we go even further making
00:06:27.039 the tiniest dent in the sphere of
00:06:29.919 knowledge. And as more people create as
00:06:33.520 as uh more and more people create these
00:06:35.360 tiny dents, the sphere itself is
00:06:38.560 expanded for future generations.
00:06:43.039 When Fielding Roy Fielding sought to
00:06:45.360 expand human understanding, he did so by
00:06:47.680 formalizing the description of
00:06:49.039 representational state transfer or rest
00:06:50.800 in his PhD dissertation architectural
00:06:52.880 styles in the design of neur work-based
00:06:54.880 software architectures.
00:06:56.720 Mouthful.
00:06:58.880 Before that, he contributed to standards
00:07:00.639 for URIs, URLs, and HTTP. And my alarm
00:07:05.120 for my standup is going off so that I
00:07:06.880 don't miss it.
00:07:08.720 and had worked with Tim Berners Lee,
00:07:10.319 inventor of the worldwide web at MV uh
00:07:13.280 at MIT's laboratory for computer
00:07:15.039 science.
00:07:16.560 He had also co-founded the Apache HTTP
00:07:18.720 server project and create contributed to
00:07:20.400 the creation of that server software.
00:07:23.360 Fielding's descriptions of REST like his
00:07:25.919 title are fairly academic, but the
00:07:28.800 dissertation is something that I think a
00:07:30.160 lot of us uh will run into at some point
00:07:32.080 in our careers. To be honest, I don't
00:07:34.080 read a lot of long fam technical
00:07:36.319 content, but I did read his dissertation
00:07:38.960 in preparation for this talk. So, you're
00:07:40.560 welcome.
00:07:43.120 It would take a whole lot to really go
00:07:44.400 over what REST looks like in Rails. And
00:07:48.080 um that would be an entire talk and
00:07:50.160 there have been several of those. One
00:07:51.360 that I recommend is Derek Prior's In
00:07:53.919 Relentless Pursuit of Rest from RailsCom
00:07:57.039 2017.
00:08:00.400 At a criminally simplistic level though,
00:08:02.400 REST in Rails manifests as the seven
00:08:04.639 default actions that we get when adding
00:08:06.400 resources for routes.rb file or that we
00:08:09.280 get when scaffolding a new controller
00:08:11.599 index, show, new, create, edit, update,
00:08:14.479 delete. Those CRUD actions as we call
00:08:16.960 them and none of these were blessed or
00:08:19.520 recommended by Fielding in his paper,
00:08:21.599 but there are seven so they are the
00:08:23.360 seven so-called restful routes that we
00:08:25.039 we use in Rails apps.
00:08:28.000 Rest and rails also means the requests
00:08:29.599 are stateless meaning that uh client and
00:08:32.399 server each maintain enough information
00:08:34.399 to allow requests and responses to be
00:08:36.240 handled uh in a fully encapsulated
00:08:38.560 manner. So a client should be able to
00:08:40.240 create a request and it should be able
00:08:42.000 to be handled by an entirely different
00:08:43.360 server running the same software
00:08:46.560 even though there's a SQL backend
00:08:49.680 coordinating some of that state. Uh
00:08:51.920 those servers you shouldn't need to be
00:08:54.240 tied to the same.
00:08:56.240 It also encompasses the way the paths
00:08:57.839 work in Rails where an HTTP verb uh
00:09:00.880 combines with an um a resource name and
00:09:04.000 an ID
00:09:05.920 uh to to give us the default
00:09:09.040 representation of an action like
00:09:10.480 get/post
00:09:12.560 comments.
00:09:15.440 Even if Rails did predate REST did
00:09:18.080 predate Rails, uh there's no denying
00:09:19.760 that Rails contributed to the idea
00:09:21.279 success and helped to popularize a
00:09:23.600 concept. It was later adapted by ASP.NET
00:09:26.720 Core, Django, Flask, Phoenix, uh, and
00:09:29.200 many other things.
00:09:35.360 Another very Railsy idea is convention
00:09:37.279 over configuration, meaning that
00:09:39.360 framework authors take a lot of leeway
00:09:40.959 in making assumptions about what your
00:09:42.640 application's going to do and how it
00:09:44.000 should do it and encoding those
00:09:46.080 literally as the conventional path.
00:09:50.080 For example, a whole blog could be
00:09:51.760 scaffolded in just a few minutes by
00:09:53.920 using Rails scaffold tooling, which
00:09:55.839 would provide a controller with a sub
00:09:57.600 and restful endpoints, views that back
00:09:59.920 them, and a model and database
00:10:01.760 representation that makes sense to
00:10:03.360 represent the necessary data. It's just
00:10:05.760 one example of convention, but
00:10:07.920 configuration's easily achieved here by
00:10:10.720 changing the files that the that have
00:10:12.160 been generated or changing some config
00:10:14.240 file or passing more flags to the to the
00:10:16.560 generator itself. Um, and those config
00:10:19.040 files are themselves generated by the
00:10:21.920 Rails new code generator.
00:10:25.200 While Rails and its contemporary Java
00:10:27.120 Spring boot certainly helped to
00:10:29.440 popularize the concept of convention
00:10:30.880 over configuration, the general precept
00:10:33.680 that programs should attempt to detect
00:10:35.839 things rather than force them to be
00:10:37.200 configured had been written about by
00:10:39.760 Eric S. Raymond in the art of Unix
00:10:41.440 programming in 2003. That they should
00:10:43.920 apply defaults but allow themselves to
00:10:45.920 be overwritten. had been expounded on by
00:10:47.680 Raymond and Rob Langley in 2004
00:10:51.279 in the art of Unix usability and indeed
00:10:53.920 the program should attempt to behave in
00:10:56.079 the least astonishing way possible had
00:10:58.399 existed for some time as Jeffrey James
00:11:00.320 showed us in 1987's the Dao of
00:11:03.600 programming where his fictional
00:11:05.360 programmer tells us that a program
00:11:07.200 should follow the least the follow the
00:11:09.120 law of least astonishment. What is this
00:11:10.959 law? is simply that programs should
00:11:12.720 always respond to the user in ways that
00:11:15.200 astonishes them least.
00:11:18.560 Even that master programmer was probably
00:11:20.399 referencing
00:11:22.000 ideas as far back as 19667's
00:11:24.720 PL1
00:11:26.880 or the 1972 book series which stated
00:11:30.399 that uh just that while systems should
00:11:33.279 adjust strive to adjust to the
00:11:34.720 peculiarities of the user and that
00:11:36.240 widely adapted configurations con
00:11:39.440 conventions sorry should be followed
00:11:41.200 wherever possible we should still adapt
00:11:42.800 to what is expected of our programmers
00:11:45.519 programs
00:11:48.160 While we have the benefit of hindsight,
00:11:49.519 it's easy to see a path that leads from
00:11:51.760 the law of least astonishment, the
00:11:53.279 principle of least surprise to code that
00:11:57.200 expects a a structure, prescribes a
00:12:00.000 structure in in app models and views and
00:12:02.640 and controllers and and attempts to
00:12:05.120 detect automatically that we want our
00:12:06.800 user model to read from the users table.
00:12:14.399 There's no doubt that active record is
00:12:16.480 closely associated with Rails. The top
00:12:19.120 10 hits for Kogi on active record uh
00:12:21.839 with spaces contains five references to
00:12:24.320 Rails which is actually lower than I
00:12:26.160 would have thought it would be. But the
00:12:29.040 design pattern active record which has
00:12:30.560 spaces in it unlike the active record
00:12:32.959 gem which does not uh actually does
00:12:35.360 predate Rails even if only by a little
00:12:37.440 while. Martin Fowler had first published
00:12:39.120 it in his descript a description of it
00:12:41.200 in patterns of enterprise application
00:12:42.720 architecture in 2003 which was the year
00:12:45.200 before Rails was officially released.
00:12:47.839 Fowler actually attended or spoke at
00:12:49.839 several Rails comps and other assorted
00:12:51.519 Ruby conferences. Over the years, while
00:12:53.680 I've never met him, he seems like a
00:12:55.360 genuinely good person from what I've
00:12:57.279 read and uh from and about him. This is
00:13:00.320 Fowler at the first Rails comp, I
00:13:02.000 believe, in 2006. It might be 2007.
00:13:07.440 Fowler described active record classes
00:13:09.120 as closely matching the record structure
00:13:10.720 of the database with responsibilities
00:13:12.480 for saving and loading data from the
00:13:14.880 database and domain logic that acts on
00:13:18.320 the data but specifically not for
00:13:19.760 converting fields from SQL
00:13:21.920 representations such as Rails does with
00:13:23.519 some types like enums unless you're
00:13:25.839 smart use strings
00:13:29.360 active record both as a pattern and a
00:13:31.120 library seeks to encapsulate the concept
00:13:32.959 of database interactions such as
00:13:34.399 retrieving creating updating and
00:13:35.680 deleting rows, SQL CRUD as well as
00:13:38.000 application logic. Rails extends the
00:13:39.920 responsibilities of active record
00:13:42.240 significantly not only to mapping data
00:13:44.880 to associated uh objects but
00:13:47.360 validations, callbacks and generally
00:13:49.360 trends toward junkiness in models if not
00:13:52.240 managed carefully. You've ever heard of
00:13:54.880 god objects and rails? Active record the
00:13:57.440 design pattern and active record the gem
00:13:59.040 are somewhat equally to blame for that.
00:14:01.519 But we're the ones putting junk in the
00:14:03.440 drawers.
00:14:07.040 Active record also takes other ideas
00:14:08.639 such as the unit of work from patterns
00:14:10.800 in the form of active record dirty which
00:14:13.279 tracks changes in an object that haven't
00:14:15.199 yet been committed to the database.
00:14:18.240 As an aside, I've heard for years uh
00:14:20.720 that anecdotally active record didn't
00:14:23.519 actually implement the active uh active
00:14:26.079 record design pattern or that it
00:14:27.519 diverged from it over the years or that
00:14:29.440 it no longer technically does. Something
00:14:32.079 else I've heard is that it actually
00:14:33.519 implements something closer to the data
00:14:35.040 mapper pattern than that the Ruby data
00:14:37.519 mapper gem which is no longer maintained
00:14:39.600 also borrowed from the active record
00:14:41.199 pattern. But in any case, I can't find
00:14:43.120 original sources that describe any of
00:14:44.560 that.
00:14:46.480 And either way, Valer also described
00:14:48.880 active record or data map in the same
00:14:51.040 chapter in the same book in the next
00:14:53.199 section.
00:14:56.399 Do you have any actual references uh to
00:14:58.639 this dichotomy? love for you to come and
00:15:00.399 find me in the hallway so that I can
00:15:01.760 learn about them. But
00:15:05.920 all right, finally, Merb.
00:15:08.160 Merb was a web framework that was
00:15:10.160 released in 2006 as a clean room rewrite
00:15:12.320 of action pack. It's sometimes seen as a
00:15:14.480 competitor to Rails, but neither its
00:15:16.560 authors nor the Rails team intended it
00:15:18.560 as such. Its original author was Ezra
00:15:22.000 Ziggmanovich who was joined by Matt
00:15:24.480 Emanetti, Yehuda Katz, and Carl Arch's
00:15:27.440 principal contributors to the project
00:15:29.199 which lasted for about 2 years until the
00:15:31.040 project to combine its ideas with Rails
00:15:33.279 kicked off in 2008.
00:15:35.600 MERB focused on modularity, public API
00:15:38.399 for plugins and extensions and
00:15:39.760 performance.
00:15:41.839 It existed in parallel to Rails for its
00:15:43.600 entire life. And in late 2008, Yehuda
00:15:46.560 Cats announced that the Merb team will
00:15:48.560 be working with the Rails core team on a
00:15:50.560 project to merge the things that made
00:15:52.959 MERB different into what would become
00:15:54.560 Rails 3 and eventually and unofficially
00:15:56.320 MERB 2.
00:15:59.199 On the same day, Ezra, Matt, Carl, and
00:16:01.839 the Rails blog also published posts with
00:16:03.920 their own takes on the announcement.
00:16:07.199 Now, I won't go too deep into this, but
00:16:08.639 Carl Larch and Yehuda Cats also created
00:16:10.639 Ruby's bundler and Rust's cargo package
00:16:13.040 managers. Yehuda
00:16:16.480 also went on to contribute to
00:16:17.759 JavaScript's yarn as well as
00:16:19.279 handlebars.js and embers.js, emberjs,
00:16:22.480 which for a while seemed like the deacto
00:16:24.320 choice until React sort of took over as
00:16:27.759 the front-end framework.
00:16:31.519 This is less true now after the keynote
00:16:33.759 maybe, but Yarla and Yehuda and Carl's
00:16:36.639 uh contributions to the Ruby and Rails
00:16:38.880 ecosystems have been very influential,
00:16:40.959 but their names are maybe less known by
00:16:44.320 developers today who are more likely to
00:16:46.800 recognize more famous ones like Matts or
00:16:49.199 Aaron Patterson or Eileen.
00:16:54.079 The merger with Merr brought a lot of
00:16:55.600 great ideas into Rails. It's when Rails
00:16:57.920 is split from a monolithic gym with
00:16:59.440 components like into components like
00:17:00.959 active record and action pack which
00:17:02.480 could be swapped out for other options
00:17:05.520 like data mapper and RSpec
00:17:08.559 uh as OM and testing tool.
00:17:11.360 It also brought in performance rewrites
00:17:13.360 of certain parts of Rails that Merbbit
00:17:15.520 implemented. And importantly, Rails
00:17:17.600 gained a documented public API
00:17:20.720 which allows for extensions which are
00:17:23.039 less likely to break across Rails
00:17:24.480 versions. Some of which include simple
00:17:26.559 form for a more robust Rails form
00:17:29.039 generator, device for user
00:17:30.720 authentication, Sidekick, I don't know
00:17:33.039 if Mike's here, but for background jobs,
00:17:37.280 and my own scenic, which adds support
00:17:39.520 for Rails migrations and database views
00:17:42.799 of database view, which are used by and
00:17:46.080 which is used by a few popular Rails
00:17:47.679 apps, including Master Lobsters.
00:17:52.000 On personal note, I wasn't doing work in
00:17:55.120 Ruby on Rails at this point, but the
00:17:56.320 Rails 2 to3 upgrade ended up being
00:17:58.720 notoriously difficult and I did help
00:18:01.120 with that and my first Rails job. So,
00:18:03.760 this is the first of these innovations
00:18:04.960 that I personally observed coming into
00:18:07.919 the ecosystem.
00:18:14.559 Rail's history is not one of reinventing
00:18:16.400 the wheel. built upon the ideas of the
00:18:19.280 greater software development corpus.
00:18:22.080 Rails stole ideas and in doing so it
00:18:24.799 built itself into a tool that's really
00:18:26.240 only useful if you want to quickly build
00:18:28.000 a web application that will continue to
00:18:29.679 be fast and maintainable for years and
00:18:31.679 on which you'll be able to build a
00:18:32.880 successful business.
00:18:34.400 That's
00:18:37.120 Rails wasn't seduced by the problems of
00:18:39.200 building a web framework from scratch
00:18:41.600 was designed at top the battle tested
00:18:43.520 ideas of others.
00:18:46.640 And as you build software, you should
00:18:49.200 base it on another idea that Rails
00:18:50.720 didn't innovate.
00:18:52.480 Express yourself to the best. Expose
00:18:54.400 yourself to the best things that humans
00:18:55.760 have done and then try to bring those
00:18:57.840 things into what you're doing. Steve
00:19:00.240 Jobs, Transer 1996.
00:19:05.039 All right. Really happy to be here on
00:19:07.120 stage at the final Rails Comp. It's been
00:19:08.960 really interesting. The book ended my
00:19:10.640 conference speaking career. Not only
00:19:12.400 because I plan to stop, not because I
00:19:13.840 plan to stop speaking, but because
00:19:16.559 The talk you just heard is my attempt on
00:19:18.640 improving on another talk of the same
00:19:21.039 name that I gave 11 years ago at
00:19:22.960 Scottish Ruby conference. I pitched this
00:19:25.600 talk with the same exact title and
00:19:26.880 abstract, but with a note to the program
00:19:29.039 committee of Rails comp that with 11
00:19:31.760 more years of Rails experience and many
00:19:33.520 more talks given, I thought I could give
00:19:35.760 a better version of what was to be
00:19:37.120 honest a good talk executed poorly. I
00:19:40.080 hope that you've gotten something out of
00:19:41.200 it.
00:19:44.240 Speaking of the last Rails comp, I want
00:19:45.760 to give thanks to a few missing faces of
00:19:48.160 past Rails comps.
00:19:50.320 People who once attended or spoke at
00:19:52.640 previous and we just don't see around
00:19:54.640 very often anymore.
00:19:57.360 Few for a few years there, Sandy Mets
00:19:59.919 seemed to be the keynote speaker at
00:20:01.840 almost every conference. I met her at an
00:20:04.400 unconference in Washington DC and we
00:20:06.320 bonded over a blog post that I had
00:20:07.840 written about strict adherence to rules
00:20:09.520 that she'd outlined.
00:20:11.840 your Ruby Rogues podcast episode.
00:20:16.080 This is the bottom line. She said that
00:20:17.679 your class can be no longer than 100
00:20:19.520 lines of code. Your methods can be no
00:20:21.280 longer than five lines of code. I wanted
00:20:23.600 four, but I felt like I had to give them
00:20:25.200 five. You can pass no more than four
00:20:27.919 parameters, and you can't make it one
00:20:29.360 big hash. Your controller in a Rails app
00:20:32.400 when it calls when a call comes into
00:20:34.720 your controller, it can only instantiate
00:20:36.320 one object to do whatever it is that
00:20:38.240 needs to be done.
00:20:42.559 I guess I didn't copy them in. But the
00:20:44.320 other rules is that your your view can
00:20:46.480 only reference one instance variable.
00:20:50.799 And the final rule is that if you can
00:20:52.400 convince your pair that you can break
00:20:53.600 any of these rules, you can.
00:21:01.360 Turned out that she'd come up with these
00:21:03.280 rules off the cuff based on a question
00:21:05.120 from one of the other panelists. But my
00:21:07.760 team and I had just finished a project
00:21:09.039 where for 7 months we took them as core
00:21:11.280 doctrine.
00:21:13.280 This is a bad slide. I apologize. Did
00:21:15.919 this during the keynote earlier.
00:21:18.559 The blog post I wrote up about it is
00:21:20.400 actually still up. And I think that uh
00:21:22.159 strictly adhering to those rules one um
00:21:25.679 is will lead you to having a real really
00:21:27.360 maintainable
00:21:28.960 understandable codebase that you'll want
00:21:30.400 to keep working in for a long time and
00:21:32.240 more importantly that other people won't
00:21:34.720 hate you for having written.
00:21:37.120 Sandy's also the person who taught me
00:21:38.480 that a wonderful way to support a
00:21:40.559 speaker in a conference is to be in the
00:21:41.840 front row at a nod squad. Reacting
00:21:44.400 positively but quietly whenever a
00:21:46.000 speaker says something interesting and
00:21:47.280 maintaining eye contact a friendly face.
00:21:49.600 It gives the person on stage somewhere.
00:21:51.840 They can always look out to in the crowd
00:21:54.240 and get a little boost of confidence as
00:21:56.080 they give their
00:21:59.280 around the same time I got to know
00:22:00.400 Katrina Owen. Katrina was a regular in
00:22:02.960 the Ruby conference circuit as well and
00:22:04.480 we met at Rubicon Portugal in 2014. She
00:22:07.679 had just founded Electron to help
00:22:10.640 developers learn new programming
00:22:12.080 languages.
00:22:14.480 Not Electron, Exorcism.
00:22:15.919 Yeah.
00:22:18.799 At the conference, she gave a talk
00:22:20.080 called Overkill on taking on a massive
00:22:23.600 legacy codebase, refactoring, adding
00:22:25.840 tests, and generally making code more
00:22:28.799 maintainable and less painful.
00:22:31.440 But one of my most distinct memories of
00:22:33.120 Katrina was from a few years later when
00:22:35.760 we were taking a walk out with outside
00:22:37.600 of a go conference that she was speaking
00:22:39.280 at and I just happened to be in town
00:22:40.559 for.
00:22:42.159 We stopped at a crosswalk and there were
00:22:44.240 no cars coming so I started to walk. She
00:22:46.720 asked me to wait. She told me that one
00:22:49.600 of the ways that she helped herself
00:22:51.840 maintain energy for making decisions
00:22:53.440 through the day was that she never
00:22:56.320 crossed against a walk signal. I hadn't
00:22:59.039 been diagnosed with ADHD yet, but now
00:23:01.280 that I have and I think more about this
00:23:02.720 kind of thing, the wisdom of deciding
00:23:04.640 not to decide really jumps out to me.
00:23:10.080 Finally, why the lucky stiff?
00:23:13.440 Uh, I have no idea what wise name really
00:23:15.679 is, but he wrote a book called Wise
00:23:17.840 Poignant Guide to Ruby, which was my
00:23:20.240 original introduction to the Ruby
00:23:22.480 language. It was 2008 and I just found
00:23:25.039 out that my internship at a defense
00:23:26.880 contractor. See my other talk I built
00:23:29.200 software to kill people
00:23:31.919 would be ending with a job would not be
00:23:33.600 ending with a job offer and that I had
00:23:35.600 gotten but that I had gotten an
00:23:37.039 interview for working in a language
00:23:38.880 called Ruby which I had sort of heard of
00:23:41.280 in something called Rails which I hadn't
00:23:43.440 to build apps which I think are those
00:23:45.120 things on your phone for the web. I went
00:23:48.640 through the guide. It was a whimsical,
00:23:50.159 funny introduction to a community that
00:23:52.559 I've now been part of for almost 15
00:23:54.080 years and that all of you are also a
00:23:55.360 part of. So, thank you. It's something
00:23:57.679 that I definitely want to give another
00:23:59.520 read to soon. And if you haven't read
00:24:00.960 it, you should as well.
00:24:03.440 Other contributions include the original
00:24:05.200 YAML API for Ruby, try Ruby, and my
00:24:08.640 favorite feature in Rails, Blank.
00:24:12.400 blank.
00:24:17.520 This is 100% human created talk. All of
00:24:20.559 you are going to spend your combined
00:24:22.000 time here. It was only fair that I spend
00:24:24.159 my time coming up with interesting
00:24:25.760 things to say.
00:24:27.919 Would like to thank my employer
00:24:29.279 files.com for sending me to Rails Comp
00:24:31.440 this year. Files provides businesses
00:24:33.520 with file automation and delivery and we
00:24:35.440 have a very big, very custom Rails app.
00:24:37.039 We're always looking for more Rails
00:24:38.159 stuffs. Finally, I'd like to share
00:24:40.400 something that I've been working on. an
00:24:42.480 app for iOS and Mac OS called Village.
00:24:45.440 The goal is to help you keep in touch
00:24:46.799 with people, friends, family, co-workers
00:24:49.440 around the world across different time
00:24:51.200 zones by giving you a little reason to
00:24:53.200 reach out. Right now, it shows each
00:24:55.520 person's local time and weather, but I
00:24:56.960 have a lot of other ideas of things that
00:24:59.440 I'd love to add to it. Um, and if you're
00:25:01.760 interested, um, please go ahead and v
00:25:03.679 visit village.calebarthth.com
00:25:05.760 to sign up for the test flight, and I'll
00:25:07.120 get you added as soon as I can.
00:25:11.520 Thanks. I've been Caleb Hearth. You can
00:25:13.200 find me on Mastadon at
00:25:14.240 calebcalearth.com. Based on that, you
00:25:16.880 can probably guess where else you can
00:25:18.000 find me as well.
00:25:20.400 And that's it. Thank you very much.
Explore all talks recorded at RailsConf 2025
Ben Sheldon
Sam Poder
Rhiannon Payne
Joe Masilotti
Josh Puetz
Wade Winningham
Irina Nazarova
Tess Griffin
+77