Математика для жуликов

в 7:52, , рубрики: Инфосфера - мысли вслух, ооп, Песочница, Программирование, метки:

О софистике (софизмах) в дискуссиях и об ООП

Поскольку писать комментарии в режиме «read-only» не положено, снова рискну написать в песочницу.

Вступление

Читая хабр, споткнулся об один из комментариев. Вернее сказать, споткнулся о цитату в этом комментарии:

«Я уверен, что ООП методологически неверна. Она начинает с построения классов. Это как если бы математики начинали бы с аксиом. Но реально никто не начинает с аксиом, все начинают с доказательств. Только когда найден набор подходящих доказательств, лишь тогда на этой основе выводится аксиома. Т.е. в математике вы заканчиваете аксиомой.
Тоже самое и с программированием: сначала вы должны начинать развивать алгоритмы, и только в конце этой работы приходите к тому, что вы в состоянии сформулировать четкие и непротиворечивые интерфейсы. Именно из-за этой неразберихи в ООП так популярен рефакторинг — из-за ущербности парадигмы вы просто обречены на переписывание программы, уже в тот самый момент, когда только задумали её спроектировать в ООП-стиле».
(с) Александр Степанов, со-автор C++, автор STL

Перед тем, как перейти к сути этой заметки (а точнее — к анализу приведенной цитаты Степанова), также хочу вспомнить небольшую статью с провокационным анонсом («софистика — это математика для жуликов»), которая как-то попалась мне на глаза в глянцевом журнале (что само по себе уже странно; нечасто удается в таких журналах на что-то обратить внимание). Электронная версия здесь. Далее я буду ссылаться на термины из этой статьи, поэтому рекомендую ознакомиться.

Следите за руками

Оценим нашу цитату с точки зрения ораторского искусства. А ведь красиво! Как говорится, следите за руками. Начинается с неожиданного и громкого утверждения, поэтому сразу обращает на себя внимание. Далее оратор подводит слушателя (читателя) к аналогии между классами ООП и аксиомами математики. Эта аналогия в дальнейшем выступает основанием для финального аккорда: «вы просто обречены...»! Аплодисменты. Занавес. Оппоненты повергнуты.

Честно говоря, мне как-то никогда и в голову не приходило использовать ООП в таком ортодоксальном варианте, как описывает Степанов. ООП в моем понимании — просто один из множества весьма удобных инструментов. ООП (парадигма) вполне съедобна (даже вкусна) и без соуса «по умолчанию», в обязательном порядке содержащего ключевую идею о том, что все есть объект. ООП не теряет ни одной из своих прелестей, если обращаться к ней по мере необходимости, а не исключительно в рамках ее всеобъемлющей ключевой идеи. Да вроде бы концепция ООП вовсе и не требует повсеместного использования исключительно объектов. Вот только эту самую ключевую идею неплохо бы переформулировать, и от варианта «все есть объект» перейти, например, к варианту «все может быть представлено в виде объекта». Может быть представлено, но вовсе не обязательно это делать! И вовсе не обязательно все будет плохо.

Фундамент цитаты — аналогия между доказательствами и аксиомами математики с одной стороны, и алгоритмами и интерфейсами объектов с другой стороны. Насколько такая аналогия обоснована? Похоже на ПРЕДВОСХИЩЕНИЕ ОСНОВАНИЯ?

Аксиома, если я ничего не путаю, и есть некое начальное утверждение, которое принимается истинным без доказательств, и само служит основанием для построения других доказательств (от набора аксиом требуется только непротиворечивость — действительно, прямо как от интерфейсов; однако вряд-ли автор цитаты именно это имел в виду). Да, да, где-то в уголке моей памяти гнездится мысль о том, что многие утверждения, когда-то считавшиеся просто аксиомами, со временем обрели свои доказательства. Но это же не повод говорить о том, что ход мыслей математиков всегда идет от доказательств к аксиомам. Формально аксиомы почему-то входят в число теорем, а теоремы всегда доказываются, но это тоже не повод утверждать, что аксиома всегда выводится на основе подходящих доказательств. Похоже на ЛОЖНЫЙ СИЛЛОГИЗМ?

Также в цитате ход разработки от интерфейсов к алгоритмам принимается как абсурдный (якобы сначала должны быть алгоритмы, и только потом — формулировка непротиворечивых интерфейсов). Я не понимаю, почему. Если я вдруг счел нужным (удобным) где-то использовать объект, то я начинаю с набросков его структуры и интерфейса (то есть методов, через которые с этим объектом можно будет обмениваться данными). По сути здесь я просто создаю некий дополнительный уровень абстракции. В детали реализации (алгоритмы) я на этом этапе пока еще не вдаюсь, и это по-моему абсолютно не мешает придумывать непротиворечивый интерфейс. В процедурном программировании, когда мы веделяем часть кода в качестве процедуры или функции, мы тоже вполне можем начать с интерфейса (вставить в код заглушку — пустую функцию), и только потом заняться деталями ее реализации. И это не выглядит абсурдом. Конечно, вполне возможен и ход разработки в обратную сторону: мы сначала разрабатываем алгоритм реализации (или сразу несколько), а затем оформляем его как функцию или как метод создаваемого класса. Но это же совсем не означает, что так нужно делать всегда. Поэтому мне кажется, что эта часть цитаты тоже смахивает на ПРЕДВОСХИЩЕНИЕ ОСНОВАНИЯ.

Конечно, я допускаю мысль, что при разработке действительно больших и сложных проектов дела могут обстоять именно так, как описывает Степанов. Мой опыт не позволяет судить об этом, поэтому оставляю этот аспект Вашим суждениям. Тем не менее, при любом раскладе это тоже не повод в принципе считать ООП методологически неверной, поскольку существует большое количество ситуаций, на которые методология ООП ложится весьма неплохо.

В конечном итоге ключевая декларируемая идея ООП — все есть объект — тоже выглядит как СУЖЕНИЕ ВЫБОРА. Ну почему обязательно «все есть объект»? Почему не «все может быть представлено как объект»? Или это погрешности перевода?

Заключение

Эту самую математику для жуликов мы с Вами часто используем совершенно интуитивно, просто как стереотип (паттерн!) общения. Может быть, стоит на хабре описать ее в правилах и запретить использование в комментах?

ЗЫ. И простите, если где-то напартачил с теорией программирования или математикой. Буду рад поправкам.

Целью этого поста ни в коей мере не было принизить авторитет Александра Степанова или кого-то еще, и уж тем более не показать «какой я умный». Просто хотелось обратить внимание на то, что мы, учась отстаивать свое мнение в дискуссиях, нередко приходим к использованию софизмов, и этого даже не осознаем. Получается такая вот математика для жуликов.

image

Автор: akurash

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js