00:00:00.299
Welcome to "Who Wants to be a Ruby Engineer?" This is the only Ruby game show here at RubyConf Mini. I am your host, Drew Bragg. Contrary to popular belief, I am from Philadelphia, not Oklahoma.
00:00:06.679
I am a staff engineer at a company called Within3 and the host of a podcast called "Coders Who Code." You can find me on most social media platforms at DrBragg, which has two G's. Speaking of my company, we are hiring! If you are a Ruby on Rails engineer looking for an exciting role doing interesting and occasionally complex work, please come and see me or any of the other awesome Within3 engineers here. Lindsey Kelly gave an incredible talk on the first day, and Jordan, Dan, Kevin, and Lynn, along with another Lindsey, are all also here. We would love to talk to you about how great it is to work at Within3.
00:00:35.820
Before we get started with the fun, I have a little disclaimer: most of the Ruby you are about to see is valid syntax and will run. You can use it to confuse and bewilder your coworkers, which can be fun, but not in production code. Instead, you can use it to gain a better understanding of Ruby and how it works—but please, do not commit it to your production app. Think very carefully before you commit! I like keeping Ruby weird. I like keeping Ruby fun, but I also like keeping Ruby readable.
00:01:12.060
So here's how today will go: I apologize if my slides are hard to read, but that’s due to the font size. I have some wonderful contestants here in the front row. They will come up one at a time and will have about 20 seconds to guess the output of a small snippet of Ruby code. I'm not a monster, they'll have multiple choices: A, B, C, or D. I didn’t have those choices when I was trying to figure out what the heck was going on when I saw the code the first time. They will also have some powers they can use: they can ask one of you to answer for them, or they can search Stack Overflow. We’ll take a poll to see what everyone thinks is the right answer.
00:01:53.460
If a contestant gets it wrong, they’ll sit down, and we'll have the next contestant come up. Nobody should feel bad about getting them wrong; these questions are practically designed to be difficult. You should actually feel happy when you get it wrong because it means you learned something! So, when a contestant does get a question wrong, let's give them a round of applause because we all just learned something.
00:02:33.220
That being said, I do have some prizes, and in the spirit of competition like in a game show, the better you do, the first crack you get at the prizes. Those prizes are made possible thanks to our sponsors, Joe Masolati and Rails Dev, who provided a bulk of these prizes. If you do not know Joe, he is a fantastic human being and doing a ton of work to help Ruby and Rails juniors get hired. Rails Dev is an open-source reverse job board specifically for Rails devs. He is also helping a lot of people get their first open source commit to Rails Devs and aiding them in finding jobs. If you haven’t met Joe yet, please go out of your way to meet him and thank him for all he does for our community.
00:03:13.800
Another sponsor I have is the one and only, Andrew Mason. Most of you know him from the Remote Ruby Podcast. He also does a podcast called "Ruby for All," which is wonderful and fantastic for juniors. Additionally, he runs the Ruby Radar newsletter with Colin Gilbert. Last but not least, we have the one and only Andy Kroll right here. Everyone, please give Andy a round of applause—not just for sponsoring this game show, but also for helping so much in putting this on.
00:03:43.320
Now, I have to ask: who wants to be a Ruby engineer? Who is my first contestant?
00:04:04.560
As soon as you are ready, please introduce yourself to us, tell us where you're from, and how long you've been working with Ruby.
00:04:53.060
Sure, my name is Aji. I am from Chicago and work at Thoughtbot. I think I'm coming up on my third anniversary of being a professional Ruby dev because I started on Leap Day in 2016.
00:05:05.220
Awesome! This first question won't count against you. If you get it wrong, you can still stay up; it’s just a warm-up question so that everyone in the audience, yourself included, and the other contestants know how the game will work. So, I apologize again if this syntax is hard to read, but please bear with me.
00:05:45.180
Aji, you're going to take a look at this short snippet of Ruby: "1 double colon + (2)". Do you think that this will return A) 3, B) a NoMethodError, C) 12, or D) a syntax error? What do you think?
00:06:41.880
B, NoMethodError?
00:06:52.680
Actually, you are correct! It will return a 3.
00:07:05.280
For those of you who are confused, the double colon is a namespace resolution operator. It helps us go from modules into classes and can also be used to call instance methods. Since one is the instance of an integer, it has an instance method called + that accepts an argument. What we just saw is equivalent to sending "+ (2)" to "1", or commonly, "1 + 2". For the love of math, please use "1 + 2." Make your code readable.
00:07:32.400
Now we're going to start the real game! Here is a short snippet of Ruby: We have the string "f", and we are going to ask it in a predicate method with the range of "a" through "z". Are we going to get back A) true, B) false, C) nil, or D) raise a NoMethodError? It feels like it could be a trick.
00:08:05.160
Aji, if you think it's going to be a trick, let's ask Stack Overflow! Show of hands, who thinks it's going to be A) true? A decent amount. B) false? No one. C) nil? One person. Or D) a NoMethodError? 50/50 split between A and D. Aji, what’s your final answer?
00:09:00.900
I'm going to go with D) a NoMethodError.
00:09:40.140
And you are correct! For those of you who answered A and are scratching your heads, this method "in" is actually provided by Active Support in Rails; it's not part of Ruby itself. Great work!
00:10:16.020
Next question: we have an instance variable "this" set to the string "fun". We are going to interpolate it into double quotes with "this is %{this}". What do you think this will return? A) a syntax error, B) the string "this is fun", C) the literal string "this is %{this}", or D) a name error?
00:10:53.320
I'm going to say it's C.
00:11:20.760
So close, but actually, this works! I found this out because I made a typo and was very confused about how this worked. It turns out that when you're interpolating instance or class variables, you can omit the curly braces completely, and interpolation will work just fine.
00:11:55.860
Thank you very much for playing! Can we have our next contestant, please?
00:12:04.020
If you could introduce yourself, tell us where you're from, and how long you've been working with Ruby.
00:12:15.780
Absolutely! I'm Elise, living in Colorado but originally from Pennsylvania. I have been doing Ruby since 2010.
00:12:33.540
Are you ready to play 'Who Wants to be a Ruby Engineer'?
00:13:00.780
Sure, yes. No, I hope so. Let's do it.
00:13:21.840
We have a variable "str" set to an empty string, and we're going to shovel in the integer "97" and then print out "str". Is this going to give us A) a type error, B) the string "97", C) the string "a", or D) the integer "97"?
00:14:25.380
Uh, so I think it will give us B.
00:15:15.120
Actually, it will give us C. You see, when you shovel in an integer, it treats it like a code point and converts it into the ASCII compatible character.
00:15:32.760
Now, can we have our next contestant, please?
00:16:04.200
Same thing, introduce yourself, where you're from, and how long you've been doing Ruby.
00:16:11.640
I'm Mina, I’m from Chicago, and I've been doing Ruby for four and a half years.
00:16:33.840
Great! Are you ready to play?
00:16:42.840
No, but we can do it anyway!
00:17:04.120
Alright, we have an array with the integers 1, 2, and 3. If we multiply it by 2, is that going to give us A) an array with 2, 4, 6; B) an array with 1, 2, 3, 1, 2, 3; C) an array of arrays with 1, 2, 3 in each; or D) raise a syntax error?
00:17:30.000
I don't think it's A, but I want to pair with a friend! Alright, who do you want to pair with?
00:18:18.600
Joelle! Cheating Joelle, what do you think it is?
00:18:55.920
I believe in you!
00:19:07.600
We're going with B.
00:19:20.360
Actually, it’s A. What happens with multiplication when it's an integer is it behaves like concatenating the argument copies of that array.
00:19:40.760
Thank you for teaching me that! Who is my next contestant?
00:19:53.920
Let’s make this a little easier. Since we’re ripping through contestants, we’ll use the same method.
00:20:04.720
Once again, we have the array [1, 2, 3], and we’re going to multiply it by a string of '-' (a minus sign). What do you think this will give us?
00:20:21.760
A) an array with the strings "1-2-3"; B) an array with the strings "-1-2-3"; C) an array with negative 1, 2, 3; or D) the string "1 2 3"?
00:20:49.680
I would recommend Stack Overflow because it sounds like there's a lot of people talking about it. I think I'm going to go with Stack Overflow.
00:21:20.760
Alright, audience participation time! Who thinks it's A?
00:21:38.160
A couple of people. B? Slightly less people. C? Not zero people. D? Whoa, a lot of people!
00:21:56.760
You know what? I was thinking D anyway!
00:22:15.240
And you are correct! Even though that is the same method call, when the argument is a string instead of an integer, it operates like a join.
00:22:36.240
So, are you ready for your next question?
00:22:45.720
Yes, I think I am!
00:23:00.900
Alright, here we're defining a method called "how big?", which is a predicate and takes an argument of a hash. When we call size on that hash, what will we receive? A) 0, B) nil, C) an ArgumentError, or D) a NoMethodError?
00:23:45.700
I'm going to go out on a limb and say it'll raise a NoMethodError.
00:24:00.870
Actually, you were at least right that it would raise something. It's an ArgumentError because we are using curly braces. The interpreter thinks that’s a block.
00:24:35.020
Thank you very much for playing. I’m going to need another contestant!
00:25:10.290
Come on up! Go ahead and introduce yourself.
00:25:47.820
Hello! I’m Gary from Seattle, and I think this is about my second year working with Ruby.
00:26:13.020
What a great welcome! Sorry, Gary, I got a hard one for you, or at least I think it's hard. So we have a variable "foo" set to "Class.new". We then assign "name1" to "foo.name" and assign the constant "bar" to "foo.name". When we put those names out, what are we going to get?
00:26:42.240
A) nil and bar, B) foo and bar, C) class and class, or D) nil and nil?
00:27:10.560
I have no idea! Let’s ask Stack Overflow. What do we think? A) nil and bar?
00:27:35.760
There’s a couple of votes for B) foo and bar, no votes for C) class and class, okay, about the same amount as D) nil and nil.
00:28:24.120
Well, we know it has to be A or C, right? That’s what we just came up with.
00:28:58.680
I’m going to go with A: nil and bar.
00:29:04.280
An excellent guess! Joe got it correct. The module name returns nil if the module or class is anonymous, but the moment we assign it to a constant, it takes on that name. That's why we had nil followed by bar.
00:29:45.640
Ready for the next one?
00:29:59.920
Alright, here’s a fun one for you! We have a variable "nums", which is an empty array, and we’re going to go through each number from 1 to 10. If "i double equals 3" and "i double equals 8", if that evaluates to true, we will shovel "i" into nums, and then put nums out when we're done.
00:30:40.880
Is this going to give us: A) 1, 2, 3, 4, 5, 6, 7, 8, 9, 10; B) 3 and 8; C) 1, 2, 9, 10; or D) 1, 2, 3, 4, 5, 6, 7, 8?
00:31:24.720
You still have your pair power!
00:32:01.960
I will pair!
00:32:15.840
You’re saying D?
00:32:43.560
Smart man! So, if you are as confused as I was when I saw this snippet, let me tell you, I couldn’t even Google it without looking up the term—it's called a flip-flop operator.
00:33:27.600
In short, when the first part of the conditional evaluates as true until the second part evaluates to true, that conditional remains true.
00:33:40.840
I know there are good uses for this; I just don’t know what they are. You can ask some of the experts.
00:34:00.480
Are you ready for your next question yet?
00:34:20.880
I'm somewhat prepared but do not have a lot of powers!
00:34:40.720
So we have an array with the question marks, and this code is going to operate. Are we going to get A) a name error; B) a string of question marks; C) a nil return; or D) the string question mark?
00:35:01.280
Everybody wants to know! I was initially thinking B, but that seems a little bit too straightforward. I’m going to go with D.
00:35:24.480
Actually, that’s unfortunately wrong. The answer is C. If you were to pull up IRB, assuming you have a new version of Ruby, it would return a single character-string.
00:35:41.920
Moving right along.
00:35:58.240
So we have 1 through 5, and we’re going to map over it. We’re going to send it ampersand with a colon and a minus. Are we getting back: A) 1, 2, 3, 4, 5 all negative; B) negative 1, 2, 3, 4, 5; C) no method error; or D) 1, 2, 3, 4?
00:36:30.040
What’s your answer?
00:37:07.600
I’m going to go with A.
00:37:35.960
And you are right! Nice work.
00:37:45.880
So, this is how the integer instance method for negatives work. The minus sign will return the integer negated. All three ways you see on the screen are all negative five—they are the same basic idea.
00:38:06.920
You should play the lottery after this!
00:38:30.760
Let’s talk about a situation where A is going to equal false or true and B is going to equal false or true. What will A and B return? Will it be: A) true and true; B) false and false; C) nil and true; or D) false?
00:39:33.000
You no longer have your power-ups!
00:39:48.030
I'm confused, but I want to go with A.
00:40:05.860
Unfortunately, it will evaluate to false and true. They do operate differently, and you were right that it has a lower precedence than the pipe. Good job, Gary, thank you very much for playing!
00:41:05.640
We need a new contestant!
00:41:20.180
A man that needs no introduction, but I'll let him do it anyway.
00:41:35.160
Hello! My name is Brandon Weaver. I'm currently in San Francisco, and I've been programming Ruby professionally for about 12 years. Interestingly, it’s been about 20 years actually, since RPG Maker XP had this lovely little RGSS thing, which is Ruby Game Script System, so I got to use that a long time ago.
00:42:18.970
Alright! Let’s find out! A is going to equal 3 times a block with the string "Ruby" in it. So is A going to return: A) Ruby, B) three times in a string; C) the integer 3; or D) an enumerator?
00:42:45.920
You're right, it's B.
00:43:05.440
For those of you who aren't Brandon, would you like to explain this?
00:43:29.280
Integer times returns an enumerator if there's no block provided, but in this case, we provided a block. However, the block just didn't do anything. What is returned is that integer.
00:43:45.760
Now, here is the next question! A is going to equal sleep 1.5. What will this yield: A) 1, B) nil, C) 2, or D) every time we call A, the system will sleep for 1.5 seconds?
00:44:09.200
I want to say B, but I'm going to do something controversial and say phone a friend to Sam.
00:44:34.600
I think it’s one or sometimes two. It depends on your system. Turns out sleep will actually return the amount of time it actually slept for.
00:45:00.240
But it's either going to be a one or two. So good job! I'm impressed!
00:45:22.600
Oh my God! I'm out of volunteers! Does anyone else want to come up here and try this?
00:46:13.760
Oh my god! Andy Kroll!
00:46:29.920
Hi! I'm Andy, nice to meet you. I've been programming Ruby since 2007.
00:46:42.720
Here’s your question: X is equal to X. What's X? Is it A) a name error, B) a system stack error, C) nil, or D) no method error?
00:47:26.240
Stack Overflow audience, what do you think? A name error?
00:47:47.560
A lot of agreement on that one. What’s it going to be? 1 and a half? We’ll go with one for now.
00:48:08.560
A very popular option.
00:48:32.000
So it looks like C is the winner.
00:48:58.440
So, if we just call X on its own, we will get that name error, but if we assign it to itself, it becomes nil.
00:49:20.440
Ready for the next question? No, but let’s go.
00:49:54.360
I’m not even going to read this. I'm just going to let you stare at it.
00:50:18.720
Are we going to get a name error? A nil error or the string question mark?
00:50:42.720
That's the string question mark because it would be D.
00:51:02.720
Are you sure? No, I'm not.
00:51:27.720
You have a partner to ask?
00:52:00.720
It is!
00:52:41.920
So, if you are scratching your head, think back a couple of years and remember that a question mark in a single character is returned.
00:52:58.720
Ready for the final question?
00:53:17.600
Yes, I can go at the end!
00:53:33.720
So we have: "deaf movie = deaf food [see]". What do you think foo plus foo’s going to be? A) nil; B) fubar; C) far; D) a syntax error?
00:54:05.920
So calling foo with a plus would be...
00:54:25.480
You can make your default parameters a method!
00:55:05.920
Let's give a huge round of applause for all of our contestants!
00:55:30.720
They did great! They actually got a few right! Please don't make your friends and colleagues' brains hurt.
00:56:03.480
I owe thanks to Ufuk and Kevin for all their help in putting this together. Ufuk gave me some evil ideas, and Kevin Murphy helped me with my CFP and calmed me down.
00:56:20.080
If you liked this kind of stuff, you can find me here! I will be happy to send you some weird stuff ideas.
00:56:46.480
If you liked this weird stuff and want to come work on some of it— the app here is 13 years old, written on Rails 2.0, and Ruby 1.8 by people who were writing PHP and C-sharp. It’s a lot of fun.
00:57:07.640
Thanks again, everyone. This was a blast!