Вопрос, который мне периодически задают: Почему PHP?

Почему не другой язык?

Я выбрал PHP как основной язык совершенно сознательно, и сейчас он меня более чем устраивает 👍

Варианты

Пока что я не вижу вариантов лучше чем PHP.

Для программиста, раз в несколько лет менять язык это нормальная история, и я об этом тоже задумывался.

Размышляя о смене языка, я рассматривал варианты:

  • C++
  • Java
  • Objective-C
  • Node.js
  • Golang
  • Python

Из этих шести языков на первых четырёх я уже писал. В том числе на C++ делал десктопные Windows приложения в течение 7 лет.

Но в PHP есть преимущества которые для меня важны.

Как я попал на PHP

Переключился на этот язык я почти случайно. Однажды закончилась очередная моя работа на C++. Инвестор онлайн-игры перестал платить деньги, и вся команда ушла с проекта, включая меня.

Шёл 2013 год. У меня был отличный опыт — 7 лет разработки — но в моём городе просто не было адекватных вакансий на C++ программиста. Везде или платили очень мало, или требования были заоблачные.

Увидел что много вакансий публикуется на PHP и решил попробовать.

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

Первое же собеседование на веб-разработчика прошло отлично. Увидев что я умею программировать и что я без проблем разберусь с фреймворком который использовался в той компании, меня взяли. Деньги предложили сильно выше чем на вакансиях по C++, а требований особых не было — выполняешь задачи, значит молодец. Так что я отбросил сомнения и стал веб-разработчиком.

Опыт с другими языками

На C++ я писал десктопные приложения для Windows, в течение 7 лет.

На Java и Objective-C я делал мобильные приложения под Android и iOS, простенькие игры которые публиковал в App Store и Google Play. Большого распространения они не получили, но опыт был интересный.

Также на “серверном” Java я делал бэкенд для геоинформационной системы, сделать мы её сделали но никому так и не продали. Суть её была в том чтобы в автобусах отображался маршрут, позиция автобуса, все остановки по следованию и встроенная реклама, привязанная к геолокации.

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

Почему не C++

Почему не вернусь на C++?

Нет исходников

Если вы программируете на C++ то множество библиотек скорее всего подключаете не в виде исходного кода, а сразу в скомпилированном виде. Часто исходного кода нет, или есть но в нём сотни и тысячи файлов, которые невозможно быстро изучить.

От этого неудобства:

  • Неизвестно что происходит в конкретном вызове, у вас есть только сигнатура и документация
  • Документация не всегда есть, часто неполная или устаревшая
  • Отладка не показывает какой код выполняется, если не скомпилировать код в отладочном режиме, а это очень нетривиальная задача
  • Нет возможности легко поменять код, пропатчить его

Всё это создаёт огромную головную боль при написании кода и при отладке.

Другое дело в PHP:

  • Любой подключаемый код доступен в исходном коде до последней строчки
  • Можно пройти отладчиком все выполняемые строки кода, как в своём так и в подключаемом коде, видим всё что происходит
  • Исходный код в отличие от документации даёт точную картиину происходящего и не устаревает
  • Можем легко форкнуть любой сторонний код банальным копипастом в проект

Многопоточность

Многопоточность — отдельная сложная тема в программировании. Если в вашей программе появляется многопоточность, то возникает целый новый класс проблем, которые вам придётся решать. Да, они решаемы, но гораздо лучше если их вообще нет.

В PHP многопоточность скорее исключение. Известно, что PHP скрипт выполняется разово для обработки запроса, а потом “умирает”. Даже если обрабатывает много запросов подряд в цикле, то всё равно, работа идёт в одном потоке.

Возможности для организации многопоточности в PHP есть. Но за 9 лет работы мне так и не пришлось столкнуться с задачей, которая в PHP не решалась бы в одном потоке. В редких случаях, когда нужно было быстро обрабатывать очень большое количество запросов, и один поток не вывозил, мы делали небольшие сервисы на Node.js, также можно делать их на Go или в виде Lua-скриптов, подключаемых к Nginx.

