A great programmer is able to understand problems clearly, break them down into hypotheses, and propose solutions in a coherent manner. They understand concepts quickly, or ask the right questions to help make them clear, and don't need to have everything written down in a specifications document .