Eileen M. Uchitelle Senior Systems Engineer at GitHub. Her focus is to ensure applications and code are secure and fast. She is an avid contributor to open source focusing most of her energy on improving the Ruby on Rails framework. She's is a member of the Rails Core team and the Rails Security team. Eileen is also a speaker and has presented at many conferences on performance, Active Record, and contributing to Rails.View the profile
About the talk
It's no secret that the upgrade to Ruby 2.7 is difficult — fixing the keyword argument, URI, and other deprecation warnings can feel overwhelming, tedious, and never ending. We experienced this first-hand at GitHub; we fixed over 11k+ warnings, sent patches to 15+ gems, upgraded 30+ gems, and replaced abandoned gems. In this talk we’ll look at our custom monkey patch for capturing warnings, how we divided work among teams, and the keys to a successful Ruby 2.7 upgrade. We’ll explore why upgrading is important and take a dive into Ruby 2.7’s notable performance improvements.
Eileen M. Uchitelle
Eileen Uchitelle is a Staff Software Engineer on the Ruby Architecture Team at GitHub and a member of the Rails Core team. She's an avid contributor to open source focusing on the Ruby on Rails framework and its dependencies. Eileen is passionate about scalability, performance, and making open source communities more sustainable and welcoming.
Okay, here we are. I'm a guy. Can you believe how fast this day is already moving? Like I'm I don't even I don't even look at the clock cuz I think it's lying to me at this point. Well, okay, so a lot of things are continuing to happen. The first thing I want to mention is I put a challenge out there for the Ruby comp virtual 5K that if 20 people or more finished 5K run rock and roll with 30 minutes of exercise. I would re-enact the entirety of maniac from Flashdance. So we've had 35. So I
now have to do that. So I've got some preparation to do. Yeah, I got some preparation to do anyway, so here we are. I wouldn't introduce Eileen Eileen. You should tell is one of the big Staples inside the rails and Ruby Community. If you've not been familiar with Eileen before, a lot of her talks are really dive deep into the inner workings of, a lot of the Frameworks that we have known, come to love and appreciate. And so I went in Eileen to the stage.
And here we are. Okay, the seat. I can officially say your life now. So, all right. I mean, it is all yours. Okay. Thanks everyone. I'm said I'm Eileen you should tell. You can find me anywhere online at the handle Eileen codes. I'm a principal engineer at GitHub where I work on making improvements to the rails framework and Ruby language to ensure. GitHub is stable resilient and scalable. In addition to my work and get home, I'm also a member of the rescue team for any of you are unfamiliar or the group of
people who decides the future of the Rails. Framework, we figure out what features we want in the next release and try to make sure that it happens today. I'll be talkin about the recent Ruby to 6227 upgrade that. We did it get home. We'll dive into why this upgrade was particularly difficult, the processes that we used to make sure the upgrade happened as efficiently as possible. How we deployed or upgrade. And lastly, what we're doing to make sure the next Ruby upgrade is better for everyone. Most importantly, I hope to dispel the myth. That upgrading your application is inherently
high-risk to get up. Application was born in 2007 using Route 1 to Andrew B18. Sometime in 2009, GitHub decided to force, both rails and Ruby. This was a decision that seemed simple in the beginning. This engine need to alter the existing code to work with the framework and language changes didn't need to deal with bugs and rails are Ruby and they didn't need to stop building new features. Running on Forks of Rouse and Ruby seemed fine for a while. But as gifts Jabs, Works deviated more and more from Upstream making changes in the application became increasingly
difficult. If you want to hear more about the challenges that we faced running on a custom Fork, you can watch my past present and future of route to get him, talk from Ralph's, 2019 for this talk. However, I'll be focusing on how we approach our Ruby upgraded get Hub. I hope this talk will show you that. While upgrade can be really difficult, they're not inherently high risk and the payoff for staying upgraded is always better than forking or falling behind, because we did the heart of greed and getting off of fork, we're committed to staying up to date for the future of our company, your
engineer's, in our product falling behind the most, recent released is no longer, technical debt, that were willing to accept an engineering organization. Even when we know the upgrade is going to be difficult. The challenges we face in upgrading her movie to 6227. We're not, you need to get home and many gems libraries and companies had, or will have the same problems that we did. Route me to 7, doesn't have a ton of breaking changes. The biggest challenge was core methods. Now, return Frozen strings so we had to update a lot of code & gems. However, getting Greenfield meter upgrade
difficult, I get hope we're committed to running deprecation free, which means that in addition to a green CI build, we want to make sure that we fixed all future breaking code as well. We take this approach upgrading For a couple reasons, it makes upgrading easier for the next version by her. Parents are application for the future. If you wait to fix depredations, they might end up being a Blocker in the next version. Fabrications are also incredibly expensive recently. I made a change to Ralphs and when I bench marks the deprecated method versus the new method, the
deprecation warning was responsible for making the Legacy method. Two times slower than the new method without the differentiation. They were basically the same speed. Running your application. With deprecation from rails, a ruby can have serious consequences on your performance. Heading out often. The deprecated code is called Fixing the deprecation was a huge task due to the size of our application. When we started counting the number of warnings in our application, we found that could have had over 11,000 warnings. We needed to fix. Yes, you heard that right over eleven thousand
mornings, that's quite expensive. Ruby is smart and only throws a warning once for a particular call site. So if you have a test that cause of deprecated method four times, it will only show you the warning. Once we also didn't start counting until we fix a good chunk of warning. So in reality, we were probably had closer to twenty thousand mornings. Before we get into how we approach to fixing these, I'd like to go over some of the major deprecation sitter me to 7 so that you're aware of how to fix them. The first major deprecation is the separation of positional and key word
argument. At first, it might not sound like a big deal, but ultimately it means that the option style hash arguments and keyword arguments are no longer interchangeable. Let's dive into what this deprecation looks like what it means and how to fix it. Arabic class, cuz my class, which is, it hasn't initialize with, it takes to keyword arguments part 1 and part 2 in Ruby Tuesday's if you were to initialize my class with a half. You see the string output with no warning movie called the same method in the same way with hash arguments and Ruby to seven will see the following deprecation
warning, warning, the last our argument as keyword parameters is deprecated. Maybe star star should be added to call morning, the called method initialize, is to find here the first time you see this warning, it might be kind of confusing because he would argument warnings coming to Parts. The first part identifies, the collar that cause the warning, in this case, dark Alton you on my class, the diversion warning against the file name in line number where the method was called from which indicates that this was called from example are Darby online, 13. The second part of the warning.
As to the method definition where are the message was called, is to find. This tells us that the initialize method to find online to example that Arby's Example is expecting keyword arguments. Better received a hash making the colors is simple. Once you learn the pattern for identifying, the correct. Fix the first way to fix the collar is to remove the curly brace as shown here. We know the method except keyword argument. So we can spend some of the arguments you have our half because they're passing another method and you actually want to use a hash and it tastes of the leading, the
curly Grace isn't going to work or it could ways to make your coat a lot more complex. So if you have to send a hash, you can indicate your roommate at the house, argument should be converted into keyword arguments by adding a double slot. Like this is tell Rudy to convert the house and to keep it arguments before it sends the arguments to the Define method. The warning output can be confusing because it suggests that maybe you always want a double squat. Both pictures are interchangeable but I preferred to delete curly braces whenever possible because it makes my code scanner. There are
cases were updating the caller, won't fix the mornings and you're going to need to update the method definitions instead. Here's an example, you have a class called abstract class which initializes in my class, the classes initializer take Stark's. As in the previous example, we know the initializer from my class. He's secured arguments part 1 and part 2. If we were to initialize an abstract class because we know that my class wants you with arguments will see the same warning that we saw earlier. The warning is maybe a little more confusing this time. We know that our callers doing the
correct thing and passing arguments, that my Classic specs. So what's wrong? Well, in this case is another definition for what needs to change rather than the actual color to 6 this morning, we need to update the abstract class to take a double swipe card instead of a single spot barbs in this example, I changed the argument name to be quiet instead of ours. This isn't strictly necessary at all for you to work but it's a good pattern to signal to other Engineers. Looking at this point in the future, what abstract class initializer is actually expecting the three case that we looked at
already are relatively simple to fix. However, there are some cases where messages using delegation that makes figuring out the source and the fix for a warning, a bit more complex. What's a good acting job? As an example of a job class in your application called my class job. Before him later later method in my class job takes keyboard arguments in early to six and below. This were to find another perform later. Definition takes Stars. However, Andrew to 7, this is, of course, going to throw a warning, you not to tell we can just fix this by changing the argument accepted by perform now
because you couldn't break existing jobs and jobs are cute on her me to sticks and run over me to 7 which is often the case with the playing upgrade changing out arguments behave can have serious consequences for the jobs can use either side of the argument, spell implemented Ruby 2 q words on the perform later method to avoid the warning. Active job is fixing real 60161. So you shouldn't have to change any of your job code. If your app is using keyword arguments, however, there was 1:40 thing left, a delegation, if you have a job that is using a single hash, what it expects, key word
argument, the warning will incorrectly indica. The collar is Ralph's you see here that we are passing past or perform later even though we know it expects key, word argument. The warning from Ralph is running from Ruby is telling us that is coming from Ralph's even though we know that Ralph is fixed. So we had a quite a few of these and get home. So we actually made a monkey past. It allows us to see the entire stock price for the cases. Like this are going to take a look at the monkey patch later on, and just talking to show you how we were able to find the correct color to fix.
Another diaper change that we had a fair amount on our application. Was the, your I'm at a different patient in room, 227 methods, on your eye, like a code, Dakota State and on a skateboard deprecated. The funny thing is about these different missions. Is they actually been deprecated for like, 10 years, but the decorations were silent. So everybody was still using them. The warning for these is pretty clear, these methods are obsolete. Your eyes are composed of multiple parts, and you might not want to escape her and told them all with the same approach for this reason. There isn't a
direct replacement for URI, Ruby fishing. This morning will require you to investigate what your use cases and find a replacement that meet your requirements. One fix you can use, as replacing, your eye, with addressable, your eye, in this example, addressable and URI are interchangeable. However, there are some major differences between these two colors. One, is that addressable your I will reject and raised in an invalid, your eye. If you are I included valid characters, this is a problematic. If you've been in validating your eye parts from your users, but if you haven't and
allowed, if you and it just a lot of character stuck in you start seeing errors in your application after replacing these calls, If this doesn't work, you may need to use something like CGI Escape. But as you can see, this method will all the characters whose behavior is quite different from your eyes. A hater. There is no 100% equivalent drop-in replacement for the URI method. So it's important to have good test around your colors in your application. To make sure implementing the right solution. If none of these Solutions work for you, you might have to implement a custom cursor.
Now, that we've been to some of the warning, so you'll need to fix, you're probably wondering how cute his approach to fixing 11,000 warnings. That's, that's quite a lot of work to do in the next going to dive into the processes and tools that we used to get home to maker upgrade as smooth as possible. If you a large application like get Hub. It doesn't make sense to use a long-running upgrade Branch due to the number of merge conflicts that you're going to have to deal with the solar, get her. We use a dual booting approach that allows us to switch which version of Ruby our
application is using. We also use this process for reals upgrades. Was that a Ruby version in the config file which takes a shot of the Ruby version that we want to build from. We don't use Ruby. Next anvar to switch review versions. This anvar allows us to run any command with the new Ruby version like roaster Grill Council or else next to that. The first time you run it, you have to wait for you to compile. This approach makes it easy to switch back and forth between versus to verify changes. Make sure that the change Works in both versions and generally makes debugging and fixing warnings a
lot easier. And addition to running two versions of Ruby for local development and testing. This also allows us to add CIA to test multiple versions. This see I build, can you run manually command as shown here, or if you run automatically using a build like this helps to ensure that regressions aren't introduced by other teens riding a new code, it reduces friction and allows Engineers working on the upgrade to focus on existing problems. Instead of feeling like they're playing, whack a mole. The single most important tool that we used to upgrade re27. However, it was a monkey
patch on the warning module that allow us to capture investigate and change the behavior of warnings in our application. As I mentioned earlier, we had over 11,000 warnings to fix are monkeys has provided the ability to catalog, categorize, and find owners for each of the warnings, in order to get them fixed in a timely manner. Deprecation warnings and Ruby are just standard output in your locks. There's no way to distinguish between a warning that the Jeopardy should warning or a warning. That's a language. Level warning like uninitialized instance variable. The only way to determine the
kind of warning you're dealing with his to like parser. Regex, it The monkey, paw. John warning. Look like this. Now that we have now that I've simplified the patch note that I simplified the patch to put on the slide and remove any get him specific code. First knows, I'll put the warning in standard error to maintain the existing behavior of the warning module next week implemented. The ability to raise warnings instead of only printing the warning. With this raised on Horning's environment variable will use this format regressions by raising on. Ci-4, any newly introduced warnings
last time you've mentioned the ability to help with the entire stack Trace. If this was helpful for issues with keyword arguments related to delegation, I got mention the doctor job, many of the warnings look like they were indicating that. After job couldn't accept your arguments, but I'll clean the stock trades. We can see the true Source, the one who's coming from our tests. And if you look at the test file, we can see that. We just need to delete the curly braces and we're no longer going to have this morning. We all dispatch, it would have been much more difficult to find
warnings and delegated methods like this. When we had our patch working to optionally raise an output stack trees, as we were able to add more features to make our upgrade easier, we needed a way to collect and identify the test that caused a specific warning in RCI, build that we can stand out work, the rest of engineering. The warning only identifies, the collar, and the method definition. We need to know exactly which test reproduced, which warnings to be accomplished by extending our monkey patch, to sort to the stock price of stock, price of the warning, find the file names and
find The Fountains at ended was underscored test. RV. We didn't pass that test file and the and the warning message to a module called warnings collector in the morning collector. We open the warnings text filed, its from the temperature at 3 Loop through each line of the data. And then join the message and the test file path with ASCII art so that it's easier to split on later. Last week, the warnings collector calls for the process warning script directly on the system. This is actually a pretty big screwup. That's very specific. So I've stripped everything out and just giving
you the essentials. So it's actually this script just Loops through all the warning file past and looks at the code owner who are codeowners file. Once we have that information to Scripps generates a markdown file for each team and coat on her that have warnings to fix the markdown files included checklist of each test file, that emitted warnings, the line, the warning came from and the warning out. Put the files are downloadable from RCI. Builders artifacts. We've been pasted, the markdown that's generated into issues that we open for owning teams that included, how to run the Ruby
version, and how to fix their warnings in their own files. This process a lot of stuff quickly and efficiently. Standout works at owning teams, track progress of weather, warnings were fixed and make sure that we had a place to easily communicate with teams to get the work completed. The majority of issues took under an hour to fix spends 99% of the warnings. Could be fixed by adding a double spot or removing curly braces. In addition to fixing warnings coming from, get us in trouble. Code, be found at many warnings were coming from external gems. Gems fell into a few categories, some gems
had already been fixed, and we just need to do a simple upgrade. There are other gems that were maintained, but how to fix their warnings yet? And lastly, we had unmaintained gems that were abandoned and never going to get there warnings, fixed if you're doing a review to 7, upgrade or really any upgrade, I recommend, auditing your junk file, before starting the upgraded addresses, many gems that are out of date as possible, Even without an upgrade, it's important to make sure that you're not relying on on maintainer abandoned gems that will become blocked for later on. Or security
issues. Our script I collected and categorize the warnings also comply compiled warnings and gems. So we can easily find Which gems need to be fixed, ahead warnings and how to make fixed yet. We sent Upstream patches, most of which were accepted, when upgrading is important to fix gems, the right way by sending Upstream patches rather than working in fixing on your own. Working means that you could end up supporting that code base for a very long time and are just making your next upgrade, more painful. We had a few issues, where we were also using gems that were on maintained since we
have a policy of no longer 14 gems to get home. We decided to replace any gems that were abandoned, depending on the gym. Your application relies on this quite complicated is important to understand how the gym is using your application. Before looking for a replacement in some cases, outright remove the need for the gym. In other cases, we found Replacements are we got our own smaller, libraries to achieve everything, you did for our application. You were able to accomplish this alongside the upgrade because you stand out, no one owns warnings to other teams those things to focus
on fixing warning for the upgrade team to focus on word difficult problems. Or time-consuming problems. Once you're done, upgrading and it fixed. All of the warnings, we we needed a way to prevent progression. As I mentioned earlier, warnings, or just output in the testing environment, we couldn't rely on someone noticing that they introduced a new warning to accomplish this. We raised we used to raise our mornings environment variable from our monkey patch to raise an error. If any new warnings were introduced this ensures, the upgrade team doesn't need to keep fixing warnings until we're
running on Ruby 300 What you were going to upgrading it was time to deploy this going to feel really scary because an upgrade changes your underlying system. However, I get hope, we've done many Rosary upgrade. Most of them with no doubt or customer impact. This is Jude Warren credible. Deploy team in the process is that we've developed with them over the years, I did hug deployment. Upgrade is not inherently riskier than any other to play being afraid of deploying. An upgrade isn't a reason to not do one either. Your upgrade too risky to work to build better monitoring and build more
processes until it feels natural to deploy one. The most important thing that builds confidence into playing an upgrade is the dual boot process because it allows us to make small incremental changes to our code base. We can make changes and merge them to the main branch of overtime. So when we finally switch versions me and it was a smaller gift for the final deploy it because we would dual-booting set up an RCI as well. We know that all changes going in to get him. Daily are compatible with Ruby Tuesday, 7 using a dual boot strategy. Over a long-running upgrade Branch drastically
reduces risk because it allows you to make smaller changes over time with this process, were able to push all changes reduction before changing the version itself. In addition to smaller changes, we build confidence in our deployed with testing in the staging environment. We deployed the upgrade to staging environment and ask the same teams that it fixed warnings to use it for 20 minutes to an hour wall. Of course, rocket power users teams that are intimately familiar with their areas of product are the best ones to make sure everything's working as expected during this process. We
discovered a few new warnings that had a test. We didn't find any regressions in the customer experience, while it can be tedious spending time manually. Verifying an upgrade in a production like environment builds confidence and reduces risk for the final report. When we are done, click testing. It was finally time to deploy to production. For the upgrade, we use a slow incremental and manual. Roll out, process. Our standard to play process, automatically rolls out 2%, then 20% and 100% of traffic for Ruby upgrades. We don't always want to automatically roll out so we use them
or manual process server. This case, we first applied to 2% of traffic. We plan on waiting 15 minutes before going to a higher percentile, but almost immediately, we saw a new exception, a frozen string are in a part of the code means that we missed you to lock a text around a specific Edge case. So, of course, me immediately rolled back such a ploy is your percent. Do you need a rolling out to only 2% of traffic, less than 10? Exception has occurred affecting only a few customers because it's a small percentage play to the impact of small. Watch me how to fix for the
reception and it was a ploy to reduction. You began the incremental process again after the first two play. We started with just 2% of traffic and waited 15 minutes, after 15 minutes with no exceptions. And no reports of sight issues you went to 30% of our communities of play partitions, which is a little different from going to, from 2% of our traffic. I get him. Some of our Legacy partitions, aren't kubernetes, and require watching the deploy more closely when you're doing every upgrade. So, we want to test those separately. Once again, we saw aggressions on 30% of 30%,
totaling about 60% of our communities Persians again. So we moved on and deploy to about 30% of our projections, the plane that do revisions to these. I can take up to 15 minutes which is why we started to play process on the other ones, we knew they were faster, so we could roll back. If there was an issue, I just previous to place Nissan no errors or customer reports during this time. And finally, after 2 hours of the playing we deployed to 100% of partitions and merge the Ruby to 7 upgrade. Is that the place I'm kind of
boring? That's because it is. And it was, when we build strong processes and consistent processes for deploying higher, risk changes, it was high risk changes, become lower risk. We chose to do a care how boring the play, but other than the first Frozen string Arabi song ever questions in production, After all our hard work, the upgrade was a huge win. In addition to a shiny new Ruby version and a smooth to play. We got quite a lot of benefits out of upgrading as well. The first notable change. We saw when we deploy to be to seven different options with some impressive performance, improvements
for the application of production before their 7, upgrade the boots at 92nd. And after 70 second time, while this doesn't affect application performance faster boot, I'm makes the voice faster which gets changes to all our customers faster and contributes to a better employee experience for engineers. This significant decrease in Bhutan was partially due to John Hawthorne's optimization to Ruby that avoids revisiting during the method cash multiple times. In addition to faster boot time. We also saw a decrease
in August allocated at boot time. What time are the allegations went from about 780000 to 668000, Which is 812000 less objects to allocate on boot allocations effective album, memories. So, it's important to keep these numbers as low as possible. 327 also offers a variety of new features over B-26 one of my favorite but like very small and Tackle changes is to Method inspect this method allows you to view a method as an object information about it, it would be to 6. It was just the class and the method definition by Emery to seven includes
the arguments for where the method is defined. I actually use this feature during the, to Seven Bridges track down a method signature and Kathy Berra, that I was having trouble locating and understanding what it actually wanted. Disable change mix using method, expect much more useful, another great Improvement in Ruby to seven is the new IRB interface IRB now supports multi-line editing are we can see here, we have been go up to our initializer in a day! It also has autocomplete we see have to eat number to yet to ask and if you keep going, you can
actually see the documentation for to ask Rite in IRB. Last thing as you no doubt, noticed in the code is all color coded which makes it easier to read and use. I look at Ruby's. 27 Ruby to 7 features wouldn't be complete without mentioning Manuel GC compaction written by Aaron. Patterson to see compassion has the ability for language to defrag a fragmented memories. This makes your problems faster. Music program doesn't need to look as far for objects in memory. If you want to try at Manuel GC compaction, simply called, gc.com hacked, if you missed it, be sure to catch. Aaron's talk
on the automatic. You see compassion that will be available in 3 o, which is even better cuz you never have to call this method for me. Just does it for you. Application of critical doesn't just improve performance and give us new features. One of the reasons that we upgrade is so that we can work on making Ruby even better. We've been using for me since 2008, and we're now committed to ensuring that we not only stay up-to-date, but we fix problems and their language that we experienced firsthand. GitHub is one of the largest ruby applications in the world, but our problems that scale or
not you need to get up. I was try to remind engineer's, a tree is open source if you don't like how it works, change it when we experienced problems in our language, or framework, consider working around them or lamenting that it just kind of sucks. Open an issue, starter dialog. Send a PR Turner upgrade, I found that working with deprecation warnings was incredibly tedious, there was no problem attic way to ask a warning. What type of warning it was to an application. There isn't a difference between an application level warning on an issue licenses variable and a differentiation warning.
However, to an engineering team, there's a huge difference. The different kitchen. One was my favorite eventually will be removed from the language. So much more important than fixing it on initialize instance, variable. We were when we were done with our upgrade. I started to wonder if there was a way that we can improve warnings in Ruby. So earlier this summer, I work with Erin Patterson to add an Austrian Beck's to Ruby warnings, which exposes warnings category on each of the warnings already had warning category as it allows you to filter out warnings like this. However, this is basically
the opposite of the behavior that we wanted. We don't want to be able to filter out warnings and said he wanted to know what kind of wedding we had. So we can change the behavior of the application based on that type. In order to accomplish this to be exposing categories, on each of the warnings and stoves, if you're interested in the pr here, doesn't get Hub to symbol change. Only about fifty for new characters, but it's a cheese that should make interacting with depredations. Andre 3000 and Beyond easier with this change were able to check the wardens category and change Behavior, based
on that category in our application. This allows us to always raise for any warning that categorizes deprecated while maintaining the original behavior for all. Other warnings, by doing this, were able to have the Jeopardy to behavior, mimic Ruby Trio while we're still running rbc7. The category feature allows users to interact with warnings on a more specific level. Previously, we needed a regex to figure out, which type of warning we had, and that's going to get expensive pretty quickly. This makes it so much easier to find out what you're dealing with. All of the features and
Bug fixes and performance improvements and future improvements to read. Aren't enough to convince you to update, then hopefully, this will Nothing makes an upgrade harder than waiting the right time in the best time to do. An upgrade is today. It's not going to be easy but it's an important part of making sure your application stays secure and running smoothly. Also get abs running on route to 7 so you can to I hope this talk has shown you how create can be low risk and are always worth the engineering efforts to complete them. I hope to see you all next year in person. Thank
you. And I hope you have a great rest of your week off. And thank you to all the organizers for all your hard work, making this conference run remotely, I think I have to find questions now. I don't know how to turn this off. Maisto sharing my screen. So I answer the questions that are in the questions that are down there, I can help you. One question that came through is the process for dual booting. I don't quite understand the question. The process is just rebooting a
different version with the environment variable, so once you set up the The ability to have an environment variable, it just compiled with the new version Ruby version rather than the old one. I think you can easily use a spike any Docker image. We just happen to compile ever be directly in our systems for reasons that have to do with. We like to test directly from source for testing a like I can't remember adding or a performance Improvement, we need to be able to build from source. So we don't use the docker images, but you can
just have it switched Docker images if that's what you use. How do I answer the question? So it looks like there was just a follow-up comment that it was having Miss. Travis it missed, what the process looked like, so it sounded like I got that in there and then also you're going to be, are you going to be sharing the slides anywhere? I think that was supposed to have questioned there, and can we have this talk again? When you do that, Well. I hope is that someone else I get up with you later upgrade and they will talk but actually
weird. Did she move that helps with you? That work is Scott the to build green as of when it was too late. So we had some stuff we need to fix. So now it's up reading gems that aren't yet accepting three. Oh, so we're trying to get ahead this time. We were late probably six or eight months behind the release of Ruby to 7 before we got upgrade on production and I think we're trying to like Be a little closer this time, but I'm doing other stuff. So what else are proven? And
sellers other performance improvements, you saw due to freezing string little rolls, or was it just the boot times? That were observed. We like did the Frozen string stuff over a long. Of time. So we weren't able to like you can see the benefits of freezing it before, you're on that version. So like we didn't see anything by moving to the version if that make sense cuz we already like had gone through and fixed all well, I think there's still some places that we're not everything we've gone through and fix that stuff already. And I
didn't, I didn't actually do that work. So I don't think that we saw anything because we did it. So like we didn't do it all at once to see the performance change. so now, I guess the answer is no we didn't see anything from the first ring but it's not because like, It's slow because we didn't measure that. Gotcha. Yes. Okay so another question is after going through that process, how did you feel when the positional keyword Ark separation was shelved and the deprecation warning was removed. Warnings were not removed
at all, they just turned it off like a just like made it silent but not. So you saw that fix all that stuff. So I hope that fix it because it still warns you just is not felt like there were as far as I know, we're still going forward with it. I say we like a lot, of course, you know, I'm not but The compromise was to make them silent by default so that they aren't. Are you going to play with out? So it like we couldn't deploy without fixing that man, having a performance impact until like. Now they're not,
they're silent by default, so they won't have a performance impact. We still have to fix them. Gotcha. Looks like we got one more question in here so it is from key. So I'm a big fan of optional outputting data in machine consumable formats from command line applications. How much might that have helped you? And how difficult do you think this would be to implement in the Ruby interpreter? I don't, I don't like I don't understand like how. I don't understand how you would like what we would use that for. I don't really get the question
will Keith. If you're jumping to the slack Channel afterward, maybe clarify if that question for Eileen, that would be helpful. I don't see any other questions in here that we might not have addressed. So with that being said, Eileen you're going to. Are you going to be over in the selection of us will help answer any questions or pop into their after this. Thank you very much. I was, you have given talks like this many times before in terms of the process of creating and I want to just honor and appreciate the fact that
you're so willing and accessible to do that because it's things like this that really do help make the process smoother for everybody else. And so bringing your experience to the table and having been witness to it personally for the last few years, has always been just truly appreciated because you're simplifying. What could be a very complex and painful process. So I really do appreciate that. All right. Well, so yeah, there's a bright side light at
the end of the tunnel has been around since 2008. So you never like, know what are lager. What's 2007 you never know what's in there. You never know what's in there. That's the bumper sticker of a Long Live rails. Application is you just never know what's in there. Thank you. I love you. So very much to all of you. Jump on over to slack. Let's do that. And then the next talks are going to begin here shortly. Alright, with that have a wonderful rest of the day.
Buy this talk
Buy this video
With ConferenceCast.tv, you get access to our library of the world's best conference talks.