When creating managed beans ...
A best practice for managed beans that is often (and I admit easily) overlooked is to implement the Java Serializable interface for beans in session, pageFlow and view scope.
You wont recognize the absence of Serializable before running your application in a fail over environment.
As it fits into this context: Note that managed beans can inherit from a parent. So you may want to design a base managed bean class that contains helper functions you often need and that also implements Serializable. Then, with a little change to your coding guidelines, that managed beans must extend the base bean, you ensure your application's managed beans are always serializable.
Note that under the Tools | Preferences | Audit | Profiles entry, Oracle JDeveloper has an audit rule to find managed beans that are not serializable