Stage 1: Write very simple, naive code, no fancy design patterns, just kind of brute force everything.
Stage 2: Discover design pattens, and fancy obscure programming constructs. Use them everywhere regardless of whether it makes sense or makes the code easier to understand and maintain.
Stage 3: Realize the folly of stage 2, and enter a zen like state where one writes deceptively simple, clean code. Rarely, if ever, use any fancy constructs or design patterns (except where it actually makes sense to use them.)
For the novice programmer looking at someone else's code it's very very easy to confuse stages 1 and 3.