While you can do everything entirely in blueprints or C++, I think the optimum usage is to do all of the back end stuff in C++ and use it to expose variables in blueprints which you can then easily tweak while the game is running or in the editor. This works similar to Unity where you can write the object in C# and then configure the variables you expose in the editor even while playing.
For example, to create your player character you would create your controller and character (or pawn) classes in C++ and handle all of the core functionality and key bindings for it such as movement in C++, then you would create a blueprint for it in the editor where you can quickly and intuitively modify the capsule size, the mesh settings etc.
In your game mode you would then set the default pawn class to be a reference to that blueprint. That way, you can tweak the player character’s attributes in the editor without having to modify it in C++, recompile, modify, recompile etc.