In this talk we introduce the shared and distributed parallel computer architectures and the multi-threaded and multi-tasked execution models on these architectures. We follow by listing various programming approaches applicable to multi-threading and multi-tasking. First we discuss the basics of OpenMP and MPI, as used in the Fortran and C/C++ programming languages. Then we follow with parallelization approaches in higher level languages, such as Python, R and MATLAB. We will conclude by introducing software development tools that can help with debugging and optimizing parallel programs.