173 slides extracted.
Slide 1 — 0:08 (watch)
![]() | Welcome to the Bug Bash podcast, where we discuss software correctness and reliability. I’m your host, David Nguyen. |
Slide 2 — 0:36 (watch)
Slide 3 — 1:02 (watch)
Slide 4 — 1:14 (watch)
![]() | Welcome, Lewis. Could you please introduce yourself? |
Slide 5 — 1:20 (watch)
![]() | Hello, my name is Lewis Campbell. I run a small consulting company called Outdata. |
Slide 6 — 1:38 (watch)
Slide 7 — 1:54 (watch)
![]() | I believe the tagline I read stated that you were one of the first consultants to apply deterministic simulation testing to legacy codebases. Is that correct? |
Slide 8 — 2:14 (watch)
Slide 9 — 2:30 (watch)
![]() | We didn't want to spread that across the internet and investigate potential failure conditions for that property. |
Slide 10 — 2:52 (watch)
Slide 11 — 3:08 (watch)
Slide 12 — 3:32 (watch)
Slide 13 — 4:02 (watch)
Slide 14 — 4:24 (watch)
Slide 15 — 4:46 (watch)
Slide 16 — 5:30 (watch)
Slide 17 — 5:54 (watch)
Slide 18 — 6:34 (watch)
Slide 19 — 7:20 (watch)
![]() | What do we mean by schema? I can generate a schema file and feel proud of it, but then I often find myself unsure of its purpose. |
Slide 20 — 7:40 (watch)
Slide 21 — 8:02 (watch)
Slide 22 — 8:22 (watch)
![]() | You have an entry point into your application, so it's essential to know what data is coming in. A blob of JSON can propagate throughout the entire system. |
Slide 23 — 8:36 (watch)
Slide 24 — 9:08 (watch)
Slide 25 — 9:50 (watch)
Slide 26 — 10:04 (watch)
![]() | You can reason about those small sections of code, which clarifies the overall structure significantly. These sections can expand and eventually integrate with one another. |
Slide 27 — 10:16 (watch)
Slide 28 — 10:24 (watch)
![]() | I'm going to focus on React, as it remains one of the most popular frameworks. |
Slide 29 — 10:30 (watch)
![]() | In a React project, you'll find numerous TSX files, with most of the code contained within these files. |
Slide 30 — 10:34 (watch)
![]() | A component is an element that renders to the screen and often performs fetch calls. |
Slide 31 — 10:46 (watch)
Slide 32 — 10:54 (watch)
![]() | The islands of determinism are often found in your top-level, front-facing components. |
Slide 33 — 11:00 (watch)
![]() | Remove them from the component, as they are difficult to test and create complications. |
Slide 34 — 11:08 (watch)
![]() | Remove those elements, and as you do, you'll often discover repeated business logic or opportunities to group related components together. |
Slide 35 — 11:14 (watch)
![]() | I would start with that approach on a typical React project. |
Slide 36 — 11:20 (watch)
![]() | Does it have a particular look or feel, or is there a signature style to it? |
Slide 37 — 11:52 (watch)
Slide 38 — 12:18 (watch)
![]() | I'm trying to determine where to start when I encounter a different application. Should I begin at the index? |
Slide 39 — 12:32 (watch)
Slide 40 — 12:50 (watch)
Slide 41 — 13:10 (watch)
Slide 42 — 13:20 (watch)
![]() | I could be mistaken, and I'm sure Haskell will correct me if I am. |
Slide 43 — 13:24 (watch)
![]() | We also have the hexagon architecture, created by Alistair Cockburn. He is a signatory of the Agile Manifesto, but like everyone, he has made mistakes. |
Slide 44 — 13:34 (watch)
Slide 45 — 13:48 (watch)
Slide 46 — 14:04 (watch)
![]() | There is likely a neighboring abstraction we can borrow from, as starting with "find all the monads" is probably not the right approach. |
Slide 47 — 14:14 (watch)
![]() | We probably can't start with finding all the monads, but I think most people understand that. I'll continue to focus on React. |
Slide 48 — 14:22 (watch)
![]() | Most people understand that React components are difficult to test. |
Slide 49 — 14:30 (watch)
Slide 50 — 14:40 (watch)
![]() | They contain code for business logic, which we can create to make testing straightforward. This approach allows our components to become very simple. Most people intuitively understand this concept. |
Slide 51 — 15:00 (watch)
Slide 52 — 15:36 (watch)
Slide 53 — 16:06 (watch)
![]() | Which approach do you take? I prefer to build from the bottom up. Small unit tests serve as sanity checks. Remember, don't let perfect be the enemy of good. |
Slide 54 — 16:22 (watch)
Slide 55 — 16:38 (watch)
Slide 56 — 16:56 (watch)
Slide 57 — 17:08 (watch)
![]() | To break down the problem, consider a typical component. |
Slide 58 — 17:20 (watch)
![]() | Consider a typical component that comes to mind. Let's walk through how we would build from there if we encounter a codebase that is otherwise messy. However, we have cleared out the clutter. |
Slide 59 — 17:30 (watch)
![]() | Now we're focusing on the piece we've created, our little island of determinism. What is the first step we take from this foundation? |
Slide 60 — 17:48 (watch)
Slide 61 — 18:06 (watch)
![]() | People will intuitively understand this concept. It involves considering actions at the component level. For example, when a user clicks a button, we need to determine what will happen next. |
Slide 62 — 18:18 (watch)
![]() | You should consider various scenarios of user interactions with the component and determine the expected outcomes. Ensure that these outcomes make sense to you. |
Slide 63 — 18:24 (watch)
![]() | Once you're finished, you can start randomizing the inputs. This is similar to the concept of a thousand monkeys at a thousand typewriters. |
Slide 64 — 18:34 (watch)
![]() | You can't predict user behavior; they will always surprise you. This unpredictability is what property-based data simulation is all about—it's like simulating the monkeys at the typewriters. |
Slide 65 — 18:52 (watch)
Slide 66 — 19:12 (watch)
Slide 67 — 19:32 (watch)
Slide 68 — 19:54 (watch)
Slide 69 — 20:06 (watch)
![]() | You will receive feedback, but ultimately, you cannot ignore it indefinitely. |
Slide 70 — 20:20 (watch)
Slide 71 — 20:28 (watch)
![]() | I don't receive much pushback. |
Slide 72 — 20:38 (watch)
Slide 73 — 20:56 (watch)
Slide 74 — 21:16 (watch)
![]() | Those situations can be challenging. Consider someone who has one eyebrow raised, looking at you with a notepad, as if to say, "What do you mean?" |
Slide 75 — 21:26 (watch)
![]() | Consider thinking about their first experience. |
Slide 76 — 21:38 (watch)
Slide 77 — 22:02 (watch)
Slide 78 — 22:40 (watch)
Slide 79 — 23:14 (watch)
Slide 80 — 23:32 (watch)
![]() | I haven't encountered anyone who has been difficult to my face. I try to meet people where they are, considering their diverse experiences, preferences, and biases regarding programming. |
Slide 81 — 24:00 (watch)
Slide 82 — 24:24 (watch)
![]() | We utilized various units and integrations. For more details, you can refer to Louis's blog post on the topic. |
Slide 83 — 25:00 (watch)
Slide 84 — 25:36 (watch)
![]() | Have there been any challenges along that path? Yes, I understand your point. In my experience, determining the right course of action has become fairly straightforward over the years. |
Slide 85 — 25:46 (watch)
![]() | Sometimes, there is so little substance that it becomes very challenging to extract something non-deterministic. |
Slide 86 — 26:02 (watch)
Slide 87 — 26:40 (watch)
Slide 88 — 27:16 (watch)
![]() | Changing your database may not make you popular. It’s not exactly a way to make friends and influence people, so you need to pick your battles wisely. However, we are discussing correctness here. |
Slide 89 — 27:26 (watch)
![]() | You've stated, and I believe I just heard you say, that you should never use a stored procedure. |
Slide 90 — 27:32 (watch)
![]() | Those were your words, not mine. |
Slide 91 — 27:38 (watch)
![]() | If not, let me put it another way. |
Slide 92 — 27:48 (watch)
Slide 93 — 27:56 (watch)
![]() | That's what I want to emphasize. It's a significant point. |
Slide 94 — 28:18 (watch)
Slide 95 — 28:40 (watch)
![]() | Let's slow down a bit. |
Slide 96 — 28:44 (watch)
![]() | I won't go into detail about key-value stores. |
Slide 97 — 28:58 (watch)
Slide 98 — 29:20 (watch)
Slide 99 — 30:00 (watch)
Slide 100 — 30:44 (watch)
Slide 101 — 31:26 (watch)
Slide 102 — 32:00 (watch)
![]() | There can be political challenges when addressing certain parts of the system. In my experience, this resistance often comes from individuals who are more entrenched in the company. |
Slide 103 — 32:22 (watch)
Slide 104 — 33:08 (watch)
Slide 105 — 33:46 (watch)
![]() | You have to be pragmatic. This reminds me of a software development shop I was familiar with. |
Slide 106 — 34:20 (watch)
Slide 107 — 35:04 (watch)
Slide 108 — 35:44 (watch)
Slide 109 — 36:12 (watch)
![]() | Or, do you bike? Ah, Karen elegies, it's the old Slashdot classic. |
Slide 110 — 36:24 (watch)
![]() | I try to get by, and you remember Slashdot. Just hearing it mentioned gave me five more gray hairs. Anyway, you were saying. |
Slide 111 — 36:38 (watch)
![]() | As I develop, I make it a point to share my progress with others. I often say, "Hey, look, I created this test." I explain how this test addresses the bug we've been experiencing. |
Slide 112 — 36:52 (watch)
![]() | I fix the bug, and the test is no longer needed. I also take a unit test and generalize it. |
Slide 113 — 36:58 (watch)
![]() | I created a parameterized test, and it fails when the input is NaN, an empty string, negative one, epsilon, negative infinity, or other edge cases. |
Slide 114 — 37:10 (watch)
Slide 115 — 37:38 (watch)
Slide 116 — 38:10 (watch)
![]() | This may sound like a cop-out answer, but I believe it's essential to ensure that the path to water is clear. We should leave signs indicating the direction to the water. |
Slide 117 — 38:38 (watch)
Slide 118 — 39:40 (watch)
Slide 119 — 40:36 (watch)
![]() | Transcribe technical terms, library, product, and command names accurately, ensuring correct casing and punctuation. Likely terms include llama.cpp, PyTorch, NGINX, CUDA, WebAssembly, and Antithesis. |
Slide 120 — 41:00 (watch)
![]() | I implemented a simple queue, but it immediately failed. |
Slide 121 — 41:08 (watch)
![]() | I am fully committed to randomized testing. I consider these principles in my development process. |
Slide 122 — 41:16 (watch)
![]() | My solution failed immediately. I don't believe many people can write code that works perfectly on the first attempt. |
Slide 123 — 41:26 (watch)
![]() | The state space of all the possible things that can go wrong is essentially a matter of basic combinatorics, to paraphrase John Cena. |
Slide 124 — 41:34 (watch)
![]() | Things can go wrong easily due to the numerous combinations of potential issues. The impact becomes apparent very quickly. |
Slide 125 — 41:52 (watch)
Slide 126 — 42:14 (watch)
Slide 127 — 42:34 (watch)
![]() | We need to establish a common language within the broader community focused on rigorous testing. You mentioned the multi-syllable property-based testing approach. |
Slide 128 — 42:44 (watch)
![]() | Can we refer to it as randomized testing? We might need to improve our marketing. "DST" sounds better than deterministic simulation testing. |
Slide 129 — 42:56 (watch)
Slide 130 — 43:24 (watch)
Slide 131 — 43:50 (watch)
Slide 132 — 44:02 (watch)
![]() | People who are further removed from the customer tend to think that way. |
Slide 133 — 44:12 (watch)
![]() | It's easy to connect with those who have closely interacted with customers. |
Slide 134 — 44:22 (watch)
Slide 135 — 44:28 (watch)
![]() | If there was a problem, people would come upstairs and say, "Hey, there's a bug." Often, they did something that should never have been done. |
Slide 136 — 44:36 (watch)
![]() | These individuals work night shifts and face pressure from supervisors, along with various workplace dramas. |
Slide 137 — 45:04 (watch)
Slide 138 — 45:28 (watch)
![]() | Thank you. Yes, "fallible" means capable of making mistakes. |
Slide 139 — 45:34 (watch)
![]() | Emphasize that people are fallible, including themselves, and that they must take action. Everyone makes mistakes. |
Slide 140 — 45:44 (watch)
Slide 141 — 46:14 (watch)
Slide 142 — 46:48 (watch)
![]() | You need to be prepared for it. This requires a mindset shift: understanding what we, as software developers, can control and recognizing that there are aspects of the world beyond our influence. |
Slide 143 — 47:08 (watch)
Slide 144 — 47:22 (watch)
![]() | I don't know. |
Slide 145 — 47:34 (watch)
Slide 146 — 48:00 (watch)
Slide 147 — 48:30 (watch)
Slide 148 — 48:50 (watch)
Slide 149 — 49:02 (watch)
![]() | I hope we can start expanding these ideas in ways that appeal to a broader audience. Perhaps I'm just being selfish in wanting to make my job easier. |
Slide 150 — 49:14 (watch)
![]() | I believe this approach would likely make our jobs easier. I often use Carl as an example because he is known for being exceptionally reliable. While not the most distributed, he is certainly solid. |
Slide 151 — 49:48 (watch)
Slide 152 — 50:36 (watch)
![]() | Transcribe technical terms, library names, product names, and command names accurately, ensuring correct casing and punctuation. |
Slide 153 — 51:02 (watch)
![]() | I use this great website every day. |
Slide 154 — 51:12 (watch)
![]() | It took a million lines of code to achieve that. This raises a question for me that I wasn't sure how to ask, but you've provided the perfect opportunity. |
Slide 155 — 51:46 (watch)
Slide 156 — 52:22 (watch)
Slide 157 — 52:42 (watch)
Slide 158 — 53:10 (watch)
Slide 159 — 53:40 (watch)
Slide 160 — 53:54 (watch)
![]() | I encountered that post while working in ag tech, where many users are offline, and there is significant concurrent modification of data. |
Slide 161 — 54:02 (watch)
![]() | Many vendors address the issue of concurrent data editing in various ways. To illustrate this, we can consider two people editing a Git file on their own local machines. |
Slide 162 — 54:22 (watch)
Slide 163 — 54:42 (watch)
Slide 164 — 55:00 (watch)
Slide 165 — 55:14 (watch)
![]() | The "last strike wins" approach is not a good solution because it arbitrarily discards one copy of the data. I observe this happening far too often in so-called offline systems. |
Slide 166 — 55:48 (watch)
Slide 167 — 56:08 (watch)
Slide 168 — 56:18 (watch)
![]() | Is that fair? It is fair. We can relate this back to marketing. Instead of thinking of conflicts, perhaps we should consider them as opportunities for consensus. |
Slide 169 — 56:30 (watch)
![]() | We can view conflicts as opportunities to reach a consensus. |
Slide 170 — 56:40 (watch)
Slide 171 — 57:04 (watch)
Slide 172 — 57:28 (watch)
![]() | Thank you for checking out the Bug Bash podcast. If you have an idea for a show or would like to be a guest, please email us at [email protected]. If you prefer chatting, visit antithesis.com and scroll to the bottom to find the link to our Discord. |












































































































































































