Надо различать программиста от кодера.
Даже если человек получил образование и\или, скажем, выучил 1-2 языка программирования, несколько технологий, пару продуктов и получил сертификат MCSD от MS, то его еще рано считать программистом. Это, чаще всего, mainstream кодер, а не программист и подобный человек может быть не в состоянии решать банальные задачи эффективно , к примеру, сортировки. Например: есть массив a из n элементов и целое число k, где k <= n, элементы a[0]..a[k] и a[k+1]..a[n] уже отсортированы; требуется дать наиболее эффективный алгоритм сортировки.
Программист - это, прежде всего, инженер. А инженер - это человек с приличным багажом знаний, который в состоянии применять научные знания, математику и свою изобретательность, находчивость, искусность, мастерство для проектирования и разработки решений различных технических задач и проблем.
Чтобы отличаться от кодера:
-- ASM знать надо и вообще как работает процессор
-- быстро обучаться
-- анализировать свои ошибки и работать над ними
-- с/с++ знать надо (хотя бы в рамках Бьярна Страуструпа)
-- знать с десяток языков программирования
-- реляционную алгебру знать надо
-- большое О знать надо, и понимать алгоритмы
-- теорию множеств и теорию графов и вообще много чего из мат. аппарата инженера знать надо
-- даже самое банально, писать комментарии в коде – кратко, понятно, по существу
-- принципы и паттерны проектирования знать надо
-- технологии знать надо, и вообще держать руку на пульсе
знать пару RDBMS надо
-- как минимум иметь представление как поставить процесс разработки
-- этот список можно продолжать долго…