Вопрос, который мне периодически задают: Почему 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:
- Мощная абстракция, за счёт качественного встроенного ООП
- Быстрый запуск, из-за отсутствия компиляции
- Простая работа со сторонним кодом, из-за того что сторонний код подключается в виде исходников
- Простая логика выполнения, из-за отсутствия задач с многопоточностью