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.