When can it be applied? When can it not be used? I get the general idea but not what it takes to make it work.
The main use case for pipelining is when your latency is large, but actual work is small. You hide the latency by scheduling many operations such that the latencies overlap but the actual work does not.
It can't be used if the latencies are not independent. An example is calling people from a phone just to say "yes". The actual work is very small, the latency is very large, however your phone can only call one person at a time so you can't actually apply pipelining.
If you had multiple phones however you could start dialing the next person while the previous phone is still ringing.