Привет друг. Удачно заглянул на огонёк ты, ибо сказку собираюсь сказать я. Об эпохах нынешней и минувшей, о пределах могущества кодерского, и о том, как в силе себе отказывая, силы достичь можно. А коли не интересна тебе тема парадигм, дальше листай и вид сделай, что не слышал о сказке моей. Зайдёшь же коли на огонёк, так знай, что словца красного ради не всегда сказитель хронологию соблюдал и на совести его перегибы все и недомолвки.
В начале было слово машинное и только дух носился над вычислителем.
Во времена далёкие те, компьютеры были велики размерами своими, программисты — возвышены и сильны, а программы их — коротки и прямы как стрела. Не существовало ничего кроме самого кода и было это хорошо.
По мере того, как программисты становились всё изощрённее, а программы множились и усложнялись, стало понятно, что могущественны программисты слишком, и что переизбыток могущества не к эпохе изобилия и процветания ведёт, но к раздору и трагедии. Творя по измышлению своему, черпали программисты силы в водах Хаоса первозданной вседозволенности, что против воли создателей, а иногда и по оной, просверливался из каждого байта машинной инструкции. Кто во что горазд творили в далёкое время то и не было видения общего и понимания.
Увидели программисты, что могущественны они слишком и от того сложно им код писать и масштабировать. И поняли они, что нужны им правила, чтобы удерживать могущество своё в рамках заданных и результаты предсказуемые получать, а не выхремунду какую. Собрались они тогда и создали парадигмы, дабы силу свою запечатать на веки вечные.
И создали они кольца, чтобы силу свою обуздать. Первым кольцом магическим стало программирование процедурное, ибо повсеместной была необходимость делать над данными раз за разом одни и те же действия. Чтобы не прописывать действия такие сто и пятьсот раз, решили выделить кусок небольшой кода, который бы выполнял очерченную работу и делал бы это хорошо. И к нему обращаться регулярно решили программисты, аки к волхву и мудрецу великому. Создали программисты процедуры, взглянули на них и поняли, что это хорошо. И пользоваться ими с тех пор стали.
Повсеместное распространение процедур и функций привело к тому, что программы довольно сильно унифицировались. Вместо раздольного хаоса первородного и всемогущества над регистрами, программисты умерили возможности свои и в код свой привнесли стиль подпрограмм и аргументов. С одной стороны, хотя кодеры всё еще могли вытворять с процессором всё, что производитель разрешил, они решили что преимущества процедурного стиля важнее гордости их. Ибо соблазнились они возможностью не повторять однажды написанное, возможностью ограничивать область необходимого одномоментного интеллектуального охвата, и возможностью кристально чисто вылизывать код не весь и разом, но позадачно. И отказались они от части силы своей, ибо больше не писали они иначе, нежели как парадигма им велеть стала. И эра процедурная настала.
Тем временем в мир приходили новые кодеры и не так возвышены были и сильны они как предшественники, и сложно им было в словах машинных разбираться. И тогда сообща создали себе они инструменты для того, чтобы немощь свою побороть и появились так сначала Assembler, а позже Fortran и Algol. Не модно стало кодом машинным повелевать и над процессором напрямую властвовать. Пусть компилятор трудится, говорили программисты и еще толику могущества своего поутратили и хаос поослабили. Заодно и процедурную парадигму окончательно в ранг закона возвели.
Но не унимались программисты и интеррактивности возжелали и repl технологию изобрели, чтобы делишки свои не отходя от кассы выдумывать и в жизнь претворять, и прототипы первых интерпретаторов появились во время то. И вскоре из repl-а вышли скрипты и стал мир разделён между программами машинными и скриптами интерпретируемыми и было в то время счастье, ибо всегда ясно было, где программа, а где скрипт, а не как сейчас, когда интерпретируемое компилируют, а компилируемое интерпретируют. Еще дальше программисты от железа стали и уж не знали они уже как АЛУ работает, ибо ОС появились и необязательно матчасть знать стало, о чем, впрочем, никто не горевал, покуда махали все, улыбались и радовались.
Долгим был мир в ту эпоху, но не стоял прогресс на месте. Захотели программисты не только код писать, но и читать его периодически, дабы поддерживать и масштабировать. И поняли они, что сложно им, ибо даже силы процедурного кольца недостаточно было, дабы порядок в коде навести. И пришёл тогда техношаман один, которого Дейкстра звали, и Вирт ему помогал.
Вознёс Дейкстра глас свой и впоследствии теоремой Бёма — Якопини вооружившись, надругался он над оператором goto, утвердив, что колдовство оператора сего порочно и слов магических while, for и if достаточно быть должно для хакера любого. И сказав так, изгнал goto лишив сообщество еще одного могущественного инструмента, и создали прогеры тогда кольцо структурной парадигмы, дабы подвиг шамана на веки вечные восславить. Опечалился goto, но не сдался произволу героическому, и даже сейчас нет-нет да и проскакивает он в коде иного ностальгирующего по былому величию кодера и смущает его. Стыдливо оглядывается программист, не видит ли кто, метку создаёт, goto пишет и процедуру свою в дальний файл прячет, дабы не видел никто, и слёзы тогда на глаза статического анализатора наворачиваются, когда видит он код такой, ибо не умеют статические анализаторы работать, когда парадигма не соблюдается.
Красивым стал код, табуляцией и скобочками размеченный, циклами и блоками обрамлённый. Благодарны кодеры техношаману были и теореме его и командное взаимодействие между программистами, хакерами, и кодерами налаживаться начало, ибо возможно стало не только код писать, но и читать его и даже понимать периодически.
Во время то шаманы тему искусственного интеллекта полюбили и думали думу, как мозг машинный создать, чтобы гомункулуса породить, чтоб чёрную работу делать его заставить. И создали они тогда Prolog, экспертные системы и теорию автоматического доказательства, да и под шумок парадигму еще одну изобрели и логической её назвали. Мало кто понял, что за парадигма это такая и в чем соль её и суть, но для порядку в книжечку внесли и номер присвоили. Да и забыли про неё, потому что не тянула она на парадигму, ибо узка была слишком и самобытна.
А тем временем, благодаря структурной парадигме стали команды кодеров продукты создавать и код свой множить и кодом своим делится и поняли они, что опять предел возник перед ними, ибо разваливался под собственной тяжестью код программ их, размеров определённых достигнув. Но были инженеры, глазами вооружённые и увидели они проблему задолго до того как в полный рост она стала, и созданы руками их были тогда Simula и Smalltalk, и Алан Кей речь свою произнёс. Но умна слишком речь была и смутила она программистов, детей их, и детей детей их, и увы, детей детей детей их и много еще поколений смутит и смущать будет, ибо вместо луны над водой смотрели кодеры на палец, а вместо декомпозиции и иерархии видели инкапсуляцию, полиморфизм, наследование, да описание объектов реального мира, а абстракцией во время просмотра закусывали, что конечно никакого отношения к истинной сути ООП не имело, но только внешнюю форму немного затрагивало. Опечалился тогда Алан Кей и сказал, что C++ — это не true ООП, но поздно было уже, ибо гвалт поднялся такой, что ни в сказке сказать ни пером описать.
Однако, нет-нет, но стронулось дело и не мытьём так катанием научились кодеры объектному мышлению, данные с кодом увязывали, из объектов объекты складывали и тем самым код декомпозировали и иерархически выстраивали. И интерфейсами пользоваться научились, и окончательно хорошо стало, ибо программы теперь не только на процедуры разбиты были, но и на объекты и методы их, что связность программ понизило, а простоту чтения кода повысило. А что до обмена сообщениями, о котором Алан Кей говорил, позабыли о нем, ибо решили, что негоже кодерам праведным письма писать, когда напрямую в гости ходить можно, лишь бы только интерфейс соблюдался. И на тему туже спустя время долгое эпичная срач между святым воителем Торвальдсом и мудрецом почитаемым Таненбаумом вышел, но другая история это, казалось бы не о том она вообще и к чему тут упомянута непонятно, да и дело ли нам кодерам простым в дела святых воителей и мудрецов почитаемых лезть.
С тех пор и поныне настала эпоха парадигмы объектной, и немыслимо программирование уже без объектов, но и тут недовольные оказались и говорили они слова верные, что ООП софт замедляет и избыточность его повышает и качество программ из-за того падает, ибо жёстки слишком интерфейсы и действий лишних много делать приходится, но не слушали их программисты остальные и иерархии объектов в продакшн выкатывали, и Java создали, и DotNet. А под шумок всё памятью и богомипсом закидали, дабы быстродействие повысить, и окончательно недовольным глотки заткнуть. Не модно стало бесклассовый код писать, хотя нет классов никаких в словах машинных и не было никогда, а потому всё дальше отдалялись кодеры от изначальной природы своей и не могли больше процессором на мощность полную повелевать и машиной фон Неймана от сердца к генератору тактового импульса править.
Тем временем, мужи учёные всё не унимались и споры свои вели о том, как код писать правильно, чтобы ошибок не допускать, чтоб выполнялся предсказуемо и творцов не удивлял поведением своим и норовом. И решили они, что чистота и иммутабельность есть благо, а глобальные переменные и сайдэффекты есть зло. И хорошо было это, но сказали они также, что вывод информации на экран должен оформляться как возврат из функции модифицированного объекта вселенной, что всё есть монада, что теория категорий над типами повелевает, а также, что reduce, map, select и прочие слова страшные. А под конец еще Haskell изобрели, чтобы окончательно всех запустать. Почесали затылки программисты, не поняли, что функциональное программирование это про объекты, только иммутабельные и без глобальщины, а решили, что сложно это и непонятно, а кто разобрался с ФП, тот монада какая-то заумная. Однако, концепция чистых функций неплохо зашла и научились прогеры тогда юниттесты писать, а в последствии continuos integration изобрели зачем-то.
Заметить стоит, что хотя умы ученые код математический завсегда писали, но к типам базовым термин иммутабельности неприменим особо, а потому функциональная парадигма никак не раньше объектной возникла, ибо про объекты она, а не про математику, кто бы там что не думал и не утверждал, и если программист объектно не пишет, то функционально он точно писать не сможет. Но если отказывается от изменения состояния объектов своих, то строгую логическую цепочку вывода получает, а заодно возможность кеширования и мемоизации. А всё что про монады и композиции функций, так это метод, а не результат, и палец то, а не луна. Так, вновь от части силы своей отказываясь, новые свойства коду своему кодеры придавать научились и ограничиваясь в одном, в другом сильнее становились, а хорошо это или плохо, не мне судить.
Покуда скрипты и интерпретаторы развивались, нашлись кодеры немытые, которые решили, что не хотят они процессору объяснять, как дом строить, но хотят просто говорить, каким быть тот должен и как выглядеть снаружи и интерьеру какому быть изнутри желательно. И создали они языки разметки, и xaml, и yaml, и css и много других интересных штук, и заодно web по ходу дела породили и на том декларативное программирование постулировали. А для тех неучей, кто не хотел желания свои мимолётные описывать, но как раньше хотели кирпичи складывать, презрительно всё недекларативное императивным обозвали и тем самым дихотомию императивной и декларативной парадигм породили. Посмотрели на это кодеры мытые да чистые, плечами пожали и сказали «Ну, оке… Вроде тоже хорошо».
И вот мир стал таким, каким мы его знаем и выдохнуть бы нам бы надо бы, но еще одна важная парадигма прошла мимо нас незамеченной. Не возможно было хакерам да кодерам расписать императивненько ряд задач связанных с обработкой данных, приходящих потоком непрерывным или в непредсказуемые времени моменты, ибо нельзя императивно обработать то, что непонятно когда и в каком количестве в систему падает. И создали тогда кодеры да хакеры виджеты для гуи, сервисы для вэба и конвейеры для обработки данных, и увязали react, qt, да simulink с labview в event-driven парадигму или реактивную парадигму, что одно и то же по сути своей, ибо вывернуть код пришлось им и на колбеках да конвейерах строить его. На этапе инициализации структуры обработки данных выстраивали они единожды, и после только информацию гнали через них и считали они, что хорошо это и воистину было так, ибо как по другому делать никто не знал никогда, и впредь не знает, и вряд ли когда знать будет.
Много других колец выплавили кодеры, и книжки умные писали и конференции проводили. Тут вам и аспектно-ориентированное, и компонентно-ориентированнное, и реактивно-функциональное, и прототипное, которое тоже ООП, но по-другому. Однако всегда и везде суть парадигмы в том состоит, чтоб ограничить так могущество твоё и инструменты твои, О Кодер, чтобы результат работы твоей, силу имел привнесённую, потому что свойства кода программы твоей зависят от того, какие средства ты используешь и как. Воистину сказал мудрец древний во времена до мира сотворения: Получить что-то можно только что-то отдав.
А если горестно в душе твоей стало после сказа моего о потере могущества великого, то так скажу тебе. Не злословь на предков своих, ибо дела их делались во благо и помыслы их были чисты и возвышенны. И так же как думаешь о них ты, так о тебе будут думать все внуки твои и правнуки. Если же чувствуешь силушку в себе, чтоб кольцо очередное создать и парадигму новую изобрести, дважды подумай, ибо никогда наперёд знать не можешь, какое детище твоё в веках останется.
Таков завет мой и мораль. Сказочке меж тем конец… А кто слушал — молодец.
При сложении сказки ни одна парадигма не пострадала. Пока, друг.