Forwarded from PHP Digest
Открытое собеседование по PHP | Эпизод #2 — Прием заявок
Пилотный выпуск открытого собеседования зашел отлично, и мы получили много ценных отзывов. Спасибо всем, кто был с нами на стриме и задавал вопросы!
Если вдруг вы не видели первый выпуск, то вот запись https://www.youtube.com/watch?v=FQNd9W3nb3A
Тем временем начинаем подготовку второго выпуска!
Требования для участия не поменялись:
• уровень middle/senior;
• PHP 7.x, PSR;
• ООП, SOLID, coupling/cohesion, вот это все;
• тестирование, PHPUnit;
• желателен опыт с Symfony 4/5;
• SQL, желательно PostgreSQL;
• представление о современных трендах в архитектуре приложений.
Темы будут ± те же, а вот вопросы подготовим новые, без Psalm 🙂
Заявку на участие можно отправить до 27 августа через форму: https://forms.gle/ES3nXiwf4ycosGEy9.
Вопросы в личку: @vudaltsov, @pronskiy.
Пилотный выпуск открытого собеседования зашел отлично, и мы получили много ценных отзывов. Спасибо всем, кто был с нами на стриме и задавал вопросы!
Если вдруг вы не видели первый выпуск, то вот запись https://www.youtube.com/watch?v=FQNd9W3nb3A
Тем временем начинаем подготовку второго выпуска!
Требования для участия не поменялись:
• уровень middle/senior;
• PHP 7.x, PSR;
• ООП, SOLID, coupling/cohesion, вот это все;
• тестирование, PHPUnit;
• желателен опыт с Symfony 4/5;
• SQL, желательно PostgreSQL;
• представление о современных трендах в архитектуре приложений.
Темы будут ± те же, а вот вопросы подготовим новые, без Psalm 🙂
Заявку на участие можно отправить до 27 августа через форму: https://forms.gle/ES3nXiwf4ycosGEy9.
Вопросы в личку: @vudaltsov, @pronskiy.
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
Большое спасибо Антону Мореву за помощь с трансляцией.…
Раньше, чтобы создать nullable ValueObject из nullable примитива, приходилось писать колбасу вроде
Сегодня условные типы Psalm позволяют перенести if в статический конструктор:
https://psalm.dev/r/ab0090be4c
null === $stringClientId ? null : ClientId::fromString($stringClientId).
Сегодня условные типы Psalm позволяют перенести if в статический конструктор:
/**
* @template T of ?string
* @psalm-param T $id
* @psalm-return (T is null ? null : self)
*/
public static function fromString(?string $id): ?self
{
if (null === $id) {
return null;
}
Assert::uuid($id);
return new self($id);
}
ClientId::fromString($stringClientId)
https://psalm.dev/r/ab0090be4c
psalm.dev
Conditional love
Before Psalm was open-sourced, I had to first get it working on Vimeo’s codebase. One of the early hurdles was picking a return type for the…
Рекомендую доклад Temporal Modeling.
Mathias Verraes демонстрирует, как моделировать поведение через события и процессы, а не структуры данных и состояние. Такой подход повышает эффективность взаимодействия с бизнесом и позволяет ещё на этапе обсуждения выявить больше нюансов предметной области.
https://youtu.be/hh5lskgATCk
Список всех докладов Матиаса на эту тему
Mathias Verraes демонстрирует, как моделировать поведение через события и процессы, а не структуры данных и состояние. Такой подход повышает эффективность взаимодействия с бизнесом и позволяет ещё на этапе обсуждения выявить больше нюансов предметной области.
https://youtu.be/hh5lskgATCk
Список всех докладов Матиаса на эту тему
YouTube
Mathias Verraes - Talk Session: Temporal Modeling
Explore DDD 2019 - Denver, Sept. 16-20
Event Storming, Event Sourcing, CQRS, messaging, distributed systems … In one way or another, they're all about time. Traditional modeling styles, focused on things and structures, are not the primary way anymore to…
Event Storming, Event Sourcing, CQRS, messaging, distributed systems … In one way or another, they're all about time. Traditional modeling styles, focused on things and structures, are not the primary way anymore to…
> Вам нужны условия Йоды только если ваши тесты 💩 и вы думаете, что перестановка аргументов сравнения имеет большее значение, чем корректная запись ваших бизнес-правил.
https://twitter.com/frankdejonge/status/1298602389281411072
Мы используем в проекте условия Йоды (и фиксер yoda_style), но этот твит заставил меня задуматься, зачем 🤣
Когда-то давно я бы ответил "потому что так в Symfony Coding Standards", позже "потому что так удобнее присваивать результат сравнения", сегодня "только потому что привык".
https://twitter.com/frankdejonge/status/1298602389281411072
Мы используем в проекте условия Йоды (и фиксер yoda_style), но этот твит заставил меня задуматься, зачем 🤣
Когда-то давно я бы ответил "потому что так в Symfony Coding Standards", позже "потому что так удобнее присваивать результат сравнения", сегодня "только потому что привык".
Twitter
Frank de Jonge
You only need yoda-conditions if your test suit is 💩 and you think switching your comparator values is better than proofing your business-rules are functioning as they should. Don't #[At] me.
Пояснение к моей задаче на канале PHP задачи с собеседований.
Метод
Интересно, что вызов магических методов для неинициализированных свойств изначально был предусмотрен в RFC: Typed Properties 2.0 и имплементирован в
Чтобы всё-таки стриггерить
Пара статей про ленивую инициализацию свойств:
• https://ocramius.github.io/blog/intercepting-public-property-access-in-php/,
• https://ocramius.github.io/blog/lazy-property-automatic-property-initialization/.
Метод
__get()
выполняется при попытке чтения из недоступных (защищённых или приватных) или несуществующих свойств. Публичное неинициализированное типизированное свойство таковым не является.Интересно, что вызов магических методов для неинициализированных свойств изначально был предусмотрен в RFC: Typed Properties 2.0 и имплементирован в
7.4.0
. Однако после обсуждения различных WTF кейсов этот функционал был удалён в 7.4.1
.Чтобы всё-таки стриггерить
__get
, __set
, __isset
или __unset
для типизированного свойства, необходимо сначала "удалить" его через unset
: https://3v4l.org/RbFFM.Пара статей про ленивую инициализацию свойств:
• https://ocramius.github.io/blog/intercepting-public-property-access-in-php/,
• https://ocramius.github.io/blog/lazy-property-automatic-property-initialization/.
Telegram
PHP задачи с собеседований
Что выведет код?
Наброски системы плагинов для Infection от @ocramius
https://github.com/infection/infection/issues/1323
Пример того, как надо оформлять RFC issue в проектах с открытым исходным кодом 👍
Кстати, интересно, что тикеты в Infection (фреймворк Максима Рафалко для мутационного тестирования) уже не в первый раз становятся источником знаний и вдохновения для PHP сообщества 🔥
Также смотрите треды в Twitter на эту тему:
• https://twitter.com/Ocramius/status/1302886222747119616,
• https://twitter.com/slamzoe/status/1302909388894724101.
https://github.com/infection/infection/issues/1323
Пример того, как надо оформлять RFC issue в проектах с открытым исходным кодом 👍
Кстати, интересно, что тикеты в Infection (фреймворк Максима Рафалко для мутационного тестирования) уже не в первый раз становятся источником знаний и вдохновения для PHP сообщества 🔥
Также смотрите треды в Twitter на эту тему:
• https://twitter.com/Ocramius/status/1302886222747119616,
• https://twitter.com/slamzoe/status/1302909388894724101.
GitHub
Plugin system to allow pre-/post- filtering and modification of mutations · Issue #1323 · infection/infection
Scope - third-party tools integration The idea is relatively simple: some mutations don't make sense, according to other tools that are completely third-party to infection. Such tools could say...
Полезная задачка про
https://www.tg-me.com/phpquiz/309
json_encode
в PHP 7.4 от меня на канале PHP задачи с собеседований.https://www.tg-me.com/phpquiz/309
Telegram
PHP задачи с собеседований
Что выведет код?
Вспомнил, что ещё в декабре мы горячо обсуждали этот нюанс в чате @symfony_php.
В результате прений я сделал Pull Request, который привёл в соответствие поведение Symfony Serializer.
https://github.com/symfony/symfony/pull/34791
В результате прений я сделал Pull Request, который привёл в соответствие поведение Symfony Serializer.
https://github.com/symfony/symfony/pull/34791
GitHub
[Serializer] Skip uninitialized (PHP 7.4) properties in PropertyNormalizer and ObjectNormalizer by vudaltsov · Pull Request #34791…
Q
A
Branch?
3.4
Bug fix?
yes
New feature?
no
Deprecations?
no
Tickets
n/a
License
MIT
Doc PR
n/a
When trying to read from an uninitialized property in PHP 7.4, a TypeError is gen...
A
Branch?
3.4
Bug fix?
yes
New feature?
no
Deprecations?
no
Tickets
n/a
License
MIT
Doc PR
n/a
When trying to read from an uninitialized property in PHP 7.4, a TypeError is gen...
Какая у тебя ЗП в тысячах рублей?
Дудь, разлогинься 😂
Дудь, разлогинься 😂
Final Results
15%
<50
25%
50-100
21%
100-150
16%
150-200
9%
200-250
4%
250-300
2%
300-350
1%
350-400
1%
400-450
4%
>450
Ищу к себе в команду middle PHP-разработчика
В Happy Inc мы исследуем вовлечённость и лояльность персонала в крупных компаниях. По-простому — собираем данные и строим отчёты. Но всё это приправлено многогранной бизнес-логикой, сложной авторизацией и прочими ноу-хау.
PHP 7.4 / Symfony 5.1 / PostgreSQL 12 / OpenAPI / CQRS / ES / DDD / Psalm на максималках и всё, о чём я тут рассказываю 😜
Full-time, Москва, БЦ Варшавка Sky, ЗП по результатам собеса.
https://happy-job.ru/vacancy-super-php-2020-10
Резюме можно присылать сразу мне @vudaltsov.
В Happy Inc мы исследуем вовлечённость и лояльность персонала в крупных компаниях. По-простому — собираем данные и строим отчёты. Но всё это приправлено многогранной бизнес-логикой, сложной авторизацией и прочими ноу-хау.
PHP 7.4 / Symfony 5.1 / PostgreSQL 12 / OpenAPI / CQRS / ES / DDD / Psalm на максималках и всё, о чём я тут рассказываю 😜
Full-time, Москва, БЦ Варшавка Sky, ЗП по результатам собеса.
https://happy-job.ru/vacancy-super-php-2020-10
Резюме можно присылать сразу мне @vudaltsov.
Сегодня ребята в Пыхтелке активно обсуждают JWT vs Server Side Sessions, поддерживаю разговор мыслями и ссылками.
• Сессии — это абсолютно валидный, неустаревший подход. Не стоит переписывать аутентификацию из-за хайпа вокруг JWT.
• Сессии усложняют горизонтальное масштабирование, но так ли остро стоит этот вопрос в вашем проекте?
• Стандарт JWT действительно несовершенен, история помнит несколько серьёзных уязвимостей в его реализациях. Но в 2020 это не так актуально, просто проверьте, что вы обновили библиотеки.
• JWT не предусматривает простого механизма инвалидации токена. Либо придётся выставлять короткий Expiration Time, либо строить сложный statefull механизм для гибкого контроля выданных токенов.
• JWT удобен для организации временного ограниченного доступа к конкретным операциям/ресурсам: эндпойнтам API, файлам, действиям по ссылкам из персонализированных рассылок.
• Сессии — это абсолютно валидный, неустаревший подход. Не стоит переписывать аутентификацию из-за хайпа вокруг JWT.
• Сессии усложняют горизонтальное масштабирование, но так ли остро стоит этот вопрос в вашем проекте?
• Стандарт JWT действительно несовершенен, история помнит несколько серьёзных уязвимостей в его реализациях. Но в 2020 это не так актуально, просто проверьте, что вы обновили библиотеки.
• JWT не предусматривает простого механизма инвалидации токена. Либо придётся выставлять короткий Expiration Time, либо строить сложный statefull механизм для гибкого контроля выданных токенов.
• JWT удобен для организации временного ограниченного доступа к конкретным операциям/ресурсам: эндпойнтам API, файлам, действиям по ссылкам из персонализированных рассылок.
Несколько статей "за" и "против":
• https://medium.com/swlh/why-do-we-need-the-json-web-token-jwt-in-the-modern-web-8490a7284482,
• https://hasura.io/blog/best-practices-of-using-jwt-with-graphql/,
• https://jolicode.com/blog/why-you-dont-need-jwt,
• https://paragonie.com/blog/2017/03/jwt-json-web-tokens-is-bad-standard-that-everyone-should-avoid.
• https://medium.com/swlh/why-do-we-need-the-json-web-token-jwt-in-the-modern-web-8490a7284482,
• https://hasura.io/blog/best-practices-of-using-jwt-with-graphql/,
• https://jolicode.com/blog/why-you-dont-need-jwt,
• https://paragonie.com/blog/2017/03/jwt-json-web-tokens-is-bad-standard-that-everyone-should-avoid.
⚠️ Небольшое сообщение для тех, кто обновил Symfony до 4.4.14 / 5.1.6
Обратите внимание, что рядом с вашим
В соответствии с обновленным рецептом его нужно загитигнорить, а также добавить в исключения статических анализаторов во избежание ошибок, связанных с косвенным анализом классов
Спасибо @Taarim за наводку 😊
Обратите внимание, что рядом с вашим
src/Kernel.php
появился автогенерируемый файл .preload.php
(#38140, #38142, документация).В соответствии с обновленным рецептом его нужно загитигнорить, а также добавить в исключения статических анализаторов во избежание ошибок, связанных с косвенным анализом классов
vendor
через этот файл.Спасибо @Taarim за наводку 😊
Symfony
Symfony 4.4.14 released (Symfony Blog)
Symfony 4.4.14 has just been released.
Приглашаю всех на стрим о рефакторинге!
В четверг вечером я с Леонидом Корсаковым буду в прямом эфире "наперегонки" комментировать и рефакторить одну известную open source библиотеку. Посмотрим, что из этого выйдет 😅
1 октября / четверг / 19:00
Организаторы из Skyeng обещают призы 🎁:
🐘 фирменного PHP слона за лучшую зрительскую историю о рефакторинге,
🔑 несколько лицензий на PhpStorm за вопросы в эфире голосом!
https://www.youtube.com/watch?v=liMyAuxIoyM
В четверг вечером я с Леонидом Корсаковым буду в прямом эфире "наперегонки" комментировать и рефакторить одну известную open source библиотеку. Посмотрим, что из этого выйдет 😅
1 октября / четверг / 19:00
Организаторы из Skyeng обещают призы 🎁:
🐘 фирменного PHP слона за лучшую зрительскую историю о рефакторинге,
🔑 несколько лицензий на PhpStorm за вопросы в эфире голосом!
https://www.youtube.com/watch?v=liMyAuxIoyM
YouTube
Рефакторим c Александром Макаровым, Валентином Удальцовым, Валентином Назаровым, Леонидом Корсаковым
В четверг Александр Макаров (Yii) и Валентин Назаров (Skyeng) проведут стрим, на котором Валентин Удальцов (Пых) и Леонид Корсаков (PHP Kazan):
• посмотрят на код популярного гитхаб-проекта,
• найдут, что там порефакторить (и порефакторят),
• поделятся своими…
• посмотрят на код популярного гитхаб-проекта,
• найдут, что там порефакторить (и порефакторят),
• поделятся своими…
Подкаст { Между скобок } про статический анализ
На прошлой неделе Сергей Жук предложил мне обсудить статанализ, и я был бы не я, если бы упустил возможность ввернуть пару монологов про Psalm 😆
И вот о чём мы поговорили:
• почему PHP пошел в сторону строгой типизации,
• для чего нужны статические анализаторы и как они работают,
• будущее статических анализаторов.
https://soundcloud.com/between-braces/11-valentin-udaltsov-staticheskiy-analiz
На прошлой неделе Сергей Жук предложил мне обсудить статанализ, и я был бы не я, если бы упустил возможность ввернуть пару монологов про Psalm 😆
И вот о чём мы поговорили:
• почему PHP пошел в сторону строгой типизации,
• для чего нужны статические анализаторы и как они работают,
• будущее статических анализаторов.
https://soundcloud.com/between-braces/11-valentin-udaltsov-staticheskiy-analiz
Четверо в YouTube, не считая кота 🐈
Вчера у нас получился любопытный стрим про рефакторинг. Приятная компания, интересное задание и достойная организация. Спасибо всем, кто слушал, комментировал и потом писал в личку ✊
Вкратце для тех, кто ещё не посмотрел. Я поленился по-честному отрефакторить yiisoft/validator, вместо этого воспользовался лазейкой "мажорный релиз" и предложил альтернативную архитектуру для библиотеки 😅
Что у меня получилось: https://github.com/phpyh/validator.
Мои пояснения на вчерашнем стриме: https://youtu.be/liMyAuxIoyM?t=4308.
Вчера у нас получился любопытный стрим про рефакторинг. Приятная компания, интересное задание и достойная организация. Спасибо всем, кто слушал, комментировал и потом писал в личку ✊
Вкратце для тех, кто ещё не посмотрел. Я поленился по-честному отрефакторить yiisoft/validator, вместо этого воспользовался лазейкой "мажорный релиз" и предложил альтернативную архитектуру для библиотеки 😅
Что у меня получилось: https://github.com/phpyh/validator.
Мои пояснения на вчерашнем стриме: https://youtu.be/liMyAuxIoyM?t=4308.
⚠️ Команда Symfony снова шалит в патч-апдейте 4.4.15 / 5.1.7 😏
Если вы вносили правки, описанные мной в посте от 28 сентября, то придётся их откатить: удалить
После этого нужно добавить в репозиторий (без игнора) один из вариантов файла
Если у вас ядро располагается в нестандартном месте, то файл
Если вы вносили правки, описанные мной в посте от 28 сентября, то придётся их откатить: удалить
src/.preload.php
и убрать соответствующие правила из .gitignore
и конфигов инструментов.После этого нужно добавить в репозиторий (без игнора) один из вариантов файла
config/preload.php
из обновленного рецепта. В папку с конфигами у меня статанализ не ходит, поэтому на этот раз исключение добавлять не пришлось.Если у вас ядро располагается в нестандартном месте, то файл
var/cache/prod/App_KernelProdContainer.preload.php
будет называться иначе. Вот как получить верный путь:bin/console c:c --env=prod
find var/cache/prod -name '*.preload.php'
Symfony
Symfony 4.4.15 released (Symfony Blog)
Symfony 4.4.15 has just been released.