Открытый вебинар «PHP: Как пройти собеседование с техническим специалистом» 04.04.2018 в 20:00 | OTUS >
Скидки 5% на курсы из спецкаталога
Скидки 5%
Действуют до 21 июня. Дальше скидок не будет…
Действуют до 21 июня. Дальше скидок не будет…
Перейти
Проходил 4 апреля 2018 года в 20:00

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

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

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

Запись

О курсе

PHP-разработчик. Продвинутый уровень
118 000 ₽
5 месяцев
Начало 11 июня

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

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

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


В pull-request прислать composer.json, в котором приводится пример подключения вашего пакета.
Веб-серверы PHP // ДЗ
систематизировать знания о веб-серверах.
29 июня, 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 в кластер
Сети, протоколы, балансировка и безопасность // ДЗ
обеспечивать понимание сетевого взаимодействия и отказоустойчивости;
обеспечивать безопасность кода и приложения.
2 июля, 20:00 — 21:30
Лектор: Петр Лобанов
Домашние задания: 1
ДЗ
Приложение верификации email.
1. Приложение верификации email


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

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

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

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

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

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

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

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

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


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


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

2. Как может выглядеть схема зала?
Алгоритмы
получить фундаментальные знания о классических алгоритмах;
использовать деревья, графы и алгоритмы их обработки.
9 июля, 20:00 — 21:30
Решение алгоритмических задач // ДЗ
применять на практике полученные знания о структурах данных и алгоритмах.
13 июля, 20:00 — 21:30
Домашние задания: 1
ДЗ
Leetcode. https://leetcode.com/problems/merge-two-sorted-lists/

1. Решаем задачу

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

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


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


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


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

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

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

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


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

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

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

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


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

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

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

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

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

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


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


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

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


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

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


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

Добавьте индексы и сравните результат, приложив планы выполнения.
Другие SQL-решения // ДЗ
посмотреть на рынок хранилищ.
27 июля, 20:00 — 21:30
Домашние задания: 1
ДЗ
ElasticSearch. - реализуем поиск по книжному интернет-магазину с помощью Elasticsearch
- у каждого товара есть название, категория, цена и кол-во остатков на складе
- поиск должен корректно работать с опечатками и русской морфологией
- пример: пользователь ищет все исторические романы дешевле 2000 рублей (и в наличии) по поисковому запросу "рыцОри"
- в результате должны вернуться товары, ранжированные по релевантности
- домашку нужно сдать как консольное PHP-приложение, которое принимает один или несколько параметров командной строки и выводит результат в виде текстовой таблички, после чего завершает работу
- JSON с товарами будет приложен к занятию в ЛК
- способ создания индекса и его первоначального заполнения — на ваш выбор
Redis // ДЗ
использовать один из самых популярных инструментов кэширования в web.
30 июля, 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.
3 августа, 20:00 — 21:30
PHP и базы данных // ДЗ
объединять код и данные;
повысить уровень общения кода с БД;
отвязать код от конкретной БД;
работать с БД как с абстракцией.
6 августа, 20:00 — 21:30
Домашние задания: 1
ДЗ
Паттерны работы с данными. Необходимо реализовать один из паттернов: Table Data Gateway, Raw Data Gateway, Active Record, DataMapper для произвольной таблицы.


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


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

1. https://leetcode.com/problems/two-sum/description/
2. https://leetcode.com/problems/sort-array-by-increasing-frequency/description/
3. https://leetcode.com/problems/intersection-of-two-arrays/description/
4. https://leetcode.com/problems/largest-positive-integer-that-exists-with-its-negative/description/
*5. https://leetcode.com/problems/how-many-numbers-are-smaller-than-the-current-number/description/


1. Решаем задачу

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

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

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

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

Предложите свои варианты исправления.
Практики хорошего кода
проанализировать понятие "хорошего кода".
27 августа, 20:00 — 21:30
Design patterns. Часть 1
улучшить понимание паттернов проектирования кода.
31 августа, 20:00 — 21:30
Design patterns. Часть 2 // ДЗ
находить в коде паттерны;
понимать и применять их.
3 сентября, 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. Реализуйте паттерн на базе предложенного кода.
Введение в тестирование
объяснить, почему тестирование - залог крепкого сна команды разработки.
7 сентября, 20:00 — 21:30
Unit-тестирование // ДЗ
рассмотреть один из аспектов автоматического тестирования.
10 сентября, 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. Ссылку на файл прислать в чат с преподавателем.
Практикум по тестированию // ДЗ
применять разноуровневые тесты на практике;
работать вместе с преподавателем.
14 сентября, 20:00 — 21:30
Домашние задания: 1
ДЗ
Пишем тесты. 1. Возьмите свое приложение "Валидатор email"
2. Покройте юнит-тестами его код
3. Покрытие тестами должно иметь минимальный уровень в 65%
4. Какие еще тесты из пирамиды тестирования могут тут быть полезными? Вы можете их реализовать?
Архитектуры и HighLoad-системы
Модуль посвящён расширению приложения, его отказоустойчивости, вариантам организации взаимодействия с другими приложениями, а также способам доставки функциональности до Production.
Профилирование, логирование и мониторинг
анализировать работу приложения;
строить системы наблюдения за приложениями и серверами.
17 сентября, 20:00 — 21:30
Очереди. Часть 1
использовать основной инструмент работы асинхронных отказоустойчивых приложений - очереди.
21 сентября, 20:00 — 21:30
Практикум решения алгоритмических задач 2 // ДЗ
потренироваться на практике.
24 сентября, 20:00 — 21:30
Домашние задания: 1
ДЗ
Leetcode практикум 2.
1. Решаем задачу

https://leetcode.com/problems/intersection-of-two-linked-lists/
https://leetcode.com/problems/fraction-to-recurring-decimal/


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 и зачем он нужен.
8 октября, 20:00 — 21:30
Домашние задания: 1
ДЗ
Реализация API с очередями.
Необходимо реализовать Rest API с использованием очередей.

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

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


Разрешается

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

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

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

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

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

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