Dice ham and onion, and slice carrots and celery. Transfer dried beans into a mesh strainer and rinse them under the cold running water. Set aside.
Preheat a large pot over medium heat and add oil once preheated.
Sauté onions, carrots, and celery until they start to brown. Stir in pressed garlic and let it sauté until fragrant (a few seconds.)
Add the ham bones to the pot and then add ham, beans, and seasonings. Pour in the water and stir well.
Let the soup come to a gentle boil and lower the heat to low.
Cover the pot with a lid but leave a small space for the steam to escape. Cook covered for 1.5-2 hours and take off the lid. Cook uncovered for another 1.5-2 hours. Remember to stir from time to time.
At the end, discard the bay leaves and the pork bones. (Note that if there is meat left on any bones, you can take it off and add back to the soup. Just be thorough to sift through the meat for any bone pieces.)
Video
Notes
Slow Cooker - while the final result will not be quite the same, you can definitely make this soup in a slow cooker. Sauté the veggies in the pan and then add them to the slow cooker. (Use a large slow cooker, 5 qt. or larger.) Add remaining ingredients and cook on LOW for 8 hours (or on HIGH for 4 hours.)
Beans - note that soaking the beans is optional. It would reduce cook time slightly and for larger beans, it softens the skin. You can use navy beans, great northern beans, or cannellini beans in this soup. (Note that larger beans will have a little longer cook time.)
Ham bones - I recommend using smoked ham bones for more flavor, like smoked neck bones or ham hock. You can also use leftover ham shank.
Storing - store leftovers in an air-tight container, in the refrigerator, for 5-7 days.