В определённой степени программисты всегда пишут обобщённо, ведь программы обычно решают класс задач, а не строго одну задачу, например, решение не конкретного уравнения, а множества уравнений. Кроме того, самые обобщённые коды уже созданы много раз — это алгоритмически полные исполнители. Параметризуя их конфигурацией, в данном случае называемой программой, можно добиться исполнения всего, что возможно в принципе. Но программистам этого мало, и они хотят писать всё более обобщённо, вовлекая в это всё больше деталей на разных уровнях. Такой код следовало бы называть сверхобобщённым, потому что он обобщает обобщения. Этот подход заманчив, ведь он потенциально позволяет меньшими усилиями решать больше задач. Но главная проблема такого кода в том, что:
- Его сложней создавать
- Его сложней использовать в частных применениях
- Сложность возрастает ещё больше при необходимости высокой правильности или эффективности
Поэтому, чтобы написание и использование более сложного кода было оправданно, необходимо, чтобы он хорошо решал довольно большое количество задач. Но предвидеть, что именно нужно было обобщить так, чтобы это было полезно, тоже довольно сложно. Поэтому создаётся много сверхобобщенного кода, который решает обратную задачу — вместо того, чтобы уменьшить количество усилий, их только увеличивает.
Часто, чтобы найти хорошее обобщение, нужно сначала создать несколько более частных решений, и только затем увидеть общие потребности. Это может быть отправной точкой для создания обобщённого кода, но если появление новых задач такого рода оказывается под вопросом, то поддержка уже существующих частных решений может оказаться более выгодным, чем попытка их объединения.
Второй по значимости проблемой для сверхобобщённого кода являются общие сложности переиспользования кода — того, что могло бы повысить полезность создания обобщений. Сложно находить тот код, который точно можно было использовать для своих задач без изменений. Найденный код тоже требует изучения, потому нередко оказывается, что написание нового кода для проекта, может быть менее накладным, чем совокупные затраты по поиску и изучению кода для переиспользования.
Переиспользование интересным образом входит в противоречие с возможностью создания обобщённого кода. Сразу создать обобщённый код сложно и куда проще доработать его до этого состояния под влиянием всё большего охвата решений схожих задач. Но уже существующие решения требуют неизменности используемого кода. Создание независимой новой версии с потенциально более высокой переиспользуемостью, отчасти, наоборот, плодит частности.
Помимо этого, есть ещё проблема влияния на разработчика. Сверхобобщённое программирование приводит к дополнительному разделению ролей, и со стороны пользователей заготовок провоцирует шаблонное мышление, что препятствует решению задач, требующих более гибких подходов. Порой, решение подгоняется под привычные шаблоны даже в тех случаях, где оригинальный подход оказывается лучше во всех проявлениях, в том числе, проще для человека. Очень сложно одновременно развивать и способность использовать шаблоны, и мыслить более свободно.
Эти проблемы сверхобобщённого кода выглядят как фундаментальные, и для их хорошего решения сложно предложить что-то для человеческих программистов.
Но есть ещё третья по значимости проблема для сверхобобщённого кода, для которой, пожалуй, кое-что предложить можно. Это особенности языков программирования. В одних языках не хватает средств для обобщения, в других языках они добавлены эволюционно, что во многом ухудшает многие свойства таких средств. В первую очередь, не хватает гармонии, что усложняет их использование и делает почти невозможным некоторые виды обобщений. Кроме того, как сложный предмет, обобщение в язык могло быть включено полу-абсурдным способом и от этого страдает существенная доля используемых языков.
Чтобы претендовать на успешное достижение своей цели, язык сверхобобщённого программирования, как и инфраструктура на его основе, должны проектироваться таковыми с самого начала. Подумать над особенностями такого языка предлагаю в следующей заметке.
Комментариев нет:
Отправить комментарий