It is generally good practice to use GetService for most things. WaitForChild tends to be better for objects that may not have appeared yet (etc:waiting for humanoid on a character). I’m not sure with findfirstchild, but I usually use it if waitforchild doesn’t apply, or if I only want it to run if the object exists.
You should use GetService for every single service (list of them: List of all Services? - #8 by Forummer) except for workspace which you can just reference by using:
As @Katrist stated, you use GetService for retrieving services. (Some services are only available via this method).
WaitForChild should be used when it isn’t guaranteed for an Instance to be replicated or exist when the script runs. For example, if you want to get an object in workspace from the client when the script starts, the object may not replicate before the script runs, so in this case you use WaitForChild to wait for the object to load in.
FindFirstChild should be used for retrieving children with a specific name. Some use cases involve getting a child from a name that conflicts with an existing property: Instance.Name is not the same as Instance:FindFirstChild("Name") one will get the child with the name of Name, while the other will get the property instead (Instance.Name). You can also use this to see if a specific child exists (Directly indexing will raise an error or return the wrong value).
Use :WaitForChild on the client, and only on the server if you’re getting objects that are inside of their character right when they get. Use :FindFirstChild to objects inside characters after they’ve been in the game like a sword that deals more damage to certain characters that have a “DifferentCharacter” tag for example, even if you know their team is on the DifferentCharacters, exploiters can delete any objects in their character, and it’ll replicate to the server. For touched functions too, you want to check if the object has a parent because I guess they can somehow manipulate it to error if you call hit.Parent without an if statement for hit.Parent.
I don’t get what you mean with :GetService, but I don’t think you exactly need to use it. It’s just for syntax I believe. You can do things like game.ReplicatedStorage and ReplicatedStorage IS a service, so I’m pretty sure it’s safe to not use :GetService, but still good probably.