How to make an abstraction
Copy someone else. Whatever problem you're facing, someone else has probably seen it before and come up with a solution. If you can reuse their implementation, whether entirely or in part, you've just saved yourself a lot of work; and even if you can't use their implementation, you can probably save yourself the trouble of inventing a whole new abstraction.
Break it down. Try to reduce it into component abstractions that are related either not at all (orthogonal) or extensionally (as subsets of one another). For each of these abstractions, go back to step 1: fairly often, no-one has done exactly what you're trying to accomplish before, but important subproblems have been solved for you.
Design the interface first. Even when you're programming bottom-up, you need to know where you're going before you can figure out how to get there. The interface exposed defines how the abstraction will be used. Some of this may be already determined: what language you're going to use, for example. But whatever isn't yet determined should be given thought before implementation begins. Getting it right the first time may not be possible, and changes will be necessary; but putting in some thinking ahead of time can help reduce the number of times you need to spend time recoding.
Consider the use cases.
The common case. This is what you should be catering to, or "optimizing for". Don't go overboard, though. "Optimize for the common case" was originally a justification for using a shorter syntax for assignment, and syntax/naming is where this optimization is best applied. While certainly it's better to optimize the performance of the common case than of more unusual cases, often it's better not to optimize at all.
The corner cases. Depending on your design philosophy, you may or may not be concerned with making sure your implementation handles these. Still, if you think you've found a good abstraction, checking the corner cases can help assure you that it doesn't "leak" in unusual circumstances.
TODO: Give examples for each of the steps.