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 benefit from their experience by understanding the common problems before designing a parallel program. Many of the problems arise from the overall design of the data used by the program, and cannot be easily patched later. This paper surveys some of these common problems, their symptoms, and ways to circumvent them.