dev notes
1.39K subscribers
33 photos
6 videos
189 links
Пишу про Go, Vim, и про то, как я медленно ползу в сторону FAANG.

С предложениями: @junsenpub
Download Telegram
​CRUD - от сложного к простому

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

Интересно? Залетай под кат!
Redis: пишем URL-сокращатель

Сегодня у нас полезная теория и вкусная практика по Redis - key-value-хранилищу, способному решать огромный диапазон задач.

Чтобы понять всю красоту этой технологии - под катом пишем URL-сокращатель. Залетай, читай, комментируй.
Пока готовим несколько интересных вещей, запушу интересную тему на обсуждение:
https://kinsta.com/blog/php-7-4/ - обзор нововведений и изменений в PHP 7.4, который вот-вот должен выйти.

Больше всего радует типизация, что-то вроде лямбда-функций и предзагрузка данных в память. Говорят, что можно будет загнать туда большую часть фреймворка и радоваться производительности :) Что думаете? Залетайте в чат, там всё обсудим :)
PHP + Go = ♥️ или RoadRunner в действии

Решил разобраться с RoadRunner - сервером, который умеет запускать несколько процессов PHP-приложения и стабилизировать нагрузку. Да, паттерн "один запрос - один процесс - смерть" больше не работает, и это круто.
Сегодня интегрируем RoadRunner и разбираемся, как работают воркеры. В следующей части разберёмся, как это работает внутри и поиграем с большими нагрузками.
#phpживи

Клац-клац, чтобы твой PHP не умирал на каждый запрос
К теме предыдущей статьи - отличное сравнение бенчмарков на PHP 7.4:
парни из Badoo сравнивают PHP 7.4, PHP 7.4 + Preload, RoadRunner и RoadRunner после оптимизации
А так же рассказывают, чем Preload отличается от OPCache и почему он зайка
Короче, к прочтению рекомендую - https://habr.com/ru/company/badoo/blog/472528/
Более того, как только PHP 7.4 релизнется, а будет это где-то в ноябре, постараюсь подробно рассмотреть и пощупать, как подключать Preload к Symfony-приложениям
Как найти работу? Резюме, собеседования, подготовка

Рассказываю, какие выводы я сделал из почти 10-ти пройденных за год собеседований, как они проходили, где я работал и почему мне не нравится энтерпрайз.
Надеюсь, мой опыт будет полезен. Залетай под кат!
Давайте немного попишем код на листочке...
Lumen + Docker + Websockets

Рассказываю как настроить систему websocket'ов через socket.io в Lumen
Зачем? Потому что могу, и ты сможешь - го читать
Вы просили паттерны? Их есть у меня.

Transactional outbox - паттерн, о котором на русском очень мало информации. Хотя понимание его структуры и схемы работы критически важно в случае создания системы логирования для твоего приложения.

Не хочешь влететь на штрафы, не сохранив факт оплаты от своего юзера? Тогда велком под кат - клац.
Тесты, ревью и флоу вокруг разработки

В одной из компаний, где я работал, была замечательная надпись на стене - "97 дней без багов". Это была одна из немногих компаний, где ревностно следили за чистотой кода, за процессом деплоя и флоу вокруг программирования, что позволяло выдавать стабильность работы всего портала. А портал был далеко не маленький.

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

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

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

Например, на моём текущем проекте более 1кк строк кода. Проект писали десятки людей на протяжении многих лет. Часто бывает так, что открывая какой-либо файл я вижу комментарий за 2015 год - "Это может пригодится, пока не удаляем". Окей, Ctrl + F → поиск → нет соответствий. Значит, не то что можно - это нужно удалить. Или, например, ты видишь deprecated-модуль. Посмотри аннотации - скорее всего, этому модулю много лет и он, вероятно, уже нигде не используется и был переписан. Удаляй. Если бизнесу это не пригодилось в течении пары лет - дальше тоже не пригодится. Сомневаешься? Уточни у лида или товарищей по команде, которые на проекте долгое время - использовалось ли это где-то в последние годы. Скорее всего они даже не вспомнят что это.

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

Увидел функцию из PHP5, которая перечёркнута и ты знаешь её новый аналог - примени (главное версию PHP на сервере проверь; если 5 - не правь, и подумай о смене работы). Так, например, в старом PHP многое делалось через строки - в строке могли объявить функцию, могли вызвать её через строку. Всё это уродство можно заменить, поэтому если увидел - твой долг это поправить. Как писал дядя Мартин - ты должен спорить с бизнесом и доказывать ему, что рефакторинг - это важно, прежде всего, для самого бизнеса.

