Программирование — это не математика, программирование — это дизайн.
Задача математика состоит в том чтобы найти наиболее простую и универсальную формулу или систему аксиом, описывающую некоторое явление.
Программисты занимаются построением полезных систем, которые в большинстве своем сложны настолько, что даже их создатели с трудом справляются с пониманием собственных детищ.
Задача программиста — создать работающую вещь; борьба со сложностью и стремление к простоте это всего лишь побочное следствие ограниченности его умственных ресурсов. Ограниченность же машинных ресурсов играет с программистом злую шутку и добавляет ему работы, которая как правило приводит к усложнению конечного результата.
Из естественных наук программированию ближе всего биология. У человеческого организма оптимальный дизайн? Почти. Он идельно работает? Более-менее. Он сложен? Запредельно. И тем не менее, при всей своей запредельной сложности организм, по большей части — невероятное нагромождение груд мусора с огромнейшим, просто необъятным прицепом хлама для «обратной совместимости», накопившемся за миллиарды лет.
Даже элементарные, математически точно сформулированные задачи можно превратить в сто разных программ. Когда дело доходит до реальных вещей математическая точность отходит даже не на второй план — в реальности она вообще никому не нужна. Даже если система полностью хаотична — главное, что она более-менее нормально работает.
Не нужно относиться к программированию и написанию программы как к построению аксиоматической системы. Достаточно лишь чтобы каждый новый кусок кода хорошо (но не идеально!) подходил к уже существующим, и не приводил к разрушению программы сейчас или в обозримом будущем.
С другой стороны, к дизайну языков программирования нужен математический подход. Чем ниже уровень языка, тем более строгое определение он должен иметь. Взять к примеру оригинальный Лисп: он определен чисто математически — как система из десятка функций для работы со словами и списками, с лямбда-исчислением в качестве вычислительного движка. Это самый нижний уровень. Идеальная математическая точность. С такой же точностью определена таблица кодирования аминокислот ДНК. Однако, слои систем возведенных поверх основы — безнадежно сложны, хаотичны, подвержены сбоям, но тем не менее стабильны и работают.
Чем дальше в лес — тем больше дров.
При всей простоте основополагающих конструкций в современных языках, будь то класс или лямбда, никто не в силах предвидеть и осознать те возможности, которые в них скрыты. Мы выбираем самые простые и полезные, называем их «шаблонами проектирования» и думаем что они — те кирпичи, из которых можно собрать все что угодно; ан нет, за горизонтом всегда остается бездна возможностей. В одной «лямбде» заложена вся сложность мира вычислений. Она как числа 1, 2, 3,… нет ничего проще? Но отношения между числами непостижимы.
Эта заметка — ответ на пост @oxij'а «Паттерны проектирования, гриды и прочая безответственность» и последовавший за этим срач.