In the bowl of a stand mixer, combine milk, yeast, and sugar. Allow mixture to sit for 5 minutes. Whisk in egg until incorporated.
In a large bowl, whisk together flour and salt. Attach dough hook attachment to stand mixer. With the mixer running on low, add ⅓ of flour mixture. Once dough starts to come together, add another ⅓ of flour mixture. Add softened butter one tablespoon at a time, mixing well after each addition. At this point the dough will be sticky. Scrape down bowl as needed to ensure thorough mixing. Add remaining ⅓ of flour mixture.
Once dough starts to form, increase mixer speed to medium. Knead for 3-5 minutes until dough is smooth and soft. It may still stick to the sides of the bowl, but it should be easy to scrape using a spatula or dough scraper.
Transfer dough to a large greased bowl. Cover with plastic wrap or kitchen towel and allow dough to rest for 30-45 minutes at room temperature until dough has doubled in volume.
Punch down risen dough. Working on a lightly floured surface, roll or pat dough to a thickness of ½-inch. Use a 3 ½-inch doughnut cutter (or 3 ½-inch round cutter and a 1-inch round cutter) to punch out as many doughnut rings and doughnut holes as you can. Gather up the scrapes and re-roll one time to punch out additional ring and holes.* Cover doughnut rings and doughnut holes with plastic wrap or kitchen towel while you heat up oil. Attach kitchen thermometer to a large heavy bottomed saucepot (Dutch ovens and cast iron pans work best). Fill pot with 2 to 3 inches of oil. Set over medium heat until oil reaches 350°F.
Carefully place two or three doughnut rings into hot oil. Do not overcrowd the pot. Cook for 90 seconds on each side, until golden brown. Cook doughnut holes for 50 seconds on each side. Use a slotted spoon to transfer cooked doughnuts onto a paper-towel lined baking sheet. NOTE: Oil temperature will change as you add raw doughnuts into the pot. Monitor oil temperature using a kitchen/candy thermometer to make sure doughnuts do not burn.*