В десктопных программах на C++, многопоточность это обыденность с которой приходится жить. Отладка многопоточных программ это кошмар.

В PHP можно везде писать однопоточный код. Это очень упрощает и облегчает работу.

Ожидание компиляции

В компилируемых языках, если проект достаточно серьёзный, компиляция может идти от 1-2 до 10-15 минут. Всё это время программист вынужден ждать пока программа соберётся, чтобы запустить её и проверить её работу. Если нужно 100 раз за день пройти цикл “правка — компиляция — запуск — проверка”, то ожидание компиляции страшно выматывает.

В PHP этого нет, запустив скрипт мы получаем ответ в ту же секунду.

Если же мы используем REPL, то мы вообще можем кодировать и запускать код моментально. Благодаря быстрой обратной связи это превращает написание кода в очень приятный процесс.

Почему не Java

В языке Java есть все недостатки из C++ — отсутствие исходников, многопоточность и ожидание компиляции.

Но есть и ещё один.

XML-конфигурация

В Java принято подключать библиотеки через XML-конфиги. Это огромная боль, так как из-за отсутствия исходников и часто плохой документации вообще непонятно, какие параметры и в каком формате прописывать в XML чтобы всё завелось.

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

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

На моей памяти трижды обновление версии компонента не удавалось по этой причине — не получалось подобрать конфигурацию, с которой бы всё работало.

Выяснить, что же мы неправильно написали в конфигах, мы не можем без исходников)

Почему не Objective-C

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

Причина:

Доступна только одна платформа

Вместе с тем, язык Objective-C мне очень нравится по своему дизайну. Это пока что самый красивый и совершенный язык на котором я писал код.

Почему не Node.js

Здесь я немного упрощаю и говорю о Node.js как о языке, хотя Node.js это скорее стек технологий, включающий языки JavaScript и TypeScript.

Я не очень глубоко разбираюсь в Node.js, хотя и периодически пишу на нём.

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

Поэтому причина, по которой не выбрал Node.js основным языком:

Слабая абстракция

Да, писать объектный код на Node.js возможно, но мне всё же хочется чтобы всё это было на уровне языка, а не в виде надстроек.

Чем лучше в языке реализованы концепции ООП, тем более высокоуровневый и выразительный код можно на нём написать.

Node.js отлично подходит для небольших программ, но не хотелось бы писать на нём что-то сложное и большое.

Почему не Golang

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

Действительно хороший язык, мне нравится в нём то что программа собирается в исполняемый бинарный файл без заморочек, а также что объявление модуля в исходнике одновременно подключает модуль в приложение, без необходимости прописывать в конфигурации.

Причина “почему не Golang” та же что и в Node.js:

Слабая абстракция

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

Кстати, история про Golang.

Однажды мне понадобилось написать простое приложение для работы с сетью. Вспомнив про Golang, я решил что это будет отличный момент чтобы попробовать написать на нём.

Провозившись полдня, я так и не смог добиться приемлемого результата и написать своё приложение на Go. Плюнув, я сел за Node.js и за один час всё написал.

Если интересно, код открыт: tcp-beacon

Так что по удобству написания сетевого приложения меня Golang не впечатлил, а ведь это его конёк.

Почему не Python

Здесь я тоже сужу по отзывам, и в причины записываю:

Слабая абстракция

Для основного языка мне нужны мощные возможности ООП. В питоне их нет. Ну а для простых утилиток у меня уже есть Node.js, не вижу здесь преимуществ питона.

Известно что Python популярен в проектах с BigData, Machine Learning, BlockChain и криптовалютами, но все эти темы мне сейчас неинтересны, а потому и язык не нужен.

Преимущества PHP

Причины по которым я остаюсь на PHP:

  • Мощная абстракция, за счёт качественного встроенного ООП
  • Быстрый запуск, из-за отсутствия компиляции
  • Простая работа со сторонним кодом, из-за того что сторонний код подключается в виде исходников
  • Простая логика выполнения, из-за отсутствия задач с многопоточностью