I'm very new to Java EE and I'm trying to understand the concept of Local interfaces and Remote interfaces.
In the initial versions of the EJB specification, EJBs were "assumed" to be remote components and the only way to invoke them was to make a remote call, using RMI semantics and all the overhead it implies (a network call and object serialization for every method call). EJB clients had to pay this performance penalty even when collocated in the same virtual machine with the EJB container.
Later, Sun realized most business applications were actually not distributing EJBs on a different tier and they fixed the spec (in EJB 2.0) by introducing the concept of Local interfaces so that clients collocated in the same virtual machine with the EJB container can call EJBs using direct method invocation, totally bypassing RMI semantics (and the associated overhead).
I've been told that one of the big advantages of Java EE is that it is easy to scale (which I believe means you can deploy different components on different servers)
Java EE can scale, but this doesn't necessarily means distributing components. You can run a Web+EJB application on a cluster without separating the Web tier and the EJB tier.
Are you supposed to use Remote interfaces if you expect your application to have different components on different servers? And use Local interfaces if your application is only going to reside on one server?
I would phrase it like this: use remote interfaces if the client are not in the same JVM (this doesn't mean using only one server/JVM).
(...) Start off by using Local interfaces, and gradually upgrade to Remote interfaces where applicable?
I would probably start by using Local interfaces. And as already hinted, switching to remote interfaces is not always mandatory (you can cluster a collocated structure).
I suggest to check the resources mentioned below (the 2 first ones are quite old but still relevant, the 2 others are more recent).
Resources