When you start a project from "scratch", especially first time, I recommend to begin with a global shader. You can control it from Uniforms to get different behavior. As soon as you find that the shader is getting complex (too many conditional statements on uniforms, too much functionality that isn't really related, or if you find that you need to specialize because it is too slow), then it is easy to make a new shader from the old one and only keep what is relevant to each of them.
That way, you will eventually get a library of shaders specialized for different situations.
The opposite can happen also. That you get shaders that use common functionality that is a copy. There are mechanisms for that, like uniform buffers and ways to "#include" common source code in shaders. It is a lot like usual SW design. The usual problems of how to making a good design that is flexible, easy to change, fault tolerant, etc.
Thanks. What u said was very helpful to me.
I guess that I should start over by using a global shader. Different shaders cooperation makes me really confusing.