As a person that is working on a big project, I recommend that everything is as modular as possible. I try to code nodes by functionality and then have a supervisor that manages all the functionalities. Use export variables and NodePath.
For example:
Export(NodePath) var my_component_path
Onready var my_component = get_node(my_component_path)
This breaks a lot less than direct references and also allows setting those references from the editor. If you refactor your scene NodePath generally does not break because Godot updates them.
Use signals, a lot.
There is a rule I set to myself which is use a function call for something that is mandatory and a signal for something that is optional, so far I am satisfied. Signals can be connected too in the editor and should not break too bad.
Make everything as modular as possible. For example with the player, have a visual node that handles itself the animation, a node/script that manages the state machine and emits signals, another node with the physics body (generally the root of the player for structural constraints).
Use the pattern observer A LOT.