Открытый вебинар «PHP: Как пройти собеседование с техническим специалистом» 04.04.2018 в 20:00 | OTUS >
Проходил 4 апреля 2018 года в 20:00

Открытый вебинар
PHP: Как пройти собеседование с техническим специалистом

Открытый вебинар онлайн

На вебинаре ведущий расскажет как про свой опыт прохождения собеседований, так и проведения уже со стороны работодателя. Рассмотрим проблемы и пути их решения, мифы и лайфхаки.
Преподаватель
Евгений Корытов

Запись

О курсе

PHP Developer. Professional
102 000 ₽
5 месяцев
Начало 28 апреля

Вы сможете грамотно решать на PHP разнообразные задачи бэкенда Middle+ уровня. Подготовка проходит на реальных продуктовых задачах, после которых вы будете четко понимать, чем эффективные решения отличаются от плохого кода.

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

Программа курса
Модуль 1
Общие знания
Модуль 2
Базы данных
Модуль 3
Практики разработки
Модуль 4
Архитектуры и HighLoad-системы
Модуль 5
Проектный модуль
Общие знания
Модуль направлен на обобщение знаний, а также на расширение понимания возможностей языка PHP и теоретических основ.
Подготовка к курсу и инфраструктура ПО //ДЗ
познакомиться;
организовать рабочее пространство;
сравнить разные типы окружения;
научиться работать с простыми Docker-контейнерами.
28 апреля, 20:00 — 21:30
Лектор: Илья Нуруллин
Домашние задания: 1
ДЗ
Работа с окружением.
1. Docker

1.1. Установить Docker себе на локальную машину

1.2. Описать инфраструктуру в Docker-compose, которая включает в себя

1.2.1. nginx (обрабатывает статику, пробрасывает выполнение скриптов в fpm)

1.2.2. php-fpm (соединяется с nginx через tcp-порт)

1.2.3. redis (соединяется с php по порту)

1.2.4. memcached (соединяется с php по порту)

1.2.5. БД соединяется по порту (не забудьте про директории с данными)

1.3 (Со звездочкой) Можно установить Composer

1.4 (Со звездочкой) Соединить FPM и Nginx через unix-сокет


2*. Виртуальные машины.

2.1. Развернуть Homestead VM при помощи Vagrant и VirtualBox

2.2. Сайт должен отвечать на доменное имя application.local

2.3. Должна быть поддержка проброса директорий
Linux //ДЗ
систематизировать знания в области Linux-based серверов.
5 мая, 20:00 — 21:30
Домашние задания: 1
ДЗ
Bash.
1. Написать консольное приложение (bash-скрипт), который принимает два числа и выводит их сумму в стандартный вывод.


Например


./sum.sh 1.5 -7


Если предоставлены неверные аргументы (для проверки на число можно использовать регулярное выражение) вывести ошибку в консоль.


Если Вы запускаете скрипты на базе Docker под Windows 10, то поведение функции sort по умолчанию отличается от стандартного в linux (числа сортируются как числа, а не как строки)


2. Имеется таблица следующего вида:


id user city phone

1 test Moscow 1234123

2 test2 Saint-P 1232121

3 test3 Tver 4352124

4 test4 Milan 7990923

5 test5 Moscow 908213


Таблица хранится в текстовом файле.


Вывести на экран 3 наиболее популярных города среди пользователей системы, используя утилиты Линукса.


Подсказка: рекомендуется использовать утилиты uniq, awk, sort, head.
Внутреннее устройство PHP
разобраться в том, как устроен PHP "под капотом"
12 мая, 20:00 — 21:30
Composer // ДЗ
устройство, совместная работа с кодом, библиотеки.
15 мая, 20:00 — 21:30
Домашние задания: 1
ДЗ
Работа с пакетами.
Необходимо создать свой пакет.


В pull-request прислать composer.json, в котором приводится пример подключения вашего пакета.
PHP WebServers // ДЗ
после занятия вы сможете:
систематизировать знания о веб-серверах.
19 мая, 20:00 — 21:30
Домашние задания: 1
ДЗ
Браузерное приложение и балансировщик.
1. Верификация строки со скобками

Используя Docker, вы описали сборку двух контейнеров – один с nginx, второй – с php-fpm и вашим кодом.

Используя docker-compose вы запускаете оба контейнера.

Контейнер с nginx пробрасывает 80 порт на вашу хостовую машину и ожидает соединений.

Клиент соединяется, и шлёт следующий HTTP-запрос:


POST / HTTP/1.1


string=(()()()()))((((()()()))(()()()(((()))))))


String - это POST-параметр, который можно проверять:


1.1. На непустоту

1.2. На корректность кол-ва открытых и закрытых скобок


Все запросы с динамическим содержимым (*.php) nginx, используя директиву fastcgi_pass, проксирует в контейнер с php-fpm и вашим кодом.

Nginx должен обрабатывать запросы не обращая внимания на директиву Host. После обработки,

• если строка корректна, то пользователю возвращается ответ 200 OK, с информационным текстом, что всё хорошо;

• если строка некорректна, то пользователю возвращается ответ 400 Bad Request, с информационным текстом, что всё плохо.


2. Создать балансируемый кластер

2. 1. Балансировщик nginx-upstream

2. 2. Балансируемые бэкенды на nginx (у каждого свой php-fpm, в идеале - можно запрашивать любой доступный fpm)

2. 3. Подключите к обоим контейнерам fpm контейнер с Redis

2. 4. Если у Вас есть балансировка, стандартными сессиями уже не обойтись. Иначе не будет работать аутентификация. Переведите хранение сессий в него


3.* Усложнённая задача для тех, кто хочет проверить свои силы

3.1. Объедините контейнеры Redis в кластер
Сети, протоколы. Балансировка. Безопасность // ДЗ
обеспечивать понимание сетевого взаимодействия и отказоустойчивости;
обеспечивать безопасность кода и приложения.
22 мая, 20:00 — 21:30
Домашние задания: 1
ДЗ
Ещё одно приложение.
1. Приложение верификации email


1.1. Реализовать приложение (сервис/функцию) для верификации email.

1.2. Реализация будет в будущем встроена в более крупное решение.

1.3. Минимальный функционал - список строк, которые необходимо проверить на наличие валидных email.

1.4. Валидация по регулярным выражениям и проверке DNS mx записи, без полноценной отправки письма-подтверждения.
Базы данных
Модуль нацелен на активное изучение вопросов выбора, применения и управления хранилищами в проектах, использующих PHP. Происходит тесное знакомство с СУБД PostgreSQL, рассматриваются различные NoSQL хранилища, а также вопросы тюнинга MySQL.
Основные понятия баз данных // ДЗ
проанализировать знания о БД.
26 мая, 20:00 — 21:30
Домашние задания: 1
ДЗ
Проектирование БД.
Спроектируйте схему данных для системы управления кинотеатром

* Кинотеатр имеет несколько залов, в каждом зале идет несколько разных сеансов, клиенты могут купить билеты на сеансы

* Спроектировать базу данных для управления кинотеатром

* Задокументировать с помощью логической модели

* Написать DDL скрипты

* Написать SQL для нахождения самого прибыльного фильма


Обратите внимание на то, что мы проектируем систему из реального мира. Попробуйте посмотреть на то, как устроена система покупки билета в кинотеатре.


1. Все ли сеансы и места стоят одинаково?

2. Как может выглядеть схема зала?
Алгоритмы
получить фундаментальные знания о классических алгоритмах;
использовать деревья, графы и алгоритмы их обработки.
29 мая, 20:00 — 21:30
Решение алгоритмических задач // ДЗ
применять на практике полученные знания о структурах данных и алгоритмах
2 июня, 20:00 — 21:30
Домашние задания: 1
ДЗ
Leetcode.
1. Решаем задачу

2. Прикладываем код на GitHub

3. Обосновываем сложность
PostgreSQL для администратора
проанализировать аспекты работы с СУБД.
5 июня, 20:00 — 21:30
PostgreSQL для разработчика // ДЗ
организовывать логику на уровне данных.
9 июня, 20:00 — 21:30
Домашние задания: 1
ДЗ
EAV модель.
Спроектировать EAV-хранение для базы данных кинотеатра


4 таблицы: фильмы, атрибуты, типы атрибутов, значения.


Типы атрибутов и соответствующие им атрибуты (для примера):


- рецензии (текстовые значения) - рецензии критиков, отзыв неизвестной киноакадемии ...

- премия (заменяется при печати баннеров и билетов на изображение, логическое значение) - оскар, ника ...

- "важные даты" даты (при печати - наименование атрибута и значение даты, тип дата) - мировая премьера, премьера в РФ ...

