Эвристика vs математика
В статье «Динамическое программирование: что это, как работает и где применяют» (dou.ua/...bout-dynamic-programming) есть показательный момент,
что на практике полезнее чем тру математика (о тренировке ума математикой — другой вопрос)
Он, как обычно прошел незамеченным (или я не заметил что его кто-то заметил).
Как обычно — потому что на этом моменте не акцентируют внимание даже сами авторы таких статей. А именно в нем вся суть.
См пример «Задача 3. О поиске N-го уродливого числа», «Решение № 2 — подход с помощью динамического программирования»
пп
Мы там видим — обнаружение частностей в задаче. Я такое называю «эвристическими закономерностями», или «эмпириками» (вольная трактовка Эмпири́зм)
И вот как раз именно умение находить такие частности — а не сводить частности к общему случаю — и есть одной из самых ценимых качеств программиста.
Потому что:
Вики:
Эвристический алгоритм (эвристика) — алгоритм решения задачи, включающий практический метод, не являющийся гарантированно точным или оптимальным, но достаточный для решения поставленной задачи. Позволяет ускорить решение задачи в тех случаях, когда точное решение не может быть найдено.
...
Проще говоря, эвристика — это не полностью математически обоснованный (или даже «не совсем корректный»), но при этом практически полезный алгоритм.
Важно понимать, что эвристика, в отличие от корректного алгоритма решения задачи, обладает следующими особенностями.
Она не гарантирует нахождение лучшего решения.
Она не гарантирует нахождение решения, даже если оно заведомо существует (возможен «пропуск цели»).
Она может дать неверное решение в некоторых случаях.
(конец цитаты)
После того как такая эвристика обнаружена — уже особо не важно «каким пузырьком мы будем сортировать».
Более важным становится — читабельность, поддерживаемость, тестируемость реализации. А если добавить состояние рынка труда..., то еще и «чтобы любой трейни после получаса в митинг руме — Понял»
И для их обеспечения и требуется — выявить более элементарные элементы в задаче (спуститься на уровень абстракции −1), с помощью которых можно закодировать обобщенное решение — подняться на уровень абстрации +1
Но — не ниже и не выше! Обычно, выше/ниже не окупится, а приведет либо к оверинжинирингу, либо к архитектурной астронавтике
Подробности с примерами в очередной ненаписаной статье, которую как и остальные напишу на том плотике что сплавляется по днепру.
P.S. А случаи конечно бывают когда легче оказалось DSL создать.
И бывают что без серьезного анализа — никак.
Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті
133 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарів