A range of factors have conspired to make parallel software more widespread in the modern world. In the past, single threaded programs were written for machines to execute one instruction at a time. In those days, software was much simpler to write because software developers did not have to think about the consequences of multiple actions happening simultaneously. In the modern world, however, a range of factors have conspired to make it necessary for programmers to develop parallel programs. These are much more challenging to develop than serial programs.