Podcast appearances and mentions of Mandy Moore

Share on
Share on Facebook
Share on Twitter
Share on Reddit
Copy link to clipboard

American singer-songwriter and actress

  • 540PODCASTS
  • 754EPISODES
  • 54mAVG DURATION
  • 5WEEKLY NEW EPISODES
  • Nov 30, 2021LATEST
Mandy Moore

POPULARITY

20112012201320142015201620172018201920202021


Best podcasts about Mandy Moore

Latest podcast episodes about Mandy Moore

Hazel & Katniss & Harry & Starr
The Darkest Minds

Hazel & Katniss & Harry & Starr

Play Episode Listen Later Nov 30, 2021 42:46


Are you Green or Orange? We're not quite Red over this listener recommendation (thanks Em!) but both Brenna and Joe find that Bracken's text doesn't fully want to engage with its rebellion or world-building as much as it could (or should?) Instead it's a lot of road trip, with an unconvincing romance and a cliffhanger that suggests we might enjoy the next book in this series more.Alas the film fares worse: despite decent special effects and a more convincing romantic pairing between returning champ Amandla Stenberg and someone named Harris Dickinson (*not a Hemsworth), the film doubles down on the book's least interesting aspects. As it stands, this pairing simply doesn't stand on its own two feet and Stenberg (see previous episodes: Everything, Everything; The Hate U Give, and The Hunger Games) deserves better!Wanna connect with the show? Follow us on Twitter @HKHSPod or use the hashtag #HKHSPod:Brenna: @brennacgrayJoe: @bstolemyremoteHave something longer to say or a comment about book club? Email us at hkhspod@gmail.com. See you on the page and on the screen!

Greater Than Code
260: Fixing Broken Tech Interviews with Ian Douglas

Greater Than Code

Play Episode Listen Later Nov 24, 2021 64:32


01:01 - Ian's Superpower: Curiosity & Life-Long Learning * Discovering Computers * Sharing Knowledge 06:27 - Streaming and Mentorship: Becoming “The Career Development Guy” * The Turing School of Software and Design (https://turing.edu/) * techinterview.guide (https://techinterview.guide/) * twitch.tv/iandouglas736 (https://www.twitch.tv/iandouglas736) 12:01 - Tech Interviews (Are Broken) * techinterview.guide (https://techinterview.guide/) * Daily Email Series (https://techinterview.guide/daily-email-series/) * Tech vs Behavior Questions 16:43 - How do I even get a first job in the tech industry? * Tech Careers = Like Choose Your Own Adventure Book * Highlight What You Have: YOU ARE * Apply Anyway 24:25 - Interview Processes Don't Align with Skills Needed * FAANG Company (https://en.wikipedia.org/wiki/Big_Tech) Influence * LeetCode-Style Interviews (https://leetcode.com/explore/interview/card/top-interview-questions-medium/) * Dynamic Programing Problems (https://medium.com/techie-delight/top-10-dynamic-programming-problems-5da486eeb360) * People Can Learn 35:06 - Fixing Tech Interviews: Overhauling the Process * Idea: “Open Source Hiring Manifesto” Initiative * Analyzing Interviewing Experiences; Collect Antipatterns * Community/Candidate Input * Company Feedback (Stop Ghosting! Build Trust!) * Language Mapping Reflections: Mandy: Peoples' tech journeys are like a Choose Your Own Adventure book. Keep acquiring skills over life-long learning. Arty: The importance of 1-on-1 genuine connections. Real change happens in the context of a relationship. Ian: Having these discussions, collaborating, and saying, “what if?” This episode was brought to you by @therubyrep (https://twitter.com/therubyrep) of DevReps, LLC (http://www.devreps.com/). To pledge your support and to join our awesome Slack community, visit patreon.com/greaterthancode (https://www.patreon.com/greaterthancode) To make a one-time donation so that we can continue to bring you more content and transcripts like this, please do so at paypal.me/devreps (https://www.paypal.me/devreps). You will also get an invitation to our Slack community this way as well. Transcript: ARTY: Hi, everyone. Welcome to Episode 260 of Greater Than Code. I am Arty Starr and I'm here with my fabulous co-host, Mandy Moore. MANDY: Thank you, Arty. And I'm here with our guest today, Ian Douglas. Ian has been in the tech industry for over 25 years and suggested we cue the Jurassic Park theme song for his introduction. Much of his career has been spent in early startups planning out architecture and helping everywhere and anywhere like a “Swiss army knife” engineer. He's currently livestreaming twice a week around the topic of tech industry interview preparation, and loves being involved in developer education. Welcome to the show, Ian. IAN: Thanks for having me. It's great to be here. MANDY: Awesome. So we like to start the show with our famous question: what is your superpower and how did you acquire it? IAN: Probably curiosity. I've always been kind of a very curious mindset of wanting to know how things work. Even as a little kid, I would tear things apart just to see how something worked. My parents would be like, “Okay, great. Put it back together.” I'm like, “I don't know how to put it back together.” So [chuckles] they would come home and I would just have stuff disassembled all over the house and yeah, we threw a lot of stuff out that way. But it was just a curiosity of how things work around me and that led into computer programming, learning how computers worked and that just made the light bulb go off in my mind as a little kid of, I get to tell this computer how to do something, it's always going to do it. And that just led of course, into the tech industry where you sign up for a career in the tech industry, you're signing up for lifelong learning and there's no shortage of trying to satiate that curiosity. I think it's just a never-ending journey, which is fantastic. ARTY: When did you first discover computers? What was that experience like for you? IAN: I was 8 years old. I think it was summer, or fall of 1982. I believe my dad came home with a Commodore 64. My dad was always kind of a gadget nut. Anything new and interesting on the market, he would find an excuse to buy and so he, brought home this Commodore 64 thinking family computer, but once he plunked it down in front of me, it sort of became mine. I didn't want to share. I grew up in Northern Canada way, way up in the Northwest territories and in the wintertime, we had two things to do. We could go play hockey, or we'd stay indoors and not freeze. So I spent a lot of time indoors when I wasn't playing hockey—played a lot of hockey as a kid. But when I was home, I was basically on this Commodore 64 all the time, playing games and learning how the computer itself worked and learning how the programming language of it worked. Thankfully, the computer was something I had never took apart. Otherwise, it would have been a pile of junk, but just spending a lot of time just learning all the ins and outs. Back then, the idea was you could load the software and then you type a run command and it would actually execute the program. But if you type a list, it would actually show you all the source code of the program as well and that raised my curiosity, like what is all this symbols and what all these words mean? In the back of the Commodore 64 book, it had several chapters about the basic programming language. So I started picking apart all these games and trying to learn how they worked and then well, what would happen if I change this instruction to that and started learning how to sort of hack my games, usually break the game completely. But trying to hack it a little bit; what if I got like an extra ship, an extra level, or what if I change the health of my character, or something along those lines? And it kind of snowballed from there, honestly. It was just this fascination of, oh, cool, I get to look at this thing. I get to change it. I get to apply it. And then of course, back in the day, you would go to a bookstore and you'd have these magazines with just pages and pages and pages of source code and you'd go home and you type it all in expecting something really cool. At the end of it, you run it and it's something bland like, oh, you just made a spreadsheet application. It's like, “Oh, I wanted a game.” Like, “Shucks.” [laughter] But as a little kid, that kind of thing wasn't very enticing, but I'm sure as an adult, it's like, oh cool, now I have a spreadsheet to track budgeting, or whatever at home. It was this whole notion of open source and just sharing knowledge and that really stuck with me, too and so, as I would try to satiate this innate curiosity in myself and learn something, I would go teach it to a friend and it's like, “Hey, hey, let me show you what I just did. I learned how to play this thing on the piano,” or “I learned how to sing this song,” or “I learned how to use a magnifying glass to cook an ant on the sidewalk.” [chuckles] Whatever I learned, I always wanted to turn around and teach it to somebody else. I would get sometimes more excitement and joy out of watching somebody else do it because I taught them than the fact that I was able to learn that and do it myself. And so, after a while it was working on the computer became kind of a, oh yeah, okay, I can work on the computer, I can do the thing. But if I could turn around and show somebody else how to do that and then watch them explore and you watch that light bulb go off over their head, then it's like, oh, they're going to go do something cool with that. Just the anticipation of how are they going to go use that knowledge, that really stuck with me my whole life. In high school doing little bits of tutoring here and there. I was a paid tutor in college. Once I got out of college and got into the workplace, again, just learning on my own and then turning around and teaching others led into running my own web development business where I was teaching some friends how to do web development because I was taking on so much work that I had to subcontract it the somebody where I wasn't going to meet deadlines and so, I subcontracted them. That meant that I got to pay my friends to help me work this business. And so, that kind of kicked off and then I started learning well, how to servers work and how does the internet work and how do I run an email server on all this stuff? So just never-ending stream of knowledge going on in the internet and then just turning around and sharing that knowledge and keeping that community side of things building up over time. MANDY: Very cool. So in your bio, it said you're streaming now so I'm guessing that's a big part of what you do today with the streaming. So what are you streaming? IAN: So let's see, back in 2014, I started getting involved in mentorship with a local code school here in Denver called The Turing School of Software and Design. It's the 7-month code program and they were looking for someone that could help just mentor students. They were teaching Ruby on Rails at the time. So I got involved with them. I was working in Ruby at SendGrid at the time where I was working, who was later acquired by Twilio. And I'm like, “Yeah, I got some extra time. I can help some people out.” I like giving back and I like the idea of tutoring and teaching. I started that mentorship and it quickly turned into hey, do any of our mentors know anything about resumes and the hiring and interviewing and things like that. And by that point, I had been the lead engineer. I had done hiring. I hired several dozen engineers at SendGrid, or helped hire several dozen people at SendGrid. And I'm like, “Yeah, I've looked at hundreds and thousands of resumes.” Like, “What can I help with?” So I quickly became the career development guy to help them out and over time, the school started developing their career development curriculum and I like to think I had a hand in developing some of that. 3 years later, they're like, “You just want a job here? Like you're helping so many students, you just want to come on staff?” And so, I joined them as an instructor, taught the backend program, had a blast, did that for almost 4 full years. And then when I left Turing in June of 2021, I thought, “Well, I still want to be able to share this knowledge,” and so, I took all these notes that I had been writing and I basically put it all onto a website called techinterview.guide. When I finished teaching, I'm like, “Well, I still miss sharing that knowledge with people,” and I thought, “How else can I get that knowledge out there in a way that is scalable and manageable by one human being?” And I thought, “Well, I'll just kind of see what other people are doing.” Fumbled around on YouTube, watched some YouTube videos, watched people doing livestreaming on LinkedIn, livestreaming on Facebook, livestreaming on YouTube and trying to think could I do that? Nah, I don't know if I could do that. A friend of mine named Jonan Scheffler, he currently works at New Relic, he does a live stream. So I was hanging out on his stream one night and it was just so much fun seeing people interact and chat and how they engage the people in the chat and answering questions for them. I'm like, “I wonder if I could do that.” The curiosity took over from there and you can imagine where that went; went way down some rabbit holes on how to set up a streaming computer. Started streaming and found out that I wasn't very good at audio routing, [chuckles] recording things, and marketing, all that kind of stuff. But I kind of fumbled my way through it and Jonan was very generous with his time to help me straighten some things out and it kind of took off from there. So I thought, “Well, now I've got a platform where I can share this career development advice having been in the industry now for 25 years. Now, I've been director of engineering. I'm currently the director of engineering learning at a company. I've got an education background now as an instructor for several years. I've been doing tons of mentoring.” I love to give back and I love to help other people learn a thing that's going to help improve their life. I think of it like a ripple effect, like I'm not going to go out and change the world, but I can change your world and that ripple effect is going to change somebody else's world and that's going to change somebody else's world. So that's how I see my part in all of this play out. I'm not looking to be the biggest name in anything. I'm just one person with a voice and I'm happy to share my ideas and my perspectives, but I'm also happy to have people on my stream that can share their ideas and perspectives as well. I think it's important to hear a lot of perspectives, especially when it comes to things like job hunt, interview prep, and how to build a resume. You're going to see so much conflicting advice out there like, “This is the way you should do it,” and someone else will be like, “No, this is the way you should do it.” Meanwhile, I'm on the sidelines going, “You can do it all of that way.” Just listen to everybody's advice and figure out how you want to build your resume and then that's your resume. It doesn't have to look like the way I want it, or the way that someone else wants it; it can look how you want it to look. This is just our advice kind of collectively. So the livestream took off from there and I've got only a couple of hundred followers, or so on Twitch, but it's been a lot of fun just engaging with chat and people are submitting questions to me all the time. So I do a lot of Q&A sessions, like ask me anything sessions and it's just been a ton of fun. ARTY: That's awesome. I love the idea of focusing on one person and how you can make a difference in that one person's life and how those differences can ripple outward. That one-on-one connection, I feel like if we try and just broadcast and forget about the individuals, it's easy for the message and stuff to just get lost in ether waves and not actually make that connection with one person. Ultimately, it's all those ones that add up to the many. IAN: Definitely. Yeah. ARTY: So can you tell us a little bit more about the Tech Interview Guide and what your philosophy is regarding tech interviews? IAN: The tech interview process in – well, I mean, just the interview process in general in the tech industry is pretty broken. It lends itself very well to people who come from position and privilege that they can afford expensive universities and have oodles and oodles of free time to go study algorithms for months and months and months to go jump through a whole bunch of hoops for companies that want four, or five, six rounds of interviews to try to determine whether you're the right fit for the company and it's super broken. There are a lot of companies out there that are trying to change things a little bit and I applaud them. It's going to be a tough journey, for sure. Trying to convince companies like hey, this is not working out well for us as candidates trying to apply for jobs. As a company, though I understand because I've been a hiring manager that you need to be able to trust the people that you're hiring. You need to trust that they can actually do the job. Unfortunately, a lot of the tech interview process does not adequately mimic what the day-to-day responsibility of that job is going to be. So the whole philosophy of me doing the Tech Interview Guide is just an education of, “Hey, here's my perspective on what you're likely to face as a technical interview. These are the different stages that you'll typically see.” I have a lot of notes on there about how to build a resume, how to build a cover letter, thoughts on building a really big resume and then how to trim it down to one page to go apply for a particular job. How to write a cover letter that's customized to the business to really position yourself as the best candidate for that role. And then some chapters that I have yet to write are going to be things like how do you negotiate once you get an offer, like what are some negotiation tips. I've shared some of them live on the stream and I've shared a growing amount of information as I learn from other people as well, then I'll turn around and I'll share that on the stream. The content that's actually on the website right now is probably 3, 4 years old, some of it at least and so, I'm constantly going back in and I'm trying to revamp that material a little bit to kind of be as modern as possible. I used to want to go a self-publish route where I actually made a book. Several of my friends have actually gone through the process of actually making a book and getting it published. I'm like, “Oh, I want to do that, too. My friends are doing that. I could do that, too,” and I got looking into it. It's like, okay, it's an expensive, really time-consuming process and by the time I get that book on a shelf somewhere, a lot of the information is going to be out of date because a lot of things in the tech industry change all the time. So I decided I would just self-publish an online book where I can just go in and I can just constantly refresh the information and people can go find whatever my current perspective is by going to the website. And then as part of the website, I also have a daily email series that people can sign up for. I'm about to split it into four mailing lists. But right now, it's a single mailing list where I'm presenting technical questions and behavioral questions that you're likely to get asked as a web developer getting into the business. But I don't spend time in the email telling you how to answer the question; what I do instead is I share from the interviewer's perspective. This is why I'm asking you this question. This is what I hope to hear. This is what's important for me to hear in your answer. Because there's so many resources out there already that are trying to tell you how to craft the perfect answer, where I'm trying to explain this is why this question is important to us in the first place. So I'm taking a little bit different perspective on how I present that information and to date I've sent out, I don't know, something like 80,000 emails over a couple of years to folks that have signed up for that, which has been really tremendous to see. I get a lot of good feedback from that. But again, that information it doesn't always age well and interview processes change. I'm actually going through the process right now in the month of November to rewrite a lot of that information, but then also break out into multiple lists and so, where right now it's kind of a combination of a little bit of technical questions, a little bit of behavioral questions, a little bit of procedural, like what is an interview and so on. Now I'm actually going to break them out into separate lists of this list is all just technical questions and this list is all just behavioral questions and this list is going to be general process and then the process of going through the interview and how to do research and so on. And then the last one is just general questions and answers and a lot of that is stemmed from the questions that people have submitted to me that I answered on the live stream. So it all kind of packages up together. MANDY: That's really cool. I'd like to get into some of the meat of the material that you're putting out here. IAN: Yeah. MANDY: So as far as what are some of the biggest questions that you get on your street? IAN: Probably the most popular question I get—because a lot of the people that come by the stream and find the daily email list are new in the industry and they're trying to find that first job. And so by far, the number one question is, how do I even get a job in the industry right now? I have no experience. I've got some amount of education, whether it's an actual CS degree, or something similar to a CS degree, or they've gone through a bootcamp of some kind. How do I even get that first job? How do I position myself? How do I differentiate myself? How do I even get a phone call from a company? That's a lot of what's broken in the industry. Everybody in the industry right now wants people with experience, or they're saying like, “Oh, this is a “entry-level role,” but you must have 3 to 4 years' experience.” It's like, well, it's not entry level if you're asking for experience; it can't be both. All they're really doing is they're calling it an entry-level role so they don't have to pay you as much. But if they want 3-, or 4-years' experience, then you should be paying somebody who has 3-, or 4-years' experience. So the people writing these job posts are off their rocker a little bit, but that's by far, the number one question I get is how do I even get that first job. Once you get that first job and you get a year, year and a half, 2 years' experience, it's much easier to get that second job, or third job. It's not like oh, I'm going to quit my job today and have a new job tomorrow. But the time to get that next job is usually much, much shorter than getting this first job. I know people that have gone months and months, or nearly a year just constantly trying to apply, getting ghosted, like not getting any contact whatsoever from companies where they're sending in resumes and trying to apply for these jobs. Again, it's just a big indication of what's really broken in our industry that I think could be improved. I think that there's a lot of room for improvement there. MANDY: So what do you tell them? What's your answer for that? How do they get their first job? How do you get your first job? IAN: That's a [chuckles] good question. And I hate to fall back on the it depends answer. It really does depend on the kind of career that you want to have. I tell people often in my coaching that the tech industry is really a choose your own adventure kind of book. Like, once you get that job a little bit better, what you want your next job to be and so, you get to choose. If you get your first job as a QA developer, or you get that first job as a technical writer, or you get that first job doing software development, or you get that first job in dev ops and then decide, you don't want to do that anymore, that's fine. You can position yourself to go get a job doing some other kind of technical job that doesn't have to be what your previous job was. Now, once you have that experience, though recruiters are going to be calling you and saying, “Hey, you had a QA role. I've also got a QA role,” and you just have to stand firm and say, “No, that's not the direction I'm taking my career anymore. I want to head in this direction. So I'm going to apply for a company where they're looking for people with that kind of direction.” It really comes down to how do you show the company what you bring to the company and how you're going to make the company better, how are you going to make the team better, what skill, experience, and background are you bringing to that job. A lot of people, when they apply for the job, they talk about what they don't have. Like, “Oh, I'm an entry level developer,” or “I only went to a bootcamp,” or “I don't know very much about some aspect of development like I don't know, test driven development,” or “I don't really understand object-oriented programming,” or “I don't know anything about Docker, but I want to apply for this job.” Well, now you're highlighting what you don't have and to get that first job, you have to highlight what you do have. So I often tell people on your resume, on your LinkedIn, don't call yourself a junior developer. Don't call yourself an entry level. Don't say you're aspiring to be. You are. You are a developer. If you have studied software development, you can write software, you're a software developer. Make that your own title and let the company figure out what level you are. So just call yourself a developer and start applying for those jobs. The other advice that I tend to give people is you don't have to feel like you meet a 100% of the requirements in any job posts. As a hiring manager, when I read those job posts often, it's like, this is my birthday wish list. I hope I can find this mythical unicorn that has all of these traits [laughter] and skills and characteristics and that person doesn't exist. In fact, if I ever got a resume where they claim to have all that stuff, I would immediately probably throw the resume in the bin because they're probably lying, because either they have all those skills and they're about to hit me up for double the salary, or they're just straight up lying that they really don't have all those skills. As a hiring manager, those are things that we have to discern over time as we're evaluating people and talking with them and so on. But I would say if you meet like 30 to 40% of those skills, you could probably still apply. The challenge then is when you get that phone call, how do you convince them that you're worth taking a shot, that you're worth them taking the risk of hiring you, helping train you up in the skills that you don't have. But on those calls, you still need to present this is what I do bring to the company. I'm bringing energy, I'm bringing passion, and I'm bringing other experience and background and perspectives on things, hopefully from – just increasing the diversity in tech, just as an example. You're coming from a background, or a walk of life that maybe we don't currently have on the team and that's great for us and great for our team because you're going to open our eyes to things that we might not have thought of. So I think apply anyway. If they're asking for a couple of years' experience and you don't have it, apply anyway. If they're asking for programming languages you don't know, apply anyway. The languages you do know, a lot of that skill is going to transfer into a new language anyway. And I think a lot of companies are really missing out on the malleability and how they can shape an entry-level developer into the kind of developer and kind of engineer that they want to have on the team. Now you use that person as an example and say, “Now we've trained them with the process that we want, with the language and the tools that we want. They know the company goals.” We've trained them. We've built them up. We've invested in them and now everybody else we hire, we're going to hold to that standard and say, “If we're going to hire from outside, this is what we want,” and if we hire someone who doesn't have that level of skill, we're going to bring them up to that skill. I think a lot of companies are missing out on that whole aspect of hiring, that is they can take a chance on somebody who's got the people skills and the collaboration skills and that background and the experiences of life and not necessarily the technical skills and just train them on the technical skills. I went on a rant on this on LinkedIn the other day, where I was saying the return on investment. If a company is spending months and months and months trying to hire somebody, that's expensive. You're paying a recruiter, you're paying engineers, you're paying managers to screen all these people, interview all these people, and you're not quite finding that 100% skill match. Well, what if you just hired somebody months ago, spend $5,000 training them on the skills they didn't have, and now you're months ahead of the game. You could have saved yourself so much money so much time. You would have had an engineer on the team now. And I think a lot of companies are kind of missing that point. Sorry, I know I get very soapbox-y on some of the stuff. ARTY: I think it's important just highlighting these dynamics and stuff that are broken in our industry and all of the hoops and challenges that come with trying to get a job. You mentioned a couple of things on the other side of one, is that the interview processes themselves don't align to what it is we actually need skill-wise day-to-day. What are the things that you think are driving the creation of interviews that don't align with the day-to-day stuff? Like what factors are bringing those things so far out of alignment? IAN: That's a great question. I would say I have my suspicions. So don't take this as gospel truth, but from my own perspective, this is what I think. The big, big tech companies out there, like the big FAANG companies, they have a very specific target in mind of the kind of engineers that they want on their team. They have studied very deep data structures and algorithms, the systems thinking and the system design, and all this stuff. Like, they've got that knowledge, they've got that background because those big companies need that level of knowledge for things like scaling to billions of users, highly performant, and resilient systems. Where the typical startup and typical small and mid-sized company, they don't typically need that. But those kinds of companies look at FAANG companies and go, “We want to be like them. Therefore, we must interview like them and we must ask the same questions that they ask.” I think this has this cascading effect where when FAANG companies do interviews in a particular way, we see that again, with this ripple effect idea and we see that ripple down in the industry. Back in the early 2000s, mid 2000s—well, I guess right around the time when Google was getting started—they were asking a lot of really oddball kinds of questions. Like how many golf balls fit in a school bus and those were their interview challenges. It's like, how do you actually go through the calculation of how many golf balls would fit in a school bus and after a while, I think by 2009, they published an article saying, “Yeah, we're going to stop asking those questions. We weren't getting good signals. Everybody's breaking down those problems the same way and it wasn't really helpful.” Well, leading up to that point, everyone else was like, “Oh, those are cool questions. We're going to ask those questions, too,” and then when Google published that paper, everyone else was like, “Yeah, those questions are dumb. We're not going to ask those questions either.” And then they started getting into what we now see as like the LeetCode, HackerRank type of technical challenges being asked within interviews. I think that there's a time and place for some of that, but I think that the types of challenges that they're asking candidates to do should still be aligned with what the company does. One criticism that I've got. For example, I was looking at a technical challenge from one particular company that they asked this one particular problem and it was using a data structure called Heap. It was, find a quantity of location points closest to a target. So you're given a list of latitude, longitude values, and you have to find the five latitude and longitude points that are closest to a target. It's like, okay and so, I'm thinking through the challenge, how would I solve that if I had to solve it? But then I got thinking that company has nothing to do with latitude and longitude. That company has nothing to do with geospatial work of any kind. Why are they even asking that problem? Like, it's so completely misaligned that anybody they interview, that's the first thing that's going to go through their mind as a candidate is like, “Why are they asking me this kind of question?” Like, “This has nothing to do with the job. It had nothing to do with the role. I don't study global positioning and things like that. I know what latitude and longitude are, but I've never done any kind of math to try to figure out what those things would be and how you would detect differences between them.” Like, I could kind of guess with simple math, but unless you've studied that stuff, it's not going to be this, “Oh yeah, sure, no problem. It's this formula, whatever.” We shouldn't have to expect that candidates coming to a business are going to have that a, formula memorized, especially when that's not what your company does. And a lot of companies are like, “Oh, we're got to interview somebody. Quick, go to LeetCode and find a problem to ask them.” All you're going to do is you're going to bias your interview process towards people that have studied those problems on LeetCode and you're not actually going to find people that can actually solve your day-to-day challenges that your company is actually facing. ARTY: And instead, you're selecting for people that are really good at things that you don't even need. [chuckles] It's like, all right! It totally skews who you end up hiring toward people that aren't even necessarily competent in the skills that they actually need day-to-day. Like you mentioned FAANG companies need these particular skills. I don't even think that for resilience, to be able to build these sort of systems, and even on super hardcore systems, it's very seldom that you end up writing algorithmic type code. Usually, most of the things that you deal with in scaling and working with other humans and stuff, it's a function of design and being able to organize things in conceptual ways that make sense so that you can deconstruct a complex, fuzzy problem into little pieces that make sense and can fit together like a jigsaw puzzle. I have a very visual geometric way of thinking, which I find actually is a core ability that makes me good at code because I can imagine it visually laid out and think about the dependencies between things as like tensors between geographically located little code bubbles, if you will. IAN: Sure. ARTY: Being able to think that way, it's fundamentally different than solving algorithm stuff. But that deconstruction capability of just problem breakdown, being able to break down problems, being able to organize things in ways that make sense, being able to communicate those concepts and come up with abstractions that are easy enough for other people on your team to understand, ideally, those are the kinds of engineers we want on the teams. Our interview processes ought to select for those day-to-day skills of things that are the common bread and butter. [chuckles] IAN: I agree. ARTY: What we need to succeed on a day-to-day basis. IAN: Yeah. We need the people skills more than we need the hard technical skills sometimes. I think if our interview process could somehow tap into that and focus more on how do you collaborate, how do you do code reviews, how do you evaluate someone else's code for quality, how do you make the tradeoff between readability and optimization—because those are typically very polarized, opposite ends of the scale—how do you function on a team, or do you prefer to go heads down and just kind of be by yourself and just tackle tasks on your own? I believe that there's a time and place for that, too and there are personality types where you prefer to go heads down and just have peace and quiet and just get your work done and there's nothing wrong with that. But I think if we can somehow tap into the collaborative process as part of the interview, I think it's going to open a lot of companies up to like, “Oh, this person's actually going to be a really great team member. They don't quite have this level of knowledge in database systems that we hope they'd have, but that's fine. We'll just send them on this one-week database training class that happens in a week, or two and now they'll be trained.” [overtalk] MANDY: Do they want to learn? IAN: Right. Do they want to learn? Are they eager to learn? Because if they don't want to learn, then that's a whole other thing, too. But again, that's something that you can screen for. Like, “Tell me what you're learning on the side, or “What kinds of concepts do you want to learn?” Or “In this role, we need you to learn this thing. Is that even of interest to you?” Of course, everyone's going to lie and say, “Yeah,” because they want the paycheck. But I think you can still narrow it down a little bit more what area of training does this person need. So we can just hire good people on the team and now our team is full of good people and collaborative, team-based folks that are willing to work together to solve problems together and then worry about the technical skills as a secondary thing. MANDY: Yeah. I firmly believe anybody can learn anything, if they want to. I mean, that's how I've gotten here. IAN: Yeah, for sure. Same with me. I'm mostly self-taught. I studied computer engineering in college, so I can tell you how all the little microchips in your computer work. I did that for the first 4 years of my career and then I threw all that out the window and I taught myself web development and taught myself how the internet works. And then every job I had, that innate curiosity in me is like, “Oh, I wonder how e-commerce works.” Well, I went and got an e-commerce job, it's like, okay, well now I wonder how education works and I got into the education sector. Now, I wonder how you know this, or that works and so, I got into financial systems and I got into whatever and it just kind of blew my mind. I was like, “Wow, this is how all these things kind of talk to each other,” and that for me was just fascinating, and then turning around and sharing that knowledge with other people. But some people are just very fixed mindset and they want to learn one thing, they want to do that thing, and that's all they know. But I think, like we kind of talked about early in the podcast, you sign up for a career in this industry and you're signing up for lifelong learning. There's no shortage to things that you can go learn, but you have to be willing to do it. MID-ROLL: Rarely does a day pass where a ransomware attack, data breach, or state sponsored espionage hits the news. It's hard to keep up with all this and also to know if you're protected. Don't worry, Kaspersky's got you covered. Each week their team looks at the latest news, stories, and topics you might have missed during the week on the Transatlantic Cable Podcast. Mixing in-depth discussion, expert guests from around the world, a pinch of humor, and all with an easy to consume style - be sure you check them out today. ARTY: What kind of things could we do to potentially influence the way hiring is done and these practices with unicorn skilled searches and just the dysfunctional aspects on the hiring side? Because you're teaching all these tech interview skills for what to expect in the system and how to navigate that and succeed, even though it's broken. But what can we do to influence the broken itself and help improve these things? IAN: That's a great question. Breaking it from the inside out is a good start. I think if we can collectively get enough people together within these, especially the bigger companies and say like, “Hey, collectively, as an industry, we need to do interviewing differently.” And then again, see that ripple effect of oh, well, the FAANG companies are doing it that way so we're going to do it that way, too. But I don't think that's going to be a fast change by any stretch. I think there are always going to be some types of roles where you do have to have a very dedicated, very deep knowledge of system internals and how to optimize things, and pure algorithmic types of thinking. I think those kinds of jobs are always going to be out there and so, there's no fully getting away from something like a LeetCode challenge style interview. But I think that for a lot of small, mid-sized, even some large-sized companies, they don't have to do interviewing that way. But I think we can all stand on our soapbox and yell and scream, “Do it differently, do it differently,” and it's not going to make any impact at all because those companies are watching other companies for how they're doing it. So I think gradually, over time, we can just start to do things differently within our own company. And I think for example, if the company that I was working at, if we completely overhauled our interview process that even if we don't hire somebody, if someone can walk away from that going, “Wow, that was a cool interview experience. I've got to tell my friends about this.” That's the experience that we want when you walk away from the company if we don't end up hiring. If we hire you, it's great. But even if we don't hire you, I want to make sure that you've still got a really cool interview experience that you enjoyed the process, that it didn't just feel like another, “Okay, well, I could have just grind on LeetCode for three months to get through that interview.” I don't ever want my interviews to feel like that. So I think as more of us come to this understanding of it's okay to do it differently and then collectively start talking about how could we do it differently—and there are companies out there that are doing it differently, by the way. I'm not saying everyone in the industry is doing all these LeetCode style interviews. There are definitely companies out there that are doing things differently and I applaud them for doing that. And I think as awful as it was to have the pandemic shut everything down to early 2020, where no hiring happened, or not a lot of hiring happened over the summer, it did give a lot of companies pause and go, “Well, hey, since we're not hiring, since we got nobody in the backlog, let's examine this whole interview process and let's see if this is really what we want as a company.” And some companies did. They took the time, they took several months and they were like, “You know what, let's burn this whole thing down and start over” as far as their interview process goes. Some of them completely reinvented what their interview process was and turned it into a really great process for candidates to go through. So even if they don't get the job, they still walk away going, “Wow, that was neat.” I think if enough of us start doing that to where candidates then can say, “You know what, I would really prefer not to go through five, or six rounds of interviews” because that's tiring and knowing that what you're kind of what you're in for, with all the LeetCode problems and panel after panel after panel. Like, nobody wants to sit through that. I think if enough candidates stand up for themselves and say, “You know what, I'm looking for a company that has an easier process. So I'm not even going to bother applying.” I think there are enough companies out there that are desperately trying to hire that if they start getting the feedback of like you know what, people don't want to interview with us because our process is lousy. They're going to change the process, but it's going to take time. Unfortunately, it's going to drag out because companies can be stubborn and candidates are also going to be stubborn and it's not going to change quickly. But I think as companies take the step to change their process and enough candidates also step up to say, “Nah, you know what, I was going to apply there,” or “Maybe I got through the first couple of rounds, but you're telling me there's like three more rounds to go through? Nah, I'm not going to bother.” Companies are now starting to see candidates ghost them and walk away from the interview process because they just don't want to be bothered. I think that's a good signal for a company to take a step back and go, “Okay, we need to change our process to make it better so the people do want to apply and enjoy that interview process as they come through.” But it's going to take a while to get there. ARTY: Makes me think about we were talking early on about open source and the power of open source. I wonder with this particular challenge, if you set up a open source hiring manifesto, perhaps of we're going to collaborate on figuring out how to make hiring better. Well, what does that mean? What is it we're aiming for? We took some time to actually clarify these are the things we ought to be aiming for with our hiring process and those are hard problems to figure out. How do we create this alignment between what it is we need to be able to do to be successful day-to-day versus what it is we're selecting for with our interview process? Those things are totally out of whack. I think we're at a point, at least in our industry, where it's generally accepted that how we do interviewing and hiring in these broken things—I think it's generally accepted that it's broken—so that perhaps it's actually a good opportunity right now to start an initiative like that, where we can start collaborating and putting our knowledge together on how we ought to go about doing things better. Even just by starting something, building a community around it, getting some companies together that are working on trying to improve their own hiring processes and learning together and willing to share their knowledge about things that are working better, such that everybody in the industry ultimately benefits from us getting better at these kinds of things. As you said, being able to have an interview process that even if you don't get the job, it's not a miserable experience for everyone involved. [chuckles] Like there's no reason for that. IAN: Yeah. MANDY: That's how we – I mean, what you just explained, Arty isn't that how we got code of conducts? Everybody's sitting down and being like, “Okay, this is broken. Conferences are broken. What are we going to all do together?” So now why don't we just do the same thing? I really like that idea of starting an open source initiative on interviewing. Like have these big FAANG companies be like, “I had a really great interview with such and such company.” Well, then it all spirals from there. I think that's super, super exciting. ARTY: Yeah. And what is it that made this experience great? You could just have people analyze their interview experiences that they did have, describe well, what are the things that made this great, that made this work and likewise, you could collect anti-patterns. Some of the things that you talked about of like, are we interviewing for geolocation skills when that actually has absolutely nothing to do with our business? We could collect these things as these funky anti-patterns of things so that people could recognize those things easier in there because it's always hard to see yourself. It's hard to see yourself swinging. IAN: An interesting idea along those lines is what if companies said like, “Hey, we want the community to help us fix our interview process. This is who we are, this is what our business does. What kinds of questions do you think we should be asking?” And I think that the community would definitely rally behind that and go, “Oh, well, you're an e-commerce platform so you should be asking people about shopping cart implementations and data security around credit cards and have the interview process be about what the company actually does.” I think that that would be an interesting thing to ask the community like, “What do you think we should be asking in these interviews?” Not that you're going to turn around and go, “Okay, that's exactly what we're going to do,” but I think it'll give a lot of companies ideas on yeah, okay, maybe we could do a take-home assignment where you build a little shopping cart and you submit that to us. We'll evaluate how you did, or what you changed, or we're going to give you some code to start with and we're going to ask you to fix a bug in it, or something like, I think that there's a bigger movement now, especially here in Canada, in the US of doing take-home assignments. But I think at the same time, there are pros and cons of doing take-home assignments versus the on-site technical challenges. But what if we gave the candidate a choice as part of that interview process, too and say, “Hey, cool. We want to interview you. Let's get through the phone screen and now that you've done the phone screen, we want to give you the option of, do you want to do a small take-home assignment and then do a couple of on-site technical challenges? Do you want to do a larger take-home and maybe fewer on-site technical challenges?” I think there's always going to be some level of “Okay, we need to see you code in front of us to really make sure that you're the one that wrote that code.” I got burned on that back in 2012 where I thought somebody wrote some code and they didn't. They had a friend write it as their take-home assignment and so, I brought them in for the interview and I'm like, “Cool, I want you to fix this bug,” and they had no idea what to do. They hadn't even looked at the code that their friend wrote for them it's like, why would you do that? So I think that there's always going to be some amount of risk and trust that needs to take place between the candidates and the companies. But then on the flip side of that, if it doesn't work out, I really wish companies would be better about giving feedback to people instead of just ghosting them, or like, “Oh, you didn't and pass that round. So we're just not even going to call you back and tell you no. We're just not ever just going to call.” The whole ghosting thing is, by far, the number one complaint in the tech industry right now is like, “I applied and I didn't even get a thanks for your resume. I got nothing,” or maybe you get some automated reply going, “We'll keep you in mind if you're a match for something.” But again, those apple looking at tracking systems are biased because the developers building them and the people reading the resumes are going to have their own inherent bias in the search terms and the things that they're looking for and so on. So there's bias all over the place that's going to be really hard to get rid of. But I think if companies were to take a first step and say like, “Okay, we're going to talk to the community about what they would like to see the interview process be,” and start having more of those conversations. And then I think as we see companies step up and make those changes, those are going to be the kinds of companies where people are going to rally behind them and go, “I really want to work there because that interview process is pretty cool.” And that means the company is – well, it doesn't guarantee the company's going to be cool, but it shows that they care about the people that are going to work there. If people know that the company is going to care about you as an employee, you're far more likely to want to work there. You're far more likely to be loyal and stay there for a long term as opposed to like oh, I just need to collect a paycheck for a year to get a little bit of experience and then job hop and go get a better title, better pay. So I think it can come down to company loyalty and stuff, too. MANDY: Yeah. Word of mouth travels fast in this industry. IAN: Absolutely. MANDY: And to bring up the code of conduct thing and now people are saying, “If straight up this conference doesn't have a code of conduct, I'm not going.” IAN: Yeah. I agree. It'll be interesting to see how something like this tech interview overhaul open source idea could pick up momentum and what kinds of companies would get behind it and go, “Hey, we think our interview process is pretty good already, but we're still going to be a part of this and watch other companies step up to.” When I talked earlier about that ripple effect where Google, for example, stopped asking how many golf balls fit in a school bus kind of thing and everyone else is like, “Yeah, those questions are dumb.” We actually saw this summer, Facebook and Amazon publicly say, “We're no longer going to ask dynamic programming problems in our interviews.” It's going to be interesting to see how long that takes to ripple out into the industry and go, “Yeah, we're not going to ask DP problems either,” because again, people want to be those big companies. They want to be billion- and trillion-dollar companies, too and so, they think they have to do everything the same way and that's not always the case. But there's also something broken in the system, too with hiring. It's not just the interview process itself, but it's also just the lack of training. I've been guilty of this myself, where I've got an interview with somebody and I've got back-to-back meetings. So I just pull someone on my team and be like, “Hey, Arty, can you come interview this person?” And you're like, “I've never interviewed before. I guess, I'll go to LeetCode and find a problem to give them.” You're walking in there just as nervous as the candidate is and you're just throwing some technical challenge at them, or you're giving them the technical challenge that you've done most recently, because you know the answer to it and you're like, “Okay, well, I guess they did all right on it. They passed,” or “I think they didn't do well.” But then companies aren't giving that feedback to people either. There's this thinking in the industry of oh, if we give them feedback, they're going to sue us and they're going to say it's discriminatory and they're going to sue us. Aline Lerner from interviewing.io did some research with her team and literally nobody in recent memory has been sued for giving feedback to candidates. If anything, I think that it would build trust between companies and the candidates to say, “Hey, this is what you did. Well, this is what we thought you did okay on. We weren't happy with the performance of the code that you wrote so we're not moving forward,” and now you know exactly what to go improve. I was talking to somebody who was interviewing at Amazon lately and they said, “Yeah, the recruiter at Amazon said that I would go through all these steps,” and they had like five, or six interviews, or something to go through. And they're like, “Yeah, and they told me at the end of it, we're not going to give you any feedback, but we will give you a yes, or no.” It's like so if I get a no, I don't even find out what I didn't do well. I don't know anything about how to improve to want to go apply there in the future. You're just going to tell me no and not tell me why? Why would I want to reapply there in the future if you're not going to tell me how I'm going to get better? I'm just going to do the same thing again and again. I'm going to be that little toy that just bangs into the wall and doesn't learn to steer away from the wall and go in a different direction. If you're not going to give me any feedback, I'm just going to keep banging my head against this wall of trying to apply for a job and you're not telling me why I'm not getting it. It's not helpful to the candidate and that's not helpful to the industry either. It starts affecting mental health and it starts affecting other things and I think it erodes a lot of trust between companies and candidates as well. ARTY: Yeah. The experience of just going through trying to get a job and going through the rejection, it's an emotional experience, an emotionally challenging experience. Of all things that affect our feels a lot, it's like that feeling of social rejection. So being able to have just healthier relationships and figuring out how to see another person as a human, help figure out how you can help guide and support them continuing on their journey so that the experience of the interview doesn't hurt so much even when the relationship doesn't work out, if we could get better at those kinds of things. There's all these things that if we got better at, it would help everybody. IAN: I agree. ARTY: And I think that's why a open source initiative kind of thing maybe make sense because this is one of those areas that if we got better at this as an industry, it would help everybody. It's worth putting time in to learn and figure out how we can do better and if we all get better at it and stuff, there's just so many benefits and stuff from getting better at doing this. Another thing I was thinking about. You were mentioning the language thing of how easy it is to map skills that we learned from one language over to another language, such that even if you don't know the language that they're coding in at a particular job, you should apply anyway. [chuckles] I wonder if we had some data around how long it takes somebody to ramp up on a new language when they already know similar-ish languages. If we had data points on those sort of things that we're like, “Okay, well, how long did it actually take you?” Because of the absence of that information, people just assume well, the only way we can move forward is if we have the unicorn skills. Maybe if it became common knowledge, that it really only takes say, a couple months to become relatively proficient so that you can be productive on the team in another language that you've never worked in before. Maybe if that was a common knowledge thing, that people wouldn't worry about it so much, that you wouldn't see these unicorn recruiting efforts and stuff. People would be more inclined to look for more multipurpose general software engineering kinds of skills that map to whatever language that you're are doing. That people will feel more comfortable applying to jobs and going, “Oh, cool. I get the opportunity to learn a new language! So I know that I may be struggling a bit for a couple months with this, but I know I'll get it and then I can feel confident knowing that it's okay to learn my way through those things.” I feel if maybe we just started collecting some data points around ramp up time on those kind of things, put a database together to collect people's experiences around certain kind of things, that maybe those kinds of things would help everyone to just make better decisions that weren't so goofy and out of alignment with reality. IAN: Yeah, and there are lots of cheat sheets out there like, I'm trying to remember the name of it. I used to have it bookmarked. But you could literally pull up two programming languages side by side in the same browser window and see oh, if this is how you do it in JavaScript, this is how you do it on Python, or if this is how you write this code in C++, here's how you do it in Java. It gives you a one-to-one correlation for dozens, or hundreds of different kinds of blocks of code. That's really all you need to get started and like you said, it will take time to come proficient to where you don't have to have that thing up on your screen all the time. But at the same time, I think the company could invest and say, “You know what, take a week and just pour everything you've got into learning C Sharp because that's the skill we want you to have for this job.” It's like, okay, if you are telling me you trust me and you're making me the job offer and you're going to pay me this salary and I get to work in tech, but I don't happen to have that skill, but you're willing to me in that skill, why would I not take that job? You're going to help me learn and grow. You're offering me that job with a salary. Those are all great signals to send. Again, I think that a lot of companies are missing out and they're like, “No, we're not going to hire that person. We're just going to hold out until we find the next person that's a little bit better.” I think that that's where some things really drop off in the process, for sure is companies hold out too long and next thing they know, months have gone by and they've wasted tons of money when they could have just hired somebody a long time ago and just trained them. I think the idea of an open source collective on something like this is pretty interesting. At the same time, it would be a little subjective on “how quickly could someone ramp up on a, or onboard on a particular technology.” Because everybody has different learning styles and unless you're finding somebody to curate – like if you're a Ruby programmer and you're trying to learn Python, this is the de facto resource that you need to look at. I think it could be a little bit subjective, but I think that there's still some opportunity there to get community input on what should the interview process be? How long should it really be? How many rounds of interviews should there be from, both the candidates experience as well as the company experience and say, as a business, this is why we have you doing these kinds of things. That's really what I've been to teach as part of the Tech Interview Guide and the daily email series is from my perspective in the business, this is why. This is why I have you do a certain number of rounds, or this is why I give you this kind of technical challenge, or this is why I'm asking you this kind of question. Because I'm trying to find these signals about you that tell me that you're someone that I can trust to bring on my team. It's a tough system when not many people are willing to talk about it because I think a lot of people are worried that others are going to try to game the system and go, “Oh, well, now that I know everything about your interview process, I know how to cheat my way through it and now you're going to give me that job and I really don't know what I'm doing.” But I think that at the same time, companies can also have the higher, slow fire, fast mentality of like, “All right, you're not cutting it.” Like you're out right away and just rehire for that position. Again, if you're willing to trust and willing to extend that offer to begin with. If it doesn't work out, it doesn't work out. It's a business decision; it's not a personal thing. But it's still devastating to the person when they don't get the job, or if they get fired right away because they're not pulling their weight, but if they're cheating their way through it, then they get what they deserve to. MANDY: Awesome. Well, I think that's a great place to put a pin in this discussion. It is definitely not a great place to end it. I think we should head over to our reflection segment. For me, there were so many things I wrote down. I loved that you said that people's tech journey is like a choose your own adventure. You can learn one thing and then find yourself over here and then the next thing you know, you find yourself over here. But you've picked up all these skills along the way and that's the most important thing is that as you go along this journey, you keep acquiring these skills that ultimately will make you the best programmer that you can be. Also, I really like that you also said something about it being a lifelong learning. Tech is lifelong learning and not just the technical skills. It's the people skills. It's the behavioral skills. Those are the important skills. Those skills are what ultimately it comes down to being in this industry is, do you have the desire to learn? Do you have the desire to grow? I think that should be one of the most important things that companies are aware of when they are talking to candidates that it's not about can this person do a Fibonacci sequence. It's can they learn, are they a capable person? Are they going to show up? Are they going to be a good person to have in the office? Are they going to be a light? Are they going to be supportive? Are they going to be caring? That's the ultimate. That right there for me is the ultimate and thank you for all that insight. ARTY: Well, I really, really loved your story, Ian at the very beginning of just curiosity and how you started your journey, getting into programming and then ended up finding ways to give back and getting really excited about seeing people's light bulbs go off and how much joy you got from those experiences, connecting with another individual and making that happen. I know we've gotten on this long tangent of pretty abstract, big topics of just like, here's the brokenness in the industry and what are some strategies that we can solve these large-scale problems. But I think you said some really important things back of just the importance of these one-on-one connections and the real change happens in the context of a relationship. Although, we're thinking about these big things. To actually make those changes, to actually make that difference, it happens in our local context. It happens in our companies. It happens with the people that we interact with on a one-on-one basis and have a genuine relationship with. If we want to create change, it happens with those little ripples. It happens with affecting that one relationship and that person going and having their own ripple effects. We all have the power to influence these things through the relationships with the individuals around us. IAN: I think my big takeaway here is we have been chatting for an hour and just how easy it is to have conversation about hey, what if we did this? How quickly it can just turn into hey, as a community, what if? And just the willingness of people being in the community, wanting to make the community better,

Artists w/ EM
Zachary Steel

Artists w/ EM

Play Episode Listen Later Nov 16, 2021 89:45


Today our guest is Zachary Steel. A New York Native, L.A. grown, NYU Tisch School of the Arts Alumnus, clown, actor, writer, USC instructor, and medical clown. We discuss mental health, learning style biases in western education, the need for intersectionality and positive representation for appressed minorities. Check out his Instagram: @zachygoggles He is teaching a class through the Idiot Workshop https://www.theidiotworkshop.com/workshop or the USC Medical Clown program https://itsc.usc.edu/mc-program/about-medical-clowning-2/ Check out my website and Instagram accounts: https://www.emicoproductions.com/ @empersico @artistswithem @emicoproductions

The Bike Shed
315: Emotions Are A Pendulum

The Bike Shed

Play Episode Listen Later Nov 9, 2021 41:23


Steph talks about starting a new project and identifying "focused" tests while Chris shares his latest strategy for managing flaky tests. They also ponder the squishy "it depends" side of software and respond to a listener question about testing all commits in a pull request. This episode is brought to you by ScoutAPM (https://scoutapm.com/bikeshed). Give Scout a try for free today and Scout will donate $5 to the open source project of your choice when you deploy. rspec-retry (https://github.com/NoRedInk/rspec-retry) Cassidy Williams - It Depends - GitHub Universe 2021 (https://www.youtube.com/watch?v=aMWh2uLO9OM) Say No To More Process (https://thoughtbot.com/blog/say-no-to-more-process-say-yes-to-trust) StandardRB (https://github.com/testdouble/standard) Become a Sponsor (https://thoughtbot.com/sponsorship) of The Bike Shed! Transcript: CHRIS: My new computer is due on the fourth. I'm so close. STEPH: On the fourth? CHRIS: On the fourth. STEPH: That's so exciting. CHRIS: And I'm very excited. But no, I don't want to upgrade any software on this computer anymore. Never again shall I update a piece of software on this computer. STEPH: [laughs] CHRIS: This is its final state. And then I will take its soul and move it into the new computer, and we'll go from there. [chuckles] STEPH: Take its soul. [laughs] CHRIS: Hello and welcome to another episode of The Bike Shed, a weekly podcast from your friends at thoughtbot about developing great software. I'm Chris Toomey. STEPH: And I'm Steph Viccari. CHRIS: And together, we're here to share a bit of what we learn along the way. So, Steph, what's new in your world? STEPH: Hey, Chris. Let's see. It's been kind of a busy week. It's been a busy family week. Utah, my dog, hasn't been feeling well as you know because you and I have chatted off-mic about that a bit. So he is still recovering from something, I don't know what. He's still on most days his normal captain chaos self, but then other days, he's not feeling well. So I'm just keeping a close eye on him. And then I also got some other family illnesses going on. So it has been a busy family week for sure. On the more technical project side, I am wrapping up my current project. So I have one more week, and then I will shift into a new project, which I'm very excited about. And you and I have chatted about this several times. So there's always just that interesting phase where you're trying to wrap up and hand things off and then accomplish last-minute wishlist items for a project before then you start with a new one. So I am currently in that phase. CHRIS: How long were you on this project for? STEPH: It'll be a total of I think eight months. CHRIS: Eight months, that's healthy. That's a bunch. It's always interesting to be on a project for that long but then not longer. There were plenty of three and four-month projects that I did. And you can definitely get a large body of work done. You can look back at it and proudly stare at the code that you have written. But that length of time is always interesting to me because you end up really...for me, when I've had projects that went that long but then not longer, I always found that to be an interesting breaking point. How are you feeling moving on from it? Are you ready for something new? Are you sad to be moving on? Do you feel attached to things? STEPH: It's always a mix. I'm definitely attached to the team, and then there are always lots of things that I'd still love to work on with that team. But then, I am also excited to start something new. That's why I love this role of consulting because then I get to hop around and see new projects and challenges and work with new people. I'm thinking seven to eight months might be a sweet spot for me in terms of the length of a project. Because I find that first month with a project, I'm really still ramping up, I'm getting comfortable, I'm getting in the groove, and I'm contributing within a short amount of time. But I still feel like that first month; I'm getting really comfortable with this new environment that I'm in. And so then I have that first month. And then, at six months, I have more of heads-down time. And I get to really focus and work with a team. And then there's that transition period, and it's nice to know when that's coming up for several weeks, so then I have a couple of weeks to then start working on that transition phase. So eight months might be perfect because then it's like a month for onboarding, ramping up, getting comfortable. And then six months of focus, and then another month of just focusing on what needs to be transitioned so then I can transition off the team. CHRIS: All right. Well, now we've defined it - eight months is the perfect length of a project. STEPH: That's one of the things I like about the Boost team is because we typically have longer engagements. So that was one of the reasons when we were splitting up the teams in thoughtbot that I chose the Boost team because I was like, yeah, I like the six-month-plus project. Speaking of that wishlist, there are little things that I've wanted to make improvements on but haven't really had time to do. There's one that's currently on my mind that I figured I'd share with you in case you have thoughts on it. But I am a big proponent of using the RSpec focus filter for when running tests. So that way, I can just prefix a context it block or describe block with F, and then RSpec I can just run all the tests. But RSpec will only run the tests that I've prefixed with that F focus command., and I love it. But we are running into some challenges with it because right now, there's nothing that catches that in a pull request. So if you commit that focus filter on some of your tests, and then that gets pushed up, if someone doesn't notice it while reviewing your pull request, then that gets merged into main. And all of the tests are still green, but it's only a subset of the tests that are actually running. And so it's been on my mind that I'd love something that's going to notice that, that's going to catch it, something that is not just us humans doing our best but something that's automated that's going to notice it for us. And I have some thoughts. But I'm curious, have you run into something like this? Do you have a way that you avoid things like that from sneaking into the main branch? CHRIS: Interestingly, I have not run into this particular problem with RSpec, and that's because of the way that I run RSpec tests. I almost never use the focus functionality where you actually change the code file to say, instead of it, it is now fit to focus that it. I tend to lean into the functionality where RSpec you can pass it the line number just say, file: and then line number. And RSpec will automatically figure out which either spec or context block or entire file. And also, I have Vim stuff that allows me to do that very easily from the file. It's very rare that I would want to run more than one file. So basically, with that, I have all of the flexibility I need. And it doesn't require any changes to the file. So that's almost always how I'm working in that mode. I really love that. And it makes me so sad when I go to JavaScript test runners because they don't have that. That said, I've definitely felt a very similar thing with ESLint and ESLint yelling at me for having a console.log. And I'm like, ESLint, I'm working here. I got to debug some stuff, so if you could just calm down for a minute. And what I would like is a differentiation between these are checks that should only run in CI but definitely need to run in CI. And so I think an equivalent would be there's probably a RuboCop rule that says disallow fit or disallow any of the focus versions for RSpec. But I only want those to run in CI. And this has been a pain point that I felt a bunch of times. And it's never been painful enough that I put in the effort to fix it. But I really dislike particularly that version of I'm in my editor, and I almost always want there to be no warnings within the editor. I love that TypeScript or ESLint, or other things can run within the editor and tell me what's going on. But I want them to be contextually aware. And that's the dream I've yet to get there. STEPH: I like the idea of ESLint having a work mode where you're like, back off, I am in work mode right now. [chuckles] I understand that I won't commit this. CHRIS: I'm working here. [laughter] STEPH: And I like the idea of a RuboCop. So that's where my mind went initially is like, well, maybe there's a custom cop, or maybe there's an existing one, and I just haven't noticed it yet. But so I'm adding a rule that says, hey, if you do see an fcontext, fdescribe, ffit, something like that, please fail. Please let us know, so we don't merge this in. So that's on my wishlist, not my to-don't list. That one is on my to-do list. CHRIS: I'm also intrigued, though, because the particular failure mode that you're describing is you take what is an entire spec suite, and instead, you focus down to one context block within a given file. So previously, there were 700 specs that ran, and now there are 12. And that's actually something that I would love for Circle or whatever platform you're running your tests on to be like, hey, just as a note, you had been slowly creeping up and had hit a high watermark of roughly 700 specs. And then today, we're down to 12. So either you did some aggressive grooming, or something's wrong. But a heuristic analysis of like, I know sometimes people delete specs, and that's a thing that's okay but probably not this many. So maybe something went wrong there. STEPH: I feel like we're turning CI into this friend at the bar that's like, "Hey, you've had a couple of drinks. I just wanted to check in with you to make sure that you're good." [laughs] CHRIS: Yes. STEPH: "You've had 100 tests that were running and now only 50. Hey, friend, how are you? What's going on?" CHRIS: "This doesn't sound like you. You're normally a little more level-headed." [laughs] And that's the CI that is my friend that keeps me honest. It's like, "Wait, you promised never to overspend anymore, and yet you're overspending." I'm like, "Thank you, CI. You're right; I did say I want the test to pass." STEPH: [laughs] I love it. I'll keep you posted if I figure something out; if I either turn CI into that friend, that lets me know when my behavior has changed in a concerning way, and an intervention is needed. Or, more likely, I will see if there's a RuboCop or some other process that I can apply that will check for this, which I imagine will be fast. I mean, we're very mindful about ensuring our test suite doesn't slow down as we're running it. But I'm just thinking about this out loud. If we add that additional cop, I imagine that will be fast. So I don't think that's too much of an overhead to add to our CI process. CHRIS: If you've already got RuboCop in there, I'm guessing the incremental cost of one additional cop is very small. But yeah, it is interesting. That general thing of I want CI to go fast; I definitely feel that feel. And we're slowly creeping up on the project I'm working on. I think we're at about somewhere between five to six minutes, but we've gotten there pretty quickly where not that long ago; it was only three minutes. We're adding a lot of features specs, and so they are definitely accruing slowdowns in our CI. And they're worth it; I think, because they're so valuable. And they test the whole integration of everything, but it's a thing that I'm very closely watching. And I have a long list of things that I might pursue when I decide it's time for CI to get a haircut, as it were. STEPH: I have a very hot tip for a way to speed up your test, and that is to check if any of your tests have a very long sleep in them. That came up recently [chuckles] this week where someone was working in a test and found some relic that had been added a while back that then wasn't caught. And I think it was a sleep 30. And they were like, "Hey, I just sped up our test by 30 seconds." I was like, ooh, we should grep now to see if there's anything else like that. [laughs] CHRIS: Oh, I love the sentence we should grep now. [laughter] The correct response to this is to grep immediately. I thought you were going to go with the pro tip of you can just focus down to one context block. And then the specs will run so much faster because you're ignoring most of them, but we don't want to do that. The sleep, though, that's a pro tip. And that does feel like a thing that there could be a cop for, like, never sleep more than...frankly, let's try not to sleep at all but also, add a sleep in our specs. We can sleep in life; it's important, but anyway. [chuckles] STEPH: [laughs] That was the second hot tip, and you got it. CHRIS: Lots of hot tips. Well, I'm going to put this in the category of good idea, terrible idea. I won't call it a hot tip. It's a thing we're trying. So much as we have tried to build a spec suite that is consistent and deterministic and tells us only the truth, feature specs, even in our best efforts, still end up flaking from time to time. We'll have feature specs that fail, and then eventually, on a subsequent rerun, they will pass. And I am of the mindset that A, we should try and look into those and see if there is a real cause to it. But sometimes, just the machinery of feature specs, there's so much going on there. We've got the additional overhead of we're running it within a JavaScript context. There's just so much there that...let me say what I did, and then we can talk more about the context. So there's a gem called RSpec::Retry. It comes from the wonderful folks over at NoRedInk, a well-known Elm shop for anyone out there in the Elm world. But RSpec::Retry does basically what it says in the name. If the spec fails, you can annotate specs. In our case, we've only enabled this for the feature specs. And you can tell it to retry, and you can say, "Retry up to this many times," and et cetera, et cetera. So I have enabled this for our feature specs. And I've only enabled it on CI. That's an important distinction. This does not run locally. So if you run a feature spec and it fails locally, that's a good chance for us to intervene and look at whether or not there's some flakiness there. But on CI, I particularly don't want the case where we have a pull request, everything's great, and we merge that pull request, and then the subsequent rebuild, which again, as a note, I would rather that Circle not rebuild it because we've already built that one. But that is another topic that I have talked about in the past, and we'll probably talk about it again in the future. But setting that aside, Circle will rebuild on the main branch when we merge in, and sometimes we'll see failures there. And that's where it's most painful. Like, this is now the deploy queue. This is trying to get this out into whatever environment we're deploying to. And it is very sad when that fails. And I have to go in and manually say, hey, rebuild. I know that this works because it just worked in the pull request, and it's the same commit hash. So I know deterministically for reasons that this should work. And then it does work on a rebuild. So we introduced RSpec::Retry. We have wrapped it around our feature specs. And so now I believe we have three possible retries. So if it fails once, it'll try it again, and then it'll try it a third time. So far, we've seen each time that it has had to step in; it will pass on the subsequent run. But I don't know; there was some very gentle pushback or concerns; let's call them when I introduced this pull request from another developer on the team, saying, "I don't know, though, I feel like this is something that we should solve at the root layer. The failures are a symptom of flaky tests, or inconsistency or et cetera, and so I'd rather not do this." And I said, "Yeah, I know. But I'm going to merge it," and then I merged it. We had a better conversation about that. I didn't just broadly overrule. But I said, "I get it, but I don't see the obvious place to shore this up. I don't see where we're doing weird inconsistent things in our code. This is just, I think, inherent complexity of feature specs." So I did it, but yeah, good idea, terrible idea. What do you think, Steph? Maybe terrible is too strong of a word. Good idea, mediocre idea. STEPH: I like the original branding. I like the good idea, terrible idea. Although you're right, that terrible is a very strong branding. So I am biased right now, so I'm going to lead in answering your question by stating that because our current project has that problem as well where we have these flaky tests. And it's one of those that, yes, we need to look at them. And we have fixed a large number of them, but there are still more of them. And it becomes a question of are we actually doing something wrong here that then we need to fix? Or, like you said, is it just the nature of these features-specs? Some of them are going to occasionally fail. What reasonable improvements can we make to address this at the root cause? I'm interested enough that I haven't heard of RSpec::Retry that I want to check it out because when you add that, you annotate a test. When a test fails, does it run the entire build, or will it rerun just that test? Do you happen to know? CHRIS: Just the test. So it's configured as in a round block on the feature specs. And so you tell it like, for any feature spec, it's like config.include for feature specs RSpec::Retry or whatever. So it's just going to rerun the one feature spec that failed when and if that happens. So it's very, very precise as well in that sense where when we have a failure merging into the main branch, I have to rebuild the whole thing. So that's five or six minutes plus whatever latency for me to notice it, et cetera, whereas this is two more seconds in our CI runtime. So that's great. But again, the question is, am I hiding? Am I dealing with the symptoms and not the root cause, et cetera? STEPH: Is there a report that's provided at the end that does show these are the tests that failed and we had to rerun them? CHRIS: I believe no-ish. You can configure it to output, but it's just going to be outputting to standard out, I believe. So along with the sea of green dots, you'll see had to retry this one. So it is visible, but it's not aggregated. And the particular thing is there's the JUnit reporter that we're using. So the XML common format for this is how long our tests took to run, and these ones passed and failed. So Circle, as a particular example, has platform-level insights for that kind of stuff. And they can tell you these are your tests that fail most commonly. These are the tests that take the longest run, et cetera. I would love to get it integrated into that such that retried and then surface this to Circle. Circle could then surface it to us. But right now, I don't believe that's happening. So it is truly I will not see it unless I actively go search for it. To be truly honest, I'm probably not doing that. STEPH: Yeah, that's a good, fair, honest answer. You mentioned earlier that if you want a test to retry, you have to annotate the test. Does that mean that you get to highlight specific tests that you're marking those to say, "Hey, I know that these are flaky. I'm okay with that. Please retry them." Or does it apply to all of them? CHRIS: I think there are different ways that you can configure it. You could go the granular route of we know this is a flaky spec, so we're going to only put the retry logic around it. And that would be a normal RSpec annotation sort of tagging the spec, I think, is the terminology there. But we've configured it globally for all feature specs. So in a spec support file, we just say config.include Rspec::Retry where type is a feature. And so every feature spec now has the possibility to retry. If they pass on the first pass, which is the hope most of the time, then they will not be tried. But if they don't, if they fail, then they'll be retried up to three times or up to two additional times, I think is the total. STEPH: Okay, cool. That's helpful. So then I think I have my answer. I really think it's a good idea to automate retrying tests that we have identified that are flaky. We've tried to address the root, and our resolution was this is fine. This happens sometimes. We don't have a great way to improve this, and we want to keep the test. So we're going to highlight that this test we want to retry. And then I'm going to say it's not a great idea to turn it on for all of them just because then I have that same fear about you're now hiding any flaky tests that get introduced into the system. And nobody reasonably is going to go and read through to see which tests are going to get retried, so that part makes me nervous. CHRIS: I like it. I think it's a balanced and reasonable set of good and terrible idea. Ooh, it's perfect. I don't think we've had a balanced answer on that yet. STEPH: I don't think so. CHRIS: This is a new outcome for this segment. I agree. Ideally, in my mind, it would be getting into that XML format, the output from the tests, so that we now have this artifact, we can see which ones are flaky and eventually apply effort there. What you're saying feels totally right of we should be more particular and granular. But at the same time, the failure mode and the thing that I'm trying, I want to keep deploys going. And I only want to stop deploys if something's really broken. And if a spec retries, then I'm fine with it is where I've landed, particularly because we haven't had any real solutions where there was anything weird in our code. Like, there's just flakiness sometimes. As I say it, I feel like I'm just giving up. [laughs] And I can hear this tone of stuff's just hard sometimes, and so I've taken the easy way out. And I guess that's where I'm at right now. But I think what you're saying is a good, balanced answer here. I like it. I don't know if I'm going to do anything about it, but...[laughter] STEPH: Well, going back to when I was saying that I'm biased, our team is feeling this pain because we have flaky tests. And we're creating tickets, and we're trying to do all the right things. We create a ticket. We have that. So it's public. So people know it's been acknowledged. If someone's working on it, we let the team know; hey, I'm working on this. So we're not duplicating efforts. And so, we are trying to address all of them. But then some of them don't feel like a great investment of our time trying to improve. So that's what I really do like about the RSpec::Retry is then you can still have a resolution. Because it's either right now your resolution is to fix it or to change the code, so then maybe you can test it in a different way. There's not really a good medium step there. And so the retry feels like an additional good outcome to add to your tool bag to say, hey, I've triaged this, and this feels reasonable that we want to retry this. But then there's also that concern of we don't want to hide all of these flaky tests from ourselves in case we have done it and there is an opportunity for us to improve it. So I think that's what I do really like about it because right now, for us, when a test fails, we have to rerun the entire build, and that's painful. So if tests are taking about 20 minutes right now, then one spec fails, and then you have to wait another 20 minutes. CHRIS: I would have turned this on years ago with a 20-minute build time. [chuckles] STEPH: [laughs] Yeah, you're not wrong. But also, I didn't actually know about RSpec::Retry until today. So that may be something that we introduce into our application or something that I bring up to the team to see if it's something that we want to add. But it is interesting that initial sort of ooh kind of feeling that the team will give you introducing because it feels bad. It feels wrong to be like, hey, we're just going to let these flaky tests live on, and we're going to automate retrying them to at least speed us up. And it's just a very interesting conversation around where we want to invest our time and between the risk and pay off. And I had a similar experience this week where I had that conversation, but this one was more with myself where I was working through a particular issue where we have a state in the application where something weird was done in the past that led us to a weird state. And so someone raised a very good question where it's like, well, if what you're saying is technically an impossible state, we should make it impossible, like at the database layer. And I love that phrase. And yet, there was a part of me that was like, yes, but also doing that is not a trivial investment. And we're here because of a very weird thing that happened before. It felt one of those interesting, like, do we want to pursue the more aggressive, like, let's make this impossible for the future? Or do we want to address it for now and see if it comes back up, and then we can invest more time in it? And I had a hard time walking myself through that because my initial response was, well, yeah, totally, we should make it impossible. But then I walked through all the steps that it would take to make that happen, and it was not very trivial. And so it was one of those; it felt like the change that we ended up with was still an improvement. It was going to prevent users from seeing an error. It was still going to communicate that this state is an odd state for the application to be in. But it didn't go as far as to then add in all of the safety measures. And I felt good about it. But I had to convince myself to feel good about it. CHRIS: What you're describing there, the whole thought sequence, really feels like the encapsulation of it depends. And that being part of the journey of learning how to do software development and what it means. And you actually shared a wonderful video with me yesterday, and it was Cassidy Williams at GitHub Universe. And it was her talking to her younger self, and just it depends, and it was so true. So we will include a link to that in the show note because that was a wonderful thing for you to share. And it really does encapsulate this thing. And from the outside, before I started doing software development, I'm like, it's cool. I'm going to learn how to sling code and fix the stuff and hack, and it'll be great, and obvious, and correct, and knowable. And now I'm like, oh man, squishy nonsense. That's all it is. STEPH: [laughs] CHRIS: Fun squishy, and I like it. It's so good. But it depends. Exactly that one where you're like, I know that there's a way to get to correctness here but is it worth the effort? And looping back to...I'm surprised at the stance that I've taken where I'm just like, yeah, I'm putting in RSpec::Retry. This feels like the right thing. I feel good about this decision. And so I've tried to poke at it a tiny bit. And I think what matters to me deeply in a list of priorities is number one correctness. I care deeply that our system behaves correctly as intended and that we are able to verify that. I want to know if the system is not behaving correctly. And that's what we've talked about, like, if the test suite is green, I want to be able to deploy. I want to feel confident in that. Flaky specs exist in this interesting space where if there is a real underlying issue, if we've architected our system in a way that causes this flakiness and that a user may ever experience that, then that is a broken system. That is an incorrect system, and I want to resolve that. But that's not the case with what we're experiencing. We're happy with the architecture of our system. And when we're resolving it, we're not even really resolving them. We're just rerunning manually at this point. We're just like, oh, that spec flaked. And there's nothing to do here because sometimes that just happens. So we're re-running manually. And so my belief is if I see all green, if the specs all pass, I know that I can deploy to production. And so if occasionally a spec is going to flake and retrying it will make it pass (and I know that pass doesn't mean oh, this time it happened to pass; it's that is the correct outcome) and we have a false negative before, then I'm happy to instrument the system in a way that hides that from me because, at this point, it does feel like noise. I'm not doing anything else with the failures when we were looking at them more pointedly. I'm not resolving those flaky specs. There are no changes that we've made to the underlying system. And they don't represent a failure mode or an incorrectness that an end-user might see. So I honestly want to paper over and hide it from myself. And that's why I've chosen this. But you can see I need to defend my actions here because I feel weird. I feel a little off about this. But as I talk through it, that is the hierarchy. I care about correctness. And then, the next thing I care about is maintaining the deployment pipeline. I want that to be as quick and as efficient as possible. And I've talked a bunch about explorations into the world of observability and trying to figure out how to do continuous deployment because I think that really encourages overall better engineering outcomes. And so first is correctness. Second is velocity. And flaky specs impact velocity heavily, but they don't actually impact correctness in the particular mode that we're experiencing them here. They definitely can. But in this case, as I look at the code, I'm like, nah, that was just noise in the system. That was just too much complexity stacked up in trying to run a feature spec that simulates a browser and a user clicking in JavaScript and all this stuff and the things. But again, [laughs] here I am. I am very defensive about this apparently. STEPH: Well, I can certainly relate because I was defending my answer to myself earlier. And it is really interesting what you're pointing out. I like how you appreciate correctness and then velocity, that those are the two things that you're going after. And flaky tests often don't highlight an incorrect system. It is highlighting that maybe our code or our tests are not as performant as we would like them to be, but the behavior is correct. So I think that's a really important thing to recognize. The part where I get squishy is where we have encountered on this project some flaky tests that did highlight that we had incorrect behavior, and there's only been maybe one or two. It was rare that it happened, but it at least has happened once or twice where it highlighted something to us that when tests were run...I think there's a whole lot of context. I won't get into it. But essentially, when tests were being run in a particular way that made them look like a flaky test, it was actually telling us something truthful about the system, that something was behaving in a way that we didn't want it to behave. So that's why I still like that triage that you have to go through. But I also agree that if you're trying to get out at a deploy, you don't want to have to deal with flaky tests. There's a time to eat your vegetables, and I don't know if it's when you've got a deploy that needs to go out. That might not be the right time to be like, oh, we've got a flaky test. We should really address this. It's like, yes; you should note to yourself, hey, have a couple of vegetables tomorrow, make a ticket, and address that flaky test but not right now. That's not the time. So I think you've struck a good balance. But I also do like the idea of annotating specific tests instead of just retrying all of them, so you don't hide anything from yourself. CHRIS: Yeah. And now that I'm saying it and now that I'm circling back around, what I'm saying is true of everything we've done so far. But it is possible that now this new mode that the system behaves in where it will essentially hide flaky specs on CI means that any new flaky regressions, as it were, will be hidden from us. And thus far, almost all or I think all of the flakiness that we've seen has basically been related to timeouts. So a different way to solve this would potentially be to up the Capybara wait time. So there are occasionally times where the system's churning through, and the various layers of the feature specs just take a little bit longer. And so they miss...I forget what it is, but it's like two seconds right now or something like that. And I can just bump that up and say it's 10 seconds. And that's a mode that if eventually, the system ends in the state that we want, I'm happy to wait a little longer to see that, and that's fine. But there are...to name some of the ways that flaky tests can actually highlight truly incorrect things; race conditions are a pretty common one where this behaves fine most of the time. But if the background job happens to succeed before the subsequent request happens, then you'll go to the page. That's a thing that a real user may experience, and in fact, it might even be more likely in production because production has differential performance characteristics on your background jobs versus your actual application. And so that's the sort of thing that would definitely be worth keeping in mind. Additionally, if there are order issues within your spec suite if the randomize...I think actually RSpec::Retry wouldn't fix this, though, because it's going to retry within the same order. So that's a case that I think would be still highlighted. It would fail three times and then move on. But those we should definitely deal with. That's a test-related thing. But the first one, race conditions, that's totally a thing. They come up all the time. And I think I've potentially hidden that from myself now. And so, I might need to lock back what I said earlier because I feel like it's been true thus far that that has not been the failure mode, but it could be moving forward. And so I really want to find out if we got flaky specs. I don't know; I feel like I've said enough about this. So I'm going to stop saying anything new. [laughs] Do you have any other thoughts on this topic? STEPH: Our emotions are a pendulum. We swing hard one way, and then we have to wait till we come back and settle in the middle. But there's that initial passion play where you're really frustrated by something, and then you swing, and you settle back towards something that's a little more neutral. CHRIS: I don't trust anyone who pretends like their opinions never change. It doesn't feel like a good way to be. STEPH: Oh, I hope that...Do people say that? I hope that's not true. I hope we are all changing our opinions as we get more information. CHRIS: Me too. Mid-roll Ad And now a quick break to hear from today's sponsor, Scout APM. Scout APM is leading-edge application performance monitoring that's designed to help Rails developers quickly find and fix performance issues without having to deal with the headache or overhead of enterprise platform feature bloat. With a developer-centric UI and tracing logic that ties bottlenecks to source code, you can quickly pinpoint and resolve those performance abnormalities like N+1 queries, slow database queries, memory bloat, and much more. Scout's real-time alerting and weekly digest emails let you rest easy knowing Scout's on watch and resolving performance issues before your customers ever see them. Scout has also launched its new error monitoring feature add-on for Python applications. Now you can connect your error reporting and application monitoring data on one platform. See for yourself why developers call Scout their best friend and try our error monitoring and APM free for 14 days; no credit card needed. And as an added-on bonus for Bike Shed listeners, Scout will donate $5 to the open-source project of your choice when you deploy. Learn more at scoutapm.com/bikeshed. That's scoutapm.com/bikeshed. CHRIS: Well, shifting only ever so slightly because it turns out it's a very related question, but we have a listener question. As always, thank you so much to everyone who sends in listener questions. We really appreciate them. And today's question comes from Mikhail, and he writes in, "Regarding the discussion in Episode 311 on requiring commits merged to be tested, I have a question on how you view multi commit PRs. Do you think all the commits in a PR should be tested or only the last one? If you test all commits in a PR, do you have any good tips on setups for that? Would you want all commits to pass all tests? For one, it helps a lot when using Git bisect. It is also a question of keeping the history clean and understandable. As a background on the project I currently work on, we have the opinion that all commits should be tested and working. We have now decided on single commit PRs only since this is the only way that we can currently get the setup reasonably on our CI. I would like to sometimes make PRs with more than one commit since I want to make commits as small as possible. In order to do that, we would have to find a way to make sure all commits in the PR are tested. There seems to be some hacky ways to accomplish this, but there is not much talk about it. Also, we are strict in requiring a linear history in all our projects. Kind regards, Mikhail." So, Steph, what do you think? STEPH: I remember reading this question when it came in. And I have an experience this week that is relevant to this mainly because I had seen this question, and I was thinking about it. And off the cuff, I haven't really thought about this. I haven't been very concerned about ensuring every single commit passes because I want to ensure that, ultimately, the final commit that I have is going in. But I also rarely have more than one commit in a PR. So that's often my default mode. There are a couple of times that I'll have two, maybe three commits, but I think that's pretty rare for me. I'll typically have just one commit. So I haven't thought about this heavily. And it's not something that frankly I've been concerned about or that I've run into issues with. From their perspective about using Git bisect, I could see how that could be troublesome, like if you're looking at a commit and you realize there's a particular commit that's already merged and that fails. The other area that I could think of where this could be problematic is if you're trying to roll back to a specific commit. And if you accidentally roll back to a commit that is technically broken, but you didn't know that because it was not the final commit as was getting tested on CI, that could happen. I haven't seen that happen. I haven't experienced it. So while that does seem like a legitimate concern, it's also one that I frankly just haven't had. But because I read this question from this person earlier this week, I actually thought about it when I was crafting a PR that had several commits in it, which is kind of unusual for me since I'm usually one or two commits in a PR. But for this one, I had several because we use standard RB in our project to handle all the formatting. And right now, we have one of those standard to-do files because we added it to the project. But there are still a number of manual fixes that need to be applied. So we just have this list of files that still need to be formatted. And as someone touches that file, we will format it, and then we'll take it out of that to-do list. So then standard RB will include it as it's linting all of our files. And I decided to do that for all of our spec files. Because I was like, well, this was the safest chunk of files to format that will require the least amount of review from folks. So I just want to address all of them in one go. But I separated the more interesting changes into different commits just to make others aware of, like, hey, this is something standard RB wants. And it was interesting enough that I thought I would point it out. So my first commit removed all the files from that to-do list, but then my other commits are the ones that made actual changes to some of those files that needed to be corrected. So technically, one or two of my middle commits didn't pass the standard RB linting. But because CI was only running that final commit, it didn't notice that. And I thought about this question, and so I intentionally went back and made sure each of those commits were correct at that point in time. And I feel good about that. But I still don't feel the need to add more process around ensuring each commit is going to be green. I think I would lean more in favor of let's keep our PR small to one or two commits. But I don't know; it's something I haven't really run into. It's an interesting question. How about you? What are your experiences, or what are your thoughts on this, Chris? CHRIS: When this question came through, I thought it was such an interesting example of considering the cost of process changes. And to once again reference one of our favorite blog posts by German Velasco, the Say No to More Process post, which we will, of course, link in the show notes. This is such a great example of there was likely a small amount of pain that was felt at one point where someone tried to run git bisect. They ran into a troublesome commit, and they were like, oh no, this happened. We need to add processes, add automation, add control to make sure this never happens again. Personally, I run git bisect very rarely. When I do, it's always a heroic moment just to get it started and to even know which is the good and which is the bad. It's always a thing anyway. So it would be sad if I ran into one of these commits. But I think this is a pretty rare outcome. I think in the particular case that you're talking about, there's probably a way to actually tease that apart. I think it sounds like you fixed those commits knowing this, maybe because you just put it in your head. But the idea that the process that this team is working on has been changed such that they only now allow single commit PRs feels like too much process in my mind. I think I'm probably 80%, maybe 90% of the time; it's only a single commit in a PR for me. But occasionally, I really value having the ability to break it out into discrete steps, like these are all logically grouped in one changeset that I want to send through. But they're discrete steps that I want to break apart so that the team can more easily review it so that we have granular separation, and I can highlight this as a reference. That's often something that I'll do is I want this commit to standalone because I want it to be referenced later on. I don't want to just fold it into the broader context in which it happened, but it's pretty rare. And so to say that we can't do that feels like we're adding process where it may not be worth it, where the cost of that process change is too high relative to the value that we're getting, which is speculatively being able to run git bisect and not hit something problematic in the future. There's also the more purist, dogmatic view of well, all commits should be passing, of course. Yeah, I totally agree with that. But what's it worth to you? How much are you willing to spend to achieve that goal? I care deeply about the correctness of my system but only the current correctness. I don't care about historical correctness as much, some. I think I'm diminishing this more than I mean to. But really back to that core question of yes, this thing has value, but is it worth the cost that we have to pay in terms of process, in terms of automation and maintenance of that automation over time, et cetera or whatever the outcome is? Is it worth that cost? And in this case, for me, this would not be worth the cost. And I would not want to adopt a workflow that says we can only ever have single commit PRs, or all commits must be run on CI or any of those variants. STEPH: This is an interesting situation where I very much agree with everything you're saying. But I actually feel like what Mikhail wants in this world; I want it too. I think it's correct in the way that I do want all the commits to pass, and I do want to know that. And I think since I do fall into the default, like you mentioned, 80%, 90% of my PRs are one commit. I just already have that. And the fact that they're enforcing that with their team is interesting. And I'm trying to think through why that feels cumbersome to enforce that. And I'm with you where I'll maybe have a refactor commit or something that goes before. And it's like, well, what's wrong with splitting that out into a separate PR? What's the pain point of that? And I think the pain point is the fact that one, you have two PRs that are stacked on each other. So you have the first one that you need to get reviewed, and then the second one; there's that bit of having to hop between the two if there's some shared context that someone can't just easily review in one pull request. But then there's also, as we just mentioned, there's CI that has to run. And so now it's running on both of them, even though maybe that's a good thing because it's running on both commits. I like the idea that every commit is tested, and every commit is green. But I actually feel like it's some of our other processes that make it cumbersome and hard to get there. And if CI did run on every commit, I think it would be ideal, but then we are increasing our CI time by running it on every commit. And then it comes down to essentially what you said, what's the risk? So if we do merge in a commit that doesn't work or has something that's failing about it but then the next commit after that fixes it, what's the risk that we're going to roll back to that one specific commit that was broken? If that's a high risk for you and your team, then adding this process is probably the really wise thing to do because you want to make sure the app doesn't go down for users. That's incredibly important. If that's not a high risk for your team, then I wouldn't add the process. CHRIS: Yeah, I totally agree. And to clarify my stances, for me, this change, this process change would not be worth the trade-off. I love the idea. I love the goal of it. But it is not worth the process change, and that's partly because I haven't particularly felt the pain. CI is not an inexhaustible resource I have learned. I'm actually somewhat proud our very small team that is working on the project that we're working on; we just recently ran out of our CI budget, and Circle was like, "Hey, we got to charge you more." And I was like, "Cool, do that." But it was like, there is cost both in terms of the time, clock time, and each PR running and all of those. We have to consider all of these different things. And hopefully, we did a useful job of framing the conversation, because as always, it depends, but it depends on what. And in this case, there's a good outcome that we want to get to, but there's an associated cost. And for any individual team, how you weigh the positive of the outcome versus how you weigh the cost will alter the decision that you make. But that's I think, critically, the thing that we have to consider. I've also noticed I've seen this conversation play out within teams where one individual may acutely feel the pain, and therefore they're anchored in that side. And the cost is irrelevant to them because they're like, I feel this pain so acutely, but other people on the team aren't working in that part of the codebase or aren't dealing with bug triage in the same way that that other developer is. And so, even within a team, there may be different levels of how you measure that. And being able to have meaningful conversations around that and productively come to a group decision and own that and move forward with that is the hard work but the important work that we have to do. STEPH: Yeah. I think that's a great summary; it depends. On that note, shall we wrap up? CHRIS: Let's wrap up. The show notes for this episode can be found at bikeshed.fm. STEPH: This show is produced and edited by Mandy Moore. CHRIS: If you enjoyed listening, one really easy way to support the show is to leave us a quick rating or even a review in iTunes, as it really helps other folks find the show. STEPH: If you have any feedback for this or any of our other episodes, you can reach us at @_bikeshed or reach me on Twitter @SViccari. CHRIS: And I'm @christoomey STEPH: Or you can reach us at hosts@bikeshed.fm via email. CHRIS: Thanks so much for listening to The Bike Shed, and we'll see you next week. All: Byeeeeeeeeee! Announcer: This podcast was brought to you by thoughtbot. thoughtbot is your expert design and development partner. Let's make your product and team a success.

The Bike Shed
314: Communication, Testing, and Accountability

The Bike Shed

Play Episode Listen Later Oct 26, 2021 40:55


Chris regains several of his developer merit badges and embarks on a perilous CSRF (Cross-Site Request Forgery) adventure. Steph shares highlights from Plucky, a management training course, including ways we can "click" and "break apart" from our current role, and how to have hard conversations. They also discuss how software development processes change at different team sizes, processes that break down as teams grow, and processes that are resilient at any team size. This episode is brought to you by ScoutAPM (https://scoutapm.com/bikeshed). Give Scout a try for free today and Scout will donate $5 to the open source project of your choice when you deploy The Nightmare Before Christmas - What's This (https://youtu.be/QLvvkTbHjHI) Giant Robots Smashing into other Giant Robots - Plucky with Jen Dary (https://www.giantrobots.fm/search?utf8=%E2%9C%93&term=plucky) Plucky (https://www.beplucky.com/) Services are Not a Silver Bullet (https://thoughtbot.com/blog/services-are-not-a-silver-bullet) Become a Sponsor (https://thoughtbot.com/sponsorship) of The Bike Shed! Transcript: STEPH: Boom. I'm recording. Magic is happening. [singing] What's this? What's this? It's a Bike Shed episode. What's this? What's this? CHRIS: You did that on the mic. [laughter] So you just started recording too, so it's not like you're like, "Oh, I forgot I was recording." STEPH: Oh, I didn't have a finishing line that rhymes with shed. CHRIS: Head, dead, bread, spread. STEPH: [singing] Is TDD dead? I don't know. [laughs] CHRIS: Cool. I liked it. STEPH: Hello and welcome to another episode of The Bike Shed, a weekly podcast from your friends at thoughtbot about developing great software. I'm Steph Viccari. CHRIS: And I'm Chris Toomey. STEPH: And together, we're here to share a bit of what we've learned along the way. Hey, Chris, what's new in your world? CHRIS: What's new? I had a fun experience over the past week or two of regaining some of my developer merit badges, which is always enjoyable. So one was I had to configure AWS, specifically S3 and IAM such that I could upload files to an S3 bucket, which seems like one of those things that a developer should be able to do, and it's just not that hard. And, man, I failed so many times, and I stared at the screen. And the ARNs I think that's another acronym that I had to try and figure out what it means and fight against. Anyway, I got there. So that's one merit badge earned. I really hope [laughs] I correctly and securely configured access to an S3 bucket such that we could upload files in our Rails app. Cool, neat. Moving on, the next merit badge that I went for was restoring the sea of green dots. Our RSpec output had gathered some noise. There was a whole bunch of noise across a variety of things. There were some dev tools that were dumping some stuff in there. And there was something related to apparition, which is the...I want to say it's the Capybara feature spec driver that we're using now, which sits on top of ChromeDriver or something like that. I don't really understand the details, but it was complaining about something. And I found a fix, and then I fixed it and whatnot. But it was one of those. I did this on a Saturday because I was just like, you know what? This will be cathartic and healing. And then I got to the sea of green dots, and I was so happy to get to it. STEPH: This is me...I'm giving you a round of applause. CHRIS: Well, thank you. Arguable whether it delivered any real value to users, but again, this was Saturday effort, so I was allowed to indulge my fastidious caretaker of the code role. STEPH: Sorry, before we move on to more serious, can we pause to talk about developer merit badges? I really, really want cute felt badges that we can...I mean, I can't design them. I don't have the talent. But I think between us and other folks, we could design amazing merit badges, and then people could collect those. I'm very much in love with that idea. CHRIS: I love the idea. I am now certain that if we were to really pursue this, that we would fall into the deepest of bike sheds as we try and define well; what are all the merit badges? And what are the different levels? STEPH: [laughs] CHRIS: And how many do you need to collect before you can get to what are the different...There are just so many different taxonomies that we could introduce, and, oh man, I could spend a couple of weeks on that. STEPH: [laughs] It has a very strong Pokémon vibe too of you got to catch them all. CHRIS: Absolutely. STEPH: Okay. All right. We won't digress into bikeshedding merit badges, but I'm still very, very interested in that idea. CHRIS: Indeed. If anyone out there in the listener space wants to just make these, that would be great. This is the way that I avoid bikeshedding now is I just say I'm not allowed to make these decisions or even think about it. But if these happened into the world, I would be happy about that. STEPH: Oh, I just remembered we do have something similar at thoughtbot. They're not physical where you can hold them, but I think we've talked about turning them into physical badges. But we have our internal tool hub that we used to track our schedules. And one of the fun Ralphapalooza events that we had, a team came up with the idea of introducing badges in the tool hub, so then you could award people badges. You could give people badges. And it's very cute. So they could probably help us with the taxonomy. They've probably already figured out a number of badges we could get started with. CHRIS: And of course, this is where my brain went initially to like, oh, what would the taxonomy be? But I think that's how this goes bad. And if we just keep it in the this is cute and fun, and what are all the possible merit badges, but they're all equal, and the points are made up anyway, and then it's just a fun thing, then I'm like, I'm super into this. Let's do that. Have you used a regular expression to parse HTML? Congratulations, you get a merit badge. Have you not used regular expressions to parse HTML? You get a different merit badge. [chuckles] STEPH: [laughs] I feel very positive that I could be chief of cute and fun. I could manage that department. CHRIS: Yes, that feels like definitely a role that you could really excel at. But shifting around ever so slightly, I did run into a fun bug this week. And it was a mystery tour of, I'm going to say, sadness and then eventual learning and understanding, and I think we've come to a better place. But I want to tell a story, take us on a quick tour of the adventure that I went through. So we recently saw a handful of exceptions come through in our exception monitoring service and then piped into Slack, where we see those around CSRF token expiry. So this occasionally happens in a Rails app. The CSRF token that was on the page gets rotated. And therefore, when someone...if they have an older version of the page open and they try and submit a form or something like that, then CSRF protection is going to kick in. And you do get some false negatives there or some cases where like, nope, this is actually a fine user, this is not hacking, this is nothing bad. It's just that that user had a tab open or something like that. I'll be honest; I want to understand better the timeline of expiry and how Rails expires those and whatnot. But it's one of those things; it's deep enough in Rails that I trust that they are doing a very reasonable thing. And I think the failures that we're seeing that's part of the game. And so, mostly, we wanted to add a nicer handling around that. So thankfully, Inertia actually has a really wonderful page in their docs about handling Cross-Site Request Forgery expiration token, this whole thing. This is a particular failure mode that your app might have. And so it's nice to be able to provide a nicer user experience. And so what we ended up doing is if we catch that exception, we have a rescue_from in our application controller that will instead of having this be a 500 and just a full, like, something went wrong error page, we instead respond in an Inertia-like way to basically show a flash message that says, "This page has expired. Please refresh the page to continue." And if the user just refreshes the page, then they will get a new CSRF token. And from there, everything is going to be fine. So it's not ideal. But it is, I think, both secure and now a nicer user experience. STEPH: Yeah, that sounds really nice. When they refresh the page, do they lose all that form data? I'm curious how painful of a flow that is for the user. CHRIS: Currently, yes. Inertia actually has a really nice feature for remembering form data. If you've ever been on GitHub and you're filling in a box, and then you go away to a different tab, and you come back, and it's still there, and you're happy about that, it's that sort of thing. So we could configure that. At this point, we don't have...most of our forms are pretty small. So this is not something that we opted to do proactive management around. But that is definitely something that we could add but not something that's default or anything like that. STEPH: Cool. Yeah, that makes sense. I was just curious because yeah, either small form doesn't really matter, or also, this may be just a small enough error that only a handful of people are experiencing it that it's also just not that big of a deal. CHRIS: Yes, this definitely should be an edge case. And we've also recently been working on functionality to log folks out after a period of inactivity, which would also, I think, obviate this in a different way. So all total, this shouldn't be a big deal. And this was basically a quick, little snippet of code that we thought we could just drop in, and everything would be great because it shouldn't happen much. But then I was testing out a different feature on staging, and everything I tried to do was popping up this little alert flash message that was like, "Hey, your page is expired." And I was like, that seems bad. And then I realized literally every action, any non-GET request, was getting this response that the CSRF token didn't match. And I was like, well, this seems bad. Luckily, it was only on staging and hadn't made it to production. But it had made it to staging, which meant it had gotten through CI, which was very concerning because we have a pretty robust set of feature specs at this point. We built up a bunch of fakes for all of the external data systems that we're interacting with. And we're really putting the app through its paces and trying to do so in a very production-like way. And so I was like, this is such a deep fundamental breakage. I don't know what's going on here. And so I started to investigate. And it turns out that in a recent commit, I had started using Axios, which is a little wrapper around the Fetch API. They may not actually use the Fetch API under the hood, but it allows you to have a nicer interface to make XHRs. And we implicitly had that in our package already by virtue of Inertia. Inertia uses it under the hood, but I wanted to make it explicit because now I was using it directly. So I figured that's cool. I will yarn add Axios, and then I will continue on with my day. And I worked on my feature and everything was great. And then I pushed it up into a pull request, and everything was great, and CI passed. And I got it onto staging, and everything was very sad. So then I started on the adventure of like, what is going on here? It turns out that somewhere between version 0.21.1 of Axios and 0.23.0, which there's a bunch of things about those version numbers that make me uncomfortable but here we are, somehow the behavior where you can configure the XSRF header name, which is what they're calling it on their side, the configuration stopped working. And so our override that says this is what our CSRF or XSRF token should be called when it's sent back up to the server in a header that was getting lost. And so they were falling back to their default name, Axios was. And, therefore, Rails was like, "There's no CSRF token here. So this is going to be a no for me. I'm going to reject all of the requests." So the fix was relatively easy to roll back and to pin the version of Axios to the previous version that we had been using. I didn't actually intend to upgrade it. I just intended to make it an explicit dependency. But by doing that, I accidentally upgraded it. I don't love that there was this pretty deep breakage in that. I haven't done the good work of trying to open an issue. I still want to scan through and see if there is an open issue or a conversation around this before I start making any noise. But I think if I don't find anything, this is the sort of thing that should be reported because I can't imagine I'm the only one running into this. Likewise, I was very sad that my test suite did not find this. Turns out in Rails, CSRF protection is just turned off in test mode, which may be overall makes sense. But for feature specs, in particular, I definitely want to have it. And so, it was nice that I was able to find the relevant configuration. And we introduced an RSpec configuration that says, "If it's a feature spec, save off the existing configuration and enable CSRF. And then after the spec, go back to whatever the previous was." So now all feature specs run with CSRF. And I did make sure to push up that as a singular change to CI, and CI was very unhappy with me. Many, many features-specs failed, which was good. That was what we were going for. They failed for the right reason because things were fundamentally broken. And then, I was able to update the package-lock or the package.json on the yarn lock, pin the version, fix everything. But man, there was this period of like, oh man, the app is broken in such a fundamental way. Users just can't do stuff anymore. They can view anything, but they couldn't change any data. And it just snuck through CI. And that feeling is the worst feeling. We had, at this point, built up a lot of trust in our test suite. It was really telling us when stuff was wrong, and if it was green, I felt very good merging. And suddenly, this just really shook me to my core on that front. STEPH: I love these journeys that you take us on. I mean, they're painful for you, and I am sorry to hear that. But I love these journeys that you take us on. [chuckles] CHRIS: I usually only take us on them when I've figured out the answer. And I'm like, all right, here's where we're at. It was rough for a little while, but now we are happy. And thankfully, the one configuration of saying, hey, Rails, also, please include this as part of our production like, configuration for test mode. So I feel better that moving forward, this breakage won't happen again. STEPH: We should add that as another merit badge for telling a bug story. All right, I'm taking off my hat of chief of fun and cuteness. So this may not be terribly relevant to all the things that you just shared. But I am curious where you mentioned that with Axios because you'd specified the name of the token, and then that overriding behavior is what then broke. And so then that's what led to this whole adventure that you went on. I'm curious, why did y'all customize the name of that token? CHRIS: A, this is a great question. B, I'm not super sure. C, I think the reason is because we were trying to align to Rails. So we have a little middleware on the Rails side that will serialize the CSRF token into a cookie. And then that cookie value gets read by Axios and sent back up as a header on the request. So this is the way that with Inertia CSRF just kind of works and is good. And it's different than Rails' normal. We put a hidden input into any form. And so Rails holistically knows about both sides of that, and everything works fine. But now I have to manually round trip the CSRF token. And Axio's default configuration is a header name X-XSRF-TOKEN, and we needed X-CSRF-TOKEN because that's what Rails is looking for. I probably could have configured it the other way on the Rails side. But one way or another, I had to get Rails and Axios to come to an agreement, to meet at a table, and to agree to collectively protect the app. And so I had to mediate that discussion, and that's what ended us here. STEPH: A meeting of the minds. [chuckles] Cool, cool, cool. Yeah, that makes sense. I was just curious because then that would have changed the whole journey. But yeah, that is super interesting. And I definitely resonate with the idea of when you've really invested in your test suite, and you trust it that then when it doesn't catch something that obviously breaks the application, then that feels like something worth prioritizing and digging into and then figuring out how to bring back that parity. I don't know that I've turned on enable CSRF for feature spec. So I'm also very interested in looking at that configuration and considering if I need that for any of my future client projects if that's something that I need to remember for the future because that's very niche but good to know about. CHRIS: I feel like this only really comes up if you're working in the...it's called the odd middle ground that Inertia ends up occupying. If you're in a traditional Rails app that is generating HTML server-side, forms are generated. They got the CSRF token inlined there in a hidden input. And then when you post that form, it's coming back up. The names automatically are going to match. You don't need to worry about it. And it's probably fine to not have it included in test mode. And if you're at the other end of the spectrum and you've got API interaction, and that's the way you're doing everything, then you have a different auth mechanism and cookies, and whatnot just don't apply in the same way. And so it won't really matter on that side but for a different reason. And it's only because we're in this interesting middle ground, which, again, I really love. And it's the thing that I love about Inertia. But this is a rare case where it's like, oh, we do have to bring the two sides to meet in the middle. And this is a case where, unfortunately, due to a very subtle breakage on a minor release of...a package that we're using silently broke so, yeah. But yeah, thankfully, everything is back to working. And again, we've been able to enhance the test suite in that little way that I feel confident again because this won't sneak in another time. We have coverage around this. We're good to go. So while I was very scared when this initially happened, I feel better now. I'm happy to go into the weekend feeling better about this. But that's my story. What's new in your world? STEPH: So I feel like I've been having one of those weeks where I have less code adventures. In fact, it's one of those days where I went to thoughtbot's daily sync...because we often have our client daily syncs, but then we still have a thoughtbot sync as well. And I went to the group, and I was like, I get to write code today. It's going to be a great day. All the other things I'm doing are also interesting, but I get particularly excited when I get some maker's time and get to write some code. So I feel like I've had less coding adventures recently and more hiring and process-related adventures. And specifically, I just completed the Plucky Manager Training, which is a program that's founded and led by Jen Dary, who was recently on thoughbot's podcast, The Giant Robots Smashing Into Other Giant Robots. I'll be sure to include a link in the show notes for anyone that's interested. CHRIS: I believe this was the third time she was on. It's at least the second, possibly the third. And all of them are great listens, just as an aside, so we should include links to all of them. STEPH: Yes, I think she's one of the rare guests that has been on the show three times. And I think I've only listened to the first couple minutes of that episode. But I think they talk about the fact that this is her third episode, which is really, really cool. And I'm still frankly synthesizing all the information and the ideas that I've collected from the course. But I do have a few quick takes that I'm interested in sharing with you. So the first one is my cohort...we were the Panda Cohort, so go, Pandas. And some of the things that we talked about were…, and I think that this may have been the first day. So it was three days, and it was three hours for those three days. And they're spread out over a couple of weeks, which is really nice because then you show up for those three hours of the class, but then you leave with some ideas and some things to experiment with. You get a week to then try out an experiment and then come back to class next time and talk about this is how it went; it went to wonderful, or it went terrible. And you get to share that with others and work through it. And in the first class, we talked about coaching versus managing, which I found just a helpful definition to review. So managing is more direct, and telling someone what to do while coaching is encouraging someone to determine their own path and find their own solution. And I find that as a team lead at thoughtbot, I'm very often more in that coaching space than I am in that managing space. I think it's frankly pretty rare that I actually need to put on a manager's hat. And I often feel like I'm wearing my coaching hat instead. And some of the other things we talked about one of them is what is work? Which is a fun question to ask. And Jen had an analogy for this speaking about imagine that you have a plastic Easter egg. So it's got two sides, and side one is all the skills and desires and things that you're fulfilled by. And side two is a company that needs those skills. And it's great when those line up and click together, like when you take a job or get a promotion. Have you ever played...do you know what I'm talking about? Those little plastic Easter eggs. Have you ever played with those as a kid? CHRIS: Yes, certainly. STEPH: [laughs] I realize I just launched into that analogy. [chuckles] And then Jen goes on to say that's totally normal for then those sides to unclick. And Jen continues to say that it's totally normal for them to unclick. So maybe the company changes direction, the company is acquired. You've fallen out of love with something that you do about your job, or you have kids, and that has changed the things that you are fulfilled by and what you're looking for. And that's not necessarily bad. So it can be like, hey, you are working on x now, and you're not fulfilled by that anymore. But then another company comes along and says, "Hey, we're working on this, and you are fulfilled by that." So then another click happens. And essentially, it's a nice analogy to represent someone's career path and the ways that we are going to shift and re-prioritize what we're interested in. But it's also a really nice way to help it feel less personal because both sides are allowed to change. The company can change. You, as an employee, can change. And then you can look for that next click that is going to match up with a company that meets your skills and things that help you feel fulfilled. One of the other topics that we talked about are hard conversations, which I love that we dug into this one because that's certainly one that I struggle with or...I mean, we all get that feeling if you have to confront someone if you have to have that uncomfortable discussion with someone. It is a very hard thing to do. And so we had some very honest conversations around what is a hard conversation? What does that represent? And essentially, they represent that there is stalled progress and something can be improved. So Jen likens a hard conversation to a tool. It's something that you can use to then help something move forward again if something feels stalled or if there's something that needs to change. And during those hard conversations, you may not get to the resolution that you're looking for. So you may be looking for a specific outcome. But you also have another person that needs time to respond and to take in everything that you have said and process that information. So when you have a hard conversation, you may actually only move forward an inch. So if you had a lofty goal of we're going to talk and then we're going to have this hard conversation, and we're going to get to this space...But instead, you actually just make incremental progress. Like, okay, at least this person is now aware of this concern. That might be your win for the hard conversation versus actually tackling; how are we going to address it? I just want them to be aware of this concern. And it's a very vulnerable conversation, and they often take time before you can get to that ideal resolution. But essentially, the idea is get in the game, start the conversation, and then have follow-up conversations for that hard conversation. And I really appreciated that framing because I often will think of hard conversations of oh, we have to have this hard conversation and get to this specific outcome. But if you shift the goal line to be like, no, I really just need to at least make this person aware of a concern, that makes it a lot more approachable. And then also probably yields more fruitful outcomes because that gives the other person time to think about what you've shared to also come to the table with their own ideas and then work together to then get to that ideal resolution. CHRIS: I like that framing a lot. I can definitely see the case where you, as someone who has recognized something that needs to change (perhaps you're a manager),lineup you've now thought about that a good bit; you've observed it, but the individual that you're bringing that to this may be novel. This may be a surprise for them. And so if you come into that interaction both about to share this information but then also trying to resolve it and trying to get to I need you to internalize it, and I need you to fundamentally change your behavior as a result of this conversation we're going to have, that's quite possibly not a realistic outcome. And if you're trying for that, it might inherently lead to just a bad outcome because that individual is not in a position to do that. But they are potentially ready to hear it. And so you can just achieve step one and then later have step two. So I like that a lot. STEPH: Yeah, in general, I found the course incredibly helpful, very insightful. It was also really nice to hear from other managers that are facing similar problems or perhaps novel problems and then getting to weigh in and help each other. So it's a wonderful course. I'll be sure to include a link in the show notes for anyone that is interested. And I'll probably come back with some more insights from the class because it's really...we just wrapped up. So I'm sure I still have some ideas that will percolate over time, and I want to come back and share those with the group. Mid-roll Ad And now a quick break to hear from today's sponsor, Scout APM. Scout APM is leading-edge application performance monitoring that's designed to help Rails developers quickly find and fix performance issues without having to deal with the headache or overhead of enterprise platform feature bloat. With a developer-centric UI and tracing logic that ties bottlenecks to source code, you can quickly pinpoint and resolve those performance abnormalities like N+1 queries, slow database queries, memory bloat, and much more. Scout's real-time alerting and weekly digest emails let you rest easy knowing Scout's on watch and resolving performance issues before your customers ever see them. Scout has also launched its new error monitoring feature add-on for Python applications. Now you can connect your error reporting and application monitoring data on one platform. See for yourself why developers call Scout their best friend and try our error monitoring and APM free for 14 days; no credit card needed. And as an added-on bonus for Bike Shed listeners, Scout will donate $5 to the open-source project of your choice when you deploy. Learn more at scoutapm.com/bikeshed. That's scoutapm.com/bikeshed. STEPH: Pivoting just a bit, we have a listener question that I'm excited to dive into. This question comes from the one and only, the Edward Loveall, fellow thoughtboter. And Edward wrote in, "How does the process of software development change at different team sizes? What's a process that breaks down soon after the team starts growing? What's a process that is resilient at all sizes? And by process, I mean anything that involves other people including organizing tasks, code review, deployment, or anything else that isn't you alone writing code in a vacuum." I'm really excited about this question because I think there's a lot here. And there's actually one part that I'm struggling with a bit, so I'm curious to see what you think, Chris, about it. But I'm going to start off with saying that I think there are a number of management processes that definitely break down as a team grows. But in the spirit of Edward's question, I'm going to focus more on the software development process and how those might need to change and what starts to break as your team grows. So starting off with processes that break after the team starts growing, this one, frankly, what really starts to break is not a process specifically, but it's the lack of process that really starts to become visible and painful. So, how do we track work? Before, maybe the product manager or someone would just send you a message and say, "Hey, can you work on this?" or "Hey, can you fix this thing?" And how does code need to be reviewed before being merged? Does it need to be reviewed? Are people just merging as they get stuff done? How are deploys performed? Oh, we have a super urgent production fix that needs to go out, and the only person that knows how to deploy is out sick today? Cool. That's the type of process that I think that really breaks down, or at least you start to notice when the team starts to grow. What are your thoughts? CHRIS: I definitely feel that first one very strongly. We're feeling it right now on the team, which is still very small. There are only three developers working on the project, and then we have a product manager. And each week, we're slowly iterating, and tweaking, and honing, and trying to introduce just enough process in terms of how we define the work to be done, communicate the status of it, all of that fun stuff. We started with Trello. And we just had a board with some columns, and then we had more columns, and then we got rid of a few of them. And then we recently added a Power-Up to the Trello board, which allows for epics. So there are cards which are epics which tie to sub cards. And I'm staring at it, and I'm like, how long until we're Jira? How long can I hold out here and not be Jira? But it does feel like we're slowly iterating towards a more useful process for this team rather than process for process' sake, which I feel like is a really useful distinction. There's also a question of like, what can be known or what can be adequately measured and whatnot versus what can't be? So we've talked many a time on the show about estimation and velocity and trying to track that and the pitfalls inherent with that. And so there's, in my mind, two different camps. There's the process we want to avoid. And again, to reference German Velasco's wonderful blog post, Say No To More Process. And I really feel like there is a tendency often when things go wrong to then try and paper over that with process. Oh, this team didn't use the design system. So we need to write ESLint rules to make sure you can't import from the directories that aren't the thing. And it's like, we can do that, and I've definitely done that. And I will do that again in the future. But I always have the lens of do we need this? Is it worth the trade-off, the cost, the overhead, the complexity that it's bringing in? But definitely, organizing and communicating tasks is one of the ones that becomes really difficult. The more people that are working on something, the more you need probably more than one person staying out in front of them and trying to define the next bit of work that needs to be done after that. Code review feels like it probably should stay similar, with the exception that I lose the ability to review all code at some point. Right now, I'm trying to review every single PR that goes through or close to it. At some point, I'm just going to have to give up on that. But for now, that's my goal. But fundamentally, code review, I think, will hopefully take the same shape. Deployment, similarly, like, I've talked about the merge queue thing. I want to get a little bit of process in there but not too much. There is definitely some necessity for change. But I definitely want to resist the urge to change everything and to just say, like, slowly over time; we're going to have to be a big Byzantine organization with lots of rules and standard operating procedures and all of that. I've heard anecdotally, and I don't know if this is true, so maybe someone out there on the internet can correct me if I'm wrong, but my understanding is that at Google, they're pretty tight in terms of what languages and frameworks can be used and what processes, and workflows, and build tools and all of that whereas Facebook, as a counterpoint, is relatively lax. Obviously, React is used very heavily on the core web application. But there's some flexibility in terms of different languages and frameworks and things for sub-projects or small individual teams having a little bit more autonomy. And I think that's a really interesting thing of are you one large, cohesive, organized company or do you try to act like a bunch of small disparate but roughly connected teams that share good ideas but can work independently? And that changes how I would think about this question. STEPH: I really like how you're describing the addition of process. It sounds like a just-in-time process. So as you're learning that something needs to be added, then that's when you look for answers. And then you sprinkle on a bit of process that everyone agrees that feels very helpful within also the right to review and see if that still makes sense for the team. There's one additional area where I think the lack of process really shines through in addition to the number of ways that you've mentioned is also onboarding. So if you have a very small team and you are onboarding, it's likely that...Chris, you can let me know if I'm wrong, but when someone's joining the team, there's probably a good chance that they get to pair with you at some point, or they even get welcomed by you to the team. And then, they get an overview of the product and the codebase. And there's probably this really nice session where they get to ask you questions, and then they have that onboarding session. Does that sound about right? CHRIS: Yes. But I would go so far as to say it's not just a day or a session, but it's probably a couple of days. So yes, and. STEPH: That's even better. And with some of the smaller teams that I've seen, that onboarding process is where they are pairing with that lead person on the team. And that's going well until suddenly that lead person can't pair with everybody. And nobody has really thought about how to streamline that onboarding or how to coach or teach someone else to be a really good onboarding pair. And I have strong feelings about this area because we often focus so much on hiring, but then we drop the ball when it comes to onboarding that new, wonderful colleague that we've worked so hard to recruit. And at the end of that day, someone's going to reach out to them and say, "Hey, how was your first day?" And it makes a big difference for that person's retention as to how those first couple of days ago. So I think onboarding is another really important part that when you're a smaller team, you probably don't need much process because you have more of that personable onboarding experience. But as the team grows, there needs to be more of a process to help other teammates join the team. CHRIS: It's interesting. I think I totally agree with you that over time, there is a necessity to be more intentional and to have a little bit more structure in the process. And I don't think you're saying this, but I just want to make sure we are saying the thing that I think we believe, which is that shouldn't replace the human that helps you onboard. Like, I still like the idea that everybody gets a pair for some amount of time when they start at a new company. And you're working together on a feature, or you're working together on bug fixes. You're shipping to production as soon as possible. But you're not doing that based on some guides in a wiki. You're doing that with another human that's helping you. There should also be guides, and a wiki, and documentation, and formalization as the organization grows but not in place of having another person that you get to talk to. STEPH: We're just going to send you a little yellow rubber duck and then with a little Post-It note that says, "Good luck [laughs] with your onboarding process." Definitely. I agree with everything you said. It does not replace that human element where there's someone that's helping you onboard. I just see that onboarding is one of those things that gets forgotten, or we often point someone to a README which I do think is great because then it is battle-testing our README. But then there still needs to be someone that is readily there to say, "Hey, how's it going? What are you struggling with? Can I pair with you?" There still has to be that human element that is helping guide you through the process. And I think smaller teams may forget that they actually need to assign somebody to you to make sure that you have someone that you know. Like, hey, this is who I can reach out to with all my questions. Because they're probably not going to be comfortable posting in the company channel at that point or a larger communication to say, "Hey, I'm stuck on something." CHRIS: There's one other area that comes to mind, or I guess it's more of an anecdote that I have heard, but it speaks back to GitHub's early, early days. And they were somewhat famous for being very flat in terms of the organization and very self-organized, and everybody's figuring it out, and you're working on the thing that's most important in your mind. And for a long time, this was a celebrated facet of the company and a thing that they talked about rather publicly. And then I think there was this collective recognition, and maybe they reached a tipping point where that just didn't work anymore. Or maybe it actually hadn't been working for a bit, and there was just the collective realization of that. But it was interesting to watch from the outside as GitHub added more formalization, more structure, more managers, and hierarchy, and career ladders, and things of that nature. And I think there's a way to do all of those things in a complicated, overloaded, heavy way. But I think a different version of it is...like, you were using the word coaching earlier. Having formal structures within your organization to encourage people on their career path, to help them grow, to have structure around that, I think is a really difficult thing to get right. But I think it is critical, and I think just not having it can't be the answer past a certain probably pretty small size. So that is an interesting one where I think you do need to introduce some process and formalization around how you think about the group of people and how they work together within your organization. STEPH: I agree. I think where some folks may see a lack of hierarchy; others feel a lack of support. And adding levels of management should really be focused on the outcome is that we're helping people feel supported. So even getting feedback as you're adding those different levels of management, like, hey, did we make your life better? Did we make your life worse? I think that's a great question for management to ask as they're exploring a less flat structure. CHRIS: So, Steph, I have a question for you now on a variant of this topic. In general, we seem to be fans of having a codebase. Probably a Rails app that's got a database behind it, and that's where you put the data. Everybody commits to that same repository. It's all kind of one collected thing. And often, organizations grow to a certain size, and they're like, this is untenable. We cannot have this many people working on this same codebase. So we shall do the logical thing, which is we will break it up into small pieces. And those pieces will communicate over HTTP, and it will be great because then our teams can be separate from each other and can manage their little piece of the world. What do you think about that? Is there truth there? Is it not true at all? What do you think? STEPH: All right, so your team is getting too big, and to the point that you feel like you need to split it out so then you can have small teams, and they can all work independently on different parts and services of the codebase. I don't love the idea. I'm trying to think through because I feel like there's a lot of nuance here. But I don't love the idea that that's the driving force as to why are we making the change? And that is often a question that comes to mind whenever we are making a big change, either architecture or process-related is like, what's driving this? And then how are we going to measure it? And if we are driving it just because we have a large team, let's talk more. Why are people blocked? Why can't people work together? What's preventing people from being able to contribute to the same codebase? Are people blocked for a long time because they're having to wait on someone else to complete that work? I have a lot of questions that I don't know if I can fully answer your question. But my instinct is to say let's not break up the architecture just because our team grew in size. CHRIS: Yeah, I think I definitely agree with that. There's probably a breaking point where it's just too many individuals, and there'll be too much contention. But I think resisting that or at least naming that as like, okay, that's what we're saying but is that really what's true? Or are we actually feeling that this system is so deeply coupled that there's no way to change some small piece of the code without impacting other parts of it? Like, is the CSS completely untenable because we're just using global class names, and it's leaking everywhere? Okay, do we need a different solution there? And then it's actually fine. We don't need to have different services that have their own different style sheets. We just need a different approach to CSS. That's a particularly easy one to go for because there's inherently a global namespace there. But the same thing is true in a lot of different contexts. So services are a way to break things apart and enforce those boundaries. But if inherently coupling is your problem, then you're just going to be coupled over HTTP, and I think it's going to be difficult. There's a wonderful blog post by Josh Clayton, which I think does a better job than I'm doing in this moment of highlighting some of the questions I would want to ask. The blog post is titled Services are Not a Silver Bullet. And so Josh goes through and enumerates a bunch of the different versions of the story that he's heard throughout the years of well, we need to go to services because x, because our test suite is slow because pull requests are constantly having merge conflicts and whatnot, because the code is very deeply coupled and any change here affects everything else. And a fix over here broke something over there. This is no good. And so he does a really good job of presenting alternatives or at least questions that you can ask to say, like, is this the problem, or is this a symptom? And we need to address the more underlying cause. And so I think there is a point where you just can't have 1,000 people trying to commit to the same Rails codebase. That feels like it's maybe too big. But it takes a while to get to 1,000 people. And there will be times where extracting a service makes sense or integrating with an external service that exists. Like, I've talked about Stripe before as my canonical like, yeah, it's actually deeply intertwined with the data model, but they're just dealing with such a distinct complexity set over there. And they have such expertise on that that I'm happy to accept the overhead of the fact that that service lives outside of my core application, and I need to deal with synchronizing state and all of that. I will take on that complexity, but it's not worth it for everything, and it's not a silver bullet. Again, to reference the name of Josh's blog post there, Services are Not a Silver Bullet. And so, coming back to Edward's original question, I would say that having a monolithic codebase works for a really long time, but there is probably a breaking point somewhere well along, but fight it for as long as you can. I think. STEPH: I really like how you touched on coupling because it really helps ask those questions to get to the heart of what are the pain points that you are feeling? And it is less of a decision that is based on people and process but more if you're going to split out a portion of your architecture. It is in response to an actual business need and a business value versus some other pain points that you're trying to fix. A particular example might be like maybe you have a portion of your application that really just needs to spend a lot of time crunching data. And it's really not as specific to your application; it's something that can happen on its own. And then it's beneficial to move that outside so it can scale and relate it to the work that it needs to perform versus keeping it in-house with the application. I do want to circle back to another question that Edward included which is what's a process that is resilient at all sizes? And the ones that really come to mind for me...and these are a bit amorphous intentionally because it will look different for each company. But three areas that are very resilient at all sizes, whether you are 1 to 2 employees versus you've got hundreds or thousands it's communication, testing, and accountability. So communication, where are we headed, and how do we know what we're working on? For testing, it's how do we test our changes? Do we write tests? Do we use QA? Do we have a staging environment? What does that look like? What's our parity between staging and production? And then how do we know what's in progress, and how do we know when it's done? Those are three core areas that, regardless of your team size,,I think are very crucial to the team success. What do you think? What are some of the processes that are resilient at all sizes? CHRIS: I actually really like the list that you just provided. That is a wonderful trifecta, and I think it will take you very far, so probably not much to add from me. But I guess on that note, should we wrap up? STEPH: Let's wrap up. CHRIS: The show notes for this episode can be found at bikeshed.fm. STEPH: This show is produced and edited by Mandy Moore. CHRIS: If you enjoyed listening, one really easy way to support the show is to leave us a quick rating or even a review in iTunes, as it really helps other folks find the show. STEPH: If you have any feedback for this or any of our other episodes, you can reach us at @_bikeshed or reach me on Twitter @SViccari. CHRIS: And I'm @christoomey STEPH: Or you can reach us at hosts@bikeshed.fm via email. CHRIS: Thanks so much for listening to The Bike Shed, and we'll see you next week. All: Byeeeeeeeeeee! Announcer: This podcast was brought to you by thoughtbot. thoughtbot is your expert design and development partner. Let's make your product and team a success.

Prolly Shoulda Known Better
THE PRINCESS DIARIES (or, Les Skittlerables)

Prolly Shoulda Known Better

Play Episode Listen Later Oct 21, 2021 95:46


SUPPORT THE SHOW AT ko-fi.com/prollyshoulda Be true to yourself. You don't need to be popular to be happy. Power and prestige isn't everything. These are all great messages for a child to see in movies, but in 2001 Garry Marshall directed a hit family comedy that said the opposite of all of those things. Nadia and Tony work through some stuff as they realize that delightful performances from Anne Hathaway and Julie Andrews are papering over some very unsettling messages. Also Larry Miller plays a caricature of an Italian stylist, so we get back on our bullshit very quickly. Our theme song is "USA" by Jeff Rosenstock; Jeff's music is distributed under a Creative Commons license and available at quoteunquoterecords.com . This week's outro music is Mandy Moore's “Stupid Cupid” as covered by the Saint Andrews Uke Group.

The Bike Shed
313: Forty-Seven Percent

The Bike Shed

Play Episode Listen Later Oct 19, 2021 42:05


Steph talks about binging a few Things Worth Learning podcast episodes and particularly enjoyed an episode that featured one of thoughtbot's design directors, Sameera Kapila. Sam shared her expertise about management and inclusion, and Steph shares her favorite parts. Chris shares the story of a surprising error and the resulting journey through database transactions and Sidekiq that eventually resolved the issue. He also shares some follow up on the broken build and the merging process changes they introduced (spoiler, the process changes have been rolled back). Leading Inclusively, with Sameera Kapila - Things Worth Learning Podcast (https://www.youtube.com/watch?v=eiV6_3pZFc0) How to Skim a Pull Request (https://thoughtbot.com/blog/a-smelly-list) Isolator (https://github.com/palkan/isolator) aftercommiteverywhere (https://github.com/Envek/after_commit_everywhere) timefora_boolean (https://github.com/calebhearth/time_for_a_boolean) Transcript: STEPH: Oh man, I'm about to stop eating my pop-tart. I'll put it away. It's within distance. I'm going to eat it. CHRIS: Your high-fat content unfrosted pop-tart. STEPH: You know, surprise Sunday twist: it has icing on it. CHRIS: Steph, who even are you? STEPH: [laughs] CHRIS: There are a few canonical anchor facts that one knows about other people, and when one of those... STEPH: I like to keep everyone, including myself, on their toes. CHRIS: Or you've just secretly accepted that the icing adds another textural flavor adventure component. It's just better with icing. STEPH: All right, all right, all right. There's a complicated answer to this. And the complicated [chuckles] answer to this is that the more organic ingredients that I recognize when reading about pop-tarts are by a particular company, and they all have frosting on them. And the more generic pop-tarts that don't have frosting on them, I don't know how to pronounce a lot of those ingredients. So I'm like, no, but okay, I still eat them. But I prefer the ingredients I can pronounce. So I either go with the ingredients I can't pronounce or have a little bit of frosting on my pop-tart. And I'm going with the non-cancer route for today. CHRIS: For today, in this moment, and accepting the frosting. Okay, all right. Well, that is complicated. [laughs] It's tricky out there. Hello and welcome to another episode of The Bike Shed, a weekly podcast from your friends at thoughtbot about developing great software. I'm Chris Toomey. STEPH: And I'm Steph Viccari. CHRIS: And together we're here to share a bit of what we've learned along the way. So, Steph, what's new in your world? STEPH: Hey, Chris. So the weather, I'm going to talk about the weather for a little bit. [chuckles] It's been almost non-stop rain for the past several days, which is fine. I'm sure it's great for plant life. But it's really hard on my dog Utah because then we can't go outside for our normal walks and playtime. Although he is my four-legged water baby because he absolutely loves water, and puddles, and playing in the rain. So he's very fine with going outside and playing for a long time. But then I have to essentially give him a full-on bath before I want to bring him back in. So not wanting to have to give him a bath each time, in the spirit of improvising, we started finding more indoor games to play. And I've started teaching him to play hide and seek. And he's not great at it mainly because he will only stay until I'm out of eyesight, and then he will come and find me. And so I have to be really, really fast at finding a hiding spot to like dash around a corner or hide behind the door. But I think he enjoys it because he will find me and then he seems very excited. And we go back, and we play again. And so I just have to work on teaching him to wait a bit longer so I can find better hiding spots. CHRIS: When you said that, at first, I was like, how did you teach him to hide? But I realize he's only playing the seek part of the game, and you're only playing the hide part of the game. STEPH: [laughs] CHRIS: I'm just so used to you exchange roles back and forth. First, you hide, then you seek, and then you switch it up. That would be a lot to get your dog to be like, now I'm going to secretly hide. STEPH: [laughs] I'd be very impressed. Yes, we have very distinct roles in this game. I am the one that always counts and hides. But he's a very good seeker. So that's been fun. We just got to work on getting a little better at it. But on a more tech-related note, one of the design directors at thoughtbot, Sameera Kapila, who also goes by Sam, was a guest on the podcast Things Worth Learning, which is hosted by Matt Stauffer. And Matt is also the host of The Five-Minute Geek Show and The Laravel Podcast. And in the show Things Worth Learning, Matt meets with individuals that are excited to share something that they're deeply passionate about; maybe it's tech, maybe it's not. And I've binged a couple of those episodes. And I really like how you can choose between the podcast format or the YouTube format. So then you can really watch the conversation unfold, which I know you and I a couple of times have thought it would be fun if people could see us because there are so many facial emotions and gestures that go along with conversations. So it was really delightful. And speaking of delightful, Sam shared her expertise about management and inclusion. And I definitely recommend listening to the episode because I can't share everything that Sam shared. But a couple of the topics that Sam mentioned that I really enjoyed and would love to chat about, so the first one is about helping someone, in this case, someone that you manage that comes to you with a concern. So there's often a presumption that just because someone comes to you with a concern or an issue that they've experienced at work, that they're the ones that will also want to work to address that concern, and that's often not true. It can be true; maybe that person wants to be involved. But they're often coming to you in the leadership or management role to say, "Hey, I've had this issue," and they really want help with that instead of walking away with homework for it. Because then that trains people to essentially be in this mindset of well, if I bring up this concern, then I'm going to be the one that has to address it, even if I'm the one that's most negatively impacted by this. And addressing this concern could be actively harmful to me. And she shared a really great real-world example from her own experience where her and another co-worker had noticed a concern about the hiring process. And her and that co-worker got together, and they talked about the concerns. They even rehearsed for the meeting because they were trained by the tech industry to say, "Hey, if you bring up a concern, you're going to be responsible for addressing and then resolving that concern." And so they had that meeting with the person in leadership. And they were pretty nervous about how it was going to go. And that person in leadership said to them, "Thank you both so much for sharing that. That must have been such a burden. And this is my responsibility to fix. And here are what my next steps are." And that was amazing because it allowed Sam and the other person to go back to client work. And they also received follow-up conversations about how that issue was being addressed. So there was even that feedback loop as to how things were going to change. And I have a personal example that...I really resonated with the example that Sam provided because I remember there are different teams that I've been a part of, where often I was one of the few women engineers on the team. And so we often have conversations about how do we get more women engineers into the company? And they're wonderful conversations. But there's a part of me that always felt resentful about, like, why am I here? Why am I the one fixing this? I understand I have some more insight and expertise, and experience in this area. But I was also frustrated by the fact that I was the one that was in that meeting often with other women, and it felt like our responsibility to fix this. And I used to feel bad about feeling resentful towards that. Because I was like, shouldn't I want to help other people? And I do. But Sam's example really helped remind me and clarify that yes, just because there's a concern doesn't necessarily mean you should be the one to address it. And it really takes everybody involved, or it takes leadership to step up and address that concern. CHRIS: Oh, that's really interesting the way Sam is framing that and describing the situation of not having any problem that you bring in be now your work to solve. Like, oh, I found the issue, and now we've got to go do this. But the idea that you can bring something to light and then be able to walk away from it. And the particular thing that you were saying that if your interaction is always that when you reference something when you bring in a concern that then your manager works with you to figure out how you can solve it, then you get this mental block of like, well, do I even want to say anything? Because I don't want to try and deal with big, amorphous unclear issues. So maybe I just won't even say anything. And so this as a way to make sure that there's room for all of the conversation is a really interesting framing that I hadn't really thought about, frankly, but it's very interesting. I haven't seen this interview either. So I'm definitely excited to give this a look because Sam is wonderful. And the topic that you're describing here sounds fantastic as well. STEPH: Yeah. There was an important moment for me where...one of my managers is Matt Sumner, who's been on the show. And when Matt was my manager, at one point, we were having a one on one, and we would often go for walks for our one on one. And I mentioned something about "I have this concern, or I have this problem, but I don't really know how to fix it. So I'm not sure I'm ready to talk about it." And Matt, in his delightful way, was like, "We can still talk about it. You don't have to have an answer or a solution." I'm like, "Yeah, but I feel like I should be able to fix it. Like, if you have a concern, or if you have something that you want to gripe about, then you should come to the table with solutions for it." And Matt was like, "No, you don't need to do that at all. We can totally gripe about stuff or talk about concerns and then either figure out the solutions together or go to other people for ideas." And that was really important to me because, like you'd mentioned, otherwise, it felt like this mental block where then it feels like you can't air out some of the things that you're worried about or have concerns about because then you think you're the only one responsible. And you may not be able to come up with the best solution. You may need other people to then help you strategize and come up with ideas. And I just love, love, love that part of Sam's discussion. And oh, there was one other part about the conversation. Well, there are lots of parts that were amazing. But another one in particular that blew my mind is about Comic Sans, the font, the font that everyone loves to hate. [chuckles] And I learned that it's one of the most legible fonts for kids. And it's one of the more accessible fonts for people with dyslexia. And it's actually recommended...I think there are still more academic studies that need to be done to really classify fonts that are best for people that have dyslexia. But Comic Sans is recommended by The British Dyslexia Association and the Dyslexia Association of Ireland. And there are some other really great posts that talk about the benefits of using a font like Comic Sans because the typeface has long ascenders and descenders and generous letter spacing and asymmetrical lowercase b and d to then help distinguish those letters. And I just thought that was so cool. This font that everybody wants to rip apart because it seems whimsical, unprofessional gets overused. There are lots of reasons, I suppose. [laughs] But there's a really big benefit to it, and it can help others. And I just found that very whimsical in itself. CHRIS: I love the idea that there are multiple levels of knowing about Comic Sans. First, you're just like, I don't even know the name, but it's that comic book-looking font. And then obviously, the next step is to be like Comic Sans? How could you ever use that? It's an atrocity. And then it's like, but actually, Comic Sans has some things going for it. And it is a really interesting consideration and something that you wouldn't necessarily think of. But then once you learn it, you're like, okay. Man, I wonder how many other things in the world have this interesting shape to them? Hmm. STEPH: Do you know the history behind Comic Sans? CHRIS: I do not. STEPH: I read about it fairly recently, but I'm probably going to botch some of the details. But I believe it was designed or created by Vincent Connare. And it was created for Microsoft. And Vincent was working on a project where I think there was a dog that was essentially going to have these bubbles that would then show you different parts of the application and walk you through the different features. And the dog had a very comic book feel to the character. And so then Vincent designed a font to go along with that comic book character, this dog and came up with Comic Sans. I don't think the dog actually launched with that particular font. But since the font was still developed, it was released as part of the available fonts. And there we go, there is the birth of Comic Sans. And then it just received so much love and ire all throughout history. [chuckles] CHRIS: There's something that you said there that I want to loop back on when you were talking about chatting with Matt Sumner and saying, "Here's this thing, but I don't know how to solve it. So I don't even want to bring it up." I really liked the framing that you gave and the fact that Matt was like, "No, no, we can still talk about it. We can at least explore this thing, have a conversation." I think that's really wonderful. There's a very similar thing that I experience a lot when doing code review, particularly when I'm in more of a leadership role within a team, which is I often want to highlight something that feels a little bit off to me in the code, but I may not have a specific solution. Like, I may see a variable name, or I may see a controller action that feels like it's the wrong shape or something. And I'll often name it but explicitly say, "I actually don't have a better idea here. So feel free to continue on with this, but I want to name it. So in case that sparks something in you, if you were also feeling some incongruousness, maybe it's worth you spending another minute to think about it, but I want to make sure my comment isn't blocking or otherwise making you feel uncomfortable." If I just come to you and I'm like, "This feels wrong," and that's all I say, that to me is unacceptable code review. Because now I want all of my code review feedback to be very actionable, it's either here's the thing that I feel strongly I think we should definitely change this. If you disagree, let's have a conversation. But yeah, this one definitely needs to change. Here's the thing that, like, I don't know, maybe we could break this into two lines and split it up. But if you don't like that, that's fine. Do whatever. And so then it's I've given the person my thoughts but given them clarity and a free rein to do whatever they want with that information. And then there are ones where I'm like, I don't even know what I think we should do here, but I think something. But if you don't have any ideas...like, I don't have any ideas specifically. If you don't have any ideas, it's fine. We'll continue on with this and maybe revisit it down the road. But I want to make sure each of those different tiers is actionable for the other person, and I'm not just giving them homework or something to be sad about because that would be bad code review. STEPH: I'm just imagining a PR comment that says, "I don't know what we should do here. But I don't think this is it," [laughs] and that just creating sadness. That's so interesting to me because I have flip-flopped with that opinion in regards to there are times that I very much resonate and do what you just said where I will point out to someone where I'm like, "I'm not sure why, but I just have concerns about this. And I don't know if you also ran into anything that was weird about this and would like to talk about it. I don't have any really great ideas, so I think this is good for now. And we should keep moving forward, so we're not blocked on it," but just wanted to, as you mentioned, highlight it in case it sparks something for the other person or for someone else that's reviewing the code. And then there are other times where I'll look at something, and I'm like, "Yeah, it's not great. There's something that feels brittle or potentially maybe hard to maintain or things like that. But I don't have a better idea." And I don't comment on it because I'm like, I don't want to distract that person or block them. And I do think it's good enough, and I don't have anything to add to the conversation, so I just leave it out. So it's interesting to me where is that line of when I feel like it's important enough to comment to then potentially spark some conversation versus just letting it go so then I don't add any distraction to their work? CHRIS: I think it's when the spidey-sense gets past 47%. It's a very specific number. I do the same thing where there's something, and I'm like, you know what? I can't even clearly express what about this makes me feel something off, and so I won't even comment on it, and I agree. And then there are things that trip past some magical line in the sand. And I'm like, you know what? I think I'm going to say something here, but I don't even have a recommendation. And then there's a whole spectrum of the nature of code review and, again, 47% being the specific number. STEPH: There's actually a thoughtbot blog post that correlates nicely to that concept of spidey sense. It's written by Mike Burns, and it's titled How to Skim a Pull Request. But essentially, grabbing from one of the lines here is where Mike presents an unexplained, incomplete, and arbitrarily grouped list of keywords that will cause us thoughtboters to read your code with more care and suspicion. [laughs] That feels perfectly aligned with that idea of spidey sense, spidey-sense 101. I'll be sure to include a link in the show notes. Or, you know, 40%. CHRIS: I think it was 47%. It's a very precise number. [chuckles] STEPH: Very precise nonsensical number. Got it. [laughs] CHRIS: If I'm making up fake statistics, I'm not going to have them round to an even 10. [laughter] STEPH: Makes it seem more legit somehow. CHRIS: Exactly. STEPH: But that's really the novelties that I wanted to chat about. Mid-roll Ad And now a quick break to hear from today's sponsor, Scout APM. Scout APM is leading-edge application performance monitoring that's designed to help Rails developers quickly find and fix performance issues without having to deal with the headache or overhead of enterprise platform feature bloat. With a developer-centric UI and tracing logic that ties bottlenecks to source code, you can quickly pinpoint and resolve those performance abnormalities like N+1 queries, slow database queries, memory bloat, and much more. Scout's real-time alerting and weekly digest emails let you rest easy knowing Scout's on watch and resolving performance issues before your customers ever see them. Scout has also launched its new error monitoring feature add-on for Python applications. Now you can connect your error reporting and application monitoring data on one platform. See for yourself why developers call Scout their best friend and try our error monitoring and APM free for 14 days; no credit card needed. And as an added-on bonus for Bike Shed listeners, Scout will donate $5 to the open-source project of your choice when you deploy. Learn more at scoutapm.com/bikeshed. That's scoutapm.com/bikeshed. STEPH: What's new in your world? CHRIS: I have some follow up on a recent topic that we talked about. So we had a kerfuffle which I described where we had a branch that got merged and the rebase some stuff got out of hand. And so we introduced some process, the protected branch configuration within GitHub that required the branches to be up-to-date before they can be merged and CI to be passing. And everybody was happy. It was like, this is great. Turns out it was never turned on. That's actually the day I was like, man; this is really straightforward. There's been no annoyance here. And then I got to the point where it was like; this seems weird because we just merged a lot of things in rapid succession. I went and checked, and it turns out what I thought was the name of the branch protection rule in GitHub's UI is, in fact, a regular expression pattern. It might not be a full regular expression but like a wildcard pattern for the branch name to match to, and so it's specific. I created this rule, and in small, gray text underneath, it said, "This applies to zero branches." I missed that the first time but then the second time going back, I was like, oh, I actually wanted it to apply to more than zero branches. So I went back in and changed that. It's a great example of very subtle UI that just slipped past me. STEPH: I was going to say in your defense, the very subtle gray font to say, "This applies to zero," feels tricky. CHRIS: That...also, going through the work of creating this thing and if that results in zero branches that would match, maybe that's the thing to emphasize on creation. I would love that. Because in my case, I was trying very specifically to target an existing branch. There is the ability to say, "Oh, any bugfix-* named branch," if you're using branch naming strategies like that, you can use this for that sort of thing. So it may be that currently, there are no branches with that name. But in my case, I was just like, please, main, anytime anything is happening on main, that is what we want to do. I just needed to put the word main there. But anyway, once I actually turned it on, insufferable, absolutely not, cannot survive in this world. We have a relatively small team. There are three of us, and not everyone is even full-time, and my time is pulled in a lot of different directions. So I'm actually not pushing as much code as I might otherwise. Even with that, nope, absolutely not. Our CI is like; I don't know, five-ish minutes per run. Turns out, especially Monday mornings, we have a volley of things that will have been reviewed and trickled in through Friday afternoon. And then there's a bunch of work we want to land Monday morning. And then, just at any point, it turns out, yes, this was untenable. So we have turned it off. I would like to revisit this down the road and introduce the MergeQueue functionality, so the idea of being able to say, "Yeah, you just name when you want something to go in, and then the system will manage the annoying finicky work there." But for now, I had to give up on my dream of everything running on CI, on a feature branch, before it gets merged. STEPH: Ooph, that phrase, "I had to give up on my dream," that breaks my heart for you. [laughs] CHRIS: I may be going a little bit fanciful with my language but, like, a little. STEPH: [laughs] CHRIS: I liked this thing. I want to exist in that world. But it is not feasible given the current state of the world. And that will only get worse over time, is my expectation. So I get to revisit this when I have the time to more thoroughly figure a thing out. But for now, I don't know, merge whatever; it will be fun. STEPH: There's a small part of me that feels a little reassured that it was a terrible time, although I hate that it was a terrible time. But I have felt that pain on so many other projects where I am constantly waiting, and I'm constantly checking to be like, can I merge? Can I merge? Can I merge? And then I can merge, but then someone beats me to it. And I'm like, oh, then I got to restart. And I got to wait, and I'm constantly checking. So that feels like it helps validate my experience. [chuckles] I am excited for that MergeQueue. I would be super excited to try that out and hear about how it goes just because that seems more like the dream where you can just say, hey, I want this PR to go whenever it can go. Just take care of it. I want it to be rebased, whatever the flow is, and have it be merged, so I don't ever have to check on it again. CHRIS: But once we configured this, there was a new thing that appeared in the GitHub UI, which was auto-merge. And so that was a button where I could say like, "Hey, merge this whenever CI passes," which was a nice upgrade, but it didn't have the additional logic of and rebase as necessary. Or the more subtle logic of like, you don't actually want to rebase where you have five different branches that are all trying to merge, and they keep rebasing. You want to have the idea of a queue, and so you get in line. And you rebase when it's your turn, and then you run the CI. And you try and be as smart as possible about that. If anyone at GitHub is listening, I would love if you all threw this into your platform, and then you could ping Slack if anything went wrong. But otherwise, there are, like I said, existing tools. At some point, I will probably, I don't know, over a long weekend or something like that, sit down with a large cup of coffee and explore these. But today is not that day. STEPH: I'm excited to hear about that day. CHRIS: So that is a tale of woe and sadness. But luckily, I get to balance it out with a tale of happiness and good outcomes. So that's good. The happiness and good outcome story does start with trouble, as they always do. So we had a bug that occurred in the application where something was supposed to have happened. And then there was an email that needed to go out to tell the user that this thing had happened. And the bug popped up within AppSignal and said something was nil that shouldn't have been nil. Particularly, we're using a gem called Time For a Boolean, which is by Caleb Hearth. And he's a former thoughtboter and maintains this wonderful gem that instead of having a Boolean for like, is this thing approved, or is it paid? Or is it processed? You use a timestamp. And then this gem gives you nice Boolean-like methods on top of that timestamp. Because it turns out, very often just having the Boolean of like, this was paid, it turns out you really want to know when it was paid. That would be a really useful piece of information. And so, while you're still in Postgres land, it's nice to be able to reach for this and have the affordances of the Boolean-like interface but also have the timestamp where available. So anyway, the email was trying to process but that timestamp...let's pretend that it was paid as the one that matters here so paid at was nil, which was very concerning. Because this was the email that's like, hey, that thing was processed. Or let's say it was processed, actually, because that's closer to what it was. Hey, this thing was processed, and here's an email notification to tell you that. But the process timestamp was nil. I was like, oh no. Oh no. And so when I saw this pop up, I was like, this is very bad. Everything is very bad. Oh goodness. Turns out what had happened was...because I very quickly chased after this, looked in the background job queue, looked in Sidekiq's UI, and the job was gone. So it had been processed. I was like, wait a minute, how? How did this fix itself? Like, that's not the kind of bug that resolves itself, except, in this case, it was. This was an interaction that I'd run into many times before. Sidekiq was immediately processing the job. But the job was being enqueued from within the context of a database transaction. And the database transaction had not been committed yet. But Sidekiq was already off to the races trying to process. So the record that was being worked on, the database record, had local changes within the context of that transaction, but that hadn't been committed. Sidekiq then reads that record from the database, but it's now out of sync because that tiny bit of Sidekiq is apparently very fast off to the races immediately. And so there's just this tiny little bit of time that can occur. And this is also a fun one where this isn't going to happen every time. It's only going to happen sometimes. Like, if the queue had a couple of other things in it, Sidekiq probably would have not gotten to this until the database transaction had fully closed. So the failure mode here is super annoying. But the solution is pretty easy. You just have to make sure that you enqueue outside of the database transaction. But I'm going to be honest, that's difficult to always do right. STEPH: That's a gnarly bug or something to investigate that I don't think I have run into before. Could you talk a little bit more about enqueueing the job outside the database transaction? CHRIS: Sure. And I think I've talked about this on a previous episode a while back because I have run into this one a few times. But I think it is sufficiently rare; like, you need almost a perfect storm because the database transaction is going to close very quickly. Sidekiq needs to be all that much more speedy in picking up the job in order for this to happen. But basically, the idea is within some processing logic that we have in our system; we find a record, we do some work. And then we need to update that record to assign this timestamp or whatever it is. And then we also want to inform the user, so we're going to enqueue a job to send the email notification. But for all of the database work, we are wrapping it in a transaction because we want it to either succeed or fail atomically. So there are three different records that we need to update. We want all of them to be updated or none of them to be updated. So, therefore, we wrap it in a transaction. And the way we had written, this was to also enqueue the job from within the transaction. That wasn't something we were actively intentionally doing because those are different systems. It doesn't really mean anything. But we were still within the block of ApplicationRecord.transaction do. We're now inside of that block. We're doing all of the record updates. And then the last piece of work that we want to think about is enqueueing the job to send the email. The problem is if we're still within that database transaction if it's yet to be committed, then when Sidekiq picks up that job to run it, it will see the prior state of the world. And it's only if the Sidekiq job waits a little bit that then the database transaction will have been committed. The record is now updated and available to be read by Sidekiq in the correct updated state. And so there's this tiny little bit of inconsistency that can happen. It's basically because Sidekiq is going out to Redis, which is a distinct system. It doesn't have any knowledge of the database transaction at play. That's why I sometimes consider using a Postgres-backed background job system because then actually the job can be as part of the database transaction. STEPH: Cool. That's helpful. That makes a lot of sense the way you explained the whole you're actually enqueueing the job from inside that transaction. I'm curious, that prompts another question. In the case where you mentioned you're using a transaction because you want to make sure that if something fails to update so, everything gets updated together, in the event that something does fail to update because you were previously enqueueing that job from the transaction, does that mean that the update could have failed but that email would still have gone out? CHRIS: That does not. And the reason for that is because we're within dry-monad world. And so dry-monad will implicitly capture the ActiveRecord rollback, which I think is an exception that gets raised or somehow...But basically, if that database transaction fails for any reason and ends up getting rolled back, then dry-monads will not continue processing through the rest of the sequential operation. And so, therefore, even if we move the enqueuing of the email outside of the database transaction, the sequential nature of that processing and the dry-monad stuff that we have in play will handle that. And I think that would more generally be true because I think Rails raises an exception on rollback. Not certain there. But I know in our case, we're fine on that. And we have actually explicitly checked7 for that sort of thing. STEPH: So I meant a slightly different question because that makes sense to me everything that you just said where if it's outside of the transaction, then that sequential order won't fire because of that ActiveRecord migration error. But when you have the enqueuing inside of the transaction because then that's going to be inside of the sequential order, maybe before the rollback error gets raised. Does that make sense? CHRIS: Yes. I think what you're asking is basically like, do we make sure to not send the job if the rest of the stuff didn't succeed? STEPH: I'm just wondering from a transaction perspective, actually. If you have a transaction wrapped block and then you have in there, like, update this record, send email, end block, let's say update...well, I guess it's going raise because you've got probably like an update bank. Okay, so then yeah, you won't get to the next line. Got it. Got it. Got it. I just had to walk myself through that because I forgot that you probably...I have to visualize [laughs] as to what that code probably looks like. All right, that answered my question. CHRIS: Okay. So back up to the top level then, this is the problem that we have. And looking through the codebase, we actually have it in a bunch of different places. So the solution in any one of those cases is to just take the line of code where we're saying enqueue UserMailer.deliver_later take that line of code, move it outside of the database transaction, and make sure it only happens if the database transaction succeeds. That's very easy to do in one case. But my concern was this is a very easy failure mode to end up in. And this is a very easy incorrect version of the code to write. As far as I can tell, we never want to write the code where this is happening inside of the transaction because it has this failure mode. But how do we enforce that? That was the thing that came to mind. So I immediately did a quick look of like, is there a RuboCop thing I can do here or something? And I actually found something even more specific, which was so exciting to find. It's a gem called Isolator. And its job is to detect non-atomic interactions within database transactions. And so it's fantastic. I was like, wait, really? Is this going to do the thing? And so I just installed the gem, configured it where I wanted, and then ran the test suite. And it showed me every place throughout the app right now where we were doing this pattern of behavior like enqueueing work from within a database transaction, which was great. STEPH: Ooh, that's really nifty. I kind of want to install that and just run it on my current client's codebase and see what I find. CHRIS: This feels like something like strong migrations where it's like, yeah, this is great. I kind of want to have this as part of my core toolset now. This one feels even perhaps slightly more so because sometimes I look at strong migrations, and I'm like, no, no, no, strong migrations, I get why you would say that, but for reasons, this is actually fine. And they have configurations within it to say, like, no, this is okay. Isolator feels like it's always telling me something I want to know. So this, very quickly, I'm like, I think this might be part of my toolset moving forward on every single app forever. And actually, there's another gem that I used. It's made by the same team. So this is from the folks over at Evil Martians, which is another Rails consultancy out there in the world. And the Isolator gem is one thing that they've produced. And then I think the same author of it who is an Evil Martian's employee created the aftercommiteverywhere gem. So aftercommit is one of Rails' ActiveRecord callbacks. But in this case, it allows you to use it everywhere, as the name implies. And so rather than actually having to take that line of code out of the database transaction block, which is naturally where we would write it because that's how we think about the code and how we want to express it, you can just use this aftercommit method, wrap the call in that, so it's after_commit, and then a block. So either braces or do..end. That enqueueing of the email now just gets wrapped in that. And so what that does is it says, "Defer this until after the transaction commits. If the transaction does not commit, if we roll it back, then don't run it." And what was nice is the actual code change when I finally submitted all of this was add the gem to the gem file. And then everywhere that we're doing the wrong thing, which running the test suite told me, I just went in, and I wrapped that line in after_commit and a block. And it was such a nice, clean...like, I didn't have to move the code around or actually shift the lines, which was my first attempt at this. I was able to just annotate each of those lines and say, "You're special, you're special, you're special," And then I'm done. And again, the first gem told me every case where I needed to do that. It's like, well, this is a wonderful little outcome here. STEPH: That's really nice, yeah, how you can make the changes and then, like you said, re-run the test or re-run that gem, and it lets you know what else still needs to be updated. I'm intrigued where you mentioned you didn't have to move any lines, though. Maybe I just need to look at the gem and see it, but I'm still envisioning that you have your transaction do block. And then you're doing some things; you're updating records, and then you have your end. And then after that, it's when you want to enqueue the email. And with this after_commit, you actually added that method call inside of the transaction but then wrapped the call to Sidekiq to send the email inside of that block. CHRIS: Correct. Yeah. So it's basically like saying, "Here's almost an anonymous function." If you think about a Ruby block in that nomenclature, you're saying, like, here's some work to do when and if the transaction succeeds. And so it meant that I was able to keep the code in the way that we as humans would talk about it but deal with the murky details, and edge cases of database transactions, and Sidekiq, and whatnot. Sort of just handle it by saying like...it almost feels like an annotation or a decoration or something like that. But it was this, in my mind, almost like a perfect melding of I don't want to think about this. Oh, cool. Okay, here's a quick, easy way to deal with it but to not have to fundamentally change how I write the code. STEPH: Interesting. So I like all the things you're saying. I'll be honest, I'm not totally sold, and I'm trying to think of why. I think the benefits...one, as you mentioned, it's something you don't have to think about or at least signals to others that hey, maybe you should think about this to the extent that you use after_commit. And so that way, you don't have these asynchronous events taking place inside the transaction. So I like that visibility and communication to the rest of the team. Putting it inside of the transaction feels interesting. I don't know why; I feel a little weird about this. [laughs] I'm bringing my true self. CHRIS: That's fair. So if we're being honest, I solved this first by finding the Isolator gem. Well, I solved it first by just doing it manually. I went through the app, and I found all the places. And I was like, you know what? I'm worried that the next person authoring code like this, it's so easy to fall into this trap. Like, this is such a subtle little thing that our brains are not thinking about. And so I had first fixed it, and so I had a diff that involved moving lots of lines of code, every instance of this moved from being in the database transaction out of it. And that was fine. I was fine with that as a solution. But it was a little bit noisy because I was moving a bunch of lines. So then I brought in the Isolator gem. I actually reset that, and I went back to before I had made the fix, ran the test just to make sure Isolator was actually finding every instance. They did; that was great. So I was like, all right, cool. This is better because now I have this thing that will tell anyone when this happens. So I'm very happy about that. Because frankly, this is some hard-earned knowledge that I had to read Sidekiq and remember how database transactions work and convince myself of what was going on here and finally come to what I believe the solution is. And now Isolator is just like, cool, that's encapsulated. And it gives a very nice failure message in the test suite. So it's like, excellent. I really like this. But still looking at it, the diff, the amount of code that I had to change, it's like, well, naturally, this is how we want to write this code, but for reasons, we can't. And it's appeasing the computer more than it's appeasing the reader or the author of the code. And so then I happen to be reading through the Isolator gem's README, and they mention the aftercommiteverywhere gem. And I was like, oh, that's interesting. So one more time, I reset. And then I really tried fixing it with after_commit. And the look of the diff there felt nice to me because the lines got a little more on them, but they didn't move. And so it's like, this is how we naturally would have authored it, and now it works correctly. And I liked that. But I understand your hesitation because you're like, but the thing is, it's wrong. And so you've made the wrong not wrong anymore, but you didn't...and so I get your hesitation. I still like the fancy version. STEPH: Yeah, I think you just helped me figure out my grumpiness with it or why I'm not totally sold on it. And it was in regards to adding a dependency to avoid a noisy diff is the oversimplified version that I was processing or the reason that I was a bit grumpy about adding this other gem for that. But then you also just brought a lot of other really good reasons. One thing that you said that I do really like is adding tools that help us author code in a more natural style, the way that we want to highlight this process, and how this application does work, and how this business logic flows. So given in that light, that makes me feel better about it. But yeah, I think that was my initial grumpiness. I was like, it'll be a noisy diff. It's okay. CHRIS: I think I definitely share your hesitation, or you're like, hmm, that's an interesting reason to bring more code into the application. But at the same time, I think the counterpoint that comes to mind for me is we're using Ruby because of its expressiveness; at least, that's why I'm using Ruby. I really want the code that I write to be as close as possible to the thing that I would say to another human about like, oh okay, when a user signs up for the application, we need to create a record in our system, and then we need to send them an email. And then we need to do this other thing. And so, the closer that our code is to those words that I would use to describe to another human, the happier I am. And I will put in some pretty significant effort to hold that line as long as the code can also be correct. And so, the Isolator gem here does a great job of enforcing that correctness. And then after_commit allows me to still maintain that expressiveness and not have to think about the murky details as much or not have to reshape my code to match the murky realities of different persistence engines. But I do agree. I think it's a good thing to look at and ask, like, is it worth it? Are you sure? And in this case, I will say, "Yeah, I think so," but with that amount of certainty in my voice, [chuckles] which is not a ton. STEPH: I think this is going back to my days of working with dependency bot PRs where every time there was an upgrade for a gem, I always ask, what do you do here? [chuckles] Do we need to upgrade you? Can we just remove you from the codebase? So I'm fairly...I don't know, resistant is a strong word. I'm skeptical of when we're adding stuff in, and I just want to question the value that it's adding. But I want to circle back to something that you said, and that is hard-earned knowledge. And that part I understand so much where when you have gone through a fair amount of work to uncover an issue, and then you want to make sure that others don't have to go through that. This is a really nice way to highlight; hey, there's something that's tricky about computers and software here, and we need to watch out for that. And I want to help you lookout for that. Versus this is just inherit information where this needs to happen outside or after that transaction. And so that makes a really nice entry point where someone can look to say, "Why did we add this gem?" And then there's a commit message that goes with it that explains this is why we use this after_commit gem because we're specifically looking to avoid this type of bug. And I love that. CHRIS: Yeah, I think more lines of git commit message than diff on this one. So yeah, I wrote a short novel describing all of the features, describing the different pieces that are coming together. And then it's actually a +28 -6 diff. So it's a very small code change. But yeah, lots of story captured there. STEPH: And if you had just moved the lines, you could still have that commit message. But it's not likely that someone's going to look up that git commit change or that message that went along with it because they're not going to know to blame that one. But if they look at that particular edition of after_commit, they're more likely to find that historical context. So long story short, I think you have walked me through my initial grumpiness and provided some really good ways to avoid that really tricky failure mode for other developers. CHRIS: Well, thank you. I'm getting Steph's seal of approval starting from grumpy places. [laughs] I feel good. All right. STEPH: I'll have some special Stephanie's approval stickers designed and printed for you. CHRIS: I hope you're not joking because I very much want a yellow heart that says, "Steph-approved." STEPH: [laughs] CHRIS: And I can put it on PRs, and I can put it on the wall. [laughs] STEPH: Well, now I have to find a sticker designer and make a...well, it's just a yellow heart. I can probably handle this. I'm going to use Comic Sans. That will be the approved part. [laughs] Yellow hearts and Comic Sans for everybody. CHRIS: Well, with that absolutely fantastic call back to earlier parts of the episode, shall we wrap up? STEPH: Let's wrap up. CHRIS: The show notes for this episode can be found at bikeshed.fm. STEPH: This show is produced and edited by Mandy Moore. CHRIS: If you enjoyed listening, one really easy way to support the show is to leave us a quick rating or even a review in iTunes, as it really helps other folks find the show. STEPH: If you have any feedback for this or any of our other episodes, you can reach us at @_bikeshed or reach me on Twitter @SViccari. CHRIS: And I'm @christoomey STEPH: Or you can reach us at hosts@bikeshed.fm via email. CHRIS: Thanks so much for listening to The Bike Shed, and we'll see you next week. All: Byeeeeeeee! Announcer: This podcast was brought to you by thoughtbot. thoughtbot is your expert design and development partner. Let's make your product and team a success.

Greater Than Code
254: Transitioning Into Tech with Danielle Thompson

Greater Than Code

Play Episode Listen Later Oct 13, 2021 51:28


01:17 - Danielle's Superpower: Empathy & Communication 01:56 - Going From the Hospitality Industry => Tech * @CodeSchoolQA (https://twitter.com/codeschoolqa) / twitch.tv/thejonanshow (https://www.twitch.tv/thejonanshow) 04:58 - Education Technology (https://tech.ed.gov/) (EdTech) * Disruption = Reinvention 07:18 - Anthropology + Tech / Working With People * Anticipating Needs 10:25 - Making Education Fun + Inclusive * Cultural Relevance * Revamping Outdated Curriculum * Connecting With Kids 16:18 - Transitioning Into Tech 27:57 - Resources * Learnhowtoprogram.com (https://www.learnhowtoprogram.com/introduction-to-programming/getting-started-at-epicodus/learn-how-to-program) * Documentation * YouTube (https://www.youtube.com/) * Community * #TechTwitter (https://twitter.com/search?q=%23TechTwitter&src=typed_query&f=live) * Virtual Coffee (https://virtualcoffee.io/) * Twitch (https://www.twitch.tv/) 32:39 - @CodeSchoolQA (https://twitter.com/codeschoolqa) / twitch.tv/thejonanshow (https://www.twitch.tv/thejonanshow) 34:08 - The Streaming Revolution * New Opportunities For Connection * Hybrid Events * Introvert Inclusive * Accessibility * Reaching New Markets 39:45 - Making Tech Safe, Secure, and Protected * Greater Than Code Episode 252: Designing For Safety with Eva PenzeyMoog (https://www.greaterthancode.com/designing-for-safety) 44:03 - Advice For New Devs: Work on Technical Things Sooner Reflections: Mandy: The secret in tech is that nobody knows what they're doing! Danielle: Ask questions and lean into community. Tech needs you. Arty: Don't be afraid to reach out to community members for help. This episode was brought to you by @therubyrep (https://twitter.com/therubyrep) of DevReps, LLC (http://www.devreps.com/). To pledge your support and to join our awesome Slack community, visit patreon.com/greaterthancode (https://www.patreon.com/greaterthancode) To make a one-time donation so that we can continue to bring you more content and transcripts like this, please do so at paypal.me/devreps (https://www.paypal.me/devreps). You will also get an invitation to our Slack community this way as well. Transcript: ARTY: Hi, everyone. Welcome to Episode 254 of Greater Than Code. I am Arty Starr and I'm here with my fabulous co-host, Mandy Moore. MANDY: Hey, everyone! It's Mandy Moore and I'm here with our guest today, Danielle Thompson. Danielle is a newly minted software engineer working in the education technology sphere of the nonprofit world, after making a major career change from working in hospitality and events for many years. As a code school graduate herself, she loves to help demystify tech for others with non-traditional backgrounds and works to open doors into tech with her friends at Code School Q&A, weekly on Wednesday nights at around 7:00 PM Pacific at twitch.tv/thejonanshow. Outside of work, she can typically be found with a nose buried in a book, hanging out with her doggo, and making delicious craft beverages. Welcome to the show, Danielle! DANIELLE: Thanks so much for having me, Mandy and Arty! MANDY: Awesome. It's great for you to be here. So before we get into the meat of our conversation, we always ask our guests the standard question of what is your superpower and how did you acquire it? DANIELLE: Totally. I think that my superpower is a combination of empathy and communication. I think I came by both pretty naturally—popped right out of my mom having both, I'm assuming. But both have definitely been amplified over the years by all sorts of experiences and hardships and just keep working to make them even more of a superpower. MANDY: That's really great. So I want to know about before we dive into your experiences as a new developer, I wanted to know about how you came into technology from your career change in hospitality, because I did the same thing. I was a waitress when my daughter was born 10 years ago and I was working for about a year before I was able to walk out. It was Mother's Day, my boss was being a complete jerk to me, and I was making enough money at that point that I just said, “You know what? I don't need this. I quit,” and I started my career in tech full-time. So I'm curious about your journey as well. DANIELLE: Yeah. Obviously, COVID has happened in the last couple of years and that was one of the major factors in me getting to this point of leaving hospitality and getting into tech. But I had already kind of been thinking about what comes next. I've been a manager for a few years and was trying to figure out how else I could grow and what new things I can learn and challenge myself with. And outside of ownership, which is a major headache, there wasn't really much that I could push further into, within hospitality. So when COVID happened and I lost my job because I was working as an events and bar manager for a local catering company, it was pretty obvious that things were not going to be coming back for the hospitality industry anytime soon and I needed to figure something else out then. And so, I started looking into different returning to education opportunities because I actually have an anthropology degree, of all helpful things that I could have gotten a degree in. But I found a code school in Portland, Oregon and jumped on that within a few months of COVID hitting to the full-time track and connected with a number of my cohort mates that we started doing the Code School Q&A on Twitch with the director of developer relations at New Relic and have been doing that for almost a year now and have officially made it in the industry as a software developer, too in the last few months. So you can do it, you can get into tech. [laughs] It's pretty funny, too because the type of job that I ended up getting is in education and technology sphere and I actually had a job in ed tech about a decade ago when I was still in college and had a remote job working with some family friends that got me hooked up with their company. And here I am doing something a little bit more in-depth technically than I was doing a decade ago, but it's funny how things come full circle. ARTY: Well, education in particular is something that also really needs some reinvention and innovation and with all the disruption, where do you see that area going? Just curious. DANIELLE: Yeah, absolutely. I feel that a lot of the changes that we've seen in COVID with remote work being such a prominent thing now and people wanting more balanced, more time with their family, more time with their critters, more time just not being miserable and commutes and stuff. I think that that's going to have a really long-term effect on how education happens and trying to make education more quality as well. I think it's really rad what the company I do works for. Our whole mission is to work to make education in America more equitable. So we do that by working very hard to work with experts in the curriculum sphere that ensure that our curriculum materials are as inclusive and culturally relevant as possible, that they are representative of a large and diverse group of people, and they even do a ton of anti-racism work as well and work to embed that within our internal and external culture, as well as the products that we create. So I hope that our company will continue to grow and make changes in the education world in America in general, because I think what we're doing is really, really, really important. ARTY: Definitely important and with all the change and stuff happening, I'm expecting some new and cool and exciting things that do make things better. One of the upsides of lots of disruption is it's an opportunity for us to sit back and rethink how things could be. DANIELLE: Yeah. ARTY: And one of the benefits of not being entrenched in the existing fields of the way things have been is it's also an opportunity to look at all the stuff we're doing with a fresh set of eyes from outside of that existing world and bring some new fresh insights to tech. Maybe my anthropology degree will come in handy in some different sorts of ways. I imagine some of those skills that you learned in that have some applicability in tech as well. Have you found your degree helpful in other ways? DANIELLE: It's funny. I think I ended up using my anthropology degree as a bartender far more than I ever would have as an actual anthropologist. That whole study of humans thing is something that is directly translatable to working with people no matter what field you're in. I feel that both my anthropology degree and my many years of hospitality experience have all led to a specific skillset that is very different from a lot of people that come into tech with more traditional backgrounds especially folks that go to college and get computer science degrees, and then they go to the tech industry and that's all they've ever known. I've known so many other experiences outside of that and my ability to think about what other people need and want, to be able to respond to that, and embed that in all of the work that I do as an engineer to really be thinking about the user and the people that are interacting with whatever I'm building and even just thinking about working on a team and how I have so many communication skills built up from what I've been doing for work in hospitality for many years. I think that it definitely gives me a very specific and unique way of moving through the world and way of being an engineer as well. That anthropologist hat definitely comes into play sometimes thinking about like, “Oh, like how do all of these dots connect?” and like, “How does this change over time and how do you see people like doing things differently now?” It's a definitely a fun lens to carry with me. MANDY: Yeah. Having been done hospitality, I'm just shaking my head because – [laughter] I know I've brought so many skills from being in that world for 10, 15 years at one point. DANIELLE: Yeah. MANDY: Just the way you talk to people and interact with teams and anticipate what other people need before they even know what they need, that's definitely a skill. DANIELLE: Yeah, definitely. I think that whole anticipating needs thing, too, it's like it can be both an internal and external benefit where you can think both about who you're building products for and also who you're building products with, and how best to communicate within teams, especially having management experience. That is definitely at the forefront of my brain a lot of the time, but then also thinking about like, “How can I make the best experience for somebody else that's actually going to be using this? How can I make this easy and intuitive and fun?” Especially within education, have to make sure that things are fun and interesting targeting kids that are K-12; it has to be meaningful, impactful, interesting, and engaging. MANDY: So how do you do that? What are some ways that you and your company make education fun for young kids? DANIELLE: I think I'm still figuring that out. We have many curriculum products that I'm still just touching for the first time, or haven't even looked at it yet and so, there's lots of fun, new things to discover. But I think the types of people that we bring on to work at my company, they're all experts in their field and renowned for the work that they do and so, I think that the quality of people that we bring into work with us and the kind of commitment that they have to work towards making education better and more inclusive, that is incredibly important. And how they also do an immense amount of work to make not just inclusivity a part of the major formula, but also that they work to make things culturally relevant. So like, thinking about how to tell stories to kids that actually means something to them today. I don't know, a weird example is thinking about some outdated curriculum that's talking about using a landline for a phone, or something. Kids are like, ‘What's that?” Actually integrating modern things like cell phones and things like that into the curriculum where kids actually touch that and use that every single day so it means something to them. Whereas, outdated curriculum that is just some story to them. It doesn't have tangible meaning. Being able to bring that into materials is really important to keeping things engaging and also, relevant and fun. MANDY: So the time when little Tommy was walking to the Xerox machine. DANIELLE: [chuckles] Yes, yes. MANDY: Somebody brought up a Xerox machine the other day. DANIELLE: Oh wow. MANDY: My goodness. DANIELLE: [laughs] Yeah, definitely. But I think it's just a constant looking at how we do things, and making improvements and making real connection with the people that are actually using our products to use. That both means working with teachers and getting a better understanding of what is helpful to them, what makes things easier for them, what helps them bring better quality curriculum to their classrooms? But then I think it's also connecting more directly with those kids that are engaging with our curriculum, too and figuring out what works and doesn't work for as many parties as possible. I think that's the anthropologist hat coming on again like, how can we bring as many people to the table as possible on the expert side, on the academic side, on the teacher side, on the student side? And even working to bring families to the table, too and looking at how families interact and not just parents, because it's really important to know that kids don't have just parents that are taking care of them—sometimes it's grandparents, sometimes it's foster families. And really thinking about a wider range of who is around these kids, and how to get them onboard and make things easy for them to interact. ARTY: It seems like getting into tech and these new tech skills that you've learned are also relevant in figuring out how to teach kids tech because we've got this new generation of kids coming into the world and learning how to code becomes more like learning how to read and write is fundamental skills move forward in the future. Are there ways that some of the things that you've learned through your own tech experiences you can see application for in education? DANIELLE: Absolutely. From what I've been seeing, I feel like there are a lot more resources out there for teaching kids how to code and teaching them more things about technology. I think that's amazing and should totally keep happening. I think having been a bit more focused on adults in my own outreach for helping people find their ways into tech I might be a bit more acquainted with reaching out to those folks. But I'm sure that that intersection of being in education for K-12 students and this passion that I have of helping to find their way into tech, or build more technical skills because they are skills that are so transferable in many industries. I'm in education, but I have a technical job. So there's lots of ways that those technical skills can be incredibly valuable and frankly, life-changing. The amount of opportunity and even just financial stability that can be found within tech is one of the main reasons that brought me to this industry and has really been a life-changing opportunity. It has opened so many doors already and I'm just like three months into my first developer job. Even before I was ever actually officially an engineer, I was able to find community and able to find an outlet for helping others and outreach to immediately turn around and hold a handout to try to help others make their way into tech as well. I hope to continue doing that work in more meaningful and impactful ways over time, and have wider and wider reach as well. ARTY: You had mentioned earlier about some of the difficulties of getting into tech and some of the challenges with finding resources and things that you were specifically missing when you actually showed up on the job. I'm curious, what was your experience like going through coding bootcamp and what were some of the gaps that you experienced that once you got on the job, you were like, “Oh, I didn't learn that.” DANIELLE: Yeah, definitely. Coding bootcamp was an incredibly grueling experience for me personally. I was on a full-time track six-month program and [chuckles] not having much technical experience whatsoever outside of editing my Myspace profile back when that was a thing and having [laughs] about a decade ago doing some basic HTML, CSS editing and maintenance for the company that I worked for an ed tech originally. That was what I was working with when I started coding bootcamp. So it was a real hard learning curve and a very fast-paced program for me to just dive into headfirst. My poor partner was like, “I basically didn't see you for six months. You were just a basement dweller at your computer constantly.” I would literally get out of bed, roll myself downstairs, get to my computer with a cup of tea in hand, and I would stay there until easily 10:00, 11:00, 12:00, 1:00 every night just trying to keep my head above water. But a few months in, things started to click and I wasn't fighting with all of these computer puzzles [chuckles] trying to do this. Like, I always feel like learning coding languages is a combination of algebra and a foreign language. So at a certain point, my brain just started getting into that better and things started making sense. That was a very exciting moment where I got much less miserable [chuckles] in my code school experience and in the pace at which I had to move to keep my grades up and everything. But the gap in between finishing code school and actually getting that first job is also another often-grueling process. There's so many jobs open in the tech industry, but basically, it's mid-level and above. It's like, I think two-thirds of the industry positions that are available are for mid to senior roles versus one-third of roles that are for junior associates. That is a big struggle, especially if you're not able to lean into community and building real connections, just sending applications out to the ether and never even hearing a peep back from companies. I think that whole experience, it's really hard for yourself esteem, especially having put in many months around the clock of work towards this new career that you've been told that you can get, that you can achieve. It's almost as much as a process getting that first developer job as it is to actually build those tech skills. I think one thing that is so important to stress in that in-between time is to lean into community, to connect with as many people as you can that are already in tech, even if they don't exactly have a developer job. Like, talk to anybody that will let you talk to them—talk to people in QA, talk to developers, talk to managers, talk to project managers. That was one of the things that I felt I needed to do early on in my coding experience to really have a better understanding of what was even an option for me of getting into tech and what could all these different jobs look like, and then making that transition to actually getting the first job. Yay, hooray for first jobs and being employed again. But I think one of the things that has been most striking in that change for me is going from this incredibly grueling pace. 8:00 in the morning, or so until 10:00 plus at night, non-stop coding for the most part, and then going to a 9:00 to 5:00 job where I can also make my own hours and I can take appointments as I need to. Like, I can go and get a haircut if that's something on my schedule and it's cool. As long as I'm getting my work done and showing up and contributing to my team, things are fine. So that transition of like, “Wait, I don't have to be at my computer a 1,000% of the time?” [laughs] and the pace at which you learn things, too is just much slower because you can have balance. That transition of feeling like you're not doing enough because you're so used to this hefty schedule, that's been a major transition for me. I think also coming from hospitality, too where you have to be there in person and oftentimes, somebody is going to call out sick at least every other week, or so. So you might be working like a shift and a half, or a double. There isn't a lot of balance in the service industry, especially now with COVID adding so many extra layers of complication to how that job works. Being able to just be like, “I need to go make a doctor's appointment,” and can just do that. It's like, “Okay, cool. Just put it on the calendar. You don't really need to tell me. As long as it's on the calendar, that's great.” [laughs] That transition has also been very strange. And I think maybe just the trauma of [chuckles] working in hospitality and not being able to just be a human sometimes and now all of a sudden, I'm like, “Oh, I'm a human and that's allowed? Okay.” Still have to check in with my boss frequently about like, “You sure it's okay? You sure it's okay that I'm a human, right? Yeah.” [laughs] MANDY: [chuckles] That was one of the things that I really loved coming into tech was the scheduling, open schedule, making my own hours. DANIELLE: Yeah. MANDY: And you're right, it was very strange at first. When I was waitressing, it was just always a go, go, go kind of thing and you had to be there, you had to be on, and if you didn't have tables, if you had time to lean, you had time to clean. DANIELLE: [chuckles] Yeah. Always be closing. You know, ABCs. [laughs] MANDY: So yeah, sometimes I still find myself on a random Thursday. I'll have my work done and I'll just be sitting here and I'm like, “Why are you sitting at your computer? Go do something, then check it and if there's stuff there –” Like, you don't have to have your ass in the seat from 9:00 to 5:00, or 8:00 to 4:00. You don't have to sit here for 8 hours and just stare at your inbox waiting for work. It's totally asynchronous and it's totally okay. I find myself having to give myself permission to leave my desk and just go and do something and work that asynchronous schedule. So tech is a really big blessing when it comes to that. DANIELLE: I totally agree. I think also, not being neurotypical myself, I have ADHD, and so, being able to actually allow my brain to work in the way that is best for how my brain just naturally operates. Like, I can sit at my desk and fidget constantly, and it's not going to bother anybody because I work from home, [chuckles] or I can shift between sitting and standing and sitting on my bed, or sitting on my stool and just move at my desk as much as I need to. I can also step away and go clean some dishes if that's what's making noise in my brain. I can go and take my dog on a walk and get some fresh air. That whole shift of having balance and being able to be empowered to advocate for what I need and how I learn and people are like, “Yeah, cool. Let's do that.” I think that's also very much a part of the company that I work for and the ethos that we have, which is all about making education better. So why wouldn't that also translate to the staff and how can we help you learn? It's such a wonderful thing to be a part of a team that's super invested in how I learn and helping me learn. I think another thing that was a big, strange thing about my transition into tech was I ended up getting a junior engineer role in a tech stack that I hadn't worked with, which is pretty common from what I've heard from mid engineer on. Because once you have some of the foundational building blocks of a handful of programming languages and some of those computer science foundations, you can pick up most programming languages. But it's not so common as a junior engineer to get that opportunity to work with a full tech stack that you haven't really worked with before. So that was another big transition like, “All right, you trust me time to figure this out.” ARTY: So it sounds like you walked into another big learning curve with your new job, too. It sounds like you were also in a much more supportive culture environment with respect to learning and things, too. What was the ramp-up experience like at your new company? DANIELLE: In some ways, I still kind of feel like I'm in ramp-up mode. I'm about three months in. But because we have so much of our product that is built around very specific curriculum components, that has very specific contextual knowledge, it's just going to be a process to figure out which projects have what information and have certain numbers of records, and are tied to certain standards that are required in different states and for common core versus for some of the states that we work with, what that looks like. But figuring out a whole new tech stack was and continues to be a very interesting challenge. I have to remind myself when I have gaps in my knowledge that it's actually to switch gears back into learning mode, that that is a thing that's supported and encouraged even. I even have little sticky notes on my desk that say, “Start with what you know, not what you don't know,” and that tension of when I reached the end of what I know and then going and finding maybe not necessarily the right, or correct resources, because there's so much out there that's good. That can be helpful. I think it's more about finding something that does work with how my brain learns things and being cognizant of how I learn. But also, remembering to dig into that fate that is being a developer, which is constant learning and ever-growing evolution of how we do things, and what things we do within the sphere of the developer. So I've signed up for perpetual learning and that's pretty great. MANDY: What are your favorite resources that you used and continue to use as you're still learning, and finding community, and things like that? DANIELLE: Yeah. I have certainly continued to lean on the curriculum for my school. It's online and it's free and that's rad. It's learnhowtoprogram.com. It's all put on online from Epicodus in the Portland area. Anybody can access it and that's wonderful. I'm a big fan of really great resources being available for free and making that more accessible. So continuing to use platforms that have that kind of ethos in mind is pretty great in my opinion. Reading the documentation is another great way to keep learning what you need to learn and sometimes documentation can be kind of dry, especially as a new developer, you don't always know what exactly it is that you're looking for. So being able to parse through documentation and figure out what's most important, but then also filling in the gaps of some of the things that you don't yet know, or understand with YouTube videos, or deeper dives into like, what does this one specific term mean? I don't know, let's go find out and plugging in some of those gaps is really helpful. I think figuring out how you learn, too whether that be very hands-on, whether that be visually, whether that be with audio, getting lots of repetition in; it's super helpful to lean into whatever works best for your brain for learning. I think perhaps even more important than digging into resources that are online is lean into community. I really can't say it enough, build community. If you work with Ruby, like I work with Ruby, build community within the Ruby community. Connect to people online, get on Twitter, connect to tech Twitter, follow different people that work with the languages and the tech stack that you work with, and join places like The Virtual Coffee and other really rad developer spaces that are meant to help you find the answers that you need and to maybe do it in a way that's a little less arduous because you're with people that are like, “Yes, happy helper.” Like, “How can I make things easier for you?” It seems like a much easier way to go through tech when you can do it with others and remember, that there are human resources out there for you, too. MANDY: You also had mentioned that you were connecting with folks over Twitch. DANIELLE: Yeah. MANDY: Can you tell us a little more about that? DANIELLE: Absolutely. So a friend of mine in my Epicodus cohort, she reached out to the director of developer relations that had done a lunchtime chat with us at one point and she was like, “I don't know what I'm doing. I am so stressed out. I don't know if I can actually finish this school and let alone finish school, but actually make it as a developer and I have questions. Do you have some time for some answers?” And he was like, “Yeah, do you want to actually do this online on Twitch? And how about you bring a couple of friends and let's just ask lots of questions and I'm going to record it?” She reached out to me and another friend of mine and here we are many months later still answering questions online about how to get into tech and what even are some of these things that we're talking about technically, or let's look at other roles outside of just developer, or engineer, that you can get into. So that has been an ongoing theme of how can I help others? How can I help provide community for people that might not have been as lucky as I have been to already have a preexisting community with many of my friends and my partner that were in tech? How can I help create that advantage for others and how can I help reach more people and help them understand what their options are and connect them to the people that need to know to get jobs? I think Code School Q&A, we are super, super excited about open doors for people to whether that be better knowledge, whether that be real human connection; what's most important to us is just supporting people as they are making transitions into the industry like we've been doing over this last year and a half. MANDY: So what is the Code School Q&A look like when you join? Walk me through it if I were to show up, what would I get? DANIELLE: Absolutely. So there's generally four of us on the stream and we ask a handful of questions, whether that be from our own experiences of like, “Okay, I'm a developer now and I've got some questions about some of these transitions that I am experiencing.” But we also lean into the audience as well and see what kind of questions they have, whether that be folks that are still in code school, or folks that are thinking about maybe potentially going back to school, whether that be computer science in a university setting, or bootcamp, or even self-taught people. We even have a number of folks that are already in their careers, too that are there to reach out and chat and provide additional feedback and support. So I really feel like it's a bunch of friends just getting together on Wednesdays and that group of friends just keeps building and expanding. It is very much like a support group, but it's also fun. Like, our first question of the day is what are you drinking and how are you doing? Because we all hang out and chat, and drink while we're talking about how to get into tech and definitely try to make it as fun as we can and crack jokes and interrupt one another and it's a good fun time, but helping people is what's most important. MANDY: And this is all live? Unedited? DANIELLE: All live. Unedited. Yes, yes, and 7:00 PM-ish AV is a whole beast in and of itself. I just had to set up a Twitch stream for the first time in this whole time of streaming over the last year. I've been writing my princess pass and just shown up [chuckles] for every Twitch stream and now I know how much goes into that. I still had probably another few hours of set up to get past just a minimum viable product of we need to be online on the interwebs and you need to be able to hear and see me. Got there, but it's a whole thing. MANDY: Twitch is certainly interrupting the industry, I believe. DANIELLE: [inaudible]. MANDY: Especially since the pandemic. All of a sudden everyone's on Twitch. We're doing conferences live, we're doing like – how do you feel about the whole Twitch revolution and how is it different from how people traditionally came and connected in tech? DANIELLE: Yeah. Having been in events myself—that was part of what my role was within hospitality—I personally really love that there's now this whole new opportunity for connection. I think it also makes connection way more accessible because folks that were already living some kind of quarantine life because of autoimmune disorders, or disabilities, or whatever that looks like, they couldn't easily make it to those conferences and now they have a way to connect with those conferences because of hybrid events. I think it's a really rad innovation that we're seeing and it's a really wonderful way to even just as an introvert. I'm like, “I don't have to leave my house to be able to see my friends and have a good time? Yes! I am super interested in this.” I can – [overtalk] MANDY: [inaudible]. DANIELLE: Yeah. I can hang out with my dog and give him scritches whenever I want, and still see my friends and build community within tech. Heck yes. Very interested in this. I think that accessibility feature that it provides is just, it's really wonderful to know that more people can become a part of tech communities because there's now this whole online outlet for folks that couldn't otherwise afford a flight to get halfway across the country to make it to this conference, or couldn't afford to get in the conference. There's lots of ways that just makes things more accessible. MANDY: Do you think it's going to continue much beyond the pandemic? Like, do you think when it's all over, we're just going to be like, “Oh, we're back to conferences,” or do you think this is going to continue to the streaming and the slack chats and the live Q&As and things like that. Do you think that's going to continue? DANIELLE: I hope so and I think so. I think that even just from a business sense, you can tap into whole new markets by having this addition of hybrid events. You can reach a whole new subset of markets and I think quite frankly, it'd be kind of foolish to not take advantage of the new ways that we've figured out that we can still have meaningful and authentic community. [chuckles] There's definitely a way to monetize that and I'm sure plenty of people out there doing it, but I think it's also given voice to people that couldn't previously access those spaces and now they're like, “Don't take this away. This is community. This is this is what I've built,” and I think people are going to be willing to fight for that and I think that companies will see the business benefit of continuing to do both. ARTY: So anthropology question then. [laughs] DANIELLE: Great. ARTY: How do you think this will affect us as a society of connecting more virtually instead of in-person in that we're significantly more isolated now than we were before, too in terms of in-person connection? How do you think that's going to affect us? DANIELLE: One of the first things that comes to mind is infrastructure has to change. I think that support for higher speed internet across the states across the world has become much more of a priority that is striking to people, especially thinking about kids having to figure out how to do online school. All of a sudden, when COVID first hit, some kids didn't have access to the internet, let alone a computer, or a tablet, or a phone that they could go to class and do their homework on. So I think that we're going to be forced to make technology and the internet more accessible by building better infrastructure to support those things and I think it's only a matter of time before there is better social support for getting technology in the hands of kids, especially, but getting them devices. Like, I know there are a number of initiatives out there that are giving small grants and stuff for people to be able to get computers, or tablets, or whatever and I think that we're going to just keep seeing more of that. Hopefully, fingers crossed because it's super important to be able to keep connection moving and I think keep moving our society in the right direction. ARTY: So do you have any concerns about that as well as how –? We all get plugged in and are affected and in not so good ways, too. On the flip side of that, where do you see things going? DANIELLE: My partner is in InfoSec. He is a security person. So that's definitely my first thought like, how do we keep the things that are most important to us and that are now online? How do we keep those things secure and safe and protected? Figuring out how to fill the gaps that are inherent within the security industry right now of there's just not enough bodies to fill all the jobs and build all of the security that needs to be built and maintain those things. That's going to be a whole new ball game that tech has to figure out and it's going to take a lot of manpower to make sure that we can protect people and protect the things that are most important to them, and even just protect those communities, too. Make sure that those communities can continue to thrive and also, be carefully moderated and curated so that there is safety for people to interact; that there is less bullying happening online, that there is less hate crimes that are being perpetuated online. Creating safe spaces for people and providing agency for them online is a whole new ball game when we're not even really that great at doing so in real life, in-person. There are a lot of groups that are going to have to fight harder to be heard, to be seen, to feel safe, and I think that's just an ongoing thing that we need to work at being better at. ARTY: So we need ways to improve the connectivity community stuff and then also, need ways as we do those things to create safety in our communities. DANIELLE: Absolutely. MANDY: Yeah, we just had a really great discussion with Eva PenzeyMoog about two episodes ago. She wrote the book Design for Safety and it was an excellent, excellent conversation about ways that as designers and engineers, we should be building our infrastructure safe from the beginning and not just going back – [overtalk] DANIELLE: Yeah. MANDY: And doing it after the fact, but realizing who the most vulnerable people are and protecting them from the get-go. DANIELLE: Yeah, absolutely. I think that's actually something that my company works really hard to do while we're designing our curriculum products is designing from the most vulnerable within our communities and using that as a starting point for how we build things and how we continue to maintain them. Because if you can keep the folks that are most vulnerable in mind, more people are actually going to be allowed to be safe, allowed to have agency, and allowed to grow. It's a far more inclusive space when we can think about the folks that don't always have access, or don't always have safety, or don't always have agency and designing with those people in mind first. MANDY: And that's how we'll end up filling all these empty seats right now that are available in tech – [overtalk] DANIELLE: Exactly. MANDY: Is by not eliminating these people, designing a safe environment from the start, and attracting different kinds of people into tech because tech needs more diversity. DANIELLE: Tech needs more diversity. Yeah, absolutely and I think that's one of the reasons why I keep doing Code School Q&A is because I want to see more people that look like me in tech. I want to see more people that don't look like me in tech. I'm very excited to bring as many people to the table as possible because I think that's when we also get the most creative and innovative. When more tool sets are brought to the table, more diverse experiences are brought to the table, we build far more robust systems, products, and things just get better when we have more differences from which to pull and more experiences from which to learn. MANDY: As we said in the beginning, you're a fairly new developer. So I wanted to ask you the question: what was one thing you wish you knew, that you know now, that you would have known back then? If you could give Danielle advice a year ago, what advice would that have been? DANIELLE: I think that advice would have been to start actually working on technical things sooner; to start digging into the educational materials that were provided for me for free before I ever started school. I think that actually digging into those materials and having the courage to not just wait until I was in a classroom setting to be able to interact with coding languages and learning how to program, I would have had such a less fraught time getting through school and giving myself the opportunity to get a bit of a head start and more of a foundation before just diving in head first and hoping that I kept my head above water. But I think also, again, leaning into community and not being afraid to ask for help, not being afraid to advocate for myself because it took me a good 2 and a half months before a really felt like I could speak up and say what I needed. That's 2 months of time that I could have been getting more of what I needed, getting more help learning faster and more efficiently, and just being less miserable in the early stages of learning and entirely new skillsets. So don't be afraid to ask for help. Don't be afraid to advocate for yourself. I think especially as a woman coming into a technical space, there is some extra fears of not looking like I could do this, or not feeling like I belonged not knowing what I was doing. But the thing to remember was that nobody knew what they were doing; we were all figuring it out together in that school program. Being the one to be like, “Hold up, this is not making any sense to me. Can we start this over again? Can we dig into what's happening here?” Often times, other people were like, “Oh, I'm so grateful you said something because I also don't know what's going on.” MANDY: Well, with that, I think that's an amazing thing to end on and we can move over to reflections, which I can go and start off with right away is that's the secret. Like, nobody knows what we're doing in tech. DANIELLE: [laughs] Nobody knows, no. [laughs] MANDY: Nobody knows. DANIELLE: Nobody knows yet. MANDY: That's the secret. Ask questions. Lean on your community. There are so many people out there. I know you mentioned tech Twitter, #techTwitter. There are so many nice amazing people that will have your back if you just put those questions out there and even say, “Hey, tech twitter, anybody free? Do you want to pair?” They'll be like, “Yeah, let's hop on for an hour, or two,” and especially right now is when people aren't really doing much again. [chuckles] People are out there. So again, it's a secret. Nobody knows. DANIELLE: [laughs] Yeah. I think I am totally on board with your reflections for the day lean into community and don't be afraid to ask questions. I think it's so important to know that tech needs you. Whoever you are, tech needs you and whatever valuable skillset you bring to the table, whatever diverse experiences you bring to the table, it's needed. You need more people that aren't traditional and whatever that looks like. There is space and there is need for you. I think come and ask your questions at Code School on Wednesdays. We need generally every Wednesday, 7:00 PM Pacific time. We are happy to answer your questions and help connect you to the people if we don't know answers because none of us totally know the right answer most of the time. MANDY: And how can people do that work? What's the URL? DANIELLE: Yeah. Come visit us at twitch.tv/thejonanshow. We also have Code School Q&A is participating in Oktoberfest, too. So you can find us on GitHub by looking up the Oktoberfest hashtag tag and you can find us on Twitter at Code School Q&A as well. MANDY: Awesome. ARTY: I just wanted to add that a little bit with lean into community, I was thinking about Mandy, when you were mentioning your story, when I was learning electron new technology I didn't know. I had this code base that I had to learn. I didn't know what was going on, I was frustrated, I couldn't get anything working, and then I tweeted and asked for someone to pair with me. Lo and behold, some random person from the internet was like, “Sure! I'd be happy to help! Let's meet up air on this,” and I managed to get over the major hurdles I had with getting my environment to set up and getting unstuck, figured out how to run the debugging tools, and all those things really happened as a consequence of nothing afraid to reach out. Even when you might feel like you're struggling with these things alone, there really is a community out there and people that are willing to jump in and help and I think that's really great cool thing. MANDY: All right, well with that, I think we're pretty set to wrap up. If you want to join us you are in Slack. Danielle will receive an invitation to join us as well in our Slack community. It is a Patreon where you can fudge to support us monetarily on a monthly basis. However, if you're not comfortable with that, or do not want to, you can DM anyone of the panelists and we will get you in there for free. So with that, I want to thank you, Danielle, for coming on the show. DANIELLE: Thanks so much for having me for a great conversation. MANDY: Awesome, and we'll see everyone next week. Special Guest: Danielle Thompson.

The Bike Shed
312: Spooky Stories

The Bike Shed

Play Episode Listen Later Oct 12, 2021 38:50


Chris evaluates the pros and cons between using Sidekiq or Active Job with Sidekiq. He sees exceptions everywhere. Steph talks about an SSL error that she encountered recently. It's officially spooky season, y'all! sidekiq-symbols (https://github.com/aprescott/sidekiq-symbols) Transcript: CHRIS: Additional radiation just makes Spider-Man more powerful. STEPH: [laughs] Hello and welcome to another episode of The Bike Shed, a weekly podcast from your friends at thoughtbot about developing great software. I'm Steph Viccari. CHRIS: And I'm Chris Toomey. STEPH: And together, we're here to share a bit of what we've learned along the way. Hey, Chris, what's new in your world? CHRIS: Fall is in the air. It's one of those, like, came out of nowhere. I knew it was coming. I knew it was going to happen. But now it's time for pumpkin beer and pumpkin spice lattes, and exclusively watching the movie Hocus Pocus for the next month or so or some variation of those themes. But unrelated to that, I did a thing that I do once, let's call it every year or so, where I had to make the evaluation between Sidekiq or Active Job with Sidekiq, as the actual implementation as the background job engine that is running. And I just keep running through this same cycle. To highlight it, Active Job is the background job system within Rails. It is a nice abstraction that allows you to connect to any of a number of them, so I think Delayed Job is one. Sidekiq is one. Resque is probably another. I'm sure there's a bunch of others. But historically, I've almost always used Sidekiq. Every project I've worked on has used Sidekiq. But the question is do you use Active Job with the adapter set to Sidekiq and then you're sort of living in both worlds, or do you lean in entirely and you use Sidekiq? And so that would mean that your jobs are defined to include Sidekiq::Worker because that's the actual thing that provides the magic as opposed to inheriting from Application Job. And then do you accept all of the trade-offs therein? And every time I go back and forth. And I'm like, well, but I want this feature, but I don't want that feature. But I want these things. So I've made a decision, but I want to talk ever so briefly through the decision points that were part of it. Have you done this back and forth? Are you familiar with the annoying choice that exists here? STEPH: It's been a while since I've had the opportunity to make that choice. I'm usually joining projects where that decision has already been made. So I can't think of a recent time that I've thought through it. And my current project is using that combination of where we are using Active Job and Sidekiq. CHRIS: So I think there's even a middle ground there where that was the configuration that I'd set up on the project that I'm working on. But you can exist in both worlds. And you can selectively opt for certain background jobs to be fully Sidekiq. And if you do that, then instead of saying, "Performlater," You say, "Performasync." And there are a couple of other configurations. It gives you access to the full Sidekiq API. And you can do things like hey, Sidekiq, here's the maximum number of retries or a handful of other things. But then you have to trade away a bunch of the niceties that Active Job gives. So as an example, one thing that Active Job provides that's really nice is the use of GlobalID. So GlobalID is a feature that they added to Rails a while back. And it's a way to uniquely identify a given record within your system such that when you say performlater, you can say, InvitationMailer.performlater and then pass it a user record so like an instance of a user model. And what will happen in the background is that gets serialized, but instead of serializing the whole user object because we don't actually want that, it will do the GlobalID magic. And so it'll turn into, I think it's GID:// so almost like a URL. But then it'll be, I think, your application name/model name down the road. And the Perform method actually gets invoked via the background system. Then you will just get handed that user record back, but it's not the same instance of the user record. It sort of freezes and thaws it. It's really nice. It's a wonderful little feature. Sidekiq wants nothing to do with that. STEPH: I'm so glad that you highlighted that feature because that was on my mind; I think this week where I was reviewing...somebody had made the comment where they were concerned about passing a record to a job and saying how that wouldn't play nicely with Sidekiq. And in the back of my mind, I'm like, yeah, that's right. But then I was also I'm pretty sure this got addressed, though. And I couldn't recall specifically if it was a Sidekiq enhancement or if it was a Rails enhancement. So you just cleared something up for me that I had not had time to confirm myself. So thanks. CHRIS: Well, to be clear, this works if you are using Active Job with Sidekiq as the adapter, but not if you are using a true Sidekiq worker. So if you opt-out of the Active Job flow, then you have to say, "Perform_async," and if you pass it a record, that's not going to work out particularly nicely. The other similar thing is that Sidekiq does not allow the use of keyword args, which, I'm going, to be honest, I really like keyword arguments, especially for background jobs or shuttling data through your system. And there's almost a lazy evaluation. I want some nicety to make sure that when I am putting something into a background job that I'm actually using the correct call signature, essentially passing the correct data in the correct shape. Am I passing a record, or am I passing the ID? Am I passing a list of options or a single option? Those sort of trade-offs that are really easy to subtly get wrong. I came around on this one because I realized although Active Job does support keyword arguments, the way it does that is it just has a JSON serialization format for them. So a keyword argument turns into a positional array with an associated hash that allows for the lookup or whatever. Basically, again, they handle the details. You get to use keyword args, which is great, with the exception that when you're actually calling performlater, that method performlater is a method missing type magic method. So it does not actually check the keyword arguments at that point. You're basically just passing an options hash as opposed to true keyword arguments that would error because they don't match up. And so when I figured that out, I was like, oh, never mind. This doesn't actually do the thing that I care about. It's a little bit nicer in terms of the signature of the method when you're defining your background job itself, but it doesn't actually do any logical checking. It doesn't give me any safety or robustness within my system. So I don't care about that. I did find a project called sidekiq-symbols, which does some things under the hood to how Sidekiq serializes and deserializes jobs, which I think gives largely the same behavior as Active Job. So I can now define my Sidekiq jobs with keyword arguments. Things will work. I can't use GlobalID. That's still out. But that's fine. I can do a little helper method that basically does the same thing as GlobalID or at least close approximation. But sidekiq-symbols lets me have keyword arg-like signatures in my methods; basically, it is. But again, it doesn't actually do any check-in when I'm enqueueing a job, and I am sad about that. STEPH: Yeah, that's another interesting distinction. And I'm unsurprisingly with you that I would favor having keyword args and having that additional safety in place. Okay, so I've been keeping track. And so far, it sounds like we have two points because I'm doing a little scorecard here between Active Job and Sidekiq. And we have two points in favor of Active Job because they offer a GlobalID, which then allows us to pass in a record, and then it takes care of the serialization for us. And then also, keyword args, which I agree with you that's a really nice feature to have in place as well. So I'm curious, so it sounded like you're leaning towards Active Job, but I don't want to spoil the ending. CHRIS: Yes, I could see why that's what you would be taking away from the conversation thus far. So again, just to reiterate, Active Job and Sidekiq with this sidekiq-symbols extension they both support keyword args, kind of. They support defining your job with keyword args and then enqueueing a job passing something that looks like keyword args. But it ends up...nobody's actually checking anything, so it's mostly like a syntactic nicety as opposed to any sort of correctness, which is still nicer, but it's not the thing that I actually want. Either way, nobody supports it, so it is not available to me. Therefore, it is not a consideration point. The GlobalID thing is nice, but it is really, again, it's a nicety more than anything. I have gone, and I'm leaning in the direction of full Sidekiq and Sidekiq everywhere as opposed to Active Job in most cases, but then Sidekiq when we need it. And that's because Sidekiq just has a lot more power and a lot more functionality. So, in particular, Sidekiq has a feature which allows you to say...it's a block that you put at the top of your Sidekiq job that says retries exhausted or something. I think Sidekiq retries exhausted is the actual full name of that at that point, which is really unfortunate in my mind, but anyway, I'll deal. At that point, you know that Sidekiq has exhausted all of the retries, and you can treat it as failed. I'm going, to be honest, I went on a quest to find a way to say, hey, I'm going to put some work into the background. It's really important for me to know if this work succeeds or if it fails. It's very easy to know if it succeeds because that just happens in-line in the method. But we can have an exception raised at basically any point; Sidekiq does a great job of catching those, of retrying, of having fundamental mechanisms there. But this is the best that I can get for this job failed. And so Active Job, as far as I can tell, does not have anything for this in order to say, yep, we are done. We are not going to keep working on this. This work has failed. It is dead. Dead is; actually, I think the more correct term for where we're at because failed is a temporary state, and then you retry after a failure. Whereas dead is, this has gone through all of its retries, and it will never be run again. Therefore, we should treat this as not having run. And in my case, the thing that I want to do is inform the user that this operation that we were trying to do on their behalf has not succeeded, will not succeed. And please reach out or otherwise deal with the fact that we were unable to do the thing that they asked us to do. That feels like a really important thing for me to be able to do, to be able to communicate back to my users. This is one of those situations where I'm looking at the available options, and I'm like, I feel like I can't be the only one who wants to know when something goes wrong. This feels like a thing that's important. But this is the best example that I've found, the Sidekiq retries exhausted block. And unfortunately, when I'm using it, it gets yielded the Sidekiq JSON blob deserialized, so it's like Ruby hash. But it's still like this blob of data. It's not the same data that gets passed into perform. And so, as a result, when I want to look up the record that was associated with it, I have to do this nested dig into the available hash of data. And it just feels like this is not a well-paved path. This is not something that is a deeply thought about or recommended use case. But again, I don't feel like I'm doing something weird here. Am I doing something weird, Steph, wanting to tell my users when I was unable to do the thing they asked me to do? [chuckles] STEPH: That feels like a very rhetorical question. [laughs] CHRIS: It does. I apologize. I'm leading the witness. But in your sincere heart of hearts, what do you think? STEPH: No, that certainly doesn't sound weird. I'm actually thinking back to some of the jobs that cause me stress in regards to knowing when they failed and then having that communication of knowing that we've exhausted all the retries. And, of course, knowing when those retries are exhausted is incredibly helpful. I am intrigued, though,, because you're highlighting that Active Job doesn't have the same option around setting the retry. And I'm trying to recall exactly how it's set. But I feel like I have set the retry count for Active Job. And maybe, as you mentioned before, that's because it's an abstraction, or I'm not sure if Active Job actually has that native support. So I feel a little confused there where I think my default instinct would have been Active Job does have that retry capability. But it sounds like you've discovered otherwise. CHRIS: I'm not actually sure what Active Jobs core retry logic or option looks like. So fundamentally, as far as I understand it, Active Job is an abstraction. And under the hood, you're always connecting an adapter. So it's either going to be Sidekiq, or Resque, or Delayed Job, or other. And each of those systems, whichever system you have as the adapter, is the one that's actually going to be managing retries. And so I know Sidekiq happens to have as a default 25 retries. And that spans, I think it's a two-week exponential back off. And Sidekiq has some very robust logic that they have implemented as the way retries exist within Sidekiq. I'm not sure what that would look like if you're trying to express it abstractly because it is slightly different. I know there was some good work that was done on Sidekiq to allow the Sidekiq options that's a method at the top level of the job, even if it's an Active Job job to express the retries. So that may be what you've seen, or there may be truly an abstraction that exists within Active Job, and then each adapter needs to know how to handle retries. But frankly, the what can Sidekiq do that Active Job can't? There's a whole bunch of stuff around limiting when you would retry limiting, enqueuing a job if there already exists one, when and how do those records get locked. There's a whole bunch of stuff. Sidekiq has a lot of power under the hood. And so if we want to be leaning into that, that's why I'm leaning towards let's just be Sidekiq all the time. Let's become Sidekiq experts. Let's accept that as a deep architectural decision within the app as opposed to just relying on the abstraction. Because fundamentally, if we're just using Active Job, we're not going to have access to the full power of Sidekiq or whatever the underlying system is, so sort of that decision that I'm making, but I don't know specifically around the retries. STEPH: Okay, thanks. That's really helpful. It's been a while since I've had to make this decision. I'm really enjoying you sharing your adventure because I'm trying to think what's the risk? If you don't use Active Job, what are the trade-offs? And you'd mentioned some of them around the GlobalID and keyword args, which are some niceties. But overall, if you don't go with the abstraction, if you lean into Sidekiq, the risk is then you want to migrate to a different enqueuing service. And something that we talk about is mitigating that risk, so then you can swap it out. That's also something I have never done or encountered where we've had to make that change. And it feels like a very low risk in my mind. CHRIS: Sidekiq feels like the thing you would migrate to, not a thing you would migrate from. It feels like it is the most powerful. And if anything, I expect at some point we'll be upgrading to Sidekiq pro or enterprise or whatever the higher versions that you pay for, but you get more features there. So in that sense, that is the calculation. That's the risk trade-off in my mind is that we're leaning into this technology and coupling ourselves more closely to it. But I don't see that as one that will reassess in the same way that people talk about Active Record and it being an ORM. And it's like, oh, we're abstracting the database underneath, and I'm like, no, I'm not. I'm always using Postgres. Please do not take Postgres. I'm not going to switch over to MySQL next week. That's totally fine if you start on MySQL. It's unlikely you're going to port over to Postgres. We may port to an entirely…like it's a Cassandra column store with a Kafka queue, I don't know, something weird down the road. But it's not going to be swapping out Postgres for MySQL or vice versa. Like you said, that's probably not a change that's going to happen. But that I think is the consideration. The other consideration I have in my mind is Active Job is the abstraction that exists within Rails. And so I can treat it as the lowest common denominator, and folks joining the project, it's nice to have that familiarity. So perform_later is the method on the Active Job jobs, and it has a certain shape to it. People may be familiar with that. Mailers will automatically use Active Job just implicitly under the hood. And so there's a familiarity, a discoverability. It's just kind of up the middle choice. And so if I can stick with that, I think there's a nicety there. But in this case, I think I'm choosing I would like the power and consistency on the Sidekiq side, and so I'm leaning into that. STEPH: Yeah, that makes a lot of sense to me. And I liked the other example you provided around things that were not likely to swap out and Postgres, MySQL, your database being one of them. And in favor of an example that I do have for something that...I do enjoy wrapping. It's not something that I adhere to strictly, but I do enjoy it when I have the space to make this choice. So I do enjoy wrapping HTTPClients, not just because then I can swap it out for a different HTTPClient, which frankly, that's also rare that I do that. Once I choose an HTTPClient, I'm probably pretty happy, and I don't need to swap it out. But I really like being able to extend to the API specifically if they don't handle error responses in a way that I would like to or if they raise, and then I want to change the API to have a more thoughtful interface and where I don't have to rescue those errors. But instead, I can interact with this object that then represents an error state. So that was just one example that came to mind for things that I do enjoy having an abstraction around and not just so I can swap it out because that feels like a very low risk, but more frankly, so I can extend the API. CHRIS: I definitely share the I almost always wrap APIs, or I try and hide whatever the implementation detail whether it be HTTPParty, or Faraday or whatever it is that I'm using and trying to hide that deeply within the system. And then I have whatever API client that we define. And that's what we're interacting with. It's interesting that you bring up errors and exceptions there because that's the one other thing that has caused me this...what I'm describing now seems perhaps like, oh, here's just a list of pros and cons, a simple decision was made, and there we are. This represents some real soul searching on my part, if we will. And one of the last things that I ran into that was just so frustrating is that Sidekiq is explicitly built around the idea of exceptions; Sidekiq retries if there is an exception raised in the job, otherwise, it treats it as success, and that's it. That is the entirety of it. That is the story. But if you raise an exception in a job, then you can't test that job because now it's raising an exception. You can't test retries or this retry exhausted block that I'm trying to lean into. I'm like, I want to put that in a feature spec and say, oh, this job goes in the background, but it's in a failure state, and therefore, the user sees the failure message. Sorry, I can't do that because the only way to actually fail a job is via an exception. And I've actually gone to some links in this application to try to introduce more structured data flow. I've talked a bunch about the command objects and the dry-monads and all those things. And I've really loved them where I've gotten to use them. But then I run into one of these edge cases where Sidekiq is like, no, no, no, you can't do that. And so now I have parts of my system that very purposefully return data as opposed to raising an exception. And I just have to turn around and directly raise that failure as an exception, and it just feels less expressive. I actually just ran into the identical thing with Pundit. They have a little bit better control over it; I can choose whether or not I want the raising version or not. But I see exceptions everywhere, and I want a little more discrete data flow. [chuckles] That is my dream. So anyway, I chose Sidekiq is the summary here. And slowly, we're going to migrate entirely to Sidekiq. And I'm going to be totally fine with it. And I'm done griping now. STEPH: This is your own little October Halloween movie, that I see exceptions everywhere. CHRIS: They're so spooky. STEPH: [laughs] That's cool about Pundit. I'm not sure I knew that, that you get to essentially turn on or off that exception flow behavior. On one hand, I'm like, that's nice. You get the option. On the other hand, I'm like, well, let's just not do it. Let's just never raise on people. But at least they give people options; that seems really cool. CHRIS: They do give the option. I think you can choose different strategies there. And also, if we're being honest, I'm newer to Pundit. And I used a different thing, which was to get the Policy Object and ask it a question. I wanted to ask, is this enabled or not? Can a user do this or not? That should not raise an exception. I'm just asking a question. We're just being real chill about this. I just want to know some information. Let's flow some data through our system. We don't need exceptions for that. STEPH: Why are you yelling at me? I just have a question. [laughs] CHRIS: Yeah. I figured out how to be easy on that front. Sidekiq apparently has no be easy mode, but that's fine. You know what? We're going to make it work, and it's going to be fine. But it is interesting deciding which of these facets of the system that I'm building do I really care about? Which are the ones where I'm like, whatever, just pick something, and we'll move forward, it's not a big deal? Versus, we're actually going to be doing a lot of work in the background. This is the thing that I care about deeply. I want to know about failure and success. I want to really understand that and have a robust answer to what our architecture looks like there. Similarly, Pundit for authorization. I believe that authorization will be a critical aspect of our system. It's typically a pretty important thing. But for us, I think we're going to have different types of users who can log in and see different subsets of data and having a consistent and concrete way that we have chosen to implement that we are able to test, that we're able to verify. I think that's another core competency within the app. But you only get to have so many of those. You can only be really good at a couple of things. And so I'm in that place where I'm like, which are our top five when I say are the things that I care a lot about? And then which are the things where I'm like, I don't know, whatever, just run with it? STEPH: Just a little bit ago, I came so close to singing because you said the I want to know phrase again. And that, I'm realizing, [laughs] is a trigger for me and a song where I want to sing. I held it back this time. CHRIS: It's smart. You got to learn anytime you sing on mic that is part of the permanent record. STEPH: Edward Loveall at thoughtbot, since I sang in a recent episode, did the delightful thing where then he grabbed that clip of where you talk a little bit, and then I sing and then encouraged everyone to go listen to it. And in which I responded, like, I would highly recommend that you save your ears and don't listen to it. But yes, singing on the mic is a thing. I do it from time to time. I can't hold it back. CHRIS: We all do. But since it doesn't seem that you're going to sing in this moment, I think I can probably wrap up my Odyssey of choosing between Sidekiq and Active Job. I hope those details were useful to anyone other than me. It was an adventure, so I figured I'd share it. But yeah, that about wraps it up on my side. Mid-roll Ad And now a quick break to hear from today's sponsor, Scout APM. Scout APM is leading-edge application performance monitoring that's designed to help Rails developers quickly find and fix performance issues without having to deal with the headache or overhead of enterprise platform feature bloat. With a developer-centric UI and tracing logic that ties bottlenecks to source code, you can quickly pinpoint and resolve those performance abnormalities like N+1 queries, slow database queries, memory bloat, and much more. Scout's real-time alerting and weekly digest emails let you rest easy knowing Scout's on watch and resolving performance issues before your customers ever see them. Scout has also launched its new error monitoring feature add-on for Python applications. Now you can connect your error reporting and application monitoring data on one platform. See for yourself why developers call Scout their best friend and try our error monitoring and APM free for 14 days; no credit card needed. And as an added-on bonus for Bike Shed listeners, Scout will donate $5 to the open-source project of your choice when you deploy. Learn more at scoutapm.com/bikeshed. That's scoutapm.com/bikeshed. STEPH: So, I would love to talk about an SSL error that I encountered recently. So one of the important processes in our application is sending data to another system. And while sending data to that other system, we started seeing the following error that the read "Certificate verify failed." And then in parens, it states, "Unable to get local issuer certificate." So upon seeing that error, I initially thought, okay, something is wrong with their SSL certificate or their SSL configuration. And that's not something that I have control over and can fix. So we should reach out and let them know to take a look at their SSL config. But it turns out that their team already knew about the issue. They had recently updated or renewed their SSL cert, and they saw our messages were no longer being processed, and they were reaching out to us for help. So at that point, I'm still pretty sure that it's related to something on their end, and it's not something that I can really fix on our end. But we can help them troubleshoot. Maybe there's a workaround that we can add to still get messages processing while they're looking into their SSL config. It seemed like they still just needed help. So it was something that was still worth diving into. So going back to the first error, I want to talk a little bit about it because I realized that I understand SSL just enough, just the surface to get by as a developer. But then, every time that I run into a specific error with it, then I really have to refresh my understanding as to what could be wrong, so then I can troubleshoot more effectively. So for anyone that could use a refresher on that certificate verification process, when your browser or your server is connecting to a site that uses SSL, then your browser server, whichever one you're using, is going to download that site certificate and verify a couple of things. So it's going to check does the certificate contain the domain name of the website? So essentially, you gave us a certificate. Is this your certificate? Does it match the site that we're connecting to? Is this cert issued by a trusted certificate authority? So did someone that we trust give you this certificate? And is the cert still valid, or has it expired? So that part is pretty straightforward. The second part, "Unable to get local issuer certificate," so that's the part I was less certain about. And I took this to mean that they had passed two of those three checks that their cert included the site's name, and it had not expired. But for some reason, we aren't able to determine if their cert was issued by someone that we should trust. So following that journey, my next question was, so what are they giving us? So this is a tool that I don't get to use very often, but I reached for OpenSSL and, specifically, the s_client command, which connects to a specified domain and prints all certificates in the certificate chain. You may already know this, but the certificate chain is basically a fancy way of saying, show me all the certificates necessary to prove your site certificate was authorized by a trusted certificate authority. CHRIS: I did not know that. STEPH: Okay, I honestly didn't either. [laughs] CHRIS: I liked that you thought I would, though. So thank you, but no. [chuckles] STEPH: Yeah, it's one of those areas of SSL where I know just enough. But that was something that was new to me. I thought there was a site certificate, and I didn't realize that there is this chain of certificates that has to be honored. So going back and looking through that output of the certificate chain, that's what highlighted to me that their server was giving us their certificate and saying, hey, you should trust our site certificate. It's legit because it was authorized by, let's say, XYZ certificate. And so if it were a proper certificate chain, then they would give us that XYZ cert. And essentially, we can use this chain of certificates to get back to a trusted authority that then everybody knows that we can trust. However, they weren't actually giving us a reference certificate; they were giving us something else. So essentially, they were saying, "Hey, look at our certificate and look at this very trustworthy reference that we have." But they're actually failing to give us that reference. So to bring it all home, we can download that intermediate certificate that they reference; that is something that is publicly accessible. That's why we're able to then verify each certificate that's provided in that chain. We could go and download that intermediate certificate from that certificate authority. We could combine that with their site-specific certificate, include that in our request to their system, and then complete the certificate chain. And boom, we're back in business. But it was quite a journey. CHRIS: That is quite the journey. And yeah, I definitely knew very little of that, although everything you're saying makes sense. And I have a bunch of cubbyholes in my brain for SSL knowledge. And the words you said all fit into the spaces that I have in my brain, but I didn't know a bunch of those pieces. So thank you for sharing that. SSL and cryptography, more generally or password hashing or things like that, occupy this special place in my brain where I'm both really interested in them. And I will occasionally research them. If I see a blog article, I'll be like, oh yeah, I want to read more about this password hashing. And what's a Salt? And what's a Pepper? And what are we doing there? And what is BCrypt versus SCrypt? What are all these things? This is cool. And almost the arms race on the two sides of how do we demonstrate trust in a secure manner on the internet? But at the same time, I am not allowed to do anything with this information. I outsource this as much as humanly possible because it's one of those things that you just should not do yourself and SSL perhaps even more so. So I have configured aspects of my password hashing. But I 100% just lean on the fact that Let's Encrypt exists in the world. And prior to that, it was a little more work. But frankly, earlier on in my career, I wasn't dealing with the SSL parts of things. But I'm so grateful to Let's Encrypt as a project that exists. And now, on almost every platform that I work with, there's just a checkbox for please do the SSL work for me, make it good, make it work, and then I will be happy. And I'm so glad that that organization exists and really pushed the envelope also. I forget what it was, but it was only like three years ago where SSL was not actually nearly as common as it is now. And now it is pervasive and everywhere. And all of the sites have it, and so that is a wonderful thing. But I don't actually know much. I know that I should have it. I must have it. I should force it. That's true. So I push that out… STEPH: Hello. CHRIS: Are you trying to get me to sing? [chuckles] STEPH: [laughs] No, but I did want to know if you get the reference, the Salt-N-Pepa. CHRIS: Push It Real Good the song? Yeah, okay. STEPH: Yeah, you got it. [chuckles] CHRIS: I will just say the lyrics. I shall not sing the lyrics. I would say that, though, that yes, yes, they do that. STEPH: Thank you for acknowledging my very terrible reference. Circling back just a little bit too in regards to...I'm with you; this is a world that is not one that I am very deeply technical in and something that I learned a fair amount while troubleshooting this particular SSL error. And it was very interesting. But there's also that concern where it's like, that was interesting. And we worked around the issue, but this also feels very fragile. So we still haven't fixed it on their end where they are sending the wrong certificate. So then that's why we had to do more investigative work, and then download the certificate that they meant to send us, and then send back a complete certificate chain so that we don't have this error anymore. But should they change anything about their certificate, should they renew anything like that, then suddenly, we're going to break again. And then, the next developer is going to have to go through the same journey. And this wasn't a light journey. This was a good half-day journey to figure out what was going on and to spend the time, and then to also get that fix out to production. So it's a meaningful task that I don't want anyone else to have to go through. But we are relying on someone else updating their configuration. So, on one hand, we're in a good spot until they are able to update. But on the other hand, I wrote a heck of a commit message for the next person just describing like, friend, just grab some coffee if we're going to chat. It's a very small code change, but you need to know the scoop. So should you need to replicate this because they've changed something, or if this happens…because we work with a number of systems that we send data to. So if someone else should run into a similar issue, they will understand some of the troubleshooting techniques that I used and be able to look up that chain and find out if there's a missing cert or something else they need to provide. So it feels like a win, but I'm also nervous for future selves, future developers. So there's another approach that I haven't mentioned yet, but it was often a top recommendation for when dealing with SSL errors. And specifically, it was turning off SSL verification. And I saw that, and I was like, well, that won't work. I'm definitely sending sensitive, important data. And I need to verify that who I'm sending this to is really the person that I want to send this data to. So that was not an option for me. But it made me very nervous how often that was an approach that people would recommend and be like, oh, it's okay, just turn off SSL. You'll be fine. Like, don't worry about it. CHRIS: I feel like this so perfectly fits into the...some of our work is finding the information and connecting the pieces together and making it work. But some of it is that heuristic sense, that voice in the back of your head that is like, wait, I'm sorry, what? You want me to just turn off the security perimeter and hope that the velociraptors won't come in? That doesn't seem like it's going to end well. I get that that's an easy option that we have available to us right now and will solve the immediate problem but then let's play this out. There are four or five Jurassic Park movies now that tell the story of that. So let's be careful. STEPH: It always ends super well, though, right? Like, it's totally fine. [laughs] CHRIS: [laughs] Exclusively. Although it's funny that you mentioned OpenSSL no verify because just this past week, I used that very same configuration. I think it was okay in my case; I'm pretty sure. But it is interesting because when I saw it, I was like, oh no, can't do that. Certainly not that. Don't turn off the security feature. That's the wrong way to deal with the issue. But in the particular case that I'm working with, I'm using Redis, Heroku Redis, in particular, in a Heroku configuration. And the nature of how Heroku configures the Redis instances and the connectivity to our app into our dyno...I forget why. I read an article. They wrote it; Heroku wrote it. I trust them; they're good. I've outsourced my trust to people that I do trust. The trust chain actually maps really well to the certificate trust chain. I trust that Heroku has taken security deeply seriously. And for some reason, their configuration of Redis requires that I turn on OpenSSL no verify mode. So I'm using this now both in Sidekiq, and then we're using our Redis instance for our Rails cache as well. So in both cases, I said, "It's fine. Don't worry about it." I used the Don't worry about it configuration. And I didn't love it but I think it's okay. And partly, I'm trying to say this into the internet radio right now just in case anyone's listening who's like, no, no, no, you can't do that. That's bad. So I'm willing to be deeply wrong on the internet in favor of someone telling me and then I get to get out in front of it. But I think it's fine. Pretty sure it's fine. It should be fine. STEPH: I love love love that you gave a very visual example of velociraptors, and then you're like, oh, but I turned it off. [laughs] So I'm going to start sending you a velociraptor gif each day. CHRIS: I hope you do. I hope the internet holds you accountable to that. STEPH: [laughs] CHRIS: And I really look forward to [laughs] moving forward because that's a great way to start the day. Well, it doesn't need to start the day, but I look forward to them. STEPH: [laughs] I am really intrigued because I'm with you. Like you said, there are certain entities that are in our trust chain where it's like, hey, you are running this for us, and so I do have faith and trust in you that you wouldn't steer me wrong and provide a bad recommendation. Someone on Stack Overflow telling me to turn off SSL verify uh; that's not my trust chain. Heroku or someone else telling me I'm going to take it a little more seriously. And so I'm also interested in hearing from...what'd you say? You're speaking into the internet phone. [laughs] What'd you say? CHRIS: I think I said internet radio. But yeah, in a way. I mean, we're recording over Skype right now. So in a manner of speaking, we're on the internet phone to make our internet radio show. STEPH: [laughs] Oh goodness, the internet radio. I'm also intrigued to hear if other people are like, oh, no, no, no. Yeah, that sounds like an interesting scenario. Because I would think you'd still want your connection to...you said it's for Redis. So you still want that connection to be verified. But then if Redis itself can't have a specific...yeah, we're testing the boundaries of my SSL knowledge here as to how the heck you would even establish that SSL connection or the verification process. CHRIS: Me too. And it also exists in an interesting space where Heroku is rather clear in their documentation about this. And it was a surprising claim when I saw it. And so, I don't expect them to be flippant about a thing that is important. Like, if they're like, "No, no, no, it is okay. You can turn off the security thing, don't worry." I trust that they're not just like, oh, we didn't think about it too much. But we figured why not? It's not a big deal. I'm sure that they have thought about it deeply because it is an important thing. And so in a weird way, my trust of them and the severity of what this thing represents, I'm like, oh yeah, I super trust that because you're not going to get a major thing wrong. You might get a minor, small, subtle thing wrong. But this is a pretty major configuration change. As I say it, I'm now getting more worried. I'm now like, I feel fine about this. This doesn't seem like a problem at all. But then I keep saying stuff, and I'm like, oh no. That's why I love having a podcast; I find out things about myself as I talk into a microphone to you. STEPH: We come here to share our deep, dark developer secrets. Chris: Spooky developer therapy. STEPH: But just to clarify, even though you've turned off the SSL verify, you're still connecting over SSL. CHRIS: Yes, I believe that's the case. And if I'm remembering, I think the nature of how this works is they're using a self-signed certificate because of shared infrastructure or something, something that made sense when I read it. But it was the idea that they are doing a self-signed certificate. Therefore, to what you were talking about earlier, there isn't the certificate authority in the chain of those because it's self-signed. And so, they are not a trusted certificate authority. Therefore, that certificate that they have generated would not be trusted. But it does still allow for the SSL handshake and then communication to happen over SSL. It's just that fundamental question of trust. I'm saying, in this case, for reasons, it's okay. Trust me that I trust them. We're good. Which, again, I don't feel great about, but I think yes, it is still SSL, but it is a self-signed certificate. So we have to make this configuration change. STEPH: Yeah, all of that makes sense. And it certainly sounds like you have been very thoughtful about that change and put in some investigative work. So on that note, I have a very unrelated bad joke for you. CHRIS: I'm very excited. STEPH: All right, here we go. All right, so what do you call an alligator wearing a vest? CHRIS: I don't know. What do you call an alligator wearing a vest? STEPH: An investigator. [laughter] On that note, shall we wrap up? CHRIS: Oh, let's wrap up. We should also include a link in the show notes to the episode where you told the joke about the elephant hiding in the trees because that's one of my favorite jokes. You slayed me with that one. [laughs] But on that note, yes, let us wrap up. The show notes for this episode can be found at bikeshed.fm. STEPH: This show is produced and edited by Mandy Moore. CHRIS: If you enjoyed listening, one really easy way to support the show is to leave us a quick rating or even a review in iTunes,,as it really helps other folks find the show. STEPH: If you have any feedback for this or any of our other episodes, you can reach us at @_bikeshed or reach me on Twitter @SViccari. CHRIS: And I'm @christoomey STEPH: Or you can reach us at hosts@bikeshed.fm via email. CHRIS: Thanks so much for listening to The Bike Shed, and we'll see you next week. All: Byeeeeeeeeee!!! Announcer: This podcast was brought to you by thoughtbot. thoughtbot is your expert design and development partner. Let's make your product and team a success.

Sharktoberfest!
47 Meters Down

Sharktoberfest!

Play Episode Listen Later Oct 8, 2021 79:51


Logan and Dustin are wrapping up the first week of Sharktoberfest! To conclude the first week of the festivities, they watch the surprise hit Mandy Moore vehicle, 47 Meters Down. It's a movie all about shark diving, breakups and SEA MADNESS!!! The fellas also sip on the Oktoberfest from Pulpit Rock Brewing out of Decorah, IA as they rip apart the movie and learn about pressure sicknesses such as the bends. You should also listen to this episode if you want to know what "Oktoberfest cocaine" is. One week down, three to go!

Dear Doula
Mandy Moore on Balancing Motherhood, Returning to Work, and More

Dear Doula

Play Episode Listen Later Oct 8, 2021 29:01


Mandy Moore sits down with friend and doula Brandi, and the two explore a conversation about the pressure women have to both “do it all," having to choose between doing what they love versus being with their children, handling a newborn, and becoming a mother in a strange and unusual time. Brandi has been able to offer not only her expertise, but her assurances to Mandy and to all new parents and this is a feel-good episode you won't want to miss. Find Brandi on Instagram @brandi_jordan_official Produced by Dear Media

Greater Than Code
253: Reframing the Value of Open Source with Jen Weber

Greater Than Code

Play Episode Listen Later Oct 6, 2021 54:25


00:47 - Jen's Superpower: Being Optimistic * Recognizing Negative Loops * Intentionality & Prioritization * Preventing Security Vulnerabilities 10:13 - Working On Open-Source Projects vs Commercial Software/Products * Gathering Feedback (RFCs) * Baby Steps = Big Impact 12:57 - Major vs Minor Releases * Semantic Versioning * Deprecation Warnings * Advanced Notice * Incremental Rollouts 18:45 - RFC / Feedback Processes * Dealing with Contradictory Feedback * Reaching Consensus * Visionary Leadership * Additions 23:25 - The Ember Core Team (https://emberjs.com/teams/) * ~30 People * Funding * LinkedIn (https://www.linkedin.com/) (Corporate Sponsorship) * Consultants & Consultancies * Volunteers 26:31 - Doing Open Source Better * Sponsor Company (Time) * Knowledge Sharing * Framing Work As How It Values Contributors * Reframing How We Think About Open Source Sustainability (i.e. Company-Wide Open Source Work Days) * Frame Value to Company * Frame Value to Users * Frame Value to Engineering Teams * Attitude Shifts 39:56 - Participation Encouragement & Engagement Tips * Use The Buddy System * Having Well-Scoped Issues * Increasing Levels of Challenge (Subtle Cheerleading) * Help People Spin Up Quickly 46:00 - Widening the Pool of Participants * Being Easy to Reach * Social Media Activity * Working In The Open 47:36 - UX-Driven Design (User Experience-Driven Design) Reflections: Damien: Perspective of those impacted. Sponsors, users, etc. Arty: What it's like to work on a big open source project and the challenges we face. Jen: Exploring small-project lifecycles. This episode was brought to you by @therubyrep (https://twitter.com/therubyrep) of DevReps, LLC (http://www.devreps.com/). To pledge your support and to join our awesome Slack community, visit patreon.com/greaterthancode (https://www.patreon.com/greaterthancode) To make a one-time donation so that we can continue to bring you more content and transcripts like this, please do so at paypal.me/devreps (https://www.paypal.me/devreps). You will also get an invitation to our Slack community this way as well. Transcript: ARTY: Hi, everyone and welcome to Episode 253 of Greater Than Code. I am Artemis Starr and I am here with my fabulous co-host, Damien Burke. DAMIEN: And we are here with our fabulous guest, Jen Weber. Jen Weber is a member of the Ember.js core team and is a senior software engineer at ActBlue Technical Services. Jen loves open source, rapid prototyping, and making tech a more welcoming industry. Jen, thank you so much for being here. Welcome to the show. JEN: Thank you so much for having me. DAMIEN: So you should have gotten an email preparing you for the first and most difficult part of every appearance on Greater Than Code. Are you ready for this? JEN: I am. 
DAMIEN: What is your superpower and how did you acquire it? JEN: All right. So I did get that email and I've been thinking about those for the last couple of days. I think my superpower is being able to imagine the ways that things can go well. DAMIEN: Wow. That's very special. JEN: Thank you. DAMIEN: How did you acquire that? JEN: So I used to be very good at imagining all of the ways that things can go badly. Those are still the patterns that my mind walks whenever I'm confronted with a challenge, but someone gave me some advice. I was recounting to them all of the ways that things could go badly, they were like, “What would it look like if things went well?” I've been trying to build that as a muscle and a skill anytime I'm working on a new project, or something hasn't gone well, something's already gone badly, and I'm trying to figure out what to do next. I found that helped me open up to more creative thinking. ARTY: I really think that is a superpower and in order for things to go well, for us to manifest good things toward a good direction, we have to be able to see the steps to get there, imagine ourselves walking in that direction to be able to do it. And if we're caught in a loop of worrying about all the things that are going to go wrong, anticipating those things going wrong, then it's like we're going to be waiting for him and doing things that help bring those things that we don't want into being. So if you find yourself in this mode, it sounds like this is something that you struggled with and learned this adaptive skill to break out of this pattern. So what kind of things do you do? Like, do you tell yourself things or ask yourself certain questions, or how do you snap out of that mode and get to a better place where you're thinking about things in a positive frame? JEN: Sure. I think for me, the first step is just recognizing when I'm in that negative loop and accepting that it's my first reaction, but that doesn't need to be my conclusion to my thought process. If I'm working on let's say, there's a real-world challenge. Just to give an example as part of my work on the Ember core team, I might think about how do I engage the community and announce that there's going to be this new version of Ember? If I imagine things going badly, I imagine like, “O, wow, nobody even retweets it a single time,” and if I imagine things going well, I think like, “Wow, it's this big moment in tech.” And if it was a big moment in tech, what would have the involved people done to get to that successful end point and trying to work backwards from that to connect the dots. It takes some intentionality, it takes having enough rest, it takes not being over-caffeinated to be able to unlock that kind of thinking. DAMIEN: But it sounds so powerful, especially as an engineer, or as an advocate. It's like because we're in the role of making things into what we want them to be, which is things going well, right? JEN: Yeah, and it's a little different than a wishful thinking, I would say, because you're still thinking in order for things to go, well, you have to overcome challenges, you have to solve problems, you have to prioritize, there's going to be difficult moments. So you're not just dreaming that this good feature is going to come into existence, but actually figuring out what are the nuts and bolts, and pieces, like, what are the ingredients to that recipe? When we think and reflect on that, how can we take those ingredients and apply them to right now to get where we want to go? ARTY: So you take that vision and then work backwards and translate that to actual action. These are things that we can do right now to walk the path of getting where we want to go. JEN: Mm hm, and it might take you somewhere totally different direction. It might be very different by the time you're done. But usually, you can figure out a few things here and there that are steps in the right direction, and the right direction could be one of many different directions. ARTY: Do you find yourself ever getting disappointed that things don't go the way you envisioned? JEN: Oh yeah, for sure. [laughter] Yeah, and I think that's a little bit part of the rollercoaster of being involved in software. Like every single day is a series of things going a little different than you thought they would. You read the code; you think it's going to go a certain way. You're wrong; you change your plan. You have this idea of a direction you're going to go, you've thought about what are the successful steps to get there, and then you end up in the wrong corner and you have to go back to the drawing board and surviving those cycles is just part of what we do. ARTY: So does that superpower help you escape those feelings of disappointment then? JEN: Oh yeah, I think so because not that I have some way to see the future, but more that I have tools for helping to figure out what my next step could be. ARTY: So then you're always focused back on action. JEN: Mm hm. ARTY: And how can I take what I learned and this vision of what a good direction would be, taking these new data points and things into account, and then reimagine and translating that back into action. JEN: Yeah. ARTY: I think that qualifies as a superpower. DAMIEN: Yeah, I think about it, I guess because I was writing code this morning, and so often, when you're writing – when I'm writing code at least, it's like oh, the phrase was “defensive programming” from a long time ago. How can this go wrong? What happens if this is nil? What happens if some evil guy in a black hat comes in and tries to do something here? And what I've had to learn and still need to remind myself of is the good case. What is it that we're doing good for our users, or whoever else the code touches? What are they trying to accomplish and what experience are we trying to create for them? And so, both, as an engineer and a product manager, just being able to ask that question and see an answer on a small scale on a feature in stories, super important. JEN: Yeah, and even if you're thinking of that adversarial aspect where it's like, you're trying to think through all of the security risks that are involved in developing some software, you can still use this thinking to your advantage. What would a successful future be where somebody tries to exploit that vulnerability and they fail? You've got them. What are the things you built? What are the strategies and habits that that team had? What is the monitoring and infrastructure that resulted in successfully preventing this, or that problem from occurring? DAMIEN: It's not only a useful strategy and also, feels really good. JEN: Mm hm. DAMIEN: That's great. ARTY: I like that, though just thinking from a standpoint of just vulnerability, or even a case where things go “wrong,” in the case that you do have somebody hacking your system, or trying to exploit some vulnerability, what's the logging and information infrastructure? What does that story look like where even though these things are happening, we're prepared, we have the right things in place to give us visibility into what's going on, and be able to catch it and address it quickly. Like what do all those things look like such that we're ready to go and can still have a success story, even in the case of these challenges that come up? DAMIEN: That sounds connected to something, I think we want to talk about today, which is what goes well when you get a major library upgrade, what does that look like? JEN: Yeah. I've been thinking about this a lot lately; informed by two things. So one is that I'm involved in an Ember, which is a frontend JavaScript framework, and we're getting ready to do a 4.0 major release. So going through all of those exercises to have preparedness all comes back to how do we do this, or what do our users need, what are the resources that are missing? That's one thing on my mind and the other is that I've recently updated some dependencies in the apps that I work in and had a hard time. What can I learn for myself about what to do differently? What can I learn that might be takeaways for library maintainers? What can I share with my coworkers and my collaborators to make this easier next time? ARTY: What's it like working on an open source project and how does that feel different? What are the different aspects of that from working on a commercial product versus something in the open source community? JEN: There's a couple of pieces. The biggest one is that when you're working in your own code base, you have at least a fuzzy picture of what the product is, what the constraints are, how many users there are, and the things that the developers on your team generally know and the things that they don't know. You have all this information that would help you inform how do I roll out some new, big feature, or something like that. When you're working at open source, your universe of possible products, developers, and users is huge. Like, you could never write down a list of all the ways that somebody is going to be using that software and so, it becomes really different than having a set of well-defined products requirements; we want to get from point A to point B. It's like, we need to give everybody a path forward even though they're using this tool in all these different ways. To do that, a lot of effort goes into gathering feedback from other people in the community. So we use a process called RFCs, or Requests for Comments where someone says, “Hey, I think this would be a good feature. Hey, I think this thing should be removed, or deprecated,” and you have to get feedback. Because we can't imagine all the ways ourselves that someone could use this feature, or tool and then once there's consensus amongst the core team, then something can move forward. But everything goes through a lot of iteration as part of that process. So the overall progress can sometimes feel slow because you have to think through all of this extra weight—the weight of depending on thousands and thousands of developers and billions of users on you to make the right decision. It means you can't just “Oh, let's just merge this breaking change and I'll make this breaking change and I'll just post on Slack to everybody like, ‘Hey, watch out. I just changed this one thing. I documented it here. Good luck.'” You can't really quite pull that lever in the same way, but when you do have a step forward, it's a step forward for all of these apps, for all of these projects, for all of their users and so, little baby steps can still translate into really big impact. ARTY: So when you have something that's a major release in that context, like a major release of Ember versus a minor release. How are those different? What kind of things do you do in major releases? JEN: Yeah, that's a good question. So I'll just provide a little bit of background information on this vocabulary that we're using for anyone who's listening in. A lot of projects follow semantic versioning, which is a set of rules that a lot of projects agree to follow that if you ever see a version number that's like 4.2.1.—oftentimes, that's semantic versioning and action in the first number—is for major releases and a major release is one that has a breaking change. So that means that I make a change in that code base. I would expect that other people would have to change the code in their own apps and they would be forced to go through that—make that change—in order to upgrade to that version for the library I'm working on. Minor is usually used for features. Patch, the last one, is used for bug fixes and internal refactors, things like that. Not all projects follow in the same way. Some projects have time-based cycles where they say, “Oh, we do a major release every six months,” or something like that. But for us major releases are breaking changes and the things that are different about them is that we have to give people a path forward to get to the next version. That could include putting some deprecation warnings, any code that's going to get removed or change any API that are going to shift in the next major version. We want to let people know, with a little warning, if they're using those older syntaxes, or APIs, whatever's going to be removed. We also want to try to give a lot of advanced notice about what's going to change, or be removed via blog posts, things like having a help channel set up maybe that's just for those upgrades. When it's time to actually do the major release, we try to make it boring. This is something that I would like to see happen across the rest of the JavaScript ecosystem. It does seem to be catching on more, which is that when you do a major version release, all it does is it removes the things that need to be removed. You make your breaking changes and that's it, and then in follow-up releases is when you add in all the new features. So let's say, some API is just the old way of doing things. It doesn't match up with a new rendering engine, or something like that. You're going to want to remove the old thing and then incrementally work to roll out these big splashy, new, exciting features. So maybe your exciting release is actually going to be 4.1, or 4.2, or 4.3. This has a couple benefits. It lets your major releases be a little less risky because you're not just removing code and then adding new code at the same time. It lets people not be as overwhelmed like, “Oh, first I have to deal with all of these things that are removed, or changed and then now I also have to learn this whole new way of thinking about how to write my app using this tool.” It lets you take little baby steps towards doing things in a different way. DAMIEN: Does this mean, in an ideal scenario, that if you don't have any deprecation warnings—if you're taking care of all the deprecation warnings—then your major release can go – you can upgrade some next major version without a code change. JEN: Yeah, that's the dream. DAMIEN: It does sound like a dream. JEN: Yeah, and it's not always perfect, but it's an important pathway towards including more people and participating in upgrades, app maintenance, and creating sustainable code bases so you don't have to follow the Twitter, the blog post, and be checking the JavaScript subreddit just to keep up on with what's going on. You're not going to be surprised by big sweeping changes. So coming back to this experience I had with upgrading a different library recently, I was upgrading major Jest versions and was very surprised to see that there were a ton of breaking changes in a changelog and I got a little bit frustrated with that. And then I went back and I read the blog posts and I saw a blog post from 2 years ago saying, “These are the things that we are doing, this is what is happening,” and that was great, but I wasn't doing Jest tests 2 years ago and so, I missed all of that. Can we use the code base itself to connect those dots, make those suggestions, and guide people towards the work that they do? DAMIEN: If they put those deprecation warnings in 2 years ago, you would've had 2 years to make those changes. JEN: Yeah. DAMIEN: And then when you finally upgraded, it would have been a dream, or have been painless. JEN: Yeah, and maybe they're there. Maybe there are some and I just need to pass the debug flag, or something. Hopefully, there's nobody who's shouting at their computer. But there's this one thing that we put it in the console log output, or something. It's possible I overlooked it but. DAMIEN: I want to rewind a little bit back to the challenge of dealing with a product that is used in so many contexts by so many people, like Ember is, and the RFC process. The first thing I thought of when you mentioned that is what do you do with contradictory feedback? Surely, you must have hundreds of engineers who say, “You have to get rid of this,” and hundreds who say, “No, this has to stay.” How does the core team manage that? JEN: Yeah. So I think the most important piece is the contradictory feedback needs to be considered. So it's not just like, “Oh, let's collect these comments as annual feedback forms,” or anything like that. [chuckles] This isn't like, “Oh, let's do some natural language processing on these comments to figure out if the sentiment is positive, or negative.” [chuckles] None of that stuff you have to actually read through them and think what could I do using this new feature to help meet this person's needs, or what's at the heart of the objection that they're making? If someone is saying, “This doesn't work for my team,” and entering that process with a willingness to iterate. In the end, we can't make everybody happy all the time, or no RFC would ever get moved forward. There's always going to be a point where you have to prioritize the pros and cons, and ultimately, the decision comes down to reaching consensus amongst the core team members. So being able to say, as a group, “We believe that the feedback has been considered. We believe that the iterations have been incorporated, the people's concerns have been addressed,” or “We're going to work to create tools that think that problem be not a problem for them,” and find a way to move forward with whatever the proposal is. Or sometimes, the proposals don't move forward. Sometimes, they get closed. ARTY: Is the work you end up choosing to do primarily driven by this feedback process, or do you have some visionary leadership within the core team that drives a lot of things forward that aren't necessarily coming via feedback? JEN: That's a good question. I think it's a little bit of both. So certainly, a lot of RFCs have come from the community and from people asking like, “Hey, can we have this better way of doing things? I have an idea.” And then other times, you do have to have that visionary leadership. So to give an example, we have just started doing – well, I shouldn't say just started doing that. I think it's been like 2 years now. We have started doing this process called additions where if there's a big splashy set of cool features that are meant to be used together, we give it a name. That's separate from the breaking changes process, ideally. We can create nice, new splashy sets of features without breaking people's apps and trying to design that experience isn't something that you can just piecemeal through RFCs waiting for feedback to come through. There were quite a few members of the core team that designed a new way of building Ember apps that was better aligned with focusing on HTML as the core of building for the web and focusing on JavaScript features as opposed to requiring developers to know and understand the special API syntaxes. You can just write JavaScript classes instead of needing to understand what an Ember object is. So aligning ourselves more with the skills that everybody, who works in the web, has at least a little bit of. That took a lot of brainstorming, a lot of planning, and ultimately, introducing those things still follows an RFC process. Somebody still has to say, “Here's the thing we want to change, or do, or add. Here's the greater vision for it.” But to get that big picture look still requires the big thinking. So the core team, I don't even know how much time. They must've spent countless hours trying to hash out those details. ARTY: How big is the core team? JEN: So there's several core teams. Though when you say the core team as a whole encompasses people who work on the data layer, the command line tools, the learning tools, and then the framework itself. I want to say, could look this up, it's like upwards of 30 people, I think. ARTY: Wow. JEN: I can get you the exact number later, [chuckles] but everyone's pulling out their different area of domain and so, all of those teams also have to coordinate around these major releases because we want to make sure the work that we're doing is complimentary. If we do the framework improvements, but we don't fix up the docs, we're not on the good path for a successful release. ARTY: Are people working on this stuff full-time? Are people funded, or doing this in their free time, or how does that work? Because there's this big picture challenge of we have this ideal of community sourced, open source projects, and then the realities of trying to fund and support that effort bumps up to constraints of needing to make a living and things and these sorts of difficulties. How do y'all manage that? JEN: It's a mixture. So the Ember project is fortunate to have a major player—LinkedIn—that uses Ember and so, some of the core team members, their work on Ember is part of their LinkedIn work because of the frameworks doing well, then LinkedIn projects that are going to be doing well. There's also a number of people who are consultants, or who run consultancies that do Ember work, they're involved. Their voice is an important part of making sure that again, we're serving a variety of apps, not just ah, this is this tool that's just for the LinkedIn websites. But it's like, they've seen so many different kinds of apps; they're working on so many different kinds of apps right now. And then there's people who help out on more of a volunteer basis. So I've been in my past work, it was at a different job. It was part of my job responsibilities to participate on the framework core team. These days, I'm more of a volunteer and I mostly help organize other volunteers—people who want to do some professional development to learn, people who want to network, people who found something that they're frustrated about enough that they want to fix it themselves. That's how I got involved; I wanted to learn. So that's the sustainability of having people involved is always an ongoing challenge it is for every open source organization, I think. ARTY: Yeah. Do you have any ideas on how we can do those sorts of things better? As you said, it's a concern, in general with how do we do open source better with these kinds of constraints? And then two, I feel like there's been some cultural shifts, I guess, you could say over time of you think about when the open source movement first started. We had a lot more of this community ownership ideal where we really were going and building software together and now, there's a lot more of, well, there's all this free software out there that we use, that we build on top of to build our apps on, but that ownership piece isn't really there. It's an expectation that there should just be this free software out there that's maintained that we get and why is it falling apart? So I feel like, culturally, just over time, some of those things have shifted as far as expectations around open source and then you talked about some of the corporate sponsorship aspects with usage as being one way these things get funded. But I'm wondering if you have ideas on how some of these things could work better. JEN: People have done PhDs on this topic, I'm pretty sure. [chuckles] Like, theses. I read a white paper, a really involved white paper, a few weeks ago that was about, what was it? it was called something like the Burden of Maintaining Software, or something like that and it did this deep dive into how much goes in and just keeping the ship afloat. How much goes into just if there's a package that needs to be updated? That kind of ongoing, constant, mundane work that adds up really, really big. So for very large projects, I think it's a good thing to have some sort of an evolvement of a sponsor company, if you will and so, that sponsor company may not actually ever donate any money, but the time of their engineers that they say like, “Hey, we're willing to help support this project” is really important. I think another piece is that the leadership of projects should consider the people involved, that that group is going to be rotating. That people's involvement is ephemeral. Every time somebody changes jobs, maybe they're not going to be involved in that project anymore. If we can think about that ahead of time, plan for it, and make sure that we are sharing knowledge with each other such that the project can survive somebody moving onto something else, it can survive somebody going on vacation for a while. So I think that's another key component of success is how do you make it so that you're not just relying on the same set of people still being there so many years later? We've been very fortunate within the Ember community that a lot of the same people have stuck around, but I try really hard not to bank on that. The group of contributors that I help organize, I think, “Hey.” We have a chat every time somebody joins the learning core team and say, “Hey, we get that you're not going to be here forever. Please let us know what we can do to support you. Please let us know when you're thinking of taking a break, or taking a step back. Please involve other people on any project that you're working on so that they will also continue your work and also support you so you don't get burnt out. Another thing I try to do is always framing the work into how it values the contributor. Sometimes in open source you hear this discussion of like, “Oh, well, everyone should participate in open source because we all benefit from it.” There's a better attitude that we can have, I think, which is that for people who are interested in participating, what can they get out of it? What can I do as a leader to help them get something out of this? If you just approach it with this altruism of “This is a community and I want to help,” that'll get you like a little bit. But if you can say, “I want to help because I want to learn from other developers,” that's something I can deliver on. That's something that they can take. That's valuable for their future earning potential, income, confidence, maybe they'll make the connection that helps them find their next job. Even if someone isn't being paid to help out, is there something that they can take away from this? And lastly, just acknowledging that doing work for free is a privilege as well. We have to reframe how we think about open source sustainability, too. Not everybody can devote a few hours after work here and there and involving them and including them means that it's got to be part of their workday. So continuing to socialize from the company level that engineers should have a little bit of time here and there to try to help improve an open source project. Everybody doing that just a little bit helps with quite a few of the problems that these projects face. ARTY: I've been thinking about this myself and you work directly, you're significantly involved in a major open source project, and so, you see things that a lot of people don't have perspective on. So I appreciate your insights on this. I'm wondering what if major companies that were using open source software, if we made more efforts for companies to be a project sponsor and donate part of the company somebody who's on the company's time to help contribute to projects as like a thing. I feel like if that thing caught on, that the companies that were using this software for free [chuckles] had more of a sense of a social obligation to be one of the people that contribute some time to helping with that. Or get some companies that are big enough, too. It's probably easier and they have more interest in those sorts of things. But I feel like if we did make that more of a thing, that that would be useful because as you're saying, somehow realistically speaking, this has to be something that can be worked into the workday. JEN: Yes. ARTY: For us to be able to support and sustain these things. And people that can do that outside of their workday as an extra free time thing. It really is a privilege. JEN: Yeah. I think a couple of strategies that can help here are to frame it in the value to the company and frame it as a value to the users, frame it as a value to the engineering team. So rather than having it be like, “Oh, you use free software, you should do this thing.” Instead more like engineers, we always need to learn constantly in order to keep improving our own skills and to keep up with things that are changing. So having an open source hour, or something like that—it takes a little more than an hour usually to accomplish much. But having a period of time that engineers were allowed to contribute to open sources. Professional development that you don't have to pay for a subscription. You don't have to pay for a licensing fee. You don't have to pay for somebody's conference submission. If someone has the opportunity to reach outside of their sphere of knowledge, or comfort zone and it just so happens that if they succeed, it'll benefit your company maybe indirectly. Another piece is what's the value to the users? So there were a bunch of people who all contributed effort towards bringing some improved linting tools for the template system within Ember. When we think of linting tools, we usually think that's like, “Oh, here's this thing to remind me to use nice tidy syntax and don't make my variable names too long and space everything out in a certain way,” but they can also help us find real actual problems in our apps. So an example that this team worked on is they introduced some more linting rules for accessibility. If one person succeeds in introducing this new linting rule for accessibility, then it's there in their app for their team and they get to stop talking about, “Hey, make sure you do this one thing” over and over again because now it's enforced in the code base. Also, they've brought this benefit to all of the other apps that are out there. Again, sometimes you can tie it back in to that value for the product and for the users, and really trying to think creatively about that connection. Because there's so many different things we can all spend our time on, you've really got to sell it in a way that aligns with the goals, or values of that organization. ARTY: Yeah. I like that reframing. I can see just how important that is. Other things I'm thinking about if you had a dev team and one of your developers was really involved with the Ember core team, you'd have more knowledge about how things worked. So when something was broken, or something, you probably have more insight into what was going on and being able to help the team more effectively – JEN: Yeah. [overtalk] ARTY: To build stuff. And then if there's any suggestions, or things that could make things easier for your team, you'd have the ability to have influence with getting RFPs through to get changes made and things. I think you're right. It needs to be reframed as a value proposition. JEN: Yeah, and it also requires an attitude shift on the side of the projects as well. There's tons of people who've tried to do open source and hit running straight into a wall of they open up pull requests that are never merged, or even reviewed and that can be a really frustrating experience. And some projects just don't have the feedback structure, or the governance structure that really allows open participation either. So that's something that I think is an ongoing journey with lots of projects. It's like, how do we communicate? How do we involve other people? What types of decisions do we say like, “Hey, implementer, or community, you're in charge, you can make this” versus things that have to pass some sort of review. It's not just a one side of companies need to step up, but also, maintainers seem to have a long-term vision of how they're interacting with everybody else. DAMIEN: Yeah, I really love that frame of this is professional development and that you can get for free. That's like how would you like to educate your engineers and make them better engineers, especially on the tools you work on and not –? Yeah, that's really awesome. But then of course, on the other side, you need a welcoming environment. That's like, “Oh yeah, when you make a contribution, we're going to look at it. We're going to give you useful feedback on it.” JEN: Yeah. I tried to get an open source project going a few years ago and I struggled for a while and eventually ended up giving up. But some of the things I ran into, I'd have somebody that would volunteer to help out with things and I'd work with them long enough to just start to get a feel for things and be able to contribute and then they would disappear. [laughs] And I go through that process a few times. It's like, “Oh, yay. I'm excited, I get –” another person has volunteered and so, then I go and start working with them and trying to – and I put a lot of attention into trying to get things going and then they disappear. t was difficult to try and get traction in that way and eventually, I went, “Well, I'm back by myself again” [laughs] and that I just need to keep going. ARTY: Right. So what kind of things have you found help with getting that participation aspect going and what kind of things are barriers that get in the way that maybe we can be better at? JEN: Yeah. So my advice is always start with using the buddy system. Trying to pair program with people, who I'm hoping to stay involved, and the leveling up version of that is the people who are contributing pair with each other. It's so much more fun. There's so much more of a learning experience when it's two developers working on the project. Left to my own devices, the projects that I work on, I have to really dig into my willpower to keep them moving if I'm the only person working on it versus if we're pairing, what's the value that I'm getting? It's like, I get to hear how the other person approaches the problem. I get to experience how they work. They teach me things. I teach them things. We have this good rapport. So I pair once a week with my friend, Chris, and we work on everything from this kind of mundane stuff to the big vision, like what would we do if we could totally change how this thing works, or something like that, and that kind of energy and get ideas, they build up. So that's one piece. The other, this one's difficult, but having well-scoped, well-written issues is a huge time sink, but also, it can be one of the best ways get people engaged and keep them engaged. If I stop writing really specific issues, people peter off. Someone will ask, maybe only once, they'll ask, “Hey, I want to help out, or something. What should I pick up next?” They don't usually ask a second time, but I don't have something right away to hand off to them. So what is the momentum? Can I keep writing up issues and things that other people can follow through with? And then presenting them with increasing levels of challenge of like, “I have this unstructured problem. We've worked on this a lot together. You can do this. How would you approach this? What do you think we should do?” I don't necessarily say,” You can do this,” because it's more of a subtle cheerleading that's happening than that. But “I'd love to hear your proposal of what should happen next” just is a really powerful moment and sometimes, that can be the thing that catapults somebody into taking more ownership of a project and gathering together other people to help them out. And then people do come and go, but the commits are still there! So that's something, right? [chuckles] Like, things have taken some steps forward. DAMIEN: Yeah. People come and go, that's something you know you have to accept on an open source project, but it happens in other places, too. [chuckles] No team stays together for all of eternity. JEN: Right. DAMIEN: Is the project going to live on and how can you make it so that it does? So these are very good lessons, even for that. ARTY: It seems like just investing in thinking about, we were talking initially about planning for the success case, even when things happen. So if we think about the case of okay, people are going to leave the team. [chuckles] What's the success case look like? Imagining the way that things go really well when people are leaving the team, what does that look like? What are the things that we wish we had in place to be able to ramp people up quickly, to be able to find new people, to work on the project quickly? All of those things that we can think about and open source has this to a much larger degree and challenge so that you really have to think about it a lot. Where on a commercial project, it's one of those things that often happens when you wish it wouldn't and one of the things I see in corporate companies is you'll have a management change, or something will happen with a product that upsets a bunch of people and you'll have exodus phase on the project and then ending up often rewriting things because you lose your core knowledge on the project and nobody knows what's going on anymore and it actually becomes easier to rewrite the things than to [chuckles] figure out how it works. If we had imagined the ways that things could go well and prepared for those certain circumstances, maybe we wouldn't be in that situation. ARTY: Yeah. You mentioned something really important there, too, which is what can we do to help people spin up more quickly on something. That's another big piece of sustained engagement because you need a group of people spun up quickly. You need a group of people who can figure out the next steps on their own. And so, we've spent a lot of time, the projects that I work most actively on, making sure that everything is there in the Read Me, making sure that if you run npm start that things work if you're running it on a different environment. Those types of little things, reducing those barriers can also go a long way and just widening the pool of people who could potentially help is another big one. DAMIEN: How do you do that? Because you're a core contributor on the project. You have the curse of knowledge. JEN: Yes. DAMIEN: You have a development scene that is tightly home to work on this project. JEN: That's a great question. Ah, I do have the curse of knowledge. Being easy to reach so that if people do encounter problems that they can find you and tell you, which can be, it can be a small step. Just making sure that if you have a documentation page, it's got a link at the bottom that's like, “Find a problem, open an issue!” That sort of thing. Also, I'm pretty active on Twitter. Sometimes other contributors, experienced contributors, they'll spot something that somebody else has posted and they'll say, “Hey, Jen, take a look at this,” and they bring it to my attention. There's this team effort to uncover those gaps. Another aspect is just working in the open. So having open meetings, having open chat channels, places where people can interact with the people leading the projects, they can come to the meetings, things like that means that we're more likely to hear their feedback. So if we get feedback, “Hey, this thing was difficult,” making sure that we address it. DAMIEN: Wow. Well. JEN: I'm really big into user experience driven design. We've been talking about maintainability a lot, we've been talking about the code, and versions, and things, but coming back to what is the impact for our users. If you accept a user experience driven way of developing software, it means that you're always going to need to be upgrading, you're always going to have to be flexing, changing, and growing because the products of 2 years ago versus the product of today can be really different. Open source library that you needed to rely on 2 years ago versus today. Maybe the web app ecosystem has shifted. Maybe there's new ways of doing things. Maybe there's new syntaxes that are available. Sometimes, it can be a little frustrating because you feel like, “Oh, there's this endless pile of work. We made all these wrong choices back in the day and now this thing's hard to upgrade,” and all that. A different mindset is to think about what do we know today that is different than what we knew yesterday? What are the things we know today about our users that inform our next move? How do these upgrades, or improvements, or my choice of open source library help the end user have a better experience? And trying to come back to that big picture from time to time, because it can be pretty frustrating. When you get stuck, you think like, “Oh, I can't. I just tried to upgrade this major version and everything broke and everything's terrible. But what's the feature list look like, how am I going to use this to deliver something better to the users can really help?” DAMIEN: Wow. ARTY: So at this part of the show, we usually do reflections and finish off with any final thoughts we had, or takeaways from the episode. Damien, you want to start? DAMIEN: The big takeaway I got from this is kind of… it's perspective. Jen, you mentioned a user experience driven design. I was already really close to that language, but from a perspective of contributors to an open source project, sponsors—both in terms of engineering and then money—and then also, users. Like, these are also users. These are also people who are impacted by the work we do. So in order to do it successfully, it's very important to think of how can this go well for them and then move to that direction. So thank you, that was really great. M: For me, the big takeaway, I feel like I learned a whole lot just perspective wise of what it's like to work on a big open source project. I haven't really had a conversation like this with someone that's been that involved with a major resource project before. So I found that really insightful. One of the big questions I asked you about how do we make this sustainable? [laughs] Like all the challenges around things. I know they're big challenges that we face in figuring that out and you had some really key insights around how we can frame things differently as opposed to framing it as an obligation, like a social obligation, or you should do this altruistically because it's the right thing to do as the appeal that we make is when you're talking to a contributor, how do you frame things to be a value proposition for them as an individual. When we're talking to a company, how do we frame things in a way so there's a value proposition for the company to get involved with doing something? And change the way that we frame all these things to be able to get folks involved because they realize benefits as individuals, as company, as people being directly involved in things? I feel like if we can do some work to maybe change some of the framing around things. That maybe there's a pathway there to increase engagement and support of open source projects, which I think is one of those things that we really need to figure out. There's not really easy answers to that, but I feel like some of the insights you came to there are really key in finding a pathway to get there. So thank you, Jen. I appreciate the conversation. JEN: So for me, when I'm reflecting on the most is the story that you shared already of trying to get people involved and just having them leave. They show up for a little while and then they disappear and where does all that work go? I'm interested to explore a little bit more of that small project life cycle. I was pretty fortunate to just come in at a time where there was already a well-established community when I started getting involved in Ember and I'd love to hear more from other people about what are the success stories of those first few steps where someone began this little project and it really started to grow and take off. This might be a case where like some of the strategies I described, they work when you already have an established community. So it's kind of like a catch-22. I don't know, that could be a really cool future episode is the beginning. DAMIEN: Yeah. That's something I'd definitely like to hear about. ARTY: Well, thank you for joining us, Jen. It was really a pleasure talking with you. JEN: Thanks so much for having me! Special Guest: Jen Weber.

The Bike Shed
311: Marketing Matters

The Bike Shed

Play Episode Listen Later Oct 5, 2021 37:37


Longtime listener and friend of the show, Gio Lodi, released a book y'all should check out and Chris and Steph ruminate on a listener question about tension around marketing in open-source. Say No To More Process, Say Yes To Trust by German Velasco (https://thoughtbot.com/blog/say-no-to-more-process-say-yes-to-trust) Test-Driven Development in Swift with SwiftUI and Combine by Gio Lodi (https://tddinswift.com/) Transcript: CHRIS: Our golden roads. STEPH: All right. I am also golden. CHRIS: [vocalization] STEPH: Oh, I haven't listened to that episode where I just broke out in song in the middle. Oh, you're about to add the [vocalization] [chuckles]. CHRIS: I don't know why, though. Oh, golden roads, Golden Arches. STEPH: Golden Arches, yeah. CHRIS: Man, I did not know that my brain was doing that, but my brain definitely connected those without telling me about it. STEPH: [laughs] CHRIS: It's weird. People talk often about the theory that phones are listening, and then you get targeted ads based on what you said. But I'm almost certain it's actually the algorithms have figured out how to do the same intuitive leaps that your brain does. And so you'll smell something and not make the nine steps in between, but your brain will start singing a song from your childhood. And you're like, what is going on? Oh, right, because when I was watching Jurassic Park that one time, we were eating this type of chicken, and therefore when I smell paprika, Jurassic Park theme song. I got it, of course. STEPH: [laughs] CHRIS: And I think that's actually what's happening with the phones. That's my guess is that you went to a site, and the phones are like, cool, I got it, adjacent to that is this other thing, totally. Because I don't think the phones are listening. Occasionally, I think the phones are listening, but mostly, I don't think the phones are listening. STEPH: I definitely think the phones are listening. CHRIS: Hello and welcome to another episode of The Bike Shed, a weekly podcast from your friends at thoughtbot about developing great software. I'm Chris Toomey. STEPH: And I'm Steph Viccari. CHRIS: And together, we're here to share a bit of what we've learned along the way. So, Steph, what's new in your world? STEPH: Hey. So we have a bit of exciting news where we received an email from Gio Lodi, who is a listener of The Bike Shed. And Gio sent an email sharing with us some really exciting news that they have published a book on Test-Driven Development in Swift. And they acknowledge us in the acknowledgments of the book. Specifically, the acknowledgment says, "I also want to thank Chris Toomey and Steph Viccari, who keep sharing ideas on testing week after week on The Bike Shed Podcast." And that's just incredible. I'm so blown away, and I feel officially very famous. CHRIS: This is how you know you're famous when you're in the acknowledgments of a book. But yeah, Gio is a longtime listener and friend of the show. He's written in many times and given us great tips, and pointers, and questions, and things. And I've so appreciated Gio's voice in the community. And it's so wonderful, frankly, to hear that he has gotten value out of the show and us talking about testing. Because I always feel like I'm just regurgitating things that I've heard other people saying about testing and maybe one or two hard-learned truths that I've found. But it's really wonderful. And thank you so much, Gio. And best of luck for anyone out there who is doing Swift development and cares about testing or test-driven development, which I really think everybody should. Go check out that book. STEPH: I must admit my Swift skills are incredibly rusty, really non-existent at this point. It's been so long since I've been in that world. But I went ahead and purchased a copy just because I think it's really cool. And I suspect there are a lot of testing conversations that, regardless of the specific code examples, still translate. At least, that's the goal that you and I have when we're having these testing conversations. Even if they're not specific to a language, we can still talk about testing paradigms and strategies. So I purchased a copy. I'm really looking forward to reading it. And just to change things up a bit, we're going to start off with a listener question today. So this listener question comes from someone very close to the show. It comes from Thom Obarski. Hi, Thom. And Thom wrote in, "So I heard on a recent podcast I was editing some tension around marketing and open source. Specifically, a little perturbed at ReactJS that not only were people still dependent on a handful of big companies for their frameworks, but they also seem to be implying that the cachet of Facebook and having developer mindshare was not allowing smaller but potentially better solutions to shine through. In your opinion, how much does marketing play in the success of an open-source project framework rather than actually being the best tool for the job?" So a really thoughtful question. Thanks, Thom. Chris, I'm going to kick it over to you. What are your thoughts about this question? CHRIS: Yeah, this is a super interesting one. And thank you so much, Thom, although I'm not sure that you're listening at this point. But we'll send you a note that we are replying to your question. And when I saw this one come through, it was interesting. I really love the kernel of the discussion here, but it is, again, very difficult to tease apart the bits. I think that the way the question was framed is like, oh, there's this bad thing that it's this big company that has this big name, and they're getting by on that. But really, there are these other great frameworks that exist, and they should get more of the mindshare. And honestly, I'm not sure. I think marketing is a critically important aspect of the work that we do both in open source and, frankly, everywhere. And I'm going to clarify what I mean by that because I think it can take different shapes. But in terms of open-source, Facebook has poured a ton of energy and effort and, frankly, work into React as a framework. And they're also battle testing it on facebook.com, a giant website that gets tons of traffic, that sees various use cases, that has all permissions in there. They're really putting it through the wringer in that way. And so there is a ton of value just in terms of this large organization working on and using this framework in the same way that GitHub and using Rails is a thing that is deeply valuable to us as a community. So I think having a large organization associated with something can actually be deeply valuable in terms of what it produces as an outcome for us as consumers of that open-source framework. I think the other idea of sort of the meritocracy of the better framework should win out is, I don't know, it's like a Field of Dreams. Like, if you build it, they will come. It turns out I don't believe that that's actually true. And I think selling is a critical part of everything. And so if I think back to DHH's original video from so many years ago of like, I'm going to make a blog in 15 minutes; look at how much I'm not doing. That was a fantastic sales pitch for this new framework. And he was able to gain a ton of attention by virtue of making this really great sales pitch that sold on the merits of it. But that was marketing. He did the work of marketing there. And I actually think about it in terms of a pull request. So I'm in a small organization. We're in a private repo. There's still marketing. There's still sales to be done there. I have to communicate to someone else the changes that I'm making, why it's valuable to the system, why they should support this change, this code coming into the codebase. And so I think that sort of communication is as critical to the whole conversation. And so the same thing happens at the level of open source. I would love for the best framework to always win, but we also need large communities with Stack Overflow answers and community-supported plugins and things like that. And so it's a really difficult thing to treat marketing as just other, this different, separate thing when, in fact, I think they're all intertwined. And marketing is critically important, and having a giant organization behind something can actually have negative aspects. But I think overall; it really is useful in a lot of cases. Those are some initial thoughts. What do you think, Steph? STEPH: Yeah, those are some great initial thoughts. I really agree with what you said. And I also like how you brought in the comparison of pull requests and how sales is still part of our job as developers, maybe not in the more traditional sense but in the way that we are marketing and communicating with the team. And circling back to what you were saying earlier about a bit how this is phrased, I think I typically agree that there's nothing nefarious that's afoot in regards to just because a larger company is sponsoring an open-source project or they are the ones responsible for it, I don't think there's anything necessarily bad about that. And I agree with the other points that you made where it is helpful that these teams have essentially cultivated a framework or a project that is working for their team, that is helping their company, and then they have decided to open source it. And then, they have the time and energy that they can continue to invest in that project. And it is battle-tested because they are using it for their own projects as well. So it seems pretty natural that a lot of us then would gravitate towards these larger, more heavily supported projects and frameworks. Because then that's going to make our job easier and also give us more trust that we can turn to them when we do need help or have issues. Or, like you mentioned, when we need to look up documentation, we know that that's going to be there versus some of the other smaller projects. They may also be wonderful projects. But if they are someone that's doing this in their spare time just on the weekends and yet I'm looking for something that I need to be incredibly reliable, then it probably makes sense for me to go with something that is supported by a team that's getting essentially paid to work on that project, at least that they're backed by a larger company. Versus if I'm going with a smaller project where someone is doing some wonderful work, but realistically, they're also doing it more on the weekends or in their spare time. So boiling it down, it's similar to what you just said where marketing plays a very big part in open source, and the projects and frameworks that we adopt, and the things that we use. And I don't think that's necessarily a bad thing. CHRIS: Yeah. I think, if anything, it's possibly a double-edged sword. Part of the question was around does React get to benefit just by the cachet of Facebook? But Facebook, as a larger organization sometimes that's a positive thing. Sometimes there's ire that is directed at Facebook as an organization. And as a similar example, my experience with Google and Microsoft as large organizations, particularly backing open-source efforts, has almost sort of swapped over time, where originally, Microsoft there was almost nothing of Microsoft's open-source efforts that I was using. And I saw them as this very different shape of a company that I probably wouldn't be that interested in. And then they have deeply invested in things like GitHub, and VS Code, and TypeScript, and tons of projects that suddenly I'm like, oh, actually, a lot of what I use in the world is coming from Microsoft. That's really interesting. And at the same time, Google has kind of gone in the opposite direction for me. And I've seen some of their movements switch from like, oh Google the underdog to now they're such a large company. And so the idea that the cachet, as the question phrase, of a company is just this uniformly positive thing and that it's perhaps an unfair benefit I don't see that as actually true. But actually, as a more pointed example of this, I recently chose Svelte over React, and that was a conscious choice. And I went back and forth on it a few times, if we're being honest, because Svelte is a much smaller community. It does not have the large organizational backing that React or other frameworks do. And there was a certain marketing effort that was necessary to raise it into my visibility and then for me to be convinced that there is enough there, that there is a team that will maintain it, and that there are reasons to choose that and continue with it. And I've been very happy with it as a choice. But I was very conscious in that choice that I'm choosing something that doesn't have that large organizational backing. Because there's a nicety there of like, I trust that Facebook will probably keep investing in React because it is the fundamental technology of the front end of their platform. So yeah, it's not going to go anywhere. But I made the choice of going with Svelte. So it's an example of where the large organization didn't win out in my particular case. So I think marketing is a part of the work, a part of the conversation. It's part of communication. And so I am less negative on it, I think, than the question perhaps was framed, but as always, it depends. STEPH: Yeah, I'm trying to think of a scenario where I would be concerned about the fact that I'm using open source that's backed by a specific large company or corporation. And the main scenario I can think of is what happens when you conflict or if you have values that conflict with a company that is sponsoring that project? So if you are using an open-source project, but then the main community or the company that then works on that project does something that you really disagree with, then what do you do? How do you feel about that situation? Do you continue to use that open-source project? Do you try to use a different open-source project? And I had that conversation frankly with myself recently, thinking through what to do in that situation and how to view it. And I realize this may not be how everybody views it, and it's not appropriate for all situations. But I do typically look at open-source projects as more than who they are backed by, but the community that's actively working on that project and who it benefits. So even if there is one particular group that is doing something that I don't agree with, that doesn't necessarily mean that wholesale I no longer want to be a part of this community. It just means that I still want to be a part, but I still want to share my concerns that I think a part of our community is going in a direction that I don't agree with or I don't think is a good direction. That's, I guess, how I reason with myself; even if an open-source project is backed by someone that I don't agree with, either one, you can walk away. That seems very complicated, depending on your dependencies. Or two, you find ways to then push back on those values if you feel that the community is headed in a direction that you don't agree with. And that all depends on how comfortable you are and how much power you feel like you have in that situation to express your opinion. So it's a complicated space. CHRIS: Yeah, that is a super subtle edge case of all of this. And I think I aligned with what you said of trying to view an open-source project as more generally the community that's behind it as opposed to even if there's a strong, singular organization behind it. But that said, that's definitely a part of it. And again, it's a double-edged sword. It's not just, oh, giant company; this is great. That giant company now has to consider this. And I think in the case of Facebook and React, that is a wonderful hiring channel for them. Now all the people that use React anywhere are like, "Oh man, I could go work at Facebook on React? That's exciting." That's a thing that's a marketing tool from a hiring perspective for them. But it cuts both ways because suddenly, if the mindshare moves in a different direction, or if Facebook as an organization does something complicated, then React as a community can start to shift away. Maybe you don't move the current project off of it, but perhaps you don't start the next one with it. And so, there are trade-offs and considerations in all directions. And again, it depends. STEPH: Yeah. I think overall, the thing that doesn't depend is marketing matters. It is a real part of the ecosystem, and it will influence our decisions. And so, just circling back to Thom's question, I think it does play a vital role in the choices that we make. CHRIS: Way to stick the landing. STEPH: Thanks. Mid-roll Ad And now a quick break to hear from today's sponsor, Scout APM. Scout APM is leading-edge application performance monitoring that's designed to help Rails developers quickly find and fix performance issues without having to deal with the headache or overhead of enterprise platform feature bloat. With a developer-centric UI and tracing logic that ties bottlenecks to source code, you can quickly pinpoint and resolve those performance abnormalities like N+1 queries, slow database queries, memory bloat, and much more. Scout's real-time alerting and weekly digest emails let you rest easy knowing Scout's on watch and resolving performance issues before your customers ever see them. Scout has also launched its new error monitoring feature add-on for Python applications. Now you can connect your error reporting and application monitoring data on one platform. See for yourself why developers call Scout their best friend and try our error monitoring and APM free for 14 days; no credit card needed. And as an added-on bonus for Bike Shed listeners, Scout will donate $5 to the open-source project of your choice when you deploy. Learn more at scoutapm.com/bikeshed. That's scoutapm.com/bikeshed. STEPH: Changing topics just a bit, what's new in your world? CHRIS: Well, we had what I would call a mini perfect storm this week. We broke the build but in a pretty solid way. And it was a little bit difficult to get it back under control. And it has pushed me ever so slightly forward in my desire to have a fully optimized CI and deploy pipeline. Mostly, I mean that in terms of ratcheting. I'm not actually going to do anything beyond a very small set of configurations. But to describe the context, we use pull requests because that's the way that we communicate. We do code reviews, all that fun stuff. And so there was a particular branch that had a good amount of changes, and then something got merged. And this other pull request was approved. And that person then clicked the rebase and merge button, which I have configured the repository, so that merge commits are not allowed because I'm not interested in that malarkey in our history. But merge commits or rebase and merge. I like that that makes sense. In this particular case, we ran into the very small, subtle edge case of if you click the rebase and merge button, GitHub is now producing a new commit that did not exist before, a new version of the code. So they're taking your changes, and they are rebasing them onto the current main branch. And then they're attempting to merge that in. And A, that was allowed. B, the CI configuration did not require that to be in a passing state. And so basically, in doing that rebase and merge, it produced an artifact in the build that made it fail. And then attempting to unwind that was very complicated. So basically, the rebase produced...there were duplicate changes within a given file. So Git didn't see it as a conflict because the change was made in two different parts of the file, but those were conflicting changes. So Git was like, this seems like it's fine. I can merge this, no problem. But it turns out from a functional perspective; it did not work. The build failed. And so now our main branch was failing and then trying to unwind that it just was surprisingly difficult to unwind that. And it really highlighted the importance of keeping the main branch green, keeping the build always passing. And so, I configured a few things in response to this. There is a branch protection rule that you can enable. And let me actually pull up the specific configuration that I set up. So I now have enabled require status checks to pass before merging, which, if we're being honest, I thought that was the default. It turns out it was not the default. So we are now requiring status checks to pass before merging. I'm fully aware of the awkward, painful like, oh no, the build is failing but also, we have a bug. We need to deploy this. We must get something merged in. So hopefully, if and when that situation presents itself, I will turn this off or somehow otherwise work around it. But for now, I would prefer to have this as a yeah; this is definitely a configuration we want. So require status checks to pass before merging and then require branches to be up to date before merging. So the button that does the rebase and merge, I don't want that to actually do a rebase on GitHub. I want the branch to already be up to date. Basically, I only ever want fast-forward merges on our main branch. So all code should be ahead of main, and we are simply updating what main points at. We are not creating new code. That code has run on CI, that version of the code specifically. We are fully rebased and up to date on top of main, and that's how we're going. STEPH: All of that is super interesting. I have a question about the workflow. I want to make sure I'm understanding it correctly. So let's say that I have issued a PR, and then someone else has merged into the main branch. So now my PR is behind me, and I don't have that latest commit. With the new configuration, can I still use the rebase and merge, or will I need to rebase locally and then push up my branch before I can merge into main but at least using the GitHub UI? CHRIS: I believe that you would be forced to rebase locally, force push, and then CI would rebuild, and that's what it is. So I think that's what require branches to be up to date before merging means. So that's my hope. That is the intention here. I do realize that's complicated. So this requirement, which I like, because again, I really want the idea that no, no, no, we, the developers, are in charge of that final state. That final state should always run as part of a build of CI on our pull request/branch before going into main. So no code should be new. There should be no new commits that have never been tested before going into main. That's my strong belief. I want that world. I realize that's...I don't know. Maybe I'm getting pedantic, or I'm a micromanager of the Git history or whatever. I'm fine with any of those insults that people want to lob at me. That's fine. But that's what I feel. That said, this is a nuisance. I'm fully aware of that. And so imagine the situation where we got a couple of different things that have been in flight. People have been working on different...say there are three pull requests that are all coming to completion at the same time. Then you start to go to merge something, and you realize, oh no, somebody else just merged. So you rebase, and then you wait for CI to build. And just as the CI is completing, somebody else merges something, and you're like, ah, come on. And so then you have to one more time rebase, push, wait for the build to be green. So I get that that is not an ideal situation. Right now, our team is three developers. So there are a few enough of us that I feel like this is okay. We can manage this via human intervention and just deal with the occasional weight. But in the back of my mind, of course, I want to find a better solution to this. So what I've been exploring…there's a handful of different utilities that I'm looking at, but they are basically merged queues as an idea. So there are three that I'm looking at, or maybe just two, but there's mergify.io, which is a hosted solution that does this sort of thing. And then Shopify has a merge queue implementation that they're running. So the idea with this is when you as a developer are ready to merge something, you add a label to it. And when you add that label, there's some GitHub Action or otherwise some workflow in the background that sees that this has happened and now adds it to a merge queue. So it knows all of the different things that might want to be merged. And this is especially important as the team grows so that you don't get that contention. You can just say, "Yes, I would like my changes to go out into production." And so, when you label it, it then goes into this merge queue. And the background system is now going to take care of any necessary rebases. It's going to sequence them, so it's not just constantly churning all of the branches. It's waiting because it knows the order that they're ideally going to go out in. If CI fails for any of them because rebasing suddenly, you're in an inconsistent state; if your build fails, then it will kick you out of the merge queue. It will let you know. So it will send you a notification in some manner and say, "Hey, hey, hey, you got to come look at this again. You've been kicked out of the merge queue. You're not going to production." But ideally, it adds that layer of automation to, frankly, this nuisance of having to keep things up to date and always wanting code to be run on CI and on a pull request before it gets into main. Then the ideal version is when it does actually merge your code, it pings you in Slack or something like that to say, "Hey, your changes just went out to production." Because the other thing I'm hoping for is a continuous deployment. STEPH: The idea of a merge queue sounds really interesting. I've never worked with a process like that. And one of the benefits I can see is if I know I'm ready for something to go like if I'm waiting on a green build and I'm like, hey, as soon as this is green, I'd really like for it to get merged. Then currently, I'm checking in on it, so I will restart the build. And then, every so often, I'm going back to say, "Okay, are you green? Are you green? Can I emerge?" But if I have a merge queue, I can say, "Hey, merge queue, when this is green, please go and merge it for me." If I'm understanding the behavior correctly, that sounds really nifty. CHRIS: I think that's a distinct but useful aspect of this is the idea that when you as a developer decide this PR is ready to go, you don't need to wait for either the current build or any subsequent builds. If there are rebases that need to happen, you basically say, "I think this code's good to go. We've gotten the necessary approvals. We've got the buy-in and the teams into this code." So cool, I now market as good. And you can walk away from it, and you will be notified either if it fails to get merged or if it successfully gets merged and deployed. So yes, that dream of like, you don't have to sit there watching the pot boil anymore. STEPH: Yeah, that sounds nice. I do have to ask you a question. And this is related to one of the blog posts that you and I love deeply and reference fairly frequently. And it's the one that's written by German Velasco about Say No to More Process, and Say Yes to Trust. And I'm wondering, based on the pain that you felt from this new commit, going into main and breaking the main build, how do you feel about that balance of we spent time investigating this issue, and it may or may not happen again, and we're also looking into these new processes to avoid this from happening? I'm curious what your thought process is there because it seems like it's a fair amount of work to invest in the new process, but maybe that's justified based on the pain that you felt from having to fix the build previously. CHRIS: Oh, I love the question. I love the subtle pushback here. I love this frame of mind. I really love that blog post. German writes incredible blog posts. And this is one that I just keep coming back to. In this particular case, when this situation occurred, we had a very brief...well, it wasn't even that brief because actually unwinding the situation was surprisingly painful, and we had some changes that we really wanted to get out, but now the build was broken. And so that churn and slowdown of our build pipeline and of our ability to actually get changes out to production was enough pain that we're like, okay, cool. And then the other thing is we actually all were in agreement that this is the way we want things to work anyway, that idea that things should be rebased and tested on CI as part of a pull request. And then we're essentially only doing fast-forward merges on the main branch, or we're fast forward merging main into this new change. That's the workflow that we wanted. So this configuration was really just adding a little bit of software control to the thing that we wanted. So it was an existing process in our minds. This is the thing we were trying to do. It's just kind of hard to keep up with, frankly. But it turns out GitHub can manage it for us and enforce the process that we wanted. So it wasn't a new process per se. It was new automation to help us hold ourselves to the process that we had chosen. And again, it's minimally painful for the team given the size that we're at now, but I am looking out to the future. And to be clear, this is one of the many things that fall on the list of; man, I would love to have some time to do this, but this is obviously not a priority right now. So I'm not allowed to do this. This is explicitly on the not allowed to touch list, but someday. I'm very excited about this because this does fundamentally introduce some additional work in the pipeline, and I don't want that. Like you said, is this process worth it for the very small set of times that it's going to have a bad outcome? But in my mind, the better version, that down the road version where we have a merge queue, is actually a better version overall, even with just a tiny team of three developers that are maybe never even conflicting in our merges, except for this one standout time that happens once every three months or whatever. This is still nicer. I want to just be able to label a pull request and walk away and have it do the thing that we have decided as a team that we want. So that's the dream. STEPH: Oh, I love that phrasing, to label a pull request and be able to walk away. Going back to our marketing, that really sells that merge queue to me. [laughs] Mid-roll Ad And now we're going to take a quick break to tell you about today's sponsor, Orbit. Orbit is mission control for community builders. Orbit offers data analytics, reporting, and insights across all the places your community exists in a single location. Orbit's origins are in the open-source and developer relations communities. And that continues today with an active open-source culture in an accessible and documented API. With thousands of communities currently relying on Orbit, they are rapidly growing their engineering team. The company is entirely remote-first with team members around the world. You can work from home, from an Orbit outpost in San Francisco or Paris, or find yourself a coworking spot in your city. The tech stack of the main orbit app is Ruby on Rails with JavaScript on the front end. If you're looking for your next role with an empathetic product-driven team that prides itself on work-life balance, professional development, and giving back to the larger community, then consider checking out the Orbit careers page for more information. Bonus points if working in a Ruby codebase with a Ruby-oriented team gives you a lot of joy. Find out more at orbit.love/weloveruby. CHRIS: To be clear, and this is to borrow on some of Charity Majors' comments around continuous deployment and whatnot, is a developer should stay very close to the code if they are merging it. Because if we're doing continuous deployment, that's going to go out to production. If anything's going to happen, I want that individual to be aware. So ideally, there's another set of optimizations that I need to make on top of this. So we've got the merge queue, and that'll be great. Really excited about that. But if we're going to lean into this, I want to optimize our CI pipeline and our deployment pipeline as much as possible such that even in the worst case where there's three different builds that are fighting for contention and trying to get out, the longest any developer might go between labeling a pull request and saying, "This is good to go," and it getting out to production, again, even if they're contending with other PRs, is say 10, 15 minutes, something like that. I want Slack to notify them and them to then re-engage and keep an eye on things, see if any errors pop up, anything like that that they might need to respond to. Because they're the one that's got the context on the code at that point, and that context is decaying. The minute you've just merged a pull request and you're walking away from that code, the next day, you're like, what did I work on? I don't remember that at all. That code doesn't exist anymore in my brain. And so,,, staying close to that context is incredibly important. So there's a handful of optimizations that I've looked at in terms of the CircleCI build. I've talked about my not rebuilding when it actually gets fast-forward merged because we've already done that build on the pull request. I'm being somewhat pointed in saying this has to build on a pull request. So if it did just build on a pull request, let's not rebuild it on main because it's identically the same commit. CircleCI, I'm looking at you. Give me a config button for that, please. I would really love that config button. But there are a couple of other things that I've looked at. There's RSpec::Retry from NoRedInk, which will allow for some retry semantics. Because it will be really frustrating if your build breaks and you fall out of the merge queue. So let's try a little bit of retry logic on there, particularly around feature specs, because that's where this might happen. There's Knapsack Pro which is a really interesting thing that I've looked at, which does parallelization of your RSpec test suite. But it does it in a different way than say Circle does. It actually runs a build queue, and each test gets sent over, and they have build agents on their side. And it's an interesting approach. I'm intrigued. I think it could use some nice speed-ups. There's esbuild on the Heroku side so that our assets build so much more quickly. There are lots of things. I want to make it very fast. But again, this is on the not allowed to do it list. [laughs] STEPH: I love how most of the world has a to-do list, and you have this not-allowed to-do list that you're adding items to. And I'm really curious what all is on the not allowed to touch lists or not allowed to-do list. [laughs] CHRIS: I think this might be inherent to being a developer is like when I see a problem, I want to fix it. I want to optimize it. I want to tweak it. I want to make it so that that never happens again. But plenty of things...coming back to German's post of Say No to More Process, some things shouldn't be fixed, or the cost of fixing is so much higher than the cost of just letting it happen again and dealing with it manually at that moment. And so I think my inherent nature as a developer there's a voice in my head that is like, fix everything that's broken. And I'm like, sorry. Sorry, brain, I do not have that kind of time. And so I have to be really choosy about where the time goes. And this extends to the team as well. We need to be intentional around what we're building. Actually, there's a feeling that I've been feeling more acutely than ever, but it's the idea of this trade-off or optimization between speed and getting features out into the world and laying the right fundamentals. We're still very early on in this project, and I want to make sure we're thinking about things intentionally. I've been on so many projects where it's many years after it started and when I ask someone, "Hey, why do your background jobs work that way? That's a little weird." And they're like, "Yeah, that was just a thing that happened, and then it never changed. And then, we copied it and duplicated, and that pattern just got reinforced deeply within the app. And at this point, it would cost too much to change." I've seen that thing play out so many times at so many different organizations that I'm overwhelmed with that knowledge in the back of my head. And I'm like, okay, I got to get it just right. But I can't take the time that is necessary to get it, quote, unquote, "Just right." I do not have that kind of time. I got to ship some features. And this tension is sort of the name of the game. It's the thing I've been doing for my entire career. But now, given the role that I have with a very early-stage startup, I've never felt it more acutely. I've never had to be equally as concerned with both sides of that. Both matter all the more now than they ever have before, and so I'm kind of existing in that space. STEPH: I really like that phrasing of that space because that deeply resonates with me as well. And that not allowed to-do list I have a similar list. For me, it's just called a wishlist. And so it's a wishlist that I will revisit every so often, but honestly, most things on there don't get done. And then I'll clear it out every so often when I feel it's not likely that I'm going to get to it. And then I'll just start fresh. So I also have a similar this is what I would like to do if I had the time. And I agree that there's this inclination to automate as well. As soon as we have to do something that felt painful once, then we feel like, oh, we should automate it. And that's a conversation that I often have with myself is at what point is the cost of automation worthwhile versus should we just do this manually until we get to that point? So I love those nuanced conversations around when is the right time to invest further in this, and what is the impact? And what is the cost of it? And what are the trade-offs? And making that decision isn't always clear. And so I think that's why I really enjoy these conversations because it's not a clear rubric as to like, this is when you invest, and this is when you don't. But I do feel like being a consultant has helped me hone those skills because I am jumping around to different teams, and I'm recognizing they didn't do this thing. Maybe they didn't address this or invest in it, and it's working for them. There are some oddities. Like you said, maybe I'll ask, "Why is this? It seems a little funky. What's the history?" And they'll be like, "Yeah, it was built in a hurry, but it works. And so there hasn't been any churn. We don't have any issues with it, so we have just left it." And that has helped reinforce the idea that just because something could be improved doesn't mean it's worthwhile to improve it. Circling back to your original quest where you are looking to improve the process for merging and ensuring that CI stays green, I do like that you highlighted the fact that we do need to just be able to override settings. So that's something that has happened recently this week for me and my client work where we have had PRs that didn't have a green build because we have some flaky tests that we are actively working on. But we recognize that they're flaky, and we don't want that to block us. I'm still shipping work. So I really appreciate the consideration where we want to optimize so that everyone has an easy merging experience. We know things are green. It's trustworthy. But then we also have the ability to still say, "No, I am confident that I know what I'm doing here, and I want to merge it anyways, but thank you for the warning." CHRIS: And the constant pendulum swing of over-correcting in various directions I've experienced that. And as you said, in the back of my mind, I'm like, oh, I know that this setting I'm going to need a way to turn this setting off. So I want to make sure that, most importantly, I'm not the only one on the team who can turn that off because the day that I am away on vacation and the build is broken, and we have a critical bug that we need to fix, somebody else needs to be able to do that. So that's sort of the story in my head. At the same time, though, I've worked on so many teams where they're like, oh yeah, the build has been broken for seven weeks. We have a ticket in the backlog to fix that. And it's like, no, the build has to not be broken for that long. And so I agree with what you were saying of consulting has so usefully helped me hone where I fall on these various spectrums. But I do worry that I'm just constantly over-correcting in one direction or the other. I'm never actually at an optimum. I am just constantly whatever the most recent thing was, which is really impacting my thinking on this. And I try to not do that, but it's hard. STEPH: Oh yeah. I'm totally biased towards my most recent experiences, and whatever has caused me the most pain or success recently. I'm definitely skewed in that direction. CHRIS: Yeah, I definitely have the recency bias, and I try to have a holistic view of all of the things I've seen. There's actually a particular one that I don't want to pat myself on the back for because it's not a good thing. But currently, our test suite, when it runs, there's just a bunch of noise. There's a bunch of other stuff that gets printed out, like a bunch of it. And I'm reminded of a tweet from Kevin Newton, a friend of the show, and I just pulled it up here. "Oh, the lengths I will go to avoid warnings in my terminal, especially in the middle of my green dots. Don't touch my dots." It's a beautiful beauty. He actually has a handful about the green dots. And I feel this feel. When I run my test suite, I just want a sea of green dots. That's all I want to see. But right now, our test suite is just noise. It's so much noise. And I am very proud of...I feel like this is a growth moment for me where I've been like, you know what? That is not the thing to fix today. We can deal with some noise amongst the green dots for now. Someday, I'm just going to lose it, and I'm going to fix it, and it's going to come back to green dots. [chuckles] STEPH: That sounds like such a wonderful children's book or Dr. Seuss. Oh, the importance of green dots or, oh, the places green dots will take you. CHRIS: Don't touch my dots. [laughter] STEPH: Okay. Maybe a slightly aggressive Dr. Seuss, but I still really like it. CHRIS: A little more, yeah. STEPH: On that note of our love of green dots, shall we wrap up? CHRIS: Let's wrap up. The show notes for this episode can be found at bikeshed.fm. STEPH: This show is produced and edited by Mandy Moore. CHRIS: If you enjoyed listening, one really easy way to support the show is to leave us a quick rating or even a review in iTunes, as it really helps other folks find the show. STEPH: If you have any feedback for this or any of our other episodes, you can reach us at @_bikeshed or reach me on Twitter @SViccari. CHRIS: And I'm @christoomey STEPH: Or you can reach us at hosts@bikeshed.fm via email. CHRIS: Thanks so much for listening to The Bike Shed, and we'll see you next week. All: Byeeeeeee!!! Announcer: This podcast was brought to you by thoughtbot. thoughtbot is your expert design and development partner. Let's make your product and team a success.

I Thought I Knew How: A Podcast about Knitting and Life
Episode 069: Mandy Moore and Shetland Wool Week

I Thought I Knew How: A Podcast about Knitting and Life

Play Episode Listen Later Oct 5, 2021 39:18


In this episode, Anne breaks down like an overtired 9-year old coming home from summer camp, because that's basically what she is. But aside from that, you'll also meet Mandy Moore, a new designer based in Shetland who is also a sample knitter for many familiar designers. Have a listen! Links to Things Mentioned in This Episode Knit+Escape Shetland Wool Week Elizabeth Williamson on Instagram Shetland Textile Museum Garths Croft Bressay Sheila Fowlie's website for bespoke lace items, Shetland Lace Shawls Classes offered online from Uradale Yarn (Watch this space for additional collaborations between Anne and Viveka Vellupilai!) Dr. Carol Christiansen of the Shetland Museum and Archives Harriet's Hat Mandy Moore on Instagram Mandy's patterns are available as Olach Designs on Ravelry and LoveCrafts Jamieson's of Shetland Stephen West's MKAL for October 2021 Sponsors Knit New Haven is still offering 10% off 5 skeins of fingering weight yarn for the Stephen West Mystery Knit Along that is kicking off soon. Learn more at their website. Morehouse Farm's Open Farm Day is coming up soon! Register for the October 15th event here. 

Right Back At Ya!
48: Jessica Simpson Part 1: "Sweet Kisses" and "Irresistible"

Right Back At Ya!

Play Episode Listen Later Oct 4, 2021 87:03


The day has finally come. The RBAY! boys are finally diving into Jessica Simpson's discography, after 3.5 years of Joel relentlessly pestering David to do this. The Southern belle pop diva and 2000s pop culture icon we are celebrating is famed as one of The JB's Fab Four legends - alongside Britney Spears, Christina Aguilera and Mandy Moore. Together Joel and David get into Jessica's early years leading into her shining debut in 1999 as Tommy Mottola's new teen pop sensation with 'I Wanna Love You Forever'. They get into highlights of Successica Simpson's multi-platinum-selling debut album "Sweet Kisses", which featured Destiny's Child and her then-beau Nick Lachey. Whether we're pressing play on skyscraper power ballads or premium bops like 'I Think I'm In Love With You', 'Irresistible' and 'A Little Bit' - there really is more than meets the eye with Jessica's story. If you mostly know Jess from the MTV Newlyweds era onwards, this is a comprehensive and loving guide to her formative years in the spotlight - with some stories gleaned from her heartfelt memoir "Open Book" (a must-read!). Follow Right Back At Ya! https://www.instagram.com/rightbackpod/ https://twitter.com/rightbackpod https://www.facebook.com/rightbackpod Check out our Spotify playlists https://open.spotify.com/user/1c3ks5jdh2x4j7jdg1o0aglwg Follow Joel https://www.instagram.com/dr_joelb/ https://twitter.com/DR_JoelB Follow David https://www.instagram.com/lovelimmy/ https://twitter.com/lovelimmy Email us rightbackpod@gmail.com 

Giant Robots Smashing Into Other Giant Robots
395: Energy, Perspective, Priorities, and Intention with Jen Dary of Plucky

Giant Robots Smashing Into Other Giant Robots

Play Episode Listen Later Sep 30, 2021 48:55


Chad talks to Leadership Coach and Founder of Plucky, Jen Dary, about working with individuals and companies to create healthy dynamics at work. In fact, Plucky just released a new product that aids in doing just that! Manager Weeklies are notebooks designed to help leaders intentionally set up their weeks and track progress. It includes tips and tricks, including useful 1:1 tools. Each notebook is designed to last one quarter. Follow Jen Dary on Twitter (https://twitter.com/jenniferdary) or LinkedIn (https://www.linkedin.com/in/jen-dary-46b0367/) Plucky (https://www.beplucky.com/) Manager Weeklies info & order link (https://shop.beplucky.com/products/manager-weeklies-2-pack) Newsletter: beplucky.com/newsletter (https://beplucky.com/newsletter) Become a Sponsor (https://thoughtbot.com/sponsorship) of Giant Robots! Transcript: CHAD: This is the Giant Robots Smashing Into Other Giant Robots Podcast, where we explore the design, development, and business of great products. I'm your host, Chad Pytel. And with me today is Jen Dary, founder of Plucky. Jen, welcome back to the podcast. JEN: Thank you. My third time. Three time's a charm. I feel very lucky. CHAD: There aren't many people who have been on the podcast as guests three or more times. So you're in an ever-increasing select group of returning guests. JEN: Thank you. I feel like it's maybe because the Tokyo Olympics have just started, but I feel competitive and ready to take on this third session. CHAD: [laughs] So the last time you were on was October 28th, 2019 is when the episode came out. JEN: Millennia ago. CHAD: Not quite two years ago, but yeah, also a millennia ago. And that was Episode 342 so if people want to go back and take a listen to that. And then before that, you were on Episode 270, which I actually don't even know the date of. It was even longer. So welcome back. You are celebrating the eighth anniversary of Plucky. JEN: I know. I don't really think of it in these ways because I don't have an MBA, or I didn't come from a business background or anything. But definitely when I hit five years, I feel like my husband said something about that. He was like, "Honey, you should be really proud. Not a lot of businesses make it five years." And that was not really on my mind. But now that Plucky is eight, I feel like oh man, I'm just so happy to talk about how businesses evolve and how what you thought it was going to be in year one was different than year three, was different than year five, and of course, it's different than year eight. So we're eight years in, but nothing's the same, and everything's the same. I'm sure you've experienced that too. CHAD: It was actually the eighth year going into the ninth year mark that we at thoughtbot started to make big changes. And it was that idea of coming up on a decade. It started to feel like, wow, there's real momentum here. And instead of thinking about what the next year looks like, what does the next decade look like? And are we the kind of company that is going to last 20 years? And that put us in a different mindset. And I started to think about the impact we were having and the legacy that we would have. And was it big enough for the size of the company that we had? JEN: How old is thoughtbot right now? CHAD: We just celebrated our 18th anniversary. JEN: Oh my gosh. All right. Well, maybe at the very end, you can give me your best wisdom for the ninth year. [laughter] CHAD: Oh jeez. Okay. [chuckles] JEN: No presh, but tuck that in the back of your brain. CHAD: Yeah, get some sleep. That's my best advice. JEN: [laughs] Great. CHAD: That would be great. We can come back to that. JEN: Cool. CHAD: So obviously, it's been a big two years since we last talked. I'm sure a lot has progressed in Plucky. How have things changed? JEN: Well, what's funny is that the two years spread that we're talking about or 18 months or whatever it is, for the most part, overlaps with COVID so far. So by the end of 2019, things were cooking, and everything is good. And even, personally speaking, my youngest son would be entering kindergarten in the fall of 2020. Again, as a business owner, a mom, all those things I was sort of at the end of 2019 hot, so good. And then I was anticipating 2020 to be continued pretty much the same as is. Like, we would keep training managers. I would keep traveling. All that would get easier because the kids are getting bigger, then my kid would go to kindergarten. And I was also finishing a book about...I can't remember if we talked about this before, but I was really sick in 2016. I had a brain tumor diagnosis, and I'm okay now. It was benign. I had this memoir that was eh, I don't know, maybe two-thirds done. All that was the plan for 2020, Chad. And I'm sure this is shocking news to you, but none of it happened, including freaking kindergarten, obviously in person. So on the business side of things, I kept everything stable as best as I could. So coaching kept going because coaching has always been remote. We have some products, and we kept shipping those out as best we could. At the very beginning of COVID, when everybody thought it was this three, four-week hiatus from real life, I recorded a story every day. Because I was like, what can I do for all the world that's working? So I recorded a storytime for Plucky with my kids. And I put it out on social media so that working parents could have another 15 minutes of distraction for their kids. That's how cute I was back then. [laughter] After one month of that, I was like, I need somebody to read stories to my kids. Yikes. CHAD: Yeah. [laughs] JEN: So the big thing that changed was that our manager trainings in person obviously I had to cancel those. So I transitioned from in-person to virtual events, and that has continued. And as of this recording, end of July, I was thinking that our November event this year…it's the 20th cohort of So Now You're a Manager. I was going to have it in person. And just last week, I pulled the plug on that. And I was like, no, we're going to stay virtual a little bit longer because I don't know how to predict what the hell is coming. So again, that sort of stabilizing, right? Like, okay, well, now I know how to do the virtual. That will be the stable choice this year, which is weird to say, but true. CHAD: Yeah. So you just gave a great organic listing of the things that Plucky does, and a big part of that was that in-person So Now You're a Manager training, which, if people remember from the previous episodes, new managers at thoughtbot have attended over the years. It's a really great training for people who become managers. So what was transitioning that to remote like? Because you'd only ever done it in person before, right? JEN: Yeah, totally. The first 11 cohorts were in person, and then we got to 12, and that was supposed to happen in March in Atlanta. We canceled that, and it wasn't until June that we had the 12th, and that was the first virtual one. And to say that I needed to go through stages of grief is probably pretty accurate. [chuckles] My energy in person is so a thing, like a tool of mine and just pulling people together, and making safe space for conversations and all that jazz. So I was like, what the hell is that going to be like on Zoom? And meanwhile, remember I'm watching my first grader go through the shenanigans of Zoom for the end of that year. And I'm like, oh my God, how am I possibly going to get grown-ups on this and paying attention and not being distracted? So a couple of things, I will say number one is I definitely interviewed four or five people in the industry who are good at virtual events, and I tried to get their deepest wisdom about it. The second thing is that I made the cohorts smaller. So in person, we have around 20 to 22 max, and in virtual, we do 10 to 12 max. And so that got a lot smaller. Also, instead of being two days back to back, I broke it into three half days which is just a different ask. And I wasn't sure if people would bite at that. I tried to mimic it after how some people do an MBA on the side. So then they go to work, and they practice the stuff they're learning at the MBA. And so that has been my thought like, okay, you'll be with me basically for a month. We'll have three half days together, usually on a Friday. And then you're practicing in the meantime. So between the times I see you, you're improving your listening skills. You're coming back with anecdotes about hires or tough conversations or whatever. So I won't say that's like a silver lining, but it's just a different beast. And the first day I did it, I mean, I'm telling you, I was on the bathroom floor on my knees like, don't let the internet go out. CHAD: [laughs] JEN: I was so scared. I don't know why looking back. I'm in tech, but I'm not technical. It's my husband who helps me set up a monitor and whatnot. Oh God, I was so nervous. And I just thought, shit, this is the thing I can't problem-solve. If the internet goes out, I don't know what to do, but if someone's upset, I can help them. So it just brought all of my skills in a different environment. And now I feel pretty good about it. I don't know if you found this with your distributed company overall, but I have worked very hard to make sure that it's a blend, of course, this digital experience, but also I use the mail. I use snail mail a lot. So attendees get a packet before we begin. They get a gift at the end, a graduation gift. And yeah, I feel like I've learned a lot about how to have a hand-in-hand experience of digital as well as a physical object that they can touch to make that experience more than just a screen. CHAD: Yeah, I think that's important. How did changing the format, reducing the class size, what business ramifications were there for that? JEN: Well, it's way less money. [chuckles] CHAD: Right. Okay, sorry. JEN: No. Oh my God. I want to be very real about these things, especially for people starting their businesses. It's way less money. And also if you think about it, everybody had already bought tickets to Atlanta, and then they had already started buying tickets to...I can't remember what the next one was going to be, New York, I think. So for a lot of the year, everything was, I'll say, comped, but that's not really what's going on. All of a sudden, the amount of seats that I thought I was selling for the year got reduced in about half, and much of that were already pre-bought tickets. So, as a line item, that was way lower. I also think I got...man, I haven't really said this transparently to anybody before, but I'll say it here. I got really scared about what to charge. Do you charge the same thing virtually than you do in person? And so I lowered it, I would say for a year. I lowered it by a couple of hundred dollars for each ticket because I didn't know what the market wanted. And also, I didn't know, oh God, were businesses closing? Were people getting prof dev budgets? Everybody was frozen for a good while. So I'm lucky that now today I'm back up to the same price that it had been before, but it's not as much income per event. And the other thing I'll say which affects money…but again, I want to be transparent for other folks who think about or currently run businesses. One great thing to come out of some of the social unrest of last year is that we now have an equity scholarship for So Now You're a Manager. So in every cohort, be that virtually or in person, I always reserve a seat for someone who's coming from an underrepresented group, so people apply. And that is something that I very happily said I will eat the cost of that ticket because it's important to me to have different voices in the room. And that has been a total awesome thing this year. That just started in January of 2021, but that's something really great that came out of last year. CHAD: Yeah. What did you find that customers wanted, and did it change over time? Was there an appetite for it to be remote, or was there resistance to it? JEN: I think at first people were overwhelmed and didn't want it. That's why I held it from March until June until I thought people were ready. I can tell you categorically that I've had the lowest percentage of parents attend of all time because, let's be real, who wants another kind of obligation? Or also, parents during this time, especially with young children, were not in that growth space necessarily for work because there was so much to keep afloat. So other than the three half days, I also have this optional hour that I throw in just if people can come; there's this extra exercise that didn't fit in from the original curriculum. And I don't think I've had one parent, maybe one, come across all those cohorts that have been virtual to that. So the optional stuff I see parents opting out of. That said, I saw more folks who maybe either live alone or maybe have a roommate but who are pre-family or some people won't have families but someone who was socially like, "It was so hard and tiring last year." And that sort of swung back around towards the summer and end of summer. I saw much more interest there because I think people were really lonely. CHAD: Yeah. And I also think, at least for me personally and for thoughtbot, that was when the thinking definitely shifted that this wasn't going to be going away anytime soon. And so we came to terms with that and started to then make much more long-term plans and permanent changes. JEN: I think it was also in the...I want to say like early fall when Twitter announced they'd be remote. Like, they have an office, but they wouldn't oblige anyone to ever come back again. And whenever that decision was made, there were a couple of other companies...At that point, I was still living in the Bay Area, and there were a couple of other companies that made similar suggestions. And so again, to your point, there was a revisioning of what the next phase was like or at least what to expect. And so, I think people weren't holding out to go back to normal. It was like, what's the new normal? CHAD: Yeah. So when we first shut down offices and went remote, we were giving updates every two weeks, and then it changed to every month. And then it would be like, "There's really no change. We're going to give another update in April." And then April was, "We'll give another update in May." And when it came to June, we just said, "We're planning on being in this mode for at least the end of the year. Let's start all acting and make this sustainable." So that is when our thinking changed too. JEN: Did you feel like with your CEOness and business responsibility over there...what kept you grounded for all that thing? Because obviously every time you make that announcement or regardless of whether that's in person or just...I don't even know– retention or whatever it is. It feels like you're just building strategy on freaking quicksand. CHAD: It wasn't easy. You feel responsible for everybody's well-being, both financially and everything else. And so the lack of stability…you want to provide it in an unstable world. You want to say, "Well, at least you shouldn't have to worry about this. Let's provide…" but it was impossible to do. And I'm much more comfortable with uncertainty. I think there's a spectrum of comfortableness with uncertainty, and I'm pretty far on one end of it, and even I was struggling. Same thing with like I'm very much on the spectrum of not having to worry about anxiety or anything like that, and even I was feeling it. And so I was just like...at one point I said to I think it was Diana or whatever "If I'm feeling this, if I'm getting chest palpitations, [laughs] something's really wrong, and we really need to pay attention to how everybody else is feeling." JEN: Oh, yeah. I even saw that anxiety obviously with coaching clients. There are some clients that when budgets dried up, there was like an initial drop-off, I would say March, April. But then I feel very lucky that the pipeline was still very strong, and I had clients stay with me or join or whatever. You remember as well as anybody not only did we have this health crisis going on, which again we still do but my last class...So third of three of the cohort in May last year was a couple of days after George Floyd's murder. And the responsibility I felt too...like, when all these things were going on last summer, it was like, who freaking cares about anything? It's like these huge things. And you start to say nothing matters. There are only three things that matter in life. And then you kept sort of recycling the drain on that. So here I am going into teaching the third of three classes. And during the third class, I always teach concepts on how to hire, concepts on how to lay someone off and fire someone, which everyone's always very barfy and nervous about. And I try to bring us together and graduate us in what feels like a victorious moment. But that's three days after George Floyd's murder, and everyone is reeling and needing to process. And I remember thinking that morning, I don't know how this is going to go because I was fully willing to rip up the plan and do something different. But at the same time, there's also sometimes they want some structure. Folks want to just show up and take this class and be distracted from what's going on in the world. So we sort of talked about this a few minutes before we started recording but really, what has been fascinating and challenging about continuing to train managers over the last two years is that these very large things are going on in the background: George Floyd's murder, a lot of social unrest in Minneapolis, the election, COVID, all these things. And you can't just put that away and show up to manager training. It is freaking relevant because it is relevant for them. Of course, it's very meta, but all of my students are then going to go back and be responsible for 3, 5, 7 other people in their day-to-day work. So it was really wild, but again, stretching and a challenge that I met with a lot of intention. I don't know if I was always super successful at it, but I thought a lot about it. CHAD: Yeah, I think that was the shift that we saw on our team. And what I've heard from people is that enough is enough in several different categories of things. And like, we just can't keep on doing what we were doing before. It's not working, and it is unacceptable. People are angry too. So it's not just processing. It's anger and wanting to see action, wanting to take action. And yet, doing it in a world where we can't actually be together, I think, made it particularly challenging for some people and for managers to know how to meet their team members where they were. And people process things in different ways too, and people need different things. And at that point, we had hired people who had only ever been remote. So I think the connections that you have with people that you might've worked with in person you can lean on a lot in the beginning. But then you're working with someone or managing someone who you've never met in person. JEN: Yeah. It's a whole new ball game. And I think that the notion of community has gone through the wringer, not only in the worst, it's a rebirth almost. I think the notion of locally what's going on for you and then who can you see? Who can you have a barbecue with? All of those questions of like, who can I be with? Of course, the internet's great, but the internet has some major, major boundaries to it. And people see that at work, and they see that in training. CHAD: One of the things we're struggling with in that category now is there are people who live next to each other because we were historically in offices. And as it becomes more possible to get together with each other, and this is something that, as managers, we're trying to navigate, it actually has a huge potential for exclusion now that we have hired a bunch of people who are anywhere. If the teams that were in-person together but are now working remotely start getting in person again, even if it's just an outing at a park, who's not able to attend that, and how will they feel? And what expectations have we set with them? And then you have just sort of equity and inclusion issues around people we've hired in Brazil since we've gone remote. There's no way for them to come. JEN: Sure. CHAD: It's not fair. And navigating that as a team, I think we've been able to do that, but it hasn't been easy. JEN: I think sometimes the only way to see it is none of it will work. So if none of it will work, then cool. The bar's low. [laughter] Yeah, it's not going to be perfect. And all in person had its issues too. So then, if you just sort of bottom it out and say, cool, cool, cool, there's no one silver bullet answer here. So what that means is yes, as human beings, folks who are possibly able to meet up for coffee will resonate and glow and be psyched to be around some other people. So, how do we say "No," less often to that? Because that's great. That's really something to celebrate. And I'm sure if everybody was in that situation, they would try to take advantage of that too. But then to say, if you're not in that situation, here's another option. And then, every once in a while, we'll mix those options together and have like a rolling menu with it so that nothing gets too static and paralyzed and presumed. And it's in that flow state, which of course, is more fatiguing because you have decision fatigue, and you got to keep making decisions about it. But if you can just say, "Oh, well, we're going to decide that on a week to week basis or on a quarter to quarter." I probably have said this to you before in one of these other podcast conversations, but I just really think that life is a giant science experiment. So if that's true, then you can just say, "Hey, y'all, for Q3, we're going to try this. And at the end of Q3, we'll ask you how that went, and we'll either keep doing it, or we'll totally change it, or we'll increment it." Software people are really good at this because they know that not everything has to go from 2.0 to 3.0. You could go 2.1, 2.2, 2.3. There are incremental builders. So if you can leverage that metaphor even culturally or socially with the makeup of the team and the way you run things, I don't know; I kind of think that's the best you got. CHAD: Yeah. And I think we generally have the idea that we trust people and that we can provide the information. And people will generally use that information to make good decisions that are oriented towards fulfillment. So a really good example when it comes to managers is in an environment where if you're meeting in person with someone, one team member and you're their manager, and you're not meeting in person with another, that could influence negatively the other person's path to promotion or the relationship they have with you and just subtly bias you towards the person that you might be able to meet in person with. And so as a manager, making sure people know that, that that is a thing that can happen is a good way to manage that bias because I think generally, people don't want to let that happen, but they might not even realize it, so they can actively manage it. JEN: Well, it sounds like even in that thought, you are gently nudging people back towards intention and back towards just not sleepwalking through their work, that this is important for us, not only in the distance conversation here but also obviously for race, and for gender and for all kinds of different ways that humans are. We will never get it 100% right and yet intention, and taking a beat, and taking a breath before you move into conversations about promotions or whatever will help remind you hang on a second, remember there's invisible stuff inevitably going on based on who I am and where I came from. How do I make sure things are fair today? Or whatever the reminder needs to be. It sounds like that's...I don't know. It's good that you have that front of mind. CHAD: So that's one example of remote management. How much of before the pandemic were people who were coming and attending the workshops? Were they managing people remotely? And how much of your curriculum was specific to that, if any? JEN: My gut says maybe about a third were remote managers. They are definitely with bigger companies that I was seeing that. The small agencies based in Pittsburgh, you know, Austin, those places were pretty localized. But so what you get with a bigger company is also a bit more infrastructure that supports some of these cultural conversations. And we had it as part of the curriculum, but it wasn't very big, and maybe I would sort of be intentional. There are breakout groups and stuff like that. And I might think I'm going to pair these two together for their practice one-on-one because I know they're both remote managers. I am very intentional about a lot of the pairings and all that stuff, and so I would be thoughtful in that way. But now, on some level, in all these virtual workshops, everybody has an equal footing now. So everybody's kind of screwed, and everybody's also making it work. So that has been a very interesting thing to see. And I always laugh at this example, a woman who came early on, maybe like the eighth or ninth cohort, and she's a remote manager. And she would say, "Well, I don't have a water cooler. I don't have, like, I'm walking down the hall sensing somebody's upset or anything." But she would say, "This is going to sound weird, but I keep an eye on how fast they emoji something." So if you have a person who...You know this person in Slack. They're always on Slack, always so supportive, funny, have something to say, a little thumbs-up emoji, or whatever. But if one day they're at work for sure and they haven't said anything about something, she would learn to read the tea leaves like that and check-in. And I just thought that was so clever and very creative. And what she's alluding to is this level three listening that I teach, which is gut or instinct or intuition. And what she was tracking was basically a change in behavior. And that's pretty much what we're tracking when we're in the office too. There could be many reasons why somebody doesn't emoji something right away. Maybe your daughter just ran into the room. Maybe there's a doorbell. There are a million things. But at the same time, not to be too precious about it but to casually track that at least instinctively. She was doing a good job of meeting the moment as best she could. CHAD: Are there other ways in which what you've been doing has changed over the last year? What are managers concerned about or challenged by? JEN: Yeah. First of all, I always had name tags that allowed for pronouns. But this is now certainly part of the curriculum. When we start, I give some social norms and then some tech norms. And so I make the suggestion that in Zoom, after your name, you put your pronouns. And it's not a huge chunk because I really don't feel like I am the best to teach this, but I've added in a DEI component, diversity, equity, inclusion component. And we have some folks in the alumni community who are DEI consultants, so that's great. I always give them shout-outs and refer over if people are looking for that. I've noticed that people are...I'll say careful, but what I mean by careful is that they are aware of all of the stuff we're talking about, like race and social stuff. Depending on where your office was in the country, the election was sometimes really hard. I think about companies in Ohio or Pennsylvania or swing states where it was not obvious that everybody in the office was on the same page about that. And the way that that stuff comes up and is like this piece of baggage in the room that prevents literally like a website being made. We want to think no, that shouldn't enter. That's not relevant here. And yet people are careful about both trying to say, "Listen, bring who you are. You're accepted here." And also like, well, sometimes what you're suggesting you believe about the world is harmful. The whole Basecamp thing is a good example of that. And so I found the managers who come to my training to just be open to not only sharing their experiences with that but looking very much for some guidance on that from their peers and then from me. CHAD: That's sort of what I was saying about people felt like you needed to be changing the way that you were approaching things. It wasn't okay anymore for most people to say, "We shouldn't be having this conversation. It's not a work-related conversation." It affects people's work and their ability to work. It is a work issue. And you can't simply put everything aside. That's one angle of it, but we're not all equipped. We're not all educated. We're not all ready to be able to do that as managers. JEN: Totally. But with the amount of shit that we have had to handle for the last two years, short of somebody who's a social worker/priest, I don't know who was ready. I feel like a lot of what we're talking about is so resonant for me because all of this is so hard. And if you are alone doing hard things, it's impossible. But the reason that I run the manager trainings the way I do and the reason that I hold onto them after and I put them in a Slack community, they're now alumni of the program. And it's active; it depends on the day. But people have hard questions that they're wrestling with. People have jobs that they're promoting, that they're trying to get people to apply to. It's this active community that goes on afterwards. Because, honestly, Chad, I feel like a big input into me creating So You're Now a Manager and the community around it was my experience becoming a parent. I was one of the first ones of all my friends. I was the first one of my siblings, and my son was the first grandchild on both sides. And I was like, this is so lonely. All my friends are going out in Brooklyn for dinner. And I was 31. It's not like I was very young or anything, but that's New York. And so I had a moms' group. And man, that moms' group got me through those early days because we could all laugh at how hard it was. We could cry together. And when I looked at the transition that people go through from IC, individual contributor, to manager or some level of leadership, you get responsibility. You have to play the messenger sometimes, something you're not totally down with. You have sometimes competition with peers. You have to manage up sometimes. And then you have these people who come to you with requests: I want a new career path. I want more money. I want a different title. And the slog of that is very reminiscent, on some level, of parenting to me. So I thought, well, this is not going to be like, here's your book. Good luck being a manager, although books could be helpful. For me, it seemed like there was at least a certain template of a person in the world who could use community too. So I always say you'll be with me for two days or a month if it's virtual. But I can't possibly teach you everything you'll encounter. That said, we can get some critical skills under your belt. And then you can just continue to riff with this peer network. And that has been a very, I would say, unique thing about the manager training I run and something that is so fulfilling to me. I have a very tiny business. Those are, in weird ways, kind of my colleagues, the funny jokes they tell or those personalities. That was another thing that we had to let go of. In 2020, I was going to have the first reunion. CHAD: Oh yeah. We actually talked about that in the previous episode as an idea. JEN: Heartbreaking. Yeah, it was called Encore. Basically, it was a follow-up and open to anybody that has already taken SNYAM, So Now You're a Manager. I had people who pitched talks, and we had selected them. And yeah, we had to pull the plug on that. So my hope is that next year we can do that. And now we've got almost...actually; I think we just hit 300 people, so maybe 50 will come, I don't know. We'll see. But I like the idea of providing a space for these folks who were new managers when I knew them and when they came through me but have gained some skills themselves and could become thought leaders in this management space. And whenever the world is ready for it, I'm excited to put that together. CHAD: Yeah, that's awesome. That sense of community is one thing I've struggled with, to be honest. Because having done this for 18 years, there aren't many people who worked at the company that work there now anymore. [chuckles] We've grown too. So I no longer have the close personal relationship that I had with most people at the company before or close work relationships. And combined with as we've grown, it's harder...you have to be more of a leader. You have to put yourself aside. It's harder to always be a servant to others. And then I found that especially difficult last year. And it's part of why I needed to not be CEO anymore and to transition to the COO role. Because I couldn't be in a position where everyone was always looking to me continually to make...and as distributed as we are, one of our values is self-management. But continually always looking to me to be the one who always has an answer, who is the stable one, I needed a break from that. So it's been nice, the transition. JEN: I was going to say is it better? CHAD: [chuckles] So it's a little bit different than I expected. So what happened was we made that change. We made other changes, and that was all going well. And then, in February, the largest vaccine scheduling provider in the United States came to us and needed help scaling the infrastructure and all that stuff. JEN: Oh my God. That's exciting. CHAD: And so I, along with a crack team of other experienced thoughtboters, went and spent all of our time focused on that. It has pros and cons, which is right as I was transitioning into a new role; I completely got pulled away and started working full-time with that client for a very important cause, which is the reason why we did it and decided it was worth it. The silver lining is it put everyone else in a position where we went very quickly from Chad's no longer the CEO to Chad's not here right now. [chuckles] And that was unexpected. But I think that it had downsides, but it had upsides too in terms of really being in a position where people could come into their own, into their new roles and sort of a forcing function for some of the changes that we needed to make. JEN: You know, I'll give you major props on that, Chad. Because 18 years and especially, I think this about a lot of things, but especially business here, people get stuck. They really do. They get stuck, especially founders, CEOs. They don't know how to get out of something if they're tired. And there are not a lot of models for what that could look like. The biggest disservice someone could make to leading a company would be to not really be feeling it because that shit trickles down. And if you're tired or if it's not your thing anymore, really, the biggest gift you can give is to go get aligned somewhere else and then hand over the reins to what I keep thinking of as the next generation. I coach a lot of people, or I work with a lot of people who are in the middle, let's say, so they're not C-suite, and they're not newest managers, but they're sort of senior there. They're totally ready to go. I can't overstate that. [chuckles] Will they mess stuff up? Sure. So did you. Will they have questions? Absolutely. But the next generation of every company it's the most strategic thing that a CEO could do is to think, what happens if I'm not here? That allows you to take a freaking vacation, like take a month off. Or that allows you to meet such a huge civic call, which you're describing here, and step away. Or again, God forbid something happened, and you get very sick; it allows the company to be bigger than yourself. So I just commend you on even having the courage to step towards COO and then obviously also kind of redirect as needed this year. But I hope that if there are other CEOs listening or folks in the C-suite who are wiped, this is my gentle nudge to them to hand over the reins at some point. Because you'll get a paycheck, I'm sure you can figure that. CHAD: [chuckles] Being wiped was one small part of it. And I had Diana on who's the new CEO, and we talked about this. We had grown to a certain point. Also, to toot my own horn, I had done a really good job of building a team of managing directors who were really good at what they were doing. And I was no longer the best manager for them. I was no longer what they needed in order to continue to grow. I could do it, but I wasn't the best person for it. So that was the overriding reason to make the change, and being tired and needing to not always be the one that everyone was looking to was certainly a part of it. But yeah, it's been good. JEN: Yeah. I figured we would get there at some point, but we talked a little bit earlier about how I have this new product coming out in September. So the product is called Manager Weeklies, and it's basically...I got to figure out the exact noun for this. I guess this is the marketing moment. [chuckles] But it's basically a small notebook. The way I think of it is it helps you take a deep breath before your week starts. And so I'm not messing with your to-do lists. Everybody has different versions of that, Trello or wherever the heck you keep it. But before you start the week, it is so important to wonder where's my energy at? What's my perspective? What are the couple of priorities? What am I blocking? Just a couple of invitation questions there. And then the idea is that you then can do this on whatever, a Sunday night or Monday morning. And then the rest of the week has, I feel like I've said intention 50 times in this conversation but has intention in it. You can decline those three meetings because they're not the highest priority. You can make some space to actually do the work that comes out of the meetings that you're in. And what I have watched over the last maybe three years are my coaching clients who get themselves together at the beginning of the week who have some sort of practice about setting things up in a good way are the most successful. They get the promotions because they look like they know what they're doing because they do. So anyway, it's called Manager Weeklies. So it's a small notebook. Each notebook is for a quarter. And then, because I'm a coach, I also filled it with other good stuff. Like at the end, there are all kinds of prompts for ways to give praise to people on your team, ways to give feedback, ways to handle conflict, ways to say, "Yes, no, maybe." And then there's a Work Wheel tool at the very end. And so my hope is that people who just feel like they show up on a Monday already behind that they would find some help with that intention. And I feel like what you're saying is that self-awareness component that came through for you, Chad, to say, I'm not the best at this, and also, I'm a little fatigued and so, therefore, deep breath. Here's the strategy going forward. It wasn't reactive, but there was some thought behind it. And so we'll see this fall people get a chance to try that out. CHAD: That's awesome. I feel like it's getting back to your roots but also building on it. So for people who don't know, the Plucky Cards were actually the first way that I was introduced to you was someone showing me a pack of those cards. So, where can people find out more about that? JEN: The best way for people to find any information is just to subscribe to the newsletter. I send it once a month. It's usually a reflection on work, life, something going on there. So if you go to beplucky.com/newsletter, then you'll be first in the know. What's very funny, Chad, is I have a former coaching client who holds the record now. He was the first one to buy the first pack of cards. He was the first one to buy the second pack of cards. [laughs] And he was also the first one to do this Small Group ticket that I recently did as a little offshoot of Plucky. So anyway, in my mind, I always laugh, and I wonder, I wonder if he's going to grab the first pack of Manager Weeklies this fall. But you're right. They certainly plug and play with the cards very well where there's even space in the weekly template to say, what's the one-on-one topic for the week? So it could be a card that you pull, and you use, or it could just be something else going on in the world that you want to bring to all the one-on-ones. But I feel like there are a lot of things I'm not great at in the world, but the things I am good at are people. And then I listen to people over and over again through all of these experiences. And I try to hear what else do they need? What weird little thing can I invent that could help them with some of these things that they struggle with? And I'm also just really mindful of the fact that not everybody has the budget for coaching or for manager training. And I would love for Plucky to be a brand that even if you work for a nonprofit or if you don't have the money to pay for some of those more expensive things that you would have 35 bucks for a pack of cards or 20 bucks or whatever the pricing will be for the notebooks and that you can engage with my brand, even if you're not very wealthy. And I feel like as a person who works and serves an industry like tech, that is always really a priority for me to not only coach or work with the people with the most money. CHAD: Yeah. If I remember right, you designed the cards, right? JEN: Oh my God, I wish. No. CHAD: Oh, okay. JEN: For the first pack of cards I worked with, I don't know if you know him, Greg Storey. CHAD: Yeah. JEN: He's great. Greg Storey did my first deck of cards, and then he moved on, and he's doing other interesting things with his career. So I have a designer who helped me with the second deck of cards called the Manager Pack. So that's questions for managers of managers to bring to one-on-ones, and then the Manager Weeklies are coming out. I've been collaborating with a woman who runs a design little shop called YupGup in Delaware. So her name is Joni. So it is so wild, Chad. I wish that I had any design sense. But it's like, I make these things which look like a terrible PowerPoint. I'm like, here, then there will be a bullet. And then I give it to a designer like Joni at YupGup, and all of a sudden, she has a logo. And then she has some emojis and colors. And I'm like, this is how I felt when I was pregnant, and someone showed me a sonogram, and I was like, (gasps) there's a baby in there. CHAD: [laughs] JEN: This is how I felt when she showed me them, and it was so exciting. And I will never be good enough to even be talented at all to make these things myself. But I hold the idea, and then I find someone who wants to help me make that in the world. It's just magical. That is so fun for me. And so I just ordered them. Actually, I ordered 1,000 of them about three hours ago. And so they'll come in August, and I just know it will be very surreal when I open the box and look at them and think about how many people in the world and pens in the world will be used to set intention, to set up people's weeks and hopefully, make a softer and more fair and thoughtful place to work. CHAD: And one of the things I love about your business and products is that you know you're having an impact beyond that 1,000 notebooks that you put out in the world because each of those people manages 3, 4, 6, 7 people. And if you can make work better for those people, then you have a 7,000-person impact. JEN: Yeah. And it's funny you say that because I think that recently...I keep saying I'm about to go away for a month or just be out of work for a month as a break after this whole COVID time. Since starting Plucky eight years ago, I didn't really have a model. I am not a traditional business. And even though many people kept saying, "When are you going to hire? When are you going to build the team? When are you going to do all of that?" That is not the shape of Plucky medium-term or long-term. I'm not going to be a coach factory. I certainly could, but then I'd end up super burned out and not liking my job. And then I'd have a sad company, and it would be bad. So I don't want to do that. CHAD: And that's literally the opposite of Plucky. JEN: Right. I mean, in the name, right? So, where I have landed as a model is to look at what artists do. And you would never take an artist...I really like Lisa Congdon in Portland. She's a cool, cool artist. And I've heard her speak, and I like her a lot. And what would Lisa Congdon's team look like? She sure isn't hiring other artists to do the work that she's over-signed up for. You get Lisa. And so she has a shop, and then she has partnerships where she teaches at different universities. And as I move into the ninth year here, I'm thinking a lot about what's standing between me and Plucky's shape and what an artist like Lisa Congdon has going on? And honestly, fully transparently, I think it's that I need to own that Plucky is me. And it's so messy in marketing. Do you use the royal 'we'? We at Plucky? Who is we? And I think that there's some good growth in front of me this fall and next year to say, yeah, I'm Jen, and I run a company called Plucky. And I'm putting this stuff out in the world, and I hope to have ripple effects. And it won't be by hiring 100 people. It'll be just like you described, selling things to X people, and then those people's reports, those ripples will follow down. And I'm really grateful to have found myself in this place because I love coming to work every day. CHAD: Awesome. Well, even though you love coming to work every day, also enjoy your vacation. JEN: Oh my God. Thank you. CHAD: And your time off and your time to reflect. JEN: Yes, thank you so much. CHAD: You already mentioned the website, but again, mention that, and then are there other places that people can follow along or get in touch with you? JEN: Yes, sure. So the newsletter, like I said, is beplucky.com/newsletter. On Twitter, you can look at @BePlucky. I'm on LinkedIn, too, obviously for Plucky. And then I have basically a behind-the-scenes account on Instagram because it was too annoying...Like, what do you take pictures of, Chad, when you're a coach? You can't take pictures of confidential conversations. CHAD: [laughs] JEN: So Instagram, I was like, I don't know what to do with this anymore. So anyway, I just have a behind-the-scenes one over there, which is called bepluckster because somebody else had it. So yeah, so all those ways. And also, I just generally say that if you're a person listening to this podcast and you just wanted to say something to me or ask a question, you should always just email me. It's just hello@beplucky.com. I love just hearing from people. And I might not be able to send you a three-page essay back, but I really love just interacting. And if something moved you or made you think about something, whether that was something I said or Chad, you can always just shoot me a note and tell me what you're thinking. I am not precious about that. CHAD: Awesome. Likewise. So you can subscribe to the show and find notes for this episode at giantrobots.fm. If you have questions or comments, email us at hosts@giantrobots.fm. You can find me on Twitter @cpytel. This podcast is brought to you by thoughtbot and produced and edited by Mandy Moore. Thanks for listening. Thanks for joining us, Jen. JEN: Thank you. Announcer: This podcast was brought to you by thoughtbot. thoughtbot is your expert design and development partner. Let's make your product and team a success. Special Guest: Jen Dary.

Greater Than Code
252: Designing For Safety with Eva PenzeyMoog

Greater Than Code

Play Episode Listen Later Sep 29, 2021 60:45


TRIGGER WARNING: Domestic Violence, Abuse, Interpersonal Safety 01:26 - Eva's Superpower: ADHD and Hyperfocus * Workplace Accommodation * At-Will Employment (https://www.ncsl.org/research/labor-and-employment/at-will-employment-overview.aspx) 08:19 - Design for Safety (https://abookapart.com/products/design-for-safety) * Tech Used For Interpersonal Harm * Might vs When * Eva Penzey Moog | Designing Against Domestic Violence (https://vimeo.com/373462514) * Weaponizing Technology 12:45 - What Engineers Need to Know * Control/Shared Accounts * Surveillance * Location Data 15:02 - Expanding Our Understanding of What “User” Means * “User as an abstraction.” 20:43 - Parallels with Security * Personas / Archetypes * Adding Layers of Friction * Ongoing Arms Race 22:23 - Spreading Awareness Across Teams Focused on Feature Delivery * Safety Designers as a Specialized Role? * Generalists vs Specialists; Literacy vs Fluency * This Book Is For Everyone: Engineers, Designers, Product Managers, etc. 31:38 - Thinking Beyond The User * Constituency * Design Justice: Community-Led Practices to Build the Worlds We Need By Sasha Costanza-Chock (https://mitpress.mit.edu/books/design-justice) 35:25 - Traditional Design Thinking Protects White Supremacy * We Prioritize The Safety of Marginalized People Over the Comfort of Unmarginalized People * How Design Thinking Protects White Supremacy (https://www.eventbrite.com/e/how-design-thinking-protects-white-supremacy-tickets-168123071633) (Workshop) * Kim Crayton (https://www.kimcrayton.com/): Intention Without Strategy is Chaos * Sitting with Discomfort 40:21 - Putting Ergonomics, Safety, and Security Behind Paywalls * “Ergonomics is the marriage of design and ethics.” * The History of Seatbelts (https://www.youtube.com/watch?v=zEQ6AojkEeo) * Government Regulation * Worker Organizing 45:58 - Tech Workers and Privilege * Overpaid/Underpaid Reflections: Mandy: Inclusive and accessible technology includes people experiencing domestic abuse. Damien: If a product can be used for harm, it will be. Coraline: How systems are weaponized against marginalized and vulnerable folks. The internet is good for connecting people with shared experiences but we're breaking into smaller and smaller groups. Are we propping up systems by taking a narrow view based on our own experiences? Eva: Who didn't teach you about this? It's our job to keep ourselves safe in tech. Tech companies need to take more responsibility for user safety. This episode was brought to you by @therubyrep (https://twitter.com/therubyrep) of DevReps, LLC (http://www.devreps.com/). To pledge your support and to join our awesome Slack community, visit patreon.com/greaterthancode (https://www.patreon.com/greaterthancode) To make a one-time donation so that we can continue to bring you more content and transcripts like this, please do so at paypal.me/devreps (https://www.paypal.me/devreps). You will also get an invitation to our Slack community this way as well. Transcript: MANDY: Welcome to Greater Than Code, Episode number 252. My name is Mandy Moore and today, I'm here with Damien Burke. DAMIEN: Hi, and I am here with Coraline Ada Ehmke. CORALINE: Wow. I actually showed up for once. [laughs] I'm very happy to be with y'all today and I'm very excited about the guest that we have today. Her name is Eva PenzeyMoog and Eva is a principal designer at 8th Light and the author of Design for Safety. Before joining the tech field, she worked in the non-profit space and volunteered as a domestic violence educator and rape crisis counselor. At 8th Light, she specializes in user experience design as well as education and consulting in the realm of digital safety design. Her work brings together her expertise in domestic violence and technology, helping technologists understand how their creations facilitate interpersonal harm and how to prevent it through intentionally prioritizing the most vulnerable users. Eva, I'm so happy to have you here today. Hi! EVA: Hi, thanks so much for having me. I'm so excited to be here. CORALINE: So if I recall correctly and it has been a while so Mandy, correct me if I'm wrong, but I think we open with the same question that we've been opening with for 251 other episodes and Eva, that is, what is your superpower and how did you discover, or develop it? EVA: Yeah, so my superpower is my ADHD, actually [chuckles] and specifically my ability to hyperfocus and I didn't really acquire and start to until the age of 25, which is when I was diagnosed. For people who don't know, hyperfocus is basically exactly what it sounds like. It's a state of very intense focus that people with ADHD will sometimes go into. It's not something you really have control over, it's not something you can just turn on, or off, and it isn't necessarily good, or bad. But for me, I'm really lucky because it often gets triggered when I start to code. So as I was starting to learn code and then I switched over to focusing on design and frontend like CSS and SAAS. But as I was learning that stuff, it gets triggered all the time. So I can sit down and code and oftentimes, hours have gone past and so long as I don't like miss any meetings or forget to eat, it's totally a superpower. CORALINE: That's amazing. I've talked about before, I live with bipolar disorder and I tend to stay in a low-grade manic state as my resting place and I experience very similar things with that hyper focus and just losing hours on a task and sometimes, it's very positive and I get a lot done and sometimes, I'm like, “What the hell did I do?” [chuckles] EVA: Right. CORALINE: But I think it's great that—I've been talking to some other folks with ADHD, with bipolar—the judo moves we can do takes something that really negatively affects us in a lot of ways and finding a way to turn it around, like you said, and use it as a superpower. Those are the strategies we develop when we live with things like this and I'm always happy when people have figured out how to get something good out of that. EVA: Yeah, totally and realizing that you have this thing that happens. Because I'm sure it's been happening my whole life, but I didn't recognize it, or understand it and then just being able to name it and see that it's happening is so powerful. And then to be like, “Oh, I can maybe do certain things to try to get into it,” or just being aware that it's a thing it's like very powerful. CORALINE: I'm kind of curious, Eva, if you don't mind us talking about ADHD for a little while? EVA: Sure. Yeah. CORALINE: Okay. I have a friend who is – actually, a couple of friends who were very recently diagnosed with ADHD and they had so much trouble in the traditional tech were workplace, especially working for companies that have productivity metrics like lines of code, or number of commits, or something like that. It was really difficult for both of these friends to operate in an environment where you're expected to have very consistent output day over day and not having accommodation, or not having the ability to design their work in such a way that maximizes the positives of how they work and minimizes the negatives of how they work. Is that something you've struggled with as well? EVA: Yeah, and that's so unfortunate that your friends because like I said, I feel like it is a superpower and most workplaces, they should be trying to harness it and understand that, you can have really, really awesome employees with ADHD. If you set them up for success, they can be so successful. But it is something – so I've only ever worked at 8th Light actually, when I was interviewing, over 5 years ago now, and started doing, trying to find my first job in tech, after doing a bootcamp, I interviewed at a couple different places and none of them felt super great. But obviously, I was just really eager to get my first job. But then I went into 8th Light and 8th Light was one of the places where I really, really did want to work there and was really excited for the interview. But when I got to the office, it was very quiet and there was an open workspace, but people were working very quietly and there were like lots of rooms. I got into that and I was like, “Oh, thank God” like, this is exactly the space I need. I can't handle too much activity. I can't handle offices where they're actually playing music; that type of thing is my nightmare and I don't actually like wearing headphones all day like that. That's not just a easy fix for me and for a lot of people with ADHD. So I felt like right away, now I want to work here even more and I've been really lucky that it's been a really good setup for someone like me to work and I have gotten some accommodations which has been good. I feel like if you don't give accommodations, they're breaking the law, they need to do that. DAMIEN: This is really, really validating because I've had similar experiences of that. Even just this morning where I was in the code and I had no idea how much time was going by and I had no awareness of anything else. That's possible because of the environment I have that I work in. Whereas, previous jobs I've had with bullpens and just open office plans, I was in incredibly miserable there and I didn't understand how people could get any work done in those environments. So just this understanding of how people are different; in what environments some people thrive in and other environments other people thrive in. EVA: Yeah. So have you always worked from home, or has this been a pandemic thing? DAMIEN: This has been probably about 10 years. Yeah. [laughs] I went home and never left. [laughs] EVA: Nice. [chuckles] CORALINE: I've done something very similar. I started working from home, I think in 2015 and not for a great reason, but I found the exact same thing that you're talking about. Like I am very sensitive to my environment. I use music to control my mood and like you, Eva, I hate headphones. So I do wonder, you mentioned accommodations and the legal perspective on that. In Illinois where – Eva, you live in Illinois, too. Are you local for 8th Light? EVA: Yeah. I live in Chicago. CORALINE: We have that will employment and it's really easy to discriminate against folks on multiple axes rather than providing our accommodations. Without will employment, they can just let you go and you have no proof that it was because they're ableist, or racist or transphobic, or whatever. EVA: Oh, yeah. That's so rough. Pritzker's got to get on that. Our governor. [chuckles] CORALINE: So do you want to tell us a little bit about the book that you just wrote? I understand a lot of people are finding a lot of value in it and really opening their eyes to a lot of maybe issues they weren't aware of. EVA: Yeah. So my book, Design for Safety, came out in early August and it's been really great to see people's reactions to it. I got my first formal book review, which was really cool and it was overall very positive, which has been very exciting. I'm hopeful that it is helping people understand that this is a thing because it's different, I feel like than a lot of other problems. Someone else explained this to me recently and I had this light bulb moment that I'm not providing a solution to a problem that people know that they have this problem, like how their tech is used for interpersonal harm and now I have a solution like, here's this book that's going to tell you how to fix it. It's more that people don't even know that this is a problem. So I'm educating on that as well as trying to give some of the solutions on how to fix it. It has been a lot of people just saying like, “I had no idea about any of this. It's been so eye-opening and now I'm going to think about it more and do these different things.” So that's been really great to see that just people's awareness is going up, basically. MANDY: I really like on the website, the sentence that there's a pullout quote, or I'm not sure if it's even a pullout quote, but it says, “If abuse is possible, it's only a matter of time until it happens. There's no might, so let's build better, safer digital products from the start.” I like that. EVA: Yeah, thanks. I was very intentional and well, this goes back to when I was doing a conference talk. Before I wrote the book, I did a conference talk called Designing Against Domestic Violence and I thought a lot about the type of language should I use; should I say might happen, or should I say will happen? I eventually settled on it's going to happen even if it hasn't happened yet, or oftentimes, I think we just don't know that it's happened. People who have gone through domestic violence, some of then we'll talk openly about it. But most people just don't, which makes sense. It's this really intense, personal thing to go through and there's so much judgment and survivors get blamed for all these things. So it makes sense that people don't want to talk that much about it. I ended up thinking we just need to say that it will happen. DAMIEN: That's amazing. So I really want to know everything about this book. [chuckles] but to start with, you said the book is designing for safety and you witnessed this a little bit with domestic violence, violence and abuse. Can you talk about safe from what sort of things you mean when you say safety there? EVA: Yeah, for sure because I know safety is a big word that can mean a lot of different things. But the way that I'm talking about it in my work is in terms of interpersonal safety. So it's like how is someone who has a relationship with you in an interpersonal way going to use technology, weaponized technology, in a way that was not meant to be used? We aren't designing tech with these use cases in mind, but how is it ultimately going to be weaponized for some type of abuse? Domestic violence is really the emphasis and my big focus and was mentioned in the intro, some background in domestic violence space. But there's also issues with child abuse and elder abuse, especially in terms of surveillance of those groups as well as surveillance of workers is another thing that came up a lot as I was researching that I didn't get as much into in the book. But it's basically anytime there's an interpersonal relationship and someone has access to you in this personal way where you're not just an anonymous stranger, how is tech going to be used to exert some form of control, or abuse over that person? DAMIEN: Wow, that is a very important subject. So I'm an engineer who doesn't have a lot of knowledge about interpersonal violence, domestic abuse, anything of that nature and I know you've written a whole book [laughs] and we only have an hour, or so here, but what are the first things that people, or engineers need to know about this? EVA: Yeah, so I think the first thing is to understand that this is a problem and that it's happening and to go through some different examples of how this happens, which is what the first couple chapters of the book are all about. It's different forms of this interpersonal abuse via technology in the form of shared accounts is a really big one and this question of who has control and nebulous issues of control. There's also surveillance is a really big one and then location data as well. So I guess, I don't want to say like, “Oh, just read the book,” but learning a little bit about the different – there's so many different examples of how this works. Just to start to build that mental model of how this happens like, someone taking advantage of certain affordances within a shared bank account software, or someone using an internet of things device to gaslight someone, or torment them. There's so many different examples. Location data shows up in all sorts of really sneaky in terms of stalking. It's not purely putting a tracker on someone's car, or even like Google Map and sharing your location is a more straightforward thing. But there's also, it shows up in other ways like, a grocery store app that has a timestamp and location. You can learn someone's grocery shopping habits and maybe you're estranged from this person, or they've left you because you're abusive, but they don't know that their stuff is showing up in this app and their location data. So it shows up in all sorts of different ways. This is a very long way to answer your question, but I think the first thing is to start to understand how this stuff works so that you're just aware of it and then from there, I have a whole chapter about how to implement a practice of designing for safety at your company. It is a little more design focused, but I think engineers can absolutely be doing this work, too. Even if it's just like quick research on how are any product with any type of message feature is going to be used for abuse and there's lots of literature out there. So just looking at some articles, thinking about ways that aren't covered already, that just having a brainstorm about what are some new ways this might be used for abuse and then thinking about how to prevent them. CORALINE: One of the things that I was thinking about after reading your book, Eva, is at a metal level, or zooming out a bit. I think a lot of the ways that we design software, we have this idealized and homogenous notion of a user. I think that in a lot of cases, especially if you're working on a project that's like more, or less one of those scratch your own itch problems, you tend to think of yourself as the user. It's great to have that empathy for the end user, but what we don't have, I don't think as a field, is an understanding that user is an abstraction and it is a useful abstraction. But sometimes you need to zoom down a little bit and understand the different ways that people want to use the software and will use the software and what makes them different from this average idealized user. That was one of the things that really struck me, especially from the process you were describing, is expanding our understanding of what user means and anticipating the different use cases with hostile users, with actively abusive users, and I think thinking of abstraction is super helpful, but I feel like sometimes we need to zoom down and think differently about really who the people are and what their circumstances might be. EVA: Yeah. Oh man, I just wrote down what you said, user is an abstraction. That's such a good way to think about it that I haven't heard before, but you're absolutely right that it's encapsulating such a big group of people. Even if for a small product, something that's not like Twitter that's open to billions of people, even something that's a subscription, or something that's going to have a smaller user base. There's going to be such a diverse, different group within there and to just think of the term user as a catchall is definitely problematic. Sorry, I'm just processing that user is an abstraction, that term because we use it so much as designers, definitely. CORALINE: Yeah. EVA: And anyone in tech is always using this term, but problematizing that term in a new way is really interesting to me. And I think my other thought about this is that we talk a lot about needing to think about more than just happy path and I feel like even that, at least in my experience, has been other things that are also very important where it's like, let's think about someone who has a crappy Wi-Fi connection, or someone who's low vision. Like there are all these other very important things to think about in terms of accessibility and inclusivity. I think I see what I'm doing as just adding another group into the mix of let's think about people who are currently surviving domestic violence, which is maybe a little bit harder to bring up than those other two that I mentioned because it's just so dark and it's something that we just don't want to have to think about, or talk about during work. It's just such a bummer, but it is really important to have this new group added when we're thinking about inclusive and accessible tech. DAMIEN: There's a really great parallel here, I think with security minded design and research. Again, that's another user who is not behaving in the happy path. That's not behaving the way your normal users are behaving and you have to design your system in such a way to be resilient to that. So I love this user as an abstraction, then breaking it down into all these ways and then also, there's a huge value to diversity in your team with this sort of thing. CORALINE: Absolutely. DAMIEN: You can understand the very different types of users having people on the team who can understand blackhat users who are going to be trying to use your servers to mine Bitcoin, or [laughs] blind users, low vision users, or colorblind users, for goodness' sake. And then in addition to that, people again, who are experiencing domestic violence, other to terms of other forms of interpersonal abuse and just being able to understand all those users and their experiences with the things you're building and designing. EVA: Yeah, definitely those are all really good points. Just going back to what you said about the parallels with security is something I've actually been thinking about that a lot, because I think there are lots of parallels to that, or useful things about how security professionals think about their work and operate. Especially the big one for me right now is thinking about a security professional. They're never going to be like, “Okay, we did it. Our system is secure. We're done. We have arrived.” That's not a thing and I feel like it's very similar with designing for safety, or even inclusion. There's just, you're never – I feel like we've had a mental model of “I can think about these things, I can check these boxes, and now, my product is inclusive, or my product is accessible.” I feel like we should be thinking more like security professionals where there's always going to be more things like, we always have to be vigilant about what's the next way that someone's going to misuse tech, or the group that's going to be identified that we've totally left out and is being harmed in some way. So I think that's just a useful shift that I'm thinking a lot about. CORALINE: And Damien, I'm so glad you brought up the parallels with security. I was actually going there as well. One of the things that I've been thinking about from an ethical source perspective is insecurity that, I think two tools that would be super useful. First of all, personas and secondly—I guess, three things—understanding that safety can be a matter of adding layers of friction to disincentivize abusive behavior and like you said, recognizing this is an ongoing arms race. Every new feature that you design opens up some kind of attack, or abuse factor and if you're not planning for that from the outset, you're going to be caught later when harm has been done. EVA: Yeah, absolutely. Since you brought up personas, there is something in the process that I created that's a similar tool where I call them archetypes because they're a little different from personas. But it's identifying who is the abuser in this scenario, who is the survivor, and what are their goals and that's basically it, we don't need to get into anything else. I don't think, but just articulating those things and then even having a little printout, kind of similar to the idea with personas like, oh, you can print them out for your sales team, or whoever it is to keep these people in mind. A similar idea of just having them printed out an on your wall so that it's something that you're thinking about like, “Oh, we have this new feature. We probably need to think about how is this abuser person that we've identified who would want to use our product to find the location data of their former partner,” whatever it is. CORALINE: Yeah. EVA: Use this. CORALINE: From a mechanical perspective, Eva, one of the one of the challenges I had at GitHub when I was working on community and safety is that the other engineers and the other groups were creating so many new features. I felt like the knowledge about how feature can be abused, or like you said, will be abused wasn't spread very effectively throughout, especially a large software organization, and it fell on a small team of folks who frankly were not consulted. A feature would go out and we'd be like, “Holy crap, you can't do that because of this, this, and this.” So do you have any do you have any thoughts? I know you said print it out, or put it on the wall, but do you have any thoughts for how to spread that awareness and that mode of thinking across teams who frankly may be very, very focused just on feature delivery and will see any consideration like that as slowing them down, or having negative impact on “productivity”? EVA: Yes. I have many thoughts. [chuckles] So this is bringing up something for me that I've struggled with and thought about is should there be specialized teams in this area? I feel like yes, we want people with special knowledge and experts and that's really important, but also, I feel like the ideal scenario is that it's just everyone's job. CORALINE: Yeah. EVA: Those teams were already doing things and it wasn't seen as “Oh, Coraline's team is going to come in and now we have to consult with those people,” or whatever because it's not our job, it's their job. CORALINE: Yeah. EVA: Which this isn't a very maybe satisfying answer to your question because I feel like it involves a huge shift in the way that we think about this stuff, but it is something I've thought about in terms of should I call myself a safety designer? Is that something I want to do? Do I want this to be like a specialized role? Maybe is that a goal where people start to see that? Because there are people who specialize in inclusive design, or accessible design. But then the downside of that is does that just give someone else even more leeway to be like, “Not my job, I don't have to worry about this. And then we have the problems, like what you just described. I don't know, I feel like it's such a big shift that needs to happen. CORALINE: Yeah. One of the models I've been thinking about and I was thinking of this in terms of generalists versus specialists is generalists, or to map that to domain that we're talking about now, the other engineers in your group, or in your company. I feel like there has to be a balance between specialization and general knowledge. The way I describe that is everyone should have literacy on a particular topic and the basic vocabulary for it and a general knowledge of the concepts augmented by a specialist who has fluency. So kind of a dynamic relationship between literacy and fluency. Do you have any thoughts on that? EVA: I love that. I'm literally writing that down. A generalist with literacy and a specialist with fluency is such a good way to think about it because I feel like I do say this. I don't want people who read my book, or see my talk to think like, “Oh, I have to be like her, I have to learn all this stuff. I have to really dig into domestic violence works and what it means and laws.” I don't want people to feel like they have to do that because it's just such a dark, heartbreaking thing to have to think and read about every day and I don't think that's a realistic goal. But I think being a generalist with literacy is realistic augmented by specialist with fluency; I'm just like basically repeating what you just said. [chuckles] But that's just a really brilliant way to think about it. DAMIEN: That pattern actually really matches something that I learned from another Greater Than Code guest. I'm sorry, I can't remember their name right now. I believe we were talking about inclusivity and what they said was like, “It's not the expert's job to make the product, or the company inclusive. [chuckles] It's the expert job to support – it's everybody's job to make it inclusive. It's the expert's job to be an expert and to support them.” We also use again, a metaphor from security. We don't have security experts whose job it is to make your app secure, we have security experts whose job it is to support everybody in keeping your app secure. CORALINE: Yeah. DAMIEN: So I feel like that this matches really well. The job of the person with this expertise is to support, to educate, to guide not because they can't do all the work together all themselves, like Coraline said. There's just too many features being added for [laughs] for some team somewhere to go, “Oh no, this is fine,” or “That's not fine.” EVA: Yeah, totally, and I feel like that just brought up something for me, Damien, about the speed at which we work, too many features being added, not enough time to actually do this work, and how—this is getting at just way bigger critique of tech in general. DAMIEN: Yeah. EVA: But it's okay to slow down once in a while. I feel like just the urgency thing causes so many problems outside of just what we're talking about. But this is another big one that I feel like it's okay to spend an afternoon thinking through what are the ways this is going to be not inclusive, or unsafe and that's totally fine. But I fall into it, too where I'm like, “I want to deliver things quickly for my client,” or if I'm doing so internal for a flight, I want to get done quickly. I don't want to hold people up. So it is a really hard thing to break out of. CORALINE: It seems to me, Eva, that this kind of knowledge, or this kind of literacy, or this kind of making it part of the process can fall solely on engineers. Because in a lot of places, we have of product managers who are setting deadlines for us. How do you communicate to them why this work is so important when they may only see it as like, “Well, you're getting in the way of us hitting a release date and we have a press release ready,” or “We want our debut this feature at a particular time, or place”? MANDY: And now we want to take a quick time out to recognize one of our sponsors: Kaspersky Labs: Rarely does a day pass where a ransomware attack, data breach, or state sponsored espionage hits the news. It's hard to keep up, or know if you're protected. Don't worry, Kaspersky's got you covered. Each week, their team discusses the latest news and trends that you may have missed during the week on the Transatlantic Cable Podcast mixing in humor, facts and experts from around the world. The Transatlantic Cable Podcast can be found on Apple Podcasts & Spotify, go check it out! EVA: Yeah, totally. So I think ideally, this comes from everyone. My book is called Design for Safety, but I really hope that people are reading it, who are also engineers and who are also project managers—basically anyone who has a say in how the product is actually going to function, I think should be doing this work. But specifically, if you have a project manager who is rushing everyone and saying, “We don't have time for this,” I do have a couple different strategies in my book about this, where it's like we can use statistics to talk about that this is a thing that is impacting a lot of our users. It's 1 in 3 women, 1 and 4 men in the US have experienced severe physical, domestic violence and that's just severe physical, domestic violence. There's so much domestic violence that doesn't have a physical component to it so that could be like a third of our user base. So bringing stuff up like that to try to get some buy-in, but then also my process, I have little time estimate. CORALINE: Yeah. EVA: So saying like, “We want to do research; it's going to be 6 hours.” “We want to do a brainstorm; it's going to be 2 hours.” Giving people very specific things that they can say yes to is always going to be better than just an open-ended, “We want to design for safety.” CORALINE: Yeah. EVA: And someone being like, “I don't know what that means, but we have a deadline.” Saying like, “We're going to do a brainstorm to identify ways that our product will be used for harm. We want to do it next week and we want to spend 4 hours on it” is going to be a lot better. DAMIEN: And I want to call out how important and useful the language you use there was you said because when you find something, when you do that brainstorm, or whatever analysis process, you go like, “Oh, here's the way our products will be used for harm.” Because if you say to a product manager, “Here's a way our product might be used for harm,” they go, “Well, okay.” [laughs] “Might not be.” [laughs] If you say, “Here's a way our product will be used for harm.” Well, now that leaves a lot less of wiggle room. EVA: Hmm, yeah. That's a really good point that I actually hadn't thought about. I think the other thing is there's tangible outcomes from something like that brainstorm, or these different activities that I have outlined. You can actually show the person, like, “Here's what we did. Here's what we came up with,” which isn't necessarily – I wish we didn't have to always do that; always have some type of very explicit outcome from everything we do. But I do think that's a reality that we have that this process kind of helps with. CORALINE: I want to go back to the user thing. Again, one of the things that we're thinking about our ethical source is thinking beyond the user and thinking about not just who is using the technology that we're creating, but the people that the technology we're creating is being used on. EVA: Yes. That's such a good point. I'm actually curious, have you come up with a term for that type of user? Like nonuser? CORALINE: I have not yet, but that's a great call out. Language is so important so, yeah. EVA: Yeah. I don't know that it exists and I've seen nonuser, but I don't know that that's agreed upon. DAMIEN: I've gotten as far, the best I've come up with is constituency. CORALINE: That is very interesting, Damien because one of the things we're developing is a governance tool. The W3C, when they were working on the HTML standard—this was a couple of years ago, I think—they mentioned something called a priority of constituent and this was very much from a standards body perspective, but it was one sentence and I think it is such a powerful sentence. Just for their example, they said, “In times of conflict, we prioritize end users over developers, over browser manufacturers, over spec writers, over technical purity.” [laughter] EVA: Wow. CORALINE: That's one sentence, but writing that down, I think can really help cut through a lot of a lot of the noise and a lot of the gray area maybe that's the most encountered. It's so simple and you can do it in a single sentence. So absolutely, the notion of constituencies and being explicit about whose safety, convenience, or what have you you're optimizing for. EVA: Yeah. That's really important and I have two thoughts. One is that this comes up a lot in the surveillance space where it's like, what sort of rights, or priority should we be giving someone who is walking on the sidewalk in front of a house that has a Ring camera that's facing out to capture the porch, but is ultimately capturing the sidewalk in the street? What are the rights of that person, that nonuser, who has not agreed to be filmed and isn't part of this product's ecosystem, but is still being impacted by it? It's something I think about a lot, especially there's so many in my neighborhood I see. Since I wrote the book, I see the Ring cameras everywhere, including in places where they're not really to be like on the outside of someone's gate, just facing the sidewalk. It's like, you're not even recording your own property at that point. It's just the gate, or it's just the sidewalk, I mean, which I feel is very problematic. You also said that it's important to explicitly call out who you're prioritizing and that's something – I read this book called Design Justice by Sasha Costanza-Chock, which was very lifechanging and it's just such a good book. It's a little more theoretical. She explicitly says it's not a guide, but she talks about this, about how it's really important to, if you are going to choose not to be inclusive, or safe, or justice focused, whatever it is, you need to explicitly say, “We are choosing to prioritize the comfort of this group over the safety of this group. CORALINE: Yeah. EVA: Or whatever it is. Like, you need to actually just spell that out and be upfront about it. DAMIEN: Yeah. It reminds me of, I think I learned this from Marla Compton. Although, I don't know if she originated it. I guess, she probably didn't, but the phrase she taught me was, “We prioritize the safety of marginalized people over the comfort of non-marginalized people.” It's such a powerful statement. CORALINE: It really is. DAMIEN: Yeah, and just making that explicit like, “These are the tradeoffs and these are where we side on them.” CORALINE: Yeah. EVA: Yeah. Oh, yeah. That's such a good one. I did this workshop recently, it's called How Traditional Design Thinking Protects White Supremacy, but they talked a lot about how feeling entitled to comfort is just such a white supremacist thing and I feel shows up in different forms of oppression as well like men's comfort, et cetera. But that's something I've been thinking about a lot is the feeling of a right to comfort and how that also includes a right to not have to have any type of conflict and a fear of conflict. How these things all play together and how it's all part of white supremacy and how it shows up in our culture, in our workplaces. It was a great workshop. I would highly recommend it because it's also been a lifechanging thing as I digest all of the different things from it. DAMIEN: It's so powerful to name that as comfort. CORALINE: Yeah. DAMIEN: Like, this is what we're protecting. We're protecting these people's comfort [chuckles] and this is what it will cost. CORALINE: I think about what Kim Crayton said for a year is, “Get comfortable with being uncomfortable.” EVA: Yeah, that's such a good one. I love her. CORALINE: Yeah. EVA: I quoted her in my book about, oh, I forget what it is. It's something about not having strategy is chaos. CORALINE: Oh my God. EVA: Like, the need for strategy. CORALINE: I learned so much from her from that one statement. That was literally lifechanging for me. That was literally lifechanging for me because I always had a negative feeling about strategy, like strategy is coercive, or insincere. And then another friend of mine I was talking to about it said strategy is good when it's not a zero-sum game. EVA: Mm. CORALINE: I think we maybe we can think about personal safety and abuse factors in that way. EVA: Yeah, definitely. I think the full quote is “Intention without strategy is chaos.” CORALINE: Yeah, that. EVA: That has been very definitely influential for me and as I feel like a big part of the reason, that idea is why I wrote my book and did my conference talk is because I was feeling frustrated with – it's a lot easier to raise awareness about an issue than it is to have actual strategies for fixing it. I felt like I would always get really fired up reading something, or listening to a talk and be like, “Yeah, this is such a huge problem. We need to fix it,” and then didn't have a takeaway, or anything that I could really do at work other than just being told to think about this, or consider this, which I'm like, “When do I do that?” CORALINE: And what does that look like? EVA: Yeah, you can't think about all of the different things we need to think about from 9:00 to 5:00 while we're at work every day. We need a strategy to do that, which is why I like made these different activities that I have in my process. But going back to this white supremacy and design workshop that I did, I also learned in there about how some other ways that white supremacy shows up is having an action bias and a sense of urgency. CORALINE: Yeah. EVA: And how a lot of that can come from people, especially white people, not being able to like sit with discomfort when we're faced with really uncomfortable topics and a desire to jump into action before we fully understand the problem and have internalized it. So now I'm feeling like I need to backtrack a little bit and be like, “Yes, provide action.” But also, it is good to do deep learning. I think we need both, but I feel like a lot of people, it's one, or the other. Let's do a ton of learning, or let's jump right into action. I have always been a jump right into action person and now I'm realizing it's okay to take a beat and do some deep learning and to sit with all the discomfort of the heavy topic. CORALINE: A friend of mine gave me a concept that I like a lot. He has a definition of ergonomics that is the marriage of design and ethics. When I use the term ergonomics in that sense, what I mean is how easy is it to do a particular action. One of the things that I see quite a bit—something, I think is a terrible consequence of the web, frankly—is putting ergonomics behind paywalls and asking people who use our software to yield some degree of agency, or digital autonomy, or security in exchange for features. EVA: Hmm. So interesting. CORALINE: So I'm curious maybe how you would frame designing for safety, some of the other axes of oppression that we discussed on the show today, from the perspective of the ethical aspect of our design decisions. What workflows are we optimizing for? What workflows are we putting behind a paywall, or in exchange for okay, you're signing up. The [inaudible] says you're buying into surveillance capitalism and you just simply have to do that if you want an email account, if you want a Twitter account, what have you. EVA: Yeah. I do feel like there is a bit of an issue with putting safety and security sometimes behind a paywall where you can literally pay more to not get advertised to, for example. CORALINE: Yeah. EVA: Which it's like, I get that products have to charge money and it's like we shouldn't – the flipside of that is well, we can't just work for free. I see that a lot with journalism when people are criticizing paywalls and it's like well, but journalists have to get paid. They can't work for free just like everyone else. But I do feel that with things like being able to opt out of advertising and I feel like there are other things. Nothing's coming in right now, but different ways that you can ease some of the crappier parts of tech, if you have enough money, to buy into the paid versions of things is definitely problematic. Who are we keeping out when we do that and who are we saying doesn't deserve this privacy and the safety? What should just be standard? The seatbelt; I'm obsessed with the history of the seatbelts. CORALINE: [chuckles] I still have the [inaudible] that's been going around. EVA: Yeah. CORALINE: It's amazing. EVA: I've talked about this in many different places, but the seatbelt used to be something that you had to pay extra for. In today's dollars, it would've been like 300 extra dollars when you bought a car to get seat belts and only 2% of the people, in 1956 when they were introduced, actually paid for them and probably even less were actually using them. And then there was a revolution in the auto industry led by activists and everyday people. It definitely not come from the auto industry; they had to be forced into these different things. But now seat belts, the government basically, they passed a law and they said, “You have to just include seat belts as a standard feature.” I think about that a lot in tech. The things now that we're making people pay for, should some of those just be standard features and how are we going to get there? Probably government regulation after a lot of activism and everyday people rallying against these different things with big tech. But I think we're going to get there with a lot of things and we're going to see a lot of seatbelts, so to speak, become just standard features and not something you have to pay for. CORALINE: And I wonder, you mentioned government regulation; I have literally zero faith in government doing anything effective in the online world at all because our government is powered by 65-year-old white men that are rich and there's no incentive for them to care about this even if they did have the basic literacy about how this stuff works. It seems to me one of the things that we've been seeing really emphasize is, especially during in post lockdown, is worker organizing and I wonder if there's a strategy here for empowering the engineers, who frankly, we are being treated rockstars right now. I hate that term rockstar, but we're overpaid, we're pampered—a lot of folks, obviously, not everyone. So can we leverage our power? Can we leverage the privilege of being in such an in-demand profession to affect change in organizations that have no financial incentive to think about stuff like this at all? EVA: Yeah. So many things I want to respond to. Definitely, I think worker power is like such a strong point in all of this and I feel like we are the ones leading out on this. A lot of it is coming from people who work in tech and understand the issues. Like, writing, speaking, and doing these different things to help everyday people who don't work in tech understand like, “Hey, actually, here's why Facebook is really terrible.” A lot of that is coming from people in tech, even former Facebook employees even. CORALINE: Yeah. EVA: Which is different, I think from the paradigm shift we had with the auto industry. I don't know, I would have to look, but I'm pretty sure is not coming from car designers and engineers weren't helping lead that charge the way that we are. But I also want to respond to something you said about tech workers being overpaid and pampered, which yes, I agree with you. But I also think there are privileges that everyone should have and that no one should of and I feel like everyone deserves to be well paid, to be comfortable and have all these perks, and whatnot. I had a career in nonprofit before this so I have so much internalized just baggage about and guilt around feeling with my pay, my benefits, and all these things. The work I do now, compared to the work I was doing in the nonprofit, which was helping kids who were basically on a road to dropping out before graduating high school, which was really important work and I made so much less money and worked so much harder. But I feel like everyone deserves to be as well paid as we are and it is possible. CORALINE: Yes. EVA: So I just wanted to kind of throw that out there as well that we – [chuckles] I feel like I'm trying to just absolve myself from being a well-paid tech worker. But I do think we deserve this and also, everyone else deserves similar treatment. CORALINE: Absolutely. DAMIEN: Yeah. I feel the same way, especially—to take an example within a tech company—as an engineer, I get paid a lot more than customer service people. CORALINE: Yeah. DAMIEN: And that doesn't mean I'm overpaid, [chuckles] it means they're underpaid. CORALINE: Yeah. DAMIEN: A lot. [laughs] CORALINE: Yeah. EVA: Yeah, and I feel like this whole conversation, honestly, this is a freaking tactic. This is what the people at the top, this is how they want us to feel; pitting us against each other, feeling like it's not that – the sales people, that's normal and we're overpaid. It's like, no, actually we're paid a livable amount where we can live comfortably and they're exploited even more than we are. That's how I'm trying to think about things because I do feel like this other way of looking at it is just absolutely a tactic of, I don't know, the 1%, whatever you want to call them. The company leaders definitely don't want us to feel like we're – they would rather us feel that we're overpaid and pampered than just compensated for the labor we do in a fair way, MANDY: Have us feel the shame and guilt around it, too. Before I was in tech, I went from welfare to making a reasonable standard of living in a year and sometimes, I still feel guilty about it. It's a heck of a feeling. EVA: Yeah, and I feel like that didn't just come out of nowhere. We've been taught that we should feel guilty for just surviving. I don't know. Because I think even in tech, it's a lot of people there's still so many issues with burnout, with—I don't know about you all, my body sometimes just hurts from not moving enough during – like, there's still all these like different things that could be better. But the feeling that we should feel guilty for having some comfort and decent pay, I think that's definitely a strategy that has come from these different powerful groups. It didn't just come out of nowhere. CORALINE: I appreciate y'all pushing back on that. I guess, I'm speaking from an emotional place. Eva, you went from nonprofit and the tech. In April, I went from tech and the nonprofit and personally, I took a 30% pay cut and – [overtalk] EVA: Oh, wow. CORALINE: It just really made very visible and very personal seeing what we value as a society and what we don't value as a society. I'm still comfortable; I still have a living wage and everything. But look at what happened during the lockdown with “frontline workers.' They're heroes, but we don't want to pay them more than minimum wage. So I definitely agree with what you're saying about other people being underpaid and I definitely hear what you're saying about that guilt, but guilt is a form of discomfort. What are you going to do with that? What are you going to do with the privileges and the power that we have as a result of the way we're treated in this industry? I feel like that's the more important thing and what do you do with it? Are you giving back? Are you giving back in a substantive way, or are you giving back to assuage your guilt? It's nuanced. As y'all are pointing out, it is nuanced. EVA: Yeah. It's very complicated, but I feel like agitating for those—sorry, Damien, I think you said support people—getting paid more, that's something we can agitate for. I know someone, I'll call her an online friend of mine in the infertility space, which I'm very involved in as I go through my journey. I hate that word, but I've made all these online friends who are going through it and one of them is a paralegal and she is obviously hoping, although it's not going well, to get pregnant. But she was looking into the parental benefits and realized that the lawyers where she works had, I think it's 18 weeks fully paid off and then everyone else got this weird piecemeal of 6 weeks paid off, then there's FMLA, and then there's PTO, and all this stuff that amounted to a lot less, and you had to like use all of your PTO and all these different things. She actually was able to—with some of the lawyers help, I believe—get that policy change that it was just the same for everyone because it was like, “I didn't go to law school. So therefore, I don't need as much time with my newborn? How does that make sense?” CORALINE: [chuckles] Yeah. EVA: So I feel there is a lot of potential to have more equality in our companies, especially as the most powerful people often in the companies, to push for that change to happen. CORALINE: Yeah. EVA: There needs to be a lot of solidarity, I think, between these different types of workers. CORALINE: Yeah, and that's a great example of that. MANDY: Well, this has been an absolutely fantastic conversation and I feel so privileged just to be sitting here kicking back and just taking in the back and forth between the rest of you. I wrote down a bunch of a things, but one of the biggest takeaways that I have had from this episode, and especially if you've been listening to the show the past couple episodes, we've been talking about a lot of accessibility things. Eva, you said something that was mind-blowing for me and it shouldn't be mind-blowing, but it was because I was like, didn't even ever think of that and what the hell is wrong with me for not even ever thinking about that? but inclusive and accessible includes people experiencing domestic abuse. It's not something – I guess, because as what you said, people don't talk about it. So just keeping that in mind was pretty pertinent to me. I also liked what Coraline said about specialization and then the general knowledge and literacy versus fluency. That was really good as well. So it's been an awesome conversation. Thank you. Damien, what do you have? DAMIEN: Oh, well, this has been really awesome and I want to of first thank Eva for being our guest here and for the work you do and this book. The thing that's going to be sticking with me, I'll be reflecting on for a while, is this sentence both well, if the product can be used for harm, it will be, which is not only a really powerful thing to keep in mind when designing and building a thing, but also, a powerful sentence that is really useful in communicating these issues. So thank you very much for that. CORALINE: One of the things that and actually Eva, this was a reaction I had when I first read your book is, I think a lot of us, a growing number of us, have at least an awareness, if not a personal experience, with how systems are weaponized against marginalized, or vulnerable folks. So I think it's really important that in your book, you focus very specifically on a particular domain of abuse, abuse of power and loss of agency and loss of privacy, loss of physical safety. One of the things I've been thinking about a lot is how the internet has been really good for connecting people with shared experiences and creating communities around the shared experiences. But I do worry that we're breaking into smaller and smaller and smaller groups and I see that. I don't know if it's intentional, but it certainly is a way, I think that we're propping up, that we're being coerced into propping up these systems by taking a narrow view based on our own experiences. I don't see that as a criticism. What I see it as is an opportunity to connect with other folks who experience that same kind of systemic damage in collaborating and trying to understand the different challenges that we all face. But recognizing that a lot of it is based frankly, white supremacy. We used to talk about patriarchy; I think the thinking broadly has evolved beyond that. But I would love to see your publisher start putting books together on different particular axes, but also, looking at ways that we can bridge the differences between these different experiences of intentional, or unintentional harm. So that's something that I think I'm going to think about. EVA: Nice. I can't give any spoilers, but I do think my publisher might have something in the works that it's getting at some of this stuff. Wonderful. EVA: Which is exciting. CORALINE: Yeah. EVA: Yeah, okay. Man, those are all so good. My reflection, I'm just thinking a lot about our conversation about the way that people in tech might feel like we're overpaid, or pampered and how that feels like an intentional thing that has come from somewhere and things like that don't just – it always comes from somewhere. I'm thinking Mandy, about what you said in your reflection. You said, “What's wrong with me for not thinking about this?” I always feel like when I hear people say things like that, it's like well, when were you – I think more who didn't teach you about this? Why wasn't this part of your education as you were learning to code and before you joined the industry? I feel like that's more where the blame lies than with individuals, but yeah. Something I was thinking about earlier today, before we started recording, is that this idea of user safety, that it's like our job to keep ourselves safe on tech and there's so many resources out there, different articles, and different things. I've been thinking similarly about that, but that's a marketing campaign. That's something that the leaders of big tech done to intentionally shift responsibility from themselves and onto the end user. We're expected to be legal experts, read these agreements, and understand every single thing about a product that no one uses every single feature, but we're expected to understand it. If we don't and something goes wrong, either interpersonal harm, what I do, or with like oh, someone guessed your password or whatever it was, it's your fault instead of it being the tech company's responsibility. I feel like that's another thing that I'm thinking like that didn't come from nowhere, that came from somewhere. CORALINE: Yeah. EVA: It feels like a very intentional strategy that big tech has used to blame us for when things go wrong. Not to say that we get to be absolved of everything, people have responsibilities and whatnot, but I feel like a lot of times it's like this comes from somewhere and I'm trying to think more about that kind of stuff. This conversation was really awesome for helping me process some of those and expand my thoughts a little bit more. So thank you all, this was just really awesome. DAMIEN: Thank you. Thank you for being here. MANDY: Thank you for coming. CORALINE: Yeah. So happy to talk to you, Eva. EVA: Yeah. You, too. MANDY: All right, everyone. Well, with that, we will wrap up and I will put a plug in for our Slack community. You can join us and Eva will get an invitation as well to come visit us in Slack and keep these conversations going. Our website to do that is patreon.com/greaterthancode. Patreon is a subscription-based thing that if you want to you can pledge to support the show. However, if you DM any one of us and you want to be let in and you cannot afford, or just simply don't want to, monetarily support, we will let you in for free. So just reach out to one of the panelists and we'll get you in there. So with that, I will say thank you again. Thank you, everybody and we'll see you next week! Special Guest: Eva PenzeyMoog.

The Bike Shed
310: Schedule Shut Down, Complete

The Bike Shed

Play Episode Listen Later Sep 28, 2021 39:16


Chris talks feature flags featuring Flipper (Say that 3x fast!), and Steph talks reducing stress by a) having a work shutdown ritual and b) the fact that thoughtbot is experimenting with half-day Fridays. (Fri-yay?) Flipper (https://featureflags.io/2016/04/08/flipper-a-feature-flipper-feature-toggle-library/) Drastically Reduce Stress with a Work Shutdown Ritual (https://www.calnewport.com/blog/2009/06/08/drastically-reduce-stress-with-a-work-shutdown-ritual/) Iceland's Journey to a Short Working Week (https://autonomy.work/wp-content/uploads/2021/06/ICELAND_4DW.pdf) Burnout: The Secret to Unlocking the Stress Cycle (https://www.burnoutbook.net/) Transcript: STEPH: Hey, do you know that we could have an in-person recording at the end of October? CHRIS: I do. Yes, I'm planning. That is in the back of my head. I guess I hadn't said that to you yet. But I'm glad that we have separately had the same conversation, and we've got to figure that out, although I don't know how to do noise cancellation and whatnot in the room. [laughs] How do we...we'll have to figure it out. Like, put a blanket in between us but so that we can see across it, but it absorbs sound in the middle. It's weird. I don't know how to do stuff. Just thinking out loud here. STEPH: We'll just be in the same place but still different rooms. So it'll feel no different. [laughter] Hello and welcome to another episode of The Bike Shed, a weekly podcast from your friends at thoughtbot about developing great software. I'm Steph Viccari. CHRIS: And I'm Chris Toomey. STEPH: And together, we're here to share a bit of what we've learned along the way. Hey, Chris, what's new in your world? CHRIS: Feature flags. Feature flags are an old favorite, but they have become new again in the application that I'm working on. We had a new feature that we were building out. But we assumed correctly that it would be nice to be able to break it apart into smaller pieces and sort of deliver it incrementally but not necessarily want to expose that to our end users. And so, we opted with that ticket to bring along the feature flag system. So we've introduced Flipper, in particular, which is a wonderful gem; it does the job. We're using the ActiveRecord adapter. All that kind of makes sense, happy about that. And so now we have feature flags. But it was one of those mindset shifts where the minute we got feature flags, I was like, yes, okay, everything behind a feature flag. And we've been leaning into that more and more, and it really is so nice and so freeing, and so absolutely loving it so far. STEPH: I'm intrigued. You said, "Everything behind a feature flag." Like, is it really everything or? Yeah, tell me more. CHRIS: Not everything. But at this point, we're still very early on in this application, so there are fundamental facets of the platform, different areas of what users can do. And so the actual stuff that works and is wired up is pretty minimal, but we want to have a little more surface area built out in the app for demo purposes, for conversations that are happening, et cetera. And so, we built out a bunch of new pages to represent functionality. And so there are sidebar links, and then the actual page itself, and routing, and all of the things that are associated with that, and so all of those have come in. I think there are five new top-level nav sections of the platform that are all introduced behind a feature flag right now. And then there's some new functionality within existing pages that we've put behind feature flags. So it's not truly every line of code, but it's basically the entry point to all new major features we're putting behind a feature flag. STEPH: Okay, cool. I'm curious. How are you finding that in terms of does it feel manageable? Do you feel like anybody can go into the UI and then turn on feature flags for demos and feel confident that they know what they're turning on and off? CHRIS: We haven't gotten to that self-serve place. At this point, the dev team is managing the feature flags. So on production, we have an internal group configured within Flipper. So we can say, "Ship this feature for all internal users so that we can do testing." So there is a handful of us that all have accounts on production. And then on staging, we have a couple of representative users that we've been just turning everything on for so that we know via staging we can act as that user and then see the application with all of the bells and whistles. Down the road, I think we're going to get more intentional with it, particularly the idea of a demo account. That's something that we want to lean into. And for that user, we'll probably be turning on certain subsets of the feature flags. I think we'll get a little more granular in how we think about that. For now, we're not as detailed in it, but I think that is something that we want to expand as we move forward. STEPH: Nice. Yeah, I was curious because feature flags came up in our recent retro with the client team because we've gotten to a point where our feature flags feel complex enough that it's becoming challenging and not just from the complexity of the feature flags but also from the UI perspective. Where it feels challenging for users to understand how to turn a feature on, exactly what that impacts, and making sure that then they're not changing developer-focused feature flags, so those are the feature flags that we're using to ship a change but then not turn it on until we're ready. It is user-facing, but it's something that should be managed more by developers as to when we turn it on or off. So I was curious to hear that's going for you because that's something that we are looking into. And funnily enough, you asked me recently, "Why aren't y'all using Flipper?" And I didn't have a great answer for you. And that question came up again where we looked at each other, and we're like, okay, we know there was a really good reason we didn't use Flipper when we first had this discussion. But none of us can remember, or at least the people in that conversation couldn't remember. So now we're asking ourselves the question of we've made it this far. Is it time to bring in Flipper or another service? Because we're getting to the point that we're starting to build too much of our own feature flag system. CHRIS: So did you uncover an answer, or are you all just agreeing that the question makes sense? STEPH: Agreeing that the question makes sense. [laughs] CHRIS: That's the first step on a long journey to switching from internal tooling to somebody else managing that for you. STEPH: Yeah, because none of us could remember exactly. But it was funny because I was like, am I just forgetting something here when you asked me that? So I felt validated that others were like, "Oh yeah, I remember that conversation. But I too can't recall why we didn't want to use Flipper in the moment or a similar service." CHRIS: I'll definitely be interested to hear if you do end up trying to migrate off to another system or find a different approach there or if you do stick with the current configuration that you have. Because those projects they're the sort of sneaky ones that it's like, oh, we've been actually relying on this for a while. It's a core part of our infrastructure, and how we do the work, and the process, and how we deploy. That's a lot. And so, to switch that out in-flight becomes really difficult. It's one of those things where the longer it goes on, the harder it is to make that change. But at some point, you sometimes make the decision to make it. So I will be very interested to hear if you do make that decision and then, if so, what that changeover process looks like. STEPH: Yeah, totally. I'll be sure to keep you up to date as we make any progress or decisions around feature flags. CHRIS: But yeah, your questions around management and communication of it that is a thing that's in the back of my mind. We're still early enough in our usage of it, and just broadly, how we're working, we haven't really felt that pain yet, but I expect it's coming very soon. And in particular, we have functionality now that is merged and is part of the codebase but isn't fully deployed or fully released rather. That's probably the correct word. We have not fully released this functionality, and we don't have a system right now for tracking that. So I'm thinking right now we're using Trello for product management. I'm thinking we want another column that is not entirely done but is tracking the feature flags that are currently in flight and just use that as a place to gather communication. Do we feel like this is ready? Let's dial this up to 50%, or let's enable it for this beta group or whatever it is to sort of be able to communicate that. And then ideally, also as a way to track these are the ones that are active right now. You know what? We feel like this one's ready. So do the code change so that we no longer use the feature flag, and then we can actually turn it off. Currently, I feel like I can defer that for a little while, but it is something that's in the back of my mind. And then, of course, I nerd sniped myself, and I was like, all right, how do I grep the codebase for all the feature flags that we're using? Okay. There are a couple of different patterns as to how we're using…You know what? I think I actually need an AST-based parser here, and I need to use the Visitor...You know what? Never mind. Stop it. Stop it. [laughs] It was one of those where I was like...I was doing this not during actual work hours. It was just a question in my mind, and then I started to poke at it. I was like, oh, this could be fun. And then I was like, no, no, no, stop it. You need to go read a book or something. Calm down. STEPH: As part of the optimization around our feature flag system that we've created, we've added a few enhancements, which I think is also one of the reasons we're starting to question how far we want to go in this direction. One of them is we want a very easy way to track what's turned on and what's turned off for an environment. So we have a task that will easily check, or it prints out a really nice list of these are all your flags, and this is the state that they're in. And by using the system that we have, we have one file that represents...well, you mentioned migration because we're migrating from the old system to this new one. So it's still a little bit in that space of where we haven't fully moved over. So now, moving over to a third thing like Flipper will be even more interesting because of that. But the current system, we have a file that lists all the feature flags and a really nice description that goes with it, which I know is supported by Flipper and other services as well. But having that one file does make it nice where you can just scan through there and see what's in use. I really think it's the UI and the challenges that the users are facing and understanding what a feature flag does, and which ones they should turn off, and which ones they shouldn't touch that that's the point where we started questioning okay, we need to improve the UI. But to improve the UI, do we really want to fully embrace our current system and make those improvements, or is now that time that we should consider moving to something else? Because Flipper already has a really nice UI. I think there is a free tier and a paid tier with Flipper, and the paid tier has a UI that ships. CHRIS: There's definitely a distinct thing, Flipper Cloud, which is their hosted enterprise-y solution, and that's the paid offering. But Flipper just the core gem there's also Flipper web, I want to say is what it is, or Flipper UI. And I think it's an engine that you mount within your Rails app and that displays a UI so that you can manage things, add groups and teams. So we're definitely using that. I've got my eye on Flipper Cloud, but I have some fundamental questions around I like to keep my data in the system, and so this is an external other thing. And what's the synchronization? I haven't really even looked into it like that. But I love that Flipper exists within our application. One of the niceties that Flipper Cloud does have is an audit history, which I think is interesting just to understand over time who changed what for what reasons? It's got the ability to roll back and maintain versions and whatnot. So there are some things in it that definitely look very interesting to me. But for now, the open-source, free version of Flipper plus Flipper UI has been plenty for us. STEPH: That's cool. I didn't know about the audit feature. CHRIS: Yeah. It definitely feels like one of those niceties to have for a more enterprise offering. So I could see myself talking me into it at some point but not quite yet. On that note though, so feature flags we introduced a week and a half, something like that, ago, and we've been leaning into them more and more. But as part of that, or in the back of my mind, I've wanted to go to continuous deployment. So we had our first official retro this week. The project is growing up. We're becoming a lot of things. We used retro to talk about continuous deployment, all of these things that feel very real. Just to highlight it, retro is super important. And the fact that we haven't had one until now is mainly because up till now, it's been primarily myself and another developer. So we've been having essentially one-on-ones but not a more formal retro that involves others. At this point, we now have myself and two other developers that are working on the project, as well as someone who's stepped into the role of product manager. So we now have communication collaboration. How are we doing the work? How are we shipping features and communicating about bugs and all of that? So now felt like the right time to start having that more formal process. So now, every two weeks, we're going to have a retro, and hopefully, through that, retro will do the magic that retro can do at its best which is help us get better at all the things that we're doing. But yeah, one of the core things in this particular one was talking about moving to continuous deployment. And so I am super excited to get there because I think, much like test-driven development, it's one of those situations where continuous deployment puts a lot of pressure on the development process. Everything that is being merged needs to be ready to go out into production. And honestly, I love that as a constraint because that will change how you build things. It means that you need to be a little more cautious. You can put something behind a feature flag to protect it. You decouple the idea of merging and deploying from releasing. And I like that distinction. I think that's a really meaningful distinction because it makes you think about what's the entry point to this feature within the codebase? And it's, I think, actually really nice to have fewer and more intentional entry points into various bits of functionality such that if you actually want to shut it off in production, you can do that. That's more straightforward. I think it encourages an intentional coupling, maybe not a perfect decoupling but an intentional coupling within the system. So I'm very excited to explore it. I think feature flags are going to be critical for it, and I think also observability, and monitoring, and logging, and all those things. We need to get really good at them so that if anything does go wrong when we just merge and deploy, we want to know if anything goes wrong as quickly as possible. But overall, I'm super excited about all of the other niceties that fall out of it. STEPH: [singing] I wanna know what's turned on, and I want you to show me. Is that the song you're singing to Flipper? [laughs] CHRIS: [laughs] STEPH: Sorry, friends. I just had to go there. CHRIS: That was just in your head. You had that, and you needed to get it out. I appreciate it. [laughter] Again, I got Flipper UI, so that's not the question I'm asking. I think that's the question you have in your heart. STEPH: [laughs] Mid-roll Ad And now we're going to take a quick break to tell you about today's sponsor, Orbit. Orbit is mission control for community builders. Orbit offers data analytics, reporting, and insights across all the places your community exists in a single location. Orbit's origins are in the open-source and developer relations communities. And that continues today with an active open-source culture in an accessible and documented API. With thousands of communities currently relying on Orbit, they are rapidly growing their engineering team. The company is entirely remote-first with team members around the world. You can work from home, from an Orbit outpost in San Francisco or Paris, or find yourself a coworking spot in your city. The tech stack of the main orbit app is Ruby on Rails with JavaScript on the front end. If you're looking for your next role with an empathetic product-driven team that prides itself on work-life balance, professional development, and giving back to the larger community, then consider checking out the Orbit careers page for more information. Bonus points if working in a Ruby codebase with a Ruby-oriented team gives you a lot of joy. Find out more at orbit.love/weloveruby. STEPH: That's funny about the CI deployment adding pressure to the development process because you're absolutely right. But I see it as such a positive and improvement that I don't really think about the pressure that it's adding. And I just think, yes, this is awesome, and I want this to happen and if there are steps that we have to take in that direction. It dawned on me that what you said is very true, but I've just never really thought about it from that perspective about the pressure. Because I think the thing that does add more pressure for me is figuring out what can I deploy, or do I need to cherry-pick commits? What does that look like? And going through that whole cycle and stress is more stressful to me than figuring out how do we get to continuous deployments and making sure that everything is in a safe space to be deployed? CHRIS: That's the dream. I'm going to see if I can live it. I'll let you know how it goes. But yeah, that's a bit of what's up in my world. What else is going on in your world other than some lovely singing? STEPH: Oh, there's always lots of singing. It's been an interesting week. It's been a mix of some hiring work. Specifically, we are helping our client team build their development team. So we have been helping them implement a hiring process. And then also going through technical interviews and then going through different stages of that interview process. And that's been really nice. I haven't done that specifically for a client team where I helped them build a hiring pipeline from scratch and then also conduct those interviews. And one thing that stood out to me is that rotations are really important to me and specifically that we don't ask for volunteers. So as we were having candidates come through and then they were ready to schedule an interview, then we are reaching out to the rest of the development team and saying, "Hey, we have this person. They're going to be scheduled at this time. Who's available? Who's interested? I'm looking for volunteers." And that puts pressure on people, especially someone that may be more empathetic to feel the need to volunteer. So then you can end up having more people volunteer than others. So we've established a rotation to make sure that doesn't happen, and people are assigned as it becomes their next turn to conduct an interview. So that's been a lot of fun to refine that process and essentially make it easier. So the rest of the development team doesn't have to think about the hiring. But it still has an easy way of just saying, "Hey," and tapping someone to say, "Hey, it's your turn to run an interview." The other thing I've been working out is figuring out how to measure an experiment. So we at thoughtbot are running an experiment where we're looking to address some of the concerns around sustainability and people feeling burned out. And so we have introduced half-day Fridays, more specifically 3.5 Fridays, as our half-day Fridays just to help everybody be certain about what a half-day looks like. And then also, you can choose your half-day. Everybody works different schedules. We're across different time zones, so just to make sure it's really clear for folks and that they understand that they don't need to work more than those hours, and then they should have that additional downtime. And that's been amazing. This is the second Friday of the experiment, and we're doing this for nine Fridays straight. And one of the questions that came up was, well, how do we know we did a good thing? How do we know that we helped people in terms of sustainability or addressing some of the feelings that they're having around burnout? And so I've collaborated with a couple of other thoughtboters to think through of a way to measure it. It turns out helping someone measure their wellness is incredibly complex. And so we went for a fairly simple approach where we're using an anonymous survey with a number of questions. And those questions aren't really meant to stand up to scientific scrutiny but more to figure out how the team is feeling at the time that they fill out the survey and then also to understand how the reduced weekly hours have impacted their schedule. And are people working extra hours to then accommodate the fact that we now have these half Fridays? So do you feel pressured that because you can't work a full day on Friday that you are now working an extra hour or two Monday through Thursday to accommodate that time off? So that survey just went out today. And one of the really interesting parts (I just haven't had to create content for a survey in a while.) was making sure that I'm not introducing leading questions or phrasing things in a very positive or negative light since that is a bias that then people will pick up on. So instead of saying, "I find it easy to focus at work," and then having like a multiple choice of true, always, never, that kind of thing, instead rephrasing the question to be, "Are you able to focus during work hours?" And then you have a scale there. Or instead of asking someone how much energy they have, maybe it's something like, "Do you experience fatigue during the day?" Or instead of asking someone, "Are you stressed at work?" because that can have a more negative connotation. It may lead someone to feel more negatively as they are assessing that question. Then you can say, "How do you feel when you're at work?" And then you can provide those answers of I'm stressed, slightly stressed, neutral, slightly relaxed, and relaxed. So it generated some interesting conversations around the importance of how we phrase questions and how we collect feedback. And I really enjoyed that process, and I'm really looking forward to seeing what folks have to say. And we're going to have three surveys total. So we have one that's early on in the experiment since we're only two Fridays in. We'll have one middle experiment survey go out, and then we'll have one at the end once we're done. And then hopefully, everybody's responses will then help us understand how the experiment went and then make a decision going forward. I'll be honest; I'm really hoping that this becomes a trend and something that we stick with. It is a professional goal of mine to slowly reduce the hours that I work each week or quickly; it doesn't have to be slowly. But I really like the four-day workweek. It's something that I haven't done, but I've been reading about it a fair amount lately. I feel like I've been seeing more studies conducted recently becoming published, and it's just very interesting to me. I had some similar concerns of how am I still going to be productive? My to-do list hasn't changed, but my hours are changing. So how am I still going to get everything done? And does it make sense for me to still get paid the same amount of money if I'm only working four out of the five days? And I had lots of questions around that, and the studies have been very enlightening and very positive in the outcome of a reduced workweek, not just for the individuals but for the companies as well. CHRIS: It's such an interesting space and exploration. The way that you're framing the survey sounds really great. It sounds like you're trying to be really intentional around the questions that you're asking and not being leading and whatnot. That said, it is one of the historically hard problems trying to quantify this and trying to actually boil it down. And there are so many different axes even that you're measuring on. Is it just increased employee happiness? Is it retention that you're talking about? Is it overall revenue? There are so many different things, and it's very tricky. I'm super interested to hear the results when you get those. So you're doing what sounds like more of a qualitative study like, how are you feeling? As opposed to a more quantitative sort of thing, is that right? STEPH: Yes, it's more in the realm of how are you feeling? And are you working extra hours, or are you truly taking the time off? CHRIS: Yeah, I think it's really hard to take something like this and try and get it into the quantitative space, even though like, oh yeah, if we could have a number, if it used to be two and now it's four, fantastic. We've doubled whatever that measure is. I don't know what the unit would be on this arbitrary number I made up. But again, that's the hard thing and probably not feasible at all. And so it makes sense the approach that you're taking. But it's super difficult. So I'm very interested to hear how that goes. More generally, the four-day workweek thing is such a nice idea. We should do that more. I'm trying to think how long I did that. So during the period that I was working freelance, I think there were probably at least five months where I did just a true four-day workweek. Fridays were my own. It was fantastic. Granted, I recorded the podcast with you. But that day was mine to shape as I wanted. And I found it was a really nice decompression period having that for a number of weeks in a row. And just getting to take care of personal stuff that I hadn't been and just having that extra little bit of space and time. And it really was wonderful. Now I'm working full five days a week, and my Fridays aren't even investment days, so I don't know what I'm doing over here. But I agree. I really like that idea, and I think it's a wonderful thing. And it's, I don't know, sort of the promise of this whole capitalism adventure we're supposed to go on, increasing productivity. And wasn't this the promise the whole time, everybody, so I am intrigued to see it being explored more, to see it being discussed. And what you're talking about of it's not just good for the employees, but it's also great for the companies. You're getting people that are more engaged on the days that they're working, which feels very true to me. Like, on a great day, I can do some amazing work. On a terrible day, I can do mediocre to bad work. It is totally possible for me to do something that is actively detrimental. Like, I introduce a bug that is going to impact a bunch of customers. And the remediation of that is going to take many more hours. That is totally a realistic thing. I think we often think of productivity in terms of are you at zero or some amount more than zero? But there is definitely another side of that. And so the cost of being not at your best is extremely high in my mind. And so anything we can do to improve that. STEPH: There's a recent study from a non-profit company called Autonomy that published some research called Going Public: Iceland's Journey to a Shorter Working Week. It's very interesting. And a number of people in my social circle have shared it. And that's one of the reasons that I came across it. And they commented in there that one of the reasons...I hope I'm getting this right, but we'll link to it in case I've gotten it a bit wrong. But one of the reasons that Iceland was interested or open to this idea of moving workers to a shorter workweek is because they were struggling with productivity and where people were working a lot of hours, but it still felt like their productivity was dropping. So then Autonomy ran this study to help figure out are there ways to improve productivity? Will shortening a workweek actually lead to higher productivity? And there was a statement in there that I really liked where it talks about the more hours that we work; we're actually lowering our per hour productivity which rings so true for me. Because I am one of those individuals where I'm very stubborn, and so if I'm stuck on something, I will put so many hours into trying to figure it out. But at some point, I have to just walk away, and if I do, I will solve it that much faster. But if I just try to use hours as my way to chip away at a problem, then that's not going to solve it. And my ability to solve that problem takes exponentially more time than if I had just walked away and then come back to the problem fresh and engaged. And some of the case studies I admired the way that they tackled the problem. They would essentially pay the company. So the company could reduce the hours for certain employees so then they could run the experiment. So if they reduced employees to say 32 hours but the company didn't actually want to stop working at 32 hours and they wanted to keep going, so then they brought in other people to work the remaining eight hours. Then as part of that study, they would pay the company to help them stay at their current level of productivity or current level of hours. This way, they could conduct the study. And I thought that was a really neat idea. I do have lots of questions still around the approach itself because it is how do you reduce your to-do list, essentially? So just because you dropped to a four-day workweek. So essentially, you have to just say less stuff gets done. Or, as these case studies promise, they're saying you're actually going to be more productive. So you will still continue to get a lot of your work done. I'm curious about that. I'd like to track my own productivity and see if I feel similarly. And then also, who is this for? Is this for everybody? Does everybody get to move to a four-day workweek? Is this for certain companies? Is it for certain jobs? Ideally, this is for everybody because there are so many health benefits to this, but I'm just intrigued as to who this is for, who it impacts, how can we make it available for everyone? And is the dream real that I can work four days a week and still feel as productive, if not more productive, and healthier, and happier as I do when working five days a week? Mid-roll Ad And now a quick break to hear from today's sponsor, Scout APM. Scout APM is leading-edge application performance monitoring that's designed to help Rails developers quickly find and fix performance issues without having to deal with the headache or overhead of enterprise platform feature bloat. With a developer-centric UI and tracing logic that ties bottlenecks to source code, you can quickly pinpoint and resolve those performance abnormalities like N+1 queries, slow database queries, memory bloat, and much more. Scout's real-time alerting and weekly digest emails let you rest easy knowing Scout's on watch and resolving performance issues before your customers ever see them. Scout has also launched its new error monitoring feature add-on for Python applications. Now you can connect your error reporting and application monitoring data on one platform. See for yourself why developers call Scout their best friend and try our error monitoring and APM free for 14 days; no credit card needed. And as an added-on bonus for Bike Shed listeners, Scout will donate $5 to the open-source project of your choice when you deploy. Learn more at scoutapm.com/bikeshed. That's scoutapm.com/bikeshed. CHRIS: I remember there was an extended period where working remote was this unique benefit that some organizations had. They had adopted that mode. They were async, and remote, and all of these wonderful things. And it became this really interesting selling point for those companies. Now the pandemic obviously pushed public opinion and everything on that in a pretty significant way such that it's a much more common thing. And so, as a result, I think it's less of a differentiator now. It used to be a way to help with recruiting. I wonder if there are organizations that are willing to take this, try it out, see that they are still close to as productive. But if it means that hiring is twice as easy, that is absolutely...especially if it is able to double your ability to hire, that is incredibly valuable or retention similarly. If you can increase retention or if you can make it easier to hire, the value of that is so, so high. And it's interesting in my mind because there's sort of a gold rush on that. That's only true for as long as a four-day workweek is a unique benefit of working at the organization. If this is actually the direction that everything's going and eventually everyone's going to settle to that, then if you wait too long to get there, then you're going to miss all the benefits. You're going to miss that particular benefit of it. And so I do wonder, would it be advantageous to organizations...I'm thinking about this now. Maybe this is the thing I have to do. But would it be advantageous to be that organization as early on as possible and try to get ahead of the curve and use that to hire more easily, retain more easily? Now that I say it all out loud, I'm sold. All right. I got to do this. STEPH: Yeah, I think that's a great comparison of where people are going to start to look for those types of benefits. And so, if you are one of the early adopters and you have the four-day workweek or a reduced workweek in general, then people will gravitate towards that benefit. And it's something that people can use to really help with hiring and retention. And yeah, I love it. You are CTO. So you have influence within your company that you could push for the four-day workweek if you think that's what you want to do. And I would be really intrigued to hear how that goes and how you feel if you...well, you've done it before where you've worked four days a week. So applying that to your current situation, how does that feel? CHRIS: Now you're actually holding me accountable to the things that I randomly said in passing. But it's interesting. So we're so early stage, and there's so much small work to do. There's all…oh, got to set up a website. We've got to do this. We've got to build that integration. There's just kind of scrambling to be done. And so there's a certain version in my mind that maybe we're in a period of time where additional hours are actually useful. There's a cost to them. Let's be clear about that. And so how long that will remain true, I'm not sure. I could see a point perhaps down the road where we achieve a little bit closer to steady-state maybe, who knows? It depends on how fast growth is and et cetera, a lot of other things. So I'm not sure that I would actually lead with this experiment myself, given where the organization is at right now. But I could see an organization that's at a little bit more of a steady-state, that's growing more incrementally, that is trying to think really hard about things like hiring and retention. If those were bigger questions in my mind, then I think I would be considering this more pointedly. But for now, I'm like, I kind of just got to do a bunch of stuff. And so my brain is telling me a different story, but it is interesting. I want to interrogate that and be like, brain, why is that the story you have there, huh? Huh? STEPH: I really appreciate what you're saying, though, because that makes sense to me. I understand when you are in that earlier stage, there's enough to do that that feels correct. Versus that added benefit of having a reduced workweek does benefit or could benefit larger companies who are looking to hire more heavily, or they're also concerned about retention or just helping their people address feelings of burnout. So I really appreciate that perspective because that also rings true. So along this whole conversation around wellness and how we can help people work more sustainable hours, there's a particular book that I've read that I've been really excited to share and chat with you about. It's called Burnout: The Secret to Unlocking the Stress Cycle. It's written by two sisters, Emily and Amelia Nagoski. And they really talk through the impact that stress has on us and then ways to work through that. And specifically, they talk about completing the stress cycle. And I found this incredibly useful for me because I have had weeks where I have just worked hard Monday through Friday. I've gotten to the end of my day Friday, and I'm like, great, I'm done. I've made it. I can just relax. And I walk away from work, and I can't relax. And I'm just like, I feel sick. I feel not good. Like, I thought I would walk away from work, and I would just suddenly feel this halo of relaxation, and everything would be wonderful. But instead, I just feel a bit ill, and I've never understood that until I was reading their book about completing the stress cycle. Have you ever had moments like that? CHRIS: It has definitely happened to me at various points, yes. STEPH: That makes me feel better because I haven't really chatted about this with someone. So until I read this book and I was like, oh, maybe this is a thing, and it's not just me, and this is something that people are experiencing. So to speak more about completing the stress cycle, they really highlight that stress and feelings, capital F feelings, can cause physiological symptoms. And so it's not just something that we are mentally processing, but we are physically processing the stress that we feel. And there's a really big difference between stressors and stress. So a stressor could be something like an unmeetable deadline. It could be family. It could be money concerns. It could be your morning commute, anything that increases your stress level. And during that, there's a very physical process that happens to your body anytime there's a perceived threat. And it's really helpful to us because it's frankly what triggers our fight, flight, or freeze response. And our bodies receive a rush of adrenaline and cortisol, which essentially, if we're using that flight response, that's going to help us run. And a number of the processes in our system will essentially go into a state of hibernation because everything in our body is very focused on helping us run or do the thing that we think is going to save our life in that moment. The problem is our body doesn't know the difference between what's more of a mental threat versus what is a truly physical threat. So this is the difference between your stress and your stressors. So in more of a physical threat, if there's a lion that you are running from, that is the stressor, but then the stress is everything that you still feel after you have run from that lion. So you encounter a lion, you run. You make it back to your group of people where you are safe, and you celebrate, and you dance, and you hug. And that is completing the stress cycle because you are essentially processing all of that stress. And you are telling your body in a body-focused language that I am safe now, and everything is fine. So you can move back, and anything that was in a hibernation state, all of that dump of adrenaline and cortisol can be worked out of your system, and everything can go back to a normal state. Most of us aren't encountering lions, but we do encounter jerks in meetings or really stressful commutes. And whenever we have survived that meeting, or we've gotten through our commute to the other side, we don't have that moment of celebration where we really let our body know that hey, we've made it through that moment of stress, and we are away from that stressor, and we can actually process everything. So if you're interested in this, the book's really great. It talks about ways that you can process that stress and how important it is to do so. Otherwise, it will literally build up in your system, and it can make you sick. And it will manifest in ways that will let us know that we haven't dealt with that stress. And one of the top methods that they recommend is exercise and movement. That's a really great way to let your body know that you are no longer in an unsafe state, and your body can start to relax. There's also a lot of other great ways. Art is a really big one. It could be hugging someone. It could be calling someone that you love. There are a number of ways that you can process it. But I hadn't recognized how important it is that once you have removed yourself from a stressor, that doesn't necessarily just mean you're done, and you can relax. You actually have to go through that physical process, and then you can relax. So I started incorporating that more into my day that when I'm done with work, I always find something to do, and it's typically to go for a walk, or it's go for a run. And I have found that now I really haven't felt that ill-feeling where I'm trying to relax, but I just feel sick. Saying that out loud, I feel like I'm a mess on Fridays. [chuckles] CHRIS: I feel like you're human. It was interesting when you asked the question at the beginning. You were like, "Is this a thing that other people experience?" And my answer was certainly, yes; I have experienced this. I think there's something about me that I think is useful where I don't think I'm special at all on any axis whatsoever. And so whenever there's something that's going on, I'm like, I assume that this is just normal human behavior, which is useful because most of the time it is. And this is the sort of thing where if I'm having a negative experience, I will look to the external world to be like, I'm sure other people have experienced this, and let me pull that in. And I've found that really useful for myself to just be like, I'm not special. There's nothing particularly special about me. So let me go look from the entirety of the internet where people have almost certainly talked about this. And I've not read the book that you're describing here, but it does sound like it does a great job of describing this. There is a blog post that I found that has stayed in the back of my mind and informed a little bit of my day-to-day approach to this sort of thing which is a blog post by Cal Newport, who I think at this point we've mentioned him a handful of times on the show. But the title of the post is Drastically Reduce Stress with a Work Shutdown Ritual. And it's this very interesting little post where he talks about at the end of your day; you want to close the book on it. I think this is especially pointed now that many of us are working from home. For me, this is a new thing. And so, I've been very intentional with trying to put walks at the beginning and end of my day. But in this particular blog post, he describes a routine that he does where he tidies things up and makes his list for the next day. And then he has a particular phrase that he says, which is "schedule shut down, complete." And it's a sort of nonsense phrase. It doesn't even quite make sense grammatically, but it's his phrase that he internalized, and somehow this became his almost mantra for the end of the day. And now when he does it, that's like his all right, okay, turned off the brain, and now I can walk away. I know that I've said the phrase, and I only say the phrase when I have properly set things up. And so it's this weird structure that he's built in his mind. But it totally works to quiet those voices that are like, yeah, but what about…Do we think about…Do we complete…And he's got now this magic phrase that he can say. And so I've really loved that. For myself, I haven't gotten quite to that level, but I've definitely built the here's how I wind down at the end of the day. Here's what I do with lists and what I do so that I can ideally walk away comfortably. Again, this is one of those situations where I sound like I know what I'm doing or have my act together. This is aspirational me. Day-to-day me is a hot mess like everybody else. [laughs] And this is just what I...when I do this, I feel better. Most of the time, I don't do this because I forget it, or because I'm busy, or because I'm stressed, [chuckles], and so I don't do the thing that reduces stress, you know, human stuff. But I really enjoyed that post. STEPH: I haven't heard that one. I like a lot of Cal Newport's work, but I haven't read that particular blog post. Yeah, I think the idea of completing the stress cycle has helped me tremendously because by giving it a name like completing the stress cycle has been really helpful for me because working out is important to me. It's something that I enjoy, but it's also one of those things that's easy to get bumped. It is part of my wellness routine. And so, if I'm really busy, then I will bump it from the list. And then it's something that then doesn't get addressed. But recognizing that this is also important to my productivity, not to just this general idea of wellness, has really helped me recenter how important this is and to make sure that I recognize hey, it's been a stressful day. I need to get up and move. That is a very important part of my day. It is not just part of an exercise routine, but this is something that I need to do to close out my day to then make sure I have a great day tomorrow. So bringing it back, it's been a week that's been filled with a lot of discussions around burnout and then ways that we can measure it and then also address it. And I've really enjoyed reading this book. So I'll be sure to drop a link in the show notes. On that note, shall we wrap up? CHRIS: Schedule shut down, complete. The show notes for this episode can be found at bikeshed.fm. STEPH: This show is produced and edited by Mandy Moore. CHRIS: If you enjoyed listening, one really easy way to support the show is to leave us a quick rating or even a review in iTunes, as it really helps other folks find the show. STEPH: If you have any feedback for this or any of our other episodes, you can reach us at @_bikeshed or reach me on Twitter @SViccari. CHRIS: And I'm @christoomey STEPH: Or you can reach us at hosts@bikeshed.fm via email. CHRIS: Thanks so much for listening to The Bike Shed, and we'll see you next week. All: Byeeeeeeeeeee!!! Announcer: This podcast was brought to you by thoughtbot. thoughtbot is your expert design and development partner. Let's make your product and team a success.

Jealous Podcast
Jealous Podcast | Alisa Woods

Jealous Podcast

Play Episode Listen Later Sep 27, 2021 44:37


In this week's episode of Jealous podcast, we are joined by a gal who has mastered the art of creating the perfect macaron, Alisa Woods! Alisa, Leigha and Mackenzie discuss how Alisa started her business, Sift n Sprinkle, while home with two small children at the beginning of the pandemic and her continued success. She also talks about how her grandmother inspired her to enter her first Iowa State Fair contest and just how creative her entire family is!Also, keep your ears peeled for the gals' new podcast: Mandy Moore's Triplets (we might be kidding).Thank you for joining us, Alisa, and thank you for the macarons!Be sure to rate, review and subscribe to Jealous Podcast and watch more episodes here: itsbingbang.com/podcast

Greater Than Code
251: Diplomatic Accessibility Advocacy with Todd Libby

Greater Than Code

Play Episode Listen Later Sep 22, 2021 46:41


01:09 - Todd's Superpower: Advocacy For Accessibility * Getting Started * Designing With Web Standards by Jeffrey Zeldman (https://www.amazon.com/Designing-Web-Standards-Jeffrey-Zeldman/dp/0321616952) * The A11Y Project (https://www.a11yproject.com/) * W3C (https://www.w3.org/) 06:18 - Joining The W3C * The W3C Community Page (https://www.w3.org/community/) 07:44 - Getting People/Companies/Stakeholders to Care/Prioritize About Accessibility * Making A Strong Case For Accessibility by Todd Libby (https://www.smashingmagazine.com/2021/07/strong-case-for-accessibility/) * Diplomatic Advocacy * You Don't Want To Get Sued! / $$$ * “We are all temporarily abled.” 15:20 - The Domino's Pizza Story * Supreme Court hands victory to blind man who sued Domino's over site accessibility (https://www.cnbc.com/2019/10/07/dominos-supreme-court.html) 18:21 - Things That Typically Aren't Accessible And Should Be * The WebAIM Million Report (https://webaim.org/projects/million/) * WCAG (https://www.w3.org/WAI/standards-guidelines/wcag/) * Color Contrast * Missing Alt Text on Images * Form Input Labels * What's New in WCAG 2.1: Label in Name by Todd Libby (https://css-tricks.com/whats-new-in-wcag-2-1-label-in-name/) * Empty Links * Not Using Document Language * Triggering GIFS / Flashing Content * Empty Buttons – Use a Button Element!! * Tab Order * Semantic HTML, Heading Structure 26:27 - Accessibility for Mobile Devices * Target Size * Looking at WCAG 2.5.5 for Better Target Sizes (https://css-tricks.com/looking-at-wcag-2-5-5-for-better-target-sizes/) * Dragging Movements 28:08 - Color Contrast * Contrast Ratio (https://contrast-ratio.com/) 33:02 - Designing w/ Accessibility in Mind From the Very Beginning * Accessibility Advocates on Every Team * Accessibility Training 36:22 - Contrast (Cont'd) 38:11 - Automating Accessibility! * axe-core-gems (https://github.com/dequelabs/axe-core-gems) Reflections: Mae: Eyeballing for contrast. John: We are all only temporarily abled and getting the ball rolling on building accessibility in from the beginning of projects going forward and fixing older codebases. Mandy: Using alt-tags going forward on all social media posts. Todd: Accessibility work will never end. Accessibility is a right not a privilege. This episode was brought to you by @therubyrep (https://twitter.com/therubyrep) of DevReps, LLC (http://www.devreps.com/). To pledge your support and to join our awesome Slack community, visit patreon.com/greaterthancode (https://www.patreon.com/greaterthancode) To make a one-time donation so that we can continue to bring you more content and transcripts like this, please do so at paypal.me/devreps (https://www.paypal.me/devreps). You will also get an invitation to our Slack community this way as well. Transcript: JOHN: Welcome to Greater Than Code, Episode 251. I'm John Sawers and I'm here with Mae Beale. MAE: Hi, there! And also, Mandy Moore. MANDY: Hi, everyone! I'm Mandy Moore and I'm here today with our guest, Todd Libby. Todd Libby is a professional web developer, designer, and accessibility advocate for 22 years under many different technologies starting with HTML/CSS, Perl, and PHP. Todd has been an avid learner of web technologies for over 40 years starting with many flavors of BASIC all the way to React/Vue. Currently an Accessibility Analyst at Knowbility, Todd is also a member of the W3C. When not coding, you'll usually find Todd tweeting about lobster rolls and accessibility. So before I ask you what your superpower is, I'm going to make a bet and my bet is that I'm 80% positive that your superpower has something to do with lobster rolls. Am I right? [laughter] Am I right? TODD: Well, 80% of the time, you'd be right. I just recently moved to Phoenix, Arizona. So I was actually going to say advocacy for accessibility, but yes, lobster rolls and the consumption of lobster rolls are a big part. MAE: I love it. That's fantastic. MANDY: Okay. Well, tell me about the advocacy. [chuckles] TODD: So it started with seeing family members who are disabled, friends who are disabled, or have family members themselves who are disabled, and the struggles they have with trying to access websites, or web apps on the web and the frustration, the look of like they're about ready to give up. That's when I knew that I would try to not only make my stuff that I made accessible, but to advocate for people in accessibility. MAE: Thank you so much for your work. It is critical. I have personally worked with a number of different populations and started at a camp for children with critical illnesses and currently work at an organization that offers financial services for people with disabilities – well, complex financial needs, which the three target populations that we work with are people with disabilities, people with dementia, and people in recovery. So really excited to talk with you today. Thanks. TODD: You're welcome. JOHN: When you started that journey, did you already have familiarity with accessibility, or was it all just like, “Oh, I get to learn all this stuff so I can start making it better”? TODD: So I fell into it because if you're like me and you started with making table-based layouts way back in the day, because what we had—Mosaic browser, Netscape Navigator, and Internet Explorer—we were making table-based layouts, which were completely inaccessible, but I didn't know that. As the web progressed, I progressed and then I bought a little orange book by Jeffrey Zeldman, Designing with Web Standards, and that pretty much started me on my journey—semantic HTML, progressive enhancement in web standards, and accessibility as well. I tend to stumble into a lot of stuff [laughs] so, and that's a habit of mine. [laughs] MAE: It sounds like it's a good habit and you're using it to help all the other people. So I hate to encourage you to keep stumbling, but by all means. [laughter] Love it. If you were to advise someone wanting to know more about accessibility, would you suggest they start with that same book too, or what would you suggest to someone stumbling around in the dark and not hitting anything yet? TODD: The book is a little outdated. I think the last edition of his book was, I want to say 2018, maybe even further back than that. I would suggest people go on websites like The A11Y project, the a11yproject.com. They have a comprehensive list of resources, links to learning there. Twitter is a good place to learn, to follow people in the accessibility space. The other thing that, if people really want to dive in, is to join The W3C. That's a great place and there's a lot of different groups. You have the CSS Working Group, you have the accessibility side of things, which I'm a part of, the Silver Community Group, which is we're working on the Web Content Accessibility Guidelines 3.0, which is still a little ways down the road, but a lot of great people and a lot of different companies. Some of those companies we've heard of—Google, Apple, companies like that all the way down to individuals. Individuals can join as individuals if your company isn't a member of the W3C. So those are the three things that I mainly point to people. If you don't really want to dive into the W3C side of things, there's a lot of resources on the a11yproject.com website that you can look up. MANDY: So what does being a member entail? What do you have to do? Do you have to pay dues? Do you have to do certain projects, maybe start as an individual level, because I'm sure we have mostly individuals listening to the show. Me as a newbie coder, what would I do to get started as a member of this initiative? TODD: Well, I started out as an individual myself, so I joined and I can get you the link to The W3C Community Page. Go to sign up as an individual and someone will approve the form process that you go through—it's nothing too big, it's nothing complicated—and then that will start you on your way. You can join a sub group, you can join a group, a working group, and it doesn't cost an individual. Companies do pay dues to the W3C and if your company is in the W3C, you get ahold of your company's liaison and there's a process they go through to add you to a certain group. Because with me, it was adding me to The Silver Community Group. But as an individual, you can join in, you can hop right into a meeting from there, and then that's basically it. That's how you start. JOHN: What are the challenges you see in getting not only the goals of a W3C, but I'm assuming specifically around accessibility? TODD: Some of the things that I've seen is buy-in from stakeholders is probably the number one hurdle, or barrier. Companies, stakeholders, and board members, they don't think of, or in some cases, they don't care about accessibility until a company is getting sued and that's a shame. That's one of the things that I wrote about; I have an article on Smashing Magazine. Making A Strong Case for Accessibility, it's called and that is one of few things that I've come across. Getting buy-in from stakeholders and getting buy-in from colleagues as well because you have people that they don't think about accessibility, they think about a number of different things. Mostly what I've come across is they don't think about accessibility because there's no budget, or they don't have the time, or the company doesn't have the time. It's not approved by the company. The other thing that is right up there is it's a process—accessibility—making things accessible and most people think that it's a big this huge mountain to climb. If you incorporate accessibility from the beginning of your project, it's so much easier. You don't have to go back and you don't have to climb that mountain because you've waited until the very end. “Oh, we have time now so we'll do the accessibility stuff,” that makes it more hard. MAE: John, your question actually was similar to something I was thinking about with how you developed this superpower and I was going to ask and still will now. [chuckles] How did you afford all the time in the different places where you were overtime to be able to get this focus? And so, how did you make the case along the way and what things did you learn in that persuasion class of life [chuckles] that was able to allow you to have that be where you could focus and spend more time on and have the places where you work prioritize successful? TODD: It was a lot of, I call it diplomatic advocacy. So for instance, the best example I have is I had been hired to make a website, a public facing website, and a SAAS application accessible. The stakeholder I was directly reporting to, we were sitting down in a meeting one day and I said, “Well, I want to make sure that accessibility is the number one priority on these projects,” and he shot back with, “Well, we don't have the disabled users,” and that nearly knocked me back to my chair. [laughs] So that was a surprise. MAE: There's some groaning inside and I had to [chuckles] do it out loud for a moment. Ooh. TODD: Yeah, I did my internal groaning at the meeting so that just was – [chuckles] Yeah, and I remember that day very vividly and I probably will for the rest of my life that I looked at him and I had to stop and think, and I said, “Well, you never know, there's always a chance that you're able, now you could be disabled at any time.” I also pointed out that his eyeglasses that he wore are an assistive technology. So there was some light shed on that and that propelled me even further into advocacy and the accessibility side of things. That meeting really opened my eyes to not everyone is going to get it, not everyone is going to be on board, not everyone is going to think about disabled users; they really aren't. So from there I used that example. I also use what I call the Domino's Pizza card lately because “Oh, you don't want to get sued.' That's my last resort as far as advocacy goes. Other than that, it's showing a videotape of people using their product that are disabled and they can't use it. That's a huge difference maker, when a stakeholder sees that somebody can't use their product. There's numbers out there now that disabled users in this country alone, the United States, make up 25% of the population, I believe. They have a disposable income of $8 trillion. The visually disabled population alone is, I believe it was $1.6 billion, I think. I would have to check that number again, but it's a big number. So the money side of things really gets through to a stakeholder faster than “Well, your eyeglasses are a assistive technology.” So once they hear the financial side of things, their ears perk up real quick and then they maybe get on board. I've never had other than one stakeholder just saying, “No, we're just going to skip that,” and then that company ended up getting sued. So that says a lot, to me anyways. But that's how I really get into it. And then there was a time where I was working for another company. I was doing consulting for them and I was doing frontend mostly. So it was accessibility, but also at the same time, it was more the code side of things. That was in 2018. 2019, I went to a conference in Burlington, Vermont. I saw a friend of mine speaking and he was very passionate about it and that talk, and there was a couple others there as well, it lit that fire under me again, and I jumped right back in and ever since then, it's just then accessibility. MAE: You reminded me one of the arguments, or what did you say? Diplomatic advocacy statements that I have used is that we are all temporarily abled. [chuckles] Like, that's just how it is and seeing things that way we can really shift how you orient to the idea of as other and reduce the othering. But I was also wondering how long it would be before Pizza Hut came up in our combo. [laughter] MANDY: Yeah, I haven't heard of that. Can you tell us what that is? TODD: [chuckles] So it was Domino's and they had a blind user that tried to use their app. He couldn't use their app; their app wasn't accessible. He tried to use the website; the website wasn't accessible. I have a link that I can send over to the whole story because I'm probably getting bits and pieces wrong. But from what I can recall, basically, this user sued Domino's and instead of Domino's spending, I believe it was $36,000 to fix their website and their app, they decided to drag it out for a number of years through court and of course, spent more money than just $36,000. In the end, they lost. I think they tried to appeal to the Supreme Court because they've gone up as high as federal court, but regardless, they lost. They had to – and I don't know if they still have an inaccessible site, or not, or the app for that matter because I don't go to Domino's. But that's basically the story that they had; a user who tried to access the app and the website, couldn't use it, and they got taken to court. Now Domino's claimed, in the court case, that he could have used the telephone, but he had tried to use the telephone twice and was on hold for 45 minutes. So [laughs] that says a lot. JOHN: Looks like it actually did go to the Supreme Court. TODD: Yeah. Correct me if I'm wrong, I think they did not want to hear it. They just said, “No, we're not going to hear the case.” Yeah, and just think about all these apps we use and all the people that can't access those apps, or the websites. I went to some company websites because I was doing some research, big companies, and a lot of them are inaccessible. A little number that I can throw out there: every year, there's been a little over 2,500 lawsuits in the US. This year, if the rate keeps on going that it has, we're on course for over 4,000 lawsuits in the US alone for inaccessible websites. You've had companies like Target, Bank of America, Winn-Dixie, those kinds of companies have been sued by people because of inaccessible sites. MAE: Okay, but may I say this one thing, which is, I just want to extend my apologies to Pizza Hut. [laughter] MANDY: What kinds of things do you see as not being accessible that should be or easily could be that companies just simply aren't doing? TODD: The big one, still and if you go to webaim.org/projects/million, it's The WebAIM Million report. It's an annual accessibility analysis of the top 1 million home pages on the internet. The number one thing again, this year is color contracts. There are guidelines in place. WCAG, which is the Web Content Accessibility Guidelines, that text should be a 4.5:1 ratio that reaches the minimum contrast for texts. It's a lot of texts out there that doesn't even reach that. So it's color contrast. You'll find a lot of, if you look at—I'm looking at the chart right now—missing alt texts on images. If you have an image that is informative, or you have an image that is conveying something to a user, it has to have alternative text describing what's in the picture. You don't have to go into a long story about what's in the picture and describe it thoroughly; you can just give a quick overview as to what the picture is trying to convey, what is in the picture. And then another one being another failure type a is form input labels; labels that are not labeled correctly. I wrote a article about that [chuckles] on CSS-Tricks and that is, there's programmatic and there's accessible names for form labels that not only help the accessibility side of it, as far as making the site accessible, but also it helps screen reader users read forms and navigate through forms, keyboard users also. Then you have empty links and then a big one that I've seen lately is if you look up in the source code, you see the HTML tag, and the language attribute, a lot of sites now, because they use trademarks, they don't have a document language. I ran across a lot of sites that don't use a document language. They're using a framework. I won't name names because I'm not out to shame, but having that attribute helps screen reader users and I think that's a big thing. A lot of accessibility, people don't understand. People use screen readers, or other assistive technologies, for instance, Dragon NaturallySpeaking voice input. But at the same time, I've got to also add accessibility is more than just deaf, or blind. I suffer from migraines, migraine headaches so animation, or motion from say, parallax scrolling can trigger a migraine. Animations that are too fast, that also trigger migraine headache. You have flashing content that can potentially cause seizures and that's actually happened before where an animated GIF was intentionally sent to someone and it caused a seizure and almost killed the person. So there's those and then the last thing on this list that I'm looking at right now, and these are common failures, empty buttons. You have buttons that don't have labels. Buttons that have Click here. Buttons need to be descriptive. So you want to have – on my site to send me something on the contact form, it's Send this info to Todd, Click here, or something similar like that. MAE: Can you think of any, John that you know of, too? I've got a couple of mind. How about you, Mandy? MANDY: For me, because I'm just starting out, I don't know a whole lot about accessibility. That's why I'm here; I'm trying to learn. But I am really conscious and careful of some of the GIFs that I use, because I do know that some of the motion ones, especially really fast-moving ones, can cause problems, migraines, seizures for people. So when posting those, I'm really, really mindful about it. JOHN: Yeah, the Click here one is always bothers me too, because not only is it bad accessibility, it's bad UX. Like HTML loves you to turn anything into a link so you can make all the words inside the button and it's just fine. [laughs] There's so many other ways to do it that are just – even discounting the accessibility impact, which I don't want it. TODD: Yeah, and touching upon that, I'm glad you brought up the button because I was just going to let that go [chuckles] past me. I have to say and I think it was in the email where it said, “What's bothering you?” What bothers me is people that don't use the button. If you are using a div, or an anchor tag, or a span, stop it. [laughs] Just stop it. There's a button element for that. I read somewhere that anchor tag takes you somewhere, a div is a container, but button is for a button. MAE: I love that. The only other ones I could think of is related to something you said, making sure to have tab order set up properly to allow people to navigate. Again, I liked your point about you don't have to be fully blind to benefit from these things and having keyboard accessibility can benefit a lot of people for all kinds of reasons. The other one is, and I would love to hear everybody's thoughts on this one, I have heard that we're supposed to be using h1, h2, h3 and having proper setup of our HTML and most of us fail just in that basic part. That's another way of supporting people to be able to navigate around and figure out what's about to be on this page and how much should I dig into it? So more on non-visual navigation stuff. TODD: Yeah, heading structure is hugely important for keyboard users and screen reader users as well as tab order and that's where semantic HTML comes into play. If you're running semantic HTML, HTML by default, save for a few caveats, is accessible right out of the box. If your site and somebody can navigate through using let's say, the keyboard turns and they can navigate in a way that is structurally logical, for instance and it has a flow to it that makes sense, then they're going to be able to not only navigate that site, but if you're selling something on that site, you're going to have somebody buying something probably. So that's again, where tab order and heading structure comes into play and it's very important. JOHN: I would assume, and correct me if I'm wrong, or if you know this, that the same sort of accessibility enhancements are available in native mobile applications that aren't using each HTML, is that correct? TODD: Having not delved into the mobile side of things with apps myself, that I really can't answer. I can say, though, that the WCAG guidelines, that does pertain to mobile as well as desktop. There's no certain set of rules. 2.2 is where there are some new features that from mobile, for instance, target size and again, I wrote another article on CSS-Tricks about target size as well. So it's if you ever noticed those little ads that you just want to click off and get off your phone and they have those little tiny Xs and you're sitting there tapping all day? Those are the things target size and dragging movements as well. I did an audit for an app and there was a lot of buttons that were not named. A lot of the accessibility issues I ran into were the same as I would run into doing an audit on a website. I don't know anything about Swift, or Flutter, or anything like that, they pretty much fall into the same category with [inaudible] as far as accessible. JOHN: I also wanted to circle back on the first item that you listed as far as the WebAIM million thing was color contrast, which is one of those ones where a designer comes up with something that looks super cool and sleek, but it's dark gray on a light gray background. It looks great when you've got perfect eyesight, but anybody else, they're just like, “Oh my God, what's that?” That's also one of the things that's probably easiest to change site-wide; it's like you go in and you tweak the CSS and you're done in a half hour and you've got the whole site updated. So it's a great bit of low-hanging fruit that you can attach if you want to start on this process. TODD: Yeah. Color contrast is of course, as the report says, this is the number one thing and let me look back here. It's slowly, the numbers are dropping, but 85.3%, that's still a very high number of failures and there's larger text. If you're using anything over 18 pixels, or the equivalent of 18—it's either 18 points, or 18 pixels—is a 3:1 ratio. With that color contrast is how our brains perceive color. It's not the actual contrast of that color and there are people far more qualified than me going to that, or that can go into that. So what I'll say is I've seen a lot of teams and companies, “Yeah, we'll do a little over 4.5:1 and we'll call it a day.” But I always say, if you can do 7:1, or even 10:1 on your ratios and you can find a way to make your brand, or whatever the same, then go for it. A lot of the time you hear, “Well, we don't want to change the colors of our brand.” Well, your colors of your brand aren't accessible to somebody who that has, for instance, Tritanopia, which is, I think it's blues and greens are very hard to see, or they don't see it at all. Color deficiencies are a thing that design teams aren't going to check for. They're just not. Like you said, all these colors look awesome so let's just, we're going to go with that on our UI. That's one thing that I actually ran into on that SAAS product that I spoke about earlier was there was these colors and these colors were a dark blue, very muted dark blue with orange text. You would think the contrast would be oh yeah, they would be all right, but it was horrible. JOHN: You can get browser plugins, that'll show you what the page looks like. So you can check these things yourself. Like you can go in and say, “Oh, you're right. That's completely illegible.” TODD: Yeah. Firefox, like I have right here on my work machine. I have right here Firefox and it does this. There's a simulator for a visual color deficiencies. It also checks for contrast as well. Chrome has one, which it actually has a very cool eyedropper to check for color contrast. If you use the inspector also in Firefox, that brings up a little contrast thing. The WAVE extension has a contrast tool. There's also a lot of different apps. If you have a Mac, like I do, I have too many color contrast because I love checking out these color contrast apps. So I have about five different color contrast apps on my Mac, but there's also websites, too that you can use at the same time. Just do a search for polar contrast. Contrast Ratio, contrast-ratio.com, is from Lea Verou. I use that one a lot. A lot of people use that one. There's so many of them out there choose from, but they are very handy tool at designer's disposal and at developers' disposal as well. JOHN: So I'm trying to think of, like I was saying earlier, the color contrast one is one of those things that's probably very straightforward; you can upgrade your whole site in a short amount of time. Color contrast is a little trickier because it gets into branding and marketing's going to want to care about it and all that kind of stuff. So you might have a bit more battle around that, but it could probably be done and you might be able to fix, at least the worst parts of the page that have problems around that. So I'm just trying to think of the ways that you could get the ball rolling on this kind of a work. Like if you can get those early easy wins, it's going to get more people on board with the process and not saying like, “Oh, it's going to take us eight months and we have to go through every single page and change it every forum.” That sounds really daunting when you think about it and so, trying to imagine what those easy early wins are that can get people down that road. TODD: Yeah. Starting from the very outset of the project is probably the key one: incorporating accessibility from the start of the project. Like I said earlier, it's a lot easier when you do it from the start rather than waiting till the very end, or even after the product has been launched and you go back and go, “Oh, well, now we need to fix it.” You're not only putting stress on your teams, but it's eating up time and money because you're now paying everybody to go back and look at all these accessibility issues there. Having one person as a dedicated accessibility advocate on each team helps immensely. So you have one person on the development team, one person on the dev side, one person on the marketing team, starting from the top. If somebody goes there to a stakeholder and says, “Listen, we need to start incorporating accessibility from the very start, here's why,” Nine times out of ten, I can guarantee you, you're probably going to get that stakeholder onboard. That tenth time, you'll have to go as far as maybe I did and say, “Well, Domino's Pizza, or Bank of America, or Target.” Again, their ears are going to perk up and they're going to go, “Oh, well, I don't really, we don't want to get sued.” So that, and going back to having one person on each team: training. There are so many resources out there for accessibility training. There are companies out there that train, there are companies that you can bring in to the organization that will train, that'll help train. That's so easier than what are we going to do? A lot of people just sitting there in a room and go, “How are you going to do this?” Having that person in each department getting together with everybody else, that's that advocate for each department, meeting up and saying, “Okay, we're going to coordinate. You're going to put out a fantastic product that's going to be accessible and also, at the same time, the financial aspect is going to make the company money. But most of all, it's going to include a lot of people that are normally not included if you're putting out an accessible product.” Because if you go to a certain website, I can guarantee you it's going to be inaccessible—just about 99% of the web isn't accessible—and it's going to be exclusive as it's going to – somebody is going to get shut out of the site, or app. So this falls on the applications as well. Another thing too, I just wanted to throw in here for color contrast. There are different – you have color contrast text, but you also have non-text contrast, you have texts in images, that kind of contrast as well and it does get a little confusing. Let's face it, the guidelines right now, it's a very technically written – it's like a technical manual. A lot of people come up to me and said, “I can't read this. I can't make sense of this. Can you translate this?” So hopefully, and this is part of the work that I'm doing with a lot of other people in the W3C is where making the language of 3.0 in plain language, basically. It's going to be a lot easier to understand these guidelines instead of all that technical jargon. I look at something right now and I'm scratching my head when I'm doing an audit going, “Okay, what do they mean by this?” All these people come together and we agree on what to write. What is the language that's going to go into this? So when they got together 2.0, which was years and years ago, they said, “Okay, this is going to be how we're going to write this and we're going to publish this,” and then we had a lot of people just like me scratching their heads of not understanding it. So hopefully, and I'm pretty sure, 99.9% sure that it's going to be a lot easier for people to understand. MAE: That sounds awesome. And if you end up needing a bunch of play testers, I bet a lot of our listeners would be totally willing to put in some time. I know I would. Just want to put in one last plug for anybody out there who really loves automating things and is trying to avoid relying on any single developer, or designer, or QA person to remember to check for accessibility is to build it into your CI/CD pipeline. There are a lot of different options. Another approach to couple with that, or do independently is to use the axe core gems, and that link will be in the show notes, where it'll allow you to be able to sprinkle in your tests, accessibility checks on different pieces. So if we've decided we're going to handle color contrast, cool, then it'll check that. But if we're not ready to deal with another point of accessibility, then we can skip it. So it's very similar to Robocop. Anyway, just wanted to offer in some other tips and tricks of the trade to be able to get going on accessibility and then once you get that train rolling, it can do a little better, but it is hard to start from scratch. JOHN: That's a great tip, Mae. Thank you. TODD: Yeah, definitely. MANDY: Okay. Well, with that, I think it's about time we head into reflections; the point of the show, where we talk about something that we thought stood out, that we want to think about more, or a place that we can call for a call of action to our listeners, or even to ourselves. Who wants to go first? MAE: I can go first. I learned something awesome from you, Todd, which I have not thought of before, which is if I am eyeballing for “contrast,” especially color contrast, that's not necessarily what that means. I really appreciate learning that and we'll definitely be applying that in my daily life. [chuckles] So thanks for teaching me a whole bunch of things, including that. TODD: You're welcome. JOHN: I think for me, it's just the continuing reminder to – I do like the thinking that, I think Mae have brought up and also Todd was talking about earlier at the beginning about how we're all of us temporarily not disabled and that I think it helps bring some of that empathy a little closer to us. So it makes it a little more accessible to us to realize that it's going to happen to us at some point, at some level, and to help then bring that empathy to the other people who are currently in that state and really that's, I think is a useful way of thinking about it. Also, the idea that I've been thinking through as we've been talking about this is how do we get the ball rolling on this? We have an existing application that's 10 years old that's going to take a lot to get it there, but how do we get the process started so we feel like we're making progress there rather than just saying, “Oh, we did HTML form 27 out of 163. All right, back at it tomorrow.” It's hard to think about, so feeling like there's progress is a good thing. TODD: Yeah, definitely and as we get older, our eyes, they're one of the first things to go. So I'm going to need assistive technology at some point so, yeah. And then what you touched upon, John. It may be daunting having to go back and do the whole, “Okay, what are we going to do for accessibility now that this project, it's 10 years old, 15 years old?” The SAAS project that I was talking about, it was 15-year-old code, .net. I got people together; one from each department. We all got together and we ended up making that product accessible for them. So it can be done. [laughs] It can be done. JOHN: That's actually a good point. Just hearing about successes in the wild with particularly hard projects is a great thing. Because again, I'm thinking about it at the start of our project and hearing that somebody made it all through and maybe even repeatedly is hard. TODD: Yeah. It's not something that once it's done, it's done. Accessibility, just like the web, is an ever-evolving media. MANDY: For me. I think my reflection is going to be, as a new coder, I do want to say, I'm glad that we talked about a lot of the things that you see that aren't currently accessible that can be accessible. One of those things is using alt tags and right now, I know when I put the social media posts out on Twitter, I don't use the alt tags and I should. So just putting an alt tag saying, “This is a picture of our guest, Todd” and the title of the show would probably be helpful for some of our listeners. So I'm going to start doing that. So thank you. TODD: You're welcome. I'm just reminded of our talk and every talk that I have on a podcast, or with anybody just reminds me of the work that I have to do and the work that is being done by a lot of different people, other than myself as well, as far as advocacy goes in that I don't think it's ever going to be a job that will ever go away. There will always be a need for accessibility advocacy for the web and it's great just to be able to sit down and talk to people about accessibility and what we need to do to make the web better and more inclusive for everybody. Because I tweet out a lot, “Accessibility is a right, not a privilege,” and I really feel that to my core because the UN specifically says that the internet is a basic human and I went as far as to go say, “Well, so as an accessibility of that internet as well.” So that is my reflection. MAE: I'll add an alt tag for me right now is with a fist up and a big smile and a lot of enthusiasm in my heart. MANDY: Awesome. Well, thank you so much for coming on the show, Todd. It's been really great talking with you and I really appreciate you coming on the show to share with us your knowledge and your expertise on the subject of accessibility. So with that, I will close out the show and say we do have a Slack and Todd will be invited to it if he'd like to talk more to us and the rest of the Greater Than Code community. You can visit patreon.com/greaterthancode and pledge to support us monthly and again, if you cannot afford that, or do not want to pledge to help run the show, you can DM anyone of us and we will get you in there for free because we want to make the Slack channel accessible for all. Have a great week and we'll see you next time. Goodbye! Special Guest: Todd Libby.

The Bike Shed
309: Naming the Change

The Bike Shed

Play Episode Listen Later Sep 21, 2021 35:28


Steph talks about a new GitHub feature and Twitter account (@RubyCards (https://twitter.com/RubyCards)) she's really excited about and Chris talks about his new job as a CTO of a startup and shifting away from writing code regularly. GitHub (https://docs.github.com/en/codespaces/developing-in-codespaces/web-based-editor) RubyCards (https://twitter.com/RubyCards) Resilient Management (https://resilient-management.com/) The Manager's Path (https://www.amazon.com/Managers-Path-Leaders-Navigating-Growth/dp/1491973897) Transcript: CHRIS: Oh God, my computer is so stupid slow. I need a new computer. STEPH: Come on, little computer, you can do it. You know you could just buy a new one. You don't have to wait for the fancy-schmancy M1. CHRIS: I want to wait for the fancy. I want it so bad. STEPH: [laughs] CHRIS: Do you know how long I've had this computer? And if I can hold out one more month, I want the fancy stuff. I've waited this long. Why would I give in now when I'm right on the cusp of victory? STEPH: One more month. I'm going to send you...as a kid, did you ever make those construction… CHRIS: Oh yeah. STEPH: They look like chain links bow construction paper. So we would make those for a countdown to special days. I'm going to send you one that's all crumpled and folded in the mail. It would be delightful. And you'll be able to snip off a little chain each day as your countdown to your new fancy-schmancy. [laughs] CHRIS: I love it. Hello and welcome to another episode of The Bike Shed, a weekly podcast from your friends at thoughtbot about developing great software. I'm Chris Toomey. STEPH: And I'm Steph Viccari. CHRIS: And together, we're here to share a bit of what we've learned along the way. So, Steph, what's new in your world? STEPH: Hey. Well, I just got back from vacation. So getting back to work is what's new in my world. And vacation is nice. I miss it already. But it's also nice to be back, and see everybody, and see what they've been up to. CHRIS: I've heard wonderful things about vacation. STEPH: Yeah. Have you had one recently? I know you've been quite busy. CHRIS: I have. I think it's hard to tell, especially because everything just kind of blends together these days. But I think I took off a few days recently. I haven't had an extended vacation since much earlier on in the summer, I think. And so I think I'm due for one of those sometime in the not too distant future. But it's one of those things where you got to plan it. And you got to think ahead, and I haven't been doing that of late really with anything. So kind of living for the moment, but that's not how you take a vacation. So I got to rethink some strategies here. [chuckles] STEPH: Yeah, I've been trying to schedule more vacation time just further out. Because then if I don't want to take it, like if I decide that I don't want the staycation or I don't need the day off, then I can just change my mind, and that's pretty easy to do. But I'm like you; if I don't plan it, then I don't feel like I have the energy to plan a vacation, and then it just doesn't happen. So I know that's one thing that I've been doing. I've also been mentoring or coaching others, just checking in with them to say, "Hey, when's your next vacation? Have you scheduled any days off? Do you want to schedule a day off next month?" And saying that to other people has also been a very helpful reminder to me to do so. CHRIS: Oh, I like that a lot as a recurring one-on-one question of, so what can you tell me about vacation? What do you got in the works there? Because that's the most important thing, [chuckles] which it kind of is. It's the way that we keep doing the work that we do. STEPH: And I think so many people just haven't been taking a vacation. I mean, in 2020, we were all locked in and going through a pandemic, so then a lot of people weren't taking those breaks. And so part of it is just reminding people that even if you can't go somewhere, still please take some downtime and just know that you can step away from work and should step away from work. But for us, we did go somewhere. So we went out to Seattle, which I've never...I've been out to the West Coast, but it's more like I've been out to L.A., Santa Monica. But this time, we went to the Northwest region. We went to Seattle, and we explored and did a lot of hiking and camping around the Northern Cascades and then Mount Rainier. And both of those are amazing. And I've never flown with camping gear, but that went really well. It worked out nice. We had an Airbnb every so often just for showers and having a roof over your head. That's really nice. But for most of the trip, we did a lot of camping and hiking. CHRIS: That sounds like an awesome trip. STEPH: Yeah, it was really cool. I'd love to go back to the Olympic National Park because there are just so many national parks that are around Seattle and in Washington that we couldn't begin to do it all. But Olympic National Park is still on my list. And I'm really grateful to have also seen the Northern Cascades and Mount Rainier. But switching gears a bit, I have something that I'm really excited to share with you because I don't think you've seen it yet. I'm excited to find out if you have. But it's a new GitHub feature that came out, I think about a month ago, but there doesn't seem to have been much fanfare from GitHub about announcing this new feature. And I happened to find out through Twitter because someone else found it, and then they were really excited. And so now I think it's really gaining some more traction. But it still seems like one of those sneaky feature releases, but it's really cool. So GitHub has added the ability to open up a web-based editor that allows you to view the source code for a repo, view it in syntax, highlighting, make a code change, and commit the change. And it's free for everybody. And there's a couple of ways to get there, but I'll pause there. Have you seen this yet? Have you interacted with it? CHRIS: I think I've seen it and poked around ever so gently with it. I want to say this is GitHub Codespaces. Is that the name of this feature? STEPH: Yep. That's it? CHRIS: Yes. I poked around with it just a tiny bit, and I'm very excited about it. But it's very much in the like, huh, okay, cool; I'll look at that someday down the road and figure out what I want to do with it. But have you actually dug into it particularly deeply? STEPH: I used it to make a change for a personal project, just because I wanted to see the whole flow. So I went to a personal project, and there are two ways that you can open it up for anyone that hasn't seen this yet. So you can either press the period button that's on your keyboard, and that will open it up, or you can just alter the URL. So instead of github.com, replace that .com with .dev, and then that will also open up the browser. And so I made a change to a personal project, and it worked really well, and it commits the change to main. And it was nice. It was easy. In my case, I was just making a change to make a change. I think I actually went to an older project where I was still using the underscore target to force users that when they clicked on a link that it opened a new tab, and I was like, perfect. This is a good thing to just change. And I could do it from my iPad. I didn't have to be at my computer. And it was really nifty. I was very impressed with it. And they also mentioned that it's very easy to integrate your own VS Code settings and environment. I'm not a heavy VS Code user, so I haven't tried that. But I've heard really positive things about how easy it is to sync your settings between your local VS Code and then GitHub's editor. But overall, it was really easy to use. CHRIS: That's super cool. My very limited understanding of it is like GitHub has had the ability to edit files and things like that for a while. But it was very much like a simple web editor where it's a big text box that happens to contain the code. And they've added some stuff for like browsing with syntax highlighting and even some context-aware show usage and things like that. But as far as I understand it, this is like a whole VS Code instance in the cloud that is running it. And then I think what you're saying about you can have your VS Code settings in there, but even your project settings and the ability to run the tests, I'm not sure where the edges of it are. But my understanding with Codespaces it's like this is how your team can develop. Everyone gets one of these Codespaces. You're developing in the cloud. But it does VS Code remote sync type stuff. I'm very intrigued to see where it goes and that idea of...obviously, I like Vim. That's the thing that's probably known and true about me. So I will probably be one of the later adopters of this. But the idea of being able to bottle up the development environment for your projects and have those settings, and the ability to run the test and all of that packaged up as part of the repository, and then allow people to run with that, especially in the cloud, and be able to carry that with them as they move around, that's really intriguing. And the idea of having this very easy on-ramp, especially for open-source projects and things like that. If you want people to be able to contribute easily but with the linting, and the configuration, and the settings, and all the stuff, well, now you can have that packaged up. And that is very interesting to me. So I'm super intrigued to see where it goes. Again, I will probably be one of the later adopters of this platform for reasons. But I am super interested, and I continue to like...the work with VS Code is so interesting in the way it keeps expanding out and the language server stuff and now the Codespaces stuff. And it's super interesting developments across the board. STEPH: Yeah, I'm with you. I don't actually see this replacing my current development that I do day-to-day, but it's more generally nice to have access. So if I needed to make a change and I don't have my laptop or if it's just something small and I don't want to have to go through…I guess essentially, if I don't have my laptop, but I wanted to make a change, then I could do this realistically from something that doesn't have my full local dev setup. I don't know if you have the ability to run tests. I didn't explore that far as to whether you can actually have access to run those types of commands or processes. I did see some additional notes while reading through GitHub's documentation about this new editor. And they included some notes that talk about how the editor runs entirely in your browser's sandbox. So it doesn't actually clone the repo, but instead, it loads your code by invoking the services API directly from the browser. So then your work is saved in the browser's local storage until you commit it, and then you can persist your changes by then committing it back to the repo. And because there's no associated compute, you won't be able to build and run your code or use the integrated terminal. Ah, I think that actually answers the question about running tests. So only a subset of extensions can run in the web will appear in the extensions panel and can be installed. So this does impose certain limitations for particular programming languages and full functionality, things that we may need like running tests. CHRIS: Interesting. That now puts it back more on the uncanny valley for me where it's like, oh, it's just VS Code, except it can't do a bunch of the stuff. So yeah, I'll probably be hanging out in Vim for a while. But again, I'm super interested to see where they can push this and what the browser platform allows, and then how they're able to leverage that and so on and so forth. STEPH: There is one flow that I was testing out because I was reading someone else mentioned that not only can you use this for looking at source code and then changing that source code but also for a pull request. And so I went to a pull request and changed the URL to dev. And I do have the ability to make changes, but I'm not quite sure if I could commit my changes and if that would go to the branch or how that would work. It wasn't obvious to me how I could save my changes. But it was obvious to me that I could make changes. [laughs] So that part feels weird to me, and I will have to test that out. But I'm going to wait until I have my own PR before I start fooling around [laughs] so I don't ruin somebody else's PR. CHRIS: Ideally, the worst case is you just push commit to a branch, and commits are reversible. You can throw them away. You can reset, and you can do all sorts of stuff. But I agree with you that maybe I'll do this on my home turf first before I start messing around with somebody's PR. STEPH: That way, someone doesn't reach out to me and say, "Steph, what is this commit that I have on my PR?" And I'm like, "Oh, I'm just testing." [laughs] But that's something that I was excited to talk about and share with you. What's new in your world? CHRIS: Well, what's new in my world? I think we've talked about this a little bit, but to give a little bit of context on what's new in my world, I joined a startup. I am now engineer number one. I'm also CTO, a very fancy title, but again, I'm the team of one, so count it as you will. But we do have some consultants working with us. So there is a small team that I am managing, and very quickly, I found myself shifting away from the code or having to balance that trade-off of maker versus manager time. Like, how much of the time am I actually coding and shipping features versus managing and communicating, and trying to figure out the work to be done and triaging the backlog? And all of those sorts of things. I've also just been coding less, and I think that's a trend that will almost certainly continue, and I'm intrigued by that. And that's a thing that I want to poke at just a little bit. And then I've also noticed that my work has become much more reactive than it used to be, where there are lots of things in Slack. And there's stuff that I'm kind of the only person that can do certain things because I have certain access levels and yadda yadda. And I want to make sure other folks aren't blocked. So I'm trying to be as responsive as possible in those moments. But I'm also struggling with that that trade-off between reactive versus proactive. My ideal version I think of the work is gather all of the information, all of the different permutations, and what are all the features we want? And then I think about them holistically, and then I respond once solidly as opposed to little one-off interactions and things like that. So there are just a lot of subtle differences. And I think there are trends that will continue. And so I'm trying to just take a step back, observe them from a distance and say, "How do I feel about these?" But probably most interesting to me is the moving away from code. Have you noticed that at all in your work? Or is that something you've thought about, something you'd be interested in, opposed to? How do you feel about that space in the coding world? STEPH: That is a wonderful question. It's one that I have wrestled with for a while because I really love my current position. I love being a team lead because I feel like there's this wonderful balance between where I get to code a lot of the time, but then I also get to learn how to be a manager, and help those around me, and provide some coaching or mentoring or just help people find the resources that they need essentially. And I really like that balance. That feels like the right balance to me, where I still get to grow in both areas. But then, as you'd mentioned, it still feels like one tries to take over the other with time. Like you find that more responsibilities are growing as CTO of the company. And so you feel more responsible to do more of the managerial task or unblocking others and taking on that role, and then that reduces your time for coding. And I often find myself in that space where I think it's just how I'm wired. I'm very interested and empathetic towards how people are doing and how they're feeling. So I'm always looking for ways to support others and to help unblock them and make sure that they're having a very positive experience with our project. And so then that may mean I'm coding less because then I'm more focused on that. But then, it's still also a very valid part of my job to code. So finding the right balance between those is frankly hard. To answer your other question, I don't think I want to give that up. I've considered for myself if I'm going to head towards more of a manager path, and I'm going to reserve the right to change my mind. But currently, I still like maintaining most of my individual contributor status with a dash of management sprinkled in there and then some responsibilities for making sure that the team is doing well and that people are enjoying their work. Along that line, as I've been having conversations with others around, tell me more about your job as a manager, and what does that look like? What responsibilities do you have? How much coding do you still get to do? There have been a couple of books that have been recommended to me that really help someone define are you interested in management? Is that a place that you see yourself going? This is really an honest look at what it means to be a manager. The fact that a lot of your fulfilling work isn't necessarily work that you get to produce, but it's actually helping someone else produce that work and then getting to see them succeed. That is your new fulfillment or a big part of it. So you are losing that closeness of being a maker,, but instead, you are empowering someone else to be the maker, and then that becomes your win. And that becomes an indication of your success. Versus as an individual contributor, it's really easy to see our wins in a different light: how many tickets have we addressed? How many PRs have we reviewed? That type of work. So there is an interesting dichotomy there, and I can't remember the books off the top of my head, but I will find them and I'll add a link to them in the show notes. CHRIS: Yeah, definitely interested to see the book recommendations. And generally, yeah, everything you're saying makes sense to me. I think I'm somewhat on the adventure right now. I very much intentionally chose this, and I want to lean into it and explore this facet of the work and doing more of the management and leading a team. But I have to accept that that comes with letting go of some of the individual contributor parts. And I was coding a bit over the weekend. I was just rediscovering the flow of that. And I was like, oh yeah, I really like this. Huh, that's interesting. What am I going to do with that? But I think, again, it's an exploration. And there are facets of both sides that I really like. And I've spent a lot of time deeper in the individual contributor side. And I've explored the manager side somewhat but not quite as much. And so this is very much about that I want to push on those edges and try and find what feels true to me. So the moving away from code and then moving more into management, I think I like that overall. Although I know there's the small amount in the back of my head that I'm like, I know there's a cost there. That is a trade-off. And so do I find more time in my evenings and weekends to do personal coding projects and things like that just to have that enjoyable work for myself? The maker versus manager stuff is interesting, though, where my day is now split up into smaller pieces. And even if I'm not coding, there's still writing up docs, or there are things that still require structured blocks of time. And my day is now just sprinkled with other things. And so trying to find that heads down of I want to just do the work right now, and I want to think hard about something is just fundamentally harder to do with more meetings and things speckled throughout the day. So that's one that I think I just don't like overall. But it's sort of a trade-off inherent to the situation. So I think there's also a version of trying to be intentional about that and saying, you know what? I need some heads-down time. And so Tuesday and Thursday afternoons those are going to be mine. I'm going to wall those off on my calendar and try and protect that time so that whatever necessary heads-down work that I need to do this week fits into those blocks of time and then fit the rest of things around that. But I think I have to make that intentional choice to do that. Mid-roll Ad And now we're going to take a quick break to tell you about today's sponsor, Orbit. Orbit is mission control for community builders. Orbit offers data analytics, reporting, and insights across all the places your community exists in a single location. Orbit's origins are in the open-source and developer relations communities. And that continues today with an active open-source culture in an accessible and documented API. With thousands of communities currently relying on Orbit, they are rapidly growing their engineering team. The company is entirely remote-first with team members around the world. You can work from home, from an Orbit outpost in San Francisco or Paris, or find yourself a coworking spot in your city. The tech stack of the main orbit app is Ruby on Rails with JavaScript on the front end. If you're looking for your next role with an empathetic product-driven team that prides itself on work-life balance, professional development, and giving back to the larger community, then consider checking out the Orbit careers page for more information. Bonus points if working in a Ruby codebase with a Ruby-oriented team gives you a lot of joy. Find out more at orbit.love/weloveruby. STEPH: Your mention of having more meetings really resonates with me. And it also made me think of a recent episode of a new TV show I just started watching. Have you seen the TV show called Schmigadoon!? CHRIS: I have indeed. STEPH: Okay. We need to have a whole conversation about Schmigadoon! in an upcoming episode. I'm very excited about this show. It's delightful. [laughs] There's a particular line that Keegan-Michael Key says that I just love so much where he says that he became a surgeon because he wanted to help people without talking to people. And I was like, oh, that's a developer. [laughs] I'm the same way. And I really enjoyed that. Although I do like talking to people but still, it just made me think about when you're talking about more meetings and then increasing the amount of talking that needs to be done as you progress into more of a management role. Also, circling back, I really like what you said earlier about you're noticing the changes that are happening. You're letting those changes happen, and then you're reflecting on how you feel about it. I really like that approach. Do you think that's working well for you? Does it feel too loose because then you don't feel in control enough of those changes? Or do you actually feel like that's a really good way to explore a new role and then find out if you like those changes? CHRIS: Now that you are restating it back to me, I'm like, oh yeah, I guess that is a good way to do things. But to clarify, I'm not doing nothing with it. I am trying to proactively, where I can, structure my days and do things like that or recognize that right now, I'm probably not the right person to be moving code along. And so I'm saying okay, that is true. And I'm actively choosing to not pick up the bigger pieces of work or to pair with someone else so that they can then run with it but not having me being the person that owns it. So it's not completely letting it happen, but it is almost like meditation to invoke that idea of I'm observing that I'm having these thoughts, and I'm just going to let them go. And it's more about the thinking and the response to it. So I'm trying to name the thing and be like, oh, this is interesting that this is happening. And I'm noticing an immediate visceral reaction to it where it's like, you're taking away my coding? And I'm like, well, hey, it's not them, it's you; you chose to do this. But let's just spend a minute there. That's okay. How do we feel about this? And so it's trying to not have it be a purely reactive response to it but have it be a more intentional, more thoughtful, and more observing, and then giving it a little bit of time to ruminate and then see a little bit more what I think. And also, some of it is purposefully pushing myself out of my comfort zone. I think I'm happy, and I do a reasonable job when I'm the person moving the code along. But I also have really enjoyed being at the edge of an engineering team and working with sales or working with other groups and facilitating the work that's happening. And so, if I explore that a little bit more, what's that going to look like for me? So this period of my career, I'm very intentionally trying to do stuff that I'm like, well, this is a little bit different for me, or this is stretching a little bit, but that is the goal. And I hope good things will come out of it across the board. But it may be that I find like, you know what? Actually, I really miss coding, and I need to find a way to restructure that. And I have seen examples of individuals who are even in CEO positions that are like, no, no, no, I still make some time to code. Like Amir, the founder of Todoist talks regularly about the fact that he is a CEO who still codes. And that organization has a very particular approach to work. And they're very much about async remote, et cetera. So having these blocks of times and being intentional about how they work. So it's not surprising that he's been able to do that and a purposeful thing that he's structured. I don't think that will make sense for me immediately. But I could see a version down the road where I'm like, this is who I am. I need to get this thing back. But for now, I'm purposefully letting it happen and seeing how I feel from there. Also, as I'm saying all of this, it sounds like I'm totally on top of this and really thinking it through. I'm like, no, no, no, this is in the moment. I'm noticing some stuff and being like, oh, okay, well, that's interesting. And some of it I intentionally chose. Again, intentionally chose to get out of my comfort zone. So I think I'm just actively out of my comfort zone right now and saying things about it. And then I think I'm telling the story of how I want to respond to it moving forward but not necessarily perfectly achieving that goal immediately. STEPH: I think that's a nice representation of essentially how you and I have processed things. We've highlighted before that you and I...it's funny, I just made the joke about not talking to people, but it's how I actually process stuff. And the best is when I'm talking out loud to somebody else. And so it totally makes sense that as you were noticing this and reflecting on it, that then this is another way that you are then processing those changes and reflecting on it and thinking through is this a good change? Is it something that I'm going to enjoy? Or am I really going to miss my street coding creds? I need to get back to the editor. CHRIS: I just need that precious flow state that comes from drinking some Mountain Dew and coding for hours. STEPH: Do you drink Mountain Dew? CHRIS: No, I gave it up years ago. STEPH: [laughs] CHRIS: I don't drink soda broadly. But if I'm going to drink soda, it's going to be Mountain Dew because if we're going to do it, let's do this thing. I'm pretty sure that stuff is like thermonuclear, but that's fine. STEPH: [laughs] That's funny. I know we've had this conversation before also around Pop-Tarts where you're like, hey, if I'm going to have a Pop-Tart, I'm going to have the sugariest (Is that a word - sugariest?) Pop-Tart possible. CHRIS: To be clear, that means it has icing on it because some people in the world, namely you, would prefer the ones without icing. Although we recently learned that the ones without icing have a higher fat and calorie content, so I don't know. The world's murky. I wish it were all just clear, and we could just work with it. But it turns out even Pop-Tarts icing versus not is not a simple question. STEPH: It's a very simple question. You just need to be on the right side, which is the non-frosted side. [laughs] I can simplify this for you because fat is delicious. Fat trumps sugar; that's my stance. That's my hot take. CHRIS: I'm saying both, a little from column A, a little from column B. You got yourself a stew. STEPH: [laughs] You got a fat sugar stew. CHRIS: Yeah. That was in Arrested Development. All right, we're veering way off course now. [laughter] To bring it back, what you were highlighting of I'm definitely someone who thinks through stuff by talking out loud, and so it's been wonderful. I've learned so much about myself while talking to you on this podcast. I'll say something, and I'll be like, wait, I actually believe that thing I just said. This is fantastic. Now I can move forward with the knowledge that I've just gained for myself by talking about it on a podcast. So highly recommended: everybody should get a podcast. STEPH: Plus one. I also have a very real, maybe silly, follow-up question for you as we are, like you just said, exploring the things that we believe or not. My question for you is part of the transition to management and moving away from coding. Isere some fear in the back of your mind where you're like, if I stopped coding, I'm going to lose this skill? CHRIS: Honestly, no. And I feel kind of bad saying that because I feel like I should say, "Yeah, I feel like it'll fade away and whatnot." But I think I have an aptitude and an interest towards this work. And if I were to ignore it for two years, then frankly, I also know myself. And I'm still going to keep an eye on everything for a while. So I think I'll be aware of what's going on and maybe just haven't spent as much time with it. But I think if I need to two years from now, I'm like, all right, I got to rebuild my coding muscle. I'll skip a couple of JavaScript frameworks, which will be nice, and I'll be on to the 15th iteration that's new now. But I hope that I could revisit that not trivially, not with no effort. It's the wonderful nature of coding. It's one of the things that I love about it so much is that there are blog posts and YouTube tutorials. And it's so individually discoverable that I'm not really worried about that aspect. My concern, if anything, isn't so much that I'm going to lose my skills or not be able to code anymore; it's that I really enjoy coding. It's a practice that I find very enjoyable. A workweek is enjoyable when it contains big blocks of me putting on my headphones, listening to music, and digging into a problem, and then coding and producing a solution. And those tiny little feedback loops of test-driven development or running something and then going to the browser and clicking around like that, there's a directness there that has always really worked well for me. And so the more I'm abstracted away from that sort of thing, and the more of my work is I'm helping a team, and I'm directing strategy, or whatever it is, that just feels so indirect. And so I'm very interested to find out how I respond to that sort of thing. I've definitely enjoyed it in the past, and so that's why I'm intentionally leaning into it. But I know that I'm giving up a part of the work that I really love, and giving up is too strong of a word as well. I'm going to find what shape makes sense moving forward. And I expect I'll still be pairing with the other developers on the team and helping to define architecture and things like that. So it's not like it's 100% gone. But for now, I think the world where most of my week was spent coding is no longer the case. And so just naming that and being intentional about it. And yeah, that's the game. STEPH: Cool. Yeah, that makes a lot of sense. I was mainly interested in that question because that is a question that I've asked myself from time to time that I think I do have that worry that if I step away from coding for too long, then it won't be easy to jump back into. And I've talked myself out of that many times because I don't think it's true for all the reasons that you just said. But it is something that I have considered as like, well, if I take this leap of faith into this other direction, how easy is it for me to get back if I decide to change my mind and go back to being more of an individual contributor? And one other thing that weighs on me as I'm splitting my time between two areas that I really want to grow…So I'm constantly trying to grow as a developer. I'm also trying to grow as a manager, and I don't want to do a bad job at either. I want to do a great job at both, and that's frankly not always possible. And at times, I have to make trade-offs with myself around okay, I'm going to focus a little heavier this day or this week on being a really great manager or focus a little bit more on being a developer and to pick and choose those topics. And then that sometimes means doing like B+ work in one area, and that's really hard for me. I'm an A-work person. So even downgrading to a B+ level of effort is challenging. But I have found that that's a really great space to be because then I'm doing well in both areas, not perfect, but doing well enough. And often, that's really what counts is that we're doing well enough and still pursuing growth in the areas that are important to us. CHRIS: Yeah, I think that intentional switching back and forth between them is the space that I'm in. I expect my work will remain very technical, and I hope that that's true. And I think to a certain extent; I get to shape it and determine that. And so how much of it is strategy and planning and things like that? Versus how much of it is helping the team with architecture and defining processes as to how we code, and what are our standards, and what are our languages and frameworks and all of that? I expect I'm still going to be involved in the latter. And again, I think to a certain extent; I get to choose that. So I am actually interested to see the shape that both naturally the organization needs out of the role that I'm in. But also, what sort of back pressure I can apply and be like, but this is how I want it to be. Is there room for that, or is there not? And it's all an experiment, and we're going to find out. But personally, for me, I'm going to keep reading Twitter and blog posts every day, and I'm probably going to code on the weekends and things. So the idea of my coding muscle atrophying, I don't know, that one doesn't feel true. But we'll see what I have to say a year from now or after what that looks like. But I expect...this has been true of me for so long, even when I had an entirely different career that I was just reading blogs and other things all the time because this is a thing that deeply interests me. So we will see. STEPH: Yeah, I'm excited to hear how it goes. And I think there's something to be said for the fact that you are also a CTO that's very close to the work that's being done. So being someone that is very involved in the technical decisions and the code that's being written but then also taking on more of the management responsibilities. And that feels more of a shift where you still have a lot of your coding skills. And you are writing code day-to-day at least based on what you're saying, but then you are also acquiring a lot of these management skills to go along with it. Versus if someone were going into management and maybe they're at a really large company and then they are very far away from the development team. And they're focused on higher-level themes and discussions, at least that's my guess. But I'm very excited to hear more about your updates and how this experiment is going and to find out who is the true Chris? CHRIS: Who's the true Chris? That feels complicated. I feel like I contain multitudes. But yeah, you know what? I'm excited to find out as well. Let's see what's going on there. But yeah, so that's a grand summary of the things that are going on in my head. And I expect these are topics that will be continuing to evolve for me. So I think we'll probably have more conversations like this in the future but also some tech stuff. Because like I said, I don't know, I can't stop. Mid-roll Ad And now a quick break to hear from today's sponsor, Scout APM. Scout APM is leading-edge application performance monitoring that's designed to help Rails developers quickly find and fix performance issues without having to deal with the headache or overhead of enterprise platform feature bloat. With a developer-centric UI and tracing logic that ties bottlenecks to source code, you can quickly pinpoint and resolve those performance abnormalities like N+1 queries, slow database queries, memory bloat, and much more. Scout's real-time alerting and weekly digest emails let you rest easy knowing Scout's on watch and resolving performance issues before your customers ever see them. Scout has also launched its new error monitoring feature add-on for Python applications. Now you can connect your error reporting and application monitoring data on one platform. See for yourself why developers call Scout their best friend and try our error monitoring and APM free for 14 days; no credit card needed. And as an added-on bonus for Bike Shed listeners, Scout will donate $5 to the open-source project of your choice when you deploy. Learn more at scoutapm.com/bikeshed. That's scoutapm.com/bikeshed. STEPH: Yeah, that's actually the perfect segue as we were talking earlier about just ways that we're looking to grow as developers. And I saw something that I really enjoyed, and it's published by another thoughtboter. Their name is Matheus Richard. And Matheus runs a Twitter account that's called @RubyCards. And I don't recall the exact cadence, but every so often, Matheus will share a new snippet of either Ruby or Rails code and then will often present the information as a question. So I'll give you an example, but the highlight is that it teaches you something, either about Ruby or Rails. Maybe you already knew it, maybe you didn't. But it's a really nice exercise to think through okay, I'm reading this code. What do I think it's going to return? And then respond to this poll and then see how other people did as well. Because once the poll closes, then Matheus shares the actual answer for the question. So one example that I saw recently highlights Ruby's endless method definition, which was introduced in Ruby 3. So that would be something like def, and then let's say the method name is message. And then you have closing, but empty parenthes equals a string of "Hello, World." And so then the question is if you call that method message, what would that return? And then the poll often has options around; it would return "Hello World," or it's going to return a syntax error. It's going to return nil. And then it highlights, well, because of Ruby's endless method definition, this would return "Hello, World." And then I also saw a new method that I hadn't used before that's defined in Ruby's Hash class that's called store. And so you can use it calling it on a Hash. So if you have your hash equals and then curly brackets, let's say foo is equal to an integer of zero, then you can call hash.store and then pass in two arguments. The first argument's going to be the key. The second argument is the value. And then, that would essentially be the same syntax that we use for assigning a value to a hash. But I just hadn't actually seen the method store before. So there are fun snippets of Ruby or Rails code. A little bit of a brain teaser helps you think through how that code works, what it's going to execute, what it's going to return. And I really enjoy it. I'll be sure to include a link to it in the show notes so other people can check it out. CHRIS: Oh, that sounds fun. I hadn't seen that, but I will definitely be following. That's the word on Twitter, right? You have subscribing, subscribe and follow, smash that like button, all of the things. I will do all of the things that we do here on the internet. But I do like that model of the question and answer, and it's slightly more engaging than just sharing the information. So yeah, super interested to see that. STEPH: Yeah, I like the format of here's some code, and then we're going to ask you what does it return? So that way, you get a moment to think it through. Because if I read something and it just shows me the answer, my brain just doesn't absorb it. And I'm like, okay, that makes sense, and my brain quickly moves on. But if I actually have to think about it and then respond with my answer, then it'll likely stick with me a lot longer. At least we'll find out; that's the dream. On that note, shall we wrap up? CHRIS: Let's wrap up. The show notes for this episode can be found at bikeshed.fm. STEPH: This show is produced and edited by Mandy Moore. CHRIS: If you enjoyed listening, one really easy way to support the show is to leave us a quick rating or even a review in iTunes,; maybe as it really helps other folks find the show. STEPH: If you have any feedback for this or any of our other episodes, you can reach us at @_bikeshed or reach me on Twitter @SViccari. CHRIS: And I'm @christoomey STEPH: Or you can reach us at hosts@bikeshed.fm via email. CHRIS: Thanks so much for listening to The Bike Shed, and we'll see you next week. All: Byeeeeeeeeeee! Announcer: This podcast was brought to you by thoughtbot. thoughtbot is your expert design and development partner. Let's make your product and team a success.

Greater Than Code
250: Employee Resource Groups with Adrian Gillem

Greater Than Code

Play Episode Listen Later Sep 15, 2021 49:30


01:19 - Adrian's Superpower: Humor * Making People Feel Comfortable Through Humor * Self-Deprecating Humor & Authenticity 04:57 - Employee Resource Groups (ERGs): What are they? * Employees Share Effective, Measurable, Impactful Insights * Connecting New Hires with People Who Look Like Them * Making Employee Experiences Better 09:20 - How ERGs Operate * “Build with not for” * Making Fellow Colleagues Heard 18:03 - Successfully Policy Implementations: Examples * Transgender Healthcare 23:18 - ERGs and Management / Executive Sponsor Partnerships 30:41 - ERGs vs Unions * Equity 34:19 - Inclusivity Training Reflections: Casey: “ERGs are only as strong as the management supporting them.” Mandy: Live programming + fireside chats over slideshows for inclusivity training. Adrian: Pushing ERGs and DEI initiatives to the next level is crucial and keeping these efforts authentic. This episode was brought to you by @therubyrep (https://twitter.com/therubyrep) of DevReps, LLC (http://www.devreps.com/). To pledge your support and to join our awesome Slack community, visit patreon.com/greaterthancode (https://www.patreon.com/greaterthancode) To make a one-time donation so that we can continue to bring you more content and transcripts like this, please do so at paypal.me/devreps (https://www.paypal.me/devreps). You will also get an invitation to our Slack community this way as well. Transcript: MANDY: Hello and welcome to Greater Than Code, Episode 250. My name is Mandy Moore and I'm here with my friend, Casey Watts. CASEY: Hi, I'm Casey! And we're both here with Adrian Gillem. Adrian is a Technical Project Manager with Booz Allen Hamilton focused on deploying next generation digital transformation capabilities to public sector clients in Washington D.C., Honolulu, Tokyo, and Seoul. Beyond his technical client-responsibilities, Adrian's true passion is grounded in diversity, equity, and inclusion program management and partnership building. Over the years, Adrian helped lead Booz Allen's LGBTQIA+ and African American Employee Resource Groups to new heights; instituting new internal and external partnerships and programs under a DEI strategy committed to representing and empowering our BIPOC, Black, Indigenous and people of color, queer, and ally employees across the firm. Welcome, Adrian! ADRIAN: Thanks, everybody! Good to be with you guys. CASEY: All right, we're going to ask you our first question, we always ask. What, Adrian, is your superpower and how did you acquire it? ADRIAN: [laughs] I've had to think about this. My superpower is humor and I only acquired it because I was able to tell the same bad jokes over and over to my friends and loved ones, and I've just stuck with the ones that people laughed at. CASEY: Testing. You tested them live. ADRIAN: That's right. That's right. They had no choice. [laughter] CASEY: How many of them did you get full on laughter versus nervous laughter versus glares, which were also a sign they liked your pun? ADRIAN: Yeah. I would say that my sarcastic humor definitely got 70% eye rolls, 10% hm and has and then the other 20% were slight laughs, maybe a smirk, or two. But over the years, I hope that it's gotten better more in my favor. People tend to smile a little more when I make a joke, but can't say it's a 100% success rate so far. But we'll see. Maybe I will start my life career as a comedian in the next 10 years since and just retire from technology, or I'll just do both. Who knows, who knows? CASEY: Yeah. There's space for that. ADRIAN: There is. CASEY: Multi-passionate. You can be multi-passionate; you're allowed. ADRIAN: Absolutely. I can make live jokes and do live coding on a set. I'll probably do really bad coding, which will be enough for people to laugh at anyway, so I'll already have material ready to go. MANDY: That's awesome. CASEY: You've got me smiling and laughing. [laughter] Even just the levity you're describing is funny. MANDY: Yeah. ADRIAN: Thanks. I appreciate you both for already bearing with me. [laughs] CASEY: So I have a feeling you incorporate humor like this into your work with employee resource groups. It's hard to imagine you wouldn't. Tell us something like that—some of the joke that you've told, some scenario that you've managed to reframe. ADRIAN: Oh boy, that's a really tough question. I think the way I try to incorporate my humor, especially in my work with our employee resource groups within the firm and especially with our partners outside of our company, is just to make everyone feel comfortable through humor. You start to meet with different folks of different backgrounds for the first time, maybe even for the second, or third time, whether it be at your water cooler, or in the kitchen, or at an actual meeting where you're talking about a diversity, equity, and inclusion agenda. Some folks might walk in and not necessarily know everyone in a room, not feel comfortable to speak in the way that they would like, or act as authentic as they should. So luckily for me, humor seems to break that ice very quickly. It's always very – in my case, I choose to do self-deprecating humor first and then that just gets the ball rolling in making sure that everybody feels open and welcome to be themselves in the space that I'm in. But absolutely, in the ERG, the last place you want to have this stoic, maybe stale environment is an ERG whether it be an ERG meeting, or an ERG get together, or anything like that. You want to make sure that everyone feels very comfortable being in that space and you don't want to have as any hesitancy to that authenticity. So I try to do my best with making many people laugh, even if it is at my own expense and that's perfectly okay, I signed up for it. CASEY: So for listeners who may, or may not have been part of an employee resource group before, an ERG, can you tell us a little bit about what it's like being part of one? ADRIAN: Sure. So being in an ERG, it's an interesting mix. You either are in an organization that has had ERGs for a very long time and there are predetermined ways that it operates. There's a leadership structure. There are formal rules and procedures in place. There's a lot of hype behind it. Folks feel that it actually represents their interest and they can use that to communicate up. By up, I do mean up to management, senior leadership on ways they are not feeling included, or feeling equitably represented in a particular company. And then there are other organizations where unfortunately, a formal ERG structure might not exist and so, you'll have situations where employees informally get together based on shared experiences, based on shared connections, based on shared racial identities, or gender identities, or sexual orientation identities. But they don't have a formal way, or a formal mechanism to do that. So in our case, in organizations that do have formal ERGs, really what it is used for is to make sure that staff have an effective, measurable, an impactful organized mechanism to really share insights on things that are affecting them as an individual employee and share it across colleagues that also might be feeling similar impacts, or might have similar experiences. To provide a specific example in this case, I lead, or I'm on the board, rather of our African American Network. That's what we call it. Really, it's focused on engaging our African American and more generally, our brown and Black persons of color employees across the firm to make sure that their voice is not just heard, but felt, that their impact is not just seen, but felt in the way our company operates and the things that we focus on and try to improve on. In that, most of what I'll do is typically liaise with our employees that are, let's say, onboarding for the first time to the company and they want to feel connected to that wider corporate group. We are a company of 26,000 employees, so it's very hard to feel like I can connect with a bunch of people pretty easily. So connecting with new hires via this mechanism of an ERG provides an easy way for folks to get together with a smaller subsect of our staff. But get connected with a subsect that actually looks like them, talks like them, has had shared experiences and memories and livelihoods and lives just like them and so, that's just part of it. The other part of it is representing our respective employees and our members within the ERG and their interest to upper management, to our human resources division, and folks with just a stake in understanding what is impacting our employees that are particularly aligned to this group and how can we make their experiences better. But better in the sense that they're able to be more effective in their job, feel more authentic in their day-to-day, and feel more appreciated for the unique contributions that they're bringing each and every day that they support the work that we do. So I think that's a lot and I'm happy to break it down even further because I think that this is such a really, really important element that companies that have it formally structured sometimes take for granted because they might not be effectively funding it, or giving it the oomph, I'll say. The energy and relevance to do that kind of impact that I'm describing that I feel is unique to Booz Allen. But in a way, it's also a call-to-action for maybe smaller or mid-size companies that, like you mentioned, might not have a formalized structure like this and yet have employees who want to band together and make it so, so they have a way to drive that type of impact I was talking about earlier. MANDY: So you create these groups—people who look like me, act like me, are like me identify in the same way that I do and we see things, where do we go from there? We identify the things that we want, or need. Do we go management? Do we go to HR? What's the kind of, how is it structured? ADRIAN: So that's a very good question. I think ERGs and really, business resource groups, depending on the company, have varied reporting structures. In the case of Booz Allen, we as an ERG work very closely and almost hand-in-hand with our formal diversity, equity, and inclusion departments, our human resources specialists, our recruiters, all those within that part of the company, to make sure that what we're hearing at what we like to consider at the grassroots level is actually delivering change that can be felt by our employees. Now, what that does not mean is that employees would somehow come to us as an ERG with let's say, a formal employee level, or human resource level complaint, and we pass it on their behalf. No, no, no. That's not really the focus. The focus really is to make sure that everyone, broadly speaking, has a chance to voice things that are really important to them and their situation—basically connected to their identity and however they choose to identify in a particular space so that we collectively can share those insights to departments and components of a business that drive that policy discussion and policy change in response to situations arising. So in our case, in the wake of the increased exposure of Black Lives Matter protests across the United States, in the wake of the murder of our brother, George Floyd, in the wake of so many impactful events that have happened over the last 2 years, not to mention a pandemic that we're all kind of living through in our own way, ERGs have become the focal point to articulating what really is, or are the needs of our workers, our colleagues, our friends in this company—whichever company that you might work for—and how can we represent what they are actually dealing with on a day-to-day basis? Because I think one of the things that we forget is not all employees feel comfortable to go to human resources with an issue. Not all employees feel comfortable going to management with an issue—and I speak as a project manager myself. Especially when it comes to particular situations that are specific to issues that might be affected by their race, by their sexual orientation, by their gender identity, and so on and so forth. So an ERG provides that formal, but not management connected mechanism to gather all of those insights, gather all of those feelings, and tell a narrative that's structured, but impactful to the human resources and management leadership elements of a particular company to drive that change. Now, all of what I've described is the ideal. That's the ideal way that ERGs ought to operate in a particular environment. But I am very well aware that some, if not a lot, of companies don't do it that way. They're playbook for employee resource groups is I one of two things. Either you will have a loose band of employees that may have won, what we call, executive sponsor that doesn't have a lot of weight to throw on it and by extension, financial support, leadership recognition to then drive that kind of impact. And then another is where there is no ERG presence whatsoever. But in this context, I'm also still talking about big companies, larger companies, even companies at my scale where all of the discussions, all of these things that I've talked about are really just management led. So to provide an even more specific example that I think we've all heard about time and time again, especially in the wake of all of what we've experienced over the last 2 years, a lot of companies just hire a chief diversity and inclusion officer and call it a day. That's their impact, or they put out a press release that says, “We are going to revamp our recruiting strategies and we're going to “do better” to represent our minority employees, our employees of minority, gender identities, or sexual orientations.” But at the end of the day, that doesn't really translate to a grassroots level initiative of that delivers that kind of change. So taking it all back to your question of is an ERG seen as that formal mechanism to interface between staff and human resources? It is, but only in the context of with it, we can get a lot more critical insight that feels more authentic, that is more authentic, because it's driven by our employees, vice waiting for one or two employees to feel comfortable going to HR directly with an issue, or concern and not really driving that kind of impact the way we would like to. CASEY: It reminds me of the phrase “build with, not for.” So the second scenario where you just hire a DEI officer and they just do it on their own without including the people who are affected is like a build for. But if you get people involved who are affected without forcing them to either, which is the other end of the spectrum. [chuckles] Like you've got to invite them and they have to accept it and be content happy working with it. Maybe you have time. I'm wondering, do you feel like you have working hours, time dedicated you can spend on the ERG work, or do you squeeze it in between everything you do? ADRIAN: That's a good question, actually and a good point to bring up. I, myself, am very passionate about this stuff and I love doing it. So even if I feel like I'm adding on to my day-to-day work, it's not really a big deal for me because I know that what I'm doing is driving an impact that I am very, very excited to do each and every day. But more importantly, I get to go to sleep at night because I know that I'm just not doing a day-to-day job, that is doing day-to-day monotonous work, that there is a value add to it that I'm able to do liver to my colleagues, my friends in my company, and send a clear message of what I stand for and what I want to represent, what I want to share. But for others, and especially in some corporate environments, you might see two structures. One structure is companies might devote to each employee a set number of hours that they can use to do what we'll call volunteer work and sometimes, this volunteer work may include ERG support, or ERG leadership, or program management, or event management. Others do not. So other companies expect that you focus on your day-to-day and anything you do outside of that is volunteer work that can be tracked, but there is no formal mechanism to track it. At Booz Allen, and I can at least speak for our company specifically, we actually have a requirement almost and if not a push, that's been significantly increased the last year to leverage what our employees are doing in ERGs across the firm to help advance their case for promotion, for role change, really, it's to make sure that our employees are feeling like even if they are doing this as a volunteer role and it feels it is on top of their day-to-day, that there is a value to it. It might not just be value that they feel internally, but rather it's also value that is shown up at the end of the day, when they're up for promotion, or they're looking for an expanded role, or they're looking for a reward for the comprehensive effort that they're putting into the company. But I think, by and large, most people don't focus on that because for a lot of ERG work, it's just because you want to do it. You want to make your fellow colleagues heard, and you want to use the leadership and the voice that you have and the willingness you have to articulate their message on their behalf, and you want to do it well so much so that if it takes a couple extra hours, a week, or a month, it's worth it. CASEY: Cool. I love having the whole overview. I've got a clear image now. ADRIAN: Yeah. [laughs] MANDY: So tell me a story. I like stories, okay. So I was wondering like, if you could give a specific example of something, a policy that an ERG advocated for that you're a part of and that it got changed, or improved, or something? Like, is there a specific, “I want this,” and then what happened? ADRIAN: Sure. Actually, [laughs] I could give you like 15. MANDY: Go for it. ADRIAN: But I'm going to boil it down to the one that I remember most and that really was a policy change that was implemented in, I think it was late 2017 perhaps, or maybe early 2018 where we were pushing for expanded, I would say, healthcare policies—I should say we say—better healthcare coverage for our transgender employees, one and on a side to that, trying to figure out how do we better represent our transgender employees who want to transition while working for the company and make sure that their benefits are covered. But also, articulate to the company, what are those benefits? What do they need? What are their healthcare needs? What is, or should be the needs that happen in the workplace outside of just healthcare? Things of that nature. What is a set list of guidance that Booz Allen can use to better represent and better support transgender employees? So GLOBE, which is the LGBTQIA employee resource group at the firm, was at the forefront of that. We were taking the lead role in coordinating with our employee retention staff, human resources staff to articulate what exactly those needs will be and make sure that it is implemented in a timely fashion. What I mean by timely fashion is a lot of these initiatives that maybe ERG led could take months, if not years. But in this case, we were able to expedite it because we had built partnership with our HR departments, with our entities that could actually implement the kinds of policy changes we wanted for our transgender employees. So based on our guidance, we were actually the ERG task with developing those initial guidelines and guidance on what should be medical coverage options for our transgender employees. In addition to that, we also set out guidance on what are the things that transgender employees want out of their management? What are the expectations on how they would like to be treated, how they would like to be addressed, how they would like to operate in our environment, in our corporate environment? So we set all of that up as one package that we were able to successfully route up to our leadership. Again, I might be providing a cavalier-sounding story, but one thing I want to make sure everyone understands, and especially your viewers, is that we are a company of 26,000 people so making any change quickly is very hard. It takes an enormous effort. So the fact that we were able to start from a piece of paper and one partnership and scale that up to an entire LGBTQIA board like ours, our leadership, and a set of sponsors at the human resource and management and leadership level at our company to also include our Chief People Officer, Betty Thompson, in span of just months was absolutely remarkable. In fact, we were able to make that implementation, that change in time for our next pride summer session, which is really the hallmark and really, the focus that we had as our target. So by 2018, we had formalized the process, we had formalized these new changes to the policy, but the focus point was it was an ERG that led it. We led the discussion, we led the change, and we made the coordinated effort and we carried it along the finish line, along with our helpful partners in human resources, and especially under the leadership of our Chief People Officer. I don't want to sound like I'm drinking the Kool-Aid too much, but I was really glad that we were able to do that because it's stories like that that made me want to stay working for not just my company because I think all companies try to do good for their employees in one way, or another. But it made me specifically want to stay on the board of our ERG and continue supporting the work that we were doing just because I got to see what kind of impact we can actually do if we work together with them and actually empower them to do the type of work that we hopefully intend for them to do on a regular basis. MANDY: That's awesome. CASEY: Yeah, great story. I'm impressed. ADRIAN: Yeah, don't be impressed about me. Be definitely impressed by the team that I was with. I was a member of the board, but it really was a collective effort, which is usually the story for all ERGs across most corporate environments. CASEY: I'm impressed with the structure that's set up that incentivizes all of this to happen. The ways that it should to have the people involved who are affected and all that, that is so cool. It's a good structure. ADRIAN: Yeah, no, it was. [chuckles] I would say that it was a hard-fought battle. I don't think anything like this is easy. One, because one thing for, I think for all viewers to keep in mind is that employer resource groups are only as strong as the management that's supporting them. So that's why there has to be this partnership, this very strong tightly knit partnership, not just amidst the grassroots level members of the ERG, but also, the executive sponsors that you have behind it. What do I mean by executive sponsors? Because I brought that up a couple times when I was bringing up some of the stories. Typically, you hear the term sponsor and you might think like a brand sponsor, or for, I don't know, a sports event, or something like that. In our case, program, or executive sponsor is a dedicated leader within the company who provides strategic level direction, more important funding, to make sure that our activities and our ability to operate continue unabated. So it took a lot of time, effort, and number of years for Booz Allen, and I can say that confidently, to recognize the importance of having a tightly knit, but influential set of executive sponsors aligned to each ERG. What I mean by that is some ERGs have two, or three vice presidents that have access to budgetary resources to fund events, programs, and partnerships that we'd like to do in a particular fiscal year. Others might just have one, but that one might be the Chief People Officer of the whole company. So all of that is very, very critical because having a formal structure, meaning you have a board chair, or you have a board member set up and members is good. But at the end of the day, if you don't have a backing behind it, or help your organization, or your ERG be more influential, unfortunately, can almost appear like a club. People are going after hours, having a good time, but they're not really making change they want to see in their company. So you always, always, always, if you're trying to stand up your own ERG within your small business, or in your mid-size business, or trying to even improve the effectiveness of your ERG in a large company, if not larger one, you want to make sure that you have executive sponsors behind you who have the backing of your C-suite leadership and can help you and your team really affect the change that you're trying to affect. But in our case, we just got lucky and over the years, we've had pretty solid relationships with our executive sponsors. They're pretty cool people. I must say Betty, our Chief People Officer, she's pretty awesome. I remember talking to her for 20 minutes during a trip about Prada bags. If that doesn't tell you about my superficial love of Prada bags, I don't know what will. But it is good and I think it is continuously great that we have that type of representation, have that type of backing, and I think that should be almost commonplace for most organizations. CASEY: This reminds me of two things I want to share. I think you'll find them interesting. One is this idea of executive sponsors reminds me of how in high school, when you have afterschool groups that students want to self-organize, they need a teacher to sponsor it, or they cannot do it. They cannot stay in the classroom. Even if the teacher doesn't do anything, they don't have to do anything necessarily. The students can maybe run their club, like practicing improv from things they found online, but they need a sponsor. But it's even better if the teacher is involved and they're actually teaching improv, or whatever the afterschool activity is. A friend of mine is a teacher and does that so, I'm thinking of her. It's interesting; you need that support for things to get done and you don't need babysitting in ERGs, but you do need it for other reasons like influence. They can influence a whole lot. That reminds me a little bit of my friend was telling me about a choose your own story adventure game that Harvard Business Review put out where you were trying to make change in an organization like Trans Healthcare, or something like that. And then how do you do it? You make all these choices. Two things that surprise me how impactful they were, like those scores were way above the others, were the leadership support that you're describing and external consultant support. Even if—we know the story—the consultant says what the employees say gets done. So it's funny, either source of authority can have a huge impact. We like to ignore it, but it's really powerful and we shouldn't ignore it if we want to get of things done. However you got it to happen at Booz—I'm sure it varies by company how you can get the support, what it looks like—but that's really powerful. Were you around for that part before you got Betty on your side? ADRIAN: So, [laughs] no. Unfortunately, when I came in, we had already had a pretty strong relationship with Betty. It seems like Betty was ready to go and support everyone, which is always great. So no, I didn't get to see the lead up efforts to having to influence all of our leadership to provide that backing. But I think that speaks to the enduring, I would say, commitment that that Booz Allen has to our employees via these employee resource groups. Because specifically, even as early as the 90s, Booz Allen had set out a policy to, in this case, specifically recognize support and empower all our LGBTQIA employees. Something that was completely unheard of in the time for a lot of companies that, again, were existing in the wake of Don't Ask, Don't Tell, the Defense Against Marriage Act, et cetera. Our company, for an enduring period of time, has made a very strong commitment to representing our LGBTQIA employees and making them feel not just welcome, but empowered and making them feel like they have someone on the CEO leadership level in their corner ready to defend them. But I wouldn't want to just talk about my company only. I feel that, by and large, we have seen a significant uptick in major brands, over the last even 5 years, making stronger statements, making stronger efforts, making more substantial improvements in how they operate and engage with employees of diverse backgrounds. The respective ramp ups for them probably are very different than what was it was for Booz Allen, but I imagine, at least I would hope, that of those companies, ERGs played a role in making that lead up a little bit easier. I haven't worked in every company in the United States. I don't think everybody has. CASEY: Oh, not yet. ADRIAN: As much as I would love to. [laughter] Not yet, not yet, but I would hope that the story is probably the same across the board; that it wasn't just a decision made in a vacuum by some director CEO, that it was a coordinated effort partnered by an employee resource group operating at that grassroots level capacity. CASEY: Yeah. I believe that it's got to come from the top and the bottom. If you just have one, or the other, it's not really going to go far. ADRIAN: No, it's going to hit an impasse, it's going to stop on the train tracks like, if you're on Washington Metro. CASEY: That single tracking red line, yeah. I've been there. ADRIAN: That's right. That's right. [laughs] CASEY: This all reminds me a little bit of unions, but it's not unions. ERGs are not unions. They're different. They don't do formal requests, like you mentioned, complaints. But there is some formal structure; there's funding coming from the company. That's even the opposite of unions, too. But I don't know, something about it feels similar. It's like, people coming together to support their points of view. ADRIAN: Yeah. In a union, obviously, there's a membership, there's a formal charter, there's your set union president—they negotiate on your behalf for the company to do things that you want. You're absolutely right. Outside of the legalese language, if you will, there are very much a lot of similarities and even historical connections between unionizing and employee resource groups. Really, the only difference rests in what is the collective bargaining capability between the two. ERGs do not bargain in any official capacity, but unions do. But you still have absolute value in formally standing up and empowering and strengthening your ERGs in the same way that you would recognize the inherent legal power, legal capabilities, and legal recognition of any union that your business might be dealing with. It's a very good point you bring up because a lot of times, folks just feel like ERGs are that thing that they might get an email about and hear an event about, but maybe not think twice about it because it's not impacting their day-to-day. As in, it's not impacting their salary, it's not impacting their livelihood, their employee experience at a particular company. But one thing people forget is that half the time, these ERGs are the reasons why companies have events and programming opportunities that talk about different ways to grow in a firm. For example, the women's group of Booz Allen tends to be the leader in hosting a lot of events that talk about networking, career empowerment, career improvement specifically for women in the workforce. Now they might be targeted to women who work within Booz Allen, but the message is broad and the message far exceeds the walls and halls of our company in that they want our female colleagues, regardless of where they might see fit physical location wise, to succeed equally. But that also comes with the equity part and I think that equity part is what makes kind of union like efforts that ERGs play in our companies so important because equity is what makes sure that regardless of the situation, we are going to give you the resources that at respond to your situation and give you the tools to succeed in spite of whatever you might be dealing with. Whereas, before diversity and inclusion departments would just have an equal way of responding to a thing, but the way that they wanted to solve a problem might not necessarily work for Black and brown employees, the way they want to solve a problem might not work with women, employees, or Black female employees. So to bring it all together when we're talking about [chuckles] the union-like functions of an ERG, you're absolutely right. We have organized ways to deliver mechanical if not systematic change, but change that have an impact and that impact every single member that might be tied to a particular group. But we also do it in a way that's structured. We do it in a way that ensures that there is an impact that can be felt in and outside of the organization. CASEY: This also makes me think about inclusivity training like a lot of HR departments give to their employees. I've heard mixed reviews, but the content's good. We want the content. People want to know how to treat their coworkers really well. They want the awareness of what to say and not to say to people. People like that, that I've worked with. But a lot of the HR training often is like a PowerPoint presentation online that gets tracked, how many slides you look at—it's very cookie cutter and no one wants to talk about it afterwards, or share notes and that helps a lot, if you can talk about things. Anyway, it doesn't feel as impactful as it could be. Do you have experience with inclusivity training like that and does the ERG work in interact with that any? ADRIAN: Yeah. So that's actually really interesting because a lot of companies are struggling with that. How do you bridge the gap between diversity equity inclusion and at a very large scale in making it as generalized as possible, but still target the employees that it matters to the most? So a lot of trainings now, especially as we're in a remote environment, are just like you said, just a lot of PowerPoints, a lot of online trainings. You've got to click through slides on a video and hope to God that you can actually click and fast forward past the slides because if you don't – [overtalk] CASEY: Oh, yeah. ADRIAN: Then you've got to actually wait through the slide and nobody wants that, but – [overtalk] CASEY: Just with a transcript. That's accessibility. [overtalk] ADRIAN: That's exactly right. CASEY: When accessibility makes that happen, I am so happy. I can read so much faster than listening. ADRIAN: Absolutely. I have read so many books and that has proven to me that I can read through a transcript faster than listening to a [chuckles] slideshow presentation. But what our ERGs try to focus on is live programming and I think that's the big distinction here because a lot of mechanized training programs that companies try to offer in diversity and inclusion, sensitivity training, inclusivity training, they're bound to systems and applications—technology that delivers the widest variety and the widest accessibility possible. Whereas for us, our focus is really just targeted to live events with speakers, fireside chats, having our members do round table discussions where we're bringing together our members to talk about the things that they want to hear. We're more flexible in that we actually can of course, solicit and obtain topics that our employees want to talk about and have experts connected to that, whether it be inside, or outside of the company, to share their insights and share their expertise. The reason why I think that's so valid and so valuable is you ensure that the audience actually can connect to what you're talking about and they see a face behind it. They don't see a slideshow with a portrait of a guy, some weird just stable figure with a suit doing weird static things that's supposed to action an image. That doesn't do it anymore. Nobody wants that. People want live programming. Folks want to see someone that looks like them, talks like them, has lived experiences like them, share insights that can relate. So for us, now more than ever, we have been doing a lot of fireside chats with Black and brown authors, queer authors in the space to articulate the creative side to anti-racism, anti-LGBTQIA hate, things that our employees want to hear as an ERG, but don't want to see via slideshows that management puts together or has an outside consultancy or vendor put together. In fact, one of our more recent events that the African American forum, or African American Network, rather in partnership with GLOBE, the LGBTQIA resource group I mentioned earlier, we recently put together a live event focused on queers in the workplace. Specifically, queer people of color in the workspace and we targeted this specifically to focus on how are our brown and Black employees operating in a not just telework posture, but how are they feeling? How are they feeling with their colleagues? How are they feeling working with their supervisors? How are they feeling working with their clients? Do they experience, or are they experiencing, or have they experienced issues where they didn't feel welcome in a particular client space? How are they dealing with responding to issues that management needs to hear about, but in a telework environment where the only thing you can do is set up a Zoom call? Those types of conversations can't be had effectively in a slideshow presentation that you're doing on a webcast. These are things where you want and have to have a grassroots level organization that is formally structured articulating the message, and having people who live those experiences articulate it for you and with you, and have that live dialogue to where your staff can feel that they're learning about the inclusivity that your company is trying to enforce, but actually have it stick because they heard it from a colleague. They actually heard a story that connected with them. I think that's one message I would want to harp on the most is that all of what we do and by we, I do mean the collective ERG enterprise, regardless of whatever company you work for, that's the focus is messaging. You want to make sure that your ERG is sending a message that when that employee joins it, or when that employee participates in an event, or when that employee sees the ERG's name, they know that it represents authenticity. It represents a connected feeling that they can take back and say, “Hey, if I don't feel comfortable going to HR, but I know that I can have a voice to hear my issue that looks like me, talks like me, sounds like me, but in my own company,” then that's exactly what we want to send. That's the type of manage we want to ring home. MANDY: Absolutely! CASEY: Yeah, that sounds great. That reminds me of a panel we did together before, Adrian. Years ago now. [laughter] Tech Talk, D.C. We did Queeries in Tech. Queeries like queer, but also like the tech pun, like the aQueries. [laughter] ADRIAN: See. You see, Casey, you're going to take my bad joke job away from me. I'm CASEY: We work together here. We're collaborative. MANDY: I love it. ADRIAN: That's right. CASEY: Build with, not for. ADRIAN: Yeah. I feel like I've been saying the same message, though since our last talk. So I'm at least improving that I'm consistent if even if my consistency falls on deaf ears from time to time. CASEY: That's okay. Repetition is key to influencing this kind of level. ADRIAN: That's right, yeah. That's what my music teacher used to tell me, when I was singing really badly, “Just say the lyric and sing it louder and over and over, you'll get that.” CASEY: Yeah. ADRIAN: “Don't worry. Somebody will listen to you.” MANDY: That's why you've heard 250 episodes of this show. We [laughs] say it all over and over and over again in hope that people will pay attention. [laughter] CASEY: Yeah. Slightly different perspective, but always similar themes. It's true. ADRIAN: That's right. Well, I hope it's this lucky 350th episode that somebody finally listens to it and says, “Ah, I get the message. I get what they're talking about.” MANDY: We're only at 250. ADRIAN: 350 times, but here I am. MANDY: We're only at 250. ADRIAN: Oh, 250? [overtalk] MANDY: But maybe a 100 more times. [laughs] ADRIAN: [laughs] Okay. CASEY: I think this episode, we will get some ERGs at companies that didn't have them from this episode. I'm sure. People listen to it not just when it comes out, but for a long time afterward, it still comes up. I don't know, but we'll find out. If anyone does, let us know. We'd love to hear a success story, or even a challenge story where you just sang the notes wrong a lot. I'd love to hear that, too. MANDY: Please add us. ADRIAN: Yeah. Or even then, I would love it if your users could even share their experiences with their own ERGs. CASEY: Yeah! ADRIAN: Because my experience is not the only experience. I am obviously well aware I'm talking from the perspective of a member of two boards. So I imagine others might have different experiences and those are valid. Those are absolutely valuable because whatever insights you share about your experiences with an ERG, those are the experiences we want to hear so we can improve on them collectively. It's a valid resource to have, but it can only be grown better if we have that kind of grassroots contributions on a regular basis. So don't be afraid. I always tell people, “Don't feel bad to tell me I'm doing something wrong because if you don't tell me I'm doing something wrong, I'm going to continue doing it and I won't know.” CASEY: Yeah, I'd love to hear more people's stories. MANDY: Yeah, and if anybody's out there that has one of these stories and wants to come on the show to talk about it, please get a hold of us because we love telling these stories, like I said, over and over and over again because that's how change is made. CASEY: We want your voice. You can reach out to us on Twitter, or we also have a Slack community you can join. Greater Than Code Slack; you can find the link to that on our website greaterthancode.com. MANDY: Yes, and it is a Patreon donation, but if you DM one of us panelists on Twitter, we will let you in regardless if you decide to sponsor us on any kind of basis, or not. We let everybody in as long as you, too are greater than code. CASEY: Ding! Love it. Adrian, you'll be in soon. MANDY: Yeah. CASEY: We'll bring you in. MANDY: Yeah, he'll be in. It sounds like this is a good time to move over to reflections for the episode. We usually let our guests go last, Adrian. So Casey, do you want to give us a start? CASEY: My takeaway is Adrian, you said the sentence, whether you remember it, or not, “ERGs are only a start wrong as the management supporting them.” That's so true. ADRIAN: Yes. CASEY: I've tried to do changes so many companies from the grassroots level without the opposite of support, whatever that would be. No one was shutting us down, but if no one was supporting us from above, it didn't go that far and that's a recipe for frustration. MANDY: For me, I really took away how the live programming over slideshows is so important. Just having the fireside chats and the round table discussions, inviting people who are behind the scenes advocating for this stuff on the frontlines is just much more impactful than sitting there through a slideshow a first day of training like, “This is how we –” we already know all this, okay. So having that audience connection and being able to be interactive, I think is really important way to handle and get things done and not just being sat at and talked to. Being like, “Okay, so, let's have a discussion.” Open it up to the audience and do a back and forth. I love panels for that reason is that you can just feed off each other and yes and others and I feel that that's really good way to go about things. ADRIAN: Absolutely. At least for me, I have been just awestruck, I would say, especially on all of the conversation points that we've had so far, but most specifically the fact that we can share in the article that Casey had mentioned from Harvard Business Review and honing in on that idea that some organizations experience that ramp up where they have external consultants, they have external influences, internal influences, all trying to come together and figure out what's the best way to push an ERG, or a diversity, equity, and inclusion initiative, or effort to that next level. Get their employees a bit more engaged. They feel a bit more represented, feel a bit more committed to the mission that the company is trying to get after because it's so crucial. The one thing I would add to that, as part of a final note for me, is for any company that is doing ERG work that has some formal structure, or even if you are a small business, or mid-size business and you have employees that are even talking about it, or hearing about it, make sure that that effort that either is already there, or you're seeing it grow into something, remains authentic. That it has authenticity tied to it and that authenticity can, will, and only can come from the employees who put it together. So make sure that if the employees say want an ERG, make sure that they're absolutely committed to it, all facets of it because it's a lot of work, but it's good work. And if you have a preorganized and structured ERG that just wants to take it to the next level, make sure that you have management and executive sponsors who also believe in that vision for authenticity. I think we, as queers and allies in tech, need and see authenticity. We recognize it all the time and every day and everything and everything we say and do that is also represented in the employee resource groups that do such good work, but can only do such good work if there's an authentic passion behind it. MANDY: I love that. You're so right. A 100%. CASEY: I have a feeling you've said some of this before because it's so polished and clear. You're articulate, Adrian. I love it. ADRIAN: I honestly have thought about becoming just a dish jockey and just going on radio and then just quitting my day job. But then I realized that would only be successful for maybe one episode and then I would just get boring and then I would forget. [laughs] So I'm going to keep my day job. I'm going to leave you two as the experts on this stuff and I'll just keep saying the same message for the next few 100 years and hope somebody listens. MANDY: Well, thank you so much for coming on this show. It's been wonderful. CASEY: Thank you. MANDY: You have been amazing in explaining all of this. I've honestly never heard of ERGs before. That's why I just sat here and was listening like, “Yes!” Thank you so much for talking about it. ADRIAN: Sure. MANDY: And you are welcome back on this show anytime! Special Guest: Adrian Gillem.

The Bike Shed
308: That's Picante

The Bike Shed

Play Episode Listen Later Sep 14, 2021 48:05


You know what really grinds Chris' gears? (Spoiler Alert: It's Single-Page Applications.) Steph needs some consulting help. So much to do, so little time. Sarah Drasner tweet about shared element transitions (https://twitter.com/sarah_edo/status/1431282994581413893) Article about Page Transitions API (https://developer.chrome.com/blog/shared-element-transitions-for-spas/) Svelte Crossfade layout demo (https://svelte.dev/repl/a7af336f906c4caab3936972754e4d6f?version=3.23.2) Svelte Crossfade tutorial page (https://svelte.dev/tutorial/deferred-transitions) (Note - click "Show Me" on the bottom left) Transcript: CHRIS: I have restarted my recording, and we are now recording. And we are off on the golden roads. Isn't software fun? STEPH: Podcast battle. Here we go! Hello and welcome to another episode of The Bike Shed, a weekly podcast from your friends at thoughtbot about developing great software. I'm Steph Viccari. CHRIS: And I'm Chris Toomey. STEPH: And together, we're here to share a bit of what we've learned along the way. Hey, Chris, happy Friday. How's your week been? CHRIS: Happy Friday to you as well. My week's been good with the exception of right before we started this recording, I had one of those experiences. You know the thing where software is bad and software is just terrible overall? I had one of those. And very briefly to describe it, I started recording, but I could hear some feedback in my headphones. So I was like, oh no, is that feedback going to show up on the final recording? Which I really hope it doesn't. Spoiler alert - listener, if I sound off, sorry about that. But so I stopped recording and then I went to go listen to the file, and I have our audio software configured to record directly to the desktop. And it does that normally quite well. But for some reason, the file wasn't there. But I remember this recently because I ran into it another time. For some reason, this is Finder failing me. So the thing that shows me the files in a graphical format, at least on my operating system. Although I think it also messes up in the terminal maybe. That feels like it shouldn't be true, but maybe it is. Anyway, I had to kill all Finder from the terminal to aggressively restart that process. And then suddenly, Finder was like, oh yeah, there's totally files there, absolutely. They were there the whole time. Why do you even ask? And I know that state management is a hard problem, I am aware. I have felt this pain. I have been the person who has introduced some bugs related to it, but that's not where I want to experience it. Finder is one of those applications that I want to just implicitly trust, never question whether or not it's just sneakily telling me that there are files that are not there or vice versa. So anyway, software. STEPH: I'm worried for your OS. I feel like there's a theme lately [chuckles] in the struggles of your computer. CHRIS: On a related note, I had to turn off transparency in my terminal because it was making my computer get very hot. [chuckles] STEPH: Oh no, you're not a hacker any more. CHRIS: I'm not. [chuckles] I just have a weird screen that's just dark. And jellybeans is my color scheme, so there's that going on. That's in Vim specifically. Pure is my prompt. That's a lovely little prompt. But lots of Day-Glo colors on just a black background, not the cool hacker transparency. I have lost some street cred. STEPH: What is your prompt? What did you say it is? CHRIS: Pure. STEPH: Pure, I don't know that one. CHRIS: It is by Sindre Sorhus; I think is his name. That's his Twitter handle, GitHub name. He is a prolific open-source creator in the Node world, particularly. But he created this...I think it's a Bash and a Zsh prompt. It might be for others as well. It's got a bunch of features. It's pretty fast. It's minimal. It got me to stop messing around with my prompt, which was mostly what I was going for. And it has a nice benefit that occasionally now I'll be pairing with someone, and I'll be like, "Your prompt looks like my prompt. Everything is familiar. This is great." STEPH: Well, if you get back in the waters of messing around with your prompts again, I'm using Starship. And I hadn't heard of Pure before, but I really like Starship. That's been my new favorite. CHRIS: Wow. STEPH: Wow. CHRIS: I mean, on the one hand… STEPH: You're welcome. [laughs] CHRIS: On the one hand, thank you. On the other hand, again, let me lead in with the goal was to stop messing around with my prompt. So you're like, oh, cool. Here's another prompt for you, though. [chuckles] STEPH: [laughs] But my goal is to nerd snipe you into trying more things because it's fun. CHRIS: I don't know if you know this, but I am impervious to nerd sniping. STEPH: [laughs] CHRIS: So try as you might, I shall remain steady in my course of action. STEPH: Are we playing two truths and a lie? Is that what we're doing today? [laughs] CHRIS: Nah, just one lie. It's easier. Everybody wins one lie. STEPH: [laughs] CHRIS: But anyway, in other news, we're going to do a segment called this really grinds my gears. That's today's segment, which is much like when I do a good idea, terrible idea. But this is one that I'm sure I've talked about before. But there's been some stuff that I saw moving around on the internet as one does, and it got these ideas back into my head. And it's around the phrase single-page application. I am not a fan of that phrase or SPA as the initialism. Thank you, Edward Loveall, for teaching me the difference between an initialism and an acronym. I really hope I'm getting it right, by the way, [laughs] SPA as people call them these days. I feel weird because of how much I care about this thing, how much I care about this idea, and how much whenever I hear this acronym, I get a little bit unhappy. And so there's a part of it that's I really do think our words shape our thinking. And I think single-page application has some deeply problematic ideas. Most notably, I think one of the most important things about building web applications is the URL. And those are different pages, at least in my head. I don't know of a different way to think about this. But if you are not emphasizing the URL and the fact that the URL is a way to address different pages or resources within your application, then you are throwing away one of the greatest advancements that humankind has made, in my mind. I care a lot about URLs; it turns out. And it's not inherent to an SPA that you will not be thinking about URLs. But again, in that idea that our words shape our thinking, by calling it an SPA, by leaning into that idea, I think you are starting down a path that leads to bad outcomes. I'm going to pause there because I'm getting kind of ranty. I got more to say on the topic. But what do you think? STEPH: Yeah, these are hot takes. I'm into it. I'm pretty sure that I know why URLs are so important to you and more of your feelings around why they're important. But would you dive in a bit deeper as to why you really cherish URLs, and why they're so important, and why they're one of the greatest advancements of humanity? CHRIS: [laughs] It sounds lofty when you say it back to me, but yeah. It's interesting that as you put into a question, it is a little bit hard to name. So there are certain aspects that are somewhat obvious. I love the idea that I can bookmark or share a given resource or representation of a resource very simply. Like the URL, it's this known thing. We can put hyperlinks in a document. It's this shared way to communicate, frankly, very complex things. And when I think of a URL, it's not just the domain and the path, but it's also any query parameters. So if you imagine faceted search on a website, you can be like, oh, filter down to these and only ones that are more than $10, and only ones that have a future start date and all those kinds of nuance. If you serialize that into the URL as part of the query param, then that even more nuanced view of this resource is shareable is bookmarkable is revisitable. I end up making Alfred Workflows that take advantage of the fact that, like, oh, I can look at this URL scheme, and I can see where different parts are interpolated. And so I can navigate directly to any given thing so fast. And that's deeply valuable, and it just falls naturally out of the idea that we have URLs. And so to not deeply embrace that, to not really wrap your arms around it and give that idea a big hug feels weird to me. STEPH: Yeah, I agree. I remember we've had this conversation in the past, and it really frustrates me when I can't share specific resources with folks because I don't know how to link to it. So then I can send you a link to the application itself to the top URL. But then I have to tell you how to find the information that I thought was really helpful. And that feels like a step backward. CHRIS: Yeah. That ability to say, "Follow this link, and then it will be obvious," versus "Go to this page, click on this thing, click on the dropdown, click on this other thing." Like, that's just a fundamentally different experience. So one of the things that I saw that got me thinking about this was I saw folks referring to single-page applications but then contrasting them with MPAs, which are multiple-page applications. STEPH: So the normal application? [laughs] CHRIS: And I was like, whoa, whoa, everybody. You mean like a website or a web app? As much as I was angry at the first initialism, this second one's really getting me going. But it really does speak to what are we doing? What are we trying to build? And as with anything, you could treat this as a binary as just like there are two options. There are either websites which, yeah, those have got a bunch of URLs, and that's all the stuff. And then there are web apps, and they're different. And it's a bundle of JavaScript that comes down, boots up on the client, and then it's an app thing. And who cares about URLs? I think very few people would actually fall in that camp. So I don't really believe that there is a dichotomy here. I think, as always, it's a continuum; it's a spectrum. But leaning into the nomenclature of single-page application, I think pushes you more towards that latter end of the spectrum. I think there are other things that fall out of it. Like, I believe deeply in having the server know more, have more of the logic, own more of the logic, own more authorization and routing, and all of those things because really great stuff falls out of that. And that one has more of a trade-off, I'd say. But I won't name any names, but there is a multiple billion-dollar company whose website I had to interact with recently. And you land on their page on their marketing site. And then, if you click log in, it navigates you to the application, so a separate domain or a separate subdomain, the application subdomain, and the login page there. And the login page renders, and then I go to fill in my username and password. Like, my mouse makes it all the way to click on the little box or whatever I'm doing if I'm using keyboard things. But I have enough time to actually start to interact with this page. And then suddenly, it rips away, and it actually just renders the authenticated application because it turns out I was already logged in. But behind the scenes, they're doing some JWT dance around that they're checking; oh no, no, you're already logged in, so never mind. We don't need to show you the login page, but I was already on the login page. And my feeling is this sort of brittle UI; this sort of inconsistency erodes my trust in that application, particularly when I'm on the login page. That is a page that matters. I don't believe that they're doing anything fundamentally insecure. But I do have the question in my head now. I'm like, wait, what's going on there, everybody? Is it fine? Was that okay? Or if you see something that you shouldn't see and then suddenly it's ripped away from you, if you see half of a layout that's rendered on a page and then suddenly you see, no, no, no, you actually don't have access to that page, that experience erodes my trust. And so, I would rather wait for the server to fully resolve, determine what's going to happen, and then we get a response that is holistically consistent. You either have access, or you don't, that sort of thing. Give me a loading indicator; give me those sorts of things. I'm fine with that. But don't render half of a layout and then redirect me back away. STEPH: I feel like that's one of the problems with knowing too much because most people are not going to pick up on a lot of the things that you're noticing and caring deeply about where they would just see like, oh, I was logged in and be like, huh, okay, that was a little weird, but I'm in and just continue on. Versus other folks who work very closely to this who may recognize and say, "That was weird." And the fact that you asked me to log in, but then I was already logged in, did you actually log me in correctly? What's happening? And then it makes you nervous. CHRIS: Maybe. Probably. But I wonder…the way you just said that sounds like another dichotomy. And I would say it's probably more of a continuum of an average not terribly tech-savvy user would still have a feeling of huh, that was weird. And that's enough. That's a little tickle in the back of your brain. It's like, huh, that was weird. And if that happens enough times or if you've seen someone who uses an application and uses it consistently, if that application is reasonably fast and somewhat intuitive and consistent, then they can move through it very quickly and very confidently. But if you have an app that half loads and then swaps you to another page and other things like that, it's very hard to move confidently through an application like that. I do think you're right in saying that I am over-indexed on this, and I probably care more than the average person, but I do care a lot. I do think one of the reasons that I think this happens is mobile applications came along, and they showed us a different experience that can happen and also desktop apps for some amount of time this was true. But I think iOS apps, in particular really great ones, have super high fidelity interactions. And so you're like, you're looking at a list view, and then you click on the cell for that list view. And there's this animated transition where the title floats up to the top and grows just a little bit. And the icon that was in the corner moves up to the corner, and it gets a little bigger. And it's this animated transition to the detailed view for that item. And then if you go back, it sort of deanimates back down. And that very consistent experience is kind of lovely when you get it right, but it's really, really hard. And people, I think, have tried to bring that to the web, but it's been such a struggle. And it necessitates client-side routing and some other things, or it's probably easiest to do if you have those sorts of technologies at play, but it's been a struggle. I can't think of an application that I think really pulls that off. And I think the trade-offs have been very costly. On the one positive note, there was a tweet that I saw by Sarah Drasner that was talking about smooth and simple page transitions with the shared element transition API. So this is a new API that I think is hoping to bring some of this functionality to the web platform natively so that web applications can provide that higher fidelity experience. Exactly how it'll work whether or not it requires embracing more of the single-page application, client-side routing, et cetera, I'm not sure on that. But it is a glimmer of hope because I think this is one of the things that drives folks in this direction. And if we have a better answer to it, then maybe we can start to rethink the conversation. STEPH: So I think you just said shared element transitions. I don't know what that is. Can you talk more about that? CHRIS: I can try, or I can make a guess. So my understanding is that would be that sort of experience where you have a version of a certain piece of content on the page. And then, as you transition to a new page, that piece of content is still represented on the new page, but perhaps the font size is larger, or it's expanded, or the box around it has grown or something like that. And so on mobile, you'll often see that animate change. On the web, you'll often see the one page is just completely replaced with the other. And so it's a way to have continuity between, say, a detailed view, and then when you click on an item in it, that item sort of grows to become the new page. And now you're on the detail page from the list page prior. There's actually a functionality in Svelte natively for this, which is really fancy; it's called crossfade. And so it allows you to say, "This item in the component hierarchy in the first state of the application is the same as this item in the second state of the application." And then, Svelte will take care of transitioning any of the properties that are necessary between those two. So if you have a small circle that is green, and then in the next state of the application, it's a blue rectangle, it will interpolate between those two colors. It will interpolate the shape and grow and expand it. It will float it to its new location. There is a really great version of it in the Svelte tutorial showing a to-do list. And so it's got a list on the left, which is undone things, and a list on the right that is done things. And when you click on something to complete it, it will animate it, sort of fly across to the other list. And if you click on it to uncomplete, it will animate it and fly back. And what's great is within Svelte because they have this crossfade as a native idea; all you need to say is like, "It was on this list, now it's on this list." And as long as it's identifiable, Svelte handles that crossfade and all the animations. So it's that kind of high-fidelity experience that I think we want. And that leads us to somewhat more complex applications, and I totally get that. I want those experiences as well. But I want to ask some questions, and I want to do away with the phrasing single-page application entirely. I don't want to say that anymore. I want to say URLs are one honking good idea. Let's have more of those. And also, just to name it, Inertia is a framework that allows me to build using some of the newer technologies but not have to give up on URLs, give up on server-side logic as the primary thing. So I will continue to shout my deep affection for Inertia in this moment once again. STEPH: Cool. Thanks. That was really helpful. That does sound really neat. So in the ideal world, we have URLs. We also have high fidelity and cool interactions and transitions on our pages. We don't have to give it a fancy name like single-page application or then multi-page application. I do wonder, with our grumpiness or our complaint about the URLs, is that fair to call it grumpy? CHRIS: It's fair to call it grumpy, although you don't need to loop yourself in with me. I'm the grump today. STEPH: [laughs] CHRIS: You're welcome to come along for the ride if you'd like. And I'm trying to find a positive way to talk about it. But yeah, it's my grumpytude. STEPH: Well, I do feel similarly where I really value URLs, and I value the ability to bookmark and share, like you said earlier. And I do wonder if there is a way to still have that even if we don't have the URL. So one of the things that I do is I'll inspect the source code. And if I can find an ID that's for a particular header or section on the page, then I will link someone to a section of that page by then adding the ID into the URL, and that works. It's not always great because then I have to rely on that being there. But it's a fix, it's a workaround. So I wonder if we could still have something like that, that as people are building content that can't be bookmarked or the URL doesn't change explicitly, or reference that content, to add more thoughtful bookmark links, essentially, or add an ID and then add a user-facing link that says, "Hey, if you want to link someone to this content, here you go." And under the hood, it's just an ID. But most people aren't going to know how to do that, so then you're helping people be able to reference content because we're used to URLs, so just thinking outside the box. I wonder if there are ways that we can still bookmark this content, share it with people. But it's okay if the URL isn't the only way that we can bookmark or reference that content. CHRIS: It's interesting that you bring that up, so the anchor being the thing after the hash symbol in the URL. I actually use that a ton as well. I think I built a Chrome extension a while back to try what you're saying of I'll inspect the DOM. I did that enough times that I was like, what if the DOM were to just tell me if there were an ID here and I could click on a thing? Some people's blogs...I think the thoughtbot blog has this at this point. All headers are clickable. So they are hyperlinks that append that anchor to the URL. So I wouldn't want to take that and use that functionality as our way to get back to URLs that are addressing resources because that's a way to then navigate even further, which I absolutely love, to a portion of the page. So thinking of Wikipedia, you're on an article, but it's a nice, long article. So you go down to the section, which is a third of the way down the page. And it's, again, a very big page, so you can link directly to that. And when someone opens that in their browser, the browsers know how to do this because it's part of the web platform, and it's wonderful. So we've got domains, we've got paths, we've got anchors, we've got query params. I want to use them all. I want to embrace them. I want that to be top of mind. I want to really think about it and care about that as part of the interface to the application, even though most users like you said, are not thinking about the shape of a URL. But that addressability of content is a thing that even if people aren't thinking of it as a primary concern, I think they know it when they...it's one of those like, yeah, no, that app's great because I can bookmark anything, and I can get to anything, and I can share stuff with people. And I do like the idea of making the ID-driven anchor deep links into a page more accessible to people because you and I would go into the DOM and slice it out. Your average web user may not be doing that, or that's much impossible to do on mobile, so yes, but only more so in my mind. [laughs] I don't want to take anchors and make them the way we do this. I want to just have all the URL stuff, please. Mid-roll Ad Now we're going to take a quick break to tell you about today's sponsor, Orbit. Orbit is mission control for community builders. Orbit offers data analytics, reporting, and insights across all the places your community exists in a single location. Orbit's origins are in the open-source and developer relations communities. And that continues today with an active open-source culture in an accessible and documented API. With thousands of communities currently relying on Orbit, they are rapidly growing their engineering team. The company is entirely remote-first with team members around the world. You can work from home, from an Orbit outpost in San Francisco or Paris, or find yourself a coworking spot in your city. The tech stack of the main orbit app is Ruby on Rails with JavaScript on the front end. If you're looking for your next role with an empathetic product-driven team that prides itself on work-life balance, professional development, and giving back to the larger community, then consider checking out the Orbit careers page for more information. Bonus points if working in a Ruby codebase with a Ruby-oriented team gives you a lot of joy. Find out more at orbit.love/weloveruby. STEPH: I have a confession from earlier when you were talking about the examples for those transitions. And you were describing where you take an action, and then the page does a certain motion to let you know that new content is coming onto the page and the old content is fading away. And I was like, oh, like a page reload? We're just reimplementing a page reload? [laughs] That's what we have? CHRIS: You have a fancy, though. STEPH: Fancy, okay. [laughs] But that felt a little sassy. And then you provided the other really great example with the to-do list. So what are some good examples of a SPA? Do you have any in mind? I think there are some use cases where...so Google Maps, that's the one that comes to mind for me where URLs feel less important. Are there other applications that fit that mold in your mind? CHRIS: Well, so again, it's sort of getting at the nomenclature, and how much does the acronym actually inform what we're thinking about? But taking Google Maps as an example, or Trello is a pretty canonical one in my mind, most people say those are single-page applications. And they are probably in terms of what the tech actually is, but there are other pages in those apps. There's a settings page, and there's a search page, and there's this and that. And there's like the board list in Trello. And so when we think about Trello, there is the board view where you're seeing the lists, and you can move cards, and you can drag and drop and do all the fancy stuff. That is a very rich client-side application that happens to be one page of the Trello web app and that one being higher fidelity, that one being more stateful. Stateful is probably the thing that I would care about more than anything. And so for that page, I would be fine with the portion of the JavaScript that comes down to the client being a larger payload, being more complex, and probably having some client-side state management for that. But fundamentally, I would not want to implement those as a true client-side application, as a true SPA. And I think client-side routing is really the definition point for me on this. So with Trello, I would probably build that as an Inertia-type application. But that one page, the board page, I'd be like, yeah, sorry, this is not going to be the normal Inertia thing. I'm going to have to be hitting JSON endpoints that are specifically built for this page. I'm going to have a Redux store that's local. I'm going to lean into all of that complex state management and do that within the client-side app but not use client-side routing for actual page-level transitions, the same being true for Google Maps. The page where you're looking at the map, and you can do all sorts of stuff, that's a big application. But it is one page within the broader website, if you will. And so, I still wouldn't want client-side routing if I can avoid it because I think that is where I run into the most problems. And that thing I was talking about where I was on the login page for a second, and then I wasn't; I do not like that thing. So if I can avoid that thing, which I have now found a way to avoid it, and I don't feel like I'm trading off on that, I feel like it's just a better experience but still reserving the right to this part of the application is so complex. This is our Wiziwig drag and drop graphical editor thing, cool. That's going to have Redux. That's going to have client-side state management, all that stuff. But at no point does single-page application feel like the right way to describe the thing that we're building because I still want to think about it as holistically part of the full web app. Like the Trello board view is part of the Trello web app. And I want it all to feel the same and move around the same. STEPH: Yeah, that makes sense. And it's funny, as you were mentioning this, I pulled up Google Maps because I definitely only interact with that heavy JavaScript portion, same for Trello. And I wasn't even thinking about the fact that there are settings. By the way, Google Maps does a lot. I don't use hardly any of this. But you make a great point. There's a lot here that still doesn't need such heavy JavaScript interaction and doesn't really fit that mold of where it needs to be a single-page app or even needs to have that amount of interactivity. And frankly, you may want URLs to be able to go specifically to these pages. CHRIS: That actually is an interesting, perhaps counterpoint to what I'm saying. So if you do have that complex part of one of your applications and you still want URL addressability, maybe you need client-side routing, and so that becomes a really difficult thing to answer in my mind. And I don't necessarily have a great answer for that. I'm also preemptively preparing myself for anyone on the internet that's listening to this and loves the idea of single-page applications and feels like I'm just building a straw man here, and none of what I'm saying is actually real and whatnot. And although I try to...I think we generally try and stay in the positive space of like what's good on the internet. This is a rare case where I'm like, these are things that are not great. And so I think in this particular case, leaning into things that I don't like is the way to properly capture this. And giant JavaScript bundles where the entirety of the application logic comes down in 15-megabyte download, even if you're on 3G on a train; I don't like that. I don't like if we have flashes of a layout that they can get ripped away b; it'secause it turns out we actually aren't authorized to view that page, that sort of thing. So there are certain experiences from an end client perspective that I really don't like, and that's mostly what I take issue with. Oh, also, I care deeply about URLs, and if you don't use the URL, then I'm going to be sad. Those are my things. Hopefully, that list is perhaps a better summary of it than like...I don't want it to seem like I'm just coming after SPA as a phrase or a way of thinking because that's not as real of a conversation. But those particular things that I just highlighted don't feel great. And so I would rather build applications that don't have those going on. And so if there's a way to do that that still fits any other mold or is called whatever, but largely what I see called an SPA often has those sorts of edge cases. And I do not like those edge cases. STEPH: Yeah, I like how you're breaking it down where it's less of this whole thing like I can't get on board with any of it. You are focusing on the things that you do have concerns with. So there can be just more interesting, productive conversations around those concerns versus someone feels like they have to defend their view of the world. I have found that I think I'm a bit unique in this area where when people have a really differing opinion than mine, that gets me really excited because then I want to know. Because if I believe very strongly in something and I just think this is the way and then someone very strongly says like, "No, that's not," I'm like, "Oh yeah. Okay, we should talk because I'm interested in why you would have such a different opinion than mine." And so, I typically find those conversations really interesting. As long as everybody's coming forward to be productive and kind, then I really enjoy those conversations. CHRIS: That is, I think, an interesting frame that you have there. But I think I'm similar, and hopefully, my reframing there puts it in the way that can be a productive conversation starter as opposed to a person griping on a podcast. But with that said, that's probably enough of me griping on a podcast. [chuckles] So what's up in your world, Steph? STEPH: Oh, there are a couple of things going on. So I am in that pre-vacation chaotic zone where I'm just trying to get everything done. And I heard someone refer to it recently as going into a superman or superwoman mode where you're just trying to do all the things before you go, which is totally unreasonable. So that has been interesting. And the name of the game this week has been delegate, delegate, delegate, and it seems to be going fairly well. [chuckles] So I'm very excited for the downtime that I'm about to have. And some other news, some personal news, Utah, my dog, turns one. I'm very excited. I'm pretty sure we'll have a dog birthday party and everything. It's going to be a thing. I'll share pictures on Twitter, I promise. CHRIS: So he's basically out of the puppy phase then. STEPH: Yeah, the definition for being a puppy seems to be if you're a year or younger, so he will not be an adult. Teenager? I don't know. [laughs] CHRIS: What about according to your lived experience? STEPH: He has calmed down a good bit. CHRIS: Okay, that's good. STEPH: He has gotten so much better. Back when we first got him, I swear I couldn't get 15 minutes of focus where he just needed all the attention. Or it was either constant playtime, or I had to put him in his kennel since we're using that. That was the only way I was really ever getting maker's time. And now he will just lounge on the couch for like an hour or two at a time. It's glorious. And so he has definitely calmed down, and he is maturing, becoming such a big boy. CHRIS: Well, that is wonderful. Astute listeners, if you go back to previous episodes over the past year, you can certainly find little bits of Utah sprinkled throughout, subtle sounds in the background. STEPH: He is definitely an important part of the show. And in some other news, I have a question for you. I'm in need of some consulting help, and I would love to run something by you and get your thoughts. So specifically, the project that I'm working on, we are always in a state where there's too much to do. And even though we have a fairly large team, I want to say there's probably somewhere between 7 and 10 of us. And so, even though we have a fairly...for thoughtbot, that's a large team to have on one project. So even though there's a fair number of us, there's always too much to do. Everything always feels like it's urgent. I can't remember if I've told you this or not, but in fact, we had so many tickets marked as high priority that we had to introduce another status to then indicate they're really, really high, and that is called Picante. [chuckles] CHRIS: Well, the first part of that is complicated; the actual word that you chose, though, fantastic. STEPH: I think that was CTO Joe Ferris. I think he's the one that came up with Picante. So that's a thing that we have, and that really represents like, the app is down. So something major is happening. That's like a PagerDuty alert when we get to that status where people can't access a page or access the application. So there's always a lot to juggle, and it feels a lot like priority whiplash in terms that you are working on something that is important, but then you suddenly get dragged away to something else. And then you have to build context on it and get that done. And then you go back to the thing that you're working on. And that's a really draining experience to constantly be in that mode where you're having to pivot from one type of work to the other. And so my question to you (And I'll be happy to fill in some details and answer questions.) is how do you calm things down? When you're in that state where everything feels so urgent and busy, and there's too much to do, how do you start to chip away at calming things down where then you feel like you're in a good state of making progress versus you feel like you're just always putting out fires or adding a band-aid to something? Yeah, that's where I'm at. What thoughts might you have, or what questions do you have? CHRIS: Cool. I'm glad you brought an easy question that I can just very quickly answer, and we'll just run with that. It is frankly...what you're describing is a nuanced outcome of any number of possible inputs. And frankly, some of them may just be like; this is just the nature of the thing. Like, we could talk about adding more people to the project, but the mythical man-month and that idea that you can't just throw additional humans at the work and suddenly have that makes sense because now you have to coordinate between those humans. And there's that wonderful image of two people; there's one line of communication. Three people, suddenly there are a lot more lines of communication. Four people, wow. The exponential increase as you add new people to a network graph, that whole idea. And so I think one of the first questions I would ask is, and again, this is probably not either/or. But if you would try and categorize it, is it just a question of there's just a ton of work to do and we're just not getting it done as quickly as we would want? Or is it that things are broken, that we're having to fix things, that there are constant tweaks and updates, that the system doesn't support the types of changes that we want, so any little thing that we want to do actually takes longer? Is it the system resisting, or is it just that there's too much to do? If you were to try and put it into one camp or the other. STEPH: It is both, my friend. It is both of those camps. [chuckles] CHRIS: Cool. That makes it way easier. STEPH: Totally. [laughs] To add some more context to that, it is both where the system is resistant to change. So we are trying to make improvements as we go but then also being respectful of the fact if it is something that we need to move quickly on, it doesn't feel great where you never really get to go back and address the system in a way that feels like it's going to help you later. But then, frankly, it's one of those tools that we can use. So if we are in the state where there's too much to do, and the system is resisting us, we can continue to punt on that, and we can address things as we go. But then, at some point, as we keep having work that has slowed down because we haven't addressed the underlying issues, then we can start to have that conversation around okay; we've done this twice now. This is the third time that this is going to take a lot longer than it should because we haven't really fixed this. Now we should talk about slowing things down so we can address this underlying issue first and then, from now on, pay the tax upfront. So from now on, it's going to be easier, but then we pay that tax now. So it is a helpful tool. It's something that we can essentially defer that tax to a later point. But then we just have to have those conversations later on when things are painful. Or it often leads to scope creep is another way that that creeps up. So we take on a ticket that we think, okay, this is fairly straightforward; I don't think there's too much here. But then we're suddenly getting into the codebase, and we realize, oh, this is a lot more work. And suddenly, a ticket will become an epic, and you really have one ticket that's spiraled or grown into five or six tickets. And then suddenly, you have a person that's really leading like a mini project in terms of the scope of the work that they are doing. So then that manifests in some interesting ways where then you have the person that feels a bit like a silo because they are the ones that are making all these big changes and working on this mini-project. And then there's the other one where there's a lot to do. There are a lot of customers, and there's a lot of customization for these customers. So then there are folks that are working really hard to keep the customers happy to give them what they need. And that's where we have too much to do. And we're prioritizing aggressively and trying to make sure that we're always working on the top priority. So like you said, it's super easy stuff. CHRIS: Yeah. To say it sincerely and realistically, you're just playing the game on hard mode right now. I don't think there is any singular or even multiple easy answers to this. I think one question I would have particularly as you started to talk about that, there are multiple customers each with individualized needs, so that's one of many surface areas that I might look t say, "Can we sort of choke things off there?" So I've often been in organizations where there is this constant cycle of the sales team is going out. They're demoing against an InVision mock. They're selling things that don't exist. They're making promises that are ungrounded and, frankly, technically infeasible or incredibly complicated, but it's part of the deal. They just sold it, and now we have to implement it as a team. I've been on teams where that was just a continuing theme. And so the engineering team was just like, "We can never catch up because the goalpost just keeps moving." And so to whatever degree that might be true in this case, if there are ten different customers and each of them right now feels like they have an open line to make feature requests or other things like that, I would try to have the conversation of like, we've got to cut that off right now because we're struggling. We're not making the forward progress that we need to, and so we need to buy ourselves some time. And so that's one area that I would look at. Another would be scope, anywhere that you can, go into an aggressive scope cutting mode. And so things like, well, we could build our own modal dialogue for this, but we could also use alert just like the JavaScript alert API. And what are all of the versions of that where we can say, "This is not going to be as nice, and as refined, and as fitting with the brand and feel and polish of the website. But ways that we can make an application that will be robust, that will work well on all of the devices that our users might be using but saves us a bunch of development time"? That's definitely something that I would look to. What you described about refactoring is interesting. So I agree with we're not in a position where we can just gently refactor as we find any little mess. We have to be somewhat ruthless in our prioritization there. But like you said, when you get to that third time that a thing is working way harder, then take the time to do it. But really, like just every facet of the work, you just have to be a little better. If you're an individual developer and you're feeling stuck, raise your hand all the earlier because that being stuck, we don't have spare cycles right now. We need everybody to be working at maximum efficiency. And so if you've hit a wall, then raise your hand and grab somebody else, get a pair, rubber duck, whatever it is that will help you get unstuck. Because we're in a position where we need everybody moving as fast as they can. But also to say all of those aren't free. Every one of those where you're just like, yeah, do it the best you can. Dial it up to 11 on every front. That's going to drain the team, and so we have to also be mindful of that. This can't be forever. And so maybe it is bringing some new people onto the team or trying to restructure things so that we can have smaller communication channels. So it's only four people working together on this portion of the application, and therefore their communication lines are a bit simpler. That's one way that we can maybe save a little bit. But yeah, none of these are free. And so, we also need to be mindful that we can't just try harder forever. [laughs] That's a way to burn out the team. But what you're describing is like the perfect storm of every facet of this is difficult, and there's no singular answer. There's the theory of constraints (I think I'm saying that right.) where it's like, what's the part of our process that is introducing the most slowdowns? And so you go, and you tackle that. So if you imagine a website and the app is slow is the report that you're getting, and you're like, okay, what does that mean? And you instrument it, and you log some stuff out. And you're like, all right, turns out we have tons of N+1s. So frankly, everything else doesn't matter. I don't care if we've got a 3 megabyte JavaScript bundle right now; the 45 N+1s on the dashboard that's the thing that we need to tackle. So you start, and you focus on that. And now you've removed that constraint. And suddenly, the three megabyte JavaScript bundle is the new thing that is the most complicated. So you're like, okay, cool, let's look into tree shaking or whatever it is, but you move from one focus to another. And so that's another thing that could come to play here is like, which part of this is introducing the most pain? Is it feature churn? Is it unrealistic sales expectations? Is it developers getting stuck? And find the first of those and tackle it. But yeah, this is hard. STEPH: Yeah, it is. That's all really helpful, though. And then, I can share some of the things that we are experimenting with right now and then provide an update on how it's going. And one of the things that we're trying; I think it's similar to the theory of constraints. I'm not familiar with that, but based on the way you described it, I think they're related. One of the things that we are trying is breaking the group into smaller teams because there are between 7 and 10 of us. And so, trying to jump from one issue to the next you may have to really level up on different portions of the application to be able to make an impact. And there are areas that we really need infrastructure improvements and then essentially paving the way for other people to be able to move more quickly. We do have to prioritize some of that work as well. So if we break up into smaller teams, it addresses a couple of areas, or at least that's the goal is to address a couple of areas. One is we avoid having silos so that people aren't a bottleneck, or they're the only ones that are really running this mini-project and the only one that has context. Because then when that person realizes the scope has grown, bringing somebody on to help feels painful because then you're in an urgent state, but now you have to spend time leveling someone else up just so that they can help you, and that's tough. So the goal is that by having smaller teams, we will reduce that from happening because at least everything that feels like a small project...and by feels like a small project, I mean if we have more than one ticket that's associated with the same theme, that's going to start hinting at maybe this is more than just one ticket itself, and it might actually belong to an epic. Or there's a theme here, and maybe we should have two people working on this. And breaking people into groups, then we can focus on some people are focused more on the day-to-day activity. Some people are focused on another important portion of the codebase as we have what may be extracted. I'm going to say this, but we're going to move on, maybe extracted into its own service. [laughs] I know that's a hot one for us, so I'm just going to say it. CHRIS: I told you I can't be nerd sniped. This is fine. Let's continue on. [laughs] STEPH: [laughs] And then a small group can also focus on some of those infrastructure improvements that I was alluding to. So smaller teams is something that we are trying. We are also doing a really great job. I've been really happy and just proud of the team where folks are constantly reaching out to each other to say, "Hey, I'm done with my ticket. Who can I help?" So instead of immediately going to the backlog and grabbing the next thing. Because we recognize that because of this structure where some people are some silos, they have their own little mini backlog, which we are working to remove that to make sure everything is properly prioritized instead of getting assigned to one particular person. But we are reaching out to each other to say, "Hey, what can I do to help? What do you need to get done with your work before I go pick something else up?" The other two things that come to mind is who's setting the deadlines? I think you touched on this one as well. It's just understanding why is it urgent? Does it need to be urgent? What is the deadline? Is this something that internally we are driving? Is this something that was communicated without talking to the rest of the team? Is this just a really demanding customer? Are they setting unrealistic expectations? But having more communication around what is the sense of urgency? What happens if we miss this deadline? What happens if we don't get to this for a week, a month? What does that look like? And then also, my favorite are retros because then we can vote on what feels like the highest priority in terms of pain points or run these types of experiments like the smaller teams. So those are the current strategies that we have. And I'm very interested to see how they turn out because it is a tough way. Like you said, it's challenge mode, and it is going to burn people out. And it does make people feel fatigued when they have to jump from one priority to the next. So I'm very interested. It's a very interesting problem to me too. It just feels like something that I imagine a lot of teams may be facing. So I'm really excited if anybody else is facing a similar issue or has gone through a similar challenge mode; I'd love to hear how your team tackled it. CHRIS: Yeah, I'm super interested to hear the outcome of those experiments. As a slightly pointed question there, is there any semi-formal version of tracking the experiments? And is it just retro to retro that you're using for feedback on that? I've often been on teams where we have retro. We come up with it, and we're like, oh, this is a pain point. All right, let's try this. And then two weeks later, we're like, oh, did anyone actually do that? And then we just forget. And it's one of those things that I've tried to come up with better ways to actually manage, make slightly more explicit the experiments, and then have a timeline, have an almost scientific process of what's the hypothesis? What's the procedure? What are the results? Write up an executive summary. How'd it go? STEPH: We are currently using retro, but I like that idea of having something that's a bit more concrete. So we have action items. And typically, going through retro, I tend to revisit the action items first as a way to kick off retro. So then that highlights what did we do? What did we not do? What do we not want to do anymore? What needs to roll over to the current iteration? And I think that could be just a way that we chat about this. We try something new, and we see how it's going each week in retro. But I do like the idea of stating upfront this is what we're looking to achieve because I think that's not captured in the retro action item. We have the thing that we're doing, but we haven't captured this is what we hope to achieve by taking this experiment on. Mid-roll Ad And now a quick break to hear from today's sponsor, Scout APM. Scout APM is leading-edge application performance monitoring that's designed to help Rails developers quickly find and fix performance issues without having to deal with the headache or overhead of enterprise platform feature bloat. With a developer-centric UI and tracing logic that ties bottlenecks to source code, you can quickly pinpoint and resolve those performance abnormalities like N+1 queries, slow database queries, memory bloat, and much more. Scout's real-time alerting and weekly digest emails let you rest easy knowing Scout's on watch and resolving performance issues before your customers ever see them. Scout has also launched its new error monitoring feature add-on for Python applications. Now you can connect your error reporting and application monitoring data on one platform. See for yourself why developers call Scout their best friend and try our error monitoring and APM free for 14 days; no credit card needed. And as an added-on bonus for Bike Shed listeners, Scout will donate $5 to the open-source project of your choice when you deploy. Learn more at scoutapm.com/bikeshed. That's scoutapm.com/bikeshed. STEPH: As for the other thing that you mentioned, I do have an idea for that because a former client that I worked with where we had experiments or things that we wanted to do, we were using Trello. And so we would often take those action items…or it was even more of a theme. It wasn't something that could be one-and-done. It was more of a daily reminder of, hey; we are trying this new thing. And so, we want to remind you each day to embrace this experiment and this practice. And so we would turn it into a Trello ticket, and then we would just leave it at the top of the board. So then, each day, as we were walking the board, it was a nice reminder to be like, hey, this is an ongoing experiment. Don't forget to do this. CHRIS: I do like the idea of bringing it into a stand-up potentially as like that's just a recurring point that we all have. So we can sort of revisit it, keep it top of mind, and discard it at some point if it's not useful. And if we're saying we're doing a thing, then let's do the thing and see how it goes. So yeah, very interested to hear the outcomes of the experiment and also the meta experiment framework that you're going to build here. Very interested to hear more about that. And just to say it again, this sounds like your perfect storm is not quite right because it doesn't sound like there's a ton of organizational dysfunction here. It sounds like this is just like, nah, it's hard. The code's not in perfect shape, but no code is. And there's just a lot of work to be done. And there are priorities because frankly, sometimes in the world, there are priorities, and you're sort of at the intersection of that. And I've been in plenty of teams where it was hard because of humans. In fact, that's often the reason of we're sort of making up problems, or we're poorly communicating or things like that. But it sounds like you're in the like, nope, this is just hard. And so, in a way, it sounds like you're thinking about it like, I don't know, it's kind of the challenge that I signed up for. Like, if we can win this, then there's going to be some good learnings that come out of that, and we're going to be all the better. And so, I wish you all the best of luck on that and would love to hear more about it in the future. STEPH: Thank you. And yeah, it has been such an interesting project with so many different challenges. And as you've mentioned, that is one area that is going really well where the people are wonderful. Everybody is doing their best and working hard. So that is not one of the competing challenges. And it is one of those; it's hard. There are a lot of external factors that are influencing the priority of our work. And then also, some external areas that we don't have control over that are forcing some of those deadlines where customers need something and not because they're being fussy, but they are themselves reacting to external deadlines that they don't have control over. So it is one of those where the people are great, and the challenges are just real, and we're working through them together. But it's also hard. But it's helpful chatting through all the different challenges with you. So I appreciate all of your thoughts on the matter. And I'll report some updates once I have some more information. On that note, shall we wrap up? CHRIS: Let's wrap up. STEPH: The show notes for this episode can be found at bikeshed.fm. CHRIS: This show is produced and edited by Mandy Moore. STEPH: If you enjoyed listening, one really easy way to support the show is to leave us a quick rating or a review in iTunes as it helps other people find the show. CHRIS: If you have any feedback for this or any of our other episodes, you can reach us at @_bikeshed on Twitter. And I'm @christoomey. STEPH: And I'm @SViccari. CHRIS: Or you can email us at hosts@bikeshed.fm. STEPH: Thanks so much for listening to The Bike Shed, and we'll see you next week. All: Byeeeeeeee! Announcer: This podcast was brought to you by thoughtbot. thoughtbot is your expert design and development partner. Let's make your product and team a success.

Greater Than Code
249: #TechIsHiring + eSports and Software Engineering with Chad Stewart

Greater Than Code

Play Episode Listen Later Sep 8, 2021 54:46


01:19 - Chad's Superpower: Making People Laugh * Using Comedy to Deal with Problems 03:46 - #TechIsHiring (https://twitter.com/search?q=%23TechisHiring&src=typeahead_click&f=live) * Bot: @TechIsHiring (https://twitter.com/TechIsHiring) * Amplifying Others * Using Networks For Good * Being a Bridge/Connector * Actively Working to Benefit Others (Possibly Professionally?!?) * Diversify Tech (https://diversifytech.co/) * @DiversifyTechCo (https://twitter.com/diversifytechco) * Veni Kunche (https://twitter.com/venikunche?lang=en) * Greater Than Code Episode #212: Diversify Tech with Veni Kunche (https://www.greaterthancode.com/diversify-tech) 31:03 - eSports and Software Engineering * Street Fighter (https://streetfighter.com/) * Strategy & Feedback * Online vs In-Person Events * GGPO Rollback Networking SDK (https://www.ggpo.net/) * github.com/pond3r/ggpo (https://github.com/pond3r/ggpo) * Tony Cannon (https://github.com/pond3r) * Chad on Twitch (https://www.twitch.tv/ChadRStewart) * Netherrealm Studios (https://www.netherrealm.com/) * Guilty Gear Strive (https://www.guiltygear.com/ggst/) Reflections: John: The simple act of connecting others with a hashtag. Mandy: Follow @GreaterThanCode (https://twitter.com/greaterthancode?lang=en) for new content and RTs! Amplify others. Mando: Drawing comparisons and connections between playing fighting games and software development and engineering. Bringing experience from one realm to another. Chad: The possibility of being a connector in a professional sense and the validation of comparing fighting games and software development as a discipline worth talking about. This episode was brought to you by @therubyrep (https://twitter.com/therubyrep) of DevReps, LLC (http://www.devreps.com/). To pledge your support and to join our awesome Slack community, visit patreon.com/greaterthancode (https://www.patreon.com/greaterthancode) To make a one-time donation so that we can continue to bring you more content and transcripts like this, please do so at paypal.me/devreps (https://www.paypal.me/devreps). You will also get an invitation to our Slack community this way as well. Transcript: JOHN: Welcome to Greater Than Code, Episode 249. I'm John Sawers and I'm here with Mando Escamilla. MANDO: Thanks, John. Hi, and I'm here with my friend, Mandy Moore. MANDY: Hey! And I'm here with our guest, Chad Stewart. As a software engineer and esports athlete with many years of experience in both fields, Chad dives deep into issues that he comes across, drilling down to the core of a problem and finds solutions others may miss, letting the lessons of the journey guide future expeditions into the unknown. If you're confused at comparing esports to software engineering, you'd be surprised at how similar they are. Welcome, Chad. CHAD: Thanks. Thanks for having me. I never imagined that writing that [chuckles] and it being literally the thing introduces me on a podcast. Wow, I'm sorry, I'm a little mesmerized. MANDY: I really do want to ask about how we compare esports to software engineering. But before we do that, we have to ask our standard question that we ask all of our guests, which is what is your superpower and how did you acquire it? CHAD: So, funny enough, I listened to a few episodes before coming on and I wanted to tell a silly joke, but that segues into what my superpower is, is I make people laugh. That's just something I like doing, it's a big thing for me and I guess, I acquired it by watching Cartoon Network way too early in my life [laughs] and just being, I don't know, I just enjoy making people laugh. I enjoy making myself laugh and I guess, it's just fun. To be honest, that's what I kind of do on Twitter all day, make people laugh. MANDY: That's awesome. That's a great coping mechanism. Especially these days, I find myself doing the same thing, trying to make light of situations so things don't seem as dark. [laughs] JOHN: Years ago, a friend of mine, it wasn't exactly a criticism but he was like, “Man, you'll laugh at any joke,” and I'm like, “Oh, that's the option. I can either laugh more, or I can laugh less and I choose more.” MANDY: Yeah, I always say I'd rather laugh than cry about it. CHAD: I completely agree. There's so much sadness in the world at the moment. We've been in this pandemic for an extended period of time now and there's been people who've lost family members and friends, people who've lost livelihoods. Obviously, comedy is not necessarily going to fix all of that, but at the very least, it makes it easier to deal with those problems. We were all hoping that we were going to come out of that this year and it feels like that's not even going to happen. There is some level of normalcy, but long story short, definitely I'd much rather see people smiling and having a good time and if I can add more of that into the world, then great. Just trying to make people laugh and it's fun, it's good for you. It's physically good for you. MANDY: That's awesome. So I know that I reached out to you to come on the show because I wanted to talk to you specifically about, I think it's something you started around the beginning of the whole pandemic situation, The #TechIsHiring hashtag, do you want to talk about that a little bit? CHAD: Yeah. So #TechIsHiring is a hashtag that is specifically for job seekers and people who are looking for candidates for their jobs. What I noticed is people would post their jobs, or post that they're looking for a job on Twitter and depending on how strong their network is, it would get a lot of traction, or not so much traction at all. So I was thinking, there are people out there who are maybe looking for work and to be fair, it started mostly from that in the first place. More people are looking for an opportunity and posting about it on Twitter and if their network isn't very strong, or for whatever reason, the tweet doesn't get a lot of traction, then it may potentially become difficult for them. I started the hashtag so that if I saw a tweet like that, I could add it to the hashtag. If you have a job tweet that you're looking for somebody to fill this position, I'd just go out and ask if I could add it to the hashtag and if you say yes, I just tag it with #TechIsHiring and obviously, the same for if somebody is looking for an opportunity. It's been fairly successful like within the last couple of weeks, there've been a lot more usage of it. I don't necessarily have great ways of coming up with data on obviously how, if people are really benefiting from it outside of me maybe probing to see, but for the most part, I have the Twitter bot that I created for the hashtag. I have notification alerts for that and it's like my phone goes off all the time with notifications and I'm just like, “Hey, at least people are using it and people are retweeting it.” So I'm pretty happy about that. There's a few things I'd like to do to kind of expand it, but I'm definitely happy with where it is right now. JOHN: So you're saying that the need you saw was that people are posting about that they're looking for a job, but maybe their network isn't particularly good, or they're not getting a lot of reach out of that and so, they're not really getting the benefit of all of Twitter being available to them. So you wanted to create this way to amplify those tiny voices that are saying, “Hey, I need a job.” CHAD: Yes, yes, yes. To be fair, the #TechIsHiring, it's growing, but ultimately, what I wanted to be is pretty much the thing that people can rely on. You know what I mean? So in essence, I want to build the network for #TechIsHiring so I go and look for like jobs and for people who are looking for jobs, I will actively go and search for them on Twitter and initially, this was to add to the hashtag because obviously, the hashtag didn't have too much when I started it and it's just become a habit of mine. There are definitely some people who are looking who, by the time I get come across their tweet, which may be even a week after they've done it, they've maybe had two, or three, or so retweets and likes. I was like, “Hey, if I add this to the hashtag, maybe at the very least, people will see it.” My network is decent. It's not the best I'm not super Twitter famous, but I have a fair amount of people that follow me. So what I do when I'm asking is I always make sure to like and retweet whatever I find and ask so at the very least, other people on my network could see it and so, even if they don't reply—and to be fair, some people don't reply for whatever reason, maybe they never see it, or whatever. But even if they don't reply, at least some people are seeing it potentially and even a lot more now, I will retweet some people's job postings, or some people's looking for jobs tweets and people will retweet it themselves. I'm just trying to, I guess, be that bridge, or I guess, middleman. I don't know, I can't come up with a better term, but I've just tried to be that person that helps because it's like, everybody's kind of been there. Like, you're looking for a job and you're doing your absolute best and you're stuck with whatever information you have. Information, or resources you have and it's like, if I can make this thing so that people can of latch onto it and use that, then maybe a lot more people can get in contact with somebody who can offer them an opportunity. But that's pretty much it. MANDY: That's awesome. I used to use the Greater Than Code account to do a lot of that—amplify the voices of others—and I used to be on Mondays, I would go and fill a buffer queue of just content that I found on the internet that I could retweet others. Ever since my daughter got “laid off the school,” that's been a little more difficult, but I'm hoping that in the near future, I can start that up again and do the same thing with the #GreaterThanCode hashtag. But what you're doing, it's not easy work and it takes time to sit there, look, curate, put all that stuff together, and then amplify it out and get people to notice it, and engage with posts and it's hard work. So thank you for trying to be that bridge and trying to use your network for good. I think that was awesome and part of the reason I wanted to get you on the show was because you've been doing it for a really long time and you keep up with it and it's amazing. CHAD: Yes. Thank you, thank you. There's a few things that I want to do like, I would like to reach out to more employers and it's just always an awareness thing. I just definitely like to reach out to more employers and be like, “Hey, there are candidates here who are tweeting on Twitter and they're in this hashtag, you can look through that.” I kind of do it, but I do it like – so I was thinking about it the other day and to be honest, I actually did this way before I actually officially started the hashtag. When I first got on Twitter, or at least when I first got on tech Twitter, what I would do is I'd be doing the Twitter thing and just kind of oh, this person's interesting so I'd make a reply and have maybe a small conversation. And then I would see somebody who's like, “Hey, I'm looking for work,” and I was like, “Hey, I passed the thread that's talking about all of these jobs.” So I'd just link it to them and I was like, “Hey, hopefully, they'll get something out of it,” and I just did that. That was just something that just came to be naturally like sometimes I'll be on Reddit and they'll be like, “Oh there was some job posts here. I'll just link it to this person, they're looking for somebody,” and I guess, it makes sense that I ended up making a hashtag to do that in a more official capacity as opposed to one off. But what I definitely want to do is just to reach out to people, or to more people actually who have positions and I probably should reach out directly to the people who I'm retweeting who's saying that they're looking for people and link people, especially people who I've already retweeted and be like, “Hey there's a candidate here,” and just stuff like that. That's something I want to do. There are a few organizations that talk about jobs on Twitter a lot and I want to reach out to them and just ask them if they could use the hashtag. I tend not to mess with them too much because they're out trying to make money and so on and so forth, and it feels kind of weird. I don't want to retweet their stuff. I don't know what their marketing plan is. But I just want to reach out to them and be like, “Hey I'm doing this thing” because I don't have any numbers on who benefits from the hashtag. It's all in hopes of type thing. So I just want it to be a little bit more direct with, “Hey employers, there's actually people here that you can look at.” So that's pretty much the direction that I'm hoping to go in while obviously, also, actually adding opportunities and people who are looking for options. But hopefully, people start doing it on their own, which is the ultimate goal is that I don't have to curate it myself because everybody understands that it exists. But for now, I don't mind doing that work. MANDY: So I love the fact that you're a connector in that sense. That's what I consider myself and what I would do before actually being a host/panelist on the show. I feel like you should really hook up with this person and talk about this thing because do you know this person? And then I've had so many people come back from conversations with all the people that I've hooked up on podcasts and they're like, “So-and-so is like my new best internet friend now, thank you so much for introducing us.” [chuckles] I love being able to take people and being like, “You like this, you like this, do you two know each other?” and forging relationships like that. That's one of my greatest superpowers I feel so it seems like you're in the same boat, which is really cool. CHAD: Yeah. I would definitely say that I've been doing that for some time more in an unofficial capacity. It's more like, “Oh, this person needs something. I know somebody who can help with that.” So I go, “Hey, this person needs so-and-so,” and I just bring them together. I haven't been doing it too much of late. Well, I guess, I have because of the hashtag, but I haven't been doing it too much lately because I feel like the tables have turned; I'm the person that's in need more often than not. But it's definitely something I would definitely like to do more. Again, obviously I'm doing it with the hashtag, but it's definitely like, I've always been like that even as a kid. I've just always been the person who will just help just for helping's sake. I'm not necessarily trying to like, “Oh, I'm going to help you so you can help me.” Like, no. “You need something. I think I can help you with that. What can we do?” I don't know, I like working to benefit people. I feel good doing that. You know what I mean? You hear people like, “Hey, things really worked out because of what you did,” and I'm just like, “Hey, I'm happy I could help.” I've always been like that since I was a kid and I intend on continuing to do that professionally. I guess, now that you bring it up, I'm like, “I really should think about it more actively” because I do it very passively. It's usually, I have a friend who's looking for a specific job and I will just be minding my own business on Twitter and then I'll see a job that looks like something he wants and then I'll just send it to him. [laughs] He'll give me his reply and he'll be like, “Oh, thanks for thinking about me.” It's like, “Yeah, no problem. I just want to help.” I've always been that person. MANDO: I'm really glad you said that because I've been hearing you talk about how much you get out of this in addition to everything else that other folks get out sparked this question in my head, which was that have you thought about doing this professionally? Because there are a lot of people who get paid very well to do this kind of stuff very poorly and so, I wonder [laughs] if someone who knows someone who does it well and actually has a love for doing this kind of stuff, if you thought about making this an actual full-time job. I just went through a hiring process and we just hired an engineer over here. I would gladly engage with recruiters that I knew were doing the work that you're trying to do as opposed to folks that are just downloading whatever they can off of Indeed, or other resume sites and tossing them in my face with little to no filtering. CHAD: I actually have never thought of it as something professional to do only because I don't know, because I always viewed each event that happened where I'm helping somebody as “Hey, I helped that person.” I never viewed it as a group of, “I can do this professionally.” I don't know, like it's never really crossed my mind literally until you mentioned it. I don't know, it would be interesting. I would love for my career to be – to be honest, I don't even know what my career should look like at this point. [laughter] I'm just all over the place. I just like being here. [laughs] I just literally enjoy being here. Like I said, I haven't really thought about it professionally. Actually, literally after this, I'll probably give it some thought, but I'm going to continue doing this regardless. Even if, say for instance, I don't think about it as doing it as a job where I get paid, but definitely just because I did something that just feels good to me and I get to help other people, I do get the benefit of feeling good that I helped somebody else, I'm going to continue to do it. But I never even thought of it as something that you make money off but. MANDO: A lot of people super do. [laughs] I cannot stress that enough. A lot of people super do and it is my experience that very, very few of them are worth what you end up paying them. CHAD: Yeah. [laughs] I understand. JOHN: You were talking about connecting with other organizations on Twitter around hiring that made me think about Diversify Tech. We had the founder, Veni Kunche, on the show last year, I think it was and she's been doing fantastic work over there. That was the first organization that came to mind when you were talking about reaching out, so they do good stuff. CHAD: Yes. I was definitely thinking about reaching out to them especially because they do a lot of work on Twitter specifically. So right now, the way I think about it, the hashtag obviously lives on Twitter, but it's mainly focused for the Twitter community only because at the time, I was just like, “Hey, people on Twitter are posting these things, I should make some space to put all of these things on Twitter.” Obviously, it doesn't necessarily have to be. Could end up being an entire organization, an entire company, or something like that. But specifically, because they do so much work on Twitter already, I definitely want to reach out to them. MANDY: That's cool. So I want to go back to the thing we were talking about with reading your bio about comparing eSports to software engineering. Can you tell us more about that? CHAD: Yeah. So it's been something that I've been thinking about for a while. I say eSports athletes, I don't want to say professionally, but I compete playing fighting games. I've been doing that for about 11 years now. Pretty much the way I view it is when Street Fighter IV officially released on consoles, which was, I think February 9th. It was sometime in February 2009, that's when I kind of view my “eSports career” starting because I've been playing fighting games because of that. I played fighting games a lot longer before that, but when I started taking them seriously and competitively. During that time, I was in school for software engineering at Nova Southeastern University and what I have found, that I especially kind of feel this now, is my abilities as a software engineer and as a competitive fighting game player tend to complement each other. I haven't had, I don't want to say official, but I haven't sat down and wrote this out, or have a thesis. But I find that there's a lot of comparison to fighting games and to making software so much so that I've been playing fighting games for a while and I would consider myself, if we're going to use the same terminology as software engineering, a senior fighting game here. MANDO: Love it. [laughter] CHAD: As funny as it is, when I have conversations with people and what they would consider a senior software engineer, it's like I do more, or less the same things in fighting games. For instance, a question of tooling—and you can definitely chime in because I'm not going to pretend that I'm the most knowledgeable in the industry, especially from actual experience standpoint. But from my understanding for a senior engineer, they understand various tools, they understand when to use them, what situations to use them in, when not to use them, how to tie things together, teaching other people how to do these things, they advocate for their project that's a little bit out of the fighting game. I guess, not really. But I guess the thing is that same thought process, the using the various tooling, is how I would—I'm looking literally back at my system just to think. [chuckles] But it's the how I play fighting games at this point like, I have tooling in my head. For instance, I'll be playing a match against a type of player and I'm like, “Okay, this type of player is so on and so forth. This generally works on this type of player. So let me apply this,” and so, “Okay, it's working,” or, “Oh, it's not working. Let me make some adjustments here.” I just feel like it's the same type of – I can't speak directly on that, but it feels so much like the same type of decisions except with software tools. When do you use MySQL? When do you use Mongo? Obviously, you don't have an opponent. You could make a construct of what an opponent is if you want to keep that same type of thought process. But you use tools for specific situations and then you make adjustments based on the way the situation changes, maybe based on your features that the user wants, or based on what you've been finding has been successful, or you want to maybe add a feature, or so-and-so. I just feel like the thought process is similar. Even the way you use basic tools in programming variables, functions and so on and so forth and how you don't even necessarily think about them, but you obviously use them because you have to. You do the same thing with fighting games. In fighting games, our primitives is we call them normal where it's you literally press the button and you do nothing else and an attack comes out. You know what I mean? So you can view them as primitives for, I guess, programming fighting games. I don't have a better term [laughs] to make the comparison, but I don't know. It's like for me, as a fighting game player and as a software engineer, I feel like there's a huge comparison. I'm still growing as a software engineer, but I'm actually getting to the point where I'm trying to look at my fighting game career, or my growth in fighting games and try to compare them to my growth in software engineering and see oh, where did I have issues here and how did I solve them? But that's just my thing like, I just feel like there's a comparison there that I definitely would like to explore a lot more, especially since obviously I'm in both industries, you know what I mean? But that's kind of why I make that comparison. JOHN: Yeah. I was thinking you could think of it okay, the opponent is a right heavy database load that needs to scale 10x and we're going to attack it with sharded Mongo and RabbitMQ. [laughs] CHAD: Right, and then how does that work? Because it's about the feedback, right? JOHN: Yeah. CHAD: It's the same thing in fighting games; it's about the feedback. I don't want to say it's more important than fighting games, but the thing is, a lot of people in fighting games, they have their strategy and they use it and it either works, or it doesn't work and they live and die by the strategy. But a lot of the times, it's you start with one thing because that's what you know and then you get feedback from the opponent, you know what I mean? You're generally trying to make the feedback favorable for you, but at the end of the day, it's just you leveraging the feedback from the opponent. It's the same thing—in fact, it's extremely stressed in software engineering that you do get feedback from your users, or get feedback from wherever from either directly from your users, or say, for instance, there is some issue with your implementation, you have logs and so on and so forth. So it's like, what do you do with all of this information and like I said, I just feel like there is a comparison there that is really interesting. Again, I don't necessarily have this as a thesis, or anything. It's—I've been saying this a lot—something I definitely want to explore, but it's just really interesting to me. I still play fighting games. It's been years. I played two different Street Fighters and I've used the same mindset and I still have the same comparisons. I feel like there's something there that's worth exploring. MANDO: Yeah, man. Just like what you were saying, Mike Tyson had a famous quote, “Everyone's got a plan till they get punched in the face,” and that's what you're talking about exactly with the fighting games and what John was talking about with the [laughs] heavy database load in an application. I come from the technical operations world where we absolutely view all kinds of things in adversarial terms everything from malicious users to external and internal systems to, on our very worst days, other developers and engineers. [laughs] It is through no fault, but you have to be careful to make sure that someone can't accidentally do something bad to a production database because no one's and everyone makes mistakes. Going back to what you were saying about drawing the connections between being a senior engineer and a senior fighting game expert, which I love that idea. In both cases, you build up this experience, this learned experience over time to where you learn. The reason that I don't want you to have production database access isn't because I want to keep things away from you, it's because nobody's perfect and I'm not perfect, which is why I don't have it either. It's too easy to make these kinds of mistakes, but you have to balance that with your ability to actually get your job done. Like, don't tell me I can't have database access when I need database access to get this stuff done. I imagine this the same way in fighting games. You want to win so you have to do stuff. You can't just sit there crouching in the back the whole time waiting, you know what I mean? CHAD: I'm literally trying to formulate a scenario, but trying to form it in a way where I can actually explain it without using terminology and just going over everybody's head. So a similar situation would be in fighting games is that you would play a specific range so that you can go in and out of the opponent's range, but they can't attack you. I don't know if this is actually a good scenario—the only other thing that they could do is jump and in essence – or jump at you and so, you're holding this range to force these two options. In your scenario, it's more like oh, this is to make sure that things don't happen. Bad things don't happen in a project. This is more okay, I know that if I'm too close, they can do more, or less anything they want to me so I'm going to hold this range so that they can and then I'm just going to leave them with these two options that I can control. This is not necessarily [inaudible], right? [laughs] MANDO: No, it's 100% perfect, man. It's the same exact idea of me giving you production database access, but I only give it to you with a read-only user, or with certain CPU quotas, or something like that. So I'm making sure that what you can do is constrained in ways, like you said, that I can control and it's not only just to be defensive, it's to make sure that you get, I don't know, the most positive outcome of the situation. CHAD: Right. MANDO: Which, in a fighting game, is to win. CHAD: Right. Like – [overtalk] MANDO: And in my case, is to not get paged in the middle of the night. CHAD: Right, yes. In fighting games, the goal is to one, the whole thing is to generally avoid getting hit. But if you can get hit, you at least know where and you can deal with it. This is more from a defensive scenario; I can come up with offensive scenarios, too. I just lose it trying to keep it in line with the same thought process. MANDO: For sure. CHAD: But it's like, I personally have not been in that situation that you described in terms of a production database. But the fact that I could come up with a scenario that is similar to something you described and they're completely, I don't want to say, obviously it's not completely, but it's different realms. It's just something interesting to me and then again, obviously I'm still learning, but I'm not learning. I'm more of an expert in this thing. So I think that using my knowledge here to make the comparison to what I would say need to learn, or need to understand, or just how to approach a problem. I don't know. It's all jumbled in my head, but it's just fun. It's just something fun that I want to explore more. I've been saying explore more a lot. JOHN: Yeah. It'd make a great series of blog posts. CHAD: Yes. I've been thinking of that, or making videos because then especially since fighting games is a very visual thing. I've been streaming recently, so it's just like, I can actually play the game and then maybe I can make a video on the game a little bit and then make some comparisons to basic ideas in software development. It's something that I really wanted to play with very recently, especially because I still play the game and I enjoy it, but sometimes, it's frustrating because the internet is internet, right? But it's something I just want to explore, something that's really fun for me. MANDO: So what are you playing right now, specifically? What are you competing in? CHAD: So I play Street Fighter V. I don't compete too much anymore mainly just because there aren't as many active communities. So I live in Jamaica and there aren't that many communities, not necessarily for eSports in general, but specifically for Street Fighter. So I still watch a lot of events on Twitch and I watch a lot of match videos on YouTube, but I'll play the game here and there and then obviously, I'm still trying to grow as an engineer. I spend a lot of time doing that, but that, I would say a Street Fighter V. There are a few other fighting games that I'm interested in. Street Fighter V, it's being phased out. Eventually, a new version of that game will come out and for Street Fighter specifically, a lot of the times when they release a new game, it's fairly different from the previous one. So you take your fundamental tools and then you build on that with what the game gives you. But that's what I'm playing right now. When I say I'm a fighting game player, I mainly play Street Fighter. There's some people who play a variety of fighting games and it's extremely difficult because a lot of fighting games are very different. The intricate decisions that you make are very different like, just how you approach the opponent is very different. But that's mainly what I've been focusing on for right now. I'm hoping to get back into it once things settle down bit more—obviously, the pandemic put a damper on all manner of physical events. So once we are able to get back together when it's more safe, I'm really hoping to take part in that. MANDO: Yeah. That was going to be my next question was how many of these competitions happen online versus having to have to be in-person because of response times and refresh rates? I've known a couple of people throughout my life who do this competitive gaming and the idea of trying to do it over the internet would just make them gasp like, “Oh, never. Never.” [laughs] CHAD: Right. It's gotten significantly better than 10 years prior. 10 years prior, I won't say it was a nightmare, but it was pretty close. It's gotten better and I'm not going to pretend that, at the very least, the game that I play Street Fighter V is perfect. There are other fighting games where they've made significant strides in making the online experience better. Funny enough, there's a project that recently, what I mean by recently within the last 2 years, got open sourced called GGPO. It stands for Good Game Peace Out. It means absolutely nothing to nobody; it's just everybody's just used GGPO. But the creator is somebody who used to run the largest fighting game event. He's more of an advisory person now, but he used to run the largest fighting game event in the world. He created, they call it Netcode. It's an unofficial term for just how the network works in terms of dealing with multiple players, but he created a system where generally, when you have two video games, I don't want to say generally, but for the most part, a lot of video games would try to keep the game as synced as possible. So if one of the two systems—within fighting, it's usually two systems. If one of the two systems went out of sync, then the other one would immediately stop what it's doing and try to sync up with the other system. So this person, I don't remember his name. He has a twin brother. We call them the Canon brothers. I don't remember which one did it. Either way, he created a system where the idea was instead of keeping both systems synced all the time, making that the main thing that the network does, is we'll have both video feeds play on their own. We still would do some syncing here and there. But what we will do is just ensure that – how do I describe it? Say for instance, you would have the one video feed being specifically on a specific frame. For people who don't know anything about video is that to get video, you just literally redraw images over a period of time and you get motion from that and we, in fighting games, use that specifically to understand how fast things are, what are our options, and so on and so forth. So in fighting games, it's generally 60 frames per second that we use. Say for instance, the video feed for one device is on frame two and the video feed for another device is on frame three. Like, the devices are out of sync, but what they will do is for the device that's ahead, they will say, “Okay, this is what happened from the device behind,” and they call it rollback. They call it rollback Netcode and they will roll ahead device back to what the behind device was. The idea is to keep the video feeds as fluid as possible, because timing is a big deal for fighting games. So he did all of this work and it became a really, really popular option for net play, but he owned the rights to it at the time and he had owned the rights for 15, maybe not 15 years but for a long period of time and he recently opened sourced it. So it's something that I'm hoping that more game developers will be able to pick up on it and use it in their fighting games because otherwise, they would have to do one of two things. They'd obviously have to get the licensing from him and use it in their game and he would provide technical support on how to implement it, or they would have to come up with their own thing and a lot of the times—in fact, funny enough, Street Fighter V is a famous example of this—is they won't get the implementation just quite right and then it just makes it a bad experience for the players. But again, I guess, going back to the conversation about online fighting games, it's been getting better. Like I said, that's one option. There's a company called NetherRealm Studios for people who, if you remember Mortal Combat, they're the company that works with that, makes Mortal Combat. They themselves have developed, I don't know too much about that personally, but their Netcode—I use air quotes—is “exceptional.” One of the big challenges is playing somebody from across the United States. So California to New York would be a good example. That's usually a horrible time for both people, but with both, GGPO and Mortal Combat, their Netcode is so good that that actually can happen. I'm sorry if I'm sounding super technical, but there's another game that got rereleased recently, Guilty Gear Strive, where the Netcode is so good that people are playing cross continents. Now it's reasonable for them. Whereas, if you left the state, or if you started playing as somebody from the East Coast to the Midwest, it wasn't even practical. It just didn't make sense. So there's been great strides in that. Especially because of the pandemic, a lot of events have been online. As a community, we've transitioned fairly well into doing a lot of online events. There's a lot of games that have been running online events and a lot of people who run very famous offline events have now transitioned to running good online events until the time that we can actually get back together. It's been an interesting and tough time, but I feel like everybody has stepped up to meet the challenge. MANDO: Yeah. No, it looks like it's Tony and I was just like reading through the Read Me for GGPO and I don't know a thing about this thing, but if what the Read Me says is true, it is super, super cool. CHAD: Yeah. MANDO: It uses input prediction and speculative execution to send inputs to the lagging side, or the non-lagging side to mimic what the lagging side would normally be sending over. CHAD: Right. MANDO: So the person who isn't lagging, to them it just feels like they're still playing and then it does the same thing to the other side. So [chuckles] even though you may not necessarily be playing each other, it still feels as though you're playing and not hanging and trying to do the sync like you were describing. CHAD: Right, and it does that until both sides get information about the specific frame and what happened and so – [overtalk] MANDO: What actually happened, right. CHAD: Yeah, or what actually happened and then it would like, “Okay, this is what actually most people were trying to do.” It's really interesting. Well, I think I still have the project on my machine. Funny enough, something that I actually really wanted to do. I'm not allowed to say that because I'm, to be quite honest, outside of the explanation. I'm lost from a technical point of what exactly is going on, but I'm hoping somebody is maintaining the project. I haven't seen anybody do anything with it, maybe even extending it. To be honest, I would love to go into it. But for the moment, it's way out of my wheelhouse. [chuckles] Because I think it's really important, you know what I mean and I would definitely love to see more game developers use it and if it kind of comes down to me doing something, you know. [laughter] CHAD: I just think it's a really important utility, at the very least, for fighting games because I've heard of other people trying to use it for other applications as well. It was obviously made specifically for fighting games. MANDO: Right. CHAD: But I just want to see the project continue and want to see more people using it. I don't know if it needs to be fleshed out because it was fleshed out during its development for an extended period of time, but I just definitely would like to see it leveraged more in fighting games. If nothing else, for my own sake, because I hate playing bad matches. [laughter] JOHN: So I think now is the time of the show where we do what we call reflections, which is basically each of us are going to talk about the things that we are going to take away from this conversation—maybe new ideas to think about, or just interesting points that have been made today. For me, it's definitely just the tiny little act that you started with this hashtag; just connecting a couple people and just making this little thing and now it's gotten bigger and bigger and you're putting the effort into it to make it bigger and all those things. But just people have gotten jobs based on what you've done, undoubtedly. It seems inevitable even if you don't have numbers on it. It's such a simple act of just noticing two people that should be connected and could be connected and making that simple. It's a retweet, or it's a little DM, or whatever it is, sometimes those small acts can have such big consequences. So it's wonderful to see that you noticed that that was a thing that could happen and that you could make happen and that you're continuing to put your effort into it just to make it bigger and bigger and be even more impactful. MANDY: For me, I also go back to the beginning of the conversation when I mentioned that we had the Greater Than Code Twitter handle and how I used to be super diligent about amplifying others, putting others content out there and then I stopped. I'm going to make that my back-to-school goal is to come back and get that done. So listeners, stay tuned. There's going to be some new content on Twitter. Follow us if you aren't already and also, make the effort to do the same thing. Do some simple retweets for others, amplify others. If you've got an audience, somebody else might not and just that simple act, as John said, can really help others. So be more cognizant and do that sometimes. MANDO: Yeah, it's great. Or the way that Chad, you took this thing that you love, you spent a lot of time, a fair amount of your life devoting to becoming an expert at fighting games and then taking that and being able to draw comparisons and make connections between that and the stuff that you do every day. When you were describing these kinds of connections, the idea that popped into my mind was there's someone, or someone's out there right now who grew up playing fighting game and they're super, super, super deep into it like, talking about all the stuff that you were talking about. Talking about NetCode, talking about hit boxes and refresh rate, all that stuff, normal. And then at the same time, they might be trying to break into the software engineering world and they're an expert over here and not over here. So hearing you talk about these connections and what if this in the fighting world could be reflected in the software engineering world? That might be just the kind of stuff that they need to hear so they can make those connections, those same types of connections in their minds and bring that experience from one realm into another, into the professional realm. It just got me thinking about all the different ways like you hear people often say things like, “Well, I don't have anything to blog about. I don't have anything to make a talk, or a presentation app,” and it's just not true. It's just like, there's so many people in the world who need this kind of content and how John was saying, this kind of content can make a material difference in someone's life and then that little bit starts a chain reaction. It's like a snowball going down a hill and you get someone who is able to start working now as a software engineer and by the end of their career, imagine all of the money and all of the stuff they've been able to do for themselves and their family and their friends and their loved ones, all because of something that you thought was some dumb blog post, or getting too technical in a podcast about stuff, you know what I mean? Like, it's important, it matters, and we need it and we need more of it. So thanks. I guess, this part was my way of saying thanks for coming in and talking about this stuff, but also, encouraging other folks, myself included, to not be afraid to talk about things, or just a connection in your mind because it's not just you, it's other people as well. CHAD: My reflection is one about making the whole connector person. I didn't even know it was something that could be done in a professional sense. Like I said, I do it because I'm helping people. That's the only thing that's in my mind about it. It's like, “Oh, this person needs something. I can potentially help them get it done,” and that's all that was in my head. So just having that as an option, as hey, you can actually make money doing this. There's that and to be honest, the validation that making the comparison to fighting games and all the technicalities of fighting games and software development as a discipline, there is that connection and it's something worth talking about and bringing it to other people and is potentially interesting. Obviously, I'm at least half decent at playing fighting games. [laughter] So I can talk about that and I'm still growing as a software engineer so it's almost like I have a foundation. It's like, I haven't made that journey yet, but I have a roadmap and I can potentially draw that same map and then give it to other people and they may be able to potentially leverage it for themselves, which again, I'm helping. You know what I mean? [laughs] MANDO: Yeah, man. That's how it works, brother. That's how it works. CHAD: Well, yeah, that's definitely – I don't know. I'm really happy about at least that kind of validation, if nothing else. So thank you very much. MANDY: Well, Chad, it's been wonderful talking to you. MANDO: Thanks for coming on, man. It's been great. MANDY: Yeah. Thank you for so much for coming on this show and thank you to our listeners. So we'll see you all next week. Special Guest: Chad Stewart.

That's A Gay Ass Podcast
"Do U Know About Twitter Porn?" w/ Greta Titelman

That's A Gay Ass Podcast

Play Episode Listen Later Sep 8, 2021 57:05


Do YOU know about Twitter porn?? Greta Titelman joins Eric to ask this question in addition to bathing in a gorgeous pool of female pop star nostalgia. We also discuss our Regina Hall moment in Scary Movie. the controversy of thrift shopping, and Nicole Kidman's most recent bad wig. An instant classique!!For the video episode + bonus content: www.patreon.com/gayasspodcastSocial Meeds:Greta's Instagram (@gertiebird) and Twitter (@gertie_bird)Eric's Instagram (@EricWillz) and TikTok (@EricWillzTT)That's A Gay Ass Podcast's Instagram  (@gayasspodcast)Subscribe to the Patreon! www.patreon.com/gayasspodcast

The Dale Jr. Download - Dirty Mo Media
356 - Jade Gurss: Behind Driver 8

The Dale Jr. Download - Dirty Mo Media

Play Episode Listen Later Sep 7, 2021 152:31


Behind nearly every superstar is a publicist. For a young Dale Earnhardt Jr, the man behind the public-machine that became the Dale Jr and the Budweiser number-eight was a man named Jade Gurss. Not many will know the name, but he was a major player in the growth and trajectory of Dale Earnhardt Jr.'s Hall of Fame NASCAR career. For the first time ever, Jade and Dale Jr sit down to talk about the good-old-days and some that were far from it. While doing public relations for Budweiser, Jade was the man managing Dale Jr behind the scenes. From at-track interviews, to magazine articles, to appearances on major television shows, Jade Gurss was making things happen. Gurss and Dale Jr talk about some of the biggest things they did together, from presenting at the Video Music Awards, being on the Late Show, to Dale Jr hosting an episode of MTV cribs, it was a publicity path that brought Dale, and NASCAR, to areas of American culture that most drivers never went. Just how did some of it come about and how did the introverted Dale Jr handle being thrust into the spotlight on such a stage? It wasn't always simple. Dale and Jade even joke about sitting between Jessica Simpson and Mandy Moore at the VMA's to a blundered appearance on David Letterman's show. The print about the second-generation driver didn't just come in racing publications, the exposure soon rocketed from Sports Illustrated all the way to Playboy and Rolling Stone magazine. This conversation isn't just a two-way street either. Co-host Mike Davis, a long-time employee and friend of Dale, got his introduction and big opportunity getting hired by Jade Gurss to fill-in for him on the Bud-8. The role grew Davis' public relations career to new heights. They re-unite and tell stories of what it was like managing a young and difficult driver during years that saw everything from major parties to major appearances. They also put it all out on the table about Davis' decision to leave Gurss and take a full-time job with Jr Motorsports. Takes of boxing ring black eyes with Arturo Gatti and rock-star-like bandana coverups highlight this insightful conversation. They also get deep about Dale's Mike Wallace interview and how Dale Jr believed his father pulled him from the burning Corvette racecar at Sonoma. Jade opens up about writing the book about Dale Jr., Driver #8, and the meeting with Teresa Earnhardt and Ty Norris right before it went to print. Before Jade showed up, Dale Jr and Mike Davis chit-chat about a cute video of Isla, that hints at the desire to be a racecar driver someday. Was it just cute or does Dale take it seriously? They also talk about the coming-of-age process of Jr Motorsports driver Noah Gragson and how he's developed relationships with sponsors that have helped him grow in his career. AskJr presented by Xfinity delivers some tough questions for Dale, including one about the role of the flagman that gets him thinking about something he's never paid much attention to. He shares a story about the first time TJ Majors spotted a Cup car and might've exxagerrated the green flag call by a few corners. Dale discovers that he'll be racing against his great friend Josh Berry at Richmond this week, as Dale prepares for his lone time behind the wheel of a NASCAR racecar in 2021. The DJD gang poke fun at each other, mainly at producer Matthew Dillner's expense, and have a great time during this packed episode of awesomeness. Learn more about your ad choices. Visit podcastchoices.com/adchoices

The Bike Shed
307: Walking Contradictions

The Bike Shed

Play Episode Listen Later Sep 7, 2021 36:56


On this episode, Chris talks about testing external services and dissects a tweet on refinements for Result. Steph talks about thoughbot's recent improvement to their feature flag system. Links: refinements For Result (https://twitter.com/alassek/status/1430683412264857600) Faking External Services in Tests with Adapters by German Velasco (https://thoughtbot.com/blog/faking-external-services-in-tests-with-adapters) Testing Interaction with 3rd-party APIs (https://thoughtbot.com/upcase/videos/testing-interaction-with-3rd-party-apis) Transcript: CHRIS: Hello and welcome to another episode of The Bike Shed, a weekly podcast from your friends at thoughtbot about developing great software. I'm Chris Toomey. STEPH: And I'm Steph Viccari. CHRIS: And together, we're here to share a bit of what we've learned along the way. So, Steph, what's new with you? STEPH: Hey, Chris. Well, today is Summit Day at thoughtbot, and it's the day where all the bots gather, and we hang out, and we chat, and we play games. And it's a lot of fun. We're actually taking more of a respite this year just because life has been taxing. And so we decided to give people more of the day off. So we still had some fun events, but most of it is everybody gets a chill day. Do something that brings you joy is the theme of the day. But we had Lightning Talks, which is my favorite thing that we do on Summit Day because I realize that I just work with the coolest people, and they have such interesting things to talk about. And we had such a variety of topics. So one of them, Alex Chen taught us acronyms in K-pop. And Sam Kapila, our resident foodie, taught us about a variety of spices. And one of my favorite talks was by Akshith Yellapragada, and it's the top 10 best limo entrances by The Bachelor, and it was phenomenal. And I really want to share some stuff that I learned with you. CHRIS: The Bachelor like the TV show? STEPH: Yeah, like the TV show. Are you familiar with it? Have you seen it before? CHRIS: I am familiar with it. I know it exists. I know that there's a spinoff, The Bachelorette. And I believe we have now exhausted my information on the matter. STEPH: [laughs] That's fair. For anyone that hasn't seen the show, the show revolves around a single person. For the bachelor, it's a single bachelor who dates a number of people over several weeks, and then they narrow down the people. There are elimination rounds, and the whole goal is for them to find their true love. So each week, someone is eliminated, and I think the show ends with a marriage proposal. So it's a wild show. It's something. [chuckles] And in Akshith's talk, I learned some really fun terminology. The first one is the Crown, and this is actually an important building block because we're going to get to the rest of the terminology that uses this word, so we got to start here. So the first one is the Crown, and this is the person that everyone's competing for. So they're the star of the show. They're the one that everybody is hoping to fall in love with or will fall in love with them so they get a marriage proposal. So then the other stuff that I've learned is all about the entrance because again, we're talking about the top 10 best entrances. And one of them is the sidecar entrance. So this is where the player, because yes, this is totally a game, has someone assist them in meeting the crown. So it could be like a family member, maybe it's like your grandma. And then there's TOT, T-O-T, which is short for Trick Or Treat. And this person exits the limo wearing a costume. So it's someone wearing a shark costume. There was someone wearing a sloth costume where they really dedicated to the role, and they climbed a tree and hung from a branch. I don't know for how long but for long enough to really vibe with the role. And then there's the Kringle, and this person brings a prop or a present to the Crown. And there's the Grandy, and this player arrives in something other than a limo. So the example that Akshith provided is someone arrived in a motorized cupcake. CHRIS: Was the cupcake edible? STEPH: I don't think so, fair question. [laughs] CHRIS: So really just like a go-kart that looked like a cupcake, not really a motorized cupcake, if I'm going to meet pedantic about the thing, [chuckles] which I think is my job. STEPH: Yes, it is a motorized non-edible cupcake, but that seems like something a next player should do. They should really up the game, and they should bring an edible motorized cupcake. CHRIS: Yeah, because you get the visual novelty, but then you layer on top of it that it's actually something that you can now eat, and it's a double win. STEPH: Ooh, and then you're a Grandy, and you're a Kringle because you arrived in something other than a limo, and it's a present. CHRIS: I love how you have so deeply internalized this now that you're like, ooh, okay. I can remix here. I'm going to bring together the pieces. Yeah, all right. Yeah, this all makes sense. STEPH: Yeah, it was a lot of fun. Those are most of my notes for today. I have some tech stuff too, but this felt like the most important thing to start the show with. CHRIS: We use the phrase tech talk and nonsense to describe the show often, but I think nonsense and tech talk is the correct orientation. STEPH: [chuckles] CHRIS: Correct in terms of importance and chronological order, and whatnot. But yeah. STEPH: I love that we start with a bit of nonsense. So I do have some tech stuff. But first, before I share any of that, what's going on in your world? CHRIS: I'm sure there's plenty of nonsense in my world, but at the top of my list is some tech stuff. So someone on Twitter, Adam Lassek, reached out and he suggested related to the conversation and the back and forth that I've been having with myself around some of the data structures within the app that I'm building…So I've talked about the dry-monads result object, and there's this success and failure. And I wanted to introduce this new method called bimap, but I wanted to do it in a reasonable way. So I wrapped, and then I wrapped, and I wrapped things. As an aside, former colleague and friend of the show, Joel Oliveira, sent a wonderful tweet which was a reference to the SNL video where they make a taco and put it inside of a pizza and put it inside of a bag. And that was his joke about it, which I really liked. That was an excellent reference. But in this case, Adam Lassek reached out and suggested if I'm that squeamish about monkey patching, which I am, have I considered refinements? And so he sent an image of a code sample, which is so kind of him to send that much detail over, but it was interesting because I know of refinements in Ruby. I know of that as an alternative to monkey patching, a more refined way, but a safer way, a more controlled way to alter code, but I've not actually used them. STEPH: I'm not familiar with refinements. What is that? CHRIS: Refinements are a way...so similar to monkey patching, where you say like, I'm going to reopen this class or this module and define a new method or redefine a method or do something like that, a refinement is a way to do that in a scoped manner. So I'll be honest, I'm not super familiar with them. I think I came into Ruby at a time where the community was moving away from monkey patching. And the dogmatic swing of the pendulum was like, that's a bad thing to do. And so even the refinements were introduced, as far as I understand it, to be a more controlled way to do it. So it's not just like, hey, cool. This module is redefined now in your app in a magical way that's really hard to figure out and hard for folks to debug refinements. You have to explicitly opt into within a certain lexical scope. I'll be honest; I know that at the headline level. I don't actually know the ramifications or where and when you can use them and how you can. But I know that that was the idea is refinements are a way to do monkey patching but in a more controlled, more understandable manner, and so the code sample that Adam shared does that. And it's very interesting. As I'm looking at it, I'm like, okay, that's cool because I think it'll be a little bit safer. But at the end of the day, my concern wasn't safety in this case because I was introducing a method that would be new, that would be additive to the API of this module that I'm working with, and so that I think of as a relatively safe operation. My hesitation was more around how does someone figure it out if they're working with this? And particularly, the name of the method that I was introducing was bimap so, B-I-M-A-P. And if someone sees that in our codebase and is like, "Bimap, where is this coming from?" Well, this is one of those dry-monad result objects. And they go to the code, and they try and look it up in the docs, and they're just not going to find anything. And I can imagine losing a lot of time to try and chase that down. There are ways to figure it out. There's the method in Ruby, which is a wonderful trick for chasing things down. Or if you grep the codebase, you'd find it. But I think I'm possibly over-indexed on worrying about that lost time, that moment. But I've lost that time so many times in my life where I'm like, I can't grep for this. I can't Google for this. And so I have so strongly moved in the direction of being like, everything should be grepable, everything should be googleable. Those are the two of the things that I believe about software. I think I believe a bunch of stuff. STEPH: I think we have a full episode that talks about what we believe in software. CHRIS: I believe we do. STEPH: Cool. Thanks. Yeah, I have not heard of refinements. That sounds really interesting. I really like that bit about everything should be grepable, and everything should be googleable, googling everything. I kind of agree with that one. We live in a world where we're always doing bespoke things so that one feels a little bit harder that we're always going to be able to Google it. But then that encourages people to constantly publish the bespoke work that they're doing so then others can benefit from that work. But the grepable, I absolutely agree with that one. It's so frustrating where I see a method, but I cannot find its definition. And then having the ways to figure out where that method is defined to then find its definition is crucial. CHRIS: Yeah, it's interesting. I definitely feel that way very strongly. And it's in such stark contrast to Rails. Rails is like, hey, don't worry. There's going to be a lot of methods. You don't need to worry about where they come from, or why they exist, or what they are, or what they do. Well, probably what they do. But all of the magic inflections on database tables,, and suddenly you have methods named after every column. That's both very magical and hard to grep for or impossible to grep for, but it also leaks the entire structure of your database into your application in a way that I've always felt a little bit complicated about. And so explicitness, grepability, those are things that I care about. There's another one, delegates in Rails, that I sometimes pause around using especially when it's like delegates 19 methods to user prefix user. And so you end up with methods that are like username. And that's a delegation to the user object to get the name method off of it, but it creates the method user_name. And you're never going to be able to grep for that. And it saves like a little bit of code, definitely, but it saves this very obvious, very knowable code. So this one I actually shy away from using delegates in most cases, and I'll just write out the methods manually because sometimes I like to hear the clackety of my keyboard. There's a reason I have a clackety keyboard. STEPH: You want to get your money's worth. You want to clackety as much as possible. Yeah, I'm also not a fan of delegates. This may be a lie, but I don't know that I've actually ever used it. I've worked with it, but I can't think of a time that I've implemented delegates. Maybe that's a lie, but I'm going to say it anyways because that feels true, at least in the last couple of years. CHRIS: I feel like that could be true for the last couple of years. I would be surprised if you have never even added to a delegates line. Because that's the thing, you can just keep shoveling stuff into them as well. So I would put money on you having used it at some point and then just forgotten about it. But who knows, maybe not. STEPH: This is where we play two truths and a lie and that one's my lie. [laughs] Yeah, that's also fair about adding to it because if that's already defined and it's easier to add to it, I don't know. Who knows what past Stephanie has done, probably some wild stuff. CHRIS: It's unknowable at this point. It's lost to the sands of time. But looping back to the core thing of this refinement and the module, I think I'm leaning in the direction of doing that and unwinding my wrapping and wrapping layer thing. Because obviously, as I talked about...I think it was the previous episode or maybe two episodes ago. There was conceptual complexity to the additional wrapping layer. Even as I was fully in the context of working on that, I was still getting myself confused in either triple wrapping or then unwrapping too much or whatever. And these are the concerns with this type of code. So moving away from that feels better, having just a single layer of context wrapping around a given value. And then the other thing it's actually just a lot less code, and it's less prone to error, I think. That's my hope. I have to look into exactly how refinements get used, but I noticed in a couple of places that sometimes we were wrapping with this local value object that gave us the bimap method, and sometimes we were forgetting to. And so, I could see that being a very subtle, easy way to introduce failures into the app that would be hard to catch just by looking at it. So I think having a more global refinement...although I think that's sort of a contradiction, a global refinement because I think refinements are meant to be local. But anyway, I'm going to look into it because it's a much more concise code sample than what I have. Yeah, I'm going to poke at that a little bit. But it was an interesting exploration of some different things. And then it forced me to consider why am I so resistant to monkey patching at this point, especially in this particular case where I think it's okay-ish? STEPH: That's a good question. Do you have any insights? I am also resistant to monkey patching. I feel that pain and also that timidness of diving into that space. But I'm curious, have you figured out any other reasons that you really prefer to avoid it? CHRIS: I think this one falls into that sort of...what's the word? Like tribal knowledge of we've been burned by it in the past and therefore we build almost a...religious is too strong of a word but that sort of cultural belief. This is a thing that we do not do because of the bad things that we've experienced in the past. And there are a lot of things that fall into that experiential negative space. So with monkey patching, things that I know we can run into is if I introduced this bimap method, but I introduce it subtly differently than the library will eventually, then they could eventually introduce it themselves. And suddenly, I have this fork of my code expects it to work this way, but you've now implemented it that way. I no longer can upgrade. This is a critical piece of infrastructure in my app. I've just painted myself into a corner by doing this. Whereas if I do this wrapping layer, that's my code. I own that. It's not going to be a problem in that same way. There's also the subtlety, the grepability that sort of thing is a concern in my mind. Like, is this our code? Is this their code? Is this an engine? Being able to find code within a codebase, I think, is a critical thing. And so that's a part of the hesitation. I also know longer ago prototypes...I want to say Prototype JS was the name of the project, but it was one that was just like, yeah, JavaScript doesn't have enough stuff in the standard library. So we're just going to override everything and add all of these wonderful methods sort of in the way that Active Support does, which is an interesting comparison. But the JavaScript community definitely moved away from Prototype. And now JavaScript is a language or the standard runtime that's available in most JavaScript engines. It has a lot of the methods, but there are conflicts, and stuff gets weird, and it's all complicated. But again, as I thought of it, Active Support is a complete contradiction to everything I'm saying. Active Support just adds whatever to anything, 2.days.ago. Why does the number 2 have a days method? Because it's great, that's why. But I'm just a walking contradiction, I guess. STEPH: Everything you said really resonates with me. And I'm just trying to reason with myself like yes, Active Support uses a lot of this, a lot of metaprogramming, and adds everything it wants to. So why does that feel okay? And I wonder if it comes down to one is more almost like an agreed standard. It's built by a team, and it's maintained by a team, and then it's used by a large number of people, and then you get that feedback. Or maybe it's not even just a team, but it's a larger community versus if it's internal to your software team, maybe that doesn't feel like a big enough group or if it just needs...Rails is also documented. So maybe that's part of it, too, is if you are going to dive into that space, it's easy to discover, and it's well-documented as if you are building an open-source project that other people are going to use. Like, you designed for the intent of people to use this pattern that you've introduced, then perhaps that's when it starts to feel okay. , But the experiences I have had is where people basically will add some dynamic programming or monkey patch an existing feature. And then that's very hard to find and has surprising results, or it gets outdated. So I guess it comes down to who are you designing for? Are you designing for more of an open-source community, or you're at least designing for the people behind you that are going to be using this? Or is this a one-off adventure that you have chosen for yourself and future developers to discover? [chuckles] CHRIS: Yeah, I think that's a good summary, although I'm open to the fact that I exist in a state of contradiction. I'm also fine with that, to be clear. [chuckles] But I think what you said is true, and I think there is subtlety and nuance and reasons that it's okay in one context and less okay in others. And that idea of just like, I don't know, this is one of those things that I got in my head that I've done the thinking a long time ago to decide this is a thing I don't do. So now, in order to override that, I would have to do so much thinking. I would have to be like, all right, well, my brain tells me, no, but I'm going to go reread everything about monkey patching right now to convince myself that it's okay or to fully get the context and the subtlety and the nuance. And so sometimes we have to rely on that heuristic knowledge of monkey patching, nope, don't do that. That's not a thing, but other stuff is fine. And well, Active Support is fine because it's Rails. But it is interesting to observe contradictions and be like, huh, look at me go. All right. Well, moving on. STEPH: It's our lizard brain that's saying, "Hey, there's danger here." [laughs] CHRIS: Exactly. STEPH: I rather like living in a world of contradictions, or at least I find it that I'm drawn to them. And maybe that's also one of the things that I really like about consulting is because then I join all these different teams, and I hear all these different opinions. So as I'm forming these opinions around something like tests are great, I really like tests, and then someone's like, "I really hate tests." I'm like, "Cool. Let's talk. I want to understand why you don't like this thing that I think is wonderful because then I'm really interested." So I find that I'm often really drawn to contradictions as I like hearing opinions that are very different than mine and finding out why people have a different opinion than mine. CHRIS: Yeah, the world is full of contradictions. So it's, I think, at least a useful way to exist in the world, to be open to them and to enjoy exploring them. But yeah, I'll update in future weeks if I do end up going the refinements route. I'll let you know if anything interesting falls out of that. And now we're going to take a quick break to tell you about today's sponsor, Orbit. Orbit is mission control for community builders. Orbit offers data analytics, reporting, and insights across all the places your community exists in a single location. Orbit's origins are in the open-source and developer relations communities. And that continues today with an active open source culture in an accessible and documented API. With thousands of communities currently relying on Orbit, they are rapidly growing their engineering team. The company is entirely remote-first with team members around the world. You can work from home, from an Orbit outpost in San Francisco or Paris, or find yourself a coworking spot in your city The tech stack of the main orbit app is Ruby on Rails with JavaScript on the front end. If you're looking for your next role with an empathetic product-driven team that prides itself on work-life balance, professional development, and giving back to the larger community, then consider checking out the Orbit careers page for more information. Bonus points if working in a Ruby codebase with a Ruby-oriented team gives you a lot of joy. Find out more at orbit.love/weloveruby. STEPH: So we made a recent improvement to our feature flag system, which I'm really excited about, that we have found a way to improve that workflow because it felt really great that we're...well, okay, I should say that with a caveat. It felt really great that we're using feature flags to ensure that the main branch is always in a deployable state. But it did not feel great around how tedious it was becoming to add all of the feature flags specifically because each time we're adding a feature flag, we're having to add a migration. So we're having to run a migration, add the feature flag column, and then we can interact with that feature flag. And that part's okay. It was more removing that feature flag once we're done with it, that that part was starting to feel tedious because then that's becoming a two-deploy process. So one change is to remove the code that's relying on that feature flag. And then the second deploy was to actually drop that column because we wanted it to be safe to make sure that the code wasn't trying to reference a database column that didn't exist anymore, which is what happened at one point at first when we weren't doing the two-deploy process. So the improvement that Chris White came up with is where we're now using a Postgres JSONB column. And it's here that we actually have a feature flag YAML file. And we can have the name of the feature flag. We have a description of the purpose of the feature flag. And we have an enabled property on there, so then we can turn it on and off. The benefit of this is now we don't have to do that two-deploy process. And we also don't have to run a migration for when we're adding a new feature flag. So we can add it to the feature flag file, we can load it in, and then we can set that property to say, "Yes, this is enabled," or "No, it's not." And that has just simplified our feature flag process. One tricky bit that I believe the team ran into is around enabling this with Active Admin because Active Admin was just relying on those database columns to then turn something on or off. But then we've added some methods that work well with Active Admin that then say, "Read from here when you're checking to see if something is enabled," or "Look at this list to see which feature flags can be turned on and off." So it's been a really nice improvement, and everybody on the team seems to be in favor of the ways that we've improved this. So it's been really nice. So I wanted to come back and bring an update on how we've simplified our feature flag system. CHRIS: That definitely sounds like a nice improvement, the ability to just more regularly iterate around that or taking away the pain, any pain associated with using feature flags. Because they are such a nice thing to have, but there's that overhead. Then you start to have that voice in your head that's like, do I really need a feature flag for this? Could I just sneak this one in? And we always regret that. I had a similar thing this week where I wrote some code. I didn't quite write as many tests as I should have. And it was wildly broken, just like all of the connection points through everything were broken. But then it pushed me in an interesting direction where I was like, well, what I'm going to do is write an integrated test. It was basically an event coming in from a webhook that then enqueued a job, which did a thing, which then spit out an email. But it was broken at like three layers, and I was very embarrassed, if we're being honest. But, I don't know, I was just having a low energy afternoon, and I did not write the test, which I know I'm supposed to do. So similarly, any pain that we can take out of these things that we're supposed to do, any way that we can pave the happy path, I'm all about those. I'm intrigued because I think we've talked about this before, but it sounds like you guys have a very home-grown feature flag system. Is that true? STEPH: We do. CHRIS: Is there something about it that makes it unique to your situation, or was it just like that's what happened? Someone early on was like, "We need feature flags. I can just do the simplest thing that works," and then that's where you're at now or? STEPH: You're asking a very good question. And I'm trying to recall what led us to the state that we're in because I feel like we had this same discussion several episodes back when we were introducing the home-grown feature flag system. And I was like, there are reasons, but I didn't really dive into those reasons because it felt very custom to the application. But now I've forgotten what those reasons were. So I think you ask a great question where it'd be worth revisiting to confirm that yes, there's a reason for this home-grown version versus using something like Flipper. CHRIS: I'm glad I'm at least consistent over time in the questions that I ask and the heuristics that I have. This does feel like one of those things. It's not quite like crypto where I'd be like, we can never write our own crypto. But a feature flag system, I would be really intrigued if there are things that they are just workflows or functionality that you really need that are not supported by any of the existing solutions that are out there. I think audit trails is an interesting one. I think Flipper has a hosted product at this point that does that, but the local version wouldn't necessarily. So maybe that's a thing that you want to get. Again, I'd just be really interested. It sounds like the current state of the world that you have is enabled or disabled; just broadly, that's it. Those are the two states for any given flag. Is that true? STEPH: It is. There's nothing complex with the flags in that nature. And then we use naming to indicate if something is more for beta, so if it's a change that we're making to the codebase, but it's a feature flag that we plan on removing, versus maybe it's a feature flag for enterprise customers. CHRIS: Oh, interesting. I wouldn't think of using a feature flag in that context where it's going to be like a persistent, long-lived; this is conditional logic around some state or some property of the viewer. I think of feature flags as a way to gate code conditionally based on a point in time. And the reason I asked about the enabled-disabled basically like the Boolean state for your flags is when I've worked with feature flags in the past, I've liked having the ability to say, for this user or these users, or this group of users, which we've named this is our beta list…and it's the ten people that just really love the product and are happy to bump into some rough edges. And so we'll put things on for them first or even like percentages, so roll it out to 10% and then 50% and so on. And I think the larger an application and user base gets, the more that sort of thing starts to feel right. STEPH: Yeah, we certainly have some complexity around where each customer can really specify which features that they want. And then the features also differ a bit for each customer. So we are in a world where we're pretty customized or configurable for different customers. And whether that's something that we could simplify, that would certainly be a good question or something to pursue. But part of this also feels like our decision may have been based around what the system was already doing, and we're looking for ways to make slow improvements versus trying to redesign the whole thing. Because initially, the way we were customizing all of these different features for customers was in a YAML file. And that part was painful because then, anytime we wanted to make a change, it required a deploy. So the introduction of feature flags is really to get away from having to deploy to then make a small change like that. But now that we're in the space that we can easily configure that change and do that on the fly and not have to issue a deploy, I think we're now in a good space to reassess. And the team may have some really good answers. Perhaps I'm just not recalling as to why we've chosen the more home-grown feature flags. But yeah, I'll visit that topic and report back. Because I've been coasting along on our new system and enjoying it, but you're asking some really good questions. CHRIS: I mean, as an aside, if you're coasting along and really enjoying it, then maybe you don't need to ask any questions. It's still interesting. I would be intrigued to know. But if it's not causing you any pain, then you probably shouldn't change it. Because frankly, changing out the feature flag system is going to be non-trivial, I'm pretty sure. You could feature flag the feature flag system, and then you can transition from one to the other. You need a third feature flag system for that. But anyway, I digress. [chuckles] STEPH: You referenced crypto earlier. So I think I like the feature flag, the feature flag system. We should have some crypto flags in there somewhere. I think that's a thing too. But I think the main goal if I'm looking into changing it would be, circling back to what we were talking about earlier, is discoverability, so having a home-grown feature flag system. How easy is it for…if nobody was around on the team and there was someone new working with it, how easy would it be for them to turn something on or off? And if that's easy, then that's great. Then I think we've got a great home-grown system. If that's challenging, then I definitely think it's worth reassessing. And now a quick break to hear from today's sponsor, Scout APM. Scout APM is leading-edge application performance monitoring that's designed to help Rails developers quickly find and fix performance issues without having to deal with the headache or overhead of enterprise platform feature bloat. With a developer-centric UI and tracing logic that ties bottlenecks to source code, you can quickly pinpoint and resolve those performance abnormalities like N+1 queries, slow database queries, memory bloat, and much more. Scout's real-time alerting and weekly digest emails let you rest easy knowing Scout's on watch and resolving performance issues before your customers ever see them. Scout has also launched its new error monitoring feature add-on for Python applications. Now you can connect your error reporting and application monitoring data on one platform. See for yourself why developers call Scout their best friend and try our error monitoring and APM free for 14 days; no credit card needed. And as an added-on bonus for Bike Shed listeners, Scout will donate $5 to the open-source project of your choice when you deploy. Learn more at scoutapm.com/bikeshed. That's scoutapm.com/bikeshed. CHRIS: One of the things that's been interesting working lately in the app that I'm building is thinking about testing. We have a number of interactions with third-party services. Frankly, a lot of the app is that at this point. We have a handful of different external data providers systems that we're interacting with, webhooks and flows and things like that. And so we had to make that decision that you always have to make in these sorts of situations which is, how are we going to test this? And there's a wonderful blog post on the thoughtbot blog called Faking External Services in Tests with Adapters. It's by the one and only German Velasco. And it is a beautiful summary of the different approaches that you can take, but it really dials into one, which is the adapter pattern. There's also a weekly iteration episode on Upcase with Joël Quenneville, which discusses a little bit more of an exploration of the different options. There are sort of a handful of different options that we can consider your whereas the blog post by German talks specifically about the adapters approach. But to talk about them briefly, there's one where you can go all the way outside your app, spin up a fake service. Typically, we would do this with Capybara Discoball, which is a wonderfully named project. But it allows you to spin up a little Sinatra app type thing such that your web application is still making quote, unquote "real HTTP requests." This external service is going to catch that and respond with whatever canned data or structured responses that you want. But you still have the ability in that to, say, tell it to create data beforehand or be in a certain state or respond with certain data or have any stateful persistence. So if you create a record in that external system, and then later you query for it, that system can do that. But it has the complexities of now, your test suite is running different systems. And do you have thread-safety or all that kind of stuff? So that's a particularly complex end of the spectrum. At the lowest end would be stubbing and mocking. You just take whatever external clients you have, and you're mocking the API calls in them. That's the lowest end. And that's the one, especially for feature specs, those I try and avoid. Then there's a middle ground of like WebMock or VCR, those sort of things where you're saying whenever you see an HTTP request that looks like this, respond in this way. You record the cassettes, all that kind of stuff. And then there's the one that we've settled on, which is the adapters. So the client that we've introduced in our local codebase to interact with any of these third-party systems internally has a class attribute, a cattr_accessor in the Rails parlance, I believe. And that allows us to switch out the backend. And so we have a real HTTP backend, and that's the one that actually runs in production and a test in-memory backend. And that in-memory backend can implement whatever logic. We're ending up with one of them almost recreating this external service, sort of re-coding some of their inconsistencies or oddities but also features and whatnot. But it feels like it has struck just the right balance, and it allows our feature specs to be very rich, very real. We start up the world, and we say, "Hey, external service be in this state." And then I'm going to go visit the page. I'm going to see the data. But we are almost making real HTTP requests. It's very close. It's always an interesting choice to make here. I'm very happy with the one that we've made, but it's still not perfect. There are always going to be trade-offs between the different options here. But it's always interesting revisiting this and being like, which one am I going to choose today? STEPH: I feel like my natural progression when testing external services; I always start with WebMock, and then I progress to using adapters. And then from there, I go to actually replacing the HTTP service that is receiving and then returning a response, like you mentioned to Capybara Discoball earlier. So I can certainly see what you like about the adapter pattern. You mentioned that you're coding some of the inconsistencies. That feels very real. I'm curious if you have an example of how you've had to manage that recently. CHRIS: A specific example would be the external API responds with certain error codes or error structures. So it's an error. It has a status of a number and then a reason, or sometimes instead of a key that is reason; it's the message. So it's like, oh, okay, I see that in this endpoint, you respond with reason, and then this endpoint you respond with message. So now, do I encode that into my fake? I guess I do. So my adapter now implements things like that. There are cases where it's inconsistency where I'm like, well, this is the way they behave. So I would like our test suite to exist in the context of that because then our app is getting exercise in a real way. But in some cases, it's like little bits of logic validation that an external system might do if that's an important part of the flow. The app that we're building has a lot of forms and a lot of data validation and things like that. And so, we want to make sure that we have robust handling around that robust messaging to the user so that it's very clear what they need to do and how they need to respond to things. And so putting in little bits of that like, oh, that's how you format a phone number, okay, cool. Our fake will also format phone numbers in that way, things like that. STEPH: Every time the topic of testing external services comes up, I really, really want VCR to be the answer. I really like the idea of being able to validate that...because you'd mentioned that we're programming the expected return from this other service. And it's very easy to get out of sync with those actual responses. And then we don't really have a great way to stay up to date other than we wait for production or staging environment to fail. And then we realize something has changed, and we have to go and update either our mock or our adapter. And maybe that doesn't happen often if you're working with an external service that is very good about broadcasting when they have a breaking change. But if you're working with a less stable endpoint, then I always want VCR to really work. But it's just one of those areas where I'm like, yes, that's the thing that I want. I want this idea where I can rerun my tests in a way that they actually hit that service and record the response. But then I have felt pain [chuckles] from working with VCR and how it's configured, and how people have used it. It's one of those where I don't blame the library. I like the library. But the way people have implemented it and test I have felt a lot of pain from that. CHRIS: Yeah, I definitely agree with that. It feels like it's nice if you can push the mocking all the way out to that layer. Because like right now, our codebase has code in it that is subtly changing the behavior for a test, and I don't like that. It's only the swapping out of the adapter, so it's a very minimal thing. And we try and push all logic away from that such that the test adapter is as similar as possible to the real production situation. But it's enough difference that I agree I would like if VCR would just like, I catch the HTTP requests, and I respond with the same thing and sometimes we can pass through. I do think one of the fundamental limitations, or at least very hard to get right things, would be sequential requests. So I post to this endpoint in the external service, which creates some data. And then later, when I make a GET request to their endpoint, I should get back that data that I just created. That's, I guess, doable because you can have sequential requests, have cassettes that are first this request, then that request, then that request. And it knows that, like scope them to a given spec. But that feels extra difficult. And it does, again to your comment, the maintainers of that project do a wonderful job, but it's a really hard target to hit. STEPH: Well, and one of the other hard requirements with using a tool like VCR is then that external service really needs that sandbox staging environment that you can use. So that way you can create this data, you can rerun your test. So they're actually going to hit this real environment. They're going to create this data and that not have any harmful effects. And then you can record fetching that data. So it requires a lot of pieces to fall into place for it to work well. But then I was just thinking as you're talking about adapters, I'm like, yeah, I love the adapter pattern. I've really enjoyed that one for testing as well. But then I immediately start to think, oh, well, what happens when it gets out of sync, and how do we know that it got out of sync? And I don't have a great answer to that. CHRIS: Production blows up, obviously. STEPH: Production blows up, and then we go update our adapter. That's very calm. [laughs] CHRIS: It would be great if CI could more proactively catch that or...yeah, I agree. I would love if VCR would work because that facet of it is so attractive. But [chuckles] I've never gotten to walk exclusively the happy path with VCR. So here we are. This is a classic case of here's four options as to how we can think about this hard and important thing that we do in our codebases, and they all have trade-offs much like everything else in software. STEPH: I'm going to add this to my developer bucket list to live in a world where I can easily validate if an external API has changed or not and then also have tests that know when something has broken before production does. CHRIS: Ooph, dare to dream. I like it. STEPH: I'm a dreamer. CHRIS: I want to live in that world. Well, with that wonderful dream to take us out, should we wrap up? STEPH: Let's wrap up. The show notes for this episode can be found at bikeshed.fm. CHRIS: This show is produced and edited by Mandy Moore. STEPH: If you enjoyed listening, one really easy way to support the show is to leave us a quick rating or a review in iTunes as it helps other people find the show. CHRIS: If you have any feedback for this or any of our other episodes, you can reach us at @_bikeshed on Twitter. And I'm @christoomey. STEPH: And I'm @SViccari. CHRIS: Or you can email us at hosts@bikeshed.fm. STEPH: Thanks so much for listening to The Bike Shed, and we'll see you next week. All: Byeeeeeeeee. Announcer: This podcast was brought to you by thoughtbot. thoughtbot is your expert design and development partner. Let's make your product and team a success.

I Have A Podcast
I Have A Podcast with Mandy Moore: Self-authority, Trust, & Asking for Help EP #003

I Have A Podcast

Play Episode Listen Later Sep 7, 2021 30:52


Joining me on this episode of I Have a Podcast is my longtime friend, actress, singer, songwriter, production company owner, who knows what's like to be a working mother in Hollywood, Mandy Moore! We talk about work-life balance and how she has used many forms of media to help build her brand, claim her narrative, and empower her audience to make an impact.    Mandy shares her own challenges when it comes to making yourself small, and the journey of embarking on unchartered territory as she broke into an industry she had no experience in at a very young and impressionable age.  Claiming your self-authority is a process. It takes trust, it takes time, and often, it takes defiance.    MANDY MOORE Web: www.mandymoore.com Instagram: www.instagram.com/mandymooremm VINNIE POTESTIVO LinkedIn: www.linkedin.com/in/vinniepotestivo Instagram: www.instagram.com/vinniepotestivo Clubhouse: www.joinclubhouse.com/@vinniepotestivo I HAVE A PODCAST: Instagram: www.instagram.com/ihaveapodcast YouTube: www.youtube.com/vpetv Episodes, show notes & transcripts: www.ihaveapodcast.com   Connect with IHAP: ihap@vpetalent.com Vinnie's Services: www.vpetalent.com > > > LEAVE US A REVIEW: www.ratethispodcast.com/ihap

Greater Than Code
248: Developing Team Culture with Andrew Dunkman

Greater Than Code

Play Episode Listen Later Sep 1, 2021 72:59


01:27 - Andrew's Superpower: Stern Empathy 03:30 - Setting Work Boundaries * Matrix Organizations * 18F (https://18f.gsa.gov/) * Acknowledging Difficult Situations (i.e. Burnout) * Health Checks * Project Success * Time Tracking * Heart Connection / Motivation * Work Distribution * Greater Than Code Episode 162: Glue Work with Denise Yu (https://www.greaterthancode.com/glue-work) 18:54 - Providing Support During a Pandemic * Stretching/Growth Work * Comfortable/Safety Work * Social Connection 23:37 - Keeping People Happy / Avoiding Team Burnout * Project Aristotle by Google (https://rework.withgoogle.com/print/guides/5721312655835136/) * Collecting Honest Data * Psychological Safety & Inclusion * Earned Dogmatism * “The Waffle House Solution” 36:26 - Developing Team Culture * “Gravity People” * Honing Communication Skills * Staying Ahead of Big Problems * The ACE Model of Leadership * Appreciation * Coaching * Evaluation * Learning Skills * Managers: Coaching How To Coach * Communities of Practice * Hiring External Consultants * Online Courses, Books, Podcasts 43:08 - Knowing When to Jump Ship and Understanding Your Skills * TKI Assessment (https://kilmanndiagnostics.com/assessments/thomas-kilmann-instrument-one-assessment-person/) * Competing * Collaborating * Compromising * Avoiding * Accommodating 46:51 - Developing & Enforcing Boundaries * Summarization * Normalization * Asking For Support 59:05 - Making Mistakes * Demonstrating Vulnerability * Acknowledge, Internalize, and Learn * Rebuilding Trust * Acceptance: Start Over – There's Other Opportunities * Dubugging Your Brain by Casey Watts (https://www.debuggingyourbrain.com/) Reflections: Arty: The intersection between identifying and acknowledging creates the precedent for the norm. Jacob: Evolving culture to enable vulnerability more. Casey: Andrew's river metaphor and Arty's cardboard cutout metaphor. Andrew: Talking about and building psychological safety is foundational. Going first as leadership or being first to follow. How to start a movement | Derek Sivers (https://www.youtube.com/watch?v=V74AxCqOTvg&feature=youtu.be) (being the first follower TED Talk) This episode was brought to you by @therubyrep (https://twitter.com/therubyrep) of DevReps, LLC (http://www.devreps.com/). To pledge your support and to join our awesome Slack community, visit patreon.com/greaterthancode (https://www.patreon.com/greaterthancode) To make a one-time donation so that we can continue to bring you more content and transcripts like this, please do so at paypal.me/devreps (https://www.paypal.me/devreps). You will also get an invitation to our Slack community this way as well. Transcript: ARTY: Hi, everyone. Welcome to Episode 248 of Greater Than Code. I'm Arty Starr and I'm here with my co-host, Jacob Stoebel. JACOB: Hello! Nice to be here, and I'm here with my other co-host, Casey Watts. CASEY: Hi, I'm Casey, and we're all here together with our guest today, Andrew Dunkman. Andrew, he/him, is an engineering leader and software developer with 17 years of experience. He's worked on and launched tools for contact relationship management, predictive sales, radiology and healthcare, learning and management, business-to-business timekeeping, and most recently in government at 18F, a part of the US General Services Administration that's helping the federal government adopt user-centered technology approaches. He loves those. He also likes building community in his free time. He helps moderate the DC Tech Slack, a 10,000-person community of tech workers in the DC area and he helps to run DC Code and Coffee, an informal hacking and community-building event every other weekend. Even though his cat, Toulouse, is glaring at him for talking too loud, he is excited to be here with us today. Hi, Andrew! ANDREW: Hey, y'all! So nice to be here. I'm honored to be a guest. CASEY: Let's start with our standard question to kick stuff off here. Andrew, what's your superpower and how did you acquire it? ANDREW: Thanks for asking. Yeah, this is whenever I answer the question of what my superpower is, it feels like bragging so I did what I normally do when I'm uncomfortable asking a question and I ask other people that question. I asked a few friends and they highlighted both, my ability to empathize with people and also, my sternness in that empathy. I think sometimes when you get caught up in empathizing with people, you can allow their emotions and their feelings to overwhelm you, or become a part of you in a way that you're not necessarily hoping for. So I like to draw a firm boundary there and then allow other people to see that boundary, I suppose. [laughs] I don't know, it's hard for me to say that that's a superpower, but I'm just going to lean into what other people told me. ARTY: That's a pretty good superpower. I like it. How did you acquire it? ANDREW: I credit my mom a lot actually. My mother is a dual major in psychology and English and as growing up, she had the worst way of punishing me, which is anytime I'd do something wrong, she would say, “Can you describe to me what you did and tell me how it made the other person feel?” which is the absolute worst thing to do to a child to make them explain how they've hurt you. [laughs] So I credit that a lot for developing those skills. CASEY: That's so funny. You think it's the worst thing you can do? Could you imagine yourself doing it ever if you're around children like that? ANDREW: Oh, totally. [laughs] Absolutely, yes. I now do it to my friend's children. I have no children myself, but I do to my friend's children and it's appropriately uncomfortable. CASEY: I like that. Yeah. It can be the worst and it can be helpful and productive. I believe it. ANDREW: Yes. As one of my coworkers like to say, “Two things can be true.” JACOB: That boundary, I've been thinking about something along the lines of that recently, particularly in work settings where you can get really burnt out in everything is high stakes emotionally at work. I think that's a really good boundary to have. ANDREW: Absolutely and it's also super hard to know. [chuckles] Both know where that boundary is and what to do when you are coming up to it. I think some people and myself occasionally notice you've crossed that boundary in retrospect, but not necessarily in the moment and it's hard to start off just know your tells when you're getting close to that line and when to pull the e-brake and take a walk, or go out and find some way to disengage, or reengage in yourself as a human and your human needs. CASEY: I'd love to hear an example of a time when you pulled the e-brake recently, Andrew. It's so vivid you must have a lot of stuff under that sentence. ANDREW: So my current organization, 18F, is one that's a matrixed so we've got our chapters is what we call them which is our disciplines. Those are engineering and design, product acquisitions, they're groups of people that do the same kind of work, and then our other angle of the matrix is our projects. Those are business verticals like the kinds of people that we're helping and the organizations that we're assisting around public benefits, or around national security, or around natural resources. So the result of a matrix organization is that you have two aspects to who's managing you—you have the manager of your work and you have the manager of your discipline—and the positive thing about that is that you can use both angles of the organization to support you in different ways. Sometimes in your work, you need someone to speak up for you as a person, or as your skills development angle and sometimes you need someone to speak up for you in terms of the project work that you're doing, advocating for success in the specifics of your project, regardless of the way you're contributing to that project. The result, as you zoom out into upper layers of management, is that you have a conflict designed into the system and that conflict, when things are working well, benefits the health of the organization, both the health of people and the health of projects are advocated for and supported. But when things get out of balance, which happens all the time, in every organization I've ever been in you've got pendulum swing back and forth between different balances and when things out of balance, then suddenly you find yourself overextended, or advocating to an empty room. A recent example was a conversation around advocating for the benefits of – I'm on the chapter side of the house so I support people within engineering and I had to pull an e-brake in a conversation where I was advocating for the health of people, but that I didn't have the right ears in the room to make a positive change. I found myself getting ahead of myself. One of the tells that I have is that I often feel tension in my jaw, which is usually a sign that I'm stressing too much about something. So I decided to take off a few hours and went to a gym [chuckles] and did a work out just to get the energy out of my system. ARTY: It seems like those conflicts can become pretty emotional depending on the circumstances where you've got folks that are overworked and stressed out, and wanting an advocate to help support them in those challenging circumstances. You just think about product deadlines and things coming up and the company's trying to survive and it needs to survive so it can keep people employed. Those things are important too, but then we've got these challenges with trying to live and be human and enjoy our lives and things become too stressful that we lose our ability to the function and we need advocates on various sides. So when you engage with someone, let's say, there's someone on the team that's burnt out and really stressed out, how would you approach empathizing with where they're coming from to help work toward some good the solution to these things? ANDREW: Great question. I think in these kinds of situations, I always come in with the acknowledgement that no one in this conversation owns the truth. We're both working together to understand what the best thing to do is and what the reality of the situation is. From my perspective, in trying to support someone seeing that they're burnt out, or overworked, that I think that's a misnomer. We can sometimes think of being burnt out overworked as an inherent state, or as something external. But I always try to encourage people to bring it internal because we all set boundaries and orders. The reality of an organization is that there will always be a resource constraint, whether that's people, or time, or money and it's up to the organization to effectively solve what they need to solve within the boundaries of those constraints. So when people are feeling overworked, or when they're feeling burnt out, oftentimes there's an imbalance there where the organization perhaps is trying to achieve too much, or perhaps there aren't enough resources supplied here. If you can both internalize it to yourself and say, “Okay, it's up to me to set responsible boundaries so that I'm not burnt out, so that I'm not overworked and how do I, as a manager, support you in finding that boundary and helping push back when people try to violate your boundaries?” Also, how do we, as an organization, understand where that line is and understand what kind of slack do we have? Because I think a lot of times in organizations, it's hard to see are we at 20% capacity, 200% capacity? It's hard to see because the more work you throw at people, unless you're getting pushback, it seems as if you still have more slack, more line you can pull. Part of this is acknowledging that there is a systems level problem here where there's a lack of visibility into how overworked someone is and also, helping someone recognize hey, here's my boundary. We're over at. Now let's figure out a, how do we move that boundary back to where it needs to be so that I'm a positive contributor to this team and I can live my life [chuckles] in a happy way and also, how do we raise this in a way that the organization can see so that we can ultimately be more successful?” If an organization is burning people out and making them feel overworked all the time, the work is not going to be successful. You care for people first and great people who are cared for then care for your projects and deliver great work. JACOB: Yeah, and it's like how can there'd be a health check for every person and what would that look like because I think if people are left to determine that for themselves, you can get really different conclusions from person. ANDREW: That is a great question I don't know the answer to. [laughs] I've been thinking about this a lot recently. My organization has a project health check where weekly, or bi-weekly, I can't remember, each project team talks about the different aspects of the work and whether, or not they're feeling well-supported, or if there are things external to the project that are getting in the way of project success. That gives you a data and interesting insights. We also track our time and there is a way that we track our time that's flagged as support to the team. So that's where managers and people who are assisting in making big project decisions, those people track their time to that separate line. That's also interesting to look at because typically people ask for help after they already need it and the people that are close to the project can see that they need help. So if you're looking at the time tracking, usually a week, or two before something shows up on this project health tracker, you see a spike in hours in the kinds of support that people are providing to the project. We have a lot of interesting data on the project health side of things, but it's really hard to collect data on the people part of this in a way that like makes people feel supported and it doesn't feel creepy. [chuckles] There's a whole aspect to this on whether, or not people feel comfortable reporting that they are feeling overworked and I haven't solved this problem. I'm curious if you all have ideas. [chuckles] I'd love to learn. ARTY: One of the things I'm thinking about with burnout in particular is I don't think it's directly correlated to the volume of work you're doing. There's other aspects and dimensions of things that go into burnout. So if I'm working on something that I'm really excited about, it can be difficult, it can be really challenging, it can be a huge amount of work, and yet as I work on it, as I get to the other side of that mountain I'm climbing, burnout isn't what I'm feeling like. It's a rush being able to accomplish something difficult and worthwhile as we don't necessarily burn out directly in correlation with working too many hours say, or something directly related to that. The things I find that happen when people get burned out is when they lose their heart connection with what they're doing. When you love what you do, when you're excited about what you're working on, when you're engaged and connected to a sense of purpose with what you're doing, then we usually stay in a pretty good, healthy state. We've got to maintain not still keeping in someone in balance, but we're doing pretty okay. Where I see developers usually burning out is there's some heart crushing aspect of things where people are disconnecting disengaging with what they're doing emotionally and they go into this mode of not caring anymore, not having those same compelling reasons to want to do those things and such that when that love connection dissipates, that work becomes too hard to maintain, to force yourself to do. So you start getting burnt out because you're forcing self yourself to do things that aren't an intrinsically motivated thing. I feel like the types of things that we need to do are activities that encourage this sense of heart connection with our team, with our project, with our customers. We do need visibility into those things, but maybe conversations, or even just knowing that those things are important, making time to scheduling time to invest in those sorts of things. I'm curious your thoughts on that. ANDREW: Yeah. Thank you for flagging that specifically. I think there's one thing that comes to mind for me is that is this work that you once loved that you no longer love? Like, is this something that you've connected with in the past and this really motivated you and now you're not motivated, I should say and if that's the case, what changed? I think brains are tricky and I think that we've all over the last pandemic, [chuckles] the current pandemic, I should say, the COVID pandemic is the one I'm referring to. I think that as people have coped with lots of trauma in their lives and significant shifts and changes, it's come out in interesting ways. I think, especially as people are learning themselves a little more with new constraints, the impacts are not always directly connected between say, the project work that you're doing, maybe something that you once loved, and now suddenly you no longer feel attached to that. What is that? Is that the work is somehow different? Is it that you really just your threshold for everything else in your life is just ticking higher and higher and higher so now it's really hard to engage in any of the things that you once loved? I personally have found myself, through the COVID pandemic, really finding meaning in repetition. So now I'm like a 560-day Duolingo streak and I've got podcasts I listen to every day of the week, and this repetition helps mark time in a way that makes me feel more like I have my life together. That gives me more capacity and reduces that stress threshold for me. So I think trying to narrow in on what specifically changed and how do we tackle that problem head on, and it might not be the work, or connection to the work. The other side of the question is, is this work your love? Maybe this is work that they've never really loved. Maybe this is grunt work—and one thing that I like to acknowledge is that every project has a grunt work associated with it and if you don't really have a framework for rotating that grunt work, a lot of times it falls to the person who has the least privilege on the team. So if as a positive team, you can work together and say, “Hey, these are the set of tasks that just needs to get done,” maybe that's notetaking in meetings, maybe that's sending out weekly status emails, or running a particular meeting. “Let's rotate that around so that we can find a balance between the grunt work and then the work that we're here to do this stuff that motivates us.” Because if the grunt work doesn't get done, the project won't be successful, but also, we all really want to work on the other thing, too. So let's make sure that no one here gets shafted with all that work [chuckles] and I think especially if teams haven't deliberately thought about that, patterns start to emerge in which people with less privilege get shafted. So I think that's something to be well acknowledge. JACOB: Quick shoutout. Episode 162 of this podcast, we talked with Denise Yu who really is framing exactly what you're talking about. She calls it glue work and it's that work that's maybe not directly recognized as a value add, but is the work that holds all of it together. So all of the work that might get done in JIRA, or around a Wiki, or organizing meetings, taking notes, all the above. The basic theory is like you said, how can that glue work be distributed equitably? Not to say that certain roles don't intrinsically need to do certain types of glue work because that's what their expertise is in. But it was a really good conversation. So if people are interested, go check that out, too. ANDREW: What are some ways that you're seeing that pandemic affect people in their work? ANDREW: I think the answer to that question is as varied as the number of people [laughs] that I support. I think each person is affected in dramatically different ways, which I didn't quite expect, but taking a step back and thinking about it, of course, each person's individual and each person reacts differently. But I would say that for some people, especially people in care-taking roles, that kind of work has to shift to support them. So if you're someone caretaking, you're often dealing with a lot of details in your out of work life and especially through the pandemic, now those lives are merging together. I'm currently at a remote organization and have been at a remote organization for the last 10 years, or so. The remote work thing is not necessarily new, but the complete merging of all of the things life and work is something that's still new and I think a lot of people who work remotely regularly often find ways to get out and get more exposure to people in their personal time, which is also something that has been limited. Especially if you're caretaking, you likely are doing that even less of your threshold for getting out is even lower. So if you're constantly dealing with details in your life, it might be good for you to take on more of that glue work, or more of the when you're thinking about the – I think I've worked in three categories. You've got the stretching work, or your growth work and that's work that is right on the cusp of your understanding. You're not really good at it yet, but by failing and by having moderate success, you grow as an individual. There's also your comfortable work, or your safety work and that's work that you're good at, you can knock it out of the park, do it really fast. I think for folks who are dealing with a lot in their personal life at the moment, leaning more towards the glue work, more towards the safety work is really important for making you feel successful and you're not really hungering that growth. I wished I remember the reference, but I heard someone referring to growth as being in a boat in a river before. Sometimes the river is wide and sometimes the river is narrow. When the river is wide, you really need to row. I found myself personally, in the last couple of years, not necessarily needing to grow as much and the river feels more narrow to me. So the current is faster and you're taken away with growth and you don't really need to do a lot to get there. Instead, you need to hold on [laughs] and try not to capsize. So that's one aspect, I would say I've seen people… CASEY: That's such a cool metaphor. I'm going to remember that. ANDREW: Yeah. I wish I remembered where I heard it from so that I can reference it for you all. It's definitely not an original idea of mine. But another aspect of the way people have individually in coping and needing support is around their social connection and that's an easy example. I think we've all felt differences in our social connection through COVID and sometimes that takes the form of having more structured meetings. Some people find more structure gives them the ability to communicate with each other in a way that makes you feel social and also isn't as draining and other people are the exact opposite where they want to get together in a room with less structure so that you can all just hang out and the structure gives people a sense of feeling stressed. The way that I've been looking across my