Cook potatoes in a separate pot, they will later be added to the soup. Chop into ½ inch cubes and place in a medium pot with cold water to cover the potatoes. Boil over high heat as you would make mashed potatoes, about 20 minutes.
Meanwhile, in a large soup pot or Dutch oven over medium heat, add sliced bacon. Allow the rendering bacon to coat the entire bottom of the pot with fat, then push the bacon to one side of the pot with a wooden spoon and saute the onion and celery on the other side. Season the veggies with a pinch of the salt and pepper (pre-measure the salt and pepper so you can season as you go). Try to keep the bacon and veggies separate, this will allow the bacon to fully cook and get crispy. Stir each side often and don't let the bacon burn, about 15 minutes.
When the bacon is fully crisp, you can pull some out to use for topping if you like. DO NOT drain the fat, it will combine with the flour to be the thickener for the soup. Add the garlic and flour. Stir to cook for 1 minute.
Lower heat to medium low, and add the milk. Check potatoes with a fork, you want them soft but not mush (like when making mashed potatoes). When they are done, pull out 2 cups of the starchy cooking water with a coffee cup, ladle, or measuring cup. Add it to a glass measuring cup to measure out 2 cups. Then drain the potatoes and add them, along with the 2 cups of cooking water, to the soup. Season the potatoes with the remaining salt and pepper.
Add corn and cilantro (optional, or save as a garnish) and stir well to combine. Use a potato masher to break up the potatoes, keeping it as chunky as you like. Keep the soup over low heat while everything combines a few more minutes. It will thicken more as it sits, but don't overcook it, it's ready to serve! At this point you can add shredded white cheddar melted into the entire pot, or keep it on the side as a topping. Serve the soup topped with cheese, sour cream or plain yogurt, cilantro, bacon and crackers for dipping.