With the saturation of Moore's law, modern hardware is fast becoming more
complex and harder to program; examples include complex instruction sets, multi-core chips, programmable interconnects, accelerator hardware like GPGPUs, network processors, crypto processors, etc. While all these hardware components are programmable, the most common way of extracting high-performance from these devices (including CPUs) is still through manual coding of assembly instructions!
More fundamentally speaking: while the number of transistors on a chip has still been increasing at an exponential rate, the clock frequency has saturated several years ago. Hence, the next-generation improvements in performance and power-to-performance ratios require innovative software-hardware solutions and cannot simply rely on improving clock rate.