Так же хорошая практика поделить задачу и рефакторинг на разные коммиты - на PR лид скажет тебе спасибо.
Выжигающие задачи

Почему люди увольняются? Я увольнялся по нескольким факторам: предложение на более вкусное место работы, несработка с командой, отвратительное руководство.
В том случае, когда человек увольняется из-за проблем на работе, а не из-за предложения новой, что-то как правило служит точкой невозврата - достал лист, написал заявление, отнёс начальнику. И, как мне кажется, такой точкой нередко выступают определённого рода задачи.
Как правило, такая задача летит мимо спринта. Аналитики нет, оценки - тоже. Формулировка крайне скудная - реализовать *описание фичи в нескольких словах*.

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

В очередной раз столкнулся на работе с прекрасной постановкой - реализовать возможность *функционал фичи*. Аналитики нет, в спринт задачу вкинули уже после его запуска. Совокупность факторов - и я не разбираясь перевёл статус задачи в "In progress". И через пару дней пообещал себе, что без предварительной оценки, какие бы факторы вокруг не происходили, задачи больше браться в работу не будут.

Основные критерии:
1. Описание задачи затрагивает несколько логических разделов в коде. Например, моя задача, если бы я получше вчитался в описание, затрагивала ядро генерации PDF-файлов и подразумевала большой объем кода в совершенно другом месте для реализации бизнес-логики.
Как это можно было решить? Вчитаться на планировании, поставить задачу на аналитику, выявить проблему и разбить задачу на 2 подзадачи, поочерёдно втягивая их в спринт.

2. Нет чёткой оценки времени. "Да делай, ещё есть время" - самый паршивый для разработчика ответ. В голове сразу мысли: "Сколько? Когда могут спросить? До конца спринта? Или уведём в следующий?". Ответы такого формата делают только одно - заставляют торопиться, из-за чего возникают ошибки, в PR пушатся всё новые комментарии и цикл "правки - PR - комментарии" раскручивается.

3. Нет приёмочный критериев (для тех, кто в танке - приёмочные критерии - одноимённый раздел, который можно активировать у карточки задачи в jira). Это, наверное, самая важная часть, резюмирующая большинство из вышесказанного. Если тебе набросали макет, дали краткую формулировку, но в разделе с приёмочными критериями пусто - уже стоит задуматься, а брать ли задачу или стоит сначала обсудить. Когда менеджмент/команда/лид описывает то, что он хочет видеть на выходе - это уже половина решения. На одном из предыдущих мест работы в процессе формулировки приёмочных мы с командой могли обсуждать задачу несколько встреч подряд, находя всё новые и новые моменты, разбивая задачу на новые подзадачи и описывания новые блокирующие связи. Потеря времени? Как бы ни так. После такого планирования весь пулл подзадач выполняется за пару дней, что бизнесу идёт только на пользу.

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

Так вот, чтобы не сидеть весь спринт над одной задачей, не слушать вопросы менеджмента о её статусе, не ловить подводные камни (они всегда будут, но большинство можно выявить на планировании) и не смотреть на десятки комментариев в PR - учись ловить такие задачи, задавать вопросы, и не приступать к выполнению, пока не будет всех ответов. Лучше потерять время на берегу.
Технический материал писать долго и временами сложно.
Переписывать документацию, как я это делал по-началу, больше как-то не хочется :) А сложные кейсы, возникающие на работе, порой описываются (по вечерам) за неделю-две.
Чтобы канал не простаивал по паре недель без материала, думаю добавить контента и хочу посоветоваться с вами, что вам будет интересно? Хайпить на тупых картинках, репостить новости из других каналов и заливать прочей грязью ленту я не буду.

Заметки с/о работе, как и технические статьи, я буду продолжать писать, это никуда не пропадёт :)
​Утренний дайджест на junsenior

Всем кофе, пацаны. Утро первого дня рабочей недели знаменует новую рубрику на канале - дайджест новостей из мира технологий, которые нам интересны. Сегодня кое что вкусное из мира PHP за прошедшую неделю.

Наверняка ты слышал про асинхронный PHP (привет, ReactPHP). Вероятно, если ты подписан на мой канал, ты также слышал о Symfony.
Так вот, их объединили и запаковали в отдельный фреймворк - DriftPHP (да, мы получаем Symfony-архитектуру, реализующую событийную модель).
Обязательно посмотри свежее интервью с разработчиком (с очаровательным русским акцентом интервьюера) DriftPHP - https://www.youtube.com/watch?v=uebhqc2BZXw
Вдохновившись, я решил написать материал, где мы установим, настроим и напишем небольшое приложение посредством этого фреймворка.

