Этот вопрос во многом эквивалентен такому: какие науки должен знать учитель?
Ясен пень, что учитель должен прежде всего знать ту науку, которой он учит. Учитель математики должен знать математику. Учитель русского языка должен знать лингвистику. Учитель биологии должен знать биологию. Ну и есть какие-то общие дисциплины - педагогика, методика преподавания, основы социологии...
Вот с программистами примерно то же самое. Перечень необходимых наук зависит от той области, для которой программист пишет свои программы. Ясен пень, что написание драйверов, системное программирование, программирование сетевых протоколов - это совсем не то же самое, что создание игр. Даже и простых игр. А программы для управления базами данных значительно отличаются от программ обработки изображений.
Поэтому знать, к примеру, математику - да, полезно, но не является абсолютно необходимым навыком. Я не специалист в программировании, но что-то мне подсказывает, что для написания операционной системы математику достаточно знать в пределах теоремы Пифагора (чтобы вычислять расстояние между двумя точками на экране).
Поэтому для отвента на поставленный вопрос надо прежде всего понять, что именно программист собирается программировать. Для чего будут создаваться программы. И уже исходя из этого - формировать список необходимых наук.
А вот без чего совершенно не обойтичь - это без умения учиться. Программирование, как всякая сравнительно молодая область человеческой деятельности, развивается и меняется весьмя динамично. Поэтому без уменя быстро овладеть новым материалом, быстро научиться каким-то новым методам, овладеть новым языком программирования рассчитывать на профессиональный успех не приходится.
<hr />
А английский - это не наука. Это банальная грамотность. Всё равно, что без знания арифметики податься в физику...