Let’s take a visual approach to this:

First, you have your character and camera and Vector2(5, -3) and Vector2(16, 2) respectively.
The difference between those two points is a subtraction of one from the other.
A ----------------> B
To get the Vector going from point A to point B, you subtract A from B. In other words, AtoB = B - A.
In the context of the drawing, that means your camera’s offset from the player is (16, 2) - (5, -3), resulting in a difference of (11, 5). So, at all times, this camera should remain 11 units to the right of, and 5 units above the player.
The Start() function in Unity runs once per object, when it first enters the game. This gives the opportunity to generate that offset based on the player’s and camera’s starting positions without being influenced by their locations later.
The LateUpdate() function, much like the Update() function, takes place once per frame of gameplay. Because of this, your player’s position will likely be changing rapidly. However, you want the camera to remain that same distance away from the player at all times. That’s why we determine what its offset should be in the Start() function.
All in all, it’s actually nothing more than a simple oversight.
transform.position = player.transform.position + transform.position - player.transform.position;
is not “wrong”, but it’s not right either. What’s actually happening is more like this:
transform.position = player.transform.position + (transform.originalPosition + player.transform.originalPosition);
It would be silly and ineffective to recalculate the camera’s offset on every frame of gameplay. Likewise, because it’s NOT updating every frame, it is a constant value to make use of instead.
I hope this answered your question adequately. If not, there’s always room for more doodles!
