One of the signs of an expert programmer is a thing I call transference. I learned about it while reading a book about learning to play music and it applies to programmers as well.

A novice musician is hard at work studying exactly what to do with their fingers and exactly the patterns necessary to play a piece of music. With enough practice even, they can play pieces perfectly and beautifully. An expert musician, however, sees past the exact patterns and sees the bigger picture: the keys and the chords. Learning a piece of music becomes much faster because they recognize the similarities between that piece and others they have already learned. Many popular songs from the last 39 years, for example, use the exact same chord progressions and are maybe just played in a different key or speed. When a musician makes it past that initial barrier of simply learning to play and begins to recognize those bigger patterns, the world of music opens up and they become expert musicians.

This happens much the same way in software. A novice developer is hard at work learning the basics of syntax and what a variable or a function is. As they progress, they begin to recognize code for the patterns it reflects and not the syntax and exact characters written in the file. Even without being able to articulate these patterns in ways other developers can understand, these patterns help to make the developer more productive and begin to turn them into effective expert developers. With enough experience even, this knowledge can help a developer transfer their skills to other languages and domains. When we learn to articulate these patterns we are able to share information with others and accelerate our learning. Much the way a musician gives names to musical patterns like scales and chords and progressions.

When this:

func doMath(lhs: Int, rhs: Int) -> Int {  
  return lhs + rhs

doMath(2, 4)  

is the same thing as this:

2 + 4  

or even this:

def do_math(lhs, rhs)  
  lhs + rhs

that's transference.

For me personally, this has helped me learn about refactoring and unit testing from the Ruby and Javascript communities, business from SaaS communities and teaching from language and music communities. Transference is where we begin to gain from our diverse experiences and backgrounds.