Let me share what has proved fruitful for me in terms of test design. But will not call them best practice as what fits my need may not be suitable for others -
1. Using page object to share page operations across test class. Notice that page object is tool agnostic approach hence it is not limited to be used just with Selenium
2. Externalize test data to text/csv file so that it could be modified with out having to modify source code.
3. Using Single Responsibility Principle to make sure that one class is not responsible for multiple application features. This greatly helps in neat code.
Wiki has more on this.
4. Talking specifically about Selenium - Using element locators which work across browsers for example css nth-child and nth-of-type are not supported in all IE versions
This is only what I have on my mind right now.
~ seleniumtests.com