- служебные даты (используются при планировании, тип дата) - дата начала продажи билетов, когда запускать рекламу на ТВ ...


View сборки служебных данных в форме:

- фильм, задачи актуальные на сегодня, задачи актуальные через 20 дней

View сборки данных для маркетинга в форме (три колонки):

- фильм, тип атрибута, атрибут, значение (значение выводим как текст)
Как устроен PostgreSQL // ДЗ
заглянуть под капот СУБД.
16 июня, 20:00 — 21:30
Домашние задания: 1
ДЗ
Индексирование данных.
Подготовить список из 6 основных запросов к БД, разработанной на предыдущих занятиях


1. Выбор всех фильмов на сегодня

2. Подсчёт проданных билетов за неделю

3. Формирование афиши (фильмы, которые показывают сегодня)

4. Поиск 3 самых прибыльных фильмов за неделю

5. Сформировать схему зала и показать на ней свободные и занятые места на конкретный сеанс

6. Вывести диапазон миниальной и максимальной цены за билет на конкретный сеанс


Целесообразно выбрать 3 "простых" (задействована 1 таблица), 3 "сложных" (агрегатные функции, связи таблиц).


Далее нужно заполнить таблицы, увеличив общее количество строк текстовых данных до 10000.

Затем проведите анализ производительности запросов к БД, сохранить планы выполнения.


Заполните таблицы, увеличив общее количество строк текстовых данных до 10000000.

Затем проведите анализ производительности запросов к БД, сохранить планы выполнения.


На основе анализа запросов и планов предложить оптимизации (индексы, структура, параметры и др.

Добавьте индексы и сравните результат, приложив планы выполнения.
Другие SQL-решения // ДЗ
посмотреть на рынок хранилищ.
19 июня, 20:00 — 21:30
Домашние задания: 1
ДЗ
ElasticSearch.
Создать приложение для анализа каналов на Youtube:

1.1. Создать структуру/структуры хранения информации о канале и видео канала в ElasticSearch, описать в виде JSON с указанием типов полей. Описать, какие индексы понадобятся в данной структуре?

1.2. Создать необходимые модели для добавления и удаления данных из коллекций

1.3. Реализовать класс статистики, который может возвращать:

- Суммарное кол-во лайков и дизлайков для канала по всем его видео

- Топ N каналов с лучшим соотношением кол-во лайков/кол-во дизлайков

1.4*. Можно создать паука, который будет ходить по Youtube и наполнять базу данными
Redis // ДЗ
использовать один из самых популярных инструментов кэширования в web.
23 июня, 20:00 — 21:30
Домашние задания: 1
ДЗ
Redis.
Аналитик хочет иметь систему со следующими возможностями:

1. Система должна хранить события, которые в последующем будут отправляться сервису событий

2. События характеризуются важностью (аналитик готов выставлять важность в целых числах)

3. События характеризуются критериями возникновения. Событие возникает только если выполнены все критерии его возникновения. Для простоты все критерии заданы так: <критерий>=<значение>


Таким образом предположим, что аналитик заносит в систему следующие события:


> {

priority: 1000,
conditions: {
param1 = 1
},
event: {
::event::
},

> },

> {

priority: 2000,
conditions: {
param1 = 2,
param2 = 2
},
event: {
::event::
},

> },

> {

priority: 3000,
conditions: {
param1 = 1,
param2 = 2
},
event: {
::event::
},

> },


От пользователя приходит запрос:

> {

params: {
param1 = 1,
param2 = 2
}

> }


Под этот запрос подходят первая и третья запись, т.к. в них обеих выполнены все условия, но приоритетнее третья, так как имеет больший priority.


Написать систему, которая будет уметь:

1) добавлять новое событие в систему хранения событий

2) очищать все доступные события

3) отвечать на запрос пользователя наиболее подходящим событием

4) использовать для хранения событий redis
MySQL и форки
применять MySQL.
26 июня, 20:00 — 21:30
PHP и базы данных // ДЗ
объединять код и данные;
повысить уровень общения кода с БД;
отвязать код от конкретной БД;
работать с БД как с абстракцией.
30 июня, 20:00 — 21:30
Домашние задания: 1
ДЗ
Паттерны работы с данными. Необходимо реализовать один из паттернов: Table Data Gateway, Raw Data Gateway, Active Record, DataMapper для произвольной таблицы.


