Developer Experience (DX)

Summarized using AI

10x your teamwork through pair programming

Michael Milewski and Selena Small • April 24, 2023 • Atlanta, GA

In their presentation titled "10x your teamwork through pair programming" at RailsConf 2023, speakers Michael Milewski and Selena Small explore the dynamics of pair programming through a comedic skit that emphasizes the importance of collaboration and communication among developers. The presentation outlines both the challenges and successes that can arise while pairing, aiming to enhance teamwork in a software development context.

Key Points:

  • Introduction to Pair Programming: The session begins with a humorous portrayal of a first-day experience within a development team, highlighting the misconceptions that can exist around roles—Selena is mistaken for a designer, pointing to gender stereotypes in tech.

  • Importance of Kickoff Meetings: The skit illustrates the necessity of having a clear understanding of project requirements and business value, advocating for proper kickoff discussions to align team members on goals.

  • Code Collaboration Dynamics: The interaction between Michael and Selena showcases typical pair programming challenges, including distraction, miscommunication, and differing coding styles. They attempt various coding tasks together while discussing their frustrations, effectively portraying common pitfalls in teamwork.

  • Testing and Iterative Development: The pair emphasizes a test-driven approach, demonstrating how they interactively write and refine tests for their code. They grapple with failing tests, which serve as educational moments on problem-solving in coding.

  • Addressing Distractions and Clarity: Selena expresses her discomfort with Michael’s distractions and lack of attentiveness, leading to an exploration of the importance of minimizing distractions during pair programming. They eventually establish guidelines to enhance their focus and improve their workflow.

  • Reflection and Continuous Improvement: At the end of their session, Michael and Selena engage in a retrospective conversation about their pairing experience, discussing what worked well and what could be improved. They highlight the significance of ergonomics, discussion, and planning as keys to effective collaboration.

Conclusions and Takeaways:

  • The session effectively combines entertainment and education, ultimately reinforcing that pair programming can lead to significant efficiency gains when done correctly.
  • Participants are encouraged to create an environment that values clarity, encourages communication, and minimizes distractions, ensuring all contributors feel engaged and valued.
  • Having simple guidelines and an open mindset is crucial for maximizing the benefits of pair programming, enabling pairs to work through challenges together while fostering an inclusive and collaborative culture in development teams.

10x your teamwork through pair programming
Michael Milewski and Selena Small • April 24, 2023 • Atlanta, GA

A roller coaster journey of how to get the most out of pair programming. Live on stage acting out highs, lows, do’s and don’ts of pair programming. Laughs and tears are guaranteed as the audience connect on the difficulties and ultimately the rewards that can be reaped through effective pairing.

RailsConf 2023

