Cook the pasta according to the directions on the package, drain and set aside. Be careful not to overcook it. I actually prefer it al dente, which means firm to the bite. You can achieve this by under-cooking the pasta by a couple of minutes.
In a separate pan, heat the butter and flour over medium heat. Cook for 4-5 minutes, stirring frequently. You want this to be smooth and golden brown in color.
Slowly add the milk to the flour/butter mixture, whisking constantly. Continue cooking and whisking over medium heat until the mixture becomes thick enough to coat the back of a wooden spoon. Add the half and half and heat for one minute longer.
Remove the pan from the heat and add all of the cheese ½ cup at a time, stirring slowly and constantly with a wooden spoon.
Taste the cheese sauce and add salt and pepper to your liking.
Mix in the pasta, stir to thoroughly combine and serve immediately.