In the past year, I've learned an incredible amount about software design. It seems that the amount of data I take in increases exponentially. I suppose this is standard in most fields of study, it's still surprising to me.
My recent learnings have involved design patterns. I've spoken about them before so I won't go into huge detail. I've recently come across a general pattern known as Inversion of Control (IoC for short). It is a pretty broad concept and is frequently used by developers, most of whom would tell you it's common sense after you explained it. The real benefit is formalizing and categorizing it. This enables you to talk about approaches for solving problems in a common way. For example, try getting some musicians together to write a song, but do not allow them to refer to musical terms.
The particular pattern I've just recently been aquainted with is Dependency Injection, where you define modules of software as components that define their dependencies to other components as part of their declaration rather than tieing them to some specific implementation or third party factory. I've been playing with PicoContainer, a project that provides a framework for Dependency Injection. I'm still trying to get my hands around it, and trying to see how this pattern fits into some of the projects I'm working on.