There is deterministic and then there is deterministic. At the developer level, which almost always means some high level language, there is very little that is deterministic. You don't have the ability to see what other processes are doing at the exact moment you do anything (fundamental limitation due to relatively electrons can only move so fast a query and response won't ever be syncronous from any two points in space (in all reference frames)). But even say that you could know exactly what is going on right now there is a duration to your activity and at any point between start and finish the system state can change.
Okay that is enough for hardware (at least at this level). Next up compiler and machine instruction set: just because you right a set of lines in a particular order in a high level language doesn't mean that your instructions will be run in that order either the compiler or the CPU could reorder/combine operations without you knowing. This might be a run time thing too (say the CPU only does predictive branching when the pipeline has additional items in it for example). Mah either way the developer or the user can't be reasonably expected to know what is going on. Multitasking also means things might not be where they were when you got interrupted by another thread meaning you might have to wait on several loads of the same item as your stuff keeps getting knocked out of registers and higher level memory.