Optimize for freedom
In the past, when websites, services, or really any kind of software, I never thought about freedom. If anything, traditional software best practice is to limit user capabilities. You're constantly locking down access to functionality, limiting user permissions, preventing misuse, etc. A lot of my time has been spent on UX (user experience) with the goal of making apps easier to use in the right way.
For dApps, I still care about making things easy to use and I still think through potential attacks on my smart contracts. The key difference is that I'm building systems to protect the users, not just to protect me/my company. A decentralized environment means users interact with each other without going through the developer.
But peer to peer interactions are inherently more complex. If you over optimize your UX, you can limit human interaction in your dApps. That's why I optimize for freedom of choice. It's still important to make things easy to use and write code that is safe and secure, but thinking about user freedom will enhance your design.
For example, I'm currently working on a burn pool contract for Koinos. When you deposit tokens, I track your balance, and you can withdraw your tokens later. Initially, I built balance tracking in the pool contract. This gives the user no choice but to come directly to my dApp when they want to know their balance, get liquidity, trade tokens with some other dApp, etc. I'm now modifying this so you are issued a new token in exchange for your deposited tokens. By having a different token in your wallet, you have more choices. You can figure out your balance by looking in your wallet, you can just trade my token directly with someone else, etc.
Freedom isn't always easier, but it's worth it.
-Luke
P.S. Freedom and individual responsibility go hand in hand.