One of the most useful design principles that I've found and followed is that of keeping a good separation between the presentation aspects of a program (the user interface) and the rest of the functionality. Over the years where I've seen this done, I've seen plenty of benefits:
- Presentation logic and domain logic are easier to understand when separate.
- You can support multiple presentations on the same base program without duplicating code.
- User interfaces are hard to test, separation keeps more logic in more testable places.
- You can easily add a programmatic API for scripting or exposed as services (I actually see these as alternative presentations).
- Presentation code requires different skills and knowledge to domain code.
Despite these many advantages, I often see this principle violated. I think this is partly due to lack of knowledge, and partly due to the fact that many frameworks make it much too easy to intermix domain logic into the presentation, and make it harder to maintain the separation.
Don't make the mistake that this is a client/server physical separation. Even if all your code is running on the same machine, it's well worth making this logical separation.
This principle is the most prominent part of Model View Controller (MVC), indeed for many people MVC is how they describe this separation.
Remember that such things as web services are also presentations, even though they are used by computer users rather than human users. So don't intermix domain code with the code required to support a web service, or indeed any other external API.
(I also wrote about this in an IEEE Software column.)