PHP - неправильный путь. Фатальные недостатки развития языка
20-03-2024Время чтения ~ 9 мин.PHP 656
Из-за войны я приостановил некоторые технические проекты, и вместо них решил потратить то немногое спокойное время на создание нового. За эти два года я довольно неплохо выучил Python, а также активно работаю над одним проектом, который никак не связан с программированием. Из php-проектов для меня наибольший интерес представляет мой Albireo, который я решил довести до полноценной CMS на файлах. Дальше 18+.
Для меня Albireo CMS имеет особое значение. Это система, которая не похожа не другие. Самое главное отличие — это её кодовая чистота — я отказался от способов программирования, которые сейчас доминируют в PHP. Потому что то, что сейчас происходит в PHP можно назвать только одним словом — пиздец.
Программированием я занимаюсь с детских лет, ещё с MK61, Спектрума, Поиска-6. Когда-то я писал на ассемблере, бейсике, включая борландовский турбо, паскаль, дельфи, немного си, даже фокал... Вэб для меня начался с perl, потом был ssi, пока один мой знакомый не подсказал, что есть новый язык PHP. Тогда это была третья версия. Не помню уже точно, но я нашел тогда один литовский сервис, который предлагал бесплатный хостинг и домен третьего уровня. PHP там был уже 4-й версии и с этого началось моё настоящее веб-программирование.
Во все времена, программисты старались писать компактный код. Потому что чем компактней код, тем он быстрее работает и его легче поддерживать. Когда я немного поизучал Яву, то мне стало совершенно понятно, что разработчики PHP не любят PHP, а восхищаются Java, поэтому, по их логике, нужно привнести в PHP как можно больше Java.
К их стремлению я относился не то что бы спокойно, скорее по буддистки — просто похуй. Отрезвление произошло после того, как я изучил Python. Причём забавно, изначально у меня была буквально ломка от пайтоновских способов программирования. Блять, где области видимости полей и методов? Какого хера я могу переименовать стандартные функции? Почему массив это не массив, а список? В процессе изучения сравниваешь все эти вещи с другими своими языками и все эти отличия вызывают нервозность.
Но всё закончилось очень просто и быстро. В 90% случаев я пишу код в Notepad++ или Sublime Text. К vscodestudio прибегаю в очень редких случаях на завершающем этапе с целью красиво отформатировать код. Когда пишешь код ручками, стремишься писать его компактным и как можно проще. К моему удивлению писать код на Пайтоне очень просто. Затыки только в синтаксическом сахаре, вроде сгенерировать массив, то есть всё то, что умещается в одну строчку. После PHP такие вещи так с ходу не даются.
То есть когда мне нужно быстро написать программку, я пишу код, который просто выполняет ровно то, что не нужно. Вся сопутствующая поебень, вроде области видимости функций, нэймспейсов, разделения на стопицот файлов для каждого класса, интерфейсов, пср и т.п. оказались просто не нужны. Всё это по сути та самая хрень, которая вообще ни разу не работает, но занимает туеву хучу места в коде.
Сейчас в PHP текст кода генерируется тоннами, но при этом реально функционирующий код занимает мизернейшее место в программе. Когда я стал заниматься Albireo CMS, то подсчитал, что у меня набралось примерно 60 функций в ядре. Знаю, что это не много, но мне стало интересно обратиться к другим проектам и посмотреть как там сделано.
Ну например у меня есть php-шаблонизатор близкий по синтаксису с ларавеловским blade. У меня это одна функция примерно на 130 строк, включая кучу комментариев. Понятно, что ларавел на такое не потянет, сравнивать нет смысла. Но чтобы было понятно, это просто обсчёт регулярок.
Но потом я стал смотреть на другие проекты, чтобы понять их возможности. Изначальная идея была в том, чтобы использовать либо готовые php-библиотеки (чтобы не изобретать свой велик), либо посмотреть возможности других систем и сделать у себя что-то подобное (если это полезно). Чем больше я смотрел на чужие проекты, тем больше охуевал... Такого красиво оформленого количества говнокода я не видел со времён бейсика.
Любой программист пишет говнокод. В каждой функции есть кусочек дерьма, который может вылезти наружу. Как это измерить?
Когда программист пишет одну функцию, то при любом раскладе в ней одна единица говна. Пусть даже потенциального. Когда это две функции, то это две единицы говна. Понятна логика? Чем больше в системе функций, тем больше в ней говна, пусть и потенциального.
Почему так? Когда в системе 100 функций, то программист может проверить каждую и почистить. Ладно, если 100 функций, то программист нормально в них ориентируется и использует в своём проекте. Даже если программист только начал работать с системой, где 100 функций, то он за пару дней начнёт уверенно в ней ориентироваться. Потому что объём функций в пределах разумного и доступен для изучения. Но если функций 1000? Похуй, что они красиво оформленны и написаны по ебанутым стандартам psr — никто не сможет изучить такое количество в краткие сроки.
Усугубляем. Пусть из этих 1000 функций, две трети используют другие функции. Знаете эти трэйты, наследование, композицию?.. Если бы в одном файле была одна функция, то изучение каждой из них строилось в линейной зависимости. Но если файлы и функции переплетены, то каждая из них тянется длинной ниточкой. Это называется размазанной функциональностью (ассоциация, думаю, понятна).
Чтобы оценить размер пиздеца того, что творится в мире PHP, я провёл небольшое исследование. Для этого я взял несколько популярных php-проектов и посчитал сколько в них встречается слово «function» и сколько всего php-файлов. Использовал голые дистрибутивы, без какой-либо установки. Интересует только объём кода. Число вхождений фразы плюс/минус, поскольку фраза может встречаться в комментах.
Изначально я хотел взять маленькие проекты, но быстро понял, что это будет не так охуительно. Например FastRoute использует 113 функций и 18 файлов. Лично я просто не понимаю как можно было размазать обсчёт примитивной регулярки на 113 функций и 18 файлов, но это просто показывает общую тенденцию.
Моя MaxSite CMS не идеальна, но это полноценная система с админкой и шаблонами, кучей плагинов и прочими плюшками. Причём она использует CodeIgniter, который занимает в системе примерно 70% кода. Но всё равно это работающий и полноценный проект.
Но как в Laravel, который даже не система, в ней нет админки, в ней нет ни одного плагина, даже одного примитивного вывода страницы «О сайте», может содержать 41 тысячу функций? Как??? Он, блять, что андронный коллайдер обсчитывает?
Как так получилось, что проекты на PHP стали настолько жирными?
Вначале камень в огород разработчиков PHP. Сейчас это аля-демократическая сходка челов, который решают что дальше делать с языком. Например они озадачились, что функцию implode()
, которая безупречно работает со времён 4-й версии, должна работать по другому в 8-й. Всю жизнь мы используем её с указанием вначале массив, потом разделитель. Ну просто потому, что это логично — функция разделяет массив в строку с указанным разделителем. Но эти мудрые челы, решили всем поднагадить и сделали всё наоборот. Теперь вначале нужно указать разделитель, а потом массив. Но при этом, можно указать вначале массив, при условии, что не указывается разделитель. Что они курят? Нахуя вы вообще трогаете то, что и так хорошо работает?
Такое впечатление, что разработчики PHP делают всё, чтобы нагадить остальным. Причём делают это с завидной регулярностью с каждым выходом 0.1 версией. Кому например мешали динамические поля класса? Язык-то динамический, он по определению предполагает создание динамических переменных. Нет, выпилили, поломали тысячи проектов.
Забавно даже не это, а то, как разработчики подходят к выпуску версий.
Вот вышла 7.0, всё худо бедно перешли. Теперь по нормальной логике, всё, что работает на 7.0 обязано работать на любой версии этой ветки. Но выходит 7.1, которая ломает код, который работал на 7.0. Потом выходит 7.2, который ломает код, который работал на 7.1. И так для каждой версии. Совместимость? Нет, не слышали.
Я поначалу как-то подтрунивал над Python, что они только-только перестали поддерживать 2-ю версию, хотя 3-я вышла в 2008 году. Но после ебучих php-обновлений, очень хочется такой же стабильности, где каждую версию ждёшь чего ещё отчебучат разработчики. Почему не заниматься ядром, придумывать новые функции. Разберитесь, наконец-то с названиями функций! Это же пиздец какой-то! Одна «str», другая «str_», третья вообще без признаков, что относится к строкам. Почему до сих пор PHP оперирует стогом сена и иголками, а не строкой и подстрокой???
Теперь они говорят, давайте двигаться в сторону строгой типизации. Ебать-колотить... Вы ещё Pascal изобретите.
Если такая движуха в «верхах», то понятно, что «низы» смотрят и повторяют. К чему это привело? 41 тыща функций, понять которые никому не под силу.
Сейчас вместо того, чтобы писать компактный и понятный код, все считают своим долгом размазать его по сотне файлов. Каждый класс сопровождается интерфейсом, нахуя? Какого-то лешего говнокод, который назвали PSR теперь становится «стандартом» и теперь все лепят даже не понимая зачем он нужен. Ну симфонисты, глядя на Python, накалякали какую-то хрень и теперь это должно быть стандартом?
Как я вижу развитие PHP? В первую очередь гарантия совместимости. Сделали 8.3, опять всё сломали, но всё, успокойтесь, и дайте гарантию, что любой код, который работает на этой версии будет работать как минимум ещё 10 лет. Внедряйте новые возможности, но не ломайте то, что сейчас работает.
Нахуй строгую типизацию! PHP — динамический язык — это его соль. Кто хочет строгую, пусть валит в Яву. Разберитесь с бардаком в названиях функций (см. http://phpsadness.com/). Сделайте нормальные названия, которые будут работать параллельно традиционным. Оставьте это работать на ближайшие 20 лет.
Придумайте как PHP может работать с модулями. Не этот сраный композер, а нормальный import модуля. Пусть модуль хранится в предкомпилированном виде, как это в Python. Это не должен быть require, а именно модуль, как в большинстве языков программирования. Если кто-то делает проект, то часть функциональности может быть оформлена в виде именно модуля. И программист сам решает как его использовать. Потому что модульная структура проекта делает его компактным и удобным. В PHP до сих пор ничего не придумали, а пользуются убогим подключением через require. Если не понимаете, посмотрите на тот же Pascal, как это должно нормально работать.
Что в итоге? Двоякое чувство. С одной стороны есть язык, который сам по себе быстро работает, да бардак с функциями, много чего нет, но в целом всё на нём делается. С другой стороны — дохерище разработок, которые становятся жирными просто так. Возможности языка — это основа. Но вместо того, чтобы просто и быстро донести основную мысль, php-программисты продолжают демагогию и словоблудие. Сделайте одолжение: возьмите свой код и удалите из него, всё, без чего он может работать. Все интерфейсы, типизацию, всё киньте в один файл и обрамите в обычные функции, которые выполняют ту самую работу, которая и нужна. Вы удивитесь насколько лучше станет ваш код.
Слава Украине! Смерть рашистам!
Сувора стаття, від душі.
Посиджу я поки ще на 7.4, поки пров підтримує.