Разбор технического интервью Кайли Йинг: от проектирования ридера до поиска плагиата через ДП

freeCodeCamp.org 1,9 млн 1 ч 14 мин 3 мин 29.03.2023
Главное

Кит Галли, автор канала о Data Science, провел тренировочное техническое интервью с Кайли Йинг на позицию инженера-программиста. В ходе встречи, длившейся более часа, участники воссоздали реальные условия собеседования в крупную технологическую компанию, разделив процесс на проектирование систем (OOP) и решение алгоритмической задачи на динамическое программирование.

🏗️ Объектно-ориентированное проектирование облачного ридера 1:26

Кит Галли предложил Кайли спроектировать архитектуру приложения для чтения коротких рассказов, аналогичного Amazon Kindle . Основные требования включали управление библиотекой книг, поддержку активного состояния книги, сохранение прогресса чтения и отображение текста постранично.

Для решения Кайли выделила две основные сущности:

В ходе обсуждения Кайли выбрала List[String] для хранения контента, где каждый элемент — это страница . Она аргументировала выбор списка тем, что он сохраняет порядок страниц и обеспечивает быстрый доступ по индексу, в отличие от множеств (Sets) или словарей (Dictionaries).

Для идентификации книг Кайли изначально хотела использовать названия, но Кит Галли указал на риск коллизий . В итоге было решено использовать уникальные ID, генерируемые счетчиком внутри библиотеки, что делает систему более устойчивой к дубликатам названий.

📏 Обработка изменения размера шрифта и многопользовательского доступа 24:40

Кит Галли усложнил задачу, предложив внедрить настройку размера шрифта. Кайли отметила, что в этом случае статическое разделение на страницы (хранение в списке) становится неэффективным, так как изменение шрифта меняет объем текста на экране .

Она предложила рефакторинг:

  1. Хранить контент как одну длинную строку.
  2. Рассчитывать количество символов на страницу (characters_per_page) динамически на основе размера шрифта .
  3. Использовать индексы среза строки для отображения нужного фрагмента текста.

При обсуждении масштабирования системы на несколько пользователей, Кайли предложила вынести общие данные книг в SQL-таблицы . По ее мнению, контент и заголовок должны быть общими, а личные настройки (прогресс чтения, шрифт) — храниться в отдельной таблице связей между пользователем и книгой.

🧠 Алгоритмическая задача: поиск плагиата через динамическое программирование 32:21

Вторая часть интервью была посвящена поиску самой длинной общей подпоследовательности (Longest Common Subsequence) в двух текстах для выявления плагиата. Кит Галли уточнил, что искомая последовательность не обязательно должна быть непрерывной, важен лишь порядок символов .

Кайли прошла через три этапа решения:

  1. Наивное решение: перебор всех возможных комбинаций подстрок, что было отброшено из-за экспоненциальной сложности .
  2. Двухуказательный подход: попытка итерироваться по обоим строкам и находить совпадения, что привело бы к сложности $O(N \cdot M)$ в лучшем случае, но не гарантировало бы оптимальности без рекурсии .
  3. Динамическое программирование: использование рекурсивной функции с мемоизацией .

В ходе реализации Кайли создала таблицу (двумерный массив) для хранения результатов подзадач, чтобы избежать повторных вычислений. Она определила базовые случаи: если символы под индексами $i$ и $j$ совпадают, результат равен $1 + \text{рекурсивный вызов для } (i+1, j+1)$; если нет — берется максимум от сдвига одного из указателей .

📊 Ретроспектива и обратная связь 56:35

Кит Галли оценил интервью как успешное, выделив привычку Кайли проговаривать мысли вслух . Однако он указал на области для роста:

Кайли подчеркнула важность тестирования. Даже если время на кодинг ограничено, упоминание граничных случаев (пустые строки, отсутствие совпадений) и стратегии тестирования дает положительный сигнал нанимателю . Также участники обсудили тактику «письма после интервью»: Кит Галли считает, что присланное решение задачи, которую кандидат не успел дожать на встрече, может продемонстрировать лояльность и настойчивость .

💬 Цитаты

«Вас часто ожидают увидеть застрявшими на задаче; важно то, как вы восстанавливаетесь.»

«Я всегда рекомендую повторять вопрос интервьюеру, чтобы убедиться, что вы его правильно поняли.»

👥 Спикеры
🔗 Упомянутые сайты и проекты
📖 Термины
ООР (Объектно-ориентированное программирование)
Методология программирования, основанная на представлении программы в виде совокупности объектов.
Динамическое программирование
Способ решения сложных задач путем разбиения их на более простые подзадачи с сохранением результатов.
Мемоизация
Техника сохранения результатов выполнения функций для предотвращения повторных вычислений.
Наивное решение (Naive solution)
Самый простой и очевидный алгоритм, часто обладающий низкой эффективностью.
📊 Цифры
⚖️ Другая сторона
Технологии и IT Object-Oriented Programming Dynamic Programming Software Engineering Interview System Design