Тестирование - неотъемлемая часть разработки. Важно следить и за тем, чтобы тестовый фреймворк был в актуальном состоянии, чтобы не пропустить патчи безопасности и новые фишки.
7-ого февраля зарелизили PHPUnit 9. Теперь, для написания тестов нам нужно иметь версию PHP не ниже 7.3 и можно использовать PHP7 синтакс. Помимо этого, многие методы были помечены устаревшими (например, у MockBuilder устаревшим объявлен setMethods()). Все изменения описаны в официальном релизе - https://phpunit.de/announcements/phpunit-9.html, рекомендую ознакомиться.

1 февраля в статусе черновика опубликовали RFC с предложением добавить переопределение арифметических операторов и операторов конкатенации - https://wiki.php.net/rfc/userspace_operator_overloading
Хорошо это или плохо - тема активно обсуждается. Лично мне эта идея импонирует, и я бы активно использовал такую возможность.

Ещё одна тема, активно обсуждаемая на реддите - это появление возможности кидать PR в репозиторий с английской документацией - https://github.com/php/doc-en.
Как по мне - это действительно круто. В случае адекватного ревью документация может расшириться примерами, описанием неявных мест и подводных камней.
​Книги # 1. Думай медленно - решай быстро

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

Сегодня краткая рецензия на одну из самых интересных и объемных на новую информацию книг от нобелевского лауреата Даниеля Канемана - "Думай медленно ... Решай быстро".

https://graph.org/Knigi--1-Dumaj-medlenno---reshaj-bystro-02-12
​Я выздоровел и продолжаю наводить активность.

Сегодня у нас дайджест интересных материалов и новостей из мира PHP.

1. Небольшая и крутая статья, которая точно не будет лишней (а ещё её можно скидывать ответом на комментарии в твоём PR) - Как писать читаемый PHP-код - https://freek.dev/1593-writer-readable-php-avoid-indentation-by-returning-early

Или почему

public function doSomething($someParameter, $someOtherParameter)
{
if ($someParameter !== 0) {
return;
}

if ($someOtherParameter !== 0) {
return;
}

// do the actual work
}

Гораздо лучше, чем

if ($someParameter !== 0 || $someOtherParameter !== 0)

2. https://github.com/shivammathur/setup-php - надстройка над github actions, специально для PHP. Последнее время много и часто говорят об этом инструменте от github, так что в конце недели у нас на канале выйдет материал по настройке и работе с github actions.

3. Поговаривают, что codeigniter дропнулся с номером 4.0, после 5-ти лет разработки (жалко, что ребята обновили фреймворк, но забыли обновить сайт с web 1.0). Кто писал - что скажете? Стоит рассмотреть? Какие есть плюсы, какие минусы? С кем из передовой троицы (Symfony, Laravel, Yii) его можно сравнить?

4. Занятный, на первый взгляд, инструмент для построения консольных приложений на нативном PHP - https://github.com/minicli/minicli
Удобные контроллеры, поддержка большой работы с аргументами и огромный вывод информации. Как минималистичное решение для небольшого микросервиса, который не требует зависимостей, - вполне может подойти.

5. Laravel обновился до 7-ой версии. Из вкусного, на что стоит обратить внимание:

5.1 https://laravel.com/docs/7.x/airlock - минималистичное решение для аутентификации клиентов посредством токенов. Я, как тот, кто любит разделять backend и клиентов, обязательно рассмотрю, какие плюсы и минусы есть у этой библиотеки и чем работа с ней отличается от аутентификаторов в Symfony.

5.2 Для Eloquent'а появилась возможность писать кастомные get/set-методы, инкапсулирующие логику работы с какой-либо структурой данных. Например, можно написать get/set для Json (где будет json_encode/json_decode), а потом работать с json-типом как с базовым.

5.3 Обновился HTTP-клиент! Ребята сделали обёртку поверх Guzzle, за что им огромное спасибо. Вместо не особо красивых интерпретаций вроде

$this->guzzleClient->request('POST',
'.../url/...',
[
'headers' => $content['headers'],
'json' => [
"paramsNames" => $content['content'],
]
]
);

Можно будет писать красивые:

$response = Http::withHeaders([
'X-First' => 'foo',
'X-Second' => 'bar'
])->post('http://test.com/users', [
'name' => 'Taylor',
]);

Надо будет протестировать и с радостью заюзаю в своих проектах.

