00:00:05.839
All right, everyone. Please don’t panic, but we’ve been boarded by four salty buccaneers. They’re going to have to come up here and explain themselves in the form of lightning talks. So Madison, Eulek, Miriam, and Benjamin, could you please come forward to these seats and explain yourselves?
00:01:02.079
In the meantime, here's how it's going to go: you will have five minutes to deliver your lightning talk. After those five minutes, we will ring the gong, and you will be asked to please disembark. The anticipation makes it better. Okay, great! Hey, I’m Madison White. I am a software engineer at Stripe, and I currently work out of the Dublin office. If you don’t know, Stripe is a company that helps empower and enable online businesses. We do things like process payments, manage subscriptions, and even assist you in incorporating.
00:01:47.119
Because this is a five-minute talk, the last slide is obviously going to be a link where you can learn more, as that’s all I have time to do. But please email me or hit me up on Twitter; we really want to hear what people think about what I'm saying right now. Cool, so I'm talking about Sorbet. The most important thing is how cute the logo is. That’s my favorite part; it’s not really my favorite part.
00:02:03.759
What I really love about Sorbet is that it is a super fast and powerful type checker. It’s 100% Ruby compatible, and it allows you to gradually introduce it to your codebase. It’s not prescriptive, meaning you don’t have to use types everywhere. Just add them where it makes sense. We just open-sourced it on Thursday, which is super exciting. We have been using it internally at Stripe for months now, so it’s been really interesting to see how our developers have been iterating on it.
00:02:41.760
When we first brought it into the Stripe ecosystem, a lot of back-and-forth happened between me and Sorbet. It would go like this: I would write some code and feel really self-confident that I can do my job. Then I would go to the console and run the Sorbet command, only to find out all the ways I had failed, all the types I’d messed up.
00:03:15.840
So what we did is implement the language server protocol, and we actually made an integration for VS Code internally at Stripe. It’s really awesome because that gives you the power of Sorbet as you’re typing instead of after the fact. Now, because a GIF is worth a thousand words, I have three GIFs to demonstrate what this looks like. For example, if I am trying to retrieve a charge for Stripe but I accidentally wrote 'church id' instead, Sorbet lets me know, 'Hey, church id is not a thing here,' and I can quickly iterate and fix the error.
00:04:49.520
Next, if I want to know more about how to retrieve a charge, I can right-click, go to the definition, and see the actual method. Hopefully, the amazing developers at Stripe have provided me with some documentation, and I can see the method signature as well; it should get a string and return either a charge or an error. Lastly, if I forget how to retrieve something, when I start typing ‘retrieve,’ Sorbet will actually give me some methods.
00:05:06.720
As you can see, when I choose ‘retrieve,’ I also get some documentation. It pulls in the comments that other developers have added, and it lets me know that I’m expecting a string here. So, it really makes it a lot faster for me to develop. I’m using the power of Sorbet at the time that I’m writing code instead of after the fact.
00:05:30.480
So, as promised, here are the links. We would really love for you to check out Sorbet. The only sad part about this talk is that we have not open-sourced the integration for VS Code, but we have given you the tools to build your own integrations. I will say that if you apply for a job at Stripe, you can use the VS Code integration, and you won’t have to do any work at all. So come hit me up, thanks!
00:06:04.240
So we judge that you walk the plank. Will our next speaker please come? Ahoy, Roko! My name is Miriam, and I’m a mom, a Ruby teacher, and a programmer. For the past two years, I have been spending the naps of my baby writing and drawing stories for kids about computers and technology. The picture here is from a time when he had a long nap. And if you’ve been there, you know what I’m talking about.
00:10:41.120
Hello, fellow humans! We are incredibly excited that you found us! Our size is uncommonly little. So, are you running out of memory again? No, I’m not. We live inside your computer alongside terabytes of other zeros and ones. It is the binary world.
00:11:06.960
We now live in a world where kids are much more likely to get familiar with computers than to meet a cow in real life. However, if you browse through children’s books, you will find many forms of animals and very few computers. So, what could happen if you told your kids stories about binary code at the same time that they are learning to count, or if they hear about RGB codes while learning about colors?
00:12:00.640
I’m not suggesting that we are raising programmers or tech wizards, but rather, we are giving our children a broader understanding of the world they are living in. In the end, they gain extra tools that will help them build the world they want to live in, however they choose.
00:12:15.760
But what if my child is not into computer science? Well, here’s the thing: I wasn’t either growing up! My dad wanted me to study computer science, but I had to find my own way, so I went to college and studied architecture. I worked as an architect for a while, then I quit my job and taught myself how to code.
00:12:43.840
It took me 30 years to find the creative, colorful, and human side of technology. That’s why it’s important for me today to come up with new, original ways to introduce the world of technology to our kids. Because we need to reach as many of them as possible; today’s world requires many different types of people who can think about technology and care about it.
00:13:46.240
The first story is coming out later this autumn. Ferrous gets a virus and Ona takes him on a trip. Will they find a cure? These are Serus and Ona, and they enjoy sharing their adventures in the binary world. It’s a unique way to share the magic of computers with our kids.
00:14:34.560
If you want to know more about the book, you can do several things: you can join the mailing list, follow us on Twitter, Facebook, or Instagram, or share it with your friends, fellow parents, and humans! You can also come and say hi over lunch; it would be awesome to have you and your kids aboard.
00:14:56.200
Thank you very much! Thank you! Here’s your little treasure and you walk the plank.
00:15:15.760
Hello! The story I’m about to tell is called ‘No Such Bucket.’ It’s about a service where you take some files, they come out on the left, go into a processing unit, and then into an S3 bucket. We’re going to talk about what happens in that processing unit. We have tests because—well, we believe in the principle that we should test against actual S3 buckets.
00:15:33.760
The more you interact with the actual service, the more bugs you are likely to find. So we actually have tests that create these S3 buckets, upload files, check the contents of the buckets, and ensure that we can perform operations like multi-part uploads. It was working well until it wasn’t. Suddenly, we were getting failure reports from our CI builds. We asked ourselves, ‘How can this happen?’ The test creates a bucket and uploads a file, and the first call works, but the second says 'No Such Bucket.' This didn’t look right.
00:17:54.080
So we opened an issue. The first approach was to look at how we create these S3 buckets and tests messily and hope the problem would disappear. Of course, it didn’t. Then we made another pull request to solve the problem in another way, but it didn’t help either. Eventually, we felt that we should not run scripting languages in production, but rather switch to mocks for our tests. But before we give up entirely, we thought, ‘Let’s just try.’ We attempted to create a number of S3 buckets, one by one, and upload a file that was exactly zero bytes.
00:18:48.640
After running various tests, we noticed that out of 100 calls, we encountered four random failures, which were completely outside of our control. It seemed something fishy was going on. So it was time to make a case with AWS support. The support team confirmed that our tests were not right and suggested that we check if the bucket exists before executing operations. This was causing about a 2% failure rate. They tested our script and indicated that when they inserted a sleep command for three seconds before putting in an empty object, the number of exceptions decreased significantly.
00:20:23.840
We found out that S3 bucket creation is eventually consistent. It can take time for the system to acknowledge that a bucket has been created. The inconsistency period is undefined, and the only recourse is to implement opportunistic retries and sleeps. This can happen with any call to an S3 bucket. It’s not that S3 is inherently bad or good; it’s how the system is structured, involving load balancing and complicated replication.
00:21:02.760
So we implemented retries, and we had to be careful with how we made every SDK operation retry. Being Ruby programmers, we could patch it relatively easily. The takeaway here is that if you’re using large, distributed systems that you don’t fully understand, don’t always assume that it’s your fault when things go wrong.
00:21:17.839
My name is Eunice, and I work for Wisconsin. Thank you! So your talk made it just into five minutes, so you'll be fine—no walking the plank for you! Just kidding. To David Jones's locker with you!
00:21:34.640
Ahoy everyone! My name is Benjamin, and I’m the maintainer of Searchflip. Searchflip is a full-featured Ruby client with a chainable DSL. Actually, it isn’t quite new—I created Searchflip back in 2014, and it's been used in large projects since then, so it's relatively stable.
00:22:01.440
I’m going to rush through this; keep in mind that I'm available on GitHub, and you may want to check out the repository. I’m always open for contributions. So it’s all about Elasticsearch, but why create another Elasticsearch client with so many already available?
00:22:11.680
Let’s take a look at some simple queries and compare two gems to see how they handle it. Suppose we have a comments model, and we want to search in it for comments containing the text 'Hello World,' with a state of 'approved,' so we have some kind of review process. We want to aggregate by username to get counts for each username and then sort by ID.
00:22:33.520
There is a gem called elasticsearch-ruby, which is the official one; however, with elasticsearch-ruby, you are writing raw Elasticsearch queries—akin to writing raw SQL queries. Who does that in the present day? Ideally, only if you have to. Writing raw SQL queries tends to be more straightforward because the Elasticsearch query DSL can get really complex. You’ll start to see how bulky and error-prone this approach can turn out to be.
00:24:07.280
Another popular gem is Searchkick, which reduces a lot of the boilerplate; however, when you investigate further, you’ll find that you still have to maintain a hash that collects all your query attributes and pass them to a method where the results are returned. For my case, I’d prefer a simpler interaction than that, which is why I created Searchflip. With Searchflip, most of the boilerplate is removed. In addition, we provide a chainable API that is especially beneficial when dealing with parameters from the frontend, where there are often optional clauses.
00:24:57.520
How do you start using it? First, you need to install the gem, naturally. Then you create something—a comment index, for example. You include the Searchflip index module and tell Searchflip how to serialize the objects for indexing. Elasticsearch requires a JSON object, and you can specify mappings and index settings relevant to Elasticsearch. Most of the time, these get applied automatically to the index.
00:25:42.480
Interacting with our index becomes quite straightforward; for example, you can create the index, check if it exists, or delete it. You can import records via arbitrary Active Record scopes or single records. You even have the flexibility to delete records based on Elasticsearch queries. In conclusion, my query structure should look like this: let’s suppose we are a booking platform searching for hotels. We search for hotels that have a minimum rating provided through parameters, and we only want to see nearby hotels, so we provide geolocation parameters.
00:26:56.880
These methods conveniently allow us to handle this aggregation alongside pagination. Ultimately, working with Searchflip feels as natural as working with Active Record. That’s it for me, thank you very much. You walk the plank!
00:28:15.600
We have one more privateer, Norma; could you please join us on stage? Before we begin, since I’m changing hats, I’m looking for a volunteer who would be willing to change hats and sit behind my keyboard. Seriously!
00:28:40.720
I’m not used to this at all; I titled my talk a ‘Splash Course on Live Captioning’ because Ramon is not the only one who can play this ship pun game. So, do we have a captioner ready to go? Yes! Press keys, pretend you’re playing the piano. I'm not sure if you know how to play the piano—yes, go for it!
00:28:58.960
In my early career, I was a court stenographer. These are my actual notes from 1982. Yes, I’m that old; it was during a murder trial. Afterwards, we would have to type everything up. We didn't do real-time captioning back then, so that stack of notes represents about 1,200 pages of transcripts.
00:30:04.480
The machines today have advanced light-years from what they used to be; they are very ergonomic and easy to use. The keyboard looks like this. We want to give our new captioner a small demonstration. If you hit the keys circled in red, you will write the word ‘start,’ and if you hit the circled keys together, you’ll write the word ‘dash.’ This is an example of what the code would look like; this is my little Yorkie, Mr. Jeffries.
00:31:00.760
This shows you what the code on the paper—or now on the computer—would look like. So yesterday, we produced 51 single-spaced pages, totaling 31,282 words, with 17 errors. I was slightly disappointed in my performance because I usually achieve a 99.9% accuracy rate.
00:31:21.040
My most frequently asked question is how I can maintain such accuracy. The short answer is that I specialize in writing tech captions, so all those captions from the aforementioned conferences have helped. Even though we often ask speakers to provide their notes ahead of time, we rarely get them as promised.
00:31:57.120
How you can help me do a better job? When someone asks you to provide your slide deck, don’t be shy—send it! I promise I won’t steal your content. Also, please slow down; it’s not a race. You don’t have to speak at 300 words per minute.
00:32:06.960
Say less in a shorter amount of time. I have one second left. Thank you!
00:32:17.280
Thank you so much, Norma! That was delightful! And a special shout-out to our new closed captioner.
00:32:41.160
And don’t think you’re getting away, you too walk the plank!