Generally, some amount of production deployments in a tool, language or ecosystem over time. Having an application, any application, being used by X number for Y years will expose you to the frayed edges. Sometimes you dive in on an edge case but that is when you know how deep the ocean is and how shallow your knowledge. That, vague as it is, is the line between generality and specialty in software. When you finally have to peek into specialist issues.