Паттерн должен содержать метод массового получения информации из таблицы, результат которого возвращается в виде коллекции.


Дополнительно можно использовать паттерн Identity Map для устранения дублирования объектов, ссылающихся на одну строку в БД или Lazy Load для отложенной загрузки связанных записей в таблице или коллекции.
Парадигмы программирования
использовать фундаментальные принципами построения приложений.
3 июля, 20:00 — 21:30
Практикум решения алгоритмических задач 1 // ДЗ
потренироваться на практике.
7 июля, 20:00 — 21:30
Домашние задания: 1
ДЗ
Leetcode практикум.1.
1. Решаем задачу

2. Прикладываем код на GitHub

3. Обосновываем сложность

Пятая задача со звёздочкой, её можно не делать, если покажется сложной. Все эти задачи решаются через хэши.
Практики разработки
Модуль изучает всевозможные правила, рекомендации и практики, применяемые в современной разработке: начиная от именования переменных и заканчивая паттернами и алгоритмами, студенты знакомятся с правильной организацией кода PHP-приложений.
Архитектура кода // ДЗ
использовать принципы построения взаимодействия сущностей в коде.
17 июля, 20:00 — 21:30
Домашние задания: 1
ДЗ
Анализ кода.
Выберите один из своих проектов.

Проведите анализ на предмет соответствия изученным принципам.

Предложите свои варианты исправления.
Практики хорошего кода
проанализировать понятие "хорошего кода".
21 июля, 20:00 — 21:30
Design patterns. Часть 1
улучшить понимание паттернов проектирования кода.
24 июля, 20:00 — 21:30
Design patterns. Часть 2 // ДЗ
находить в коде паттерны;
понимать и применять их.
28 июля, 20:00 — 21:30
Домашние задания: 1
ДЗ
Паттерны проектирования.
1. Выберите пять из 12 паттернов:

1.1. Абстрактная фабрика

1.2. Адаптер

1.3. Декоратор

1.4. Шаблонный метод

1.5. Фабричный метод

1.6. Итератор

1.7. Строитель

1.8. Наблюдатель

1.9. Прокси

1.10. Цепочка обязанностей

1.11. Стратегия

1.12. Компоновщик


2. Запросите задачи у преподавателя

3. Реализуйте паттерн на базе предложенного кода.
Введение в тестирование
объяснить, почему тестирование - залог крепкого сна команды разработки.
31 июля, 20:00 — 21:30
Unit-тестирование // ДЗ
рассмотреть один из аспектов автоматического тестирования.
4 августа, 20:00 — 21:30
Домашние задания: 1
ДЗ
Разработка кейсов тестирования.
1. Скачать файл с заданием https://drive.google.com/file/d/1yAtmj9DE2yFeGh26WxDwr42j7RVbB_PI/view?usp=sharing

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

3. Полученный файл выложить в git, Google Drive или любой другой файлообменник.

4. Ссылку на файл прислать в чат с преподавателем.
Практикум по тестированию // ДЗ
применять разноуровневые тесты на практике;
работать вместе с преподавателем.
7 августа, 20:00 — 21:30
Домашние задания: 1
ДЗ
Пишем тесты. 1. Возьмите свое приложение "Чат на сокетах"
2. Покройте юнит-тестами его код
3. Покрытие тестами должно иметь минимальный уровень в 65%
4. Какие еще тесты из пирамиды тестирования могут тут быть полезными? Вы можете их реализовать?
Архитектуры и HighLoad-системы
Модуль посвящён расширению приложения, его отказоустойчивости, вариантам организации взаимодействия с другими приложениями, а также способам доставки функциональности до Production.
Профилирование, логирование и мониторинг
анализировать работу приложения;
строить системы наблюдения за приложениями и серверами.
18 августа, 20:00 — 21:30
Очереди. Часть 1
использовать основной инструмент работы асинхронных отказоустойчивых приложений - очереди.
21 августа, 20:00 — 21:30
Практикум решения алгоритмических задач 2 // ДЗ
потренироваться на практике.
25 августа, 20:00 — 21:30
Домашние задания: 1
ДЗ
Leetcode практикум.2.
1. Решаем задачу

2. Прикладываем код на GitHub

