PHP: фрактал плохого проектирования

Перевод статьи PHP: a fractal of bad design

От переводчика

Я неоднократно натыкался на эту статью и на её убогий перевод на Хабре. Да, она действительно из тех, которые tl; dr, так что я не осилил её с первого раза. И со второго. И с третьего. Но в итоге я её прочитал и понял, что она очень сильная. И теперь она есть на не-ломанном русском. Порой это сумбур, некоторые утверждения вперемешку. Тем не менее, многие примеры удивительного кода проверены мной. Подтвеждаю: PHP неадекватен :)

Предисловие

Я зла. Я жалуюсь на кучу всего. Неудивительно, что в мире технологий полно того, что мне не нравится. Программирование — очень молодая дисциплина, и никто из нас толком не знает, что делает. Если при этом вспомнить ещё и Закон Старджона, то будьте уверены: я найду на что жаловаться в течение ближайшей жизни.

Здесь речь о другом. PHP не просто неудобен в использовании, не подходит для моих целей, неоптимален или противоречит моей религии. Я могу рассказать обо всём хорошем в языках, которыми я стараюсь не пользоваться, и обо всём плохом в языках, которые мне нравятся. Давайте, спрашивайте! Будет интересный разговор.

PHP — единственное исключение. Практически каждая возможность PHP работает через задницу. Язык, каркас, экосистема — всё плохо. Это настолько систематично, что я не могу показать какую-то одну убийственную вещь. Каждый раз, пытаясь составить список моих нареканий, я застревала в этом глубинном поиске, обнаруживая всё более ужасающие детали. (Следовательно, это фрактал.)

PHP — это позорище, камень в мой огород. Он настолько неадекватен, но так хвалим каждым дилетантом, до сих пор не изучившим ничего другого, что это просто бесит. У него есть несколько искупающих качеств, но я бы предпочла забыть об их существовании.

И всё же я должна поделиться этим. Итак, вот она, моя последняя попытка.


Аналогия

Я просто жаловалась Мэл, чтобы объяснить, как я расстроена, и она настояла на том, чтобы я выложила это сюда.

Я не могу сказать, что не так с PHP, потому что... ладно. Допустим, у тебя есть, ну, ящик с инструментами. Нормально выглядит, внутри стандартный набор.

Ты достаёшь отвёртку, и понимаешь, что у неё нет ручки, зато три  насадки. Ну, ладно, сейчас её применить некуда, но ты надеешься, что когда-нибудь она пригодится.

Ты достаёшь молоток, но, к твоему ужасу, обе его стороны предназначены для выдёргивания гвоздей. Не смотря на это, он всё ещё пригоден. Я имею в виду, что всё ещё можно забивать гвозди ударной частью, только держать его придётся боком.

Ты вытаскиваешь плоскогубцы, но у них нет зубчатых поверхностей; они ровные и гладкие. Это не очень удобно, но всё ещё позволяет закручивать болты.

И так далее. Всё в ящике странное и причудливое, но, возможно, не настолько, чтобы быть совсем бесполезным. И с этим набором нет какой-то конкретной проблемы; в нём есть все инструменты.

Теперь представь, что ты знаком с миллионом плотников, которые говорят тебе: «Эй, что не так с этими инструментами? Я всегда пользуюсь только ими, и всё нормально получается!» И плотники показывают тебе дом, который они построили, где все комнаты пятиугольные, а крыша вверх ногами. Ты стучишь в парадную дверь, а она вваливается внутрь, и на тебя кричат за то, что ты сломал дверь.

Вот что не так с PHP.


Основа

Я считаю, что следующие качества важны для создания продуктивного и полезного языка, и PHP дико кладёт на них. Если ты не согласишься, что они ключевые, то я представить не могу, что мы на чём-нибудь сойдёмся.

Следовательно, вот что я думаю:

Я не могу предоставить по абзацу комментариев на каждую проблему, объясняя, почему она попала в эти категории: это будет бесконечно. Пусть читатель сам подумает.


Что лучше не писать в комментариях