00:00:18.539 Buckle in, everybody! This is just going to be some good pairing. The only thing is, I'm Michael, and we need Selena. I don't know, you know, these days I'm pretty good on the keys anyway, right? I could probably just solo it in. We don't need a pair, do we? Now we'll be all good. Oh, who's enjoying the conference? Yeah, all right!
00:00:39.480 But let's get out of the conference and into my office. This is where the magic happens. Hey, this must be the new HR girl. Hi, I'm Selena. Oh yeah, is she a designer? I thought I needed an actual coder up here. Uh, yeah. Welcome to the company! How are you doing? I'm Michael Milewski, senior developer here at Aviator.
00:01:10.799 Wow, you know, it's really nice to meet you, and I'm pretty excited to get started! So, do you want to fill me in on how things work around here? I'm not sure about people who don't code, but for the dev team, we've got a really important stand-up right now. Catch ya!
00:01:21.299 Wow, wait! You can't code? Ah, I'm a woman! Got it. It's probably why I think I'm a designer too! Do you know how many times I've actually been approached as that? And he's a bit up himself, senior developer over there. Michael Mansplainski. I suppose I shouldn't judge a book by its cover, though.
00:01:42.119 Alright, my card today: 'To Do List, delete item with Selena.' It's a joke! Hang on, are you a developer? Well, you don’t look progressive enough to have me as a CTO, so I might as well just cut some code, eh? Well, come over here to the stand-up!
00:02:10.619 How are you? Oh, she has a fair handshake there. Alright, you know what? Can you tell me a bit of background on the story? This is going to be some serious coding. This is more than just some CSS, honey.
00:02:25.320 Great points! I didn't say anything, exactly. Let's keep it that way. Um, look, you know what? For this one, I think I may even need Stack Overflow. Maybe a bit of ChatGPT to sort this one out. Really, you guys just use React, right? I mean, it sounds like we're just going to need a pretty simple callback function to respond to the delete action, but you know, maybe we can start with a kickoff to get a bit of background.
00:02:57.120 Kickoff? I mean, when Sam joined the company, he tried to make us more agile, bring in story points, retros, that kind of stuff. But I suppose somebody like you would need a kickoff. So, what’s there to say? We have a to-do list, and we need delete functionality. Why do we need it? To delete the to-dos? Done! I think we're kicked off. Let's go!
00:03:35.819 Well, hold on! Why do we need to delete to-dos? What is the purpose? Like, what is the business value here? I think you're going a little bit over your pay grade there. But all you need to know is that this is a React app, and we have an item component that has the ability for deletions of those items. And you know what? We're probably going to need a callback function.
00:04:08.099 Back in Mido, we used to call them 'call after functions.' There are kind of two kinds of questions. Don't you all just love a good spline? Alright, I think we’re good. I think we’re ready to go! Come join me at my machine!
00:04:38.420 Alright, so this is where the magic happens, right? This is the code. Uh, all of that? I mean, I wrote all of it. It's great! And, uh, yeah, keep your eyes on the screen and watch the magic happen. It's all good; you'll be fine. And then, yeah, what's going on here? Oh yeah, let me run all those tests!
00:05:10.380 Whoa, huh? Gotta fix this test. Ah, okay, cool, we have a failing test! Right, so it marks an item as complete when the toggleComplete is called. Yeah, it’s a failing test. I think you just want to get into app.test.jsx.
00:05:50.340 Uh, yeah, yeah, could I just ID you? Do you not have? Yeah, put your hands together! She knows how to use an IDE! Yeah, yeah! Please clap! Alright, app.test.jsx.
00:06:10.440 Okay, can I just have a look at the structure of the code first? I mean, you've seen it, app.test.js. You do know JSX, right? And a test file, test.jsx? Alright, cool. Okay, yeah, well, let's just go with what you want to do.
00:06:43.260 So, ACT test.js, so get some tests in here. And um, line 41? I think line 41 just needs a debugger thrown in. Yeah, but in this kind of block here, we've got two items and two items, but line 41, that's where you need to put the debugger in. Debugger. D. E. B. Yeah, alright. What are we trying to do here? What are you trying to do?
00:07:33.060 Hey, I got it! Why would you put a debugger in there? I think we’ve set these up the wrong way. The ABCs are before your one-two-threes! Right, so we need to get those in the other order. You gotta get your ABCs before your one-two-threes, right?
00:08:11.520 This is great, and that was some amazing pairing! Let's add all our things and commit to React! To Miami! That's not React! Miami!
00:08:30.420 Ruby Atlanta! Yeah, alright! Let’s get that going in 3, 2, 1. What is that? Is your camera on? Yeah, cameras are always on! Prosperity! I mean, I may even upload this one to my private server.
00:09:04.260 Alright, let’s have a look. There you go! We’re mating Ruby, at least Rails! Atlanta! Yeah, we’ll get that right.
00:09:29.580 You know what? I think it's about time that some good pairing happened! Let's go get a coffee. Oh, you believed he was recording me? What a creep! I had no idea. And you know, actually, I feel a bit uncomfortable now.
00:09:56.880 Cool! That's how we work at this company. Uh, here you go! How do you like your coffee? Cool, you know I take my coffee very, very seriously! That's how I take it; you're allowed to use that one, it's a good one! Free joke!
00:10:20.400 Very seriously! Okay, it was only a joke. Maybe a bad one. Okay, alright. Anyway, so how long have you been here at Aviator? Oh, Aviator? I was one of the first internal developers on this project.
00:10:54.760 You really are the whole codebase pretty much! Well, apart from John, the CTO who hired you? Yeah, John, he's a cool guy. So, he's pretty big on TDD. Why was it that we started on this code with a failing test? You seem to know a lot about it. Why don’t you get on the keys when we get back to the keyboard?
00:11:19.740 Yeah, okay, I'm up for it. Oh, Jane's phone left unlocked? You beauty!
00:11:54.580 Cool! Cool! Cool! Alright, so somewhere here. Just, yeah, hang on, just before we unlock this, I think we just need... yeah, don't want to miss out on anything! Right? Sure, sure!
00:12:20.940 Um, okay, I think it's app.test.js, right?
00:12:46.680 What? Okay, we want to go over here. Alright, cool! So, we've got our... Alright, so what we're going to do is we want to make the... I'm so distracted! We, we want to delete our to-dos, so we need a new test because we're all TDD, right?
00:13:34.440 Um, so we've got this describe block here. We've got two items, cool. We're going to assert that it marks the item as complete when the toggle is called. We want to do actually a similar assertion! So if we grab that chunk of code and, um, chuck it down there. Don't do that!
00:14:14.460 Oh, okay, I won't do that then. Alright. Well, so this whole describe block, like, I mean, I think we're going to end up with something really similar. So I might just start by just grabbing a copy; this is what I should have disabled. Don't do that!
00:14:50.460 Oh, okay, I won't do that! But to be honest, with you all, like, I think it's going to be in the same kind of context. So, let’s start writing out a new kind of assertion here. So, it removes the item when removeItem is called.
00:15:28.920 And this is going to be, well, this is, you know, we're all React developers here at this conference. So this is going to be an error function. No, no, don't do that. Well, can I just look? It's better!
00:16:04.680 Just let me get my thought out! Like, can I? Can I have a go? Sure! Sure! Cool! So inside of this arrow function, we're going to have a really similar thing to what's up here.
00:16:36.960 Right? Except that instead of calling toggle complete. Alright, great chat! Look, I know it's your first day and it’s a great start you've made here, but I think what we actually need to do is call a new test here and it removes the item when... Wait, no item...? Isn't that what I just... Isn't that what I was just writing here?
00:17:05.460 Uh, sorry, is that distracting you? Like, we can just comment that out. And then, I don't know if you're into CrossFit, but they’re these things called arrow functions, ES6? We're all the rage, right?
00:17:45.240 Now, and then, actually, I might just borrow this piece. Is that annoying you? Uh, look, let’s just delete that. It’s going to copy that. Is that better? Yeah, okay.
00:18:22.500 And then, um, we're just going to do this. But obviously, remove item is going to get called over here, which means 1, 2, 3 won't be there, right? And that's, yeah, that's cool, isn't that kind of what I just was writing?
00:19:01.680 No, no, that was all wrong! This is, this is good now! Whoa! This calls remove item, right? So, remove that. That’s a function, right? Yeah, yeah! It's passed down as a prop function. We call it with the brackets, so the remove item function.
00:19:45.780 Cool, so what does it do? Removes the item! Yeah, but I mean, like, what I would say is it's pretty clear, right? Removes! It either removes the item! You get it, right? I mean, you can see it right there. It's clear. It's a remove item function!
00:20:14.580 You get it, right? You get it! You get it right? I’m not quite getting it; it removes an item! Cool, that’s what it does! Let’s just leave it at that!
00:20:40.320 But, you know, maybe it'll be easier to see in a different font. You know, I did work with Brad once. He used a different font every day of the week.
00:21:20.820 What? What? Web things? Oh my God! People don't say that! You better not save that! They do that up! Why does this... Luckily, the editor doesn't actually save it!
00:22:02.520 Boy, Times New Roman and Comic Sans might be a joke—but wait until you see my code in Comic Sans! That's a great one! Alright, oh Impact! I’d love to see my code have some impact.
00:22:53.040 Yeah, I guess I asked for that! So, can we run the test now? Narco? That was a classic back in 2005. Do you think we can run the test now? Sorry, yeah! Oh yeah, yeah, yeah—do you think we could run the test down? Well, now that we've understood the method, yeah, let’s run the test.
00:23:18.240 So, um, just jump over here. Failing test! Nice! Boom, that’s test driven for you!
00:23:53.820 Okay, cool! So I might jump in here and... Yeah, the implementation?
00:24:05.820 Yeah, yeah. Alright, great! So, hey, have you seen that? I think that's a bottle at the Atlanta Coke Museum! Have you been there? No! Oh yeah! Hey, let's take a selfie!
00:24:45.300 What? Oh my God, that’s so distracting! What are you doing? Jenny's not gonna be happy, okay? What! Well, that's her phone! This is my phone!
00:25:21.780 And you know what? It’s about time for a run, for my lunch!
00:25:55.620 Run? I think I might go get a burger. Maybe I might run past that Atlanta Museum. See you when I get back!
00:26:20.460 Oh, I cannot believe I just lost it there. Uh, something's not right.
00:26:30.780 I took this job because this company was known to have a strong pairing culture, but we just can't seem to gel. It's like this guy's never done a talk with me before, and he doesn't even know how to pair.
00:27:00.660 He doesn’t have any manners, slurping tea in my ear! Surprise! Nobody walked out of the room! And how easily was he distracted by all those fonts? You know, I thought pairing was meant to be about collaboration, but he won't let me see the screen!
00:27:38.760 Right? And he's jumping through windows at lightning speed, and I have no idea what's going on! Do you know what? I don't think he even knows!
00:28:10.080 And then, when I finally get my hands on the keyboard, he either tells me what to do or rips it right out of my hands!
00:28:40.380 And then he tries to take a selfie with me on someone else's phone! I don't know how this guy gets anything done! You know, speaking of getting things done, where is he?
00:29:10.680 It's turning out to be a really long lunch.
00:30:10.820 Hey! Hey, how are you? What are you listening to when you're running? Uh, not music. Like, some people. You know what? I love to listen to a good podcast! I was just listening to Brittany Ruby on Rails Podcast live from the Atlanta conference.
00:30:41.820 But, you know what? Last week's episode 466 was an absolute blast! It was Gemma and Brittany talking about this duo of presenters that were discussing pair programming code and conferences. You should check it out! Episode 466.
00:31:06.840 Yeah, link, subscribe, and hit the notification bell! Because that duo they were talking to? They're like world-famous presenters! They're amazing! Did I say that on camera? Sorry! We could learn a thing or two from them!
00:31:45.420 Episode 466! And if anyone has a Blue Sky invite, come and see us after the talk! We could give this one. Thank you!
00:32:05.040 Right, what were we up to? I'm going to write that test! Yeah, uh, we already wrote the test.
00:32:29.760 Well then let's, um, let's make it pass! Right, uh, yeah! You're just like, run it again!
00:33:01.020 Just to make thoughts right now, it’s good! Okay, do you want to just... I’m happy to type if you want me to.
00:33:25.080 No, hey, look, why don't we take a longer lunch break today? We're gonna ask, it's going well!
00:34:01.980 Let's get those lines of code pumped out! No, no, come on! We've got a 45-minute slot to fill—we don’t have 45 minutes of content!
00:34:25.680 I think, uh, a longer lunch break today would be good! You go finish your lunch, get cleaned up, meet with me back in 15!
00:35:00.000 Elon's look and make sure you get those lines of code pumped out! Come on, we need to meet our daily quota!
00:35:48.420 Let’s do it! Look, I think a break would be good! No, we can go, we can keep going!
00:36:20.520 Let’s be real! To be honest, you eating is very distracting, and, like, you're kind of dropping sweet all over me!
00:36:50.820 Oh right, um, alright! Well, uh, look, I’ll just go get a rabbit quick shower!
00:37:23.300 Ah, hey Jody! Yeah! Yeah, first day’s great! Oh, well, I mean, actually— you wouldn't believe the guy that I have to code with today!
00:37:42.900 Oh, he must be the world's biggest keyboard hog! And honestly, you should hear this guy explaining callback functions to me!
00:38:06.840 Oh hey! Yeah? No, he's not! Not my type! Like, he came back from his run, dropping sweat all over me and burgers through his bed!
00:38:36.780 Oh, do you know what? I can see Mr. Noodles on his way back now to tell me how to hang up the phone next. Hey, I better go, but, um, would you just check and see if my old job is still open?
00:39:07.500 You know, just in case! Ah, awesome! Okay, okay, cool, chat to you soon, bye!
00:39:50.940 Hey! I was thinking, you know, I’ve been coming back sweaty from my run and burger dripping through my bed must have made you feel really uncomfortable!
00:40:06.520 Sorry about that! Oh! Wow! Thanks for acknowledging that! Should we write that test now?
00:40:27.120 Yeah! Yeah! Let’s do it! You go for it! Okay, okay, cool! So in here we've got our failing test— that removes the item when remove item is called.
00:40:51.540 Yeah, that's right! You jump over into the editor here!
00:41:10.980 Oh, my! Just, um, yeah! Keep going! Keep going! We're good!
00:41:39.820 We're good to go—are you going to cut your toenails next?
00:41:59.580 Toenails? No! Come on, Selena! There’s a line we don’t cross!
00:42:24.240 But maybe this way I’ll get a few less typing errors.
00:42:42.840 Oh, alright! Alright! Alright! We’ll stop, we’ll stop there! Um, yeah! Let’s make it happen!
00:43:40.440 Let me just do this thing real quick! Just in case you haven’t had enough.
00:44:14.520 Yeah, let’s go! Alright, cool! So if we go just... Well!
00:44:42.420 Let’s just remember what we’re up to! Back over here, where are we? Where’s our test? I have no idea! Try this one! This one!
00:45:19.680 Oh yeah! Okay, cool! So we got that failing check! Whoa! See that slack notification? Cake time! Let's go!
00:45:37.920 Oh my God, guys! So hard to work with anyone! Here, work with somebody like this?
00:46:08.060 No, really? Yes, honestly, there's a new distraction every two minutes!
00:46:32.100 And he is disgusting! Like, what kind of person cuts his nails at the desk?
00:46:58.800 That’s based on a true story! And by the way, even when you're remote, you can still hear you clipping through there, through the screen. Ship!
00:47:24.480 But you know, I’m in America, so I could channel some of that American positivity, because he did apologize for sweating on me!
00:47:40.200 That is nice! But still, you know he clearly has very little consideration for others. I bet he's one of those guys who lives in his mother's basement playing computer games!
00:48:08.440 Now, watching girls fight on the weekend! New girl, got lucky paired up with me today! I know more than anyone about the code base!
00:48:58.160 But why am I having this pissing contest with her? After all, John did hire her! He had heard a 10x team and, gee, I don't even know if I’d get hired these days.
00:49:34.740 Maybe I should just back off a little bit, give her a chance. Maybe I may even learn something from her! Hey, here's some cake for you!
00:50:07.380 This cake's pretty good! Reminds me of the birthday cake I had on Saturday when I picked up my son from his birthday friend's birthday party!
00:50:43.600 Oh, you have a son? Yeah, I got four kids! Four kids? Whoa, he must be a busy man!
00:51:03.120 I guess you don’t have much time for coding outside of work or traveling the world to speak at conferences then! Yeah, pretty busy!
00:51:36.060 But I do manage to get a hobby project in here or there! Oh really? Yeah! You working on anything interesting at the moment?
00:52:06.960 Yeah! I'm doing some things with the ABA.
00:52:39.540 ABA? Is that a framework? No, it’s the Australian Breastfeeding Association! They’re a volunteer group, and I'm helping by volunteering and helping them with their website.
00:53:06.780 Wow! That sounds great! I didn't expect that from someone like you! So you're having a pretty cruisy day on a first day, huh?
00:53:39.540 Yeah, it's been a little harder to get started than I thought it would be. Yeah, the architecture on this project is pretty evolved!
00:54:01.920 Like anyone here can explain the purpose of what we're trying to do? Hmm? Maybe I haven't made it as clear as I thought.
00:54:23.460 You know what? Why don't we go and step back over there to the whiteboard? Maybe I can give you a better run-through.
00:54:45.420 Alright, well! Let's get back into the code. Oh, what? He's got girl fights on his computer? I knew it!
00:55:15.840 It's not what you think! A really good friend of mine's a kickboxer, and I was just editing a video for her from a fight last weekend.
00:55:43.320 Ah, okay. Well, that’s pretty cool! She looks a bit badass! She won!
00:56:06.780 Oh, we can talk about that outside of pairing hours! Let's go!
00:56:32.760 So, you know what? We probably should have started with this whiteboard overview right at the beginning!
00:57:07.200 And if we think about it, our component structure of our to-do list is currently the way it's implemented!
00:57:41.700 We have an app component that renders a new form item and a list of items, and we want to be able to delete an item!
00:58:03.600 So there's probably going to be a button on the item components, correct?
00:58:29.040 However, it's the app component whose responsibility it is to tell the item list which items to render.
00:58:43.620 Oh, so we need to add a callback! Sorry! So we need to add a function to the app component which gets triggered when we click the delete button?
00:59:05.760 I think, uh, precisely right! And in order to call it, we'll have to pass a reference to the function down to the component!
00:59:49.620 I think we're on the same page now! Do you want to have a crack at implementing it? We could try ping pong pairing!
01:00:11.520 Ping pong? I think we’ve had enough distractions! Oh! Ping Pong pairing! When one person writes the test and the other person writes the implementation and then you swap like Ping Pong!
01:00:32.820 Ah, okay! Well, I mean that sounds like a good way to stay focused!
01:01:05.520 Cool! Alright, so, um, we’ve got the... Ah! Let’s get a few things sorted. I have a spare keyboard and mouse.
01:01:25.680 If we put that over here and move the screen between us, we can both have access and contribute evenly to the code!
01:01:50.580 So we can both contribute! It's going to be great, right? So, we’ve got that failing function there! Um, well, okay, cool!
01:02:09.240 So I can see the screen now! Um, could we just go back into the editor and up the font a little bit as well?
01:02:40.320 Yeah, we can up the font! Do you want me to change it as well? No, oh, good call! Good call! I think they're good!
01:03:00.000 Alright, yeah! So, well, do you want to have a go at implementing this one? Yeah! Cool!
01:03:24.840 So we've got our test, and it fails, so it removes the item when remove item is called!
01:03:44.620 Nice! Easy! As we get some great indentation going on! But that’s right—I'm still not sure!
01:04:15.180 Okay! That was, I think, Michael!
01:04:34.020 Alright, because you know, OCD! Um, cool! So, remove the item when remove item is called!
01:05:01.920 At the moment, we're getting a failure over in the terminal because we couldn't find the function!
01:05:16.560 So if we go back into our editor here and we look at the app itself and in here we've got this list of items!
01:05:49.440 What we want to do is we want to pass a function remove item down to the list.
01:06:12.420 Remove item? And that seems to be, oh! So that's what it does!
01:06:24.840 Oh, I could have shown you the implementation, right? Yeah, okay, I get it now! I get it!
01:06:54.300 You do get it. I do get it! Don’t yell at me again! Uh, cool!
01:07:22.500 So if we go back into our terminal, boom! It's passing! Yeah! Nice! So should we jump into the browser and see?
01:08:02.760 Um, have we even looked at this at all? I don't think so, I should have done that as part of the whiteboarding.
01:08:28.920 Right! Well here's our to-do list. Right? And we were like, what do we say? We love react comp!
01:08:55.320 Oh! Wait! We're not at react conf! Let's delete that one!
01:09:16.320 Can't delete it, there's no button! No button! Alright! So back over in our editor, we can start writing another test!
01:09:37.800 So we've passed that down to the item component in our item test. We have this describe block.
01:10:01.380 When there's an item, it checks the checkbox when it's checked. Here we're going to use some of that cut-and-paste magic from before because we're going to do a really similar thing!
01:10:23.520 Yeah, it did actually work in the end! And what we're going to do here is say it removes...
01:10:46.020 No! What am I doing? I think it just calls, yeah, sure! RemoveComplete calls remove item! If I can type!
01:11:07.860 When we're not going to check your checkbox, we're probably going to click a button. It's a good idea!
01:11:33.720 Cool, and so in here what we're going to be looking for in the HTML is a button element!
01:11:56.520 We're going to click it and then we're going to mark that remove item hopefully gets called!
01:12:18.600 If we jump into our terminal now, run those tests again, we've got a failure because this was meant to be run on one node, but there isn't a button there!
01:12:50.520 So ping pong over to you! Do you want to implement that?
01:13:07.200 Cool! Yeah, thanks for adding that test over in...So that was an item test.jsx!
01:13:45.720 So we need a button and, as you said, it couldn't find anything expected to find a node, but it found zero nodes.
01:14:08.640 So I think the first thing we need is in the item—this is where we have a list item. We probably just want to throw in a button!
01:14:28.920 That should be enough to make the test do the next thing! So if we go in there, and it runs again, we now see that it has managed to click it, but it hasn’t removed it!
01:14:57.840 So if we go in here, the button's there, clicking it does nothing! And if we now go in here, we need to probably uncheck equals!
01:15:25.380 And then we're going to call out on checker on click! Oh yeah, yeah, no, you're right! So on click, right? It's good to have a pair!
01:15:49.500 And then in here we're going to toggle... No! We're going to the new function which is remove item with the ID!
01:16:14.640 And if all goes well, the test passes! That means we can go into the browser and press remove!
01:16:45.780 And we can sell welcome to Ryan’s conf at Atlanta!
01:17:09.360 And we could delete that! Well, just a test we did! Um, listen, that was some great pairing!
01:17:36.540 Uh, you don't mind if we do a long commit together? Yeah! Let's do it!
01:18:05.040 So I’m gonna get add all the things! Should we do a high five? Yeah, yeah! Should we do our locomotion with the crowd? We can do that!
01:18:38.520 Is every... Oh! Is everyone safe to be in a low commit? Yeah! Yeah! Yeah!
01:19:05.820 Okay, cool! Cool! So, maybe if we get down here! Bang! And then...
01:19:32.520 Do I just commit? Hold! You have to hold it up! I have to hold it up! We don't even see what happens! But the camera goes on!
01:19:58.620 We've got about two seconds! Let’s go! One, two...
01:20:42.920 Alright! And we have no idea how long it takes!
01:21:05.520 And then if you do it all right! So hang on, hang on! It gets stuck if you do it too early!
01:21:31.960 But yeah!
01:22:02.060 Yeah, there we go! That was some good pairing! Winning!
01:22:42.420 Look, I think it’s almost the end of the day! But let’s have a quick retro just to see how today’s pairing went!
01:23:06.480 Well, you know what? I think that we managed to smash out that feature!
01:23:31.800 Yeah, I agree! And stepping back to draw it all up on the whiteboard got us both onto the same page.
01:23:53.220 There are a few things that didn't go so well, though!
01:24:14.820 Um, yeah, that was a couple of distractions! But we still managed to get through the day!
01:24:32.640 A couple of distractions? I can think of a lot more than a couple! Um, you playing on your phone, switching up the fonts every two minutes!
01:25:09.000 And not to mention you clipping your nails at the desk? Yeah, maybe I should have left that one for home!
01:25:40.360 And you seem really unfocused when I came back from my run too!
01:26:06.600 Ah, because you were dripping sweat and burger all over me!
01:26:27.680 Do you know? I definitely think it was more productive to take a longer lunch!
01:26:51.120 In that case, well, it did work out for us in the end!
01:27:14.700 But maybe next time we pair, if we just had some sort of guideline to help us get started, then we could be more effective sooner, right?
01:27:33.060 And the first thing would probably be to sort out ergonomics!
01:28:06.840 Once we both had equal access to the machine, it was much easier for us to both contribute!
01:28:29.520 Uh, yeah, that’s a good starting point!
01:28:47.960 Another one might be to eliminate all distractions right from the beginning!
01:29:11.040 Yep! And if we take regular breaks, then there's still plenty of opportunity for things like social media and tea breaks and snacks and personal hygiene outside of pairing!
01:29:38.920 Focus time, right? And last but not least, how small or simple things seem—talking through it and coming up with a plan early on means you can both focus on coming up with an improved design!
01:30:03.960 And most importantly, we both have an opportunity to contribute our ideas!
01:30:28.140 And you don't need much to get started—just a few simple guidelines and an open mind!
01:30:54.020 We hope you’ve enjoyed our presentation today! We have been Selena Small!
01:31:04.780 And Michael Milewski! Thank you!
Explore all talks recorded at RailsConf 2023
+81