Hi @cohen.avraham, take a look at What's the difference between controller first and choice first? for the differences as well as a link to a blogpost that shows some examples of where they matter.
I recommend to always stick with the choice
first syntax. The controller … can
syntax will be deprecated in the next release.
As for your second question, this will definitely not cause a compile error. It can cause a runtime error if the contract is not visible to you. However, being an observer is not the only reason why a contract might be visible to you. You can observe it via divulgence or more likely, you might be using a multi-party submission with a party in readAs
that can see the contract but is different from the controller