A lot of OO thinking is all about decoupling parts of the program. Frinstance it's nice if the "model" which represents the current state of all the data does not know anything about the front-end presentation.
One way to make sure that happens is to develop the working guts of a system with no front end. Instead of any GUI or anything, drive it with a set of special
test programs. You get a lot of test code like:
If you haven't seen this kinda thing, assertEquals does nothing if the two parameters are equal and spits out an error if they are not.
JUnit is a must-have framework for building such tests.
You can build and run all the business rules and logic and functionality in the model without ever having a front-end. When you're done it will be possible to plug in any number of different front-ends. It seems scary to build the middle first without knowing what the front-end will be, but it can turn out very cool.
I'm doing just this with a home programming project. I also dummied out the back-end. I have a DataStore interface with stuff like get, put, delete. The first implementation of DataStore is all in memory, just a hashmap working like a database. This makes it easy to repeat my test because the data store always starts out empty. I can commit to a database design when I have the hard stuff working.
Let me know if that sounded interesting or more like a jump off a cliff into unknown territory.