Не согласен с ответом выше.
Язык это инструмент, а хороший программист должен знать несколько языков, хорошо бы с разной парадигмой.
Очень важно знать алгоритмы(сортировка, поиск) и структуры данных.
Так как сейчас сильно распространено Объектно-ориентированное программирование, то необходимо так же знать основы ООП и шаблонов проектирования.
Хорошего программиста без знания математики не существует. Очень важны разделы "дискретная математика" и "комбинаторика".
Кроме того, программирование - это всегда практика, чем больше практики, тем лучше. Ни одна книга не даст столько навыков сколько дает практическое программирование
Несколько языков - не табличка умножения. Табличка умножения это минимум, а несколько языков - не обязательно, но желательно.