6. SymfonyCast (https://symfonycasts.com/screencast/symfony) дропнул плейлист с уроками по Symfony 5. Теперь тебе есть что посмотреть вечером со своей девушкой.
​Всем карантин, пацаны.

Разбавим этот смутный понедельник интересным дайджестом из мира близких нам технологий.

1. За прошедшую неделю была пара интересных RFC. Например, предлагают добавить возвращаемое значение из switch, чтобы вместо

switch ($x) {
case 0:
$y = 'Foo';
break;
case 1:
$y = 'Bar';
break;
case 2:
$y = 'Baz';
break;
}

var_dump($y);

можно было написать:
$y = $x switch {
0 => 'Foo',
1 => 'Bar',
2 => 'Baz',
};

var_dump($y);

Меньше кода, читается не хуже, почему бы и нет?

Ещё один RFC, который предлагают включить в следующий релиз - это возможность объявления полей класса в конструкторе, как в TypeScript:
class Point {
public function __construct(
public float $x = 0.0,
public float $y = 0.0,
public float $z = 0.0
) {}
}

Лично мне такая идея не кажется хорошей - кода явно меньше, но не пострадает ли от этого его качество? Мне кажется, что объявление на уровне класса и инициализация уже объявленных переменных - не должна быть в одном месте.

2. Ребята из Psalm (самый, наверное, популярный статический анализатор для PHP) добавили ссылки в сообщения анализатора, чтобы можно было быстро ознакомиться с проблемой более подробно. Теперь сообщения линтера выглядят так:
ERROR: InvalidArgument - somefile.php:8:19 - Argument 1 of getAttribute expects string, int provided (see https://psalm.dev/004)

Мелочь, а приятно :)

3. SkyEng 28-ого числа провели очень крутую вещь - online PHP-митап. В условиях карантина (я надеюсь ты его не нарушаешь), самоизоляции и плохого настроения такие события всегда радуют. Обсуждали легаси, GraphQL, работу на удалёнке, монолиты и прочие прелести разработки. Посмотреть можно тут.
Надеюсь, что и другие митапы, которые должны были пройти в офлайне, не отменятся, а пройдут в онлайн-режиме (календарь митапов на русском языке можно чекать тут)

4. Опубликовали библиотеку для разработки мини-игр на PHP (со статусом - work in progress). Смысла в ней я особо не вижу, но выглядит мило :) В любом случае респект разработчику за такую работу.

5. Немного о VUE: релизнули в статусе WIP 3-ю версию VueJS:
Изменения можно посмотреть тут.

Не болейте, друзья, и соблюдайте карантин - сейчас это наиболее важно. Всем хорошего начала недели!
Дайджест интересного за 30 марта - 5 апреля от JunSenior

Начнём с приятного - с обновлений. Объявили о датах релизов PHP 8! Альфа-версия, рассчитанная на тесты и поиск ошибок, должна быть выложена в июне этого года, а основная версия - в начале декабря. О новых функциях, возможностях и приятных ништяках можно прочитать тут.

Предложен интересный и удобный, как по-мне, RFC: https://wiki.php.net/rfc/throw_expression - предлагают приравнять оператор throw к выражению. Это позволит выбрасывать исключение в тех местах, где можно использовать только выражения (стрелочные функции, тернарные операторы). Например, появится возможность использовать такие конструкции:
$value = $nullableValue ?? throw new InvalidArgumentException();

Либо мы получаем значение $nullableValue, если оно не null, либо выбрасываем исключение. В принципе - удобно, позволяет отказаться от лишнего условия ниже.

В календарь митапов занесли новый онлайн-митап от минского сообщества PHP of By.
Информацию о том во сколько, где и как я пока не нашёл, так что мониторим и ждём - онлайн-митапы в период карантина - это то, что нужно. А ещё в чате ребята обсуждали, что хотят повторить опыт онлайн-митапа от skyeng по отправке пиццы тебе домой, если задашь годный вопрос :)

На фоне обрушения валюты, бушующей пандемии коронавируса и вхождения в мировую финансовую рецессию, какой-то чувак сидит и безмятежно пилит крутое OpenGL-демо на чистом PHP. Пока реддиторы активно это обсуждают, я хочу задать автору пару вопросов: зачем, ради чего и скольких слёз это стоило? А в целом - очень круто :) Поставь автору звёздочку на гитхабе, он заслужил.

Немного о Vue:

Образовательная платформа pluralsight с курсами по vue, firebase, node, js на период апреля открыла бесплатный доступ к множеству курсов. Отличная возможность, если ты хотел узнать что-то новое из этого стека. А ребятам из pluralsight - респект.
Forwarded from PHP Digest
PhpStorm 2020.1

Первое мажорное обновление в этом году зарелизили из дома. Под капотом поддержка composer.json, покрытие кода с PCOV и PHPDBG, улучшения для метаданных и вывода типов в PHP, инструменты для PHPUnit, проверка правописания и грамматики и много другого.

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

https://habr.com/ru/company/JetBrains/blog/497358/