A friend who works as a game developer showed me this presentation:
http://www.google.com/events/io/2009/se ... droid.html
While it is about writing games in Java for the Android OS, the first half has some extremely useful lessons on general game design which aren't language or platform specific. I highly recommend it to anyone who is starting out on developing a game.
In the presentation, the speaker strongly recommends an aggregate component model, where each game object is simply a list of components that do different tasks, e.g., physics, logic, rendering, etc. While I know that I didn't really agree with this type of model in the past, I've come around to see that if done properly, a component system offers lots of key advantages, mostly related to flexibility. My past issues with a component system were mostly about the layout of the particular system.
He also strongly suggests decoupling the framerates of the game code and the graphics. He does this by using two different threads. The game thread maintains a graphics state of things to draw, and when the graphics thread is ready to draw another frame, it just copies the state and draws it. This way, your game code can run much faster than your graphics code, producing smoother gameplay.
Another cool thing is that you can take a look at his code if you want more details, as it's all open-source.
All and all, it is an excellent primer on game design that definitely helped me out. I hope it helps you as much as it helped me.