Working in layers, use time wisely
In the modern world of developing applications we are incredibly prone to writing systems that are both complex in requirements and their inherent ability to constrain both time and space in the software world. It's incredibly easy to say that our industry, or any industry in the modern world, works in the form of internet time. Faster than the average blog post, more useful than the information that each post may even contain. It's no wonder we have abbreviations for almost everything. While we have resources like wikis, blogs, searching through google, rss readers to compile posts, alerts on any new incoming message about let's say 'fda', instant communication... the list goes on.
With every layer from the moment we created our first computer, we've spent our days, nights, morning, and afternoons using every bit of our time to process information, understand it's complexity in order to be either more productive or to provide a better meaning or purpose to functioning in this world.
This is why we create better working tools, more layers of abstraction, easier access to working with almost anything in order to make the experience more user friendly, to make people more productive and feel the real purpose of using the software system. In other words, the business of getting things done, and getting them done faster. Expanding on an idea or intention may actually be less worthwhile to someone else since it may waste their time. But in some instances, where the user really wants to know more (in order to improve upon an understanding) it's useful to expand. So what's the solution? Provide every bit of functionality in a single layer? Well kind of. Except skip the part about adding all the features you want and just make it abstract so you can add layers later, when you actually need them or when someone else actually needs them.
While working in these 'layers of abstraction' what kind of trouble can we run into? Well for starters we could sit all day coding abstraction after abstraction and we may never actually get any real work or features done. Not Good! What's important to know about abstraction is that if there's already a layer implemented for what you need, then don't abstract. If there is a layer that you don't need, don't abstract since it has no purpose in your application.
Final note, keep it simple. You're bound to code it a lot faster and you're a lot more prone to adding the real functionality you need instead of a bunch of useless features and code that may never get used.