00:00:15.280
and I am just super excited and super honored to introduce our closing keynote
00:00:22.000
speaker uh Nadia she's just an amazing human and does so much for the community
00:00:27.480
and is such an inspiration to all of us can we just give her a big round of
00:00:39.160
applause Nadia she is the founder and CEO of the story graph which is the main
00:00:44.520
alternative to good reads and she is crushing it right now um she's just
00:00:49.800
crushing it it's amazing she was showing us her like new user registrations and that graph just sorry I'm riffing off
00:00:56.480
your bio by the way sorry but yeah it's just incredible to see um she uh good
00:01:03.879
the story graph it helps people discover what they want to read based on their mood and topics or themes that they're
00:01:10.479
interested in she's a one-woman Dev team which is absolutely incredible and she
00:01:16.119
built her platform using Ruby on Rails um it serves millions of users
00:01:21.720
worldwide and she didn't just start writing code she actually got her degree
00:01:27.439
in philosophy politics and economics like over aever um at Oxford University
00:01:35.840
so she was actually going to be an investment banker but then she decided to learn code uh she did a boot camp in
00:01:43.799
London which is awesome and decided to be an engineer she worked at pivotal
00:01:49.560
labs and then she started her entrepreneur Journey um she also really
00:01:55.560
enjoys dancing if you haven't seen her dance or any of her dance videos you should follow her on Instagram because she's an amazing dancer um really into
00:02:04.240
fitness and of course reading she always has a book and as a testament to her broad range of skills and interest
00:02:10.479
she'll be presenting something a little different from your usual Keynotes so
00:02:15.480
we're in for a treat so get ready for a fun and unique talk on all things Ruby
00:02:21.400
welcome Nadia
00:02:38.640
hi everyone it's such an honor to be the closing keynote of Ruby comp this year
00:02:43.720
thank you so much to Kinsey and all of the organizers for having me do this so as you just heard my name is Nadia o and
00:02:51.480
I'm the founder and CEO of a company called the story graph a Reading Tracker
00:02:57.000
and book recommendations app we we help you to choose your next book based on
00:03:02.760
your mood and your favorite topics and themes we've got a whole range of stats
00:03:08.959
where you can learn about your reading habits and see how they develop over time we've got machine learning powered
00:03:15.200
personalized recommendations it's like a trusted go-to friend who knows your
00:03:20.440
preferences but whose brain is also a book Encyclopedia you can find your next
00:03:26.920
perfect read by filtering lists of books by mood Pace fiction and non-fiction
00:03:32.799
genre book size and more you can also read alongside friends
00:03:39.080
adding live reactions to specific parts of the book and the comments remain locked until your friends reach that
00:03:46.200
specific part in their reading and there's a whole lot more on
00:03:51.680
offer we have 10 million unique monthly visitors who generate 70 million page
00:03:57.760
views per month and each each day we serve 11 million requests so that's
00:04:03.319
around 330 million requests a month now not only are we profitable we
00:04:09.760
are 100% bootstrapped we've taken no outside
00:04:15.479
investment thank you so people often ask me what is story
00:04:23.080
graph built-in and I love that I can say Ruby on Rails
00:04:35.479
activity we get a lot of customer feedback feature requests and Bug
00:04:40.520
reports and given that I run the company's Instagram threads and Twitter accounts I'll often receive messages
00:04:48.120
that include something like if you could pass this on to your Dev team that would be
00:04:54.400
great now while I have an absolutely awesome co-founder in Rob fro
00:05:00.320
the web and app Dev team is made up of just me in fact I was the opening keyot at
00:05:06.400
reals comp in Detroit earlier this year and my talk was titled getting to two million users as a one-woman Dev
00:05:13.840
team when I first gave a version of this talk back in October 2022 at the
00:05:19.720
inaugural rail SAS conference in La the talk was titled getting to 1 million
00:05:24.840
users as a one woman Dey and if I were to give this talk
00:05:30.000
today as of a few days ago I'd have to update the title to be getting to 3
00:05:36.360
million users as one oh
00:05:42.800
wow well thank you so when I was putting together this talk um we were at around
00:05:48.360
2.9 Million registered users and I did the math and I figured that we would get
00:05:53.479
to 3 million like like today or yesterday so I've been keeping tabs on the user numbers to so to know whether I
00:06:00.400
would take this out or not um but we went viral on Tik Tok the other day so
00:06:05.479
now we're like 70,000 users past 3 million so it's just it was just quite funny
00:06:14.000
thanks oh you're really like the intro I hope you like the the meat of the
00:06:20.080
talk uh so as you can imagine I've got a lot of work to do and it can be stressful at times but I keep the stress
00:06:27.759
at Bay by making time for myself and my hobbies wherever I can I read of course
00:06:34.560
as Kinsey said I dance I lift weights at the gym and I
00:06:39.639
hang out with my friends and family so this is my siblings and I on a trip in
00:06:44.680
Mexico earlier this year and I'm the oldest though I don't look
00:06:50.160
it so yeah all of those things keep me mentally healthy and at peace I've been running story graph for
00:06:57.280
six years now and people often wonder why I haven't burnt out yet and I reckon
00:07:02.360
it's because I make time for all of those things
00:07:07.440
but I have a secret don't tell
00:07:13.080
anybody some of you may already know what I'm about to say but you can't tell
00:07:18.840
anybody else you see I've got this Secret side
00:07:24.120
gig that's been taking time away from story graph work sometimes stressing me
00:07:29.319
out out and definitely increasing my risk of burnout you see I'm not just the founder
00:07:35.919
CEO and soul developer of the story graph I am also a private
00:07:44.080
investigator and what is it I investigate you wonder yes you guessed
00:07:49.280
it Ruby crimes no not Jew theft I investigate
00:07:55.520
crimes and Mysteries relating to our favorite programming language I've been doing this also for about six years now
00:08:03.000
and what got me into it in the first place well there had been rumors
00:08:08.479
circulating of a shady Mastermind causing havoc and confusion amongst Ruby developers worldwide with his constant
00:08:15.199
meddling in the source code and I wanted to be the one to put a
00:08:22.800
stop to him oh and I'm sure all of us here know
00:08:28.400
just how lucrative of the world of Ruby private investigating is I decided that I couldn't do this
00:08:34.919
side gig under my normal name no I needed to protect my identity so I
00:08:40.959
decided to call my Ruby private investigating Alter Ego dear Dre buug D
00:08:47.240
for short why well isn't it rather
00:08:54.360
obvious now I've got several stories from my years of doing this work in fact
00:09:00.320
I've shared them at previous Events maybe you've seen some there was case number 17 the case
00:09:07.480
of the Missing Method where Mike a junior Ruby Dev at the time was betrayed by his best friend
00:09:14.880
Jenny when they were competing for a coveted internship spot at the world famous Ruby Institute of professionals
00:09:22.920
you know the organization whose whole reason for existing is to see to it that the Ruby language and Community stays
00:09:29.000
alive live and kicking forever I don't know why they never changed their logo anyway Jenny gave
00:09:37.279
Mike dodgy interview prep notes which incorrectly explained how Ruby method lookup worked denying the existence of
00:09:43.920
Singleton classes I eventually cracked the case and found the answer but Mike lost a
00:09:52.440
best friend and then there was case number 48
00:09:59.600
the case of the vanished variable where none other than Jenny got
00:10:06.480
in touch asking for my help how the tables had turned because her colleague
00:10:12.800
Alex tried to sabotage her team in an rip startup incubator competition final
00:10:18.839
where there was $500,000 up for grabs by confusing everyone with class variables
00:10:25.200
and class instance variables knowing that people often didn't understand understand the differences in how they
00:10:31.720
worked do you all know the differences are you
00:10:38.120
sure anyway Alex intentionally introduced a bug to his team's code so
00:10:43.320
his girlfriend who was on the other team could win ay I I I've seen a lot of Ruby drama
00:10:51.440
over the years and that's only two cases so you can imagine what else I've seen
00:10:57.800
just recounting those stories was tiring and so I've decided that today will be
00:11:02.920
the final debug story I'm going to share case number
00:11:08.040
410 the case that led to my retirement from the Ruby private investigating
00:11:13.240
field this is the case of the peculiar
00:11:18.320
pattern chapter one it's the last day of the month and I decide to get an early
00:11:24.120
night the next day was a big day Apple were featuring me and the story for
00:11:29.920
their annual Black History Month campaign and we were going to be front page of the App Store worldwide leading
00:11:35.480
to a surge in traffic I'd also finally beater launched a new special feature
00:11:41.120
reading circles where people were automatically placed into groups with readers with similar interests they
00:11:47.839
could buddy read books share recommendations keep each other accountable with their reading goals and
00:11:53.720
more the Apple feature was going to be a great way to showcase the Innovative work we were doing
00:12:00.800
everything seemed to be running smoothly by the time I'd gone to bed and all of a sudden I'm woken up by my phone
00:12:07.440
ringing it's Rob Reading circles aren't working a big book influencer posted
00:12:14.120
about it and we're getting so many complaints people are being added to the wrong groups their recommendations are
00:12:19.839
off and the public directory is empty even though I can see a bunch of groups have been created I wouldn't have woken you up but
00:12:26.880
I know you won't want this broken when the Apple feature goes live I look at the clock it's 2:00
00:12:33.760
a.m. I also notice I have a message on my phone from Jenny long shot but any
00:12:39.560
chance you around for an emergency rip case oh hell no not now I've got my own
00:12:46.680
emergency case to deal with I head out of bed and head down to my
00:12:52.199
desk chapter 2 now let me talk you through what the code looked like that night it'd be too
00:12:59.760
difficult for me to show you the code as it was so I'm only going to show you a simplified version which extracts the
00:13:05.639
key parts so here we have a simplified version of the reading Circle class we
00:13:11.920
Define a new class called reading Circle this class will manage groups and their members within a reading Circle
00:13:17.959
Community we then define a class method called groups and we define a class instant instance variable groups to
00:13:25.320
store our groups we use a conditional assignment operator to initialize groups
00:13:30.800
only if it hasn't been set already and we store the groups in a hash structure it was beta I wanted something quick
00:13:37.040
that worked well and if a certain group doesn't already exist we just return an empty
00:13:42.279
array then we Define another class method add member that takes a group name and a user we access the group's
00:13:49.800
hash using the group name as a key and append the user to the array corresponding to that group and then we
00:13:56.759
print out a helpful message we Define another class method called publicly listable to determine if a
00:14:04.000
group should be listed in the app-wide public directory we attempt to retrieve
00:14:09.160
the members of the specified group key returning an empty array if the group doesn't exist we then start a case
00:14:16.000
statement to perform pattern matching on the members array now the real life scenario was a lot more complex than
00:14:22.800
this but I've simplified it here to just check for at least two members so that's
00:14:28.759
either an array with exactly two elements or an array with at least three elements with the underscores acting as
00:14:35.920
a wild card and matching any value if the pattern is matched the publicly
00:14:41.399
listable method returns true otherwise it returns
00:14:46.680
false as a debugging starting point I decided to head to the terminal I
00:14:52.120
started an IB session and loaded in the class and then I added in a couple
00:14:57.399
members Alice and Charlie to a group called fantasy I check that there are indeed
00:15:03.639
two members in the group as expected the minimum criteria for a group showing up in the public
00:15:09.360
directory and then I call publicly listable and it returns
00:15:15.600
false but the fantasy group matches the true branch in the pattern matching case
00:15:20.880
statement the method should return true not
00:15:26.160
false what a mystery now I'm not proud to admit it but I was
00:15:33.800
feeling lazy that day or that night I should say I hadn't slept enough it was
00:15:40.040
12 2 in the morning normally I'd only reach out to this person when I'd already cracked the case and needed more
00:15:46.920
context but this was an emergency so I pick up the phone and call Ellen she was 47 an experienced
00:15:55.639
freelance developer who'd seen many things she she regularly brought what she'd learned on her adventures to the
00:16:01.720
Ruby code base she'd helped me to understand aspects of Ruby internals many a time and now it was time to get
00:16:09.199
her expert eye in advance so I give her a call and it
00:16:14.240
rings once before it's cut off I go to text her but see that she herself is
00:16:20.720
typing I'm sorry can't talk right now family
00:16:26.199
emergency I look at the clock quarter past 2 not a lot of time before the
00:16:31.759
feature goes live I have a think it's late I'm tired and time is of
00:16:38.959
the essence I need to be strategic here so I decide that while I continue to
00:16:44.959
debug myself I'm going to go to a forum
00:16:50.279
what's the worst that could happen I doubt it but in my tired and
00:16:55.720
distracted State maybe somebody can get to the bottom of this bug before I do
00:17:01.720
after checking that there wasn't an existing similar question I post my own listing out the
00:17:07.959
issue in its basic form I get up to make some coffee and when I return to my desk
00:17:13.160
and do a page refresh I see I've already got one response the Shadows hold the patterns
00:17:19.600
but only one Shadow is moving I roll my
00:17:25.799
eyes I do not have time for nice one right now they're always cropping up
00:17:31.520
randomly posting cryptic messages and never actually helping having gotten excited thinking
00:17:38.880
someone had already come along to solve my problem and seeing it was nice one up to their Antics yet again now I'm
00:17:46.880
frustrated so I decide to call their Bluff for once if you actually know
00:17:52.799
what's up let's pair right now okay then
00:17:59.000
this is wild I am shocked nice one as
00:18:04.039
I'm sure many of you know is an enigma to my knowledge they've never paired
00:18:09.320
with anybody before nobody even knows what they look like what they sound like
00:18:15.000
at this point I'm just excited to meet the person behind the handle and hopefully crack this
00:18:22.000
bug chapter 3 nice one takes a while to get ready
00:18:27.520
when they are they send me a random video conferencing link and say there'll be no video only voice oh and I'll share
00:18:35.440
my screen and be the one doing all of the driving they'll only be there to point me in the right
00:18:41.960
direction it's even later and I'm even more tired and concerned about running out of time so I'm not sure I'm going to
00:18:49.200
have the patience for nice ones cryptic Clues but it's the best I've got right
00:18:54.600
now I join the call and say hello I hear some faint background noise but nothing
00:19:00.400
else then a voice comes out of my
00:19:06.480
computer what do you know so far okay then no pleasantries I guess
00:19:13.080
we're getting straight into it fine with me I say well I know the pattern
00:19:18.799
matching isn't working how would you verify
00:19:23.880
that uh I guess I extract it extract the pattern I isolate the problem so I share
00:19:31.200
my screen and head back into IRB I load in this publicly listable method which
00:19:37.600
takes a collection of groups and a specific group key and then returns true or false based on the same pattern as in
00:19:45.320
my reading Circle class and then I set up a group's hash that mimicked what I had from my
00:19:51.480
experimentation earlier and then call publicly listable on the groups and it returns true for both as
00:20:02.000
expected so it can't be the pattern then because in isolation the matching is
00:20:07.799
returning what I'd expect the bug must be somewhere else the starting pattern is that your
00:20:15.679
production pattern what on Earth is nice one on about why do they speak in
00:20:23.520
riddles and then it hit me what was my starting pattern or my starting point
00:20:30.360
during my debugging I had this but do I start with that in
00:20:36.919
production I SSH into my production server and take a look at what reading circle. groups returns and it returns an
00:20:45.280
empty hash but before I'd gone to bed I'd seen that people had been posting about their
00:20:51.720
groups I go back to one of my old local terminal windows and try the same method
00:20:57.200
there and again then it returns an empty hash even though I can see above that
00:21:02.280
the fantasy group has two members in it so I wasn't even starting from the correct place during my debugging
00:21:09.159
efforts why was reading Circle do groups empty nice one who I'd momentarily
00:21:15.840
forgotten was there chimes in again as I said the Shadows hold the patterns but
00:21:22.799
only one Shadow is moving what on Earth are they on about
00:21:29.720
I ask if they can be a little less cryptic and when I hear nothing on the other end I decide to try and dig in
00:21:37.200
myself a little more the Shadows hold the patterns what contains patterns in my
00:21:44.440
code well the publicly listable method but only one method is moving that
00:21:51.799
doesn't really make sense the code isn't changing why Shadows what creates a
00:21:58.200
shadow anything can any anything any any
00:22:03.559
object wait a sec if a shadow is moving then the object that's creating it is
00:22:10.520
moving so one Shadow is moving means only one object is
00:22:17.320
moving then I remembered something I'd learned about during case 17 Missing
00:22:23.080
Method I'd learned about object space from a guy at co-working space who told
00:22:28.960
me that it was a way to interact with all of the live objects within a ruby
00:22:34.880
session it had helped me to discover Singleton classes back then when I
00:22:39.960
noticed that two new objects were being created in a ruby session every time a
00:22:45.919
single new class was instantiated one other method the guy
00:22:51.640
had T me about during my investigation was object ID it returns an integer ID
00:22:57.320
for an object and the same number will be returned on every single call of object ID for that object and no two
00:23:05.559
active objects within a session will share an ID I decided to see what it returned for
00:23:12.200
my different groups within a session I head to an old terminal window where I already had a couple of groups
00:23:18.640
set up and require object space before calling object ID on each of the groups
00:23:24.880
and the same ID was returned so the different groups were the same
00:23:30.559
object but why and how then I hear nice one's voice again
00:23:36.640
you've solved it but remember the each method takes a
00:23:42.640
block huh yeah I know that each method takes a block we must choose between
00:23:49.360
Purity and pragmatism huh time for lunch nice one says and
00:23:57.120
then they're gone I look to the clock and sigh it's time to properly wrap up this
00:24:05.840
bug chapter four so I know a few things right
00:24:10.919
now the different groups all have the same object ID but reading circle.
00:24:16.799
groups returns an empty hash when it should be returning the groups and their
00:24:22.440
members if not from the groups method reading Circle has to be accessing these groups somewhere to be able to print the
00:24:29.320
group members there was another method I discovered during my play with object
00:24:35.399
space reachable objects from which showed you all methods a given object
00:24:40.520
had a reference to perhaps I could figure out where the groups were're living so I head to a terminal window
00:24:47.120
and call the method on a fantasy group I set up and it Returns what I'd expect an array with the items Alice and Charlie
00:24:55.279
and I start to feel like I'm really on to something when the phone Rings it's Jenny and now I remember her
00:25:03.279
text from earlier I'm really sorry to bother you but it's an emergency and before I can cut her off
00:25:10.000
she starts talking she explains how the rip grant program has a feature launching for black history months that
00:25:16.200
day and there's an issue with this new accountability groups feature that's going
00:25:21.240
live everyone is in the wrong group well it looks like everyone is in all of the
00:25:26.360
groups actually and hang on AE minute I say interrupting her this sounds very similar to the
00:25:33.600
problem I'm having send me your code of course Jenny wastes no time at
00:25:40.240
all to do so and I open it up immediately I'm quickly skimming through
00:25:46.000
and it looks nothing CL mine except for one part when Jenny initializes an
00:25:52.640
accountability group she also uses the conditional assignment operator to create a new hash with a default empty
00:25:59.559
array if the class instance variable hasn't already been instantiated exactly like I do in the
00:26:07.640
reading Circle code I head back to my terminal to try something else with reachable objects
00:26:14.279
from I set up a variable X to be equal to Hash do new where the hash returns an
00:26:19.440
empty array if a key doesn't exist and then I check the reachable
00:26:25.000
objects the hash and also the default empty array I add the name Aaron to a new key
00:26:33.000
fantasy and then I check which objects are reachable from X and as I suspected
00:26:38.279
what I assumed to still be the default array has been changed to contain Aon
00:26:43.840
and X returns an empty hash because when I tried to access the fantasy key on X
00:26:50.600
the key didn't exist so the default array was returned and mutated the default array was the one object that
00:26:57.640
was changing every time it was the one shadow that was moving a nice one tried to tell me
00:27:05.279
straight away that patent matching wasn't the problem just to be doubly sure I go and
00:27:11.279
test out object ID on a key that I know doesn't exist and so we'll return the default array and lo and behold it's the
00:27:19.840
same ID what an interesting ruik Quirk Drew
00:27:25.360
is Drew in the room do you get cash for some questions to who wants to be a ruby
00:27:38.440
the story it's 4:17 a.m. in the morning it's h I have to hurry and fix the code
00:27:44.960
but how do I fix this the fact that there's only one array that's being passed around and
00:27:50.679
overwritten implies that the initialization is only ever executed once but I need it to be executed
00:27:57.519
multiple times each time there's a new key each
00:28:03.000
each the each method is an innumerable taking a block and executing each time
00:28:08.679
for every item in a list but how can I use this
00:28:13.880
info and then nice one's words came back to me they are always one to be cryptic
00:28:20.279
and I think I had just solved another of their riddles they had said each method takes a block
00:28:28.919
but did they mean to tell me every method takes a block does has. new take a
00:28:36.880
block I decide to try I head to my terminal and type in has. new passing a
00:28:43.360
block that puts high if a key doesn't exist and it doesn't blow
00:28:49.559
up it works okay so what do I need I need that
00:28:55.399
each time there's a new key I need for a new default empty array to be created
00:29:01.039
not for one single one to be universally used so I try something like taking the
00:29:07.039
hash H and say for each key give me a new
00:29:12.679
array I adjust my code and then load it into an IB session to test it
00:29:24.159
out now reading circle. groups is no longer empty and publicly listable is returning
00:29:34.120
true case
00:29:39.440
closed thank you it was really hard so by the time I'm done fixing my
00:29:45.240
burgain jour's ensuring that there are proper tests I've only got about an hour before I'm due to wake up I'm wrapping
00:29:52.240
up the final bits and pieces when the phone rings it's Ellen she's got a a moment
00:29:58.480
checking in and after establishing that her family situation is under control I give her a quick rundown of the bug and
00:30:05.440
the discovery of the hash's empty array default value causing all of the
00:30:10.720
problems why does Ruby behave this way I asked she explains that it's a side
00:30:17.440
effect of the fact that in Ruby all data structures are passed by reference a data structure is a way of storing and
00:30:24.120
organizing data like arrays hashes and so on in Ruby when you assign an object
00:30:30.080
to a variable or pass it as an argument to a method you're always creating a reference to the original object never
00:30:36.799
creating a new copy of that object so when you set the default value of the hash to an empty array you not
00:30:44.000
saying return a new array each time you're passing a reference to one particular array and saying use this the
00:30:52.039
alternative would be passing by value which means that when you assign an object to a variable or pass it to a
00:30:58.000
method a new copy of that object is created each variable or method argument
00:31:03.519
gets its own copy of that object so changes to one don't affect the others Ruby chose pass by reference for
00:31:11.440
objects because it's more efficient creating copies of complex data structures every time would consume a
00:31:17.919
lot of memory and processing power passing references allows Ruby to be more performant and
00:31:24.320
flexible but there's a trade-off as you've seen Ruby devs have to manage object references carefully to avoid
00:31:31.480
unintended shared State Ellen is so wise right I'm sure
00:31:38.279
many of you have had the pleasure of speaking with her don't you find that she always makes things so much clearer
00:31:44.519
she always makes them make sense she always shows up conveniently at the exact moment I need
00:31:50.720
her I thank her for her time once again we say our goodbyes and I wrap up the
00:31:55.840
final bits and pieces before going to get a few hours of sleep hoping that everything runs smoothly
00:32:03.120
tomorrow chapter 5 it's one month later and story graph
00:32:09.519
is going from strength to strength after the Apple feature went live traffic surged and the reading circles feature
00:32:16.159
was a big hit officially launching just a few weeks later but now I'm struggling struggling
00:32:22.880
to juggle story graph work and Ruby private investigating I want to give up
00:32:28.880
but I can't let it go one afternoon I'm reading an old
00:32:33.919
issue of the rip alive newsletter when I see an advert for a special guest
00:32:39.559
lecture that's happening that very day in fact it had already
00:32:44.799
started but the guest lecturer was none other than
00:32:51.279
Matts I immediately hurry over and turn up just in time to catch the last 10
00:32:56.840
minutes Matt had been talking about mutable strings in Ruby and he's going
00:33:01.880
through his final points when he says something that stops me in my tracks sometimes in Ruby we must choose
00:33:09.679
between Purity and pragmatism where had I heard that
00:33:16.360
before we must choose between Purity and pragmatism nice
00:33:22.760
one they had disappeared quickly afterwards saying time for lunch and I I
00:33:27.880
remember having the fleeting thought that I didn't know where in the world they were but it was very likely
00:33:33.360
different to me because it had been just before 400 a.m. where I was 3:48 a.m. to
00:33:39.799
be exact I pull out my phone and do a quick Google search for what the time would
00:33:45.240
have been in Japan 12:48 definitely an appropriate
00:33:52.480
lunchtime oh my gosh nice one was
00:34:00.760
mattz chapter six I run after mattz and Corner him as he's leaving the building
00:34:07.639
it was you all along you're nice one you've been anonymously helping
00:34:12.760
developers all of this time but why he sighed softly a small smile
00:34:19.520
forming on his face as a language Creator I needed to understand how
00:34:25.639
developers use Ruby and what challenge Alles they face he said but if I just
00:34:30.720
directly helped them they might not learn to explore and discover Solutions on their
00:34:36.599
own so you chose to help from the Shadows yes he said I wanted to guide
00:34:44.879
not give all of the answers encouraging developers to think deeply is important
00:34:51.320
and besides a language Creator should care about their Community should want them to succeed
00:34:58.160
I want everyone to succeed I've been watching you from afar Nadia or should I say
00:35:05.520
d always hoping you'd overcome each Challenge and grow stronger because of
00:35:10.720
them and I can see that you have I am taken aback by mat's
00:35:19.599
words I I don't know what to say I'm about to ask some more questions
00:35:26.560
but then Matt's glances at his watch and says I have to go but please don't tell
00:35:32.040
anyone that I'm nice one I'd rather keep it between us oh my gosh Max I am so
00:35:40.800
sorry no matx please come back M I wasn't
00:35:46.280
thinking please I wasn't thinking come back I'm sorry oh thank
00:35:51.480
you oh thank you I'm so sorry I wasn't thinking I was
00:36:03.240
well you know I was surprised that my secret identity was revealed
00:36:11.280
today but I realize it's time to stop hiding as I said in my opening key out
00:36:18.599
Ru was created to make programmers happy and to bring joy into
00:36:24.480
coding let's continue to help one another because only then can we keep
00:36:32.319
the heart of Ruby and this wonderful community alive I love you
00:36:38.760
all and I am proud of you thank you thank you
00:36:53.560
m thank you Matt thank you for being so gracious with my hipop wow what an adventure this has
00:37:02.480
been you know it just hit me it was in
00:37:07.920
his name all along Matt's is nice one mat's is
00:37:14.720
nice our community is better when we all try to be like Matts we should all
00:37:20.400
strive to be as nice and helpful as he is to lift each other up because only
00:37:26.240
when we do that can can we truly embody the spirit of Ruby it's not just about the code we write but the connections we
00:37:33.680
make and the support that we offer let's keep that Spirit Alive let's keep
00:37:39.240
choosing to be open welcoming giving and kind it's what sets the Ruby Community
00:37:45.720
apart it makes us special so I have a challenge to each of
00:37:50.960
you go and be the nice one in someone else's story maybe not as cryptic as
00:37:57.560
nice one but offer help without expecting anything in return be generous with your
00:38:03.920
time be patient Mentor someone who is just starting out collaborate on open
00:38:09.839
source projects learn about how Ruby really works and contribute to the language whatever you can do whenever
00:38:18.000
you can do it no matter how small every little bit helps and when you're in doubt and not
00:38:25.520
sure what to do just remember that Matt is
00:38:30.680
nice so we are nice oh I like
00:38:35.839
that I think I'm on to something