📄 Page
1
Milecia McGregor Full Stack JavaScript Strategies The Hidden Parts Every Mid-Level Developer Needs to Know
📄 Page
2
ISBN: 978-1-098-12225-6 US $65.99 CAN $82.99 WEB As a working software developer, you know how to complete your tasks with solid code, whether it’s on the frontend or backend. Now you’re ready to move to the next level in your career, and you need to develop the skills that distinguish senior developers as authorities on the entire system. This practical book shows you everything it takes to create a full stack web application hosted on a cloud platform. Senior staff engineer Milecia McGregor helps you see how the whole system works—and how senior developers arrive at technical decisions. You’ll learn design and development principles and when to apply them. You’ll also discover strategies for working with different teams and understand how the product team makes its decisions. In four parts, this book shows you how to: • Translate designs into tasks and ask technical and product questions that will lead to success • Make backend architecture decisions that address considerations like scalability, security, and third-party services • Build the project’s user interface while handling state and data management, performance, and other concerns associated with frontend apps • Integrate the frontend, backend, and other systems and deploy a full stack app to production Milecia McGregor is a senior software engineer who’s worked with JavaScript, React, Node.js, Python, SQL, AWS, and many other tools to build web apps. She’s had her own businesses, spoken internationally at a number of tech conferences, and worked in roles ranging from frontend developer to associate engineering director. Full Stack JavaScript Strategies “Full Stack JavaScript Strategies is a game-changer for mid-level developers. Milecia McGregor delivers clear insights to help people master the challenges of full stack development in the world’s most popular programming language, JavaScript. A must-read for leveling up your career.” Gant Laborde, DTM, O’Reilly author, and mad scientist “If you’re a full stack developer feeling overwhelmed by the enormous number of tools, techniques, and processes you need to understand to advance your career, you owe it to yourself to read this book. Milecia McGregor offers a wealth of practical advice on the most complex technical topics and critical soft skills that will help you stand out in an increasingly competitive field.” Ethan Brown, OptionLab
📄 Page
3
Milecia McGregor Full Stack JavaScript Strategies The Hidden Parts Every Mid-Level Developer Needs to Know
📄 Page
4
978-1-098-12225-6 [LSI] Full Stack JavaScript Strategies by Milecia McGregor Copyright © 2025 The Milecia C. McGregor Living Trust. All rights reserved. Printed in the United States of America. Published by O’Reilly Media, Inc., 1005 Gravenstein Highway North, Sebastopol, CA 95472. O’Reilly books may be purchased for educational, business, or sales promotional use. Online editions are also available for most titles (http://oreilly.com). For more information, contact our corporate/institutional sales department: 800-998-9938 or corporate@oreilly.com. Acquisitions Editor: Amanda Quinn Development Editor: Virginia Wilson Production Editor: Christopher Faucher Copyeditor: Shannon Turlington Proofreader: Vanessa Moore Indexer: Ellen Troutman-Zaig Interior Designer: David Futato Cover Designer: Karen Montgomery Illustrator: Kate Dullea January 2025: First Edition Revision History for the First Edition 2025-01-09: First Release See http://oreilly.com/catalog/errata.csp?isbn=9781098122256 for release details. The O’Reilly logo is a registered trademark of O’Reilly Media, Inc. Full Stack JavaScript Strategies, the cover image, and related trade dress are trademarks of O’Reilly Media, Inc. The views expressed in this work are those of the author and do not represent the publisher’s views. While the publisher and the author have used good faith efforts to ensure that the information and instructions contained in this work are accurate, the publisher and the author disclaim all responsibility for errors or omissions, including without limitation responsibility for damages resulting from the use of or reliance on this work. Use of the information and instructions contained in this work is at your own risk. If any code samples or other technology this work contains or describes is subject to open source licenses or the intellectual property rights of others, it is your responsibility to ensure that your use thereof complies with such licenses and/or rights.
📄 Page
5
Table of Contents Preface. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii Part I. Starting Your New Project 1. Kicking Off the Project. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 The Project You’ll Build 3 Project Kickoff Meeting 4 Design Considerations 8 Data-Driven Design 10 Breaking Down Designs into Tasks 10 Refining Tasks from Feature Requirements 11 Discussing Timelines with Product and Other Teams 13 Talking to Other Development Teams 14 Coordinating with DevOps 15 Working with QA 17 Planning with Support 18 Conclusion 20 Part II. Building the Backend 2. Setting Up the Backend. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Why NestJS? 23 Choosing a Project Approach 24 Setting Up NestJS 25 Testing the Backend Locally 27 iii
📄 Page
6
Updating the README 28 Adding a CHANGELOG 29 Monolith and Microservice Architectures 30 Alternative Architectures to Consider 32 Selecting an API Design Pattern: REST and GraphQL 33 Conclusion 35 3. Building the Data Schema. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Initial Considerations 38 Diagramming the Data Schema 39 Setting Up Postgres 41 Deciding What ORM to Use 43 Writing Migrations 46 Seeding the Database 47 Conclusion 50 4. REST APIs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 Making Sure the Frontend and Backend Agree 52 Creating a Document for Conventions 53 Making the API and First Endpoint 55 Creating the Orders Endpoints 56 Working on the Orders Service 58 Checking the Database Connection 59 Conclusion 60 5. Third-Party Services. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 Choosing a Third-Party Service 62 List of Potential Services 63 Integrating Stripe 65 Writing the Controller 67 Writing the Service 69 Conclusion 71 6. Background Jobs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 Updating the Backend Architecture 74 Using Cron Jobs 76 Alerts and Monitoring 78 Logging 79 Issues with Data Sync and Task Execution 79 Future Considerations 80 Conclusion 80 iv | Table of Contents
📄 Page
7
7. Backend Testing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 Why Spend the Time on Tests 81 How to Approach Test Writing 83 Mock Data 88 Conclusion 90 8. Backend Security Considerations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 Authentication 92 Authorization 93 OWASP Top 10 97 Other Noteworthy Practices 99 Conclusion 101 9. Backend Debugging. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 Detailed Log Messages 104 Environment Configurations 110 Strategies for Tracing Bugs 111 Helping Other Devs Debug 114 Debugging Checklist 115 Conclusion 117 10. Backend Performance. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 Metrics 120 Alerts and Monitoring 124 Caching 125 Cache Strategies 127 Types of Caching 129 Cache Implementation with Redis 130 Product Considerations 132 Conclusion 133 11. Scalability Considerations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 Types of Scaling 135 Vertical Scaling 136 Horizontal Scaling 136 Hybrid Scaling 137 Resource Scaling 137 Scaling Best Practices 138 Make a Plan 138 Document the Plan 139 Run Tests 140 Table of Contents | v
📄 Page
8
Communicate Progress 141 Start Shifting Traffic 142 Conclusion 143 12. Monitoring, Logging, and Incident Handling. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 Uses for Logs and Monitoring 146 Use Logs for Debugging 146 Use Monitoring to Inform Your Actions 148 Monitoring and Logging Tools 148 Incident Playbooks 152 Playbook Stages 153 Incident Response Template 155 Blameless Postmortems 156 Conclusion 157 Part III. Building the Frontend 13. Setting Up the Frontend. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 Frontend Architecture Decisions 162 Choosing a Frontend Framework 165 App Setup Options 167 Common Components 167 Choosing Packages 167 Working with Other Teams 169 Conclusion 170 14. Building the React App. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 Set Up the Initial React App 172 Set Up Linters and Formatters 172 Set Up the Build Configs 175 Set Up Styles 176 Set Up Testing 178 Set Up CHANGELOG and README 179 Run the App Locally 180 Build the First Feature 181 Project Structure 181 Set Up Routing 183 Update the Root of the App 183 Conclusion 185 vi | Table of Contents
📄 Page
9
15. State Management. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 How Component State Works 188 useState 188 useReducer 189 useContext 190 Knowing What App Level to Manage State In 191 Different Approaches to State Management 192 Setting Up the State Manager 193 Conclusion 196 16. Data Management. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 Potential Tools for Fetching Data 198 Handling API Calls with Axios and TanStack Query 199 The .env File 200 Handling Loading States 203 Handling Error States 204 Configuring Request Headers 205 When to Check on Backend Functionality 206 Conclusion 207 17. Custom Styles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 Accessibility 209 Making an Accessible Form 210 Checking Your Accessibility Implementations 213 More Accessibility Considerations 215 Consistent Designs 215 Custom Themes 216 Responsive Design 217 Conclusion 219 18. Frontend Error Handling. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 Error Boundary Approaches 222 Error Components 224 Logging Errors 227 User Validation Errors 228 API Errors 230 Conclusion 232 19. Frontend Security Considerations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 Common Vulnerabilities 234 Business Logic Validation 234 Table of Contents | vii
📄 Page
10
Session Management 235 Package Version Maintenance 236 Input Validation 237 Other Principles 239 How to Check Your Own App 239 Conclusion 240 20. Frontend Performance. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 Benchmark Metrics 242 Lighthouse Tools 242 Sitespeed.io 246 Areas for Improvement 247 Bundle Size Analysis 248 Build Configurations 249 Caching Configuration 250 Lazy Loading 252 Prefetching 254 CSS, Images, and Fonts 254 Conclusion 255 21. Frontend Testing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257 Determining Test Scenarios 258 Unit Tests 258 Jest and React Testing Library 259 Vitest 259 Mock Service Worker 262 E2E Testing with Cypress 264 Conclusion 266 22. Frontend Debugging. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267 The Debugging Process 268 Looking Through Logs 268 Checking the Code 270 Using console.log Messages 271 Using Breakpoints 272 Using Unit Tests 272 Using Git 273 Using the Browser Devtools 274 The Elements Tab 274 The Sources Tab 277 The Network Tab 279 viii | Table of Contents
📄 Page
11
The Application Tab 281 Debugging in Other Environments 282 Debugging in Unexpected Places 283 Conclusion 284 Part IV. Deploying the Full Stack App 23. Full Stack Deployment Setup. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287 Teams Involved in Deploys 288 Backend and Frontend Connection Steps 289 Backend Steps 289 Frontend Steps 293 Cleanup Steps 295 Documentation and Maintenance Steps 296 Conclusion 297 24. Integration Testing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 The Test Cases 300 End-to-End Tests with Cypress 300 End-to-End Tests with Playwright 302 End-to-End Tests with Nightwatch 308 Comparison Between Packages 311 Conclusion 312 25. Making Deployments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315 Deploying Frontend-Only or Backend-Only Updates 316 Deploy Strategies 317 Release Dates 317 Version Releases 320 Blue-Green Deploys 321 Canary Deploys 322 Strategies for Doing Rollbacks 323 Deploying Older Versions 323 Reverting or Resetting PRs 324 Deploying a Hotfix 327 Conclusion 328 26. Integration Concerns. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329 Frontend and Backend Concerns 330 Third-Party Service Concerns 331 Table of Contents | ix
📄 Page
12
Data and Security in Production 333 Containerization of Your App 334 Conclusion 339 27. Building a CI/CD Pipeline. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341 Creating Your Own Pipeline 342 Speed Considerations 343 Git Hooks 344 GitHub Configs 348 CircleCI Configs 350 Environment Pipelines 358 Feature Environment 358 Development Environment 358 Staging Environment 358 Production Environment 359 Environment Variables 359 Conclusion 361 28. Git Management. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363 Branching Strategies 364 Common Branches and Merge Flow 364 PR Reviews 365 Branches for Smaller Functionality 366 Feature Branches for Larger Implementations 367 Squashing Commits 368 Rebasing and Merging Branches 372 Handling Merge Conflicts 375 Discuss with the Dev Who Made Changes 376 Use git bisect to Find the Affected Files 377 Manually Compare File Changes 378 Conclusion 379 29. Project Management. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381 Sprint Discussions 382 Estimates 382 Dev Capacity 383 Feature Requirements 384 Dev Team Ticket Review 387 Roadmaps 389 Defining and Managing Tasks 391 Maintain Team Awareness 391 x | Table of Contents
📄 Page
13
Write and Clarify Tickets 392 Consider Overhead Tasks 393 Pace Yourself 394 Manage Context Shifting 395 Keep Communication Open 396 Conclusion 397 30. Understanding the Business Domain. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399 Domain-Specific Knowledge 400 Learn from People Working Directly in the Domain 401 Take Courses 401 Work in the Domain 402 Architectural and System Design Decisions 402 Domain-Driven Design 403 C4 Design 405 Learning from Other Teams 406 Get on Sales Calls 406 Join User Research Studies 407 Talk to Marketing 407 Listen in on Customer Support Calls 408 Learn About Legal 408 Documentation Considerations 409 Define Jargon 409 Only Keep Relevant Info 409 Share Your Knowledge 410 Show How the Product Affects the Organization 410 Conclusion 410 31. Working on Different Types of Projects over Your Career. . . . . . . . . . . . . . . . . . . . . . . 413 Considerations for Brand-New Apps 414 Understand the Problem You’re Trying to Solve 414 Build the Data Schema 415 Decide on an Architecture 416 Pick Your Cloud Provider 416 Build the Backend 417 Build the Frontend 417 Integrate the Backend and Frontend 417 Set Up Your CI/CD Pipeline 418 Perform QA Testing 418 Check Your App in Production 419 Considerations for Existing Apps 419 Table of Contents | xi
📄 Page
14
Get Access to the Services You Need 419 Get a Dev Instance Running 420 Look at the App in Production 420 Look at the App in Nonproduction 420 Read Through the Code 421 Take Notes About Potential Refactors 421 Ask Questions and Document the Answers 422 Improve the Code Quality 422 Add Tests 423 Learn What Different Alerts Mean 424 Your Career 424 The Technical Path 425 The Management Path 426 Professional Journal 428 Moving to Other Areas 429 Conclusion 430 Index. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433 xii | Table of Contents
📄 Page
15
Preface My goal with this book is to give you a reference—kind of a sanity check—for when you’re working on either greenfield or legacy projects across the frontend and back‐ end and handling deployments. Some questions are relevant for both types of projects, like how you’ll handle testing, performance, and security. Many applications have core commonalities that you can use regardless of the industry you work in. When those moments come where you find yourself questioning why you’ve never heard of something, hopefully this book will make you feel more confident asking those “simple” questions. Who This Book Is For If you are trying to figure out how senior devs seem to magically know how every‐ thing works and how they understand complex concepts so quickly, I’m going to show you how. At this point in your career, you’ve probably been working as a software developer for a few years. You know how to complete your tasks with solid code regardless of whether it’s on the frontend or backend. While you may have some knowledge across the full stack, it’s likely you focus on one part of the stack over the other. On the frontend, you should be familiar with making responsive layouts, fetching data from APIs, and using some of the frameworks, such as React, Astro, or Svelte. On the back‐ end, you’ve done some database migrations, built some APIs, and handled some basic authentication flows. You also have skills like using Git with any of the repo hosting services, such as Git‐ Hub or GitLab, and using different tools to test your changes. You may have worked on one project for years, or you may have hopped around projects, but the scope of your work has typically fallen under some of the concepts mentioned. xiii
📄 Page
16
Now you’re ready to move to the next level in your career. That means learning how the whole system works and why technical decisions are made. That’s what will be covered in this book. What You Will Learn At the highest level, what you’re going to learn in this book is everything it takes to create a full stack web application hosted on a cloud platform. You’re going to learn how to find where the business logic for every app comes from. You’re going to gain some intuition for how to decide between different architectures, third-party services, and tools to create a maintainable application. You’re going to learn the subtle yet deep skills it takes to become a senior developer. This book is going to give you strate‐ gies for working with different teams and understanding how product decisions are made. You’ll also deepen your existing skills to cover the full stack confidently. Regardless of whether you start on the frontend or backend, you’re going to learn about design and development principles and when to apply them. You’ll learn all these things as you go through the software development lifecycle (SDLC) of a project in this book and build a production-like application. Think of this book as a reference you can pick up at any point in the SDLC and use as a checklist. You will learn all the essential parts that need to be considered for app development so that you know exactly what to do when a question comes up. By the time you finish, you’ll know how, why, and when to make technical decisions and how the business requirements evolve. What This Book Is Not This book is not a deep dive into any specific set of tools, and it will not teach you general JavaScript programming. A large range of topics will be covered in this book, with accompanying examples to demonstrate senior-level considerations, but it is expected that you know how to read code, debug issues, and find additional learning resources. Since so many topics are covered, strategies will be discussed along with the code. These strategies are meant to be tools you can bring to any project you work on, although they may not work on every project. There isn’t a single approach that would work for any two projects because everything has its own nuances. So the goal is to give you a number of options you can choose from as needed. xiv | Preface
📄 Page
17
Some parts of the book will need a much deeper explanation than a chapter or section can provide. No book can adequately cover all the topics presented here, and I want to make sure you get all the information you need. So while some topics will be light on the full implementation details, there will always be links to complementary resources. How This Book Is Organized Part I, “Starting Your New Project”, will be relatively short and will cover how you translate designs into tasks and questions that you’ll have to ask the Product team and other teams. This is when you’ll get your first introduction to where the business logic comes from. Part II, “Building the Backend”, focuses on creating the backend of this project. You’ll work with NestJS as we walk through a number of considerations, like security and third-party services, for development. After you have the backend ready, you’ll switch over to Part III, “Building the Front‐ end”, where you’ll work with a React project. You’ll build the UI for this project and cover concerns associated with frontend apps, such as responsiveness and perfor‐ mance. Finally, in Part IV, “Deploying the Full Stack App”, you’ll dive into the details of con‐ necting the frontend, backend, and other systems to build and deploy a full stack app to production. By the time you finish this book, you should feel comfortable jumping into any part of a project and asking questions that will help clarify tasks as well as provide technical advice. You’ll notice that each part of the book varies in length. That’s because it’s supposed to help break down where a lot of time really gets spent during development. Some parts of a project take more time than others or have different feedback cycles. This book is trying to reflect real-world conditions as closely as possible. To add to the real-world feel of this book, I’ve incorporated some opinions and thoughts from other software engineers throughout the chapters. Ethan Brown is the founder of OptionLab and author of Learning JavaScript, 3rd Edition (O’Reilly) and Web Development with Node and Express, 2nd Edition (O’Reilly). Jeff Graham is the Head of Engineering at Proxima AI and previously worked in financial technology (fintech), education technology (edtech), media, and ecommerce. Preface | xv
📄 Page
18
Conventions Used in This Book The following typographical conventions are used in this book: Italic Indicates new terms, URLs, email addresses, filenames, and file extensions. Constant width Used for program listings, as well as within paragraphs to refer to program ele‐ ments such as variable or function names, databases, data types, environment variables, statements, and keywords. Constant width italic Shows text that should be replaced with user-supplied values or by values deter‐ mined by context. This element signifies a tip or suggestion. This element signifies a general note. This element indicates a warning or caution. Using Code Examples Supplemental material (code examples, exercises, etc.) is available for download at https://github.com/flippedcoder/dashboard-web and https://github.com/flippedcoder/ dashboard-server. If you have a technical question or a problem using the code examples, please send email to support@oreilly.com. This book is here to help you get your job done. In general, if example code is offered with this book, you may use it in your programs and documentation. You do not need to contact us for permission unless you’re reproducing a significant portion of the code. For example, writing a program that uses several chunks of code from this xvi | Preface
📄 Page
19
book does not require permission. Selling or distributing examples from O’Reilly books does require permission. Answering a question by citing this book and quoting example code does not require permission. Incorporating a significant amount of example code from this book into your product’s documentation does require per‐ mission. We appreciate, but generally do not require, attribution. An attribution usually includes the title, author, publisher, and ISBN. For example: “Full Stack JavaScript Strategies by Milecia McGregor (O’Reilly). Copyright 2025 Milecia McGregor, 978-1-098-12225-6.” If you feel your use of code examples falls outside fair use or the permission given above, feel free to contact us at permissions@oreilly.com. O’Reilly Online Learning For more than 40 years, O’Reilly Media has provided technol‐ ogy and business training, knowledge, and insight to help companies succeed. Our unique network of experts and innovators share their knowledge and expertise through books, articles, and our online learning platform. O’Reilly’s online learning platform gives you on-demand access to live training courses, in-depth learning paths, interactive coding environments, and a vast collection of text and video from O’Reilly and 200+ other publishers. For more information, visit https://oreilly.com. How to Contact Us Please address comments and questions concerning this book to the publisher: O’Reilly Media, Inc. 1005 Gravenstein Highway North Sebastopol, CA 95472 800-889-8969 (in the United States or Canada) 707-827-7019 (international or local) 707-829-0104 (fax) support@oreilly.com https://oreilly.com/about/contact.html We have a web page for this book, where we list errata, examples, and any additional information. You can access this page at https://oreil.ly/full-stack-javascript. For news and information about our books and courses, visit https://oreilly.com. Preface | xvii
📄 Page
20
Find us on LinkedIn: https://linkedin.com/company/oreilly-media. Watch us on YouTube: https://youtube.com/oreillymedia. Acknowledgments First, I’d like to thank my grandma, Carol Matthews, for listening to me endlessly rant about writing this book for the past 2 years. Any time I needed to vent, she was always there. I want to thank all of the people I’ve worked with at O’Reilly that have made this experience so smooth. Virginia Wilson, I couldn’t have made it through all of the edits and feedback without you! Amanda Quinn, thank you for handling all of the behind-the-scenes things and coordinating with everyone! A big, big thank you to Ethan Brown for all of the very thoughtful, thorough feedback you gave me over the course of writing this book. I learned a lot from your comments and resources you showed me. Another thank you to Adam Scott for all the feedback and suggestions throughout the book. I also want to thank my sister, Soleil Gibbs, and close friends for listening to me talk about this book when I was low on energy or I ran into a difficult section. They helped me push through when I really didn’t want to. Another huge source of motiva‐ tion was my husband who gave me the time and space I needed to get through this journey. This definitely wasn’t a solo process and I couldn’t be more thankful for everyone that was a part of this journey, in big and small ways. xviii | Preface