Волторнистый Артём
увлечённый php-разработчик

Польза пет-проектов (pet projects)

10 марта 2024 г.

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

Это было давно и скорей всего для php уже есть готовые решения для организации сокет-сервера, но тогда я их не нашел либо плохо искал. Сперва я читал о том, как вообще люди создавали чаты.

Ок, сперва я напишу чат на jquery, потому что обрабатывать его каким-нибудь pjax’ом на yii2 - откровенное усложнение, но я и это попробовал. Потом я попробовал написать его полностью на jquery. Получилось очень много кода смешанного с версткой.

В итоге я попробовал его написать на vue и понял на сколько интересно и достаточно лаконичного программировать различные состояние блока. Например, у нас есть сообщение с разными состояниями - новое, отправленное успешно, отправленное с ошибкой (нужно отправить повторно) и т.д.
Конечно, код у меня получился не сильно простым :)

После того, как я получил для себя удовлетворительный вариант чата, перешел вопрос к бекенду.

Кто-то с нуля писал сокет сервер на php, но на тот момент для меня это казалось слишком сложным. Я посмотрел относительно несложное решение на node.js + socket.io. Код уместился в районе 30 строчек.
Проблема осталась в том, как сделать так, чтобы node.js знал об авторизации пользователей php.

Были разные трюки через сессию, но я в тот момент узнал о jwt токене. Socket.io поддерживал данный способ и в итоге я генерировал jwt токен пользователя, в который сохранял его id. Node.js получал jwt токен, когда socket.io устанавливал соединение, доставал id пользователя и создавал для него комнату.

Отправка сообщения происходила через ajax на бекенд php, бекенд производил необходимые валидации и после сохранения сообщения, отправлял событие в очередь. Node.js читал данную очередь и отправлял уведомление в комнату получателя. Если комната получателя существовала (пользователя сидел на сайте), то сообщение через socket.io летело к получателю на фронт. Тем самым я сделал реал-тайм уведомления о сообщениях, так же как и о том, что пользователь печатает либо находится онлайн.

Возможно, из вышеперечисленного текста для кого-то многое осталось непонятным (можно попробовать вспомнить в комментариях), но тут главное выводы, к которым я пришел. Для меня шалость удалась и навела меня на мысль о том, что для каждой задачи существует свой инструмент. Безусловно, весь этот краткий пересказ стоил мне месяц или два личного времени, но оно того стоило.

К каким выводам я пришел.

1) Чтобы использовать какую либо новую для проекта технологию, нужна накопленная экспертиза. Я хоть и завел чат, но экспертизы во vue.js и node.js у меня не было. Если бы на работе возникла необходимость в чате, скорей всего я бы использовал старые проверенные способы, в которых я был уверен. Наверное, чат на jquery и уведомления через таймер, как вариант. Да, больновато и это будет не тот реалтайм, но это я смог бы поддерживать.

2) Задача сильно упрощается, если ты заранее делаешь исследование в виде заметок. Выписываешь как ты будешь решать поставленную задачу, какие инструменты будешь использовать.

3) Пробовать для себя что-то новое и сложное - это полезно. Начинаешь смотреть на те или проблемы под разными углами. В новом направлении чувствовал себя бревном, например, когда первый раз пробовал завести vue.js.
Или, возможно, не всё стоит писать на php, как бы он не нравился мне :) Пример с сокет сервером. С другой стороны, может я не все узнал о php. Это тоже опыт экспериментов, когда иногда надо себя калибровать. Может, я закопался с решением для этой задачи? Может мне нужно было сделать вот так, а не так?

4) Скорей всего с увеличением экспертизы, ты глубже смотришь в проблему. Начинаешь лучше чувствовать или предугадывать подводные камни или понимать, что они обязательно будут и стоит глубже изучать вопрос на этапе исследования, а не кодирования.