How to learn good software / OO design? - C#