it is probably a very broad subject that starts with choosing low power parts
That's not always the case - the knack is understanding how to get the result you need with the lowest power, and in some cases, the lowest power part is not the best choice.
In many cases the critical parameter turns out to be the length of time tnings are turned on, not the current draw whilst on.
A good example is sensing analogue values, e.g. temperature or pressure, on a low duty cycle.
In this sort of application you need to turn on the sensor and often an amplifier, wait for it to settle, read the value and then turn off.
In practice, the settling & measurement time is often the most critical value, as everything is powered, and often the CPU running as well.
Where there is an amplifier, a fast opamp is generally more desirable than an ultra low power one, as the latter will be trading speed for power draw.
For a microcontroller, things like the number of different selectable clock rates and watchdog rates, provision of different levels of sleep, available wakeup methods and oscillator start-up time can make a bigger difference to overall power draw than the actual current draw in each mode.