Patterns For Parallel Programming