Найдите больше полезных статей на www.davidseek.com

Наиболее часто задаваемые вопросы к статье Как я попал в FAANG на прошлой неделе были связаны с интервью по объектному дизайну. А именно что это такое?, Как к этому подготовиться? а также то, как на самом деле выглядит ООП-интервью в Amazon.

Объектно-ориентированный дизайн

Объектно-ориентированное программирование - это парадигма программирования, основанная на концепции объектов, которые могут содержать свойства и функциональность.

При разработке способа ООП мы могли определить class Human. С такими атрибутами, как height и hairColor, и такими методами, как eat() и sleep().

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

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

class SoftwareEngineer: Human {}

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

Давайте посмотрим на другой пример.

Интервью

Справедливо сказать, что процесс почти всегда один и тот же. В качестве собеседника вам будет представлен какой-то сценарий из реального мира, например «Дизайн парковки», а затем вам будет предложено создать для этого технический проект.

В этой статье мы собираемся спроектировать «отель для щенков».

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

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

Никогда не делайте предположений. Это часть собеседования, чтобы увидеть, как вы справляетесь с расплывчатыми вопросами. Вы задаете уточняющие вопросы или прыгаете прямо в код, потенциально тратя написание кода интервью в неправильном направлении?

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

Когда я знаю, что мне нужно разработать, я начинаю с некоторых фрагментов кода в качестве начала разговора с интервьюером. Набирая код, я объясняю, что делаю.

Затем я бы разработал быстрый шрифт для собаки.

Теперь, когда у нас есть определение типа для размеров наших собак и самой конструкции Dog, нам нужно добавить структуры данных в Hotel. Поскольку мы хотим доказать интервьюеру, что мы «мыслим масштабно», у нас будет специальный инициализатор, передающий определение размера для каждого размера комнаты. Мы можем повторно использовать этот класс для каждого отеля, которым мы можем владеть в какой-то момент.

Мы используем словари в качестве предпочтительной структуры данных, потому что каждая операция имеет идеальную постоянную Big O стоимость операции для каждого времени и пространства.

Во время собеседования важно устно выразить свое мнение. Интервьюер хочет услышать, что вы думаете о создании класса или функции generic. Это означает, что вам не нужно жестко кодировать переменные, такие как количество доступных комнат. Это показывает стаж и то, что вы думаете о более широкой картине.

«Мысль о малом - это сбывающееся пророчество. Лидеры создают и сообщают о смелых направлениях, которые вдохновляют на результаты. Они думают иначе и ищут способы обслуживать клиентов ». - Принцип лидерства Amazon: мыслить масштабно.

Затем мы добавим объявления функций для заглушек ранее.

Последующие вопросы

Имея приведенную выше базовую конструкцию и, надеюсь, осталось некоторое время для интервью, мы ожидаем некоторых дополнительных вопросов от интервьюера. Цель этих вопросов - увидеть, насколько хорошо вы разбираетесь в написании масштабируемого кода.

Вы заперлись в угол или уже можете определить возможности для масштабируемости? Насколько хорошо вы передаете свое мышление и процесс планирования?

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

Теперь отель может использовать размеры номеров в зависимости от спроса, и мы оптимизировали код, установив уровни доступа для наших функций.

В API четко указано, что checkIn - это функция, доступная для любого Hotel объекта, а getRooms - это частная функция, доступная только для объекта Hotel.

Какие методы и атрибуты public, а какие private, зависят от обстоятельств проекта, но хорошее правило - это принцип «необходимости знать». Предоставляйте только функции и атрибуты, о которых НЕОБХОДИМО знать потребителю.

Подготовка к интервью

Есть много способов подготовиться к собеседованию по предметному дизайну. Если вы читаете это просто потому, что вам любопытно, но вы не обязаны изучать эту тему, я предлагаю вам расслабиться.

Опыт приходит через практику. Чем чаще вы создаете объекты и чем больше отзывов вы получите, тем больше вы узнаете и тем лучше станут ваши проекты. Наставник или учебная группа - всегда хорошая идея для таких тренингов.

Если вы собираетесь на собеседование и хотите получить в последний момент какие-либо идеи и повлиять на него, YouTube предоставит вам огромное количество контента. Я бы поискал короткометражку с большим количеством просмотров. Обычно это довольно быстро доходит до сути.

Затем попробуйте сконструировать несколько объектов.

  • Дизайн парковки
  • Создание шкафчика для пакетов
  • Дизайн аэропорта

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

  • Как можно было оптимизировать?
  • Как бы вы могли расширить функциональность?
  • Недостатки?
  • Возможные улучшения во времени / пространстве?

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

Есть множество книг по этой теме. Хотя, по моему опыту, 5-минутное введение с последующим «обучением на практике» было лучше, чем чтение книги в течение недели.

Вывод

В конце концов, все сводится к одним и тем же мыслям и принципам, к одним и тем же идеям и концепциям. Независимо от того, разрабатываете ли вы House, Car или Spaceship, вы всегда будете использовать четко определенные атрибуты API - private и public, которые определяют уровень доступа и функции с максимальной эффективностью и безопасностью.

Эта статья проиллюстрировала мой процесс, когда я столкнулся с ситуацией при проектировании объектов. Я набираю несколько фрагментов кода, переосмысливаю и корректирую код, основываясь на словесных обсуждениях и потенциальных изменениях в объеме.

В сценарии интервью или проверки кода я изо всех сил стараюсь «думать вслух», и я даю определение и устно обосновываю определения пользовательского типа, такие как DogSize enum. Это показывает интервьюеру, что мой код безопасен по типу и масштабируется.

Я устанавливаю ожидания и хорошо документирую свой код. Таким образом, будет проще провести рефакторинг и настроить код позже, а также отладить сбои или проблемы.

Дизайн учебных объектов - это не пошаговое руководство. Это процесс, и по мере того, как вы будете извлекать уроки из ошибок прошлого, из бесед, статей и предложений, вы, естественно, со временем станете лучше.

По мере вашего развития меняется и ваше понимание объектно-ориентированного дизайна.

Найдите больше полезных статей на www.davidseek.com