Parallel programming has been around for decades, though before the advent of multi-core processors, it was more of an esoteric discipline. Now that numerous programmers have tripped over the common stumbling blocks, you can avoid stumbling by understanding the common problems before designing a parallel program. Many of the problems arise from the overall design of the basic algorithms and cannot be easily patched later. This paper surveys some of these common algorithmic problems, their symptoms, and ways to circumvent them.