How to think in terms of advanced programming? - C#