Я знакома со многими аргументами в пользу PHP. Я слышала кучу очень общих контраргументов, придуманных только для того, чтобы немедленно прервать разговор. Не пишите их сюда, пожалуйста. :(

Взгляд со стороны: я обожаааю Питон. И я с радостью прожужжу тебе все уши, жалуясь на него, если ты действительно хочешь этого. Я не утверждаю, что он идеален; я просто взвесила все достоинства и недостатки и решила, что он лучше всего подходит для того, что я хочу делать.

И я не встречала PHP-разработчика который может сделать то же самое. Но я видела многих, кто быстро извинялся за всё, что делает PHP. Это ужасающий подход.


PHP

Базовый язык

CPAN — «стандартная библиотека Perl'а». Это не много говорит о стандартной библиотеке Perl'а, но показывает, что монолитное ядро способно на великие вещи.

Философия

@fopen('http://example.com/not-existing-file', 'r');

Во многих местах я слышала кучу замечательных историй об интерпретаторе PHP и его разработчиках. В частности от людей, которые работали над ядром PHP, отлаживали ядро PHP, общались с разработчиками ядра. Ни одной истории, которая говорила бы в их пользу.

Повторюсь: PHP — это сообщество любителей. Очень немногие из его разработчиков знали, что делают. (О, дорогой читатель, ты, конечно же, — редкое исключение!) Те, кто дорос до перехода в другой проект, снизили компетентность проекта в целом. Вот в чём самая большая проблема PHP: это слепой, ведущий слепого.

Ладно, назад, к фактам.

Операторы

Переменные

Концепция

Обработка ошибок

Функции

ОО

Стандартная библиотека

Perl «требует сборки». Python «с батарейками в комплекте». PHP — это «кухонная раковина, но она из Канады, а на обоих кранах написано Х».

Общее

Влияние Си

Этот пункт списка говорит сам за себя. Это абсурд, проникший в глубины языка. PHP — это высокоуровневый динамически типизированный язык программирования. Но значительная часть стандартной библиотеки — это довольно тонкие обёртки для API Си, из чего следует:

Обобщение

Нет его. Если функция должна уметь делать две немного разные вещи, в PHP для этого найдётся две функции.

Как отсортировать в обратном порядке? В Perl это будет sort { $b <=> $a }. В Python — .sort(reverse=True). В PHP есть отдельная функция — rsort().

Текст

Система и рефлексия

Разное

Обработка данных

Программы — это ничто иное, как машины, которые жуют информацию и выплёвывают больше информации. Очень многие языки разработаны на основании типов данных, которые они обрабатывают, от awk до Prolog и Си. Если язык не может обрабатывать данные, он ничего не может.

Числа

Текст

Массивы

Ох, блин.

Не массивы

Функции

Другое

Уеб-Веб-каркас

Исполнение

Размещение

Часто развёртывание упоминают в качестве основного преимущества PHP: хуяк-хуяк и в продакшен закинул файлы — и готово. Действительно, разместить скрипт на Python, Ruby или Perl — целое дело. Но PHP оставляет желать лучшего.

С другой стороны, мне нравится запускать Web-приложения как сервер приложений и использовать обратный прокси. Установка этого всего требует минимальных усилий, а плюсов полно: можно управлять веб-сервером и приложением по отдельности, можно запускать сколько угодно процессов приложений на любом количестве машин без необходимости в большем количестве веб-серверов, можно легко запустить приложение от имени другого пользователя, можно переключать веб-серверы, можно отключить приложение, не затрагивая веб-сервер, можно делать бесшовное развёртывание переключением FIFO-точек входа и так далее. Абсурдно приваривать своё приложение к серверу, больше нет причин так делать.

Недостающие возможности

Я считаю, что всё это имеет разную степень критичности для построения веб-приложений. С тем, что PHP считается «Веб-языком», кажется разумным, что он должен обзавестись некоторыми из них.

Безопасность

Ограничения языка

Хилая репутация безопасности PHP во многом сложилась оттого, что оно берёт информацию из одного языка и вываливает в другой. Это плохая идея. <script> ничего не значит в SQL, но, конечно, значит в HTML.

Что делает это ещё хуже, так это повсеместный крик «фильтруйте ввод». Это полностью неправильно; нельзя махнуть волшебной палочкой, чтобы кусок информации стал «чистым». То, что нужно делать, так это говорить на языке: использовать placeholder'ы в SQL, списки аргументов при запуске процессов и так далее.

На сегодняшний день документация PHP об SQL-инъекциях рекомендует сумасшедшие практики, как-то: проверка типа, использование sprintf и is_numeric, ручное использование mysql_real_escape_string повсюду или же ручное использование addslashes везде (которые «могут быть полезны»!). Там не нашлось места для PDO и параметризации, кроме как в комментариях пользователей. Как минимум два года назад я жаловалась PHP-разработчику на то, что это слишком необычно, и он был встревожен, а страница за это время так и не изменилась.

Небезопасно по умолчанию

(5.5 привносит функцию для хеширования паролей, password_hash, которая должна прийти на смену говно-крипто-коду и отсебятине.)

Ядро

У интерпретатора PHP есть завораживающие проблемы с безопасностью.

Я могла бы накопать больше, но суть не в том, что существует %d эксплойтов — в конце-концов, в программах бывают ошибки. Сама природа этого ужасающа. И я не искала это; всё это случилось на моём пороге за последние несколько месяцев.


Заключение

В комментариях справедливо заметили, что у меня нет заключения. И, да, заключения у меня нет. Если ты дочитал до этого места, то, полагаю, был согласен с самого начала :)

Если ты знаешь только PHP и хочешь изучить что-нибудь ещё, можешь погрузиться в Учебник по Python и попробовать Flask для веб. (Я не большая фанатка такого шаблона языка, но свою работу он делает.) Он разбивает твоё приложение на части, но они остаются всё теми же частями и должны выглядеть достаточно знакомо. Позже мне стоит написать пост об этом; я не планирую писать это прямо в рамках этой статьи.

Затем для больших проектов тебе может понадобиться среднеуровневый Pyramid, или сложное чудовище Django, которое отлично работает для создания сайтов наподобие их собственного.

Если ты не разработчик, но по какой-то причине прочитал это, я не буду счастлива, пока все на планете не выучат Python сложным способом, так что пойди и сделай это.

Также есть Ruby с Рельсами и другие конкуренты, с которыми я не знакома, а Perl ещё жив и выясняет отношения с Catalyst. Читай, познавай, строй, сходи с ума.


Титры

Спасибо за вдохновение:

Дайте знать, если у вас есть какие-нибудь дополнения или я в чём-то не права.

картинка из блога

Размещено Eevee в блоге.


← клик, если это интересно   |   ↓ место для вопросов и идей