it sounds more complicated than it is. Pipes in programming work very similar to pipes in real life - hence the name. Think of a water pipe for example. There's one end of the pip where the water goes in (you write "data" to it) and the other end of the pipe where the water flows out (you can read "data" from this end). In programming both "ends" of the pipe can often be used as two distinct channels.

If you're familiar with Linux you will probably know the pipes concept from the command line. You can often concatenate different commands with pipes. That means the output of one command "flows" through a pipe to the input channel of the next command in the chain.