# Блок I: увлечен ли человек 1. Почему программирование Каким образом выбрал специальность: - любовь к точным наукам, математике, физике? - увлекся программированием в школе? Когда увлекся программированием: в школе, в университете, так и не увлекся? 2. Самостоятельно реализованные проекты, вне учебной программы. - какие технологии пытался изучить? - что вызвало трудности? - что понравилось? 3. Почему определенное направление? - если бэкэнд, то почему? - если фронтенд, то почему не мобильные приложения? 4. Почему пошёл на работу к нам... # Блок II: щупаем базу (ОС, Алгоритмы, Структуры данных) Программа представляется каким-то процессом в ОС. ### Как ты понимаешь, что такое процесс в операционной системе? Идентифицируемая абстракция совокупности взаимосвязанных системных ресурсов на основе отдельного и независимого виртуального адресного пространства в контексте которой организуется выполнение потоков. Процесс — непосредственное выполнение инструкций программы. Также, процессом называют выполняющуюся программу и все её элементы: адресное пространство, глобальные переменные, регистры, стек, открытые файлы и так далее. ### Что такое этап компиляции программы? В чем разница между интерпретируемыми и компилируемыми языками? Например между JavaScript и C. Что такое Jit? ### Какие ресурсы доступны процессу/программе? Процессорное время, память, I/O. ### Сложность алгоритмов: по памяти, по времени. Назвать и привести пример. ### Что такое кэширование с точки зрения оптимизации этих ресурсов? ### Перечислить известные структуры данных: - LinkedList - HashMap - Stack - Vector (array) ### Как устроен HashMap? # Блок III: Frontend Ввел url в браузере (главная страницы, ajax/json не рассматриваем), нажал Enter, что дальше происходит? - GET запрос на сервер - ответ с контентом документа - разбор браузером содержимого документа - загрузка подключаемых ресурсов: стили, js, картинки, шрифты - рендеринг страницы - исполнение js 1. Что такое DOM? https://habr.com/ru/post/486820/#5 2. распространение событий в DOM * Распространение в общем https://habr.com/ru/post/486820/#6 * Погружение https://habr.com/ru/post/486820/#8 * Всплытие https://habr.com/ru/post/486820/#7 ```js const html = ` <div id="outer"> <div id="inner"></div> </div>`; document.getElementById('inner').addEventListener('click', (e) => { console.log(e.target.id, e.currentTarget.id); }); document.getElementById('outer').addEventListener('click', (e) => { console.log(e.target.id, e.currentTarget.id); // e.stopPropagation(); }, {capture: true}); // Кликаем по inner, потом по outer. // Какие сообщения и в каком порядке будут выведены в консоль? // Что будет в консоли, если расскоментировать e.stopPropagation(); ``` *Обработчик click для outer отработает на фазе погружения и потому будет вызываться первым.* 3. В чем разница между == и === https://habr.com/ru/post/486820/#14. Каким образом происходит сравнение? ```js console.log([0] == 0) // true console.log([0] === 0) // false ``` *Движок всё приводик в строкам* 5. Почему результатом сравнения двух похожих объектов является false? https://habr.com/ru/post/486820/#15 ```js let a = {prop: 1} let b = {prop: 1} let c = a console.log(a === b); console.log(a === c); ``` 5. В чем отличие var от let, const (Scope) https://habr.com/ru/post/486820/#19 https://habr.com/ru/post/486820/#42 ```js // Выполнится ли код и, если да, что будет выведено в консоль const a = {b:1}; a.b = 2; let c = {d:1}; c.d = 2; console.log(a.b, c.d); // Что будет выведено в консоль? // Что будет выведено, если расскоментировать console.log(c)? f(1) function f (a) { console.log(a); console.log(b); // console.log(c); } var b = 2; let c = 3; ``` 7. Что такое промисы? https://habr.com/ru/post/486820/#50 ```js tryYourLuck(() => console.log('win!'), () => console.log('lose :(')) function tryYourLuck(onSuccess, onFail) { setTimeout(() => { if (Math.random() > 0.5) { onSuccess(); } else { onError(); } }) } // Перепишите с использование Promise ``` 8. Что такое async/await https://habr.com/ru/post/486820/#51 ```js try { let user1 = await fetchUser(1); let user2 = await fetchUser(2); console.log(user1.name, user2.name); } catch (e) { console.log('Failed to fetch user', e); } async function fetchUser(id) { const resp = await fetch(`/find-user?id=${id}`) const data = await res.json() return data; } // Перепишите без использования async/await ``` 9. Наследование в Js. Как работает работает наследование на прототипах ```js // Как работают прототипы в Js let F = function () { this.a = 1; this.b = 2; } let o = new F(); F.prototype.b = 3; F.prototype.c = 4; console.log(o.a); console.log(o.b); console.log(o.c); console.log(o.d); ``` Источник: https://habr.com/ru/post/486820/ # Блок IV: Backend (PHP) 1. Какие бывают способы передачи аргументов в функцию? В чем разница? 1. Как в PHP передаются массивы, при вызове функций? (copy on write) 1. Как устроен массив в Php? 1. Magic-методы в PHP (`__toString, __call, __callStatic, __get, __set_state`) 2. В чем отличие static:: от self:: 3. Структуры данных в PHP. Что есть кроме массивов? 4. Что такое opcode? Зачем его кешировать? Что можно кешировать в opcache? 5. Что такое JIT? 6. Какой номер линии php рапортует в ошибке? Проще говоря, в какой момент снимается трейс стека? ```php= <?php throw ex(); function ex() { return new \Exception('omg!'); } ``` # Блок V: Проектирование 1. Зачем нужно проектирование? 2. Объяснить любой из принципов SOLID? 3. Привести пример нарушения принципа Открытости/Закрытости (OCP) 4. Привести пример нарушения принципа подстановки (LSP) 5. Продемонстрируйте на примере принцип инверсии управления (IoC) 6. Когда нужно вводить интерфейс? 7. Почему композиция зачастую лучше чем наследование? 8. Полезны ли комментарии в коде? Говорят, что код должен быть самодокументируемым. Вы согласны? 9. Что такое функция высшего порядка (Higher order function)? Можете написать такую на любом языке? 10. Стоит ли скрывать за интерфейсом репозитории Doctrine? Почему? # Блок VI: СУБД 1. Как диагностировать почему запрос выполняется медленно? (Explain) Куда смотреть? 2. Что такое индекс? Почему не проиндексировать сразу все? # Unix / Linux 1. Каким образом можно быстро найти все url'ы в множестве текстовых файлов? 2. Как узнать какие php процессы сейчас запущены? # Практические примеры PHP ### Треугольник Укажите недостатки данного кода и предложите как его улучшить ```php class Triangle { public $a; public $b; public $c; } ``` --- ### CodeGenerator Есть класс CodeGenerator, который умеет генерировать код на разных языках. Исходя из предположения, что количество языков будет добавляться, предложите refactoring кода. Аргументируйте преимущество вашего кода над существующим. ```php class CodeGenerator { public const JAVA = 'JAVA'; public const C_PLUS_PLUS = 'C_PLUS_PLUS'; public const PHP = 'PHP'; private $language; public function __construct(string $language) { $this->language = $language; } public function generateCode(): string { switch ($this->language) { case self::JAVA: // return generated java code case self::C_PLUS_PLUS: // return generated C++ code case self::PHP: // return generated PHP code } throw new \LogicException("Bad language"); } // used in generateCode() private function someCodeRelatedThing(): string { switch ($this->language) { case self::JAVA: // return generated java-related stuff case self::C_PLUS_PLUS: // return generated C++-related stuff case self::PHP: // return generated PHP-related stuff } throw new \LogicException("Bad language"); } } ``` --- ### Counter Какой недочет вы видите в следующем коде ```php class Counter { public function countBulletins($matchers, $groupByDirectory = false) { if ($groupByDirectory) { // клиент попросил посчитать объявления с группировкой по разделу $result = []; foreach ($this->bulletins as $bulletin) { if ($matchers->isMatch($bulletin)) { $result[$bulletin->getDirectoryId()]++; } } } else { // клиент попросил посчитать объявления без группировки $result = 0; foreach ($this->bulletins as $bulletin) { if ($matchers->isMatch($bulletin)) { $result++; } } } return $result; } } ``` --- # Практические примеры MySQL ### Пример У вас есть таблица-лог в которой хранятся записи о поисках пользователей (одна запись - один поиск) со следующей структурой: - `user_id` – идентификатор пользователя; - `date_time` – дата и время поиска; - `query` – поисковый запрос, который ввел пользователь пользователь. Напишите SQL-запрос, который вернет количество запросов осуществленных пользователями за вчерашний день. **Далее:** исключая кто пользовался поиском менее 3-х дней за последний месяц. # Блок ??: вопросы по тестовому Понимает ли как работает технология, или механический навык использования магии??? Что такое SPA, чем отличается от обычного приложения?