3. Обосновываем сложность
Очереди. Часть 2 // ДЗ
настраивать RabbitMQ;
использовать встроенные механизмы RabbitMQ;
работать с Apache Kafka.
28 августа, 20:00 — 21:30
Домашние задания: 1
ДЗ
Работа с очередью.
Пишем приложение обработки отложенных запросов.


1. Создать простое веб-приложение, принимающее POST запрос из формы от пользователя. Например, запрос на генерацию банковской выписки за указанные даты.

1.1. Обычно такие запросы (в реальных системах) работают довольно долго, поэтому пользователя надо оповестить о том, что запрос принят в обработку

1.2. Форма должна подразумевать отправку оповещения по результатам работы

2. Передать тело запроса в очередь

3. Написать скрипт, который будет читать сообщения из очереди и выводить информацию о них в консоль

4*. Реализация оповещения

4.1. Сгенерированный ответ отправить через email или telegram


Приложить инструкцию по запуску системы
Проектирование API // ДЗ
объяснить, что такое API и зачем он нужен.
1 сентября, 20:00 — 21:30
Домашние задания: 1
ДЗ
API.
Необходимо реализовать Rest API с использованием очередей.

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

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


Разрешается

- Использование Composer-зависимостей

- Использование микрофреймворков (Lumen, Silex и т.п.)
Репликация
использовать важный инструмент обеспечения отказоустойчивости БД.
4 сентября, 20:00 — 21:30
Шардинг
усиливать отказоустойчивость хранилищ.
8 сентября, 20:00 — 21:30
Кеширование
усилить знания о кэшировании в Highload-системах.
11 сентября, 20:00 — 21:30
Deploy приложений // ДЗ
объяснить понятия деплоя и сборок.
15 сентября, 20:00 — 21:30
Домашние задания: 1
ДЗ
Скрипт деплоя.
Используя выбранный инструмент автоматического деплоя, необходимо реализовать автоматическую выкатку написанного ранее мини-приложения на собственный виртуальный сервер.
Основы Kubernetes
узнать про оркестрирование систем, как приложения живут в масштабируемых системах;
поговорить про общие ресурсы, 12-factor-app.
18 сентября, 20:00 — 21:30
Практикум по разворачиванию приложений
создавать пайплайны деплоя;
настраивать бесшовную доставку ПО.
22 сентября, 20:00 — 21:30
Site Reliability Engineering
использовать best practices обеспечения производительности и отказоустойчивости.
25 сентября, 20:00 — 21:30
Проектный модуль
Заключительный месяц курса посвящен проектной работе. Свой проект — это то, что интересно писать слушателю. То, что можно создать на основе знаний, полученных на курсе. При этом не обязательно закончить его за месяц. В процессе написания по проекту можно получить консультации преподавателей.

Проект должен стать примером кода, который можно показывать потенциальным работодателям.

Например:
1. Система для обучения работы на PHP (аналог CodeAcademy + HackerRank);
2. Bot в телеграмм, позволяющий найти перелеты/отели
3. Анализ GitHub на наличие интересных проектов (рост коммитов, звездочек). Как продолжение поиск лучших контрибьютеров;
4. Создать масштабируемую новостную ленту с множеством интеграций;
5. Свой проект.
Выбор темы и организация проектной работы
выбрать и обсудить тему проектной работы;
спланировать работу над проектом;
ознакомиться с регламентом работы над проектом.
29 сентября, 20:00 — 21:30
Домашние задания: 1
ДЗ
Проектная работа. 1. Предложить идею;
2. Собрать команду разработки;
3. Утвердить идею и команду с преподавателем;
4. За неделю до защиты прислать презентацию и скринкаст по проекту;
5. Защитить проект.
Консультация по проектам и домашним заданиям
получить ответы на вопросы по проекту, ДЗ и по курсу.
2 октября, 20:00 — 21:30
Защита проектных работ
защитить проект и получить рекомендации экспертов.
6 октября, 20:00 — 21:30
Подведение итогов
узнать, как получить сертификат об окончании курса, как взаимодействовать после окончания курса с OTUS и преподавателями, какие вакансии и позиции есть для выпускников (опционально - в России и за рубежом) и на какие компании стоит обратить внимание.
9 октября, 20:00 — 21:30

Преподаватель

Евгений Корытов
Директор по разработке в медиагруппе ACMG.
Опыт в вебразработке более 10 лет.
Преподает больше года в Нетологии PHP и JS.
Участвовал в конференциях GeekPicnic и RIW 2017.