1 - possibly. Shifting will remove and return the first element of @_. Directly assigning MIGHT lead to unexpected results... i.e. if @_ contains 2 elements, you might get the count of elements rather than the values. Shift is better, or use $_[x] directly.
2 - BEGIN blocks occur before anything else, regardless of where they are in the file. Note that requires and uses within BEGIN blocks are executes before any other code, regardless of their location in the block.
3 - Not stricly required, but a good idea.