Keynote: The Case of the Peculiar Pattern - A Ruby Mystery Story

Summarized using AI

Keynote: The Case of the Peculiar Pattern - A Ruby Mystery Story

Nadia Odunayo • November 15, 2024 • Chicago, IL • Keynote

In her closing keynote titled "The Case of the Peculiar Pattern - A Ruby Mystery Story," Nadia Odunayo, founder and CEO of Story Graph, shares an engaging narrative combining her journey in tech with an amusing exploration of Ruby challenges through a fictional detective storyline.

The presentation is structured around a fictional investigation into bugs within a new feature of Story Graph, using humor and storytelling to delve into technical nuances of Ruby programming.

Key Points Discussed:

- Introduction of Nadia Odunayo

- Founder of Story Graph, a popular reading tracking and recommendations app, built entirely using Ruby on Rails.

- Discusses her background, transitioning from economics to tech, highlighting her unique journey as a one-woman development team.

- User Growth and Platform Details

- Story Graph serves millions with features such as personalized recommendations and social reading options.

- By the time of her talk, the platform had surpassed three million users.

- Debugging Chronicles

- Nadia humorously recounts a late-night debugging session leading up to a major Apple feature launch.

- Describes encountering a particularly stubborn bug related to group functionality in her application, involving aspect of Ruby’s handling of hashes and arrays.

- Mystery of Nice One

- Shares an interaction with a cryptic online presence known as "Nice One," who aids her in debugging the application, leading to an engaging twist that resolves the issue.

- Thematic Messages

- Encourages the community to practice kindness and mentorship, paralleling her experiences with Ruby and the supportive community surrounding it.

- Ultimately reveals the identity of the mystical helper as Matz (Yukihiro Matsumoto), the creator of Ruby, symbolizing the need for collaboration and guidance in technical communities.

Conclusion:

Nadia encapsulates her storytelling with a call to action for the audience to embody the spirit of collaboration and generosity, likening the community to being 'nice' just as Matz is. She emphasizes the importance of connection and support within the Ruby community, advocating for mentorship and kindness in technical pursuits.

Keynote: The Case of the Peculiar Pattern - A Ruby Mystery Story
Nadia Odunayo • November 15, 2024 • Chicago, IL • Keynote

RubyConf 2024

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
Explore all talks recorded at RubyConf 2024
+64