Мы начинаем открытое собеседование! Присоединяйтесь!
Update: Cтрим закончился, по ссылке запись. Код для ревью и задача по SQL в описании под видео.
https://www.youtube.com/watch?v=FQNd9W3nb3A
Update: Cтрим закончился, по ссылке запись. Код для ревью и задача по SQL в описании под видео.
https://www.youtube.com/watch?v=FQNd9W3nb3A
YouTube
Открытое собеседование PHP Point #1 / Валентин Удальцов vs Патрик Фельдеш
О Патрике: https://career.habr.com/sspat
Код для ревью: https://gist.github.com/vudaltsov/e6f7dd83a88b349cd5ee0e0d1795e5aa
Задача на SQL: https://gist.github.com/vudaltsov/e3d06ef2158a248337aa262a9fb60b5f
Большое спасибо Антону Мореву за помощь с трансляцией.…
Код для ревью: https://gist.github.com/vudaltsov/e6f7dd83a88b349cd5ee0e0d1795e5aa
Задача на SQL: https://gist.github.com/vudaltsov/e3d06ef2158a248337aa262a9fb60b5f
Большое спасибо Антону Мореву за помощь с трансляцией.…
Понравилась статья Null is your friend, not a mistake.
Главный тезис: сама по себе концепция null не является ошибкой (в миллиард долларов), ошибочна система типов Java, которая считает null частью любого типа.
Для понимания. В PHP у нас с этим всё хорошо 😳: мы явно помечаем тип
https://medium.com/@elizarov/null-is-your-friend-not-a-mistake-b63ff1751dd5
За статью спасибо @Enleur.
Главный тезис: сама по себе концепция null не является ошибкой (в миллиард долларов), ошибочна система типов Java, которая считает null частью любого типа.
Для понимания. В PHP у нас с этим всё хорошо 😳: мы явно помечаем тип
X как nullable при помощи символа вопроса ?X. В Java такого нет, переменная типа X может иметь значение X или null. Поэтому у новичков (которые не выбрали Kotlin) часто проблемы с NullPointerException, а в коде на Java присутствуют костыли @Nullable и @NotNull и/или "избыточные" проверки null != $obj.https://medium.com/@elizarov/null-is-your-friend-not-a-mistake-b63ff1751dd5
За статью спасибо @Enleur.
Medium
Null is your friend, not a mistake
NullPointerException is dreaded in Java. All sorts of workarounds exist to avoid nulls. Fear not. They are not needed with Kotlin.
Эффективно игнорим исключения в Psalm
Вчера счастью моему не было предела, когда в https://github.com/vimeo/psalm/issues/3286 через 3 месяца мне ответили, что в
Игнорить следует unchecked исключения (подклассы
Кстати, в PhpStorm в разделе Preferences > Languages & Frameworks > PHP тоже можно указывать, какие исключения считать unchecked.
Вчера счастью моему не было предела, когда в https://github.com/vimeo/psalm/issues/3286 через 3 месяца мне ответили, что в
psalm.xml в разделе <ignoreExceptions> есть незадокументированный тег <classAndDescendants>. При помощи него уже давным давно можно игнорить исключение и все его подклассы. На скрине до и после 🤣Игнорить следует unchecked исключения (подклассы
RuntimeException, LogicException и Error). Ну и иногда можно позволить себе игнорить некоторые checked, чтобы не захламлять проект бесконечными @throws, которые едва ли можно как-то обработать.Кстати, в PhpStorm в разделе Preferences > Languages & Frameworks > PHP тоже можно указывать, какие исключения считать unchecked.
Если вы достаточно хорошо знаете английский, советую вот это выступление Дяди Боба.
Отличный стендап для буднего вечера 😅
https://www.youtube.com/watch?v=QHnLmvDxGTY
Отличный стендап для буднего вечера 😅
https://www.youtube.com/watch?v=QHnLmvDxGTY
YouTube
"Uncle" Bob Martin
Software luminary “Uncle Bob” Martin spoke to members of the Yale and New Haven communities at Yale School of Management. Martin had been a professional programmer since 1970; since then he has become a prolific author and leader in the industry.
Dan Bernier…
Dan Bernier…
Поиск и устранение утечек памяти в PHP с разбором реального примера
29 июля, в эту среду, в 18:00 я проведу стрим на канале PHP Point.
Примерный план:
• поговорим о видах утечек и инструментах для их поиска;
• установим один проблемный компонент Symfony и найдём в нём утечку;
• запилим быстрый фикс для проекта при помощи Compiler Pass;
• если успеем, сделаем Pull Request в репозиторий Symfony.
https://www.youtube.com/watch?v=NNMp-97rk9c
29 июля, в эту среду, в 18:00 я проведу стрим на канале PHP Point.
Примерный план:
• поговорим о видах утечек и инструментах для их поиска;
• установим один проблемный компонент Symfony и найдём в нём утечку;
• запилим быстрый фикс для проекта при помощи Compiler Pass;
• если успеем, сделаем Pull Request в репозиторий Symfony.
https://www.youtube.com/watch?v=NNMp-97rk9c
YouTube
Поиск и устранение утечек памяти в PHP / Валентин Удальцов
00:00:00 Приветствие
00:02:16 Обзор утечек памяти в PHP
00:06:38 ProgressBar Symfony Console для контроля расхода памяти в консольных командах
00:11:27 MemoryInterrupter для контроля расхода памяти в демонах
00:14:34 Нюанс про память в --env=dev при работе…
00:02:16 Обзор утечек памяти в PHP
00:06:38 ProgressBar Symfony Console для контроля расхода памяти в консольных командах
00:11:27 MemoryInterrupter для контроля расхода памяти в демонах
00:14:34 Нюанс про память в --env=dev при работе…
Forwarded from Галера Морева
#MoreView #13 | Валентин Удальцов – Автор канала "Пых" и ведущий разработчик в Happy Job
Продолжаю брать интервью у людей из мира PHP. На этот раз в гостях Валентин Удальцов. Я познакомился с ним в процессе организации онлайн-собеседования PHP разработчика. После предыдущего интервью с Дмитрием Елисеевым я понял что мне интересно еще поговорить про PHP и я сразу вспомнил про следующего гостя:)
В четверг в 17.00 поговорим про PHP, архитектуру, Пых, музыку и многое другое в онлайн формате. Приходите, задавайте вопросы и выигрывайте пиццу за лучший вопрос:)
Подробнее о выпуске: amorev.ru/moreview-13-valentin-udaltsov
Ссылка на трансляцию: youtu.be/LOrb3m0FQdU
Продолжаю брать интервью у людей из мира PHP. На этот раз в гостях Валентин Удальцов. Я познакомился с ним в процессе организации онлайн-собеседования PHP разработчика. После предыдущего интервью с Дмитрием Елисеевым я понял что мне интересно еще поговорить про PHP и я сразу вспомнил про следующего гостя:)
В четверг в 17.00 поговорим про PHP, архитектуру, Пых, музыку и многое другое в онлайн формате. Приходите, задавайте вопросы и выигрывайте пиццу за лучший вопрос:)
Подробнее о выпуске: amorev.ru/moreview-13-valentin-udaltsov
Ссылка на трансляцию: youtu.be/LOrb3m0FQdU
Как сделать тестируемым класс, использующий нечистую встроенную функцию PHP?
Очень просто — объявить функцию необязательным параметром конструктора.
Не советую использовать либы-костыли типа php-mock/php-mock.
Очень просто — объявить функцию необязательным параметром конструктора.
final class Service
{
/**
* @psalm-var callable(): int
*/
private $time;
/**
* @psalm-param ?callable(): int $time
*/
public function __construct(?callable $time = null)
{
$this->time = $time ?? 'time';
}
public function do(): void
{
$time = ($this->time)();
}
}
$service = new Service();
$serviceForTesting = new Service(static fn (): int => 1234567890);
Не советую использовать либы-костыли типа php-mock/php-mock.
Через 5 минут начинаю рассказывать про утечки памяти в PHP!
Присоединяйтесь, обсудим инструменты, лайфхаки и проанализируем реальный кейс.
https://www.youtube.com/watch?v=NNMp-97rk9c
Присоединяйтесь, обсудим инструменты, лайфхаки и проанализируем реальный кейс.
https://www.youtube.com/watch?v=NNMp-97rk9c
YouTube
Поиск и устранение утечек памяти в PHP / Валентин Удальцов
00:00:00 Приветствие
00:02:16 Обзор утечек памяти в PHP
00:06:38 ProgressBar Symfony Console для контроля расхода памяти в консольных командах
00:11:27 MemoryInterrupter для контроля расхода памяти в демонах
00:14:34 Нюанс про память в --env=dev при работе…
00:02:16 Обзор утечек памяти в PHP
00:06:38 ProgressBar Symfony Console для контроля расхода памяти в консольных командах
00:11:27 MemoryInterrupter для контроля расхода памяти в демонах
00:14:34 Нюанс про память в --env=dev при работе…
Через несколько минут я окажусь в гостях у Антона Морева на канале MoreView!
Буду ждать ваши каверзные вопросы 😅
По словам Антона, автор самого крутого вопроса получит 🍕
https://www.youtube.com/watch?v=LOrb3m0FQdU
Буду ждать ваши каверзные вопросы 😅
По словам Антона, автор самого крутого вопроса получит 🍕
https://www.youtube.com/watch?v=LOrb3m0FQdU
YouTube
MoreView #13 | Валентин Удальцов – Автор канала "Пых" и ведущий разработчик в Happy Job
Enjoy the videos and music you love, upload original content, and share it all with friends, family, and the world on YouTube.
Вчера в интервью 🎙 я умудрился в одно предложение засунуть сразу 4 баззворда:
функциональный язык, агрегат, Event Sourcing и чистые функции.
Спешу поделиться докладом, который придал мне столько смелости 🤣
У него довольно неочевидное название, но очень крутое содержание.
https://www.youtube.com/watch?v=USSkidmaS6w
функциональный язык, агрегат, Event Sourcing и чистые функции.
Спешу поделиться докладом, который придал мне столько смелости 🤣
У него довольно неочевидное название, но очень крутое содержание.
https://www.youtube.com/watch?v=USSkidmaS6w
YouTube
Reinventing the Transaction Script - Scott Wlaschin
The Transaction Script pattern organizes business logic as a single procedure. It has always been considered less sophisticated and flexible than a layered architecture with a rich domain model. But is that really true?
In this talk, we'll reinvent the Transaction…
In this talk, we'll reinvent the Transaction…
Выступление Егора Бугаенко, где помимо смешного троллинга много полезных советов для разработчиков.
https://www.youtube.com/watch?v=m5mPtC7LYiY
https://www.youtube.com/watch?v=m5mPtC7LYiY
YouTube
Инвестор & Java программист о минусах Кремниевой долины, женщинах в IT и качестве кода
Егор Бугаенко — CEO и основатель Zerocracy, Java и Ruby программист, автор Elegant Objects, серии книг об ООП. Когда-то Егора не взяли в Амазон из-за неаккуратных высказываний в его блоге, но он не жалеет об этом.
Благодарность за выпуск #tceh — коворкинг…
Благодарность за выпуск #tceh — коворкинг…
Media is too big
VIEW IN TELEGRAM
После интервью ребята в нашем обсуждении предложили выяснить, как много среди нас музыкантов 🎼
За барабанами ваш покорный слуга ☺️
За барабанами ваш покорный слуга ☺️
На прошлой неделе я провёл стрим про утечки памяти в PHP
По ссылке запись трансляции с таймкодами и разбивкой на эпизоды.
https://www.youtube.com/watch?v=NNMp-97rk9c
По результатам я предложил два изменения в Symfony, оба уже приняты:
#37705 добавить тег kernel.reset для сервиса mailer.logger_message_listener,
#37712 перенести MessageLoggerListener в конфиг mailer_debug.
По ссылке запись трансляции с таймкодами и разбивкой на эпизоды.
https://www.youtube.com/watch?v=NNMp-97rk9c
По результатам я предложил два изменения в Symfony, оба уже приняты:
#37705 добавить тег kernel.reset для сервиса mailer.logger_message_listener,
#37712 перенести MessageLoggerListener в конфиг mailer_debug.
time_diff_ms(DateTimeImmutable, DateTimeImmutable): int
Вчера игрался с задержками (delay) в брокерах сообщений.
Потребовалась функция для нахождения разницы между двумя метками времени в миллисекундах.
Ловите Gist с функцией и юнит-тестом 🍭
https://gist.github.com/vudaltsov/0bb623b9e2817d6ce359eb88cfbf229d
Вчера игрался с задержками (delay) в брокерах сообщений.
Потребовалась функция для нахождения разницы между двумя метками времени в миллисекундах.
Ловите Gist с функцией и юнит-тестом 🍭
https://gist.github.com/vudaltsov/0bb623b9e2817d6ce359eb88cfbf229d
Gist
time_diff_ms.php
GitHub Gist: instantly share code, notes, and snippets.
В обсуждении ребята подняли вопрос об учёте часовых поясов в функции из поста выше.
time_diff_ms() корректно учитывает временные зоны, так как сравнивает абсолютные метки времени, а не время настенных часов (wall-clock time).
Попутно мы выяснили, что метод
Добавил в Gist тесты для всех сценариев создания объекта времени.
https://gist.github.com/vudaltsov/0bb623b9e2817d6ce359eb88cfbf229d#file-time_diff_ms_test-php
time_diff_ms() корректно учитывает временные зоны, так как сравнивает абсолютные метки времени, а не время настенных часов (wall-clock time).
Попутно мы выяснили, что метод
DateTime(Immutable)::setTimezone() не изменяет абсолютное время, просто адаптирует время настенных часов под часовой пояс. Метка времени до и после setTimezone() остаётся такой же. Смотрите также комментарий к документации метода.Добавил в Gist тесты для всех сценариев создания объекта времени.
https://gist.github.com/vudaltsov/0bb623b9e2817d6ce359eb88cfbf229d#file-time_diff_ms_test-php
Gist
time_diff_ms.php
GitHub Gist: instantly share code, notes, and snippets.
Как одним выражением прочитать и изменить свойство
Этот приём можно использовать, например, в базовом классе корня агрегата.
Некогда подглядел у @fes0r.
[$currentValue, $this->property] = [$this->property, $newValue];Этот приём можно использовать, например, в базовом классе корня агрегата.
abstract class AggregateRoot
{
/**
* @psalm-var list<object>
*/
private array $events = [];
/**
* @psalm-return list<object>
*/
final public function releaseEvents(): array
{
▶ [$events, $this->events] = [$this->events, []];
return $events;
}
final protected function raise(object $event, object ...$events): void
{
$this->events = [...$this->events, $event, ...$events];
}
}
Некогда подглядел у @fes0r.
Пыхарь, что ты используешь для времени?
Anonymous Poll
26%
int (timestamp)
4%
string
43%
DateTime
36%
DateTimeImmutable
28%
nesbot/carbon
1%
cakephp/chronos
1%
другую стороннюю либу (напиши в обсуждении, какую)
1%
свою либу (напиши, что тебе это даёт)
Недавно узнал, что есть подход, при котором юнит-тесты кладут рядом с тестируемыми классами 🤔
Примеры:
• https://github.com/thephpleague/flysystem/tree/2.x/src,
• https://github.com/EventSaucePHP/EventSauce/tree/master/src/Integration.
Выглядит заманчиво — не надо синхронизировать две файловые структуры и бегать туда-сюда. И на ревью сразу видно, написан тест для нового класса или нет. Также этот подход должен повысить мобильность модулей кода — модуль не надо собирать по папкам
В библиотеках такие тесты легко удалить из архива правилом
Что думаете? Приглашаю обсудить в Пыхтелку 🐯
Примеры:
• https://github.com/thephpleague/flysystem/tree/2.x/src,
• https://github.com/EventSaucePHP/EventSauce/tree/master/src/Integration.
Выглядит заманчиво — не надо синхронизировать две файловые структуры и бегать туда-сюда. И на ревью сразу видно, написан тест для нового класса или нет. Также этот подход должен повысить мобильность модулей кода — модуль не надо собирать по папкам
src и test, чтобы переименовать или вынести в Composer-пакет.В библиотеках такие тесты легко удалить из архива правилом
**/*Test.php export-ignore в .gitattributes. Проект можно аналогичным образом чистить перед деплойментом.Что думаете? Приглашаю обсудить в Пыхтелку 🐯