Understanding Parallelism and Concurrency in Programming