Modern HPC systems are often heterogeneous and massively parallel, leading to highly complex codes which take significant effort to maintain and test. In addition, specialised expertise in profiling and optimisation for a particular target architecture is often required to get close to the peak theoretical performance. Researchers are not guaranteed to have received software development or HPC training, and don't necessarily have the time to spend on software maintenance.