Whisk together sugar, cornstarch, and salt in a medium saucepan.
Add milk, heavy cream, egg yolks, and split vanilla bean (if using vanilla extract instead, reserve to add later) and whisk until egg yolks are broken up and ingredients are combined.
Place over medium heat and whisk frequently until ingredients begin to thicken. This will take several minutes, do not increase stovetop heat as it’s important to slowly heat the mixture so the sugars melt so that the pudding can reach the appropriate consistency.
Once mixture has thickened and coats the back of a spoon, whisk constantly until it comes to a boil (keep heat on medium, medium/high max).
Once mixture begins to boil, cook stirring/whisking constantly for 60 seconds before removing from heat (continue to stir so pudding doesn’t burn on the bottom of the pan).
If you used a vanilla bean, you may remove that at this point. Add butter one piece at a time, stirring after each addition until melted and incorporated into the pudding. If using vanilla extract, add that now as well. Stir until butter is melted and pudding is smooth.
Pour pudding through a fine-mesh sieve into a medium-sized heatproof bowl (pouring through the sieve is optional but it will eliminate any lumps). Allow to cool for 20 minutes, stirring occasionally to prevent a skin from forming.
Cover the surface of the pudding with plastic wrap or parchment paper, touching the plastic/paper directly against the surface of the pudding to prevent a skin from forming. Allow to cool to room temperature and then transfer to refrigerator and allow to chill for several hours (preferably overnight) before serving.
If desired, top with whipped cream before serving!