Podcasts about Tuple

Finite ordered list of elements

  • 93PODCASTS
  • 277EPISODES
  • 42mAVG DURATION
  • 1MONTHLY NEW EPISODE
  • Jan 20, 2025LATEST

POPULARITY

20172018201920202021202220232024


Best podcasts about Tuple

Latest podcast episodes about Tuple

DOU Podcast
Зарплата в ІТ впала | Українці перемогли у хакатоні NASA | N-iX відкрились в Індії — DOU News #181

DOU Podcast

Play Episode Listen Later Jan 20, 2025 26:39


The Partially Examined Life Philosophy Podcast
PEL Presents PMP#185: Steve Martin: X-Tuple Threat

The Partially Examined Life Philosophy Podcast

Play Episode Listen Later Dec 1, 2024 51:05


Steve Martin was the biggest comic celebrity in the late '70s, became a huge movie star, and now delivers gentle comedy and fast banjo licks according to his desired rich guy schedule. In light of the popularity of Only Murders in the Building, we consider his many talents. Our 50ish hosts Mark and Sarahlyn are all in on this guy, but our 40ish hosts Lawrence and Al are not necessarily tickled. For more, visit prettymuchpop.com. Hear this ad-free with bonus content at patreon.com/prettymuchpop or by subscribing via Apple Podcasts to the Mark Lintertainment Channel.

Scrum Master Toolbox Podcast
BONUS: Mastering Remote Work in Agile Teams | Antony Marcano

Scrum Master Toolbox Podcast

Play Episode Listen Later Oct 5, 2024 47:54


BONUS: Mastering Remote Work in Agile Teams With Antony Marcano NOTE: We want to thank the folks at Tuple.app for being so generous with their stories, and supporting the podcast. Visit tuple.app/scrum and share them if you find the app useful! Remember, sharing is caring!   In this BONUS episode, Antony, co-founder of RiverGlide and Head of Engineering at Ford Digital, joins us to share his experiences and insights from 30 years in software development, including 25 years in Agile practices. As a technical practitioner, leader, and consultant, Antony reflects on navigating remote work, overcoming challenges, and setting up successful remote software teams, while exploring future trends in the industry. The Shift to Fully Remote Work Antony reflects on his first fully remote software project, which took place during the pandemic when everyone was forced to work from home. While his team had been working together for 12 months, they struggled with traditional video conferencing tools that lacked the ability to support pair programming or mob programming effectively. This is when Antony and his team discovered Tuple, a tool that allows for seamless control sharing and a co-located pairing experience. "Switching to Tuple was a game-changer for us in making remote pairing feel as interactive as in-person collaboration." Overcoming Challenges in Remote Collaboration The biggest challenge Antony identifies in remote work is the loss of serendipitous moments—those random watercooler conversations that often lead to innovation. To address this, Antony encourages teams to create opportunities for these moments by structuring time for informal interactions and fostering a safe and open communication culture. "You can't recreate the watercooler, but you can create opportunities for innovation by encouraging open-door policies and setting up shared virtual spaces." Building Effective Remote Teams For Antony, real collaboration is critical to the success of remote teams. He grew up on XP (Extreme Programming) and believes in the power of pairing and mob programming. Antony emphasizes the importance of maintaining good practices from in-person work, such as prioritizing mental well-being, while adapting to the unique needs of remote teams. "Collaboration is not just about tools—it's about mental well-being, trust, and giving the team what they need to succeed." Keeping Teams on Track with Clear Goals Antony shares his approach to ensuring that teams remain aligned with clear goals and progress tracking. His teams focus on delivering small, incremental slices of work and using techniques like limiting Work In Progress (WIP). Rather than viewing user stories as a list of tasks, Antony encourages teams to focus on the user benefit and desired outcomes. "It's about the ‘why,' not just the ‘what.' User stories should focus on the goal, not just be a list of tasks." The Future of Remote Work in Software Development Looking ahead, Antony predicts that tools will continue to evolve, with AI playing a more significant role in software development. He discusses the possibility of having AI participants in pairing sessions and shares his concerns about the convergence of tools that may lose focus over time. Antony encourages developers to experiment with new technologies and remain open to change. "AI is the next frontier in software development, and we need to embrace how it can enhance our remote work experiences." Recommended Resources for Mastering Remote Work Antony notes that while many resources on remote work are often too generic, there are valuable tools and practices software teams can adopt. He recommends regularly rotating hosts during remote pairing sessions and setting aside time for retrospectives and discussions about the bigger 'why' behind the work. "When pairing, rotate roles, reflect regularly, and always focus on the bigger ‘why' to keep your team aligned and motivated." About Antony Marcano Antony is the co-founder of RiverGlide and Head of Engineering at Ford Digital. With 30 years of software development experience, including 25 years in Agile practices, he is a respected leader, coach, and consultant. Antony has contributed to books and journals and is a keynote speaker at global conferences and universities such as Oxford and McGill. He is also the co-creator of 'PairWith.Us,' and remains a hands-on technical practitioner, specializing in Agile development and leading teams to excel in agility. You can link with Antony on LinkedIn visit RiverGlide.com, or check out RiverGlide TV on YouTube.

Scrum Master Toolbox Podcast
How Team Alignment Drives Product Success, A Product Owner's Journey | Eli Goodman

Scrum Master Toolbox Podcast

Play Episode Listen Later Oct 4, 2024 16:05


Eli Goodman: How Team Alignment Drives Product Success, A Product Owner's Journey NOTE: We want to thank the folks at Tuple.app for being so generous with their stories, and supporting the podcast. Visit tuple.app/scrum and share them if you find the app useful! Remember, sharing is caring! The Great Product Owner: The Collaborator PO In this episode, Eli Goodman, Head of Product at Tuple, shares an inspiring example of a Product Owner who truly embraced collaboration, ensuring the entire team was aligned with the product vision. Eli highlights the positive impact of this behavior on both team morale and product outcomes.  The Bad Product Owner: The Isolated PO Eli explores a classic Product Owner anti-pattern—working in isolation from the team. In this episode, he discusses the negative effects of this behavior on team collaboration and product success. Listen in to find out how Product Owners can avoid becoming isolated and instead foster collaboration within Agile teams.   About Eli Goodman Eli Goodman has been working on software teams for 17 years. He's been a full-stack developer and engineering manager at both large and small companies, including Etsy and Headspace. A few years ago, Eli transitioned to product management and is now the Head of Product at Tuple, a remote pair programming service used by companies such as Figma, Shopify, and many others in the software industry. You can link with Eli Goodman on LinkedIn, or email Eli at Eli@Tuple.app.

Scrum Master Toolbox Podcast
Keeping Product Teams Aligned, Advice for Product Leaders in Remote Teams | Eli Goodman

Scrum Master Toolbox Podcast

Play Episode Listen Later Oct 3, 2024 14:20


Eli Goodman: Keeping Product Teams Aligned, Advice for Product Leaders in Remote Teams NOTE: We want to thank the folks at Tuple.app for being so generous with their stories, and supporting the podcast. Visit tuple.app/scrum and share them if you find the app useful! Remember, sharing is caring! Eli reflects on the unique challenges of being a product manager for a distributed team. He emphasizes the importance of staying in touch with reality, testing assumptions, and journaling as key habits for success. He also shares tips on how to pair effectively with colleagues to maintain accountability and stay aligned with the team's goals. Listen in to find out what are some of the key habits that can help product managers thrive in remote environments. Featured Retrospective Format for the Week: The Sailboat Retrospective In this episode, Eli Goodman, Head of Product at Tuple, shares his favorite retrospective format: the Sailboat Retrospective. Eli explains why this format helps teams visualize their progress and challenges while promoting open communication. He highlights the importance of retrospectives in creating alignment and continuous improvement within distributed teams.    About Eli Goodman Eli Goodman has been working on software teams for 17 years. He's been a full-stack developer and engineering manager at both large and small companies, including Etsy and Headspace. A few years ago, Eli transitioned to product management and is now the Head of Product at Tuple, a remote pair programming service used by companies such as Figma, Shopify, and many others in the software industry. You can link with Eli Goodman on LinkedIn, or email Eli at Eli@Tuple.app.

Scrum Master Toolbox Podcast
BONUS: What the UK COVID App Project Taught Us About Remote Agile Collaboration | Giovanni Asproni

Scrum Master Toolbox Podcast

Play Episode Listen Later Oct 2, 2024 31:28


BONUS: What the UK COVID App Project Taught Us About Remote Agile Collaboration: A Conversation with Giovanni Asproni NOTE: We want to thank the folks at Tuple.app for being so generous with their stories, and supporting the podcast. Visit tuple.app/scrum and share them if you find the app useful! Remember, sharing is caring!   In this special BONUS episode, Giovanni Asproni, CTO and co-founder of Launch Ventures, takes us behind the scenes of his work on the UK government's COVID-19 app project. Giovanni shares insights into the rapid development process, the adoption of remote pairing and ensemble programming, and valuable lessons on leadership in large-scale, high-stakes projects. Giovanni also offers practical advice for teams embracing remote collaboration and agile methodologies. The Start of a Crucial Project "When we got the call from the UK government, we knew this was a mission to help stop the spread of the virus." Giovanni kicks off the episode by recounting how his team at Zühlke Engineering got involved in the development of the UK's COVID-19 app. Tasked with the challenge of building a solution that could help prevent the spread of the virus, they were under immense pressure to deliver quickly. Giovanni explains how they tackled technical hurdles, such as using Bluetooth technology to assess contagion risks, despite the lack of existing APIs on iOS and Android at the time. "Speed was essential, but we also needed a robust design—Bluetooth was key to evaluating contagion risks, even though we didn't have the APIs we needed." Overcoming Rapid Release Challenges "We had to move fast, but accessibility and coordination were non-negotiable." Giovanni discusses how the team, which consisted of around 60-70 members spread across the globe, used agile methodologies to stay organized and on schedule. By fostering open communication and using a clear team structure, they were able to streamline development. Agile planning and strong leadership, including cross-team coordination, were crucial to staying on track. "Agile was our backbone—every team knew their responsibility, and clear communication meant we could deploy with confidence." The Power of Remote Pairing and Ensemble Programming "Pairing allowed us to maintain quality under immense pressure." Giovanni dives deep into the practices of remote pairing and ensemble programming (or mobbing), which were introduced to enhance code quality and resilience during the project. With team members working remotely and under heavy scrutiny, mobbing provided a social outlet and improved problem-solving, while tools like Tuple made remote collaboration seamless. He reflects on the success of these practices, highlighting their impact on efficiency and team morale. "We embraced mobbing not just for resilience, but to stay connected in a time when social contact was scarce." Advice for Remote Pairing Beginners "Don't overthink it—just start and take breaks!" For teams new to remote pairing or ensemble programming, Giovanni offers simple but effective advice: give it a serious try, take breaks to avoid burnout, and don't overcomplicate the process. He emphasizes that these practices can dramatically improve productivity and team cohesion if executed well. "Take the plunge—remote pairing can feel awkward at first, but the benefits are worth it." Key Lessons on Remote Work and Collaboration "Don't try to recreate the office—remote work offers unique advantages." Reflecting on the lessons from the COVID-19 app project, Giovanni explains how remote work is not just a substitute for office work but an entirely different mode of collaboration. He warns against trying to replicate office dynamics remotely, and instead, encourages teams to embrace the benefits of remote settings, such as easier scheduling and fewer distractions from management oversight. "Remote work isn't about replicating the office—when done right, it's a whole new way to collaborate." Resources for Learning More "Explore the power of mob programming with these great resources." To wrap up, Giovanni shares a few key resources for listeners who want to dive deeper into remote pairing, ensemble programming, or leadership in software engineering. He recommends "Software Teaming" by Woody Zuill and the Remote Mob Programming website, which offers comprehensive guides and tools. You can also find out more about Giovanni's work at his company website: https://www.asprotunity.com. During the episode, Giovanni mentions a network of consultants, which you can access at: https://www.clockwork.ing. And the podcast Giovanni hosts is the Software Engineering Radio podcast. About Giovanni Asproni Giovanni Asproni is a consultant, CTO, and co-founder of Launch Ventures. He is an expert in agile development, software design, and modern software engineering practices. Giovanni is a host for the Software Engineering Radio podcast and a frequent speaker at international conferences. You can link with Giovanni Asproni on LinkedIn.

Scrum Master Toolbox Podcast
How A/B Testing Can Derail Product Development, A Product Leadership Story | Eli Goodman

Scrum Master Toolbox Podcast

Play Episode Listen Later Oct 1, 2024 11:58


Eli Goodman: How A/B Testing Can Derail Product Development, A Product Leadership Story NOTE: We want to thank the folks at Tuple.app for being so generous with their stories, and supporting the podcast. Visit tuple.app/scrum and share them if you find the app useful! Remember, sharing is caring! Eli Goodman, Head of Product at Tuple, discusses a recurring anti-pattern in product development: the over-reliance on A/B testing. Reflecting on his experiences at two different companies, Eli illustrates how A/B testing, when misused, can slow down product progress and lead to a bloated team structure. He also shares strategies on how to avoid this trap and take responsibility for product decisions. How can product teams avoid hiding behind A/B testing and instead move forward with confidence? Listen in to find out! Featured Book of the Week: The Idea Factory by Jon Gertner In this episode, Eli Goodman, Head of Product at Tuple, shares the profound influence of The Idea Factory, a book about Bell Labs, on his career as a product manager. Eli delves into how the book's lessons on creativity, innovation, and the long-term impact of foundational ideas have shaped his thinking. What can today's product leaders learn from the story of Bell Labs? How does creativity fuel product success, even in today's fast-paced tech world? Listen in to find out.   About Eli Goodman Eli Goodman has been working on software teams for 17 years. He's been a full-stack developer and engineering manager at both large and small companies, including Etsy and Headspace. A few years ago, Eli transitioned to product management and is now the Head of Product at Tuple, a remote pair programming service used by companies such as Figma, Shopify, and many others in the software industry. You can link with Eli Goodman on LinkedIn, or email Eli at Eli@Tuple.app.

Scrum Master Toolbox Podcast
The Risk of Investing in Non-Critical Features That Remove Focus From the Core Experience, A Product Leadership Story | Eli Goodman

Scrum Master Toolbox Podcast

Play Episode Listen Later Sep 30, 2024 13:23


Eli Goodman: The Risk of Investing in Non-Critical Features That Remove Focus From the Core Experience, A Product Leadership Story NOTE: We want to thank the folks at Tuple.app for being so generous with their stories, and supporting the podcast. Visit tuple.app/scrum and share them if you find the app useful! Remember, sharing is caring!   In this episode, Eli Goodman, Head of Product at Tuple, shares a compelling failure story that transformed his approach to product development. Eli reflects on a time when he ambitiously pursued building a community feature that seemed like a perfect addition to the product. However, the project didn't take off, leading to a realization about investing in features that aren't critical to the core user path. How do you identify which features truly belong in your product? And when is it time to pull the plug on an idea?   About Eli Goodman Eli Goodman has been working on software teams for 17 years. He's been a full-stack developer and engineering manager at both large and small companies, including Etsy and Headspace. A few years ago, Eli transitioned to product management and is now the Head of Product at Tuple, a remote pair programming service used by companies such as Figma, Shopify, and many others in the software industry. You can link with Eli Goodman on LinkedIn, or email Eli at Eli@Tuple.app.

Scrum Master Toolbox Podcast
BONUS: Mastering Product Management in a Remote World, Insights from Tuple's Head of Product | Eli Goodman

Scrum Master Toolbox Podcast

Play Episode Listen Later Sep 29, 2024 45:58


BONUS: Mastering Product Management in a Remote World, Insights from Tuple's Head of Product, Eli Goodman NOTE: We want to thank the folks at Tuple.app for being so generous with their stories, and supporting the podcast. Visit tuple.app/scrum and share them if you find the app useful! Remember, sharing is caring!   In this episode, Eli Goodman, Head of Product at Tuple, shares insights from his extensive experience in software development and product management. Having transitioned from engineering management to product leadership, Eli reveals the key strategies Tuple uses to develop its remote pair programming service, which is trusted by companies like Figma and Shopify. Tune in to discover how Tuple handles remote team dynamics, customer-driven development, and balances tech debt with client needs, all while maintaining a customer-centric focus. Introduction to Tuple and Why It's Unique Tuple, a remote pair programming service designed by engineers, solves a pain point that its founders, all pairing enthusiasts, experienced firsthand. They were unsatisfied with generic screen-sharing tools that disrupted the flow of coding collaboration. Tuple's product philosophy is about staying "one inch wide, one mile deep" to ensure the tool stays focused on enhancing the pairing experience without getting in the way. "The details matter. Generic screen-sharing tools just don't cut it for productive pairing." Managing a Remote Team at Tuple Managing a distributed team across the U.S. and Europe comes with its challenges. Eli highlights the importance of alignment and ensuring everyone is on the same page, despite working remotely. He emphasizes the role of Product Owners as "connective tissue" and the power of connecting team members with key initiatives. Through personal conversations, Eli uncovers what motivates his team, allowing him to support them without micromanaging. "What makes you proud? What brings you shame? Understanding these emotions helps uncover what drives our team." Ensuring Effective Communication in a Remote Environment Effective communication is the backbone of remote work, and Eli shares some of the practices that have helped Tuple's team stay aligned and collaborative. From using spontaneous pairing sessions to fostering a culture of checking in, Tuple has created a remote work environment where conversations are naturally sparked, and collaboration is effortless. "We have more space in our schedules for spontaneous pairing, which keeps collaboration flowing." Lessons Learned from Pairing Remotely One of the key insights Eli shares is how Tuple has evolved its remote pairing process. In the past, pairing might have felt like a formal meeting, but now it happens more spontaneously. Tuple's app facilitates this by offering the metaphor of a phone call—engineers can call each other at any time, making collaboration easy, especially when someone is deep into a task and needs quick support. "At Tuple, engineers only have three meetings a week, leaving the rest of the time open for pairing and creative work." Pairing Beyond Programming Tasks While pairing is typically associated with programming, Eli explains how Tuple uses pairing for other activities, like design or planning sessions. This practice has extended beyond coding, fostering a culture where team members collaborate on various tasks that benefit from shared perspectives and live problem-solving. "We've expanded pairing beyond coding, using it for activities like design reviews and project planning." Balancing Customer Feedback with Product Vision Responding to customer feedback is vital, but it can also lead to losing focus. Eli explains how Tuple balances this by capturing as much feedback as possible, using tools like Product Board to keep track of customer requests. However, instead of building every requested feature, Eli focuses on synthesizing broader patterns and emotional triggers that align with Tuple's long-term vision. "Focus on discovery as a product person. Understand the emotional context behind customer feedback—that's what drives great products." Tuple's Ideal Customer and Core Value Tuple's ideal customers are teams that value deep collaboration through pair programming. The platform's most important offering is the ability to make remote pairing seamless and intuitive, something traditional tools fail to deliver. "Tuple is built for teams that believe in the power of collaboration and want a tool that enhances their pairing experience, not disrupts it." Roadmapping: How to Prioritize the Right Work in Product Development Looking ahead, Eli shares Tuple's plans to continue investing in quality and lowering the barriers to remote pairing. One exciting potential direction includes creating a "social layer" within the app to help users feel more connected with their teammates. Another idea is incorporating non-human pairing agents that could assist with specific tasks. "We want to see if we can make it feel like you're right there with your teammates, lowering the barriers to start pairing." Recommended Resources Eli recommends The Mom Test by Rob Fitzpatrick, a must-read for anyone working in product management. The book teaches how to talk to customers in a way that gets honest, useful feedback rather than polite responses that don't help improve the product. "I thought caring about people was enough to talk to customers, but The Mom Test taught me what not to do during customer interviews." About Eli Goodman Eli Goodman has been working on software teams for 17 years. He's been a full-stack developer and engineering manager at both large and small companies, including Etsy and Headspace. A few years ago, Eli transitioned to product management and is now the Head of Product at Tuple, a remote pair programming service used by companies such as Figma, Shopify, and many others in the software industry. You can link with Eli Goodman on LinkedIn, or email Eli at Eli@Tuple.app.

Jean & Mike Do The New York Times Crossword
Tuesday, September 3, 2024 -

Jean & Mike Do The New York Times Crossword

Play Episode Listen Later Sep 4, 2024 16:06


This is Alex Eaton-Salner's 70th NYTimes crossword, and it got to be their 70th, in part*, because of an ingenious theme, and in part because of the superstition that to turn down a crossword with BORIC in the grid (8D, Kind of acid used to make Silly Putty) is exceptionally unlucky**Show note imagery: PEI, in its place*we suspect: editor Joel Fagliano plays his cards pretty close to the vest**hey, it's just a superstition

The Mob Mentality Show
Exploring Collaborative Programming with Tuple's Eli Goodman

The Mob Mentality Show

Play Episode Listen Later Jul 2, 2024 48:52


Join us on this enlightening episode of the Mob Mentality Show as we dive deep into the world of collaborative programming with our special guest, Eli Goodman from Tuple. In this episode we explore the intricacies of mob programming, the innovative tools designed for enhanced teamwork, and the future of Tuple. ### Highlights from Our Discussion: **Eli's Mobbing Questions for Austin and Chris:** - **Last Time Mobbed?**  - **Duration and Techniques**  - **Team Dynamics**  - **Austin's Recent Mob Journey**  - **Chris' Leadership and Mob Hopping** - **Visualizing Connections** - **Continuous Improvement and Diffusion of Innovation** - **When to Mob and When to Not** **Tools for Mob Programming:** - **Popular Tools** - **Monitor Usage** - **Tech Enhancements** - **Chat and Note Integration** - **Equal Navigation and Code Verbalization** **Inside Tuple:** - **Eli's Role** - **Origin Story** - **Tuple's Progress** - **Technical Excellence** - **Social Layer Integration** - **Resource Efficiency** - **Focused Functionality** - **User Base** - **Future Prospects** This episode is a must-watch for anyone interested in mob programming, team collaboration, and cutting-edge tools that facilitate efficient and effective coding practices. Whether you're a seasoned mob programmer or new to the concept, Eli Goodman's insights will provide valuable knowledge and inspiration for your programming journey. Don't forget to like, comment, and subscribe for more episodes packed with valuable programming insights! Video and show notes: https://youtu.be/eiLz_9-a-I4  

Syntax - Tasty Web Development Treats
771: Promises: Error Handling, Aborts, and Helper Methods - Part 2

Syntax - Tasty Web Development Treats

Play Episode Listen Later May 20, 2024 21:06


We're diving into part 2 of our 3-part series on Promises, focusing on error handling, aborts, and essential helper methods. We'll explore how to manage errors effectively and improve performance with abort signals. Let's get into it! Show Notes 00:00 Welcome to Syntax! 00:41 Brought to you by Sentry.io. 02:00 Cancelling promises. 05:16 Why would you reach for an abort signal? 06:26 Promise helpers. 07:04 Promise.all() vs Promise.allSettled(). 09:12 promiseInstance.finally() 09:26 Promise.any() and Promise.race() 12:08 Error handling strategies. Tuple await-to-js. Youtube - 5 Async + Await Error Handling Strategies. 17:30 Promise.race() example. 18:54 Static Promise.reject() and .resolve() methods. Hit us up on Socials! Syntax: X Instagram Tiktok LinkedIn Threads Wes: X Instagram Tiktok LinkedIn Threads Scott:X Instagram Tiktok LinkedIn Threads Randy: X Instagram YouTube Threads

República Web
Errores previsibles del desarrollador convertido en fundador

República Web

Play Episode Listen Later Apr 10, 2024 21:43


Tras una larga pausa vuelvo a las grabaciones del podcast. Para esta nueva etapa quiero hablar de la estupenda charla ofrecida por Ben Orenstein en la conferencia Laracon US 2023 titulada  "Predictable Mistakes of the Developer-Turned-Founder". En esta presentación Ben aborda los retos habituales a los que se enfrentan los desarrolladores que pasan a desempeñar el papel de fundador. Desde su propia experiencia en su empresa Tuple de varios años, Ben Orenstein ofrece valiosos consejos sobre cómo superar estos desafíos y fomentar una transición exitosa en el mundo del emprendimiento. Entre los errores que nos comenta Ben en su charla comentaré los siguientes: Empezar con la filosofía del SAAS en mente. Escoger una mala idea. Enfocarse en vender clientes individuales en lugar de a buenos negocios. Venderle a negocios baratos. Asumir que no debe existir competencia en el mercado. Escribir código. No enfocarse en un entorno deseable como profesional. No hacer email marketing. No hacer buen pricing. No atender la experiencia de usuario desde el principio. Sobreconstruir soluciones. No ser autosuficiente financieramente y contar con inversores externos sin conexión. No ir acompañado y no hacer networking. Os recomiendo ver la charla completa en YouTube donde Ben explica con detalle todos estos puntos. Espero tus comentarios y participación en este episodio. ¡Gracias!

Hackers Incorporated
Ben steps away from Tuple

Hackers Incorporated

Play Episode Listen Later Apr 2, 2024 71:22


After almost six years, Ben has stepped away from day-to-day work on Tuple and moved to its board. Friend of the pod Aaron Francis interviews Ben about the whole beautiful, complicated, enriching experience. As a treat, the boys dive into what's next for Aaron as well.

The Bike Shed
419: What's New in Your World? (Extended Edition)

The Bike Shed

Play Episode Listen Later Mar 19, 2024 37:13


