There is many way to handle this kind of problem.
The one I suggest (maybe there is a better one, depends of your needs and stack), is firstly to write in a declarative style.
By writing in a declarative style, your spec are only describing the usage of the feature.
The imperative way is more or less a description of what your code do. This mean that you will need to fix your steps code everytime little piece of your UI or code are changed.
Here is a link that explain that : https://automationpanda.com/2017/01/30/bdd-101-writing-good-gherkin/
The goal here is to make steps as independent as possible from others and ‘high-level’ enough to be not impacted by minor changes.
Sometimes variables needs to be accessible from steps.(Most of the time, given steps are used to create your scenario context so context may need to be accessible from all steps) If you are using Python with Behave framework, a “context” object is passed between hooks and steps. You can use it to put some variable in it.
And finally, in my opinion, manual and automated spec should have no differences. They have to be readable and describe feature aspects of your application.