Научное программирование
О научном программировании
Image credit: Unsplash
Научное программирование
Наука в программировании — прошлое или реальность? Сколько всего этого в языках и почему существуют холивары о преимуществах одних языков перед другими? Если вам интересно, я спрашиваю под кат.
Уже давно идут “священные войны”, в которых обсуждаются и критикуются различные подходы в написании программ и в самом программировании, в основном критикуется объектно-ориентированное программирование (раз, два, три).
Егор Бугаенко критикует ООП на практических примерах (один, два, видео), используя идеи Дэвида Уэста и, как я понял, недавно перешел к теории. Эффективность этих споров стремится к нулю. Почему? Потому что все эти споры уже ведутся на основе реализации каких-то мыслей, практик и мнений отдельных людей, а не на основе теоретических работ. О научном методе и подходе с его теориями, гипотезами, аксиомами, экспериментами, доказательствами и фактами в последние годы в этих спорах и “войнах” вообще нет ни слова!
В математике, как и в любой другой науке, любые теоремы и теории требуют доказательств. В качестве примера: Теорема Пифагора. На первом месте теория, за ней следует практика. В программировании этому подходу не следовали уже несколько десятилетий. Все было заменено догмами и мнениями отдельных людей, которых иногда называют “евангелистами” или “пророками”. Своим словоблудием они продвигают в массы только те идеи, которые им нужны, не заботясь о теории или доказательствах (посмотрите на конференции и презентации по этому поводу). Где здесь наука, а где религия? И не скатываемся ли мы в мракобесие и веру в слова, написанные давно и не требующие доказательств? Вы слышали о сторонниках плоской Земли? Напоминает ли это вам что-нибудь с точки зрения подходов к убеждению и упрямству?
И в течение последних 30-40 лет программисты, ослепленные религиозными убеждениями проповедников ООП или ОП, создавали абстракции поверх других абстракций, новые языки поверх других языков, новые фреймворки и библиотеки поверх старых. И зачем все это было нужно? Ради упрощения и повышения производительности их работы по написанию программ. Только этот путь вел в тупик. Потому что вместо упрощения мы получили усложнение, и теперь мы изучаем не алгоритмы, а API и документацию для другого модного фреймворка, а может быть, и нескольких. Теперь они начали искать ошибки не только в собственном коде, но и в чужом. Отладка кода должна выполняться с помощью множества прокси-серверов, шаблонов архитектуры и шаблонов проектирования, помощников, фреймворков и библиотек. И, как показывают исследования, использование ООП вообще не приводит к увеличению скорости написания кода.
Немного истории. Как все это началось? Сначала появилось процедурное программирование, затем структурное программирование, а затем на сцену вышло императивное программирование. Некоторые люди подумали о том, чтобы ввести понятие объекта — так родилось объектно-ориентированное программирование. И в этот момент произошел резкий поворот, который привел всю отрасль в то состояние, в котором мы сейчас находимся.
Введение объекта должно было быть теоретически обосновано. Но этого не произошло. Вместо этого каждый язык вводил понятие объекта по-своему. И каждый разработчик языка интерпретировал постулаты ООП на свой вкус и цвет. Особо упрямые фундаменталисты придумали Функциональное программирование, основанное на математике, списках и функциях более высокого порядка. Это звучит серьезно и даже немного научно обосновано, потому что математика - вещь необходимая и полезная, но какое отношение списки и функции имеют к реальному миру?
Какие задачи решает чистый ОП без использования состояний и есть ли оптимальный, удобный и правильный способ со стороны человека — вот вопрос, который нужно задать “пророкам” ОП. И его спрашивают (раз, два).
Разработчики функциональных языков начали применять некоторые парадигмы из ООП, чтобы перейти из области прикладных математических задач в область реальных проблем. В ответ на это некоторые языки ООП внедрили парадигмы из OP. И “Лошади и люди смешались в кучу” (с)
В результате реализация чистых парадигм ООП и ОП на современных языках похожа на песню — “Я сделал это из того, что было, и из того, что было, и я влюбился”! И получается, что без теоретической работы и научной основы все эти языки - всего лишь плод фантазий и желаний их разработчиков. И таких языков существует более сотни! И так не должно быть! В идеале должно быть всего 2 языка низкого уровня и 3-4 языка высокого уровня, построенных на их основе.
Я могу предположить, что когда они вводили понятие объекта, они брали за основу то, что видели вокруг себя — людей и животных. И это было главной ошибкой, которая впоследствии разрослась до огромных размеров! Таким образом, возможно, появилось наследование (предок-потомок и связь между ними объясняются наследованием, но как насчет других объектов в мире? И что означает само определение слова “наследование” в реальном мире? Кровь и ДНК? Азотистые основания?). Как другие термины, а именно абстракция, инкапсуляция и полиморфизм, относятся конкретно к ООП? И почему-то они не потрудились предоставить доказательства такой связи. В конце концов, вы можете написать что угодно, и это звучит логично, но проблема в том, что приведенные аргументы не имеют ничего общего с ООП. Ведь в ООП была допущена логическая ошибка — (неполная индукция) был осуществлен переход от одного частного случая ко всему общему множеству. Чтобы показать это, я приведу пример — если за основу можно взять только живые существа с наследственностью, то почему бы, следуя той же логике, не взять за основу планету или целую галактику? В конце концов, планета или галактика также являются наследниками других объектов из космоса и имеют состояние и какое-то поведение. Или представьте себе все горы как объекты без наследования и практически без поведения.