Stephanie introduces her ideal setup for enjoying coffee on a bike ride. Joël describes his afternoon tea ritual. Exciting news from the hosts: both have been accepted to speak at RailsConf! Stephanie's presentation, titled "So, Writing Tests Feels Painful. What now?" aims to tackle the issues developers encounter with testing while offering actionable advice to ease these pains. Joël's session will focus on utilizing Turbo to create a Dungeons & Dragons character sheet, combining his passion for gaming with technical expertise. Their conversation shifts to artificial intelligence and its potential in code refactoring and other applications, such as enhancing the code review process and solving complex software development problems. Joël shares his venture into combinatorics, illustrating how this mathematical approach helped him efficiently refactor a database query by systematically exploring and testing all potential combinations of query segments. Transcript:  JOËL: Hello and welcome to another episode of The Bike Shed, a weekly podcast from your friends at thoughtbot about developing great software. I'm Joël Quenneville. STEPHANIE: And I'm Stephanie Minn, and together, we're here to share a bit of what we've learned along the way. JOËL: So, Stephanie, what's new in your world? STEPHANIE: So, today I went out for a coffee on my bike, and I feel like I finally have my perfect, like, on-the-go coffee setup. We have this thoughtbot branded travel mug. So, it's one of the little bits of swag that we got from the company. It's, like, perfectly leak-proof. I'll link the brand in the show notes. But it's perfectly leak-proof, which is great. And on my bike, I have a little stem bag, so it's just, like, a tiny kind of, like, cylindrical bag that sits on the, like, vertical part of my handlebars that connects to the rest of my bag. And it's just, like, the perfect size for a 12-ounce coffee. And so, I put my little travel mug in there, and I just had a very refreshing morning. And I'd gone out on my bike for a little bit, stopping by for coffee and headed home to work. And I got to drink my coffee during my first meeting. So, it was a wonderful way to start the day. JOËL: Do you just show up at the coffee shop with your refillable mug and say, "Hey, can you pour some coffee in this?" STEPHANIE: Yeah. I think a lot of coffee places are really amenable to bringing your own travel mugs. So yeah, it's really nice because I get to use less plastic. And also, you know, when you get a to-go mug, it is not leak-proof, right? It could just slosh all over the place and spill, so not bike-friendly. But yeah, bring your own mug. It's very easy. JOËL: Excellent. STEPHANIE: So, Joël, what's new in your world? JOËL: Also, warm beverages. Who would have thought? It's almost like it's cold in North America or something. I've been really enjoying making myself tea in the afternoons recently. And I've been drinking this brand of tea that is a little bit extra. Every flavor of tea they have comes with a description of how the tea feels. STEPHANIE: Ooh. JOËL: I don't know who came up with these, but they're kind of funny. So, one that I particularly enjoy is described as feels like stargazing on an empty beach. STEPHANIE: Wow. That's very specific. JOËL: They also give you tasting notes. This one has tastes of candied violet, elderberry, blackberry, and incense. STEPHANIE: Ooh, that sounds lovely. Are you drinking, like, herbal tea in the afternoon, or do you drink caffeinated tea? JOËL: I'll do caffeinated tea. I limit myself to one pot of coffee that I brew in the morning, and then, whenever that's done, I switch to tea. Tea I allow myself anything: herbal, black tea; that's fine. STEPHANIE: Yeah, I can't have too much caffeine in the afternoon either. But I do love an extra tea. I wish I could remember, like, what even was in this tea or what brand it was, but once I had a tea that was a purplish color. But then, when you squeeze some lemon in it, or I guess maybe anything with a bit of acid, it would turn blue. JOËL: Oh, that's so cool. STEPHANIE: Yeah, I'll have to find what this tea was [laughs] and update the podcast for any tea lovers out there. But yeah, it was just, like, a little bit of extra whimsy to your regular routine. JOËL: I love adding a little whimsy to my day, even if it's just seeing a random animated GIF that a coworker has sent or Tuple has some of the, like, reactions you can send if you're pairing with someone. And I don't use those very often, so whenever one of those comes through, and it's like, ship it or yay, that makes me very happy. STEPHANIE: Agreed. JOËL: This week is really fun because as we were prepping for this episode, we both realized that there is a lot that's been new in our world recently. And Stephanie, in particular, you've got some pretty big news that recently happened to you. STEPHANIE: Yeah, it turns out we're making the what's new in your world segment the entire episode today [laughs]. But my news is that I am speaking at RailsConf this year, so that is May 7th through 9th in Detroit. And so, yeah, I haven't spoken at a RailsConf before, only a RubyConf. So, I'm looking forward to it. My talk is called: So, Writing Tests Feels Painful. What now? JOËL: Wait, is writing tests ever painful [laughs]? STEPHANIE: Maybe not for you, but for the rest of us [laughs]. JOËL: No, it absolutely is. I, right before this recording, came from a pairing session where we were scratching our heads on an, like, awkward-to-write test. It happens to all of us. STEPHANIE: Yeah. So, I was brainstorming topics, and I kind of realized, especially with a lot of our consulting experience, you know, we hear from developers or even maybe, like, engineering managers a lot of themes around like, "Oh, like, development is slowing down because our test suite is such a headache," or "It's really slow. It's really flaky. It's really complicated." And that is a pain point that a lot of tech leaders are also looking to address for their teams. But I was really questioning this idea that, like, it always had to be some effort to improve the test suite, like, that had to be worked on at some later point or get, like, an initiative together to fix all of these problems, and that it couldn't just be baked into your normal development process, like, on an individual level. I do think it is really easy to feel a lot of pain when trying to write tests and then just be like, ugh, like, I wish someone would fix this, right? Or, you know, just kind of ignore the signals of that pain because you don't know, like, how to manage it yourself. So, my talk is about when you do feel that pain, really trying to determine if there's anything you can do, even in just, like, the one test file that you're working in to make things a little bit easier for yourself, so it doesn't become this, like, chronic issue that just gets worse and worse. Is there something you could do to maybe reorganize the file as you're working in it to make some conditionals a little bit clearer? Is there any, like, extra test setup that you're like, "Oh, actually, I don't need this anymore, and I can just start to get rid of it, not just for this one example, but for the rest in this file"? And do yourself a favor a little bit. So yeah, I'm excited to talk about that because I think that's perhaps, like, a skill that we don't focus enough on. JOËL: Are you going to sort of focus in on the side of things where, like, a classic TDD mantra is that test pain reflects underlying code complexity? So, are you planning to focus on the idea of, oh, if you're feeling test pain, maybe take some time to refactor some of the code that's under test, maybe because there's some tight coupling? Or are you going to lean a little bit more into maybe, like, the Boy Scout rule, you know, 'Leave the campsite cleaner than you found it' for your test files? STEPHANIE: Ooh, I like that framing. Definitely more of the former. But one thing I've also noticed working with a lot of client teams is that it's not always clear, like, how to refactor. I think a lot of intermediate developers start to feel that pain but don't know what to do about it. They don't know, like, maybe the code smells, or the patterns, or refactoring strategies, and that can certainly be taught. It will probably pull from that. But even if you don't know those skills yet, I'm wondering if there's, like, an opportunity to teach, like, developers at that level to start to reflect on the code and be like, "Hmm, what could I do to make this a little more flexible?" And they might not know the names of the strategies to, like, extract a class, but just start to get them thinking about it. And then maybe when they come across that vocabulary later, it'll connect a lot easier because they'll have started to think about, you know, their experiences day to day with some of the more conceptual stuff. JOËL: I really like that because I feel we've probably all heard that idea that test pain, especially when you're test driving, is a sign of maybe some anti-patterns or some code smells in the underlying code that you're testing. But translating that into something actionable and being able to say, "Okay, so my tests are painful. They're telling me something needs to be refactored. I'm looking at this code, and I don't know what to refactor." It's a big jump. It's almost the classic draw two circles; draw the rest of the owl meme. And so, I think bridging that gap is something that is really valuable for our community. STEPHANIE: Yeah, that's exactly what I hope to do in my talk. So, Joël, you [chuckles] also didn't quite mention that you have big news as well. JOËL: So, I also got accepted to speak at RailsConf. I'm giving a talk on Building a Dungeons & Dragons Character Sheet Using Turbo. STEPHANIE: That's really awesome. I'm excited because I want to learn more about Turbo. I want someone else to tell me [laughs] what I can do with it. And as a person with a little bit of Dungeons & Dragons experience, I think a character sheet is kind of the perfect vehicle for that. JOËL: Building a D&D character sheet has been kind of my go-to project to experiment with a new front-end framework because it's something that's pretty dynamic. And for those who don't know, there's a bunch of fields that you fill in with stats for different attributes that your character has, but then those impact other stats that get rendered. And sometimes there can be a chain two or three long where different numbers kind of combine together. And so, you've got this almost dependency tree of, like, a particular number. Maybe your skill at acrobatics might depend on a number that you entered in the dexterity field, but it also depends on your proficiency bonus, and maybe also depends on the race that you picked and a few other things. And so, calculating those numbers all of a sudden becomes not quite so simple. And so, I find it's a really fun exercise to build when trying out a new interactive front-end technology. STEPHANIE: Have you done this with a different implementation or a framework? JOËL: I've done this, not completely, but I've attempted some parts of a D&D character sheet, I think, with Backbone.js with Ember. I may have done an Angular one at some point in original Angular, so Angular 1. I did this with Elm. Somehow, I skipped React. I don't think I did React to build a D&D character sheet. And now I'm kind of moving a little bit back to the backend. How much can we get done just with Turbo? Or do we need to pull in maybe Stimulus? These are all things that are going to be really fun to demonstrate. STEPHANIE: Yeah. Speaking of injecting some whimsy earlier, I think it's kind of like just a little more fun than a regular to-do app, you know, or a blog to show how you can build, you know, something that people kind of understand with a different technology. JOËL: Another really fun thing that I've been toying with this week has been using AI to help me refactor code. And this has been using just sort of a classic chat AI, not a tool like Copilot. And I was dealing with a query that was really slow, and I wanted to restructure it in a different way. And I described to the AI how I wanted it to refactor and explicitly said, "I want this to be the same before and after." And I asked it to do the refactor, and it gave me some pretty disappointing results where it did some, like, a couple of really obvious things that were not that useful. And I was talking to a colleague about how I was really disappointed. I was thinking, well, AI should be able to do something better than this. And this colleague suggested changing the way I was asking for things and specifically asking for a step-by-step and asking it to prove every step using relational algebra, which is the branch of math that deals with everything that underlies relational databases, so the transformations that you would do where you keep everything the same, but you're saying, "Hey, these equations are all equivalent." And it sure did. It gave me a, like, 10-step process with all these, like, symbols and things. My relational algebra is not that strong, and so I couldn't totally follow along. But then I asked it to give me a code example, like, show me the SQL at every step of this transformation and at the end. And, you know, it all kind of looked all right. I've not fully tested the final result it gave me to see if it does what it says on the tin. But I'm cautiously optimistic. I think it looks very similar to something that I came up with on my own. And so, I'm somewhat impressed, at least, like, much better than things were in the beginning with that first round. So, I'm really curious to see where I can take this. STEPHANIE: Yeah, I think that's cool that you were able to prompt it differently and get something more useful. One of the reasons why I personally have been a little bit hesitant to get into the large language models is because I would love to see the AI show its work, essentially, like, tell me a little bit more about how it got from question to answer. And I thought that framing of kind of step-by-step show me code was a really interesting way, even to just, like, get some different results that do the same thing. But you can kind of evaluate that a little bit more on your own rather than just using that first result that it gave you that was like, eh, like, I don't know if this really did anything for me. So, it would be cool, even if you don't end up using, like, the final one, right? If something along the way also is an improvement from what you started with that would be really interesting. JOËL: Honestly, I think you kind of want the same thing if you're chatting with an AI chatbot or having a conversation in Slack with a colleague. They're just like, "Hey, can you help me refactor this?" And then a sort of, like, totally different chunk of code. And it's just like, "Trust me, it works." STEPHANIE: [laughs]. JOËL: And maybe it does. Maybe you plug it into your codebase and run the tests against it, and the tests are still green. And so, you trust that it works, but you don't really understand where it came from. That doesn't always feel good, even when it comes from a human. So, what I've appreciated with colleagues has been when they've given me a step-by-step. Sometimes, they give me the final product. They just say, "Hey. Try this. Does this work?" Plug it in to the test. It does pass. It's green. Great. "Tell me what black magic you did to get to that." And then they give me the step-by-step and it's like, oh, that's so good because not only do I get a better understanding of what happens at every step, but now I'm equipped the next time I run into this problem to apply the same technique to figure it out on my own. STEPHANIE: Yeah. And I liked, also, that relational algebra pro tip, right? It kind of ensures that what you're getting makes sense or is equivalent along the way [laughs]. JOËL: We think, right? I don't know enough relational algebra to check its work. It is quite possible that it is making some subtle mistakes along the way, or, like, making inferences that it shouldn't be. I'm not going to say I trust that. But I think, specifically, when asking for SQL transformations, prompting it to do so using relational algebra in a step-by-step way seemed to be a way to get it to do something more reliably or at least give more interesting results. STEPHANIE: Cool. JOËL: I was interested in trying this out in part because I've been more curious about AI tools recently, and also because we're hoping to do a deeper dive into AI on a Bike Shed episode at some point later, so very much still in the gathering information phase. But this was a really cool experience. So, having an AI refactor a query for me using relational algebra, definitely something that's new in my world this week. STEPHANIE: Speaking of refactoring and this idea of making improvements to your code and trying to figure out how to get from what you currently have to something new, I have been thinking a lot about how to make code reviews more actionable. And that's because, on my current client project, our team is struggling a little bit with code reviews, especially when you kind of want to give feedback on more of a design change in the code or thinking about some different abstractions. I have found that that is really hard to communicate async and also in a, like, a GitHub code review format where you can really just comment, like, line by line. And I've found that, you know, when someone is leaving feedback, that's like, "I'm having a hard time reading this. And I'm imagining that we could organize the code a bit differently in these three different layers or abstractions," there's a lot of assumptions there, right [laughs]? That your message is being communicated to the author and that they are able to, like, visualize, or have a mental model for what you're explaining as well. And then kind of what I've been seeing in this dynamic is, like, not really knowing what to do with that and to kind of just, like, I don't know where to go from here. So, I guess the next step is just to, like, merge it. Is that something you've experienced before or encountered when it comes to feedback? JOËL: Broader changes are often challenging to explain, especially when they're...sometimes you get so abstract you can just write a quick paragraph. And sometimes it's like, hey, what if we, like, totally change our approach? I've definitely done the thing where I'll just ping someone and say, "Hey, can we talk about this synchronously? Can we get on a call and have a deeper conversation?" How do you tend to approach if you're not going to hop on a call with someone and, like, have a 20 or 30-minute conversation? How do you approach doing that asynchronously on a pull request? Are you the type of person to put, like, a ton of, like, code blocks, like, "Here's what I was thinking. We could instead have this class and this thing"? And, like, pretty soon, it's, like, a page and a half of text. Or do you have another approach that you like to use? STEPHANIE: Yeah. And I think that's where it can get really interesting. Because my process is, I'll usually just start commenting and maybe if I'm seeing some things that can be done differently. If it's not just, like, a really obvious change that I could just use English to describe, I'll add a little suggested change. But I also don't want to just rewrite this person's code [laughs] in a code review. JOËL: That's the challenge, right? STEPHANIE: Yeah. And I've definitely seen that be done before, too. Once I notice I'm at, like, four plus comments, and then they're not just, like, nitpicks about, like, syntax or something like that, that helps me clue into the idea that there is some kind of bigger change that I might be asking of the author. And I don't want to overwhelm them with, like, individual comments that really are trying to convey something more holistic. JOËL: Right. I wonder if having a, like, specialized yet more abstract language is useful for these sorts of things where a whole paragraph in English or, you know, a ton of code examples might be a bit much. If you're able to say something like, "Hey, how would you feel about using a strategy pattern approach here instead of, you know, maybe a template object or some custom thing that we've built here?" that allows us to say a lot in a fairly sort of terse way. And it's the thing that you can leave more generically on the PR instead of, like, individually commenting in a bunch of places. And that can start a broader conversation at more of an architecture level. STEPHANIE: Yes, I really like that. That's a great idea. I would follow that up with, like, I think at the end of the day, there are some conversations that do need to be had synchronously. And so, I like the idea of leaving a comment like that and just kind of giving them resources to learn what a strategy pattern is and then offering support because that's also a way to shorten that feedback loop of trying to communicate an idea. And I like that it's kind of guiding them, but also you're there to add some scaffolding if it ends up being, like, kind of a big ask for them to figure out what to do. JOËL: There's also oftentimes, I think, a tone thing to manage where, especially if there's a difference in seniority or experience between the two people, it can be very easy for something to come across as an ask or a demand rather than a like, "Hey, let's think about some alternatives here." Or, like, "I have some concerns with your implementation. Let's sort of broadly explore some possible alternatives. Maybe a strategy pattern works." But the person reading that who wrote the original code might be, like, receiving that as "Your code is bad. You should have done a strategy pattern instead." And that's not the conversation I want to have, right? I want to have a back-and-forth about, "Hey, what are the trade-offs involved? Do you have a third architecture you'd like to suggest?" And so, that can be a really tricky thing to avoid. STEPHANIE: Yeah, I like that what you're saying also kind of suggested that it's okay if you don't have an idea yet for exactly how it should look like. Maybe you just are like, oh, like, I'm having a hard time understanding this, but I don't think just leaving it at that gives the author a lot to go on. I think there's something to it about maybe the action part of actionable is just like, "Can you talk about it with me?" Or "Could you explain what you're trying to do here?" Or, you know, leave a comment about what this method is doing. There's a lot of ways, I think, that you can reach some amount of improvement, even if it doesn't end up being, like, the ideal code that you would write. JOËL: Yes. There's also maybe a distinction in making it actionable by giving someone some code and saying, "Hey, you should copy-paste this code and make that..." or, you know, use a GitHub suggested code or something, which works on the small. And in the big, you can give some maybe examples and say, "Hey, what if you refactored in this way?" But sometimes, you could even step back and let them do that work and say, "Hey, I have some concerns with the current architecture. It's not flexible in the ways that we need to be flexible. Here's my understanding of the requirements. And here's sort of how I see maybe this architecture not working with that. Let's think of some different ways we could approach this problem." And oftentimes, it's nice to give at least one or two different ideas to help start that. But it can be okay to just ask the person, "Hey, can you come up with some alternate implementations that would fulfill these sets of requirements?" STEPHANIE: Yeah, I like that. And I can even see, like, maybe you do that work, and you don't end up pursuing it completely in addressing that feedback. But even asking someone to do the exercise itself, I think, can then spark new ideas and maybe other improvements. In general, I like to think about...I'm a little hesitant to use this metaphor because I'm not actually giving code, like, letter grades when I review them, but the idea that, like, not all code has to get, like, an A [chuckles], but maybe getting it, like, from one letter grade up to, like, half a letter grade, like, higher, that is valuable, even if it's not always practical to go through multiple rounds of code review. And I think just making it actionable enough to be a little bit better, like, that is, in my opinion, the sweet spot. JOËL: That's true. The sort of over-giving feedback to someone to try to get code perfect, rather than just saying, "Hey, can we make it slightly better?" And, you know, there are probably some minimum standards you need to hit. But at some point, it's a trade-off of like, how much time do we need to put polishing this versus shipping something? STEPHANIE: Yeah, and I think that it is cumulative over time, right? That's how people learn. Yeah, it's like one of the biggest opportunities for developers to level up is from that feedback. And that's why I think it's important that it's actionable because, you know, and you put the time into, like, giving that review, and it's not just to make sure the code works, but it's also, like, one of the touch points for collaboration. JOËL: So, if you had to summarize what makes code review comments actionable, do you have, like, top three tips that make a comment really actionable as opposed to something that's not helpful? Or maybe that's more of the journey that you're on, and you've not distilled it down to three pithy tips that you can put in a listicle. STEPHANIE: Honestly, I think it does kind of just distill down to one, which is for every comment, you should have an idea of what you would like the author to do about it. And it's okay if it's nothing, but then tell them that it's nothing. You could just be expressing, "I thought this was kind of weird, [laughs]" or "This is not my favorite thing, but it's okay." JOËL: And it can be okay for the thing you want the author to do. It doesn't have to be code. It could be a conversation. STEPHANIE: Yeah, exactly. It could be a conversation. It could be asking for information, too, right? Like, "Did you consider alternatives, and could you share them with me?" But that request portion, I think is really important because, yeah, I think there's so much miscommunication that can happen along the way. So, definitely still trying to figure out how to best support that kind of code review culture on my team. JOËL: This week's episode has been really fun because it's just been a combination of a lot of things that are new in our world, things that we've been trying, things that we've been learning. And kind of in an almost, like, a meta sense, one of the things I've been digging into is combinatorics, the branch of math that looks at how things combine and particularly how it works with combining a bunch of ActiveRecord query fragments where there's potential branching, so things like doing a union of two sort of sub queries or doing an or where you're combining two different where queries and trying to figure out what are the different paths through that. STEPHANIE: Wow, what a great way to combine what we were talking about, Joël [laughs]. Did you apply combinatorics to this podcast episode [laughs]? JOËL: Somehow, topics multiply with each other, something, something. STEPHANIE: Yeah, that makes sense to me [laughs]. Okay. Will you tell me more about what you've been using it for in your queries? JOËL: So, one thing I'm trying to do is because I've got these different branching paths through a query, I want to see sort of all the different ways because these are defined as ActiveRecord scopes, and I'm chaining them together. And it looks linear because I'm calling scope1 dot scope2 dot scope3. But each of those have branches inside of them. And so, there's all these different ways that data could get used or not. And one way that I figured out, like, what are the different paths here, was actually drawing out a matrix, just putting together a table. In this case, I had two scopes, each of which had a two-way branch inside, and so I made a two by two matrix. And that gave me all of the combinations of, oh, if you go down one branch in one scope and down another branch in the other scope. And what I went through is then I went in in each square and filled in how many records I would expect to get back from the query from some basic set that I was working on in each of these combinations. And one thing that was really interesting is that some of those combinations were sort of mutually exclusive, where a scope further down the line was filtering on the same field as an earlier one and would overwrite it or not overwrite it, but the two would then sort of you can't have both of those things be true at the same time. So, I'm looking for something that has a particular manager ID, and then I'm looking for something that has a particular different manager ID. And the way Rails combines these, if you just change scopes with where, is to and them together. There are no records that have both manager ID 1 and manager ID 2. You can only have one manager ID. And so, as I'm filling out my matrix, there's some sections I can just zero out and be like, wait, this will always return zero record. And then I can start focusing on the parts that are not zeroed out. So, I've got two or three squares. What's special about those? And that helped me really understand what the combination of these multiple query fragments together were actually trying to do as a holistic whole. STEPHANIE: Wow, yeah, that is really interesting because I hear you when you say it looks linear. And it would be really surprising to me for there to be branching paths. Like, that's not really what I think about when I think about SQL. But that makes a lot of sense that it could get so complicated that it's just impossible to get a certain kind of result. Like, what's going to be the outcome of applying combinatorics to this? Is there a refactoring opportunity, or is it really just to even understand what's going on? JOËL: So, this was a refactoring that I was trying to do, but I didn't really understand the underlying behavior of the chain of scopes. I just knew that they were doing some complex things that were inefficient from a SQL perspective. And so, I was looking at ways to refactor, but I also wanted to get a sense of what is this actually trying to do other than just chaining a bunch of random bits of code together? So, the matrix really helped for that. The other way that I used it was to write some tests because this query I was trying to refactor, this chain of scopes, was untested. And I wanted to write tests that were very thorough because I wanted to make sure that my refactor didn't break any edge cases. And I'm, you know, writing a few tests. Okay, well, here's a record that I definitely want to get returned by this query, and maybe here are a couple of records I don't want to get returned. And the more I was, like, going into this and trying to write test cases, the more I was finding more edge cases that I didn't want to and, oh, but what about this? And what about the combination of these things? And it got to the point where it was just messing with my mind. I was, like, confusing myself and really struggling to write tests that would do anything useful. STEPHANIE: Wow. Yeah. Honestly, I have already started to become a little bit suspicious of complex scopes, and this further pushes me in that direction [laughs] because yeah, once you start to...like, the benefit of them is that you can chain them, but it really hides a lot of the underlying behavior. So, you can easily just turn yourself around or, like, go, you know, kind of end up [laughs] in a little bit of a bind. JOËL: Definitely, especially once it grows a little bit harder to hold in your head. And I don't know exactly where that level is for me. But in this particular situation, I identified, I think, five different dimensions that would impact the results of this query. And then each dimension had maybe three or four different values that we might care about. And, eventually, I just took the time to write this out. So, I created five arrays and then just said, "Hey, here are the different managers that we care about. Here are the different project types we care about. Here are the different..." and we had, like, five of these, and each array had three or four elements in it. And then, in a series of nested loops, I iterated through all of these arrays and at the innermost loop, created the data that I wanted that matched that particular set of values. Now, we're often told you should not be doing things in nested loops because you end up sort of multiplying all of these together, but, in this case, this is actually what I wanted to do. You know, it turns out that I had a hundred-ish records I had to create to sort of create a data set that would be all the possible edge cases I might want to filter on. And creating them all by hand with all of the different variations was going to be too much. And so, I ended up doing this with arrays and nested loops. And it got me the data that I needed. And it gave me then the confidence to know that my refactor did indeed work the way I was expecting. STEPHANIE: Wow. That's truly hero's work [chuckles]. I'm, like, very excited because it sounds like that's a huge opportunity for some performance improvements as well. JOËL: For the underlying code, yes. The test might be a little bit slow because I'm creating a hundred records in the database. And you might say, "Oh, do you really need to do that? Can you maybe collapse some of these cases?" In this particular case, I really wanted to have high confidence that the refactor was not changing anything. And so, I was okay creating a hundred records over a series of nested iterations. That was a price I was willing to pay. The refactored query, it turns out, I was able to write it in a way that was significantly faster. STEPHANIE: Yeah, that's what I suspected. JOËL: So, I had to rewrite it in a way that didn't take advantage of all the change scopes. I had to just sort of write something custom from scratch, which is often the case, right? Performance and reusability sometimes fight against each other, and it's a trade-off. So, I'm not reusing the scopes. I had to write something from scratch, but it's multiple hundreds of times faster. STEPHANIE: Wow. Yeah. That seems worth it for a slow test [laughs] for the user experience to be a lot better, especially when you just reach that level of complexity. And it's a really awesome strategy that you applied to figure that out. I think it's a very unique one [laughs]. That's for sure. JOËL: I've had an interest in sort of analytical tools to help me understand domain models, to help understand problems, to help understand code that I'm working with for a while now, and I think an understanding of combinatorics fits into that. And then, particular tools within that, such as drawing things out in a table, in a two by two matrix, or an end-by-end matrix to get something visual, that's a great tool for debugging or understanding a problem. Thinking of problems as data that exists in multiple dimensions and then asking about the cardinality of that set it's the kind of analysis I did a lot when I was modeling using algebraic data types in Elm. But now I've sort of taken some of the tools and analysis I use from that world into thinking about things like SQL records, things like dealing with data in Ruby. And I'm able to bring those tools and that way of thinking to help me solve some problems that I might struggle to solve otherwise. For any of our listeners who this, like, kind of piques their interest, combinatorics falls under a broader umbrella of mathematics called discrete math. And within that, there's a lot that I think is really useful, a lot of tools and techniques that we can apply to our day-to-day programming. We have a Bike Shed episode where we talked about is discrete math relevant to day-to-day programmers and what are the ways it's so? We'll link that in the show notes. I also gave a talk at RailsConf last year diving into that titled: The Math Every Programmer Needs. So, if you're looking for something that's accessible to someone who's not done a math degree, those are two great jumping-off points. STEPHANIE: Yeah. And then, maybe you'll start drawing out arrays and applying combinatorics to figure out your performance problems. JOËL: On that note, shall we wrap up? STEPHANIE: Let's wrap up. Show notes for this episode can be found at bikeshed.fm. JOËL: This show has been produced and edited by Mandy Moore. STEPHANIE: 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. It really helps other folks find the show. JOËL: If you have any feedback for this or any of our other episodes, you can reach us @_bikeshed, or you can reach me @joelquen on Twitter. STEPHANIE: Or reach both of us at hosts@bikeshed.fm via email. JOËL: Thanks so much for listening to The Bike Shed, and we'll see you next week. ALL: Byeeeeeeeeee!!!!!!!! AD: Did you know thoughtbot has a referral program? If you introduce us to someone looking for a design or development partner, we will compensate you if they decide to work with us. More info on our website at: tbot.io/referral. Or you can email us at: referrals@thoughtbot.com with any questions.

Leaders of B2B - Interviews on B2B Leadership, Tech, SaaS, Revenue, Sales, Marketing and Growth
Transforming Patient Care Through AI and Wearables with Colby Ford of Tuple

Leaders of B2B - Interviews on B2B Leadership, Tech, SaaS, Revenue, Sales, Marketing and Growth

Play Episode Listen Later Mar 19, 2024 45:48


On today's episode, we're joined by Colby Ford, Founder and Principal Consultant of Tuple and Co-Founder and VP of Technology of Amissa Health. Colby sheds light on the innovative intersections of technology and healthcare, particularly focusing on advancements in Alzheimer's research, genomics and cloud infrastructure in the life sciences sector. Key Takeaways:(01:49) Insights into Amissa's innovative approach to Alzheimer's care using smartwatches and the potential of wearable devices in healthcare.(06:16) The potential of cloud technology to manage and process large-scale genomic data, aiding in drug discovery and personalized medicine.(15:27) Life sciences consulting and the unique challenges and opportunities this sector offers.(23:11) AI's impact on drug development and molecule design, with a focus on efficiency and the reduction of the traditional trial-and-error approach.(33:17) Challenges and strategies for managing partnerships with major tech companies like Microsoft, and the importance of ensuring mutual benefits.(35:36) The environmental and ethical considerations of large-scale AI models and the importance of sustainable tech practices.(44:20) The evolving landscape of technology in healthcare, with a focus on the scalability of solutions and the move towards more accessible and efficient models for research and care.Resources Mentioned:Colby Ford -https://www.linkedin.com/in/colbyford/Tuple | LinkedIn -https://www.linkedin.com/company/tuplexyz/Tuple | Website -https://tuple.xyz/Amissa Health | LinkedIn -https://www.linkedin.com/company/amissa/Amissa | Website -https://www.amissa.com/Colby Ford's Github -https://github.com/colbyfordThis episode is brought to you by Content Allies.Content Allies helps B2B tech companies launch revenue-generating podcasts and build relationships that drive revenue through podcast networking. We schedule interviews with your ideal prospects and strategic partners so that you can build relationships and grow your business. You show up and have conversations, we handle everything else. Learn more at ContentAllies.com. #B2B #BusinessLeaders #Leadership

The Tuple Podcast
Caleb Porzio, Creator of AlpineJS and Laravel Livewire

The Tuple Podcast

Play Episode Listen Later Feb 6, 2024 84:29


In this conversation, Ben interviews Caleb Porzio, the creator of AlpineJS and Laravel Livewire. The discussion ranges from discussions about life in general to specific testing practices and which notebook Caleb uses.LinksTuple.app - The best app for pair programmingAlpineJS Laravel Livewire Caleb's VSCode Course TakeawaysApply core truths to life outside of programming.Find ways to make difficult tasks easier.Change your environment to support your goals.Value tests as much as, if not more than, the code itself.Keep methods and functions short for better code quality.Embrace your strengths and delegate tasks that don't bring you joy.Focus on the meaty tasks that excite you.Consider rewrites carefully and prioritize other solutions first.Pull down unfamiliar code and interact with it to understand it better.Start the day with tasks that align with your goals and priorities.Chapters(00:00) - Introduction and Background (03:51) - Overview of LiveWire and Alpine (12:09) - Caleb's Programming Style (20:09) - Functional vs Object-Oriented Programming (25:39) - The Appeal of Functional Programming (32:01) - The Challenges of Learning Object-Oriented Programming (33:06) - Memory Allocation and Functional Languages (36:30) - Starting Complicated Projects (40:10) - Writing Blog Posts as Problem-Solving (42:30) - Core Beliefs (48:21) - Materials (49:20) - Getting into the Zone (51:14) - The Value of Tests Over Code (55:27) - Transitioning to Non-Typical Apps (01:03:00) - Radical Practices at Tuple (01:05:50) - Managing Pull Requests and Code Reviews (01:06:33) - Starting the Day and Prioritizing Tasks (01:07:41) - Balancing Maintenance and Long-Term Goals (01:09:52) - Finding Motivation for Maintenance Tasks (01:10:50) - Embracing Strengths and Delegating Weaknesses (01:11:46) - Continuous Improvement and Learning (01:14:19) - Favorite Tools and Productivity Hacks (01:19:07) - Core Beliefs and Values in Coding (01:21:19) - Benefits of Short Methods and Single File Principle (01:21:57) - Approaching Unfamiliar Code (01:22:51) - The Pros and Cons of Rewrites (01:23:46) - Final Thoughts and Passion for Coding

The Bike Shed
413: Developer Tales of Package Management

The Bike Shed

Play Episode Listen Later Jan 23, 2024 33:33


Stephanie shares her task of retiring a small, internally-used link-shortening app. She describes the process as both celebratory and a bit mournful. Meanwhile, Joël discusses his deep dive into ActiveRecord, particularly in the context of debugging. He explores the complexities of ActiveRecord querying schemas and the additional latency this introduces. Together, the hosts discuss the nuances of package management systems and their implications for developers. They touch upon the differences between system packages and language packages, sharing personal experiences with tools like Homebrew, RubyGems, and Docker. Transcript: JOËL: Hello and welcome to another episode of The Bike Shed, a weekly podcast from your friends at thoughtbot about developing great software. I'm Joël Quenneville. STEPHANIE: And I'm Stephanie Minn. And together, we're here to share a bit of what we've learned along the way. JOËL: So, Stephanie, what's new in your world? STEPHANIE: So, this week, I got to have some fun working on some internal thoughtbot work. And what I focused on was retiring one of our just, like, small internal self-hosted on Heroku apps in favor of going with a third-party service for this functionality. We basically had a tiny, little app that we used as a link-shortening service. So, if you've ever seen a tbot.io short link out in the world, we were using our just, like, an in-house app to do that, you know, but for various reasons, we wanted to...just it wasn't worth maintaining anymore. So, we wanted to just use a purchased service. But today, I got to just, like, do the little bit of, like, tidying up, you know, in preparation to archive a repo and kind of delete the app from Heroku, and I hadn't done that before. So, it felt a little bit celebratory and a little bit mournful even [laughs] to, you know, retire something like that. And I was pairing with another thoughtbot developer, and we used a pairing app called Tuple. And you can just send, like, fun reactions to each other. Like, you could send, like, a fire emoji [laughs] or something if that's what you're feeling. And so, I sent some, like, confetti when we clicked the, "I understand what deleting this app means on GitHub." But I joked that "Actually, I feel like what I really needed was a, like, a salute kind of like thank you for your service [laughs] type of reaction." JOËL: I love those moments when you're kind of you're hitting those kind of milestone-y moments, and then you get to send a reaction. I should do that more often in Tuple. Those are fun. STEPHANIE: They are fun. There's also a, like, table flip reaction, too, is one that I really enjoy [laughs], you know, you just have to manifest that energy somehow. And then, after we kind of sent out an email to the company saying like, "Oh yeah, we're not using our app anymore for link shortening," someone had a great suggestion to make our archived repo public instead of private. I kind of liked it as a way of, like, memorializing this application and let community members see, you know, real code in a real...the application that we used here at thoughtbot. So, hopefully, if not me, then someone else will be able to do that and maybe publish a little blog post about that. JOËL: That's exciting. So, it's not currently public, the repo, but it might be at some point in the future. STEPHANIE: Yeah, that's right. JOËL: We'll definitely have to mention it on a future episode if that happens so that people following along with the story can go check out the code. STEPHANIE: So, Joël, what's new in your world? JOËL: I've been doing a deep dive into how ActiveRecord works. Particularly, I am debugging some pretty significant slowdowns in querying ActiveRecord models that are backed not by a regular Postgres database but instead a Snowflake data warehouse via an ODBC connection. So, there's a bunch of moving pieces going on here, and it would just take forever to make any queries. And sure, the actual reported query time is longer than for a local Postgres database, but then there's this sort of mystery extra waiting time, and I couldn't figure out why is it taking so much longer than the actual sort of recorded query time. And I started digging into all of this, and it turns out that in addition to executing queries to pull actual data in, ActiveRecord needs to, at various points, query the schema of your data store to pull things like names of tables and what are the indexes and primary keys and things like that. STEPHANIE: Wow. That sounds really cool and something that I have never needed to do before. I'm curious if you noticed...you said that it takes, I guess, longer to query Snowflake than it would a more common Postgres database. Were you noticing this performance slowness locally or on production? JOËL: Both places. So, the nice thing is I can reproduce it locally, and locally, I mean running the Rails app locally. I'm still talking to a remote Snowflake data warehouse, which is fine. I can reproduce that slowness locally, which has made it much easier to experiment and try things. And so, from there, it's really just been a bit of a detective case trying to, I guess, narrow the possibility space and try to understand what are the parts that trigger slowness. So, I'm printing timestamps in different places. I've got different things that get measured. I've not done, like, a profiling tool to generate a flame graph or anything like that. That might have been something cool to try. I just did old-school print statements in a couple of places where I, like, time before, time after, print the delta, and that's gotten me pretty far. STEPHANIE: That's pretty cool. What do you think will be an outcome of this? Because I remember you saying you're digging a little bit into ActiveRecord internals. So, based on, like, what you're exploring, what do you think you could do as a developer to increase some of the performance there? JOËL: I think probably what this ends up being is finding that the Snowflake adapter that I'm using for ActiveRecord maybe has some sort of small bug in it or some implementation that's a little bit too naive that needs to be fine-tuned. And so, probably what ends up happening here is that this finishes as, like, an open-source pull request to the Snowflake Adapter gem. STEPHANIE: Yeah, that's where I thought maybe that might go. And that's pretty cool, too, and to, you know, just be investigating something on your app and being able to make a contribution that it benefits the community. JOËL: And that's what's so great about open source because not only am I able to get the source to go source diving through all of this, because I absolutely need to do that, but also, then if I make a fix, I can push that fix back out to the community, and everybody gets to benefit. STEPHANIE: Cool. Well, that's another thing that I look forward to hearing more on the development of [laughs] later if it pans out that way. JOËL: One thing that has been interesting with this Snowflake work is that there are a lot of moving parts and multiple different packages that I need to install to get this all to work. So, I mentioned that I might be doing a pull request against the Snowflake Adapter for ActiveRecord, but all of this talks through a sort of lower-level technology protocol called ODBC, which is a sort of generic protocol for speaking to data stores, and that actually has two different pieces. I had to install two different packages. There is a sort of low-level executable that I had to install on my local dev machine and that I have to install on our servers. And on my Mac, I'm installing that via Homebrew, which is a system package. And then to get Ruby bindings for that, there is a Ruby gem that I install that allows Ruby code to talk to ODBC, and that's installed via RubyGems or Bundler. And that got me thinking about sort of these two separate ecosystems that I tend to work with every day. We've got sort of the system packages and the, I don't know what you want to call them, language packages maybe, things like RubyGems, but that could also be NPM or whatever your language of choice is, and realizing that we kind of have things split into two different zones, and sometimes we need both and wondering a little bit about why is that difference necessary. STEPHANIE: Yeah, I don't have an answer to that [laughs] question right now, but I can say that that was an area that really tripped me up, I think, when I was first a fledgling developer. And I was really confused about where all of these dependencies were coming from and going through, you know, setting up my first project and being, like, asked to install Postgres on my machine but then also Bundler, which then also installs more dependencies [laughs]. The lines between those ecosystems were not super clear to me. And, you know, even now, like, I find myself really just kind of, like, learning what I need to know to get by [laughs] with my day-to-day work. But I do like what you said about these are kind of the two main layers that you're working with in terms of package management. And it's really helpful to have that knowledge so you can troubleshoot when there is an issue at one or the other. JOËL: And you mentioned Postgres. That's another one that's interesting because there are components in both of those ecosystems. Postgres itself is typically installed via a system package manager, so something like Homebrew on a Mac or apt-get on a Linux machine. But then, if you're interacting with Postgres in a Ruby app, you're probably also installing the pg gem, which are Ruby's bindings for Postgres to allow Ruby to talk to Postgres, and that lives in the package ecosystem on RubyGems. STEPHANIE: Yeah, I've certainly been in the position of, you know, again, as consultants, we oftentimes are also setting up new laptops entirely [laughs] like client laptops and such and bundling and the pg gem is installed. And then at least I have, you know, I have to give thanks to the very clear error message that [laughs] tells me that I don't have Postgres installed on my machine. Because when I mentioned, you know, troubleshooting earlier, I've certainly been in positions where it was really unclear what was going on in terms of the interaction between what I guess we're calling the Ruby package ecosystem and our system level one. JOËL: Especially for things like the pg gem, which need to compile against some existing libraries, those always get interesting where sometimes they'll fail to compile because there's a path to some C compiler that's not set correctly or something like that. For me, typically, that means I need to update the macOS command line tools or the Xcode command line tools; I forget what the name of that package is. And, usually, that does the trick. That might happen if I've upgraded my OS version recently and haven't downloaded the latest version of the command line tools. STEPHANIE: Yeah. Speaking of OS versions, I have a bit of a story to share about using...I've never said this name out loud, but I am pretty sure that it would just be pronounced as wkhtmltopdf [laughs]. For some reason, whenever I see words like that in my brain, I want to, like, make it into a pronounceable thing [laughs]. JOËL: Right, just insert some vowels in there. STEPHANIE: Yeah, wkhtmltopdf [laughs]. Anyway, that was being used in an app to generate PDF invoices or something. It's a pretty old tool. It's a CLI tool, and it's, as far as I can tell, it's been around for a long time but was recently no longer maintained. And so, as I was working on this app, I was running into a bug where that library was causing some issues with the PDF that was generated. So, I had to go down this route of actually finding a Ruby gem that would figure out which package binary to use, you know, based off of my system. And that worked great locally, and I was like, okay, cool, I fixed the issue. And then, once I pushed my change, it turns out that it did not work on CI because CI was running on Ubuntu. And I guess the binary didn't work with the latest version of Ubuntu that was running on CI, so there was just so many incompatibilities there. And I was wanting to fix this bug. But the next step I took was looking into community-provided packages because there just simply weren't any, like, up-to-date binaries that would likely work with these new operating systems. And I kind of stopped at that point because I just wasn't really sure, like, how trustworthy were these community packages. That was an ecosystem I didn't know enough about. In particular, I was having to install some using apt from, you know, just, like, some Linux community. But yeah, I think I normally have a little bit more experience and confidence in terms of the Ruby package ecosystem and can tell, like, what gems are popular, which ones are trustworthy. There are different heuristics I have for evaluating what dependency to pull in. But here I ended up just kind of bailing out of that endeavor because I just didn't have enough time to go down that rabbit hole. JOËL: It is interesting that learning how to evaluate packages is a skill you have to learn that varies from package community to package community. I know that when I used to be very involved with Elm, we would often have people who would come to the Elm community from the JavaScript community who were used to evaluating NPM packages. And one of the metrics that was very popular in the JavaScript community is just stars on GitHub. That's a really important metric. And that wasn't really much of a thing in the Elm community. And so, people would come and be like, "Wait, how do I know which package is good? I don't see any stars on GitHub." And then, it turns out that there are other metrics that people would use. And similarly, you know, in Ruby, there are different ways that you might use to evaluate Ruby gems that may or may not involve stars on GitHub. It might be something entirely different. STEPHANIE: Yeah. Speaking of that, I wanted to plug a website that I have used before called the Ruby Toolbox, and that gives some suggestions for open-source Ruby libraries of various categories. So, if you're looking for, like, a JSON parser, it has some of the more popular ones. If you're looking for, you know, it stores them by category, and I think it is also based on things like stars and forks like that, so that's a good one to know. JOËL: You could probably also look at something like download numbers to see what's popular, although sometimes it's sort of, like, an emergent gem that's more popular. Some of that almost you just need to be a little bit in the community, like, hearing, you know, maybe listening to podcasts like this one, subscribing to Ruby newsletters, going to conferences, things like that, and to realize, okay, maybe, you know, we had sort of an old staple for JSON parsing, but there's a new thing that's twice as fast. And this is sort of becoming the new standard, and the community is shifting towards that. You might not know that just by looking at raw stats. So, there's a human component to it as well. STEPHANIE: Yeah, absolutely. I think an extension of knowing how to evaluate different package systems is this question of like, how much does an average developer need to know about package management? [laughs] JOËL: Yeah, a little bit to a medium amount, and then if you're writing your own packages, you probably need to know a little bit more. But there are some things that are really maybe best left to the maintainers of package managers. Package managers are actually pretty complex pieces of software in terms of all of the dependency management and making sure that when you say, "Oh, I've got Rails, and this other gem, and this other gem, and it's going to find the exact versions of all those gems that play nicely together," that's non-trivial. As a sort of working developer, you don't need to know all of the algorithms or the graph theory or any of that that underlies a package manager to be able to be productive in your career. And even as a package developer, you probably don't need to really know a whole lot of that. STEPHANIE: Yeah, that makes sense. I actually had referred to our internal at thoughtbot here, our kind of, like, expectations for skill levels for developers. And I would say for an average developer, we kind of just expect a basic understanding of these more complex parts of our toolchain, I think, specifically, like, command line tools and package management. And I think I'd mentioned earlier that, for me, it is a very need-to-know basis. And so, yeah, when I was going down that little bit of exploration around why wkhtmltopdf [chuckles] wasn't working [chuckles], it was a bit of a twisty and turning journey where I, you know, wasn't really sure where to go. I was getting very obtuse error messages, and, you know, I had to dive deep into all these forums [laughs] for all the various platforms [laughs] about why libraries weren't working. And I think what I did come away with was that like, oh, like, even though I'm mostly working on my local machine for development, there was some amount of knowledge I needed to have about the systems that my CI and, you know, production servers are running on. The project I was working on happened to have, like, a Docker file for those environments, and, you know, kind of knowing how to configure them to install the packages I needed to install and just knowing a little bit about the different ways of doing that on systems outside of my usual daily workflows. JOËL: And I think that gets back to some of the interesting distinctions between what we might call language packages versus system packages is that language packages more or less work the same across all operating systems. They might have a build step that's slightly different or something like that, but system packages might be pretty different between different operating systems. So, development, for me, is a Mac, and I'm probably installing system packages via something like Homebrew. If I then want that Rails app to run on CI or some Linux server somewhere, I can't use Homebrew to install things there. It's going to be a slightly different package ecosystem. And so, now I need to find something that will install Postgres for Linux, something that will install, I guess, wkhtmltopdf [laughs] for Linux. And so, when I'm building that Docker file, that might be a little bit different for Mac versus for...or I guess when you run a Docker file, you're running a containerized system. So, the goal there is to make this system the same everywhere for everyone. But when you're setting that up, typically, it's more of a Linux-like system. And so running inside the Docker container versus outside on the native Mac might involve a totally different set of packages and a different package tool. As opposed to something like Bundler, you've got your gem file; you bundle install. It doesn't matter if you're on Linux or macOS. STEPHANIE: Yes, I think you're right. I think we kind of answered our own question at the top of the show [laughs] about differences and what do you need to know about them. And I also like how you pointed out, oh yeah, like, Docker is supposed to [laughs], you know, make sure that we're all developing in the same system, essentially. But, you know, sometimes you have different use cases for it. And, yeah, when you were talking about installing an application on your native Mac and using Homebrew, but even, you know, not everyone even uses Homebrew, right? You can install manually [laughs] through whatever official installer that application might provide. So, there's just so many different ways of doing something. And I had the thought that it's too bad that we both [chuckles] develop on Mac because it could be really interesting to get a Linux user's perspective in here. JOËL: You mentioned not installing via Homebrew. A kind of glaring example of that in my personal setup is that I use Postgres.app to manage Postgres on my machine rather than using Homebrew. I've just...over the years, the Homebrew version every time I upgrade my operating system or something, it's just such a pain to update, and I've lost too many hours to it, and Postgres.app just works, and so I've switched to that. Most other things, I'll use the Homebrew version, but Postgres it's now Postgres.app. It's not even a command line install, and it works fine for me. STEPHANIE: Nice. Yeah. That's interesting. That's a good tip. I'll have to look into that next time because I have also certainly had to just install so many [laughs] various versions of Postgres and figure out what's going on with them every time I upgrade my OS. I'm with you, though, in terms of the packages world I'm looking for, it works [laughs]. JOËL: So, you'd mentioned earlier that packages is sort of an area that's a bit of a need-to-know basis for you. Are there, like, particular moments in your career that you remember like, oh, that's the moment where I needed to, like, take some time and learn a little bit of the next level of packages? STEPHANIE: That's a great question. I think the very beginnings of understanding how package versions work when you have multiple projects on your machine; I just remember that being really confusing for me. When I started out, like, you know, as soon as I cloned my second repo [laughs], and was very confused about, like, I'm sure I went through the process of not installing gems using Bundler, and then just having so much chaos [laughs] wrecked in my development environment and, you know, having to ask someone, "I don't understand how this works. Like, why is it saying I have multiple versions of this library or whatever?" JOËL: Have you ever sudo gem installed a gem? STEPHANIE: Oh yeah, I definitely have. I can't [laughs], like, even give a good reason for why I have done it, but I probably was just, like, pulling my hair out, and that's what Stack Overflow told me to do. I don't know if I can recommend that, but it is [chuckles] one thing to do when you just are kind of totally stuck. JOËL: There was a time where I think that that was in the READMEs for most projects. STEPHANIE: Yeah, that's a really good point. JOËL: So, that's probably why a lot of people end up doing that, but then it tends to install it for your system Ruby rather than for...because if you're using something like Rbenv or RVM or ASDF to manage multiple Ruby versions, those end up being what's using or even Homebrew to manage your Ruby. It wouldn't be installing it for those versions of Ruby. It would be installing it for the one that shipped with your Mac. I actually...you know what? I don't even know if Mac still ships with Ruby. It used to. It used to ship with a really old version of Ruby, and so the advice was like, "Hey, every repo tells you to install it with sudo; don't do that. It will mess you up." STEPHANIE: Huh. I think Mac still does ship with Ruby, but don't quote me on that [laughter]. And I think that's really funny that, like, yeah, people were just writing those instructions in READMEs. And I'm glad that we've collectively [laughs] figured out that difference and want to, hopefully, not let other developers fall into that trap [laughs]. Do you have a particular memory or experience when you had to kind of level up your knowledge about the package ecosystem? JOËL: I think one sort of moment where I really had to level up is when I started really needing to understand how install paths worked, especially when you have, let's say, multiple versions of a gem installed because you have different projects. And you want to know, like, how does it know which one it's using? And then you see, oh, there are different paths that point to different directories with the installs. Or when you might have an executable you've installed via Homebrew, and it's like, oh yeah, so I've got this, like, command that I run on my shell, but actually that points to a very particular path, you know, in my Homebrew directory. But maybe it could also point to some, like, pre-installed system binaries or some other custom things I've done. So, there was a time where I had to really learn about how the path shell variable worked on a machine in order to really understand how the packages I installed were sometimes showing up when I invoked a binary and sometimes not. STEPHANIE: Yeah, that is another really great example that I have memories of [laughs] being really frustrated by, especially if...because, you know, we had talked earlier about all the different ways that you can install applications on your system, and you don't always know where they end up [laughs]. JOËL: And this particular memory is tied to debugging Postgres because, you know, you're installing Postgres, and some paths aren't working. Or maybe you try to update Postgres and now it's like, oh, but, like, I'm still loading the wrong one. And why does PSQL not do the thing that I think it does? And so, that forced me to learn a little bit about, like, under the hood, what happens when I type brew install PostgreSQL? And how does that mesh with the way my shell interprets commands and things like that? So, it was maybe a little bit of a painful experience but eye-opening and definitely then led to me, I think, being able to debug my setup much more effectively in the future. STEPHANIE: Yeah. I like that you also pointed out how it was interacting with your shell because that's, like, another can of worms, right? [laughs] In terms of just the complexity of how these things are talking to each other. JOËL: And for those of our listeners who are not familiar with this, there is a shell command that you can use called which, W-H-I-C-H. And you can prefix that in front of another command, and it will tell you the path that it's using for that binary. So, in my case, if I'm looking like, why is this PSQL behaving weirdly or seems to be using the old version, I can type 'which space psql', and it'll say, "Oh, it's going to this path." And I can look at it and be like, oh, it's using my system install of Postgres. It's not using the Homebrew one. Or, oh, maybe it's using the Homebrew install, not my Postgres.app version. I need to, like, tinker with the paths a little bit. So, that has definitely helped me debug my package system more than once. STEPHANIE: Yeah, that's a really good tip. I can recall just totally uninstalling everything [laughs] and reinstalling and fingers crossed it would figure out a route to the right thing [laughs]. JOËL: You know what? That works. It's not the, like, most precise solution but resetting your environment when all else fails it's not a bad solution. So, we've been talking a lot about what it's like to interact with a package ecosystem as developers, as users of packages, but what if you're a package developer? Sometimes, there's a very clear-cut place where to publish, and sometimes it's a little bit grayer. So, I could see, you know, I'm developing a database, and I want that to be on operating systems, probably should be a system-level package rather than a Ruby gem. But what if I'm building some kind of command line tool, and I write it in Ruby because I like writing Ruby? Should I publish that as a gem, or should I publish that as some kind of system package that's installed via Homebrew? Any opinions or heuristics that you would use to choose where to publish on one side or the other? STEPHANIE: As not a package developer [laughs], I can only answer from that point of view. That is interesting because if you publish on a, you know, like, a system repository, then yeah, like, you might get a lot more people using your tool out there because you're not just targeting a specific language's community. But I don't know if I have always enjoyed downloading various things to my system's OS. I think that actually, like, is a bit complicated for me or, like, I try to avoid it if I can because if something can be categorized or, like, containerized in a way that, like, feels right for my mental model, you know, if it's written in Ruby or something really related to things I use Ruby in, it could be nice to have that installed in my, like, systems RubyGems. But I would be really interested to hear if other people have opinions about where they might want to publish a package and what kind of developers they're hoping to find to use their tool. JOËL: I like the heuristic that you mentioned here, the idea of who the audience is because, yeah, as a Ruby developer who already has a Ruby setup, it might be easier for me to install something via a gem. But if I'm not a Ruby developer who wants to use the packages maybe a little bit more generic, you know, let's say, I don't know, it's some sort of command line tool for interacting with GitHub or something like that. And, like, it happens to be written in Ruby, but you don't particularly care about that as a user of this. Maybe you don't have Ruby installed and now you've got to, like, juggle, like, oh, what is RubyGems, and Bundler, and all this stuff? And I've definitely felt that occasionally downloading packages sort of like, oh, this is a Python package. And you're going to need to, like, set up all this stuff. And it's maybe designed for a Python audience. And so, it's like, oh, you're going to set up a virtual environment and all these things. I'm like, I just want your command line tools. I don't want to install a whole language. And so, sometimes there can be some frustration there. STEPHANIE: Yeah, that is very true. Before you even said that, I was like, oh, I've definitely wanted to download a command line tool and be like, first install [laughs] Python. And I'm like, nope, I'm bailing out of this. JOËL: On the other hand, as a developer, it can be a lot harder to write something that's a bit more cross-platform and managing all that. And I've had to deal a little bit with this for thoughtbot's Parity tool, which is a command-line tool for working with Heroku. It allows you to basically run commands on either staging or production by giving you a staging command and a production command for common Heroku CLI tasks, which makes it really nice if you're working and you're having to do some local, some development, some staging, and some production things all from your command line. It initially started as a gem, and we thought, you know what? This is mostly command line, and it's not just Rubyists who use Heroku. Let's try to put this on Homebrew. But then it depends on Ruby because it's written in Ruby. And now we had to make sure that we marked Ruby as a dependency in Homebrew, which meant that Homebrew would then also pull in Ruby as a dependency. And that got a little bit messy. For a while, we even experimented with sort of briefly available technology called Traveling Ruby that allowed you to embed Ruby in your binary, and you could compile against that. That had some drawbacks. So, we ended up rolling that back as well. And eventually, just for maintenance ease, we went back to making this a Ruby gem and saying, "Look, you install it via RubyGems." It does mean that we're targeting more of the Ruby community. It's going to be a little bit harder for other people to install, but it is easier for us to maintain. STEPHANIE: That's really interesting. I didn't know that history about Parity. It's a tool that I have used recently and really enjoyed. But yeah, I think I remember someone having some issues between installing it as a gem and installing it via Homebrew and some conflicts there as well. So, I can also see how trying to decide or maybe going down one path and then realizing, oh, like, maybe we want to try something else is certainly not trivial. JOËL: I think, in me, I have a little bit of the idealist and the pragmatist that fight. The idealist says, "Hey, if it's not, like, aimed for Ruby developers as a, like, you can pull this into your codebase, if it's just command line tools and the fact that it's written in Ruby is an implementation detail, that should be a system package. Do not distribute binaries via RubyGems." That's the idealist in me. The pragmatist says, "Oh, that's a lot of work and not always worth it for both the maintainers and sometimes for the users, and so it's totally okay to ship binaries as RubyGems." STEPHANIE: I was totally thinking that I'm sure that you've been in that position of being a user and trying to download a system package and then seeing it start to download, like, another language. And you're like, wait, what? [laughter] That's not what I want. JOËL: So, you and I have shared some of our heuristics in the way we approach this problem. Now, I'm curious to hear from the audience. What are some heuristics that you use to decide whether your package is better shipped on RubyGems versus, let's say, Homebrew? Or maybe as a user, what do you prefer to consume? STEPHANIE: Yes. And speaking of getting listener feedback, we're also looking for some listener questions. We're hoping to do a bit of a grab-bag episode where we answer your questions. So, if you have anything that you're wanting to hear me and Joël's thoughts on, write us at hosts@bikeshed.fm. JOËL: On that note, shall we wrap up? STEPHANIE: Let's wrap up. Show notes for this episode can be found at bikeshed.fm. JOËL: This show has been produced and edited by Mandy Moore. STEPHANIE: 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. It really helps other folks find the show. JOËL: If you have any feedback for this or any of our other episodes, you can reach us @_bikeshed, or you can reach me @joelquen on Twitter. STEPHANIE: Or reach both of us at hosts@bikeshed.fm via email. JOËL: Thanks so much for listening to The Bike Shed, and we'll see you next week. ALL: Byeeeeeeee!!!!!!! AD: Did you know thoughtbot has a referral program? If you introduce us to someone looking for a design or development partner, we will compensate you if they decide to work with us. More info on our website at: tbot.io/referral. Or you can email us at referrals@thoughtbot.com with any questions.

Hackers Incorporated
Launching features like products

Hackers Incorporated

Play Episode Listen Later Nov 27, 2023 39:54


In this episode, Adam and Ben catch up on recent events at Tailwind Labs and Tuple. Adam spoke at Rails World and the impromptu Tailwind CSS meetup in Amsterdam. Ben shares his learnings from some recent feature launches at Tuple.Timestamps(00:00) - Burpees (02:47) - Rails World + Tailwind CSS Amsterdam meetup (11:27) - Launching Tuple Triggers (25:57) - Tuple App Veil LinksAdam on TwitterBen on TwitterAdam Wathan - Tailwind CSS: It looks awful, and it works - Rails World 2023Tuple TriggersTuple App Veil

Giant Robots Smashing Into Other Giant Robots
500: Giant Robots Smashing Into Other Giant Robots 500th Episode!

Giant Robots Smashing Into Other Giant Robots

Play Episode Listen Later Nov 16, 2023 72:17


We released episode one of this podcast on June 11, 2012. Now, more than a decade later, we're celebrating the 500th episode of our show. In honor of this milestone, Victoria, Will, and Chad caught up with each of the past hosts of the show: Ben Orenstein, Chris Toomey, and Lindsey Christensen. We chatted about what they're up to now, what they liked and learned from hosting the show, their time at thoughtbot, and more! Follow thoughtbot on X (https://twitter.com/thoughtbot) or LinkedIn (https://www.linkedin.com/company/150727/). Become a Sponsor (https://thoughtbot.com/sponsorship) of Giant Robots! Transcript: VICTORIA: 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, Victoria Guido. WILL: And I'm your other host, Will Larry. CHAD: And I'm your other host, Chad Pytel. We released episode one of this podcast on June 11, 2012. Now more than a decade later, were celebrating this: the 500th episode of our show. In honor of this milestone, Victoria, Will, and I caught up with each of the past hosts of the show: Ben Orenstein, Chris Toomey, and Lindsey Christensen. We chatted about what they're up to now, what they liked and learned from hosting the show and their time at thoughtbot, and more. First up: Ben Orenstein. Ben was the very first host of the show back in 2012 when he was a developer at thoughtbot. He is now the co-founder and Head of Product at Tuple, a remote pair programming tool for designers and developers. Ben, it's great to talk to you again. It's been a while since you and I talked. How have you been? BEN: I've been decent, yeah. It's fun to be back to my roots a little bit. I told some folks that I work with that I was coming back to the pod for the 500th Episode, and they were stoked. So, it's kind of a treat to get to be on these airwaves again. CHAD: What have you been up to since you left this show and thoughtbot? BEN: Well, I started a company. So, I was at thoughtbot for a while; I think it was seven years. And I eventually sort of struck out to start my own thing–had a false start or two here and there. And then, I ended up starting a company called Tuple, and we still exist today, fortunately. Tuple is a tool for doing remote pair programming. We started off on macOS and then wrote a Linux client. And we're launching a Windows client now. But it's sort of, like, screen sharing with remote control for developers who are actually writing code and want to have great, low latency remote control and who care about screen share quality and that sort of thing. I started that about five years ago with two co-founders. Today, we are a team of 11, I think it is. And it's been going well. Our timing was really great, it turned out. We launched a little bit before COVID. So, remote work turned into a lot more of a thing, and we were already in the market. So, that helped us a ton. It was quite a wild ride there for a bit. But things have calmed down a little lately, but it's still fun. I'm, like, really enjoying being a co-founder of a software company. It was what I've always sort of wanted to do. And it turns out it actually is pretty fun and pretty great. Although there are, of course, the ups and downs of business ownership. It is never quite as calm or relaxing as being an employee somewhere else. CHAD: You started Tuple instigated by...full disclosure: thoughtbot's an early customer of Tuple. We're still a customer. We use it a lot. BEN: Woo-hoo. I appreciate that. Thank you. CHAD: If I remember right, you started and were sort of instigated to create Tuple because there was a prior product that then Slack bought, and then it started to degrade. And now, it no longer exists in the same way that it did before. BEN: Yeah. So, there was this tool called Screenhero, which I actually started using -- CHAD: [inaudible 02:14] BEN: Yeah, first at thoughtbot. Some other thoughtboter introduced me to it, and we would use it for pair programming. And I was like, oh, this is nice. And then yeah, Slack kind of acqui-hired it and more or less ended up shutting the product down. And so, there was this gap in the market. And I would ask my friends, I would ask thoughtboters and other developers, like, "What are you using now that Screenhero is gone?" And no one had a good answer. And so, after a while of this thing sort of staring me in the face, I was like, we have to try to solve this need. There's clearly a hole in the market. Yeah, so we were heavily inspired by them in the early days. Hopefully, we've charted our own path now. But they were definitely...the initial seed was, you know, let's do Screenhero but try to not get bought early or something. CHAD: [laughs] How did you or did you feel like you captured a lot of the Screenhero customers and reached them in those early days? BEN: I think so. The pitch for it was sort of shockingly easy because Screenhero had kind of blazed this trail. Like, I would often just be like, "Oh, we're making a thing. Do you remember Screenhero?" And they'd go, "Oh yeah, I loved Screenhero". I'd be like, "Yeah, we're going to try to do that." And they'd be like, "Nice. Sign me up." So, it for sure helped a ton. I have no idea what percentage of customers we converted. And they were a pretty large success, so probably a small fraction, but it definitely, like, made the initial days much easier. CHAD: Yeah. And then, like you said, COVID happened. BEN: COVID happened, yeah. I think we had been around for about a year when COVID hit. So, we were getting our feet underneath us. And we were already, like, the company was already growing at a pretty good rate, and we were feeling pretty good about it. I don't think we had quite hit ramen profitable, but we were probably pretty close or, like, flirting with it. Yeah, the business, like, I don't know, tripled or quadrupled in a matter of months. We had a few big customers that, like, just told everyone to start using Tuple. So, we had, like, thousands and thousands of new users kind of immediately. So, it was a crazy time. Everything melted, of course. We hadn't quite engineered for that much scale. We had a really rough day or so as we scrambled, but fortunately, we got things under control. And then had this, like, very nice tailwind. Because we started the company assuming that remote work would grow. We assumed that there would be more remote developers every year. And, you know, it's probably maybe 5% of dev jobs are remote or maybe even less, but we expect to see this number creeping up. We don't think that trend will reverse. And so, COVID just, like, it just yanked it, you know, a decade in the future. CHAD: You haven't tripled or quadrupled your team size, have you? BEN: No. Well, I mean, I guess, I mean, we started as 3, and now we're 11, so kind of. CHAD: [laughs] Yeah, that's true. BEN: Expenses have not grown as fast as revenue, fortunately. CHAD: That's good. That's basically what I was asking [laughs]. BEN: Yeah, yeah. We're still a pretty small team, actually. We have only, like, four or five full-time engineers on the team at the moment, which is kind of wild because we are now, you know, we have three platforms to support: Linux, Windows, and Mac. It's a pretty complicated app doing, like, real-time streaming of audio, webcams, desktops, caring about OS-level intricacies. So, I think we will be hiring more people soon, although we haven't said that for a long time. We sort of have always had a bit of a hire-slow mentality to try to get the right team members and, like, feel a real pain before we hire someone into it. But we have been getting a bit more aggressive with hiring lately. VICTORIA: Well, I really appreciate Tuple. I installed it when I first started working here at thoughtbot. And we have random pairings with everyone across the company. So, I'll randomly get to meet someone halfway across the world who's working on similar projects. And I think they really enjoy that I have a tool they like working to share what they're working on. So, I want to thank you for that. And I'm curious about when you really started to scale during COVID, what were some of the technology architecture trade-offs you came across, and where did you land with it? BEN: Well, we got fairly...I don't know if it was lucky, but we...for a long time, for years, even through COVID, maybe the first four years of the company, all Tuple calls were purely peer-to-peer. And there was no server that we owned intermediating things. This was, like, kind of one of the keys of, like, not having expenses. The scale of revenue was we could have lots more calls happen. And it wouldn't cost us bandwidth or server capacity. To this day, still, for any calls with three or fewer participants, they're purely peer-to-peer. And this is nice for latency purposes because it just...we can find the most direct path to the internet between two people. It's also nice from our cost perspective because we don't need to pay to send that data. And that was hugely useful as call volume went up immensely. Didn't have to worry too much about server load and didn't have to worry too much about bandwidth costs. CHAD: Today, is there a central service that makes the initial connection for people? BEN: Yes, yeah, yeah. So, there is a signaling server. So, when you launch the app, you sign in, and you see, like, oh, which of my co-workers are online? So, there is actually a Rails app that handles that, actually, increasingly less the Rails app. We have now...I think it's a Go service that actually manages all those. I'm further and further from the code every year. Some of the technical questions might be a little bit beyond me, or I might have slightly out-of-date info. But back to the architecture question for a second, we did a pretty big refactor when we decided to go from just being a Mac client to supporting other platforms, where we split out a cross-platform real-time communication engine written in C++ so that we could use that for all of the heavy lifting, all the managing of the connections, and the tricky bandwidth estimation, and all this stuff, and use that across different platforms. And so, today, you have the cross-platform engine, and then on top of that is a, like, a less specific layer for each of the operating systems that we support. CHAD: So, you mentioned you're less and less in the code these days. So, what do you spend your time doing then? BEN: It's a mix of things. These days, it's basically mostly -- CHAD: Just cocktails on the beach, right? BEN: Cocktails, yes [laughs], cocktails on the beach, appearing on podcasts trying to sound important and impressive, yeah. Mostly product work. So, right before this, I just got off a call with some folks from The Browser Company. They are some of our first alpha users for our new Windows clients. So, I hopped on the call with them and, like, watched three of them install the product and inevitably run into some bugs. And, you know, chatted through those with the engineer that was working on it, prioritized some stuff, made some decisions about what's coming up next, and what we're going to ignore. So, mostly product work these days. For the first five years of the company, I was CEO, so I was doing kind of everything: marketing, and also hiring, and also product. About two months ago, I stepped down as CEO, and one of my other co-founders, Spencer, stepped up. And so, now my focus has narrowed to be mostly just product stuff and much less on the marketing or hiring side. VICTORIA: Yeah, you mentioned that it was a little more comfortable to be an employee than to be a founder. I don't know if you could say more about that because, certainly, a lot of engineers are smart enough and capable enough to run their own company. But what really informed your choice there, and do you regret it? [laughs] BEN: I definitely don't regret it. thoughtbot was a close second in terms of wonderful professional experiences. But running my own thing has been the most interesting professional thing I've done by a big margin. It has also been more stressful. And, Chad, I don't know if you remember, I think, like, maybe eight years ago, you tweeted something like, if you want to sleep well at night, and, like, value that, like, peace of mind, like, don't start a company or something. I have experienced that. CHAD: [laughs] BEN: A lot more, yeah, like waking up in the middle of the night worrying about things. It feels a little bit like the highs are higher; the lows are lower. Being an employee somewhere, it's like, if this company fails, I know I can go get another job, right? Like, you're a developer. You're extremely employable. But as the owner of the company, if the company fails, like, a huge chunk of your net worth is gone. Like, this thing you poured your life into is gone. It's way more stressful and traumatic to have that happen, or have that threatened to be happening, or just imagine that happening. So, overall, I have found the trade-off to be totally worth it. It's awesome to make your own decisions and chart your own path. And when it works, it can work in a way that being a salaried employee can't. So, I'm happy with those trade-offs. But I think that is a good question for people to ask themselves as they consider doing something like this is, like: is that the kind of trade-off that you want to make? Because it has significant downsides for sure. WILL: I am a big fan of Tuple also. I love it. It [inaudible 10:08] easy, especially with remote work. You hit the jackpot with COVID and remote work, so kudos for that [laughs]. Was there anything...because I know from our previous companies, about over...hopefully a lot more of the good stuff than the bad stuff. But was there anything that you learned? Because you were at thoughtbot for seven years. Was there anything that you're like, oh my gosh, I learned that, and it's helped me till this day while I'm running my company? BEN: Yeah, quite a bit, actually. I think it'd be hard to tease apart exactly which lessons, but I do...so I ran Upcase for thoughtbot and also FormKeep. So, I got a chance to kind of run a small division of the company, while still being a normal employee and, like, having not much of that risk. And I think that was a really wonderful opportunity for me to, like, practice the skills that I was interested in. Just, like, how do you market a thing? How do you design a product and have it be good? How do you prioritize user feedback? There were a ton of lessons from those days that I feel like made me better at running our company when we actually took a shot at it. So, there were, like, the specific things that I learned by the work I was doing there. But then just, like, I mean, I think I am the programmer I am today because of, like, the weekly dev discussions that happened. Like, spending so much time with Joe Ferris and, like, trying to copy as much of his brain as possible, like, really, like, imprinted on me as, like, a programmer. And also, just, like, a lot of the sort of cultural things from my time at thoughtbot of, like, you should be sharing the things you're learning. Like, writing blog posts is a great use of time. Like, doing open-source work is a great use of time. And maybe you can't directly trace how doing, like, working in public or sharing information benefits the company. It's hard to, like, attribute it from a marketing sense. But if you sort of have faith that in the large, it's going to work out, it probably will. That feels like a thoughtbot lesson to me, and I think it has served us really well; where I recorded a weekly podcast for a long time called The Art of Product. I'm recording a new podcast called Hackers Incorporated with Adam Wathan of Tailwind fame. And I don't ever think, like, hmm, how many new leads do we think we get per episode, and how many hours has that taken? What's the ROI? I just have this sort of reflex that I developed from thoughtbot time of, like, you should be putting stuff out there, or you should be giving back. You should help other people. And that will probably help your business and make it work in the long term. CHAD: That's a good lesson [laughs]. One of the other things, you know, while you were a host of Giant Robots, you were the first host. I remember, you know, encouraging you to be the first host, and I think we talked about that in one of the episodes along the way. But we also transitioned the format a little bit, especially as you started to work on products here; you know, it was more about the building of those products and following along with those. And one of the things that sort of half-jokingly defined, I think, your impact on a lot of products was pricing, experimenting with pricing, learning about pricing, increasing prices more than people were maybe comfortable doing so. How has that worked out with Tuple, pricing in particular? BEN: It's really hard to say. It's hard to know what, like, the other path would have been through the world-. We sort of decided from, like, the early days that we wanted to have, like, a fairly premium price. Like, we wanted to be the product that was really good and was, like, a little bit annoyingly expensive, but you still paid for it because it felt worth it. And I think people could debate in both directions whether we nailed that or not. We have had a price increase that we ended up rolling back. We went, like, a little too far one time and said, "You know what? I think we're a little bit over," and we reverted that. But I would say even today, we are still a fairly pricey product. I mean, I'm pretty happy with how the company has done. I can't prove to you that, like, if the price were half what it is, we would have, you know, better success or not. CHAD: I think it'd be very hard to make the argument that if it was half that, you would have double the number of customers. BEN: Yeah, that's probably not true. CHAD: Not with the customers that you have, who are companies that will pay for products that they use as much as Tuple. BEN: Yeah, I'm happy serving the kind of companies, and they end up being mostly tech companies that really value developer happiness. When their developers come to them and they say, "We don't want to pair over Zoom. We like this thing. It's better. It feels nicer to use," they say, "Okay," and they buy the tool for them. There are places where that's not the case. And they say, "We already have a thing that does screen sharing. You're not allowed to buy this." We don't invest a lot of time trying to sell to those people or convince them that they're wrong. And I'm pretty happy serving sort of the first group. CHAD: So, you've mentioned that you've still been podcasting. To be honest, I didn't realize you were starting something new. Is it live now? BEN: It is live now, yeah. CHAD: Awesome. Where can people find that? BEN: hackersincorporated.com. It's about the transition from developer to founder, which is kind of what we've been touching on here. Yeah, hopefully, the audience is developers who want to start something or have started something who are maybe a little bit further behind progression-wise. And it's kind of, like, I have some lessons, and Adam has some lessons, and, you know, we don't think that we're experts. But sometimes it's useful to just hear, like, two people's story and sort of see, like, what seemingly has worked for them. So, we've been trying to share things there. And I think people will find it useful. VICTORIA: I was going to ask you for a lesson, maybe give us a little sample about how would you advise someone who's built a product and wants to market it, and it's targeted towards developers since you mentioned that previously as well. BEN: Yeah, in a way, the question already contains a problem. It's like, oh, I built the product; now how do I market it? It's a little bit indicative of a very common failure mode for developers, which is that. They sort of assume, okay, after you make the product, you then figure out how you're going to market it. And marketing is sort of a thing you layer on later on when you realize that just, like, throwing it on Twitter or Product Hunt didn't really work. When we started building Tuple, I was out there marketing it already. So, I had two co-founders, so this is a luxury I had. My two co-founders were writing code, and I was out doing stuff. I was recording podcasts. I was tweeting about things. I was making videos. I was giving conference talks. And I was getting people to hear about our product well before it was done. In fact, I was even selling it. I was taking pre-orders for annual subscriptions to the app while it was still vaporware. So, I would say, like, you basically can't start marketing too early. If you start marketing early and no one really cares, well, then you don't really have to build it probably. I would actually even go a little further and say, like, I started marketing Tuple before we had a product available. But in reality, I started marketing Tuple seven or so years before that when I started publishing things through thoughtbot. It's like when I was traveling around giving talks about Ruby, and when I was making screencasts about Vim, and when I was running Upcase, I was, over time, building an audience. And that audience was useful for thoughtbot, and it also was useful for me so that when I left, I had something like 10,000 Twitter followers or something, a few thousand people on our mailing list. But there were a lot of developers that already sort of knew me and trusted me to make fairly good things. And so, when I said, "Hey, I've made a new thing, and it's for you," I really benefited from those years of making useful content and trying to be useful on the internet. And in the early days, we had people sign up, and they would say, "I don't even really think I'm going to use this. But I've learned so much from you over the years that I want to support you, so I'm going to pay for a subscription." VICTORIA: I like your answer because I think the same thing when people ask me, like, because I am an organizer for Women Who Code, and I know all these great people from showing up for years in person months over months. And so, then people will ask, "Oh, how do I recruit more women in my company?" I'm like, "Well, you got to start showing up [laughs] now and do that for a couple of years, and then maybe people will trust you," right? So, I really like that answer. WILL: How has your relationship with Chad continued to grow since you left? Because seven years at the company is a lot. And it seems like you're still on really, really good terms, and you're still friends. And I know that doesn't happen at every company. BEN: I mean, it was tough deciding to leave. I think, like, both of us felt pretty sad about it. That was the longest I'd ever worked anywhere, and I really enjoyed the experience. So, I think it was tough on both sides, honestly. But we haven't kept in that much touch since then. I think we've emailed a handful of times here and there. We're both sociable people, and we sort of get each other. And there's a long history there. So, I think it's just easy for us to kind of drop back into a friendly vibe is sort of how I feel about it. CHAD: Yeah. And the way I explain it to people, you know, when you're leading a company, which Ben and I both are, you put a lot of energy into that and to the people who are on that team. If you're doing things right, there's not really hard feelings when someone leaves. But you need to put in a lot of effort to keep in touch with people outside of the company and a lot of energy. And, to be honest, I don't necessarily do as good a job with that as I would like because it's a little bit higher priority to maintain relationships with them, the people who are still at thoughtbot and who are joining. BEN: What you're saying is I'm dead to you [laughter]. That's CEO, for you're dead to me. CHAD: No. It's just...no hard feelings. BEN: Totally. CHAD: I think one of the things that has been great about the show over the years is that we haven't been afraid to change the format, which I think has been important to keeping it going. So, there is sort of; in fact, the website now is organized into seasons. And I went back and re-categorized all the episodes into seasons. And when the seasons were made up of, like, sort of the format of the show or particular hosts...when we started, it was just an interview show, and it was largely technical topics. And then we started The Bike Shed, and the technical topics sort of moved over there. But it also went with your interests more under the product and business side. Then you started working on products at thoughtbot, so it started to go even more in that. And I think Chris joined you on the show, and that was sort of all about those topics. BEN: Yeah, that makes sense. I think if you don't let the hosts kind of follow their interests, they're going to probably burn out on the thing. It's not fun to force yourself, I think, to record a podcast. CHAD: Yeah. And then when you left, you know, I took over hosting and hosted by myself for a while, went back to the interview format, but then was joined by Lindsey for a little while. We experimented with a few different things: one, interviews, but then we did a whole, just under a year, where we followed along with three companies. And each month, we would have an interview episode where we talked to them, all three companies, about the same topic. And then, we also did an episode with just Lindsey and I talking about that topic and about what we learned from the startup companies that we were following along with for the year. And now we're back to interview freeform, different guests, different topics. It seems like we're going to stick with that for a little while. But, obviously, as Will and Victoria have said, like, we'll probably change it again in some way, you know, a year, two years, three years from now. VICTORIA: Yeah, and I'm definitely bringing my interest around DevOps and platform engineering, so you'll see more guests who have that focus in their background. And with that, sometimes my interview style is more; how do I ask a question that I can't read from your developer docs and that I might not understand the answer to? [laughs] That's kind of where I like to go with it. So yeah, I'm really excited about...it's probably one of my favorite parts of my job here at thoughtbot because I get to meet so many interesting people. And, hopefully, that's interesting to everyone else [laughs] and our guests, yeah. BEN: Totally. Well, I dramatically underestimated how awesome it would be to meet all kinds of cool people in the industry when I started the podcast. I didn't truly connect in my head, like, wait a second, if I have a 45-minute conversation with, like, a lot of prominent, awesome people in our field, that's going to be really interesting and useful for me. So, I think, yeah, it's nice to be in the hosting seat. VICTORIA: And it's so surprising how I'll meet someone at a conference, and I'll invite them onto the podcast. And the way it winds up is that whatever we're talking about on the show is directly relevant to what I'm working on or a problem that I have. It's been incredible. And I really appreciate you for coming back for our 500th Episode here. CHAD: Ben, thanks very much again for joining us, and congratulations on all the success with Tuple. And I wish you the best. BEN: Thank you so much. Thanks for being a continuing customer. I really appreciate it. CHAD: Next, we caught up with Chris Toomey, who had a run as co-host of the show with Ben throughout 2016. CHRIS: Hi there. Thanks for having me. So, we're talking with all of the past hosts. I know you joined the show, and you were on it with Ben. And then you moved over to The Bike Shed, right? CHRIS: Yeah. So, I had co-hosted with Ben for about six months. And then I think I was transitioning off of Upcase, and so that ended sort of the Giant Robots “let's talk about business” podcast tour for me. And then, I went back to consulting for a while. And, at some point, after Derek Prior had left, I took over as the host of The Bike Shed. So, I think there was probably, like, a year and a half, two-year gap in between the various hostings. CHAD: Are you doing any podcasting now? CHRIS: I'm not, and I miss it. It was a lot of fun. It was, I think, an ideal medium for me. I'm not as good at writing. I tend to over-edit and overthink. But when you get me on a podcast, I just start to say what's in my head, and I tend to not hate it after the fact. So [chuckles], that combination I found to be somewhat perfect for me. But yeah, lacking that in my current day-to-day. CHAD: Well, what's been taking up your time since you left? CHRIS: I had decided it was time to sort of go exploring, try and maybe join a startup, that sort of thing. I was sort of called in that direction. So, just after I left thoughtbot, I did a little bit of freelancing, but that was mostly to sort of keep the lights on and start to connect with folks and see if there might be an opportunity out there. I was able to connect with a former thoughtbot client, Sam Zimmerman, who was looking to start something as well. And so, we put our act together and formed a company called Sagewell, which was trying to build a digital financial platform for seniors, which is a whole bunch of different complicated things to try and string together. So, that was a wonderful experience. I was CTO of that organization. And I think that ran for about two and a half years. Unfortunately, Sagewell couldn't quite find the right sort of sticking point and, unfortunately, shut down a little bit earlier in this year. But that was, I would say, the lion's share of what I have done since leaving thoughtbot, really wonderful experience, got to learn a ton about all of the different aspects of building a startup. And I think somewhat pointedly learned that, like, it's messy, but I think I do like this startup world. So, since leaving Sagewell, I've now joined a company called August Health, which has a couple of ex-thoughtboters there as well. And August is post their Series A. They're a little bit further along in their journey. So, it was sort of a nice continuation of the startup experience, getting to see a company a little bit further on but still with lots of the good type of problems, lots of code to write, lots of product to build. So, excited to be joining them. And yeah, that's mostly what's taking up my time these days. CHAD: So, I know at Sagewell, you made a lot of technical architecture, team decisions. It was Rails in the backend, Svelte in the frontend, if I'm not mistaken. CHRIS: Yep, that's correct. CHAD: You know, hindsight is always 2020. Is there anything you learned along the way, or given how things ended up, that you would do differently? CHRIS: Sure. I was really happy with the tech stack that we were able to put together. Svelte was probably the most out there of the choices, I would say, but even that, it was sort of relegated to the frontend. And so, it was a little bit novel for folks coming into the codebase. Most folks had worked in React before but didn't know Svelte. They were able to pick it up pretty quickly. But Inertia.js was actually the core sort of architecture of the app, sort of connected the frontend and the backend, and really allowed us to move incredibly quickly. And I was very, very happy with that decision. We even ended up building our mobile applications, both for iOS and Android. So, we had native apps in both of the stores, but the apps were basically wrappers around the Rails application with a technology similar to Turbolinks native–if folks are familiar with that so, sort of a WebView layer but with some native interactions where you want. And so, like, we introduced a native login screen on both platforms so that we could do biometric login and that sort of thing. But at the end of the day, most of the screens in the app didn't need to be differentiated between a truly native mobile app and what like, mobile WebView would look like. So, we leaned into that. And it was incredible just how much we were able to do with that stack and how quickly we were able to move, and also how confidently we were able to move, which was really a nice thing. Having the deep integration between the backend and the frontend really allowed a very small team to get a lot done in a short time. CHAD: Does that code live on in any capacity? CHRIS: No. CHAD: Oh. How does that make you feel? [chuckles] CHRIS: It makes me feel very sad, I will say. That said, I mean, at the end of the day, code is in service of a business. And so, like, the code...there are, I think, probably a couple of things that we might be able to extract and share. There were some interesting...we did some weird stuff with the serializers and some, like, TypeScript type generation on the frontend that was somewhat novel. But at the end of the day, you know, code is in service of a business, and, unfortunately, the business is not continuing on. So, the code in the abstract is...it's more, you know, the journey that we had along the way and the friends we made and whatnot. But I think, for me, sort of the learnings of I really appreciate this architecture and will absolutely bring it to any new projects that I'm building from, you know, greenfield moving forward. VICTORIA: I'm curious what it was like to go from being a consultant to being a big player in a startup and being responsible for the business and the technology. How did that feel for you? CHRIS: I would say somewhat natural. I think the consulting experience really lent well to trying to think about not just the technical ramifications but, you know, what's the business impact? How do we structure a backlog and communicate about what features we want to build in what order? How do we, you know, scope a minimal MVP? All those sorts of things were, I think, really useful in allowing me to sort of help shape the direction of the company and be as productive of an engineering team as we could be. CHAD: A lot of the projects you worked on at thoughtbot were if not for startups, helping to launch new products. And then, a lot of the work you did at thoughtbot, too, was on Upcase, which was very much building a business. CHRIS: Yes. I definitely find myself drawn in that direction, and part of like, as I mentioned, I seem to be inclined towards this startup world. And I think it's that, like, the intersection between tech and business is sort of my sweet spot. I work with a lot of developers who are really interested in getting sort of deeper into the technical layers, or Docker and Kubernetes and orchestration. And I always find myself a little bit resistant to those. I'm like, I mean, whatever. Let's just...let's get something out there so that we can get users on it. And I am so drawn to that side, you know, you need both types of developers critically. I definitely find myself drawn to that business side a little bit more than many of the folks that I work with, and helping to bridge that gap and communicate about requirements and all those sort of things. So, definitely, the experience as a consultant really informed that and helped me have sort of a vocabulary and a comfort in those sort of conversations. WILL: How did Upcase come about? Because I know I've talked to numerous people who have gone through Upcase. I actually went through it, and I learned a ton. So, how did that come about? CHRIS: I think that was a dream in Ben Orenstein's eye. It started as thoughtbot Learn many, many years ago. There was a handful of workshops that had been recorded. And so, there were the video recordings of those workshops that thoughtbot used to provide in person. Ben collected those together and made them sort of an offering on the internet. I think Chad, you, and I were on some podcast episode where you sort of talked about the pricing models over time and how that went from, like, a high dollar one-time download to, like, $99 a month to $29 a month, and now Upcase is free. And so, it sort of went on this long journey. But it was an interesting exploration of building a content business of sort of really leaning into the thoughtbot ideal of sharing as much information as possible, and took a couple of different shapes over time. There was the weekly iterations of the video series that would come out each week, as well as the, like, longer format trails, and eventually some exercises and whatnot, but very much an organic sort of evolving thing that started as just a handful of videos and then became much more of a complete platform. I think I hit the high points there. But, Chad, does that all sound accurate to you? CHAD: Yeah, I led the transition from our workshops to Learn, which brought everything together. And then, I stepped away as product manager, and Ben took it the next step to Upcase and really productized it into a SaaS sort of monthly recurring billing model and took it over from there. But it still exists, and a lot of the stuff there is still really good [laughs]. CHRIS: Yeah, I remain deeply proud of lots of the videos on that platform. And I'm very glad that they are still out there, and I can point folks at them. VICTORIA: I love that idea that you said about trying to get as much content out there as possible or, like, really overcommunicate. I'm curious if that's also stayed with you as you've moved on to startups, about just trying to get that influence over, like, what you're doing and how you're promoting your work continues. CHRIS: I will say one of the experiences that really sticks with me is I had followed thoughtbot for a while before I actually joined. So, I was reading the blog, and I was listening to the podcasts and was really informing a lot of how I thought about building software. And I was so excited when I joined thoughtbot to, like, finally see behind the curtain and see, like, okay, so, what are the insider secrets? And I was equal parts let down...actually, not equal parts. I was a little bit let down but then also sort of invigorated to see, like, no, no, it's all out there. It's like, the blog and the open-source repos and those sort of...that really is the documentation of how thoughtbot thinks about and builds software. So, that was really foundational for me. But at the same time, I also saw sort of the complexity of it and how much effort goes into it, you know, investment time Fridays, and those sort of things. Like, a thoughtbot blog post is not a trivial thing to put up into the world. So many different people were collaborating and working on it. And so, I've simultaneously loved the sharing, and where sharing makes sense, I've tried to do that. But I also recognize the deep cost. And I think for thoughtbot, it's always made sense because it's been such a great mechanism for getting the thoughtbot name out there and for getting clients and for hiring developers. At startups, it becomes a really interesting trade-off of, should we be allocating time to building up sort of a brand in the name and getting ourselves, you know, getting information out there? Versus, should we be just focusing on the work at hand? And most organizations that I've worked with have bias towards certainly less sharing than thoughtbot, but just not much at all. Often, I'll see folks like, "Hey, maybe we should start a blog." And I'm like, "Okay, let's just talk about how much effort that [laughs] actually looks like." And I wonder if I'm actually overcorrected on that, having seen, you know, the high bar that thoughtbot set. CHAD: I think it's a struggle. This is one of my [laughs] hot topics or spiels that I can go on. You know, in most other companies, that kind of thing only helps...it only helps in hiring or the people being fulfilled in the work. But at most companies, your product is not about that; that's not what your business is. So, having a more fulfilled engineering team who is easier to hire—don't get me wrong, there are advantages to that—but it doesn't also help with your sales. CHRIS: Yes. CHAD: And at thoughtbot, our business is totally aligned with the people and what we do as designers and developers. And so, when we improve one, we improve the other, and that's why we can make it work. That is marketing for the product that we actually sell, and that's not the case at a SaaS software company. CHRIS: Yes, yeah, definitely. That resonates strongly. I will say, though, on the hiring side, hiring at thoughtbot was always...there was...I won't say a cheat code, but just if someone were to come into the hiring process and they're like, "Oh yeah, I've read the blog. I listen to the podcast," this and that, immediately, you were able to skip so much further into the conversation and be like, "Okay, what do you agree with? What do you disagree with? Like, let's talk." But there's so much. Because thoughtbot put so much out there, it was easy to say, like, "Hey, this is who we are. Do you like that? Is that your vibe?" Whereas most engineering organizations don't have that. And so, you have to try and, like, build that in the context of, you know, a couple of hour conversations in an interview, and it's just so much harder to do. So, again, I've leaned in the direction of not going anywhere near thoughtbot's level of sharing. But the downside when you are hiring, you're like, oh, this is going to be trickier. CHAD: Yeah. One of the moments that stands out in my mind, and maybe I've told this story before on the podcast, but I'll tell it again. When we opened the New York studio, it was really fast growing and was doing a lot of hiring. And one of the people who had just joined the company a couple of weeks before was doing an interview and rejected the person was able to write an articulate reason why. But it all boiled down to this person is, you know, not a fit for thoughtbot. Based on what they were able to describe, I felt very confident with the ability or with the fact that they were able to make that call, even though they had been here only a couple of weeks, because they joined knowing who we were, and what we stand for, and what our culture and our values are, and the way that we do things, and all that kind of thing. And so, yeah, that's definitely a huge benefit to us. VICTORIA: I've certainly enjoyed that as well, as someone who hires developers here and also in meeting new companies and organizations when they already know thoughtbot. That's really nice to have that reputation there, coming from my background—some really more scrappier startup kind of consulting agencies. But, you know, I wanted to talk a little bit more about your podcasting experience while you're here. So, I know you were on both The Bike Shed and Giant Robots. Which is the better podcast? [laughter] So, what's your...do you have, like, a favorite episode or favorite moment, or maybe, like, a little anecdote you can share from hosting? CHRIS: Well, I guess there's, like, three different eras for me in the podcasting. So, there's Giant Robots with Ben talking more about business stuff, and I think that was really useful. I think it was more of a forcing function on me because I sort of...Both Ben and I were coming on; we were giving honest, transparent summaries of our, like, MRR and stats and how things were growing, and acted as sort of an accountability backstop, which was super useful but also just kind of nerve-wracking. Then, when I joined the Bike Shed, the interviewing sequence that I did each week was just a new person that I was chatting with. And I sort of had to ramp them up on, hey, here's a quick summary on how to think about podcasting. Don't worry, it'll be great. Everybody have fun. But I was finding each of the guests. I was sort of finding a topic to talk about with them. So, that ended up being a lot more work. And then, the last three years chatting with Steph that was by far my favorite. There was just such a natural back-and-forth. It really was just capturing the conversations of two developers at thoughtbot and the questions we would ask each other as we hit something complicated in a piece of code or, "Oh, I saw this, you know, article about a new open-source repository. What do you think about that?" It was so much easier, so much more natural, and, frankly, a lot of fun to do that. And, two, I actually do have an answer to the favorite podcast episode, which is the first episode that Steph was ever on. It was before she actually joined as a co-host. But it was called “What I Believe About Software.” And it was just this really great, deep conversation about how we think about software. And a lot of it is very much, like, thoughtbot ideals, I would say. But yeah, Steph came in and just brought the heat in that first episode, and I remember just how enjoyable that experience was. And I was like, all right, let's see if I can get her to hang out a little bit more, and, thankfully, she was happy to join. WILL: What was your favorite position, I guess you can call it? Because you say you like the mixture of business and, you know, development. So, you've been in leadership as development director, CTO. You've been a web developer. You've been over content, like, with Upcase. What was your favorite position [inaudible 16:43] you were doing, and why was it your favorite? CHRIS: The development director role feels like sort of a cheating answer, but I think that would be my answer because it contained a handful of things within it. Like, as development director, I was still working on client projects three days a week. And then, one day a week was sort of allocated to the manager-type tasks, or having one-on-ones with my team sort of helping to think about strategy and whatnot. And then, ideally, still getting some amount of investment time, although the relative amounts of those always flexed a little bit. Because that one sort of encompassed different facets, I think that's going to be my answer. And I think, like, some of what drew me to consulting in the first place and kept me in that line of work for seven years was the variety, you know, different clients, as well as, even within thoughtbot, different modes of working in podcasts or video. Or there was a bootcamp that I taught, a session of Metis, which that was a whole other experience. And so, getting that variety was really interesting. And I think as sort of a tricky answer to your question, the development director role as a singular thing contained a multitude, and so I think that was the one that would stand out to me. It's also the most, you know, the one that I ended on, so [laughs] it might just be recency bias, but yeah. VICTORIA: Oh, I love that. Is there anything else that you would like to promote on the podcast today? CHRIS: No, although as you ask the question, I feel like I should, I don't know, make some things to promote, get back into some, I don't know, content generation or something like that. But for now, no. I'm, you know, diving into the startup life, and it's a wonderful and engrossing way to do work, but it does definitely take up a lot of my headspace. So, it's an interesting trade-off. But right now, I don't know; if folks are online and they want to say hi, most of my contact information is readily available. So, I would love to say hi to folks, anyone that listened in the past or, you know, has any thoughts in the now. Would love to connect with folks. But otherwise, yeah, thank you so much for having me on. CHAD: In 2017, I took over from Ben as solo host of the show but was joined by Lindsey Christainson as cohost in 2019. After some time away from thoughtbot, Lindsey is back with us and we sat down to catch up with her. VICTORIA: Why don't you tell me about your current role with thoughtbot? LINDSEY: I am currently supporting marketing and business development at thoughtbot, as well as working as a marketing consultant for thoughtbot clients. VICTORIA: Great. And I understand that you had worked with thoughtbot many years ago, and that's when you also came on as a co-host of Giant Robots. Is that right? LINDSEY: Yeah, a couple of years ago. I left thoughtbot in spring of 2021. And I forget how long my stint was as a co-host of Giant Robots, but over a year, maybe a year and a half, two years? CHAD: Yeah, I think that's right. I think you started in 2019. LINDSEY: Yeah. Yeah, that sounds right. And Chad and I were co-hosts, I think, similar to the setup today in which sometimes we hosted together, and sometimes we were conducting interviews separately. CHAD: And then we sort of introduced a second season, where we followed along with a batch of companies over the course of the entire season. And that was fun, and we learned a lot. And it was nice to have consistent guests. LINDSEY: Yeah, that was a lot of fun. I really liked that format. I don't know; they almost were, like, more than guests at that point. They were just like other co-hosts [laughs] that we could rely on week in, week out to check in with them as they're working on early-stage companies. So, every time we checked in with them, they usually had some new, exciting developments. WILL: I really like that idea. How did y'all come up with that? CHAD: I'm not sure. I think a few years before I had taken over hosting of the show, and I forget...my memory maybe is that I went to Lindsey and said, "You know, let's do something different." But I'm not sure. Does that match your memory, Lindsey? LINDSEY: Yeah, I think there were two main drivers; one was I think you were feeling like you were having similar conversations in the interviews every time. Like, you couldn't get to a certain depth because every time you were interviewing someone, you were doing, like, the, "Well, tell me your founding story." And, you know, how did you raise funding? It kind of got a little bit repetitive. And then, on the side, the few we had done together, I think we both really enjoyed. So, we were thinking, like, what's the format in which the two of us could co-host together more regularly? Because I'm a pleasure to talk to [laughter]. I think you were like, I need to talk to Lindsey more. [inaudible 3:13] VICTORIA: What is your hosting style? How would you describe your approach to hosting a podcast? LINDSEY: I mean, obviously, it's a podcast about products and business. I think as a marketer, I am, you know, drawn a lot to the marketing side, so tending to ask questions around go-to-market audience, users. That's always just, like, a particular interest of mine. But then also, like, the feelings. I love asking about the feelings of things, you know, how did it feel when you started? How did it feel when you made this tough decision? So, that's another thing I think I noticed in my interviews is asking about some of the emotions behind business decisions. VICTORIA: And I like hearing about how people felt at the time and then how they felt afterwards [laughs]. And, like, how people around them supported each other and that type of thing. That's really fun. I'm curious, too, from your marketing background and having to do with podcasts like; some founders, I think, get the advice to just start a podcast to start building a community. But I'm curious on your thoughts about, like, how does podcasting really play into, like, business and marketing development for products? LINDSEY: Oh yeah. It's become definitely, like, a standard channel in B2B these days. I feel like that it's pretty typical for a company to have a podcast as one way that they engage their audience and their users. In marketing, you're really vying for people's attention, and people's attention span is getting shorter and shorter. So, like, if you have an ad or a blog, you're getting, like, seconds, maybe minutes of someone's attention. And whereas something like a podcast offers a unique channel to have someone's undivided attention for, you know, 30 minutes, an hour, and if you're lucky, you know, checking back in week over week. So, it became a really popular method. That said, I think you're probably also seeing the market get saturated [laughs] with podcasts now, so some diminishing returns. And, you know, as always, kind of looking for, you know, what's the next way? What's the next thing that people are interested in in ways to capture their attention? CHAD: What is the next thing? LINDSEY: I don't know, back to micro-content? TikTok videos -- CHAD: Yeah, I was going to say TikTok, yeah. LINDSEY: Yeah, you know, 10-30 seconds, what can you communicate? VICTORIA: I see people live streaming on Twitch a lot for coding and developer products. LINDSEY: Yeah, I think we've seen some of that, too. We've been experimenting more at thoughtbot with live streaming as well. It's another interesting mechanism. But yeah, I don't know, it's interesting. It's another form of, like, community and how people engage with their communities. So, it's always evolving. It's always evolving, and sometimes it's not. Sometimes, people just do want to get in a room together, too, which is always interesting. WILL: What has been, in your experience, the good the bad? Like, how do you feel about the way that it has shifted? Because I think you started in, like, 2000, like, kind of earlier 2000, 2005, something around there. And it was totally different than now like you're saying. Because I feel like, you know, Channel 5 30-second ad, you know, with some of the marketing depending on what you're doing, to now to where you're, like, you're paying influencers to advertise your product, or you're doing an ad. Or it's more social media-driven and tech-driven. What has been your opinion and feelings on the way that it has grown and evolved? LINDSEY: Marketing, in general, yeah, I graduated college in 2005 and started my marketing career. And yeah, you could, like, actually get people to click on banner ads back then, which was pretty [inaudible 07:14] [laughs]. WILL: I forgot about banner ads [laughs]. LINDSEY: I don't know, yeah. I don't know. In order for myself to not just get too frustrated, I think I've got to, like, view it as a game kind of. What new things are we going to try? You know, what do we see work? But it can really depend. And I've always been in B2B side of things. And consumer, I'm sure, has its own kind of evolution around how people engage and how they consume content and byproducts. But in B2B, you know, it can really depend on industry too. You know, I'm working with a client right now in the senior living space, and they're really big in in-person conferences. So, that's how people consume, get a lot of their information and, make connections, and learn about new products. So, it's been interesting to work in an industry that what might be considered, like, a little bit more old-school channels are still effective. And then just thinking about how you weave in the new channels with the existing ones without ignoring them. They might get information in conferences, but they're still a modern human who will then, you know, search online to learn more, for example. VICTORIA: It reminds me of a phrase I like to say, which is that, like, technology never dies; you just have more of it. There's just more different options and more different ways to do things. And some people are always, you know, sometimes you have to be flexible and do everything. CHAD: So, tell us more about what you did in between...after you left thoughtbot, what did you do? LINDSEY: I was heading up B2B marketing for a company called Flywire, which is headquartered in Boston but is a global company now. And they were just kind of starting their B2B business unit, which, as I mentioned, B2B is my personal specialty. I had been connected to their CMO through the Boston startup community. And yeah, I was helping them kind of launch their go-to-market for B2B. The industries they were in before...they got their start in higher education and then expanded in healthcare and found a niche in luxury travel, and then we were figuring out the B2B piece. But yeah, I was there for about a year and a half. They actually went public the second week I was there, which was an interesting [laughs] experience. I knew they were, like, on that journey, but it was kind of funny to be there the second week, and people were, like, "Congrats." And I was like, "Well, I definitely didn't have anything to do with it because I just finished my onboarding, but thank you," [laughs]. CHAD: One of the things that really impressed me when you joined thoughtbot was the way in which you learned about who we were and really internalized that in a way where you were then able to pretty meaningfully understand our market, our positioning in the market, and come up with new strategies for us. I assume that's something you're good at in general [laughs]. How do you approach it? How did you approach it when you joined Flywire, for example? And how was it the same or different than how you approached thoughtbot? LINDSEY: Ooh, yeah, that's a good question. And I appreciate that comment because it's difficult. But I think, yeah, with any new organization that I'm joining, you know, I think starting out with your kind of mini-listening tour of your key stakeholders across, you know, the different departmental focuses to get a sense of, what are the challenges? What are the opportunities? It's actually like, you know, it's the SWOT analysis, kind of trying to fill in your own mind map of a SWOT analysis of where the company is. What are the major hurdles you're facing? Where are people trying to go? What have they tried that's worked? What have they tried that's failed? But then, like, I think for the culture component, I think a part of that maybe is, like, feel, and maybe something that I do have a knack for. Again, maybe this is, like, you know, emotional intelligence quotient, where it's like, you know, but it's the company, you know, who is this company? What is important to them? How do they work and go about things? I know thoughtbot is certainly very unique, I think, in that arena in terms of being, like, a really value-driven company, and one where especially, like, marketing and business work is, like, distributed across teams in a really interesting way. You know, I'm sure the fact that it fascinated me and was something I could get passionate and get behind was something that also helped me understand it quickly. CHAD: I was excited that...or it was sort of a coincidence because I had reached out to you and without realizing that you had left Flywire. And Kelly, who had been doing a combined sales and marketing role, was going on parental leave. And so, it was fortuitous [laughs] that you were able to come back and help us and provide coverage, like, Kelly was out. LINDSEY: Yeah, it definitely felt like stars aligned moment, which, you know, I'm pretty woo-woo, so I believe in [laughter]...I believe in that kind of thing. You know, yeah, it was wild. It really did feel like your email came out of nowhere. And, you know, I mentioned it, obviously, to my partner and my friends. And they were like, "Oh, he definitely knows, like, that you left your last company." And I'm like, "I actually don't think he does [laughter]. I actually don't think he does." Yeah, and then we started chatting about me coming back to help. And it was great. thoughtbot makes it hard to work anywhere else [laughs]. So, I was happy to come back. I missed the team. CHAD: And one of the exciting things, and you've mentioned it, is you're not just doing marketing for thoughtbot now. We have started to offer your services to our clients. LINDSEY: Yeah, I'm super excited about this. And it's something I'd started thinking about. I had decided to take some time off between Flywire and my next thing and had started thinking about doing marketing, consulting. And as I'm doing that, I'm thinking a lot about how thoughtbot does consulting and, you know, wanting to emulate something like that. So, I started back up at thoughtbot. That wasn't part of the plan. I was just going to, you know, fill in for Kelly and help with marketing things. But then, you know, a good opportunity arose to work on a client, and I was really excited. When, you know, Chad, you and I chatted through it, we came to the conclusion that this was something worth exploring under the, you know, thoughtbot umbrella. And it's been a really great experience so far. And we now have brought on another client now. And if you're listening and need early-stage B2B marketing support, reach out to lindsey@thoughtbot.com. CHAD: Definitely. And Lindsey is pretty good, so you're going to like it [laughs]. LINDSEY: Yeah, you're going to like the way you look. WILL: Yeah, definitely. Because I can even feel your presence here, you know, coming back. Because even like, you know, the market where it's at now and some of the suggestions that, you know, you've been helping us. For example, like, I do a lot of React Native, and you're like, "Hey, you know, blog posts have done a lot of traction, you know, let's get some more blog posts out in the market to help with the traffic and everything." So, the question I have with that is, like, thank you for even suggesting that because it's, like, those little things that you don't even think about. It's like, oh yeah, blog posts, that's an easy transition to help the market, clients, things like that. But with the market the way it is, what has been your experience working during this time with the market? I don't know if you want to call it struggling, but whatever you want to call it that, it's doing [laughs]. LINDSEY: Yeah, I mean, the economy is difficult now. We also went through a really tough spot when I was here last time. During COVID, you know, we faced a major company challenge. And, I mean, I'll let Chad speak to it, but I would imagine it's probably one of the bigger, like, economic inflection points that you faced. Would you say that? CHAD: Yeah, definitely. The thing about it that made it worse was how quickly it happened. You know, it was something that you didn't see coming, and then, you know, about 40% of our business went away in a single month. That's the kind of thing that was a real shock to the system. I think the thing that made it difficult, too, was then the aspects of COVID, where we were no longer able to go into our studios. We were all working remotely. We were isolated from each other. And so, that made executing on what needed to be done in order to make the company survive additionally challenging. LINDSEY: Yeah, so I think, like, going through that experience, also, and seeing how the team and the leadership team rallied together to get through it. And then, you know, ultimately, I think 2021 and 2022 have, like, really good years. That was a really positive experience. And something I'll definitely take with me for a while is just, like, keeping a cool head and just knowing you have, like, really smart, talented folks with you working on it and that you can get through it. And just, like, doing some, I mean, we relied on what we did best, which was, like, design thinking, using design exercise to think about, like, how we might re-organize the company, or what other services we might try launching, or how might we re-package, you know, larger services into smaller more palatable services when people have, like, kind of tighter purse strings. So, that was, like, a great educational experience, and I think something we just continue to do now: be open to change, be open to changing how we package services, what clients we go after, and coming at it with, like, an agile, experimental mindset and try to find out what works. VICTORIA: I really appreciate that. And it aligns now with the new service we've developed around you and the marketing that you provide. And I'm curious because I've had founders come up to me who say they need help with marketing or they need to, like, figure out their marketing plans. So, say you've met a founder who has this question, like, what questions do you ask them to kind of narrow down what it is they really need and really want to get out of a marketing plan? LINDSEY: I've been thinking about this a lot recently. And, like, obviously, I see other marketing leaders in the market. Marketers like to talk about what they do on LinkedIn [laughs], so I get to...I read a lot about different people's approaches to this. And some people kind of go in and are like, okay, this is what you need. This is how we're going to do it, and they start executing on it. And I really do take a very collaborative approach with founders. I think they're, especially in early stage, they're your most important asset in a way, and a lot of their intuition around the market and the business, you know, it's gotten them to where they're at. And so, I think starting from the point of, like, taking what they view as priorities or challenges, and then helping them better explore them or understand them with my own marketing experience and expertise, to

Crafting a Meaningful Life with Mary Crafts
(Ep 297) The Courage to Commit with Roger Comstock

Crafting a Meaningful Life with Mary Crafts

Play Episode Listen Later Oct 26, 2023 46:42


Character is found in consistency. You need to keep pushing forward even when it gets tough! Roger Comstock shares his journey from working as an analyst to starting his own company, $0 Startup. He emphasizes the importance of gratitude, growth, and giving in crafting a meaningful life. Roger explains how $0 Startup helps individuals turn their dreams into reality by teaching them how to create recurring income through service-based arbitrage. Roger's story is a testament to the power of dreaming deeply and taking action. By focusing on gratitude, growth, and giving, we can find true fulfillment and make a positive impact on the world. It is through facing our fears, changing our self-image, and seeking help that we can embark on a journey of transformation. So, let us dream, act, and transform as we craft our way to a meaningful life! Learn more about $0 Startup: https://0dollarstartup.com/ Who Is Roger Comstock?  Roger is a serial entrepreneur who has developed an affinity and obsession for business and helping people. He teaches individuals how to start recurring revenue businesses without Venture Capital, Debt or Real Estate.  He his the CEO and Founder of 0 Dollar Startup, Flipr, Comstock Consulting and Tuple.  Roger loves being with family - especially his sweetheart Kayla. She is literally his best friend. He enjoys being outside, camping, learning, thinking, laughing, accomplishing goals, and helping people understand and reach their potential.   

Code and the Coding Coders who Code it
Episode 29 - Ben Orenstein

Code and the Coding Coders who Code it

Play Episode Listen Later Oct 3, 2023 36:28


In this episode, I'm joined by a special guest, Ben Ornstein, one of my Ruby heroes. I may fan-boy a bit as I express my admiration for Tuple, a tool I love. Together, we dive deep into Tuple's journey, starting from its inception and delving into the creative problem-solving and ingenuity behind its design and development. Ben also reveals his transition from CEO to Head of Product.  We discuss the fresh perspective on team collaboration methods and product development this change offers. We explore how feedback loops and Agile practices play a pivotal role in Tuple's continuous evolution. Along the way, we also reflect on the 'My Life in Weeks' poster, which serves as a stark reminder of the fleeting nature of our time on Earth. This episode is a roller-coaster of insights, trivia, and reflections that will hopefully leave you feeling wiser and more contemplative.Links:@r00k on TwitterTuple (aka my favorite way to pair)'My Life in Weeks' poster'A Short History of Nearly Everything' by Bill BrysonSupport the showReady to start your own podcast?This show is hosted on Buzzsprout and it's awesome, not to mention a Ruby on Rails application. Let Buzzsprout know we sent you and you'll get a $20 Amazon gift card if you sign up for a paid plan, and it helps support our show.SponsorsA big thanks to OBLSK for being the very first sponsor of the show!

Hackers Incorporated
Enterprise sales for reluctant founders

Hackers Incorporated

Play Episode Listen Later Jul 19, 2023 60:33


Enterprise sales gets a bad rap amongst indie founders, but at Tuple it's become an important part of their business model. In this episode, Ben shares all his tips and tricks on how to sell to enterprise customers as a small startup without letting it slow you down.Discuss this episode on Twitter →Timestamps(00:00) - Ben's notes on enterprise sales (02:58) - Ben's first time (04:56) - Tactic: Build a product that can grow bottom-up (07:12) - Tactic: Ask buyers to answer their own questions (08:34) - Tactic: Say no to more than you think (16:11) - Tactic: Your pricing should make you uncomfortable (25:38) - Tactic: Charge more for SAML single sign-on (27:50) - Tactic: Don't sign something without charging a lot (28:34) - Tactic: Put an expiration date on your quotes (29:12) - Tactic: Dodge pricing pushback with quarterly payments (31:06) - Tactic: Make sure you lose some deals because of price (33:26) - How procurement works (37:54) - How important is enterprise sales for Tuple? (47:59) - Tactic: Ask procurement, "what helps this deal get done faster" (49:49) - Tactic: Have a /security page on your website (53:07) - Tactic: Use Y Combinator's sales agreement template (55:47) - Tactic: You probably won't be sued LinksAdam on TwitterBen on TwitterTuple's /security pageY Combinator — Sales Agreement

Lenny's Podcast: Product | Growth | Career
Competing with giants: An inside look at how The Browser Company builds product | Josh Miller (CEO)

Lenny's Podcast: Product | Growth | Career

Play Episode Listen Later Mar 19, 2023 88:37


Brought to you by Writer—Generative AI for the enterprise | Dovetail—Bring your customer into every decision | Linear—The new standard for modern software development—Josh Miller is the CEO and co-founder of The Browser Company, where he helped build Arc, my go-to web browser. In today's episode, we get an inside look at the unique structure and values of The Browser Company and how their company culture has helped them land some of the best talent in tech. Josh shares ways that his company embraces experimentation, including their “optimizing for feelings” approach to building, and explains why extreme transparency is at the forefront of everything they do.Special invite link to skip the waitlist: https://arc.net/gift/lennyFind the full transcript at: https://www.lennyspodcast.com/competing-with-giants-an-inside-look-at-how-the-browser-company-builds-product-josh-miller-ceo/#transcriptWhere to find Josh Miller:• Twitter: https://twitter.com/joshm• LinkedIn: https://www.linkedin.com/in/josh-miller-b31259106/Where to find Lenny:• Newsletter: https://www.lennysnewsletter.com• Twitter: https://twitter.com/lennysan• LinkedIn: https://www.linkedin.com/in/lennyrachitsky/Referenced:• Early access to Arc: https://arc.net/gift/lenny• The Browser Company: https://thebrowser.company/• Arc: https://arc.net/• Hursh Agrawal on LinkedIn: https://www.linkedin.com/in/hurshagrawal/• Hacker News: https://news.ycombinator.com/• Scott Belsky on LinkedIn: https://www.linkedin.com/in/scottbelsky/• Notes on Roadtrips: https://thebrowser.company/values/• Shahed Khan on Twitter: https://twitter.com/_shahedk• Paper by FiftyThree:  https://www.hellobrio.com/blog/digital-drawing-paper-fiftythree• Vimeo: https://vimeo.com/• Peter Vidani on Twitter: https://twitter.com/pter• The Verge: https://www.theverge.com/• Ellis Hamburger on LinkedIn: https://www.linkedin.com/in/ellishamburger/• Airbnb's Snow White project: https://uxdesign.cc/how-airbnb-proved-that-storytelling-is-the-most-important-skill-in-design-15d04ac71039• General Magic: https://www.generalmagicthemovie.com/• Linear: https://linear.app/• Raycast: https://www.raycast.com/• Cron: https://cron.com/• Thrive Capital: https://thrivecap.com/• Tuple: https://tuple.app/• Figma: https://www.figma.com/• Harold and the Purple Crayon: https://www.amazon.com/Harold-Purple-Crayon-Crockett-Johnson/dp/0062086529• Seeing Is Forgetting the Name of the Thing One Sees: https://www.amazon.com/Seeing-Forgetting-Name-Thing-Sees/dp/0520256093/• God Save Texas: A Journey into the Soul of the Lone Star State: https://www.amazon.com/God-Save-Texas-Journey-State/dp/0525520104• The Last of Us on HBO: https://www.hbo.com/the-last-of-us• Adam Curtis documentaries on YouTube: https://www.youtube.com/playlist?list=PLStWlBRkr0N_aYjPmbrrjm_rsstpkUBLc• Notion: https://www.notion.so/In this episode, we cover:(00:00) Josh's background(03:56) Arc and the metrics they use to track growth(04:42) Arc's retention numbers(08:22) Josh's product-building philosophy and why he believes in optimizing for feelings(18:57) How The Browser Company's values create a culture that allows them to ship so quickly(22:46) The “Notes on Roadtrips” doc about values(27:48) How Josh is able to hire such amazing talent(37:29) The good and bad of building in public(45:16) Some of the odd teams at The Browser Company and why Josh calls it a prototype-driven culture(46:01) The membership team(48:07) The storytelling team(52:00) Why The Browser Company doesn't have traditional PMs(54:07) A case for adding PMs(57:32) The role of data, even in a company that optimizes for feelings(58:30) Airbnb's Snow White project(1:02:14) How impactful moments in Josh's life influenced values at The Browser Company(1:03:08) How the film General Magic has inspired Josh(1:04:32) The value of novel names(1:06:50) Why The Browser Company's approach works for Arc(1:12:47) Why you need to nail latency and why Josh loves Tupl(1:14:33) The shift to cloud computing and the ultimate vision at The Browser Company(1:23:15) Lightning roundProduction and marketing by https://penname.co/. For inquiries about sponsoring the podcast, email podcast@lennyrachitsky.com. Get full access to Lenny's Newsletter at www.lennysnewsletter.com/subscribe

All THINGS HIP HOP EPISODE #1
EP #252 0 DOLLAR STARTUP - ROGER COMSTOCK

All THINGS HIP HOP EPISODE #1

Play Episode Listen Later Feb 21, 2023 44:56


THE KELLY CARDENAS PODCAST PRESENTS Roger is a serial entrepreneur who has developed an affinity and obsession for business and helping people. He teaches individuals how to start recurring revenue businesses without Venture Capital, Debt or Real Estate by using the internet to create recurring income in a new and easy way. He his the CEO and Founder of 0 Dollar Startup, Tuple, and Comstock Consulting. Roger loves being with family - especially his sweetheart Kayla. She is literally his best friend. He enjoys being outside, golfing, camping, learning, thinking, reading, laughing, accomplishing goals, and helping people understand and reach their potentials. He has a goldendoodle named Max who is basically a shadow wherever Roger goes. You can follow Roger on IG at roger.Comstock and learn more about what he does at 0dollarstartup.com THE HIDEOUT Be sure to check out my new audiobook SUCCESS LEAVES CLUES (THE 7 P'S THAT CAN SHIFT YOUR REALITY) Thank you to our sponsors PRIVATE MONEY CLUB USE CODE - KELLY500 MONEY SCHOOL TABLE ONE HOSPITALITY RAVEN DRUM FOUNDATION THE MINA GROUP SECRET KNOCK FAMECAST Findlay Volvo Las Vegas Samaritans Feet Cardenas Law Group Squeeze Dried Agua Hedionda Lagoon Foundation PAUL MITCHELL HAIR CARE DELIVERED TO YOUR DOORSTEP BLING SHINE SERUM-The #1 seller of over 15 years and the only product to be endorsed by my MAMA! MORE KELLY “JOY IS THE ART OF FALLING IN LOVE WITH YOUR CURRENT CIRCUMSTANCES AND ALLOWING MAGIC TO HAPPEN!” EXECUTIVE PRODUCER MADDOX CARDENAS #Kellycardenas #kcsnation #kcsflow #business101 #motivation #inspiration #inspirationoftheday #workhard #lifestyle #millionairemindset #successmindset #success #grit #nolimits #startyourlife #whatsyourwhy #whynotyou #fiidnt #keynotespeaker #kellycardenaspodcast #evangelicalmarketing --- Send in a voice message: https://anchor.fm/kelly-cardenas/message

The Art of Product
220: Ben and Adam Wrap The Year

The Art of Product

Play Episode Listen Later Dec 23, 2022 73:30


The Code Quality Challenge (https://tuple.app/code-quality-challenge) Tuple's open CTO position (https://tuple.app/jobs/cto) Kevin Shen's Dream Studio Course (https://dreamstudiocourse.com/)

Syntax - Tasty Web Development Treats
Supper Club × React Video Creator with Jonny Burger

Syntax - Tasty Web Development Treats

Play Episode Listen Later Dec 16, 2022 57:12


In this supper club episode of Syntax, Wes and Scott talk with Jonny Burger about why and how he built Remotion, his app that lets you create MP4 videos using React. Gatsby - Sponsor Today's episode was sponsored by Gatsby, the fastest frontend for the headless web. Gatsby is the framework of choice for content-rich sites backed by a headless CMS as its GraphQL data layer makes it straightforward to source website content from anywhere. Gatsby's opinionated, React-based framework makes the hardest parts of building a performant website simpler. Visit Gatsby.dev/Syntax to get your first Gatsby site up in minutes and experience the speed. ⚡️ Tuple - Sponsor This week's sponsor is Tuple, an app built specifically for remote pair programming. The app is written in C++ and tuned for high-resolution screen sharing and low-latency remote control. Because developers deserve better than Zoom or Meet for pairing. Show Notes 00:36 Welcome 01:24 Who is Jonny Burger? Jonny.io Jonny on GitHub Jonny on Twitter 03:51 Why did you create Remotion? Remotion.dev 07:36 What types of videos are people making? 10:53 What is the tech stack? Puppeteer Lottie 18:31 What is Idempotence? 19:50 What is lottie? 22:56 Motion blur trail Motion blur trail demo 25:17 Sponsor: Gatsby 26:12 Chrome rendering 29:58 When would you choose JPG or PNG? 31:43 Are you using ffmpeg in the browser? ffmpeg 36:00 Sponsor: Tuple 37:43 What player do you use for playback? 39:54 How did you take this idea to a product? 44:05 Supper Club questions LG C9 TV iTerm 50:12 SIIIIICK ××× PIIIICKS ××× ××× SIIIIICK ××× PIIIICKS ××× Yoga with Adriene Cosmic Kids Yoga Shameless Plugs Toopo.art Tweet us your tasty treats Scott's Instagram LevelUpTutorials Instagram Wes' Instagram Wes' Twitter Wes' Facebook Scott's Twitter Make sure to include @SyntaxFM in your tweets

Syntax - Tasty Web Development Treats
Supper Club × Coding at Disney with Vu Le

Syntax - Tasty Web Development Treats

Play Episode Listen Later Dec 9, 2022 49:52


In this supper club episode of Syntax, Wes and Scott talk with Vu Le about his path to working at Disney. How did he learn to code? How do you get a job at Disney? What's the tech stack inside a Disney team? Tuple - Sponsor This week's sponsor is Tuple, an app built specifically for remote pair programming. The app is written in C++ and tuned for high-resolution screen sharing and low-latency remote control. Because developers deserve better than Zoom or Meet for pairing. Show Notes 01:40 Who is Vu Le? 03:33 How did you learn to code? 04:57 How do you get a job at Disney? 09:01 Internal CMS development at Disney 10:19 What types of languages do you use internally? 15:22 Do you have a design system? 19:52 How do you handle versions and updates? 22:42 Sponsor: Tuple 23:37 Do you get involved in testing? Vitest 25:06 What are you using for GraphQL? GraphQL 25:34 How are you handling CSS? Theme UI 31:43 Does Disney do remote work? 34:38 Perks of working at Disney 38:16 Supper Club questions GMMK Pro Keyboard Santa Cruz bicycles JetBrains Mono 45:13 SIIIIICK ××× PIIIICKS ××× ××× SIIIIICK ××× PIIIICKS ××× Garden hose connectors Tweet us your tasty treats Scott's Instagram LevelUpTutorials Instagram Wes' Instagram Wes' Twitter Wes' Facebook Scott's Twitter Make sure to include @SyntaxFM in your tweets

Ruby for All
GitHub Codespaces & Julie's RubyConf Mini Recap

Ruby for All

Play Episode Listen Later Dec 8, 2022 25:44


Timestamps[00:45] Andrew recaps pairing with Collin and some other folks over the weekend on an open source PR[2:40] Andrew launches a discussion around GitHub Codespace configs for open source projects and how that would have made his life easier. Julie also brings up Tuple as another great tool for pairing[5:15] Julie brings up trying to use Codespaces to pair on Rails, which does have a configuration file [6:00] Andrew gives a basic explanation of what Codespaces, why it's helpful, and some of the struggles he's had with it[10:45] Julie gives Andrew a recap of RubyConf Mini[11:40] Andrew and Julie talk about feeling down after conferences[14:00] Julie talks about why flying is stressful for her and how she got a lucky break on her flight home from the conference[17:00] Julie talks about the speaker dinner prior to the conference and some of the other events she attended[18:30] Julie talks about giving her talk. And don't worry! She had a nodder![20:00] Julie talks about being on the conference panel that you all heard last week[22:00] Andrew wants to hear about the food and Julie delivers![23:30] Julie gives her final thoughts on the conference and Andrew advocates for doing more local conferencesSponsorSpecial thanks to Andy Croll for personally sponsoring this episode. Be sure to check out firstrubyfriend.org and onerubything.com for nice, free community resources for newer devs!LinksTupleGitHub CodespacesUsing Codespaces with VS Code

Syntax - Tasty Web Development Treats
Supper Club × Bun with Jared Sumner

Syntax - Tasty Web Development Treats

Play Episode Listen Later Dec 2, 2022 51:04


In this supper club episode of Syntax, Wes and Scott talk with Jared Sumner about why and how he created Bun, what Zig is, and the future of Bun. Tuple - Sponsor This week's sponsor is Tuple, an app built specifically for remote pair programming. The app is written in C++ and tuned for high-resolution screen sharing and low-latency remote control. Because developers deserve better than Zoom or Meet for pairing. Tuple.app. Show Notes 00:37 Welcome 01:44 Who is Jared Sumner? Jarred Sumner on Twitter Bun Bun Discord Bun on GitHub 02:31 Why did you make Bun? 09:43 Using web API vs Node modules? 13:25 Do we still use npm? 15:42 Support for HTML Rewriter 16:46 Where do you see Bun being used? 19:25 Do you think someone will write a type checker? 21:18 Sponsor: Tuple 22:07 What is Zig? 24:57 Did you have a history of learning languages? 28:16 Have you ever thought of putting Bun on hardware? 29:59 Is there a package.json file in Bun projects? 31:34 What can't Node just get faster? 32:16 What is the future of Bun? 36:27 Thoughts on types in JavaScript? 41:16 Why did you build an SQLite client into Bun? 42:54 Supper Club questions Starship Warp 48:52 SIIIIICK ××× PIIIICKS ××× ××× SIIIIICK ××× PIIIICKS ××× Bun meme Tweet us your tasty treats Scott's Instagram LevelUpTutorials Instagram Wes' Instagram Wes' Twitter Wes' Facebook Scott's Twitter Make sure to include @SyntaxFM in your tweets

Syntax - Tasty Web Development Treats
Supper Club × Anything But Coding with Wes and Scott

Syntax - Tasty Web Development Treats

Play Episode Listen Later Nov 25, 2022 61:46


In this supper club episode of Syntax, Wes and Scott talk with Scott and Wes! Talking about BBQ, electric cars, workout equipment, home renos - but they do sneak in a bit of coding talk! Kontent by Kentico - Sponsor Kontent by Kentico is a headless CMS that provides live editing experience to non-technical users and hands you the technical tools to build websites, mobile apps, voice assistants, or anything else where you need content. Use REST API or GraphQL and get your content via the global Fastly CDN. Designed to unify all your content and operations, in compliance with ISO27001 and SOC2Type2 certifications.Spin up a new project today and discover Kontent. Tuple - Sponsor This week's sponsor is Tuple, an app built specifically for remote pair programming. The app is written in C++ and tuned for high-resolution screen sharing and low-latency remote control. Because developers deserve better than Zoom or Meet for pairing. https://tuple.app/syntax Show Notes 00:37:11 Welcome 03:18:10 Saskatchewan and Saskatoon Berries Saskatoon Berry Barn 05:02:14 TV shows we're watching Amazing Race Canada America's Dance Crew Lakefront Luxury 12:49:12 New house vibe 18:29:06 Sponsor: Kontent 19:13:20 Sauna thoughts 22:58:24 Home gym thoughts Woodupp Tonal 40:22:16 Sponsor: Tuple 41:17:11 3D printer 44:11:09 How many things can you take on? 48:23:11 BBQ talk Amazing Ribs 55:26:11 Electric car update Ioniq 5 57:45:07 Supper Club questions Level Up Tutorials VS Code Theme Quokka VS Code Extension Quokkajs Console-Ninja Tweet us your tasty treats Scott's Instagram LevelUpTutorials Instagram Wes' Instagram Wes' Twitter Wes' Facebook Scott's Twitter Make sure to include @SyntaxFM in your tweets

Fragmented - Android Developer Podcast
235: Pair programming with Ben Orenstein & Tuple

Fragmented - Android Developer Podcast

Play Episode Listen Later Sep 21, 2022 53:49


In this episode, Kaushik goes solo and interviews Ben Orenstein. Ben is a prolific Ruby developer, an amazing conference speaker, an ardent vim-ster, and now the CEO of Tuple.Kaushik has been a big fan of Ben's work and was super stoked to talk to Ben and pick his brains on a host of topics: starting the company Tuple, pair programming in general, learning different programming languages and technology, giving better conference talks and more!This episode is chock full of wisdom from Ben. Enjoy!LinksPragmatic ProgrammerTweet: Best Android Studio Pair Programming Servicelearntopair.com - Tuple's Pair programming guideSpeaking for HackersTuple App - OSSBen's talks:Refactoring from Good to Great by Ben OrensteinIdea to Validation to Launch - Microconf 2019Write code faster: expert-level vimContactBen is @r00k listen to his podcast - The Art of ProductFollow @fragmentedcast or our Youtube channel@donnfelker and donnfelker (on Instagram)kau.sh's blog or @kaushikgopal (on Twitter)

The Bike Shed
354: The History of Computing

The Bike Shed

Play Episode Listen Later Sep 13, 2022 31:16


Why does the history of computing matter? Joël and Developer at thoughtbot Sara Jackson, ponder this and share some cool stories (and trivia!!) behind the tools we use in the industry. This episode is brought to you by Airbrake (https://airbrake.io/?utm_campaign=Q3_2022%3A%20Bike%20Shed%20Podcast%20Ad&utm_source=Bike%20Shed&utm_medium=website). Visit Frictionless error monitoring and performance insight for your app stack. Sara on Twitter (https://twitter.com/csarajackson) UNIX philosophy (https://en.wikipedia.org/wiki/Unix_philosophy) Hillel Wayne on why we ask linked list questions (https://www.hillelwayne.com/post/linked-lists/) Transcript: JOËL: Hello and welcome to another episode of The Bike Shed, a weekly podcast from your friends at thoughtbot about developing great software. I'm Joël Quenneville. And today, I'm joined by fellow thoughtboter, Team Lead, and Developer Sara Jackson. SARA: Hello, happy to be here. JOËL: Together, we're here to share a little bit of what we've learned along the way. So, Sara, what's new in your world? SARA: Well, Joël, you might know that recently our team had a small get-together in Toronto. JOËL: And our team, for those who are not aware, is fully remote distributed across multiple countries. So this was a chance to get together in person. SARA: Yes, correct. This was a chance for those on the Boost team to get together and work together as if we had a physical office. JOËL: Was this your first time meeting some members of the team? SARA: It was my second, for the most part. So I joined thoughtbot, but after thoughtbot had already gotten remote. Fortunately, I was able to meet many other thoughtboters in May at our summit. JOËL: Had you worked at a remote company before coming to thoughtbot? SARA: Yes, I actually started working remotely in 2019, but even then, that wasn't my first time working remotely. I actually had a full year of internship in college that was remote. JOËL: So you were a pro at this long before the pandemic made us all try it out. SARA: I don't know about that, but I've certainly dealt with the idiosyncrasies that come with remote work for longer. JOËL: What do you think are some of the challenges of remote work as opposed to working in person in an office? SARA: I think definitely growing and maintaining a culture. When you're in an office, it's easy to create ad hoc conversations and have events that are small that build on the culture. But when you're remote, it has to be a lot more intentional. JOËL: That definitely rings true for me. One of the things that I really appreciated about in-person office culture was the serendipity that you have those sort of random meetings at the water cooler, those conversations, waiting for coffee with people who are not necessarily on the same team or the same project as you are. SARA: I also really miss being able to have lunch in person with folks where I can casually gripe about an issue I might be having, and almost certainly, someone would have the answer. Now, if I'm having an issue, I have to intentionally seek help. [chuckles] JOËL: One of the funny things that often happened, at least the office where I worked at, was that lunches would often devolve into taxonomy conversations. SARA: I wish I had been there for that. [laughter] JOËL: Well, we do have a taxonomy channel on Slack to somewhat continue that legacy. SARA: Do you have a favorite taxonomy lunch discussion that you recall? JOËL: I definitely got to the point where I hated the classifying a sandwich. That one has been way overdone. SARA: Absolutely. JOËL: There was an interesting one about motorcycles, and mopeds, and bicycles, and e-bikes, and trying to see how do you distinguish one from the other. Is it an electric motor? Is it the power of the engine that you have? Is it the size? SARA: My brain is already turning on those thoughts. I feel like I could get lost down that rabbit hole very easily. [laughter] JOËL: Maybe that should be like a special anniversary episode for The Bike Shed, just one long taxonomy ramble. SARA: Where we talk about bikes. JOËL: Ooh, that's so perfect. I love it. One thing that I really appreciated during our time in Toronto was that we actually got to have lunch in person again. SARA: Yeah, that was so wonderful. Having folks coming together that had maybe never worked together directly on clients just getting to sit down and talk about our day. JOËL: Yeah, and talk about maybe it's work-related, maybe it's not. There's a lot of power to having some amount of deeper interpersonal connection with your co-workers beyond just the we work on a project together. SARA: Yeah, it's like camaraderie beyond the shared mission of the company. It's the shared interpersonal mission, like you say. Did you have any in-person pairing sessions in Toronto? JOËL: I did. It was actually kind of serendipitous. Someone was stuck with a weird failing test because somehow the order factories were getting created in was not behaving in the expected way, and we herd on it, dug into it, found some weird thing with composite primary keys, and solved the issue. SARA: That's wonderful. I love that. I wonder if that interaction would have happened or gotten solved as quickly if we hadn't been in person. JOËL: I don't know about you, but I feel like I sometimes struggle to ask for help or ask for a pair more when I'm online. SARA: Yeah, I agree. It's easier to feel like you're not as big of an impediment when you're in person. You tap someone on the shoulder, "Hey, can you take a look at this?" JOËL: Especially when they're on the same team as you, they're sitting at the next desk over. I don't know; it just felt easier. Even though it's literally one button press to get Tuple to make a call, somehow, I feel like I'm interrupting more. SARA: To combat that, I've been trying to pair more frequently and consistently regardless of if I'm struggling with a problem. JOËL: Has that worked pretty well? SARA: It's been wonderful. The only downside has been pairing fatigue. JOËL: Pairing fatigue is real. SARA: But other than that, problems have gotten solved quickly. We've all learned something for those that I've paired with. It goes faster. JOËL: So it was really great that we had this experience of doing our daily work but co-located in person; we have these experiences of working together. What would you say has been one of the highlights for you of that time? SARA: 100% karaoke. JOËL: [laughs] SARA: Only two folks did not attend. Many of the folks that did attend told me they weren't going to sing, but they were just going to watch. By the end of the night, everyone had sung. We were there for nearly three and a half hours. [laughs] JOËL: It was a good time all around. SARA: I saw a different side to Chad. JOËL: [laughs] SARA: And everyone, honestly. Were there any musical choices that surprised you? JOËL: Not particularly. Karaoke is always fun when you have a group of people that you trust to be a little bit foolish in front of to put yourself out there. I really appreciated the style that we went for, where we have a private room for just the people who were there as opposed to a stage in a bar somewhere. I think that makes it a little bit more accessible to pick up the mic and try to sing a song. SARA: I agree. That style of karaoke is a lot more popular in Asia, having your private room. Sometimes you can find it in major cities. But I also prefer it for that reason. JOËL: One of my highlights of this trip was this very sort of serendipitous moment that happened. Someone was asking a question about the difference between a Mac and Linux operating systems. And then just an impromptu gathering happened. And you pulled up a chair, and you're like, gather around, everyone. In the beginning, there was Multics. It was amazing. SARA: I felt like some kind of historian or librarian coming out from the deep. Let me tell you about this random operating system knowledge that I have. [laughs] JOËL: The ancient lore. SARA: The ancient lore in the year 1969. JOËL: [laughs] And then yeah, we had a conversation walking the history of operating systems, and why we have macOS and Linux, and why they're different, and why Windows is a totally different kind of family there. SARA: Yeah, macOS and Linux are sort of like cousins coming from the same tree. JOËL: Is that because they're both related through Unix? SARA: Yes. Linux and macOS are both built based off of different versions of Unix. Over the years, there's almost like a family tree of these different Nix operating systems as they're called. JOËL: I've sometimes seen asterisk N-I-X. This is what you're referring to as Nix. SARA: Yes, where the asterisk is like the RegEx catch-all. JOËL: So this might be Unix. It might be Linux. It might be... SARA: Minix. JOËL: All of those. SARA: Do you know the origin of the name Unix? JOËL: I do not. SARA: It's kind of a fun trivia piece. So, in the beginning, there was Multics spelled M-U-L-T-I-C-S, standing for the Multiplexed Information and Computing Service. Dennis Ritchie and Ken Thompson of Bell Labs famous for the C programming language... JOËL: You may have heard of it. SARA: You may have heard of it maybe on a different podcast. They were employees at Bell Labs when Multics was being created. They felt that Multics was very bulky and heavy. It was trying to do too many things at once. It did have a few good concepts. So they developed their own smaller Unix originally, Unics, the Uniplexed Information and Computing Service, Uniplexed versus Multiplexed. We do one thing really well. JOËL: And that's the Unix philosophy. SARA: It absolutely is. The Unix philosophy developed out of the creation of Unix and C. Do you know the four main points? JOËL: No, is it small sharp tools? It's the main one I hear. SARA: Yes, that is the kind of quippy version that has come out for sure. JOËL: But there is a formal four-point manifesto. SARA: I believe it's evolved over the years. But it's interesting looking at the Unix philosophy and seeing how relevant it is today in web development. The four points being make each program do one thing well. To this end, don't add features; make a new program. I feel like we have this a lot in encapsulation. JOËL: Hmm, maybe even the open-closed principle. SARA: Absolutely. JOËL: Similar idea. SARA: Another part of the philosophy is expecting output of your program to become input of another program that is yet unknown. The key being don't clutter your output; don't have extraneous text. This feels very similar to how we develop APIs. JOËL: With a focus on composability. SARA: Absolutely. Being able to chain commands together like you see in Ruby all the time. JOËL: I love being able to do this, for example, the enumerable API in Ruby and just being able to chain all these methods together to just very nicely do some pretty big transformations on an array or some other data structure. SARA: 100% agree there. That ability almost certainly came out of following the tenets of this philosophy, maybe not knowingly so but maybe knowingly so. [chuckles] JOËL: So is that three or four? SARA: So that was two. The third being what we know as agile. JOËL: Really? SARA: Yeah, right? The '70s brought us agile. Design and build software to be tried early, and don't hesitate to throw away clumsy parts and rebuild. JOËL: Hmmm. SARA: Even in those days, despite waterfall style still coming on the horizon. It was known for those writing software that it was important to iterate quickly. JOËL: Wow, I would never have known. SARA: It's neat having this history available to us. It's sort of like a lens at where we came from. Another piece of this history that might seem like a more modern concept but was a very big part of the movement in the '70s and the '80s was using tools rather than unskilled help or trying to struggle through something yourself when you're lightening a programming task. We see this all the time at thoughtbot. Folks do this many times there is an issue on a client code. We are able to generalize the solution, extract into a tool that can then be reused. JOËL: So that's the same kind of genesis as a lot of thoughtbot's open-source gems, so I'm thinking of FactoryBot, Clearance, Paperclip, the old-timey file upload gem, Suspenders, the Rails app generator, and the list goes on. SARA: I love that in this last point of the Unix philosophy, they specifically call out that you should create a new tool, even if it means detouring, even if it means throwing the tools out later. JOËL: What impact do you think that has had on the way that tooling in the Unix, or maybe I should say *Nix, ecosystem has developed? SARA: It was a major aspect of the Nix environment community because Unix was available, not free, but very inexpensively to educational institutions. And because of how lightweight it was and its focus on single-use programs, programs that were designed to do one thing, and also the way the shell was allowing you to use commands directly and having it be the same language as the shell scripting language, users, students, amateurs, and I say that in a loving way, were able to create their own tools very quickly. It was almost like a renaissance of Homebrew. JOËL: Not Homebrew as in the macOS package manager. SARA: [laughs] And also not Homebrew as in the alcoholic beverage. JOËL: [laughs] So, this kind of history is fun trivia to know. Is it really something valuable for us as a jobbing developer in 2022? SARA: I would say it's a difficult question. If you are someone that doesn't dive into the why of something, especially when something goes wrong, maybe it wouldn't be important or useful. But what sparked the conversation in Toronto was trying to determine why we as thoughtbot tend to prefer using Macs to develop on versus Linux or Windows. There is a reason, and the reason is in the history. Knowing that can clarify decisions and can give meaning where it feels like an arbitrary decision. JOËL: Right. We're not just picking Macs because they're shiny. SARA: They are certainly shiny. And the first thing I did was to put a matte case on it. JOËL: [laughs] So no shiny in your office. SARA: If there were too many shiny things in my office, boy, I would never get work done. The cats would be all over me. MID-ROLL AD: Debugging errors can be a developer's worst nightmare...but it doesn't have to be. Airbrake is an award-winning error monitoring, performance, and deployment tracking tool created by developers for developers, that can actually help cut your debugging time in half. So why do developers love Airbrake? It has all of the information that web developers need to monitor their application - including error management, performance insights, and deploy tracking! Airbrake's debugging tool catches all of your project errors, intelligently groups them, and points you to the issue in the code so you can quickly fix the bug before customers are impacted. In addition to stellar error monitoring, Airbrake's lightweight APM helps developers to track the performance and availability of their application through metrics like HTTP requests, response times, error occurrences, and user satisfaction. Finally, Airbrake Deploy Tracking helps developers track trends, fix bad deploys, and improve code quality. Since 2008, Airbrake has been a staple in the Ruby community and has grown to cover all major programming languages. Airbrake seamlessly integrates with your favorite apps to include modern features like single sign-on and SDK-based installation. From testing to production, Airbrake notifiers have your back. Your time is valuable, so why waste it combing through logs, waiting for user reports, or retrofitting other tools to monitor your application? You literally have nothing to lose. Head on over to airbrake.io/try/bikeshed to create your FREE developer account today! JOËL: So we've talked a little bit about Unix or *Nix, this evolution of systems. I've also heard the term POSIX thrown around when talking about things that seem to encompass both macOS and Linux. How does that fit into this history? SARA: POSIX is sort of an umbrella of standards around operating systems that was based on Unix and the things that were standard in Unix. It stands for the Portable Operating System Interface. This allowed for compatibility between OSs, very similar to USB being the standard for peripherals. JOËL: So, if I was implementing my own Unix-like operating system in the '80s, I would try to conform to the POSIX standard. SARA: Absolutely. Now, not every Nix operating system is POSIX-compliant, but most are or at least 90% of the way there. JOËL: Are any of the big ones that people tend to think about not compliant? SARA: A major player in the operating system space that is not generally considered POSIX-compliant is Microsoft Windows. JOËL: [laughs] It doesn't even try to be Unix-like, right? It's just its own thing, SARA: It is completely its own thing. I don't think it even has a standard necessarily that it conforms to. JOËL: It is its own standard, its own branch of the family tree. SARA: And that's what happens when your operating system is very proprietary. This has caused folks pain, I'm sure, in the past that may have tried to develop software on their computers using languages that are more readily compatible with POSIX operating systems. JOËL: So would you say that a language like Ruby is more compatible with one of the POSIX-compatible operating systems? SARA: 100% yes. In fact, to even use Ruby as a development tool in Windows, prior to Windows 10, you needed an additional tool. You needed something like Cygwin or MinGW, which were POSIX-compliant programs that it was almost like a shell in your Windows computer that would allow you to run those commands. JOËL: Really? For some reason, I thought that they had some executables that you could run just on Windows by itself. SARA: Now they do, fortunately, to the benefit of Ruby developers everywhere. As of Windows 10, we now have WSL, the Windows Subsystem for Linux that's built-in. You don't have to worry about installing or configuring some third-party software. JOËL: I guess that kind of almost cheats by just having a POSIX system embedded in your non-POSIX system. SARA: It does feel like a cheat, but I think it was born out of demand. The Windows NT kernel, for example, is mostly POSIX-compliant. JOËL: Really? SARA: As a result of it being used primarily for servers. JOËL: So you mentioned the Ruby tends and the Rails ecosystem tends to run better and much more frequently on the various Nix systems. Did it have to be that way? Or is it just kind of an accident of history that we happen to end up with Ruby and Rails in this ecosystem, but just as easily, it could have evolved in the Windows world? SARA: I think it is an amalgam of things. For example, Unix and Nix operating systems being developed earlier, being widely spread due to being license-free oftentimes, and being widely used in the education space. Also, because it is so lightweight, it is the operating system of choice. For most servers in the world, they're running some form of Unix, Linux, or macOS. JOËL: I don't think I've ever seen a server that runs macOS; exclusively seen it on dev machines. SARA: If you go to an animation company, they have server farms of macOS machines because they're really good at rendering. This might not be the case anymore, but it was at one point. JOËL: That's a whole other world that I've not interacted with a whole lot. SARA: [chuckles] JOËL: It's a fun intersection between software, and design, and storytelling. That is an important part for the software field. SARA: Yeah, it's definitely an aspect that deserves its own deep dive of sorts. If you have a server that's running a Windows-based operating system like NT and you have a website or a program that's designed to be served under a Unix-based server, it can easily be hosted on the Windows server; it's not an issue. The reverse is not true. JOËL: Oh. SARA: And this is why programming on a Nix system is the better choice. JOËL: It's more broadly compatible. SARA: Absolutely. Significantly more compatible with more things. JOËL: So today, when I develop, a lot of the tooling that I use is open source. The open-source movement has created a lot of the languages that we know and love, including Ruby, including Rails. Do you think there's some connection between a lot of that tooling being open source and maybe some of the Unix family of operating systems and movements that came out of that branch of the operating system family tree? SARA: I think that there is a lot of tie-in with today's open-source culture and the computing history that we've been talking about, for example, people finding something that they dislike about the tools that are available and then rolling their own. That's what Ken Thompson and Dennis Ritchie did. Unix was not an official Bell development. It was a side project for them. JOËL: I love that. SARA: You see this happen a lot in the software world where a program gets shared widely, and due to this, it gains traction and gains buy-in from the community. If your software is easily accessible to students, folks that are learning, and breaking things, and rebuilding, and trying, and inventing, it's going to persist. And we saw that with Unix. JOËL: I feel like this background on where a lot of these operating systems came but then also the ecosystems, the values that evolved with them has given me a deeper appreciation of the tooling, the systems that we work with today. Are there any other advantages, do you think, to trying to learn a little bit of computing history? SARA: I think the main benefit that I mentioned before of if you're a person that wants to know why, then there is a great benefit in knowing some of these details. That being said, you don't need to deep dive or read multiple books or write papers on it. You can get enough information from reading or skimming some Wikipedia pages. But it's interesting to know where we came from and how it still affects us today. Ruby was written in C, for example. Unix was written in C as well, originally Assembly Language, but it got rewritten in C. And understanding the underlying tooling that goes into that that when things go wrong, you know where to look. JOËL: I guess that that is the next question is where do you look if you're kind of interested? Is Wikipedia good enough? You just sort of look up operating system, and it tells you where to go? Or do you have other sources you like to search for or start pulling at those threads to understand history? SARA: That's a great question. And Wikipedia is a wonderful starting point for sure. It has a lot of the abbreviated history and links to better references. I don't have them off the top of my head. So I will find them for you for the show notes. But there are some old esoteric websites with some of this history more thoroughly documented by the people that lived it. JOËL: I feel like those websites always end up being in HTML 2; your very basic text, horizontal rules, no CSS. SARA: Mm-hmm. And those are the sites that have many wonderful kernels of knowledge. JOËL: Uh-huh! Great pun. SARA: [chuckles] Thank you. JOËL: Do you read any content by Hillel Wayne? SARA: I have not. JOËL: So Hillel produces a lot of deep dives into computing history, oftentimes trying to answer very particular questions such as when and why did we start using reversing a linked list as the canonical interview question? And there are often urban legends around like, oh, it's because of this. And then Hillel will do some research and go through actual archives of messages on message boards or...what is that protocol? SARA: BBS. JOËL: Yes. And then find the real answer, like, do actual historical methodology, and I love that. SARA: I had not heard of this before. I don't know how. And that is all I'm going to be doing this weekend is reading these. That kind of history speaks to my heart. I have a random fun fact along those lines that I wanted to bring to the show, which was that the echo command that we know and love in the terminal was first introduced by the Multics operating system. JOËL: Wow. So that's like the most common piece of Multics that as an everyday user of a modern operating system that we would still touch a little bit of that history every day when we work. SARA: Yeah, it's one of those things that we don't think about too much. Where did it come from? How long has it been around? I'm sure the implementation today is very different. But it's like etymology, and like taxonomy, pulling those threads. JOËL: Two fantastic topics. On that wonderful little nugget of knowledge, let's wrap up. Sara, where can people find you online? SARA: You can find me on Twitter at @csarajackson. JOËL: And we will include a link to that in the show notes. SARA: Thank you so much for having me on the show and letting me nerd out about operating system history. JOËL: It's been a pleasure. The show notes for this episode can be found at bikeshed.fm. This show is produced and edited by Mandy Moore. If you enjoyed listening, one really easy way to support the show is to leave us a quick rating or even a review on iTunes. It really helps other folks find the show. If you have any feedback, you can reach us at @_bikeshed or reach me @joelquen on Twitter or at hosts@bikeshed.fm via email. Thank you so much for listening to The Bike Shed, and we'll see you next week. Byeeeeee!!!! 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.

Real Estate Money School
How to Achieve Passive Income Through Digital Assets with Roger Comstock

Real Estate Money School

Play Episode Listen Later Sep 8, 2022 43:10


The concept of mailbox money or passive income has become so bastardized it's lost a lot of its meaning and power. Some of the investment channels that are touted as passive actually require a lot of heavy lifting and active management.  Passive income means having the freedom to live your perfect day, and having money rolling into your bank account while you're on vacation, and there's a hugely untapped niche you can go after to create it.  How do we tap into a wealth category most people overlook?  In this episode, CEO and Founder of 0 Dollar Startup, Roger Comstock shares how he's helping people build valuable businesses that give them true freedom.    Three Things You'll Learn In This Episode    How Roger identified a lucrative gap in the market What is the most valuable thing for practitioners in the home services niche, and how can you supply it effortlessly?     Why digital assets are beginner-friendly Do you need a crazy social following to make digital assets work for you?    The zero-dollar framework  How can we capitalize on the best investing opportunities while keeping our risk low?   Guest Bio: Roger Comstock is a serial entrepreneur who has developed an affinity and obsession for business and helping people. He teaches individuals how to start recurring revenue businesses without Venture Capital, Debt or Real Estate through the utilization of digital assets. He is the CEO and Founder of 0 Dollar Startup, Tuple, Flipr, and Comstock Consulting. Roger loves being with family - especially his sweetheart Kayla. She is literally his best friend. He enjoys being outside, golfing, camping, learning, thinking, reading, laughing, accomplishing goals, and helping people understand and reach their potential.  He has a goldendoodle named Max who is basically a shadow wherever Roger goes.  For more information on Roger's coaching programs, head to 0dollarstartup.com and follow @Roger.comstock on Instagram.

The Art of Product
217: Half a Job You Love

The Art of Product

Play Episode Listen Later Jul 27, 2022 51:14


Aaron Francis (Tuple's Marketing Engineer) drops by for advice on his non-Tuple project, a query builder for Rails and Laravel called Refine.

Remote Ruby
RailsConf 2022 At Home Podcast Panel

Remote Ruby

Play Episode Listen Later Jul 8, 2022 41:20


[00:00:42] Each panelist gives us an introduction, where they're calling from, and what they're known for. [00:04:23] Aaron tells us about Tuple and what he does there. [00:06:51] Andy shares his thoughts on why it matters to him that we had a successful in-person RailsConf and if he thinks conference participation is going to keep people in the community.[00:08:11] As a virtual community organizer, Jemma tells us how attendees of a virtual conference like RailsConf could get the most out of it, and Jason shares how his experience was speaking on Day 3.[00:10:06] Brian explains the difference between a career and a job and if you can build a career around working Ruby on Rails.[00:12:32] Jason tells us what it's going to take for Hanami to make it and what “making it” even means, Andy shares his thoughts on Hanami, and we find out if Brian has ever gotten any requests for Hanami.[00:16:42] Since Drew is the newest addition to the Ruby Podcast community, we hear how it's been going for him so far, he shares some lessons for those who are thinking about starting a podcast, and Jemma and Andy share some advice.[00:20:28] Aaron brings up what Jemma was talking about and expands on how frameworks and podcasts are similar and gives some recommendations for breaking out of the Ruby community and listening to other ideas in other communities. [00:23:00] Brittany asks Drew two questions: “Does that mean you're going to be on the dating market at some point for a co-host and what are you looking for?” And a listener asks, “What's up with ViewComponents?”[00:24:35] Brian gives us tips for employers who are looking to hire now, and Brittany tells us she's a huge fan of The Art of Product Podcast.[00:26:58] Jason explains how podcasts can stay connected with their listeners and Drew mentions going on GoRails discord, Andy mentions Ruby-Talk and TikTok, and Jemma mentions the Open Source communities as places to go to connect with your listeners.[00:29:32] Jemma tells us how she's been enjoying working on Ruby itself and where she gets the tips she posts in Ruby Weekly, and Andy tells us why he writes his blog.[00:31:50] How is Aaron so good at Twitter?[00:33:31] Brian explains how much it matters about actual community content that someone's putting out in terms of finding a job, Andy mentions to take dates off blog posts, and Aaron, Jemma, Drew, and Jason talk about sharing content. [00:38:12] Andy tells us if you want to start a conference he can help you, and he shares some tips on how he pulls off doing the Brighton Ruby Conference.[00:40:27] Jason takes us home and closes us out with a deep thought.  Moderator:Brittany MartinPanelists:Jason CharnesAaron FrancisAndy CrollBrian MarianiDrew BraggJemma IssroffSponsor:HoneybadgerLinks:Jason Charnes TwitterRemote Ruby PodcastBrittany Martin TwitterThe Ruby on Rails PodcastAaron Francis TwitterFramework Friends PodcastAndy Croll TwitterChats in the Cupboard PodcastBrian Mariani websiteDrew Bragg TwitterCode and the Coding Coders who Code it PodcastJemma Issroff TwitterWNB.rbHanamiTupleLaravelLaravel NewsLaravel SnippetsLaravel PodcastThe Art of Product PodcastGoRails discordRuby-TalkOpen Source InitiativeRuby WeeklyBrighton Ruby Conference 2022

The Art of Product
213: Powered by Debt

The Art of Product

Play Episode Listen Later Jun 29, 2022 37:34 Very Popular


Tuple launched a new marketing experiment this week. Derrick is continuing work on migrating SavvyCal to new hosting infrastructure.

The Bike Shed
344: Spinner Armageddon

The Bike Shed

Play Episode Listen Later Jun 28, 2022 38:50


Steph has an update and a question wrapped into one about the work that is being done to migrate the Test::Unit test over to RSpec. Chris got to do something exciting this week using dry-monads. Success or failure? This episode is brought to you by BuildPulse (https://buildpulse.io/bikeshed). Start your 14-day free trial of BuildPulse today. Bartender (https://www.macbartender.com/) dry-rb - dry-monads v1.0 - Pattern matching (https://dry-rb.org/gems/dry-monads/1.0/pattern-matching/) alfred-workflows (https://github.com/tupleapp/alfred-workflows/blob/master/scripts/online_users.rb) Raycast (https://www.raycast.com/) ruby-science (https://github.com/thoughtbot/ruby-science) Inertia.js (https://inertiajs.com/) Remix (https://remix.run/) Become a Sponsor (https://thoughtbot.com/sponsorship) of The Bike Shed! Transcript: AD: Flaky tests take the joy out of programming. You push up some code, wait for the tests to run, and the build fails because of a test that has nothing to do with your change. So you click rebuild, and you wait. Again. And you hope you're lucky enough to get a passing build this time. Flaky tests slow everyone down, break your flow, and make things downright miserable. In a perfect world, tests would only break if there's a legitimate problem that would impact production. They'd fail immediately and consistently, not intermittently. But the world's not perfect, and flaky tests will happen, and you don't have time to fix all of them today. So how do you know where to start? BuildPulse automatically detects and tracks your team's flaky tests. Better still, it pinpoints the ones that are disrupting your team the most. With this list of top offenders, you'll know exactly where to focus your effort for maximum impact on making your builds more stable. In fact, the team at Codecademy was able to identify their flakiest tests with BuildPulse in just a few days. By focusing on those tests first, they reduced their flaky builds by more than 68% in less than a month! And you can do the same because BuildPulse integrates with the tools you're already using. It supports all of the major CI systems, including CircleCI, GitHub Actions, Jenkins, and others. And it analyzes test results for all popular test frameworks and programming languages, like RSpec, Jest, Go, pytest, PHPUnit, and more. So stop letting flaky tests slow you down. Start your 14-day free trial of BuildPulse today. To learn more, visit buildpulse.io/bikeshed. That's buildpulse.io/bikeshed. STEPH: What type of bird is the strongest bird? CHRIS: I don't know. STEPH: A crane. [laughter] STEPH: You're welcome. And on that note, shall we wrap up? CHRIS: Let's wrap up. [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 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, I saw a good movie I'd like to tell you about. It was just over the weekend. It's called The Duke, and it's based on a real story. I should ask, have you seen it? Have you heard of this movie called The Duke? CHRIS: I don't think so. STEPH: Okay, cool. It's a true story, and it's based on an individual named Kempton Bunton who then stole a particular portrait, a Goya portrait; if you know your artist, I do not. But he stole a Goya portrait and then essentially held at ransom because he was a big advocate that the BBC News channel should be free for people that are living on a pension or that are war veterans because then they're not able to afford that fee. But then, if you take the BBC channel away from them, it disconnects them from society. And it's a very good movie. I highly recommend it. So I really enjoyed watching that over the weekend. CHRIS: All right. Excellent recommendation. We will, of course, add that to the show notes mostly so that I can find it again later. STEPH: On a more technical note, I have a small update, or it's more of a question. It's an update and a question wrapped into one about the work that is being done to migrate the Test::Unit test over to RSpec. This has been quite a journey that Joël and I have been on for a while now. And we're making progress, but we're realizing that we're spending like 95% of our time in the test setup and porting that over, specifically because we're mapping fixture data over to FactoryBot, and we're just realizing that's really painful. It's taking up a lot of time to do that. And initially, when I realized we were just doing that, we hadn't even really talked about it, but we were moving it over to FactoryBot. I was like, oh, cool. We'll get to delete all these fixtures because there are around 208 files of them. And so that felt like a really good additional accomplishment to migrating the test over. But now that we realize how much time we're spending migrating the data over for that test setup, we've reevaluated, and I shared with Joël in the Slack channel. I was like, crap. I was like, I have a bad idea, and I can't not say it now because it's crossed my mind. And my bad idea was what if we stopped porting over fixtures to FactoryBot and then we just added the fixtures to a directory that RSpec would look so then we can rely on those fixtures? And then that way, we're literally then ideally just copying over from Test::Unit over to RSpec. But it does mean a couple of things. Well, one, it means that we're now running those fixtures at the beginning of RSpec test. We're introducing another pattern of where these tests are already using FactoryBot, but now they have fixtures at the top, and then we won't get to delete the fixtures. So we had a conversation around how to manage and mitigate some of those concerns. And we're still in that exploratory. We're going to test it out and see if this really speeds us up referencing the fixtures. The question that's wrapped up in this is there's something different between how fixtures generate data and how factories generate data. So I've run into this a couple of times now where I moved data over to just call a factory. But then I was hitting these callbacks or after-save-hooks or weird things that were then preventing me from creating the record, even though fixtures was creating them just fine. And then Joël pointed out today that he was running into something similar where there were private methods that were getting called. And there were all sorts of additional code that was getting run with factories versus fixtures. And I don't have an answer. Like, I haven't looked into this. And it's frankly intentional because I was trying hard to not dive into understanding the mechanics. We really want to get through this. But now I'm starting to ponder a little more as to what is different with fixtures and factories? And I liked that factories is running these callbacks; that feels correct. But I'm surprised that fixtures doesn't, or at least that's the experience that I'm having. So there's some funkiness there that I'd like to explore. I'll be honest; I don't know if I'm going to. But if anybody happens to know what that funkiness is or why fixtures and factories are different in that regard, I would be very intrigued because, at some point, I might look into it just because I would like to know. CHRIS: Oh, that is interesting. I have not really worked with fixtures much at all. I've lived a factory life myself, and thus that's where almost all of my experience is. I'm not super surprised if this ends up being the case, like, the idea that fixtures are just some data that gets shoveled into the database directly as opposed to FactoryBot going through the model layer. And so it's sort of like that difference. But I don't know that for certain. That sounds like what this is and makes sense conceptually. But I think this is what you were saying like, that also kind of pushes me more in the direction of factories because it's like, oh, they're now representative. They're using our model layer, where we're defining certain truths. And I don't love callbacks as a mechanism. But if your app has them, then getting data that is representative is useful in tests. Like one of the things I add whenever I'm working with FactoryBot is the FactoryBot lint rake task RSpec thing that basically just says, "Are your factories valid?" which I think is a great baseline to have. Because you may add a migration that adds a default constraint or something like that to the database that suddenly all your factories are invalid, and it's breaking tests, but you don't know it. Like subtly, you change it, and it doesn't actually break a test, but then it's harder later. So that idea of just having more correctness baked in is always nice, especially when it can be automated like that, so definitely a fan of that. But yeah, interested if you do figure out the distinction. I do like your take, though, of like, but also, maybe I just won't figure this out. Maybe this isn't worth figuring it out. Although you were in the interesting spot of, you could just port the fixtures over and then be done and call the larger body of work done. But it's done in sort of a half-complete way, so it's an interesting trade-off space. I'm also interested to hear where you end up on that. STEPH: Yeah, it's a tough trade-off. It's one that we don't feel great about. But then it's also recognizing what's the true value of what we're trying to deliver? And it also comes down to the idea of churn versus complexity. And I feel like we are porting over existing complexity and even adding a smidge, not actual complexity but adding a smidge of indirection in terms that when someone sees this file, they're going to see a mixed-use of fixtures and factories, and that doesn't feel good. And so we've already talked about adding a giant comment above fixtures that just is very honest and says, "Hey, these were ported over. Please don't mimic this. But this is some legacy tests that we have brought over. And we haven't migrated the fixtures over to use factories." And then, in regards to the churn versus complexity, this code isn't likely to get touched like these tests. We really just need them to keep running and keep validating scenarios. But it's not likely that someone's going to come in here and really need to manage these anytime soon. At least, this is what I'm telling myself to make me feel better about it. So there's also that idea of yes, we are porting this over. This is also how they already exist. So if someone did need to manage these tests, then going to Test::Unit, they would have the same experience that they're going to have in RSpec. So that's really the crux of it is that we're not improving that experience. We're just moving it over and then trying to communicate that; yes, we have muddied the waters a little bit by introducing this other pattern. So we're going to find a way to communicate why we've introduced this other pattern, but that way, we can stay focused on actually porting things over to RSpec. As for the factories versus fixtures, I feel like you're onto something in terms of it's just skipping that model layer. And that's why a lot of that functionality isn't getting run. And I do appreciate the accuracy of factories. I'd much rather know is my data representative of real data that can get created in the world? And right now, it feels like some of the fixtures aren't. Like, how they're getting created seemed to bypass really important checks and validations, and that is wrong. That's not what we want to have in our test is, where we're creating data that then the rest of the application can't truly create. But that's another problem for another day. So that's an update on a trade-off that we have made in regards to the testing journey that we are on. What's going on in your world? CHRIS: Well, we got to do something exciting this week. I was working on some code. This is using dry-monads, the dry-rb space. So we have these result objects that we use pretty pervasively throughout the app, and often, we're in a controller. We run one of these command objects. So it's create user, and create user actually encompasses a ton of logic in our app, and that object returns a result. So it's either a success or a failure. And if it's a success, it'll be a success with that new user wrapped up inside of it, or if it's a failure, it's a specific error message. Actually, different structured error messages in different ways, some that would be pushed to the form, some that would be a flash message. There are actually fun, different things that we do there. But in the controller, when we interact with those result objects, typically what we'll do is we'll say result equals create user dot run, (result=createuser.run) and then pass it whatever data it needs. And then on the next line, we'll say results dot either, (results.either), which is a method on these result objects. It's on both the success and failure so you can treat them the same. And then you pass what ends up being a lambda or a stabby proc, or I forget what they are. But one of those sort of inline function type things in Ruby that always feel kind of weird. But you pass one of those, and you actually pass two of them, one for the success case and one for the failure case. And so in the success case, we redirect back with a notice of congratulations, your user was created. Or, in the failure case, we potentially do a flash message of an alert, or we send the errors down, or whatever it ends up being. But it allows us to handle both of those cases. But it's always been syntactically terrible, is how I would describe it. It's, yeah, I'm just going to leave it at that. We are now living in a wonderful, new world. This has been something that I've wanted to try for a while. But I finally realized we're actually on Ruby 2.7, and so thus, we have access to pattern matching in Ruby. So I get to take it for a spin for the first time, realizing that we were already on the correct version. And in particular, dry-monads has a page in their docs specific to how we can take advantage of pattern matching with the result objects that they provide us. There's nothing specific in the library as far as I understand it. This is just them showing a bunch of examples of how one might want to do it if they're working with these result objects. But it's really great because it gives the ability to interact with, you know, success is typically going to be a singular case. There's one success branch to this whole logic, but there are like seven different ways it can fail. And that's the whole idea as to why we use these command objects and the whole Railway Oriented Programming and that whole thing which I have...what is this word? [laughs] I feel like I should know it. It's a positive rant. I have raved; that is how our users kindly pointed that out to us. I have raved about the Railway Oriented Programming that allows us to do. But it's that idea that they're actually, you know, there's one happy path, and there are seven distinct failure modes, seven unhappy paths. And now, using pattern matching, we actually get a really expressive, readable, useful way to destructure each of those distinct failures to work with the particular bits of data that we need. So it was a very happy day, and I got to explore it. This is, again, a feature of Ruby, not a feature of dry-monads. But dry-monads just happens to embrace it and work really well with it. So that was awesome. STEPH: That is awesome. I've seen one or two; I don't know, I've seen a couple of tweets where people are like, yeah, Ruby pattern matching. I haven't found a way to use it. So I'm excited that you just shared a way that you found to use it. I'm also worried what it says about our developer culture that we know the word rant so well, but rave, we always have to reach back into our memory to be like, what's that positive word or something that we like? [laughs] CHRIS: And especially here on The Bike Shed, where we try to gravitate towards the positive. But yeah, it's an interesting point that you make. STEPH: We're a bunch of ranters. It's what we do, pranting ranters. I don't know why we're pranting. [laughs] CHRIS: Because it's that exciting. That's what it is. Actually, there was an interesting thing as we were playing around with the pattern matching code, just poking around in the console session with it, and it prints out a deprecation warning. It's like, warning: this is an experimental feature. Do not use it, be careful. But in the back of my head, I was like, I actually know how this whole thing plays out, Ruby 2.7, and I assure you, it's going to be fine. I have been to the future, at least I'm pretty sure. I think the version that is in Ruby 2.7 did end up getting adopted basically as it stands. And so, I think there is also a setting to turn off that deprecation warning. I haven't done it yet, but I mostly just enjoyed the conversation that I had with this deprecation message of like, listen, I've been to the future, and it's great. Well, it's complicated, but specific to this pattern matching [laughs] in Ruby 3+ versions, it went awesome. And I'm really excited about that future that we now live in. STEPH: I wish we had that for so many more things in our life [laughs] of like, here's a warning, and it's like, no, no, I've seen the future. It's all right. Or you're totally right; I should avoid and back out of this now. CHRIS: If only we could know how the things would play out, you know. But yeah, so pattern matching, very cool. I'll include a link in the show notes to the particular page in the dry-monads docs. But there are also other cool things on the internet. In an unrelated but also cool thing that I found this week, we use Tuple a lot within our organization for pair programming. For anyone who's not familiar with it, it's a really wonderful piece of technology that allows you to pair program pretty seamlessly, better video quality, all of those nice things that we want. But I found there was just the tiniest bit of friction in starting a Tuple call. I know I want to pair with this person. And I have to go up and click on the little menu bar, and then I have to find their name, then I have to click a button. That's just too much. That's not how...I want to live my life at the keyboard. I have a thing called Bartender, which is a little menu bar manager utility app that will collapse down and hide the icons. But it's also got a nice, little hotkey accessible pop-up window that allows me to filter down and open one of the menu bar pop-out menus. But unfortunately, when that happens, the Tuple window isn't interactive at that point. I can't use the arrow keys to go up and down. And so I was like, oh, man, I wonder if there's like an Alfred workflow for this. And it turns out indeed there is actually managed by the kind folks at Tuple themselves. So I was able to find that, install it; it's great. I have it now. I can use that. So that was a nice little upgrade to my workflow. I can just type like TC space and then start typing out the person's name, and then hit enter, and it will start a call immediately. And it doesn't actually make me more productive, but it makes me happier. And some days, that's what matters. STEPH: That's always so impressive to me when that happens where you're like, oh, I need a thing. And then you went through the saga that you just went through. And then the people who manage the application have already gotten there ahead of you, and they're like, don't worry, we've created this for you. That's one of those just beautiful moments of like, wow, y'all have really thought this through on a bunch of different levels and got there before me. CHRIS: It's somewhat unsurprising in this case because it's a very developer-centric organization, and Ben's background being a thoughtbot developer and Alfred user, I'm almost certain. Although I've seen folks talking about Raycast, which is the new hotness on the quick launcher world. I started eons ago in Quicksilver, and then I moved to Alfred, I don't know, ten years ago. I don't know what time it is anymore. But I've been in Alfred land for a while, but Raycast seems very cool. Just as an aside, I have not allowed myself... [laughs] this is another one of those like; I do not have permission to go explore this new tool yet because I don't think it will actually make me more productive, although it could make me happier. So... STEPH: I haven't heard of that one, Raycast. I'm literally adding it to the show notes right now as a way so you can find The Duke later, and I can find Raycast later [chuckles] and take a look at it and check it out. Although I really haven't embraced the whole Alfred workflow. I've seen people really enjoy it and just rave about it and how wonderful it is. But I haven't really leaned into that part of the world; I don't know why. I haven't set any hard and fast rules for myself where I can't play around with these technologies, but I haven't taken the time to do it either. CHRIS: You've also not found yourself writing thousands of lines of Vimscript because you thought that was a good idea. So you don't need as many guardrails it would seem. That's my guess. STEPH: This is true. CHRIS: Whereas I need to be intentional [laughs] with how I structure my interaction with my dev tools. STEPH: Instead, I'm just porting over fixtures from one place to another. [laughs] That's the weird space that I'm living in instead. [laughs] CHRIS: But you're getting paid for that. No one paid me for the Vimscript I wrote. [laughter] STEPH: That's fair. Speaking around process-y things, there's something that's been on my mind that Valeria, another thoughtboter, suggested around how we structure our meetings and the default timing that we have for meetings. So Thursdays are my team-focused day. And it's the day where I have a lot of one on ones. And I realized that I've scheduled them back to back, which is problematic because then I have zero break in between them, which I'm less concerned about that because then I can go for an hour or something and not have a break. And I'm not worried about that part. But it does mean that if one of those discussions happens to go over just even for like two or three minutes, then it means that someone else is waiting for me in those two to three minutes. And that feels unacceptable to me. So Valeria brought up a really good idea where I think it's only with the Google Meet paid version. I could be wrong there. But I think with the paid version of it that then you can set the new default for how long a meeting is going to last. So instead of having it default to 30 minutes, have it default to 25 minutes. So then, that way, you do have that five-minute buffer. So if you do go over just like two or three minutes with someone, you've still got like two minutes to then hop to the next call, and nobody's waiting for you. Or if you want those five minutes to then grab some water or something like that. So we haven't implemented it just yet because then there's discussion around is this a new practice that we want everybody to move to? Because I mean, if just one person does it, it doesn't work. You really need everybody to buy into the concept of we're now defaulting to 25 versus 30-minute meetings. So I'll have to let you know how that goes. But I'm intrigued to try it out because I think that would be very helpful for me. Although there's a part of me that then feels bad because it's like, well, if I have 30 minutes to chat with somebody, but now I'm reducing it to 25 minutes each time, I didn't love that I'm taking time away from our discussion. But that still feels like a better outcome than making somebody wait for three to five minutes if something else goes over. So have you ever run into something like that? How do you manage back-to-back meetings? Do you intentionally schedule a break in between or? CHRIS: I do try to give myself some buffer time. I stack meetings but not so much so that they're just back to back. So I'll stack them like Wednesdays are a meeting-heavy day for me. That's intentional just to be like, all right, I know that my day is going to get chopped up. So let's just really lean into that, chop the heck out of Wednesday afternoons, and then the rest of the week can hopefully have slightly longer deep work-type sessions. And, yeah, in general, I try and have like a little gap in between them. But often what I'll do for that is I'll stagger the start of the next meeting to be rather than on the hour or the half-hour, I start it on the 15th minute. And so then it's sort of I now have these little 15-minute gaps in my workflow, which is enough time to do one or two small things or to go get a drink or whatever it is or if things do run over. Like, again, I feel what you're saying of like, I don't necessarily want to constrain a meeting. Or I also don't necessarily want to go into the habit of often over-running. I think it's good to be intentional. Start meetings on time, end meetings on time. If there's a great conversation that's happening, maybe there's another follow-up meeting that should happen or something like that. But for as nonsensical of a human as I believe myself to be, I am rather rigid about meetings. I try very hard to be on time. I try very hard to wrap them up on time to make sure I go to the next one. And so with that, the 15-minute staggering is what I've found works for me. STEPH: Yeah, that makes sense. One-on-ones feels special to me because I wholeheartedly agree with being very diligent about like, hey, this is our meeting time. Let's do a time check. Someone says that at the end, and then that way, everybody can move on. But one on ones are, there's more open discussion space, and I hate cutting people off, especially because it might not be until the last 15 minutes that you really got into the meat of the conversation. Or you really got somewhere that's a little bit more personal or things that you want to talk about. So if someone's like, "Yeah, let me tell you about my life goals," and you're like, "Oh, no, wait, sorry. We're out of time." That feels terrible and tragic to do. So I struggle with that part of it. CHRIS: I will say actually, on that note, I'm now thinking through, but I believe this to be true. Everyone that reports to me I have a 45-minute one-on-one with, and then my CEO I set up the one-on-one. So I also made that one a 45-minute one-on-one. And that has worked out really well. Typically, I try and structure it and reiterate this from time to time of, like, hey, this is your space, not mine. So let's have whatever conversation fits in here. And it's fine if we don't need to use the whole time, but I want to make sure that we have it and that we protect it. Because I often find much like retro, I don't know; I think everything's fine. And then suddenly the conversation starts, and you're like, you know what? Actually, I'm really concerned now that you mentioned it. And you need that sort of empty space that then the reality sort of pop up into. And so with one on one, I try and make sure that there is that space, but I'm fine with being like, we can cut this short. We can move on from one-on-one topics to more of status updates; let's talk about the work. But I want to make sure that we lead with is there anything deeper, any concerns, anything you want to talk through? And sort of having the space and time for that. STEPH: I like that. And I also think it speaks more directly to the problem I'm having because I'm saying that we keep running over a couple of minutes, and so someone else is waiting. So rather than shorten it, which is where I'm already feeling some pain...although I still think that's a good idea to have a default of 25-minute meetings so then that way, there is a break versus the full 30. So if people want to have back-to-back meetings, they still have a little bit of time in between. But for one on ones specifically, upping it to 45 minutes feels nice because then you've got that 15-minute buffer likely. I mean, maybe you schedule a meeting, but, I don't know, that's funky. But likely, you've got a 15-minute buffer until your next one. And then that's also an area that I feel comfortable in sharing with folks and saying, "Hey, I've booked this whole 45 minutes. But if we don't need the whole time, that's fine." I'm comfortable saying, "Hey, we can end early, and you can get more of your time back to focus on some other areas." It's more the cutting someone off when they're talking because I have to hop to the next thing. I absolutely hate that feeling. So thanks, I think I'll give that a go. I think I'll try actually bumping it up to 45 minutes, presuming that other people like that strategy too, since they're opting in [laughs] to the 45 minutes structure. But that sounds like a nice solution. CHRIS: Well yeah, happy to share it. Actually, one interesting thing that I'm realizing, having been a manager at thoughtbot and then now being a manager within Sagewell, the nature of the interactions are very different. With thoughtbot, I was often on other projects. I was not working with my team day to day in any real capacity. So it was once every two weeks, I would have this moment to reconnect with them. And there was some amount of just catching up. Ideally, not like status update, low-level sort of thing, but sort of just like hey, what have you been working on? What have you been struggling with? What have you been enjoying? There was more like I needed bigger space, I would say for that, or it's not surprising to me that you're bumping into 30 minutes not being quite long enough. Whereas regularly, in the one on ones that I have now, we end up cutting them short or shifting out of true one-on-one mode into more general conversation and chatting about Raycast or other tools or whatever it is because we are working together daily. And we're pairing very regularly, and we're all on the same project and all sorts of in sync and know what's going on. And we're having retro together. We have plenty of places to have the conversation. So the one-on-one again, still, I keep the same cadence and the same time structure just because I want to make sure we have the space for any day that we really need that. But in general, we don't. Whereas when I was at thoughtbot, it was all the more necessary. And I think for folks listening; I could imagine if you're in a team lead position and if you're working very closely with folks, then you may be on the one side of things versus if you're a little bit more at a distance from the work that they're doing day to day. That's probably an interesting question to ask, and think about how you want to structure it. STEPH: Yeah, I think that's an excellent point. Because you're right; I don't see these individuals. We may not have really gotten to interact, except for our daily syncs outside of that. So then yeah, there's always like a good first 10 minutes of where we're just chatting about life and catching up on how things are going before then we dive into some other things. So I think that's a really good point. Cool, solving management problems on the mic. I dig it. In slightly different news, I've joined a book club, which I'm excited about. This book club is about Ruby. It's specifically reading the book Ruby Science, which is a book that was written and published by thoughtbot. And it requires zero homework, which is my favorite type of book club. Because I have found I always want to be part of book clubs. I'm always interested in them, but then I'm not great at budgeting the time to make sure I read everything I'm supposed to read. And so then it comes time for folks to get together. And I'm like, well, I didn't do my homework, so I can't join it. But for this one, it's being led by Joël, and the goal is that you don't have to do the homework. And they're just really short sections. So whoever's in charge of leading that particular session of the book club they're going to provide an overview of what's covered in whatever the reading material that we're supposed to read, whatever topic we're covering that day. They're going to provide an overview of it, an example of it, so then we can all talk about it together. So if you read it, that's wonderful. You're a bit ahead and could even join the meeting like five minutes late. Or, if you haven't read it, then you could join and then get that update. So I'm very excited about it. And this was one of those books that I'd forgotten that thoughtbot had written, and it's one that I've never read. And it's public for anybody that's interested in it. So to cover a little bit of details about it, so it talks about code smells, ways to refactor code, and then also common patterns that you can use to solve some issues. So there's a lot of really just great content that's in it. And I'll be sure to include a link in the show notes for anyone else that's interested. CHRIS: And again, to reiterate, this book is free at this point. Previously, in the past, it was available for purchase. But at one point a number of years ago, thoughtbot set all of the books free. And so now that along with a handful of other books like...what's Edward's DNS book? Domain Name Sanity, I believe, is Edward's book name that Edward Loveall wrote when he was not a thoughtboter, [laughs] and then later joined as a thoughtboter, and then we made the book free. But on the specific topic of Ruby Science, that is a book that I will never forget. And the reason I will never forget it is that book was written by the one and only CTO Joe Ferris, who is an incredibly talented developer. And when I was interviewing with thoughtbot, I got down to the final day, which is a pairing session. You do a morning pairing session with one thoughtbot developer, and you do an afternoon pairing session with another thoughtbot developer. So in the morning, I was working with someone on actually a patch to Rails which was pretty cool. I'd never really done that, so that was exciting. And that went fine with the exception that I kept turning on Caps Lock on their keyboard because I was used to Caps Lock being CTRL, and then Vim was going real weird for me. But otherwise, that went really well. But then, in the afternoon, I was paired with the one and only CTO Joe Ferris, who was writing the book Ruby Science at that time. And the nature of the book is like, here's a code sample, and then here's that code sample improved, just a lot of sort of side-by-side comparisons of code. And I forget the exact way that this went, but I just remember being terrified because Joe would put some code up on the screen and be like, "What do you think?" And I was like, oh, is this the good code or the bad code? I feel like I should know. I do not know. I'm not sure. It worked out fine, I guess. I made it through. But I just remember being so terrified at that point. I was just like, oh no, this is how it ends for me. It's been a good run. STEPH: [laughs] CHRIS: I made it this far. I would have loved to work for this nice thoughtbot company, but here we are. But yeah, I made it through. [laughs] STEPH: There are so many layers to that too where it's like, well if I say it's terrible, are you going to be offended? Like, how's this going to go for me if I speak my truths? Or what am I going to miss? Yeah, that seems very interesting (I kind of like it.) but also a terrifying pairing session. CHRIS: I think it went well because I think the code...I'd been following thoughtbot's work, and I knew who Joe was and had heard him on podcasts and things. And I kind of knew roughly where things were, and I was like, that code looks messy. And so I think I mostly got it right, but just the openness of the question of like, what do you think? I was like, oh God. [laughs] So yeah, that book will always be in my memories, is how I would describe it. STEPH: Well, I'm glad it worked out so we could be here today recording a podcast together. [laughs] CHRIS: Recording a podcast together. Now that I say all that, though, it's been a long time since I've read the book. So maybe I'll take a revisit. And definitely interested to hear more about your book club and how that goes. But shifting ever so slightly (I don't have a lot to say on this topic.) but there's a new framework technology thing out there that has caught my attention. And this hasn't happened for a while, so it's kind of novel for me. So I tend to try and keep my eye on where is the sort of trend of web development going? And I found Inertia a while ago, and I've been very, very happy with that as sort of this is the default answer as to how I build websites. To be clear, Inertia is still the answer as to how I build websites. I love Inertia. I love what it represents. But I'm seeing some stuff that's really interesting that is different. Specifically, Remix.run is the thing that I'm seeing. I mentioned it, I think, in the last episode talking about there was some stuff that they were doing with data loading and async versus synchronous, and do you wait on it or? They had built some really nice levers and trade-offs into the framework. And there's a really great talk that Ryan Florence, one of the creators of Remix.run, gave about that and showed what they were building. I've been exploring it a little bit more in-depth now. And there is some really, really interesting stuff in Remix. In particular, it's a meta-framework, I think, is the nonsense phrase that we use to describe it. But it's built on top of React. That won't be true for forever. I think it's actually they would say it's more built on top of React Router. But it is very similar to Next.js for folks that have seen that. But it's got a little bit more thought around data loading. How do we change data? How do we revalidate data after? There's a ton of stuff that, having worked in many React client-side API-heavy apps that there's so much pain, cache invalidation. How do you think about the cache? When do you fetch from the network? How do you avoid showing 19 different loading spinners on the page? And Remix as a framework has some really, I think, robust and well-thought-out answers to a lot of that. So I am super-duper intrigued by what they're doing over there. There's a particular video that I think shows off what Remix represents really well. It's Ryan Florence, that same individual, the creator of Remix, building just a newsletter signup page. But he goes through like, let's start from the bare bones, simplest thing. It's just an input, and a form submits to the server. That's it. And so we're starting from web 2.0, long, long ago, sort of ideas, and then he gradually enhances it with animations and transitions and error states. And even at the end, goes through an accessibility audit using the screen reader to say, "Look, Remix helps you get really close because you're just using web fundamentals." But then goes a couple of steps further and actually makes it work really, really well for a screen reader. And, yeah, overall, I'm just super impressed by the project, really, really intrigued by the work that they're doing. And frankly, I see a couple of different projects that are sort of in this space. So yeah, again, very early but excited. STEPH: On their website...I'm checking it out as you're walking me through it, and on their website, they have "Say goodbye to Spinnageddon." And that's very cute. [laughs] CHRIS: There's some fundamental stuff that I think we've just kind of as a web community, we made some trade-offs that I personally really don't like. And that idea of just spinners everywhere just sending down a ball of application logic and a giant JavaScript file turning it on on someone's computer. And then immediately, it has to fetch back to the server. There are just trade-offs there that are not great. I love that Remix is sort of flipping that around. I will say, just to sort of couch the excitement that I'm expressing right now, that Remix exists in a certain place. It helps with building complex UIs. But it doesn't have anything in the data layer. So you have to bring your own data layer and figure out what that means. We have ActiveRecord within Rails, and it's deeply integrated. And so you would need to bring a Prisma or some other database connection or whatever it is. And it also doesn't have more sort of full-featured framework things. Like with Rails, it's very easy to get started with a background job system. Remix has no answer to that because they're like, no, no, this is what we're doing over here. But similarly, security is probably the one that concerns me the most. There's an open conversation in their discussion portal about CSRF protection and a back and forth of whether or not Remix should have that out of the box or not. And there are trade-offs because there are different adapters that you can use for auth. And each would require their own CSRF mitigation. But to me, that is the sort of thing that I would want a framework to have. Or I'd be interested in a framework that continues to build on top of Remix that adds in background jobs and databases and all that kind of stuff as a complete solution, something more akin to a Rails or a Laravel where it's like, here we go. This is everything. But again, having some of these more advanced concepts and patterns to build really, really delightful UIs without having to change out the fundamental way that you're building things. STEPH: Interesting. Yeah, I think you've answered a couple of questions that I had about it. I am curious as to how it fits into your current tech stack. So you've mentioned that you're excited and that it's helpful. But given that you already have Rails, and Inertia, and Svelte, does it plug and play with the other libraries or the other frameworks that you have? Are you going to have to replace something to then take advantage of Remix? What does that roadmap look like? CHRIS: Oh yeah, I don't expect to be using Remix anytime soon. I'm just keeping an eye on it. I think it would be a pretty fundamental shift because it ends up being the server layer. So it would replace Rails. It would replace the Inertia within the stack that I'm using. This is why as I started, I was like, Inertia is still my answer. Because Inertia integrates really well with Rails and allows me to do the sort of it's not progressive enhancement, but it's like, I want fancy UI, and I don't want to give up on Rails. And so, Inertia is a great answer for that. Remix does not quite fit in the same way. Remix will own all of the request-response lifecycle. And so, if I were to use it, I would need to build out the rest of that myself. So I would need to figure out the data layer. I would need to figure out other things. I wouldn't be using Rails. I'm sure there's a way to shoehorn the technologies together, but I think it sort of architecturally would be misaligned. And so my sense is that folks out there are building...they're sort of piecing together parts of the stack to fill out the rest. And Remix is a really fantastic controller and view from their down experience and routing layer. So it's routing, controller, view I would say Remix has a really great answer to, but it doesn't have as much of the other stuff. Whereas in my case, Inertia and Rails come together and give me a great answer to the whole story. STEPH: Got it. Okay, that's super helpful. CHRIS: But yeah, again, I'm in very much the exploratory phase. I'm super intrigued by a lot of what I've seen of it and also just sort of the mindset, the ethos of the project as it were. That sounds fancy as I say it, but it's what I mean. I think they want to build from web fundamentals and then enhance the experience on top of that, and I think that's a really great way to go. It means that links will work. It means that routing and URLs will work by default. It means that you won't have loading spinner Armageddon, and these are core fundamentals that I believe make for good websites and web applications. So super interested to see where they go with it. But again, for me, I'm still very much in the Rails Inertia camp. Certainly, I mean, I've built Sagewell on top of it, so I'm going to be hanging out with it for a while, but also, it would still be my answer if I were starting something new right now. I'm just really intrigued by there's a new example out there in the world, this Remix thing that's pushing the envelope in a way that I think is really great. But with that, my now…what was that? My second or my third rave? Also called the positive rant, as we call it. But yeah, I think on that note, what do you think? 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 on 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.

The Art of Product
212: Tuple Goes Hollywood

The Art of Product

Play Episode Listen Later Jun 22, 2022 38:19


The Tuple team had their first filming session for the meta-documentary about their marketing experiments. Derrick is awaiting results from the latest SavvyCal funnel experiments.

The Art of Product
211: This Is Not A Bad Reality

The Art of Product

Play Episode Listen Later Jun 15, 2022 24:56


Ben and Derrick catch up on all things Tuple (https://tuple.app/) and SavvyCal (https://savvycal.com/?via=drfgar). Ben recently raised prices for Tuple. Derrick is experimenting with major funnel changes for SavvyCal.

The Rabbit Hole: The Definitive Developer's Podcast
259. Remote Pair Programming with Ben Orenstein(Replay)

The Rabbit Hole: The Definitive Developer's Podcast

Play Episode Listen Later Jun 14, 2022 26:26


On today's episode, we are joined by special guest, Ben Orenstein, to talk about remote pair programming. Ben is a developer, who after many years of working for other people decided to strike out on his own. He is the cofounder of an app called Tuple, which is specifically for remote pair programming.

JavaScript Jabber
TC39 and Upcoming Proposals for ECMAScript (PART 2) - JSJ 533

JavaScript Jabber

Play Episode Listen Later May 24, 2022 61:57 Very Popular


Today we chat with Thomas Randolph from GitLab, to discuss his Top 10 list of the upcoming TC39 proposals. The list… Temporal Proposal Import Assertions JSON Modules Built-In Modules Observable Proposal Partial Application UUID Pipeline Operator Module Blocks Emitter Proposal +1 Records and Tuples +2 Reverse and Sort Methods on Arrays Sponsors Top End Devs (https://topenddevs.com/) Coaching | Top End Devs (https://topenddevs.com/coaching) Links Twitter: Thomas Randolph ( @rockerest ) (https://twitter.com/rockerest) JSJ 425: The Evolution of JavaScript (https://javascriptjabber.com/jsj-425-the-evolution-of-javascript) Temporal (https://tc39.es/proposal-temporal/docs/) import assertions (https://tc39.es/proposal-import-assertions/) JSON modules (https://tc39.es/proposal-json-modules/) The TC39 Process (https://tc39.es/process-document/) Observable (https://tc39.es/proposal-observable/) Partial Application for ECMAScript (https://tc39.es/proposal-partial-application/) ES pipe operator (2021) (https://tc39.es/proposal-pipeline-operator/) JavaScript Module Blocks (https://tc39.es/proposal-js-module-blocks/) Record & Tuple (https://tc39.es/proposal-record-tuple/) ECMAScript proposal "Change Array by copy": four new non-destructive Array methods (https://2ality.com/2022/04/change-array-by-copy.html) GitHub: tc39/proposals (https://github.com/tc39/proposals) JavaScript Jabber 19 April 2022 (https://rockerest.notion.site/JavaScript-Jabber-19-April-2022-1badf36afe844532922888f5132a25f8) Thomas O. Randolph (https://rdl.ph/) Picks Charles - The Last Battle (https://www.audible.com/pd/The-Last-Battle-Audiobook/B002UZJF22) Charles - GamePigeon (https://apps.apple.com/us/app/gamepigeon/id1124197642) Dan - Star Trek: Picard (https://www.paramountplus.com/shows/star-trek-picard/) Dan - 103 Early Hints Dan - War in Ukraine Steve - Dad Jokes Steve - Rescinded mask mandates for travel Thomas - My notes to this episode (https://rockerest.notion.site/JavaScript-Jabber-19-April-2022-1badf36afe844532922888f5132a25f8) Thomas - The Design of Everyday Things by Don Norman (https://amzn.to/3Nifiw8) Thomas - What is Reactive Programming by Kevin Webber (https://blog.redelastic.com/what-is-reactive-programming-bc9fa7f4a7fc) Thomas - War in Ukraine Special Guest: Thomas Randolph.

All JavaScript Podcasts by Devchat.tv
TC39 and Upcoming Proposals for ECMAScript (PART 2) - JSJ 533

All JavaScript Podcasts by Devchat.tv

Play Episode Listen Later May 24, 2022 61:57


Today we chat with Thomas Randolph from GitLab, to discuss his Top 10 list of the upcoming TC39 proposals. The list… Temporal Proposal Import Assertions JSON Modules Built-In Modules Observable Proposal Partial Application UUID Pipeline Operator Module Blocks Emitter Proposal +1 Records and Tuples +2 Reverse and Sort Methods on Arrays Sponsors Top End Devs (https://topenddevs.com/) Coaching | Top End Devs (https://topenddevs.com/coaching) Links Twitter: Thomas Randolph ( @rockerest ) (https://twitter.com/rockerest) JSJ 425: The Evolution of JavaScript (https://javascriptjabber.com/jsj-425-the-evolution-of-javascript) Temporal (https://tc39.es/proposal-temporal/docs/) import assertions (https://tc39.es/proposal-import-assertions/) JSON modules (https://tc39.es/proposal-json-modules/) The TC39 Process (https://tc39.es/process-document/) Observable (https://tc39.es/proposal-observable/) Partial Application for ECMAScript (https://tc39.es/proposal-partial-application/) ES pipe operator (2021) (https://tc39.es/proposal-pipeline-operator/) JavaScript Module Blocks (https://tc39.es/proposal-js-module-blocks/) Record & Tuple (https://tc39.es/proposal-record-tuple/) ECMAScript proposal "Change Array by copy": four new non-destructive Array methods (https://2ality.com/2022/04/change-array-by-copy.html) GitHub: tc39/proposals (https://github.com/tc39/proposals) JavaScript Jabber 19 April 2022 (https://rockerest.notion.site/JavaScript-Jabber-19-April-2022-1badf36afe844532922888f5132a25f8) Thomas O. Randolph (https://rdl.ph/) Picks Charles - The Last Battle (https://www.audible.com/pd/The-Last-Battle-Audiobook/B002UZJF22) Charles - GamePigeon (https://apps.apple.com/us/app/gamepigeon/id1124197642) Dan - Star Trek: Picard (https://www.paramountplus.com/shows/star-trek-picard/) Dan - 103 Early Hints Dan - War in Ukraine Steve - Dad Jokes Steve - Rescinded mask mandates for travel Thomas - My notes to this episode (https://rockerest.notion.site/JavaScript-Jabber-19-April-2022-1badf36afe844532922888f5132a25f8) Thomas - The Design of Everyday Things by Don Norman (https://amzn.to/3Nifiw8) Thomas - What is Reactive Programming by Kevin Webber (https://blog.redelastic.com/what-is-reactive-programming-bc9fa7f4a7fc) Thomas - War in Ukraine Special Guest: Thomas Randolph.

All JavaScript Podcasts by Devchat.tv
TC39 and Upcoming Proposals for ECMAScript (PART 1) - JSJ 532

All JavaScript Podcasts by Devchat.tv

Play Episode Listen Later May 17, 2022 66:34


Today we chat with Thomas Randolph from GitLab, to discuss his Top 10 list of the upcoming TC39 proposals. The list… Temporal Proposal Import Assertions JSON Modules Built-In Modules Observable Proposal Partial Application UUID Pipeline Operator Module Blocks Emitter Proposal +1 Records and Tuples +2 Reverse and Sort Methods on Arrays Sponsors Top End Devs (https://topenddevs.com/) Raygun | Click here to get started on your free 14-day trial (https://raygun.com/?utm_medium=podcast&utm_source=jsjabber&utm_campaign=devchat&utm_content=homepage) Coaching | Top End Devs (https://topenddevs.com/coaching) Links Twitter: Thomas Randolph ( @rockerest ) (https://twitter.com/rockerest) JSJ 425: The Evolution of JavaScript (https://javascriptjabber.com/jsj-425-the-evolution-of-javascript) Temporal (https://tc39.es/proposal-temporal/docs/) import assertions (https://tc39.es/proposal-import-assertions/) JSON modules (https://tc39.es/proposal-json-modules/) The TC39 Process (https://tc39.es/process-document/) Observable (https://tc39.es/proposal-observable/) Partial Application for ECMAScript (https://tc39.es/proposal-partial-application/) ES pipe operator (2021) (https://tc39.es/proposal-pipeline-operator/) JavaScript Module Blocks (https://tc39.es/proposal-js-module-blocks/) Record & Tuple (https://tc39.es/proposal-record-tuple/) ECMAScript proposal "Change Array by copy": four new non-destructive Array methods (https://2ality.com/2022/04/change-array-by-copy.html) GitHub: tc39/proposals (https://github.com/tc39/proposals) JavaScript Jabber 19 April 2022 (https://rockerest.notion.site/JavaScript-Jabber-19-April-2022-1badf36afe844532922888f5132a25f8) Thomas O. Randolph (https://rdl.ph/) Picks Charles - The Last Battle (https://www.audible.com/pd/The-Last-Battle-Audiobook/B002UZJF22) Charles - GamePigeon (https://apps.apple.com/us/app/gamepigeon/id1124197642) Dan - Star Trek: Picard (https://www.paramountplus.com/shows/star-trek-picard/) Dan - 103 Early Hints Dan - War in Ukraine Steve - Dad Jokes Steve - Rescinded mask mandates for travel Thomas - My notes to this episode (https://rockerest.notion.site/JavaScript-Jabber-19-April-2022-1badf36afe844532922888f5132a25f8) Thomas - The Design of Everyday Things by Don Norman (https://amzn.to/3Nifiw8) Thomas - What is Reactive Programming by Kevin Webber (https://blog.redelastic.com/what-is-reactive-programming-bc9fa7f4a7fc) Thomas - War in Ukraine Special Guest: Thomas Randolph.

The Art of Product
208: Prime Foot-Shooting Material

The Art of Product

Play Episode Listen Later May 4, 2022 39:27


Ben and Derrick chat through a cool new feature Tuple (https://tuple.app/) is shaping up. They also discuss Tuple's ambitious marketing bets.

Bootstrapped Web
Marketing in 2022

Bootstrapped Web

Play Episode Listen Later Apr 28, 2022 42:20


Brian and Jordan are both in flux between school, stressing over work, selling houses, and MicroConf. They summarize their chaotic couple of weeks and then do a deep dive on what content marketing will look like in 2022. Recently Aaron Francis (Tuple's first marketer) talked about their $200,000 loan from Stripe and how he plans on publicly talking about how they will be spending that money. Brian and Jordan give their take on Aaron's content marketing technique. If you have any questions, comments, or topic ideas for Bootstrapped Web, leave us a message here “You can make it happen, but not really. Your customers make it happen.” – Jordan Powered By the Tweet This PluginTweet This Talking Points: The timeline for Jordan's big moveWhat's it like to sell and buy a house in this marketZipMessage updatesChanges on the websiteSurveys after signing upCoining “ZM”Perfect uses for ZipMessageHiring strategists for SEO researchTraction with RallyConversations with investorsThe importance of honesty and “when” to be honestLooking for marketersTuple's marketing campaign Aaron Francis as Tuple's first marketerAaron's tweet about their $200,000 loan from Stripe “When a customer explains the whole value prop, it gives me so much more energy.” – Brian Powered By the Tweet This PluginTweet This Resources: Brian on Twitter Jordan on Twitter ZipMessage

The Art of Product
207: Musings on Advice

The Art of Product

Play Episode Listen Later Apr 20, 2022 38:23 Very Popular


Ben and the Tuple team have hit a good shipping stride lately. Derrick and team are nearing completion on a few large SavvyCal initiatives. The guys reflect on MicroConf and the nature of dispensing advice.

Software Social
Sales for Founders with Ben Orenstein, Co-Founder of Tuple

Software Social

Play Episode Listen Later Apr 5, 2022 53:24 Transcription Available


Follow Ben: https://twitter.com/r00kCheck out Tuple: https://tuple.appDid your latest AWS bill give you a heart attack? CloudForecast sends you daily transparent reports that help you understand your AWS costs, find any overspends, and promote opportunities to save costs. CloudForecast takes complicated data and produces accurate, presentable reports so you can share stats quickly and make strategic decisions swiftly. With communication integrations like Slack, Microsoft Teams, and email to share insights, you can go from managing your AWS spend in hours to seconds. Start a 30-day free trial today! No credit card is required to get started at CloudForecast.io. 

The Art of Product
203: The Hiring Spree

The Art of Product

Play Episode Listen Later Mar 16, 2022 40:10


The Tuple team has recently grown by three team members! Ben is looking forward to getting the Linux client out the door in the next month. Derrick is staying busy moving SavvyCal forward and bringing his new developer into the app.

Giant Robots Smashing Into Other Giant Robots
399: thoughtbot Boost with Joshua Clayton

Giant Robots Smashing Into Other Giant Robots

Play Episode Listen Later Oct 28, 2021 39:57


Chad interviews Managing Director at thoughtbot, Joshua Clayton, about what a Managing Director at thoughtbot does, what makes Boost at thoughtbot different than other teams, and the belief in integrated teams of designers and developers company-wide. Empathize with Your Customer by Josh Clayton (https://thoughtbot.com/blog/empathize-with-your-customer) thoughtbot Boost (https://thoughtbot.com/boost) Follow thoughtbot on Twitter (https://twitter.com/thoughtbot) or LinkedIn (https://www.linkedin.com/company/150727/) Follow Josh on LinkedIn (https://www.linkedin.com/in/joshuadclayton/) or Twitter (https://twitter.com/joshuaclayton) Check out Josh's website (https://joshuaclayton.me/) 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 Josh Clayton, Managing Director of the thoughtbot Boost team. Hey, I know that company. Welcome, Josh. JOSH: Hey, Chad. How are you? CHAD: All right. I'm back to the show I think. I didn't get a chance to look up the last episode you're in, but it was probably hundreds of episodes ago now. JOSH: Yeah, it's got to have been a while. CHAD: [laughs] Speaking of a while, you recently…now time is all messed up for me, but I know that you have been at thoughtbot for a long time. How long has it been? JOSH: It was 12 years in August. CHAD: It's been a wonderful 12 years, Josh. JOSH: I agree. I agree. CHAD: [laughs] JOSH: It's been fun. CHAD: So in that time, you have had a few different roles. But you've been a Managing Director for a while now. JOSH: Yeah, I think that's...let's see. It was seven and a half years for the Boston team. And then it's 10 and a half months with Boost. CHAD: So your background is as a developer. And you, like a lot of people who have a background as developers at thoughtbot, myself included, still do development on a fairly regular basis. What does the Managing Director job at thoughtbot actually do? JOSH: What don't we do [laughter] is maybe a better question. Effectively, we're running that team's business. So it involves some amount of software consulting. It involves software sales. It involves managing the profitability of the team. There are marketing functions, and, I don't know, anything and everything, hiring-related things. We opened up and recently filled our Development Director position, which was open for a couple of months over the summer. We've just opened up a Design Director position. So it's everything. [laughs] It's everything it feels like. CHAD: At the beginning of this year, we did an episode about the changes that we had made at thoughtbot to reorganize the teams around rather than geographic studios around the types of work that we would do on that team. And that's how the Boost team was created. So in that episode, we gave people an overview. But I'd love to hear in your own words, what makes Boost at thoughtbot different than the other teams, and what do you focus on? JOSH: So what makes Boost different? I think one of the drivers, one of the motivators, is to embed alongside existing product teams, engineering, and design teams, and help them get better, help them grow as well as ship features and fix bugs. So I think that the way that I position it is if there's an existing product that's deployed, people are using it day in and day out. Hopefully, it's been battle-tested. There are probably some funky areas of the code. Those are the codebases that we're operating in. It might be a team of two people; it might be a team of 200 people. But there is an existing product and an existing team. They're looking for our support to help make it better. CHAD: One of the things I love about Boost and the changes that we've made, especially relative to Boost, is that at thoughtbot, we really believe in integrated teams of designers and developers. And a big part of what we've always done has been to be a complete product design and development team that brings new products to market, big and small. And because we were one of the first consulting companies in the world to switch to Ruby on Rails and because of that deep experience with Rails, and scaling, and working on existing products, we had a significant number of customers who engaged us for development for that expertise, and to help them scale, and grow, and hire, and implement best practices or solve problems that they were having in their existing codebase or on their existing team. And even though that was a significant part of our business, it was always something that seemed that we maybe even didn't really want to be doing it, or it was on the periphery of our marketing and positioning. And I was super excited when we officially created this team because it allowed us to acknowledge that this was a significant part of what we do, a significant part of our revenue, and to have a team of people that opted into doing this kind of work who would not only love the kind of work but want to even grow it and do more of it. And we haven't really had that for this kind of work. We've had individuals wanting to do it but not at an organizational level in an organization that supports it. That was more of a statement than a question, but reaction? JOSH: [laughs] I think you're spot on. It's always been interesting to me to hear that it's...obviously, at thoughtbot, we have been building MVPs and working with a lot of different types of companies over the years and helping them launch products. But I think that the type of work that I and, ideally, obviously, other people on the Boost team enjoy working on is existing platforms and working alongside existing teams. We talk about legacy systems, and I think they get a bad rap. And it's like, no, it's battle-tested. CHAD: [chuckles] JOSH: The business has proven its viability. It is still around years later. Conway's law applies in all of the stuff. Again, there are gnarly aspects of the code. But I think that's what the folks on the Boost team enjoy being challenged by is problems where these things are larger systems. They've been around for a while, and they do get pretty gnarly. CHAD: I think one of the things that held us back in the past is that it is a skill set, and it's an experience. And you are going to be on an MVP project where you're doing design and development, going from concept to launching of a new idea, usually in a matter of weeks, working directly with a founder or a team of co-founders. And then you rotate on to this significantly larger project with maybe an engineering team of tens or dozens or hundreds of other developers on it. It's a very different skill set, and you have very different challenges in that environment. And when you're constantly switching between those different kinds of projects, you can't necessarily get better at it. And that's one of the other things that I think is helping us be more successful. JOSH: I remember one of the teammates had joined the kick-off call with me at the Boost inception that very first meeting. And it was Joël. And Joël had asked pretty straightforwardly, "What is the expectation in terms of project rotations?" Because I think historically across the company, we'd aimed to do two to four-month engagements before we'd rotate folks. And I told him point-blank it's going to be six months to a year probably. And I don't think it necessarily shocked him or other folks on the team. But I think when you're going into existing codebases and working alongside existing teams, there is inherently politics at play and complexities at play where it might take you being a new developer on a team six weeks, maybe longer before you actually feel comfortable and confident navigating the codebase and knowing where you can have and make an impact. And so, I think some of the shifts there have been particularly interesting to watch the types of consulting conversations that we have within the team just because it is a different beast, I think than building and launching products. CHAD: So let's get into a little bit of detail about the kinds of projects we're doing in Boost to the extent that we can give specific examples and maybe more importantly and relevant to the audience, what are the things that we see? What are the common challenges that we see as products grow and evolve, as teams grow and evolve? What do you think one of the most common challenges that people have is? JOSH: As teams grow and evolve, I think a lot of teams run into onboarding issues and general knowledge sharing. I think when you start a small team, and you're two, three, maybe five engineers, it's pretty easy for everyone to keep probably the entirety or the majority of that domain in their head at any one time. As you work to scale a team...there's a client of ours right now where they're effectively doubling every...I don't know what the time period is, but they're growing very, very rapidly. And the feedback that some of our team have provided to them is it's really hard, and there are very much knowledge silos. And they're working through, okay? How do we tease this out? How do we share this context so that you don't have a couple of folks that are effectively blocking every single other member of the team? And so that's one of the core areas that hangs up our team and other teams. [chuckles] Our clients bring us on, and a lot of times, it's like we're rip-roaring and ready to go. And it's like, I need information from a bunch of people, and the processes aren't in place such that we can be as effective as we would want to be given the nature of work that we're doing. CHAD: I think that's a straightforward problem, and it's a good example...I don't want to make this an hour-long thoughtbot commercial. But I'll just point blank say one of the reasons why sometimes working with us is positive for clients is it's really easy to have a certain pain around your onboarding process or company, even just simple things like how long it takes to get a new person a computer or to ramp them up on their existing team. If you're just hiring an employee, it's easy to ignore the cost of that. JOSH: Yes. CHAD: But when you're bringing on thoughtbot and we have a specific start date, and it's a certain cost, and those kinds of things, it can really expose the pain that is already happening but was just being ignored and provide the impetus to actually fix the problem. JOSH: One of the things that we try to set out to do on the first day for any project is to open up a pull request to the codebase, whether it's an improvement to the onboarding like the README for the repository or whatever it might be. Ideally, we are finding ways to contribute on day one. And sometimes, that's frankly not realistic for individual contributors doing it from their own machines. But oftentimes, we'll know that going in. And as we onboard new folks and things like that, we'll say, okay, well, day one is going to be your pair programming over Tuple or some other tool so that you are able to engage and interact with a team and work on the code, even if there's still a bit of a lag between GitHub access and everything else that's the base of onboarding steps. CHAD: So another common one that people bring us on to help with is scaling challenges in terms of the actual product itself, maybe that's performance or other scaling challenges. I'm working on a project now where that was how we first got involved. The service was failing, and it was only getting worse under the increasing scale. So, what are some tips that you have for how to effectively solve some of those problems while not bringing everything else that you need to accomplish to a screeching halt? JOSH: At the end of the day, you can't fix something that you don't know is broken. Or you might have a hunch in terms of, oh, I know this page or this set of pages are slow. I think so much of what we see is teams come in, and they're like, "We don't have New Relic setup." We don't have an instrumentation setup. So they can't measure anything. And so it's like, I know this page takes three or four seconds to paint, but I don't know why. And I don't know how to fix it. It's like, okay, well, the first thing that we need to do is set up some amount of performance monitoring and application tracking just to get a sense of what that's like. There is a potential customer who had reached out back in January of this year. So this was weeks into Boost's inception. And they said, "Listen, we've got some performance-related issues. We don't really know what to do, but we know the application is really, really slow on these couple of pages." It's like, "Are you using New Relic, or Scout, or anything like that?" They're like, "No." It's like, okay, that's the first thing that you need to do. And they came back about a month ago and were like, okay, "Here's the access to all of this data. Now we're ready to go," and it's like, "Yes!" They probably didn't need to wait for that long. But it really speaks to that in order to address some of the performance-related stuff; we need to have some sense of what is going on and where. I know Steph over on The Bike Shed Podcast had talked to Nate Berkopec. And she had floated one of the questions I had had. And he basically schooled me on that podcast and reiterated it really is ultimately about measuring so much of what we're doing. CHAD: Yeah. One of the things, especially for teams that are having a problem but feel like they don't know what to do it's tough when it's actually the case. But the reality is a lot of times; there's actually very low-hanging fruit that it's just no one has the time or experience to actually identify that. And putting some monitoring in place combined with actually taking the time to look through it, especially if it's the first time you ever hit scaling problems...There's either a missing database in that index or some N+1 queries, and fortunately, once you identify that kind of problem, it's usually fairly quick to fix as well. It's a different thing when there's maybe fundamental architecture things that are causing your app to have scaling problems. But it's very unlikely that those are the first problems you're ever experiencing. The first problems you're ever going to experience if your app is running slow are going to be things happening at the database level or missing an index or something like that. And it's very unlikely that significant architecture changes need to be put in place in order to fix the first scaling problems that any product usually has. JOSH: That wasn't the type, or at least I think when we got brought on, and you were working on your most recent clients, we were well beyond...maybe we weren't, maybe I'm misrepresenting or misremembering, but it feels like we were well beyond some of the low hanging fruit. CHAD: Yeah, there was a batch of low-hanging fruit. One of the things if you're working on a product that is scaling super rapidly, what can happen is that the low-hanging fruit masks the other problems that are happening there because it all happened too quickly, all at the same time. And that was the case on this project. So it went from having hundreds of people using it to millions of people using it in the span of a month. And so there was low-hanging fruit. But removing the low-hanging fruit didn't make the app suddenly work again; it just made it so that we could look at the metrics and say, "Okay, those things are no longer the problem." The real problems are not being masked now. We now can identify the architectural changes that need to be put into place in order to operate at the scale. JOSH: Yeah, it's the low-hanging fruit when the orchard is on fire. [laughter] That is true. CHAD: Right. So you got to peel back like an onion. And this is the case with I think a lot of...whether it be a technical challenge or a team challenge. You can't always come in and very quickly solve the root problem. You might not even know what the root problem is. You just have to start solving the problem that is obvious in front of you and learning more. And then you solve that one, and then you expose the next one, and you expose the next one. And even when you can identify the root problem, you'll be like, this is the problem, and everyone agrees it's the problem. It still might be too hard to actually fix that problem. It might be an organizational or a systemic problem. And instead, you say, "Okay, we have to iteratively solve that problem." And you start peeling back those layers to get to the point where you've positioned yourself to solve that core problem. And I think we face that a lot, particularly as external consultants. We're coming in, and we can't just be the bull in the china shop. Because we haven't built the trust with everyone necessary to make the changes, or we don't know enough to know what the changes need to be. JOSH: Right. And I think the people aspect of all of these things in my opinion...and I should caveat this with I've been writing software professionally for almost 20 years. The people, in my opinion, are always the harder aspects to any engagement. It's very rare that we go into a technical project where it's like we literally cannot figure out a technical solution to this thing. We can usually figure it out. And it might take weeks or months to implement, especially as it spans multiple systems. But more often than not, it's really navigating the people and the relationships and building that trust like you had mentioned that is really what will help dictate success within that project. CHAD: I have a line that I use fairly often, and it's that I really believe very few, if any, developers sit down and are like, I'm going to write a bad solution today, or I'm going to write bad code today. That's not what people are doing. I think the majority of people genuinely try within their entire capacity to do a good job. And so that means that when I'm coming into a situation where there are problems, or things are messy, or there were bad decisions or bad code written, it can't be chalked up to like, oh, that was a bad developer, or that was a bad choice that was made. There was usually some people or organizational problem that caused that to happen in the first place. And merely fixing the bad code is not going to be what we should focus our time on. We probably need to do that. But if we don't fix the reason for that problem in the first place, it's just going to happen again. A really popular example of this is when we get approached to do a Rails upgrade on a very significant product that is very behind with Rails. First of all, it's very expensive to do that on a very significant project if there's no test coverage. People could hire us to spend and spend a lot of money just getting to the next Rails version. But if they do that and don't solve the reason why they were so behind with Rails and have no test coverage and all that stuff, along the way, it will have been wasted effort because in a year or in two years, it will be back to the way that it was before. And that's one example that's very technical. But that kind of stuff happens all the time, even with squishy things [laughs] like the structure of a team or something like that. So if you could give advice to people that are struggling with a particular problem, what would you tell them? And let's maybe make it a little bit more concrete. Like, one thing that can happen is as teams grow, like you said, not everyone can know everything. And so it starts breaking down into pods; maybe is one way to organize the team. And then you've gone into a bunch of individual teams working on discrete features. And that's happening fairly quickly. What are some ways to manage that change and manage that growth while maintaining continuity and making it go well? JOSH: I think a lot of it depends on the goals from the technical leadership in terms of areas of ownership. That'd be the first part that I would dive into, I think. We work with clients where they segregate front-end from back-end development. And that allows the teams to focus on React and TypeScript versus Ruby or Go or whatever their back end is written in. But if the goal is to share that knowledge, I think you've got options in terms of lunch and learn and shared code review and team demos and things like that. There are other ways to spread that information across the team so that everybody still has maybe not intimate knowledge of the code that's being written on a day to day basis, but they're at least aware of those patterns and practices and what each of the individual pods is may be responsible for and is delivering. So you have that team cohesion across more of the functional space, on the engineering side or on the product design side. CHAD: One thing that I think I would also add is that a lot of times, people take for granted how better developers will do their job if they understand the reason or the business drivers behind what they're working on. And it's really easy for people to take that for granted because it's like, there's a ticket to the ticket. It says what to do on the ticket. [laughs] JOSH: I have a blog post about this, actually. CHAD: [laughs] Okay, great. We'll put that in the show notes. But if someone doesn't understand the reason behind that, it's not going to go the way that you're expecting frequently. It's not as straightforward. JOSH: Yeah. You're left guessing what the underlying customer need is. And if you're guessing about the motivations, I don't want to say not in absolutes, but you're likely not going to address all of those core needs and implement an effective solution. I think in the blog post that I had written, ultimately, it was advocating for getting engineers to participate in customer interviews and really understand, like, how are people using the product that I am implementing features for? Because without that exposure, without seeing those pain points, oftentimes, it's okay, you've got a product designer or a product manager who's putting together this list of things to do. And if it's treated as a checklist or oh, I need to go implement XYZ without understanding why that needs to be done in the first place, what is the pain point? What is the customer-facing? How are they feeling as they're going through the product? Without that context and without that empathy, the solution is going to be...it might functionally work. But will it be a good user experience? Will it be a good customer experience? It's a little bit more shaky, I think. CHAD: Yeah. And in a fast-moving, fast-growing startup where everyone has a lot to do, if you're experiencing this kind of problem, it might manifest to you as stories get caught up at the beginning stages of when a developer is supposed to be working on them. And you find yourself having calls about what something is even supposed to be or supposed to do. And as the person who originated that ticket or originated that idea, you might have the feeling like, I can't believe we're having this conversation. Like, we don't have time to educate you about all the reasons why this is important and just please just do what we've said on the ticket. That is a natural reaction to that thing. And so my advice would be if you're feeling that, if your team is feeling that or something similar, there's probably something small you can do. It might not even be having developers participate in discovery or interviews or anything. It might be as simple as just making sure that on the ticket you say why it's important. If your ticket is a checklist of things to change or do, making sure that the reason why is communicated there will go a long way to having the person pick up that ticket, get the context necessary to understand, and make good decisions as they work on it. JOSH: Yeah, I remember the switch to the jobs to be done format. And I remember just being like, oh, [laughs] this makes a lot more sense because we can understand the context and the why. What is driving it? What is the problem there rather than what is the solution? And I think that shift in mindset does go a long way, like you said. CHAD: I think one of the ideas behind a well-functioning team is we talk about this idea of collaboration which is you feel like you're doing your best work, that things are moving quickly, and you're enjoying the people you're working with, and you're building upon each other's ideas, and you're making things better as a team. And I was recently talking to someone else, a candidate for VP of Engineering at one of our clients, and they were talking about flow, the idea of flow. And it wasn't a way that I had articulated it previously, but it's certainly another way of thinking about and a good way of thinking about it, especially when it comes to what is the role of a VP of engineering? Or what is the role of a CTO at a small company? Or what is the role of a development team or a product team in general? And one way to think about that is to work to maintain a flow state. And when we think about the processes that we have in terms of retrospectives where every week we gather, and we identify things that could be better, and we come up with action items, a lot of the things that drive what could be better or what we want to try to do differently are all identifying the things that take us out of the flow state and trying to fix that problem so that items flow from beginning to end smoothly, that they go from concept to production smoothly as quickly as possible, and that individual people know where the next item to take is that it's ready so they're not blocked as they begin it. And they're able to get that to staging, and get a pull request out, and get that reviewed quickly, get it to staging, get that reviewed quickly, and then deploy it to production. And in theory, even do a continuous deployment so that that whole flow is automated as much as possible. So this idea of flow resonated with me. Has it resonated with you? JOSH: Yeah, I agree. I remember seeing the comparisons people saying, okay, you're not actually looking for an engineer's passion necessarily. What you're looking for...and I come back to the hiring side of things because I'm doing that right now. But rather than looking to assess passion, it's assessing capacity and ability to get into a flow state more quickly. And obviously, so much of that is dependent on the team, and the communication style, the management style, and things like that. But flow is very much...I think once you get into that and you know how to get into that like you said, every waking moment is spent trying to optimize how do I get into this space? Because when you're in that space, when you're flowing, be it from an IC level or above, there's nothing quite like it. It's just this calm state of just everything feels like it's firing all the time perfectly, and it's good. And I think trying to make those spaces available for the rest of the team to get into that state and maintain that state makes a lot of sense. I remember years and years and years ago, there was the focus on maker versus manager time. And we talk about anchoring manager time either at the start of the end day or around lunchtime or whatever is a logical time for a break. The idea is to maintain that flow state for as long as possible so that nothing else eats into that. Because you do an hour of writing software, and then you've got a 30-minute one-on-one with a teammate. And then you go, and you run for another hour, hour and a half, and then it's another half an hour meeting. It's like you're being sucked away. It is really hard to get into that zone and then stay there. So I think there's been a focus on it for a while. And I'm really glad that there's now a name and a thing that we can point to. CHAD: I don't want to lead people astray about what Boost is. There's a big important part of Boost, which may not be immediately obvious to people, and that is design. I may have insinuated that design wasn't part of Boost before when we were talking about it, but it is. And it's designed on existing products and existing teams which is a different need than going from concept to launch of a new idea. JOSH: So we had done some work with The New England Journal of Medicine. And their team, a very small team, internal team, had basically designed an application. And they ran into a number of accessibility and usability issues. They continued to hear feedback from a lot of folks saying, "This is not effective for what we're looking to do." And they'd engaged us in a couple of different times basically to rip apart and re-architect some of the application hierarchy and the usability side of things. It's been really interesting to see okay, well, within the design side of operating within existing products, it's often lended or leaned more towards doing some amount of a design audit and usability audit, talking to customers. And less around we're going to start from scratch and more what are some of these iterative improvements that we can make to make the product more accessible, easier to understand, easier to navigate, easier to use within what is, again, these very large platforms sometimes? CHAD: I know one common request we get is we're thinking about implementing a design system or introducing a design system with the first version of the product. And we're having this growing pain around introducing new features. Is a design system the right thing to do there? That's a request we sometimes get. JOSH: Yeah. And I think a lot of it at the end of the day, what we're looking to assess is what are the knowns? How much do we know about the application, about the interface? We talk about on the software development side of things avoiding premature abstraction, and I think the same thing is true about design systems. Like, if we're going through a product, maybe it's a wizard, and apart from forms, the pages are individualized, and there's not really any common patterns. It's like, okay, well, maybe now it doesn't make sense. But when you've got an application that spans hundreds of pages, there are going to be patterns across the different pages in terms of application hierarchy and componentization and things like that. And the work that we're oftentimes brought in to do is let's assess what's there, figure out what are the common patterns here. And it's almost like refactoring and teasing things apart to where we get slight...it's a reduction in code use or rather an increase in code reuse because we're removing some of the idiosyncrasies that maybe were not teased apart into some component-based system. And that's fun work. [chuckles] It's really interesting. You get things like React when you're doing client-side rendering. And within the Rails side of things, there's a big push for the GitHub ViewComponent. RubyGem is another example. It's both ways to introduce these layers of abstraction that allow more of the engineering team to take on more of the application development, not because design isn't necessary, but they're then empowered to reuse these logical set of components. And so it amplifies the dev work, but it also amplifies the design work because the entire team is now leaning on that pre-baked work. It enables designers to shift focus and priorities to okay; what are new components? What are different ways to position this or present this information? And also, for our designers, it frees up their time to talk even more to customers, to people using the system. CHAD: Well, I guess we'd be remiss if we didn't do a more blatant plug. You mentioned it earlier, but we do have an opening for Design Director on the Boost team. JOSH: We do. CHAD: So who would be a good fit for that role? JOSH: That's a great question. I think a couple of the things that we're really focusing on for this role is someone who has done the work, so to speak, at an IC level for a lot of the work that we're doing right now with customers. And so we ask point-blank on the application sheet, have you worked in HTML and CSS? Have you facilitated design exercises like design sprints? Have you facilitated user interviews? Because so much of what we're seeing from a vision and a strategy perspective is we need to take and leverage these tools in the skill sets that our teams are looking to hone in on, and we want to take it a lot further. I think there's a big opportunity there. So I think it's less around years of experience. I wouldn't say you need to have 15 years of management experience or having been a director in order to apply for the role. But it's someone that can empathize with the team and has some opinions and some thoughts in terms of okay, what is design? What is not only visual design but product design accessibility? What does that look like in the next 5 to 10 years? Those are the people that I would love to see apply. CHAD: If someone's interested, where's the best place for them to do that? JOSH: thoughtbot.com/jobs. And the listing is there. CHAD: So what's next for Boost, Josh? What do you have your sights set on as we wrap up 2021 and head into the next year? JOSH: Oh boy. A lot of where the focus has been on this year is continuing to double down on Rails as the technology stack and get our feet wet, not that our feet aren't wet, [chuckles] continue to invest on the front end with React. I think for 2022, I think the big focus...we've run in the past some pretty successful custom trainings workshops for engineering teams. I think one that we had done earlier was late last year into early this year. We ran about 120 or so of their engineers through a custom RSpec course. So we worked with their engineering managers and some of their teams and got a sense of okay; given this codebase and given the skill sets of this 100-plus person engineering team, where should we focus? And we put together a two-day RSpec workshop. We administered over; I think, five or six weeks. We did it virtually. And the reception from that was incredible. They ended up bringing us back on. We're getting ready to start another round of consulting work where we're embedding alongside their teams. So I see that as a huge opportunity for Boost coming into next year. And then I think one of the things that we've been pushing for is reducing some of the billing time from folks in leadership positions so that they're in a better position to support their designers and developers. And I'm really excited about the progress that we've made thus far. And I'm excited to continue carrying that into next year. CHAD: Awesome. Well, thanks for taking the time to talk to me. JOSH: Thank you. CHAD: Part of this new season, Season 11 of the podcast, for the next few episodes, I'm going to be talking to each of the managing directors at thoughtbot about their teams, about the different kinds of work we do on those teams, and the challenges, and what phases are clients in those different stages of the product lifecycle. So you can subscribe to the show and find notes for this episode and all the other episodes at giantrobots.fm. If you have questions or comments, email us at hosts@giantrobots.fm. You can find me on Twitter @cpytel. Josh, if folks want to get in touch with you or follow along with you, what are the best places for them to do that? JOSH: Definitely Twitter. My handle is @joshuaclayton, all one word. CHAD: Awesome. Thanks again. This podcast is brought to you by thoughtbot and produced and edited by Mandy Moore. Thanks for listening and see you next time. Special Guest: Joshua Clayton.