Solution 1:

First off, you need to know how slime and honey blocks work. They both stick with any block beside, apart from obsidian, bedrock, glazed terracotta, or even regular piston arms (if we talk about vanilla experience), but they won't touch each other, so it's useful for many redstone machines.

Next up, observers. If an observer finds an updated block in front of its face, it activates, giving it a redstone pulse at the other side, which then can activate the piston in front of the observer's back.

You can make a flying machine with a piston facing somewhere, and slime/honey blocks in front of it, also, observers at their backs facing at them. Then a similar one 1-block-higher than the original, facing at the opposite direction, but instead using a sticky piston.