Рубрики
Без рубрики

Подготовка к собеседованию с разработчиком Python

Автор оригинала: Adam McQuistan.

Подготовка к собеседованию с разработчиком Python

Вступление

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

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

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

Знай свой путь вокруг Python

Кажется очевидным, если вы обратились к списку вакансий для роли разработчика Python, что вы, вероятно, должны знать Python. Однако, если вы этого не сделаете и вам удалось блефовать на собеседовании без необходимых знаний Python, вам придется приложить серьезные усилия. Вам лучше сразу же выделить значительное время, чтобы освоить хотя бы основы Python и понять, что если у вас нет многолетнего опыта работы с другим высокоуровневым, объектно-ориентированным языком программирования (т. е. Java, JavaScript, C# и т. Д.) у вас, вероятно, очень мало шансов сделать достаточно хорошо в этом интервью, чтобы получить работу. Извините за плохие новости… перестаньте лгать в заявках на работу.

По крайней мере, вы должны быть в состоянии вывести на доске некоторые идиоматические конструкции Python, такие как циклы, структуры потока управления, понимание списков и определение некоторых базовых классов. Если что-то из этого вам не знакомо, я рекомендую вам обратиться к статье Скотта Робинсона Python Tutorial for Absolute Beginners здесь, на StackAbuse .

Продемонстрируйте свои Примеры проектов

Я понимаю, что вы были заняты школой, буткемпом по кодированию или своей текущей/предыдущей работой, но я не могу достаточно подчеркнуть важность этого. Когда вы подаете заявку на работу разработчика Python, вы эффективно пытаетесь убедить менеджера по найму, что обладаете навыками, необходимыми для того, чтобы внести значительный вклад в продукт или проект, который когда-нибудь станет продуктом, приносящим ценность этой компании.

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

Лучший способ сделать это-иметь публичный репозиторий GitHub, BitBucket или GitLab, в котором хранятся ваши примеры проектов. Это делает несколько вещей для вас:

  • Это помещает вас в сообщество с открытым исходным кодом, которое само по себе является великой вещью.
  • Это показывает, что вы также знаете основы управления версиями Git.
  • Он получает ваше имя там и увеличивает ваши шансы на то, что с вами свяжутся для получения работы.

Что касается второго пункта, когда вы строите свой пример проекта кода, относитесь к нему как к реальному проекту. Завершите небольшие фрагменты функциональности за один раз, а затем зафиксируйте их в системе управления версиями с помощью описательных коммитов. Вы будете удивлены эффектом этого. Менеджеры по найму высоко ценят ваше понимание и способность использовать контроль версий Git.

Освежите в памяти Структуры данных и алгоритмы

Во-первых, вы должны знать общие структуры данных Python, такие как списки, словари, кортежи и как создавать классы.

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

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

Ниже приведен пример пользовательской реализации связанного списка, который использует внутренний класс Element (также называемый Узлом) для управления элементами данных.

class Element:
    def __init__(self, value):
        self.value = value
        self.next = None

class LinkedList:
    def __init__(self, head=None):
        self.head = head

    def append(self, value):
        if self.head is None:
            self.head = Element(value)
        else:
            current = self.head
            while current.next is not None:
                current = current.next
            current.next = Element(value)

    def pop(self):
        if self.head is None:
            return None

        if self.head.next is None:
            value = self.head.value
            self.head = None
            return value
  
        current = self.head
        while current.next.next:
            current = current.next
        value = current.next.value
        current.next = None
        return value

    def peek(self):
        if self.head is None:
            return None
        current = self.head
        while current.next:
            current = current.next
        return current.value

    def remove(self, value):
        if self.head is None:
            return None

        if self.head.next is None:
            if self.head.value == value:
                self.head = None
                return True
            return None

        if self.head.next.next is None:
            if self.head.next.value == value:
                self.head.next = None
                return True

        current = self.head
        while current.next.next:
            if current.next.value == value:
                current.next = current.next.next
                return True
            current = current.next
        return None

    def insert_first(self, value):
        next_element = self.head
        self.head = Element(value)
        self.head.next = next_element
    
    def delete_first(self):
        if self.head:
            new_first = self.head.next
            self.head = new_first

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

Например, если вы знаете, что будете часто вставлять и удалять элементы из передней части списка, то значительно эффективнее использовать что-то вроде LinkedList поверх стандартного списка Python. Однако стоит отметить, что такая операция чаще всего используется с очередью или стеком, для которых может быть использован LinkedList, но модуль Python collections уже имеет встроенную полезную для этого структуру данных под названием deque , которую было бы важно поднять также во время обсуждения с интервьюерами.

Основной целью обсуждения пользовательской реализации LinkedList в интервью Python было бы продемонстрировать вашу способность кодировать пользовательский класс и описать различия между стандартным списком Python и механикой LinkedList.

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

Например, было бы неплохо объяснить, как и почему двоичный поиск работает значительно лучше, чем линейный поиск в списке. В частности, линейный поиск всегда будет O(n), а двоичный-O(log n). Вы также хотели бы объяснить, когда уместно использовать двоичный поиск по линейному. В тех случаях, когда вы ожидаете, что будете искать умеренно большой список много раз, вероятно, стоит потратить затраты на сортировку списка и сделать его способным к двоичному поиску, но если список будет искать только пару раз, это может не стоить затрат на его сортировку.

Также стоит упомянуть о том, чтобы подумать, не лучше ли просто использовать другую структуру данных, такую как словарь, в тех случаях, когда ключ, по которому вы ищете, является хешируемой структурой, которая по существу даст вам O(1) поиск элементов и вставки.

Способность Осмысливать и решать проблемы

Быть разработчиком rockstar – это гораздо больше, чем просто запоминать синтаксис конкретного языка или часто используемые структуры данных и алгоритмы, какими бы ценными они ни были. То, что выделит вас из толпы, – это ваша способность понять проблему, использовать случай, возможность быть реализованным в программном обеспечении или что-то еще, что вы можете назвать вещами, которые нас просят перевести в код.

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

Поверьте мне, это в конечном счете то, что работодатель хочет проверить вас, как вы справляетесь с задачей программирования или проблемой и вашей способностью идентифицировать ключевые фрагменты информации и использовать ее для разработки решения.

Это легче сказать, чем сделать. Тем не менее, есть несколько вещей, которые увеличат вашу вероятность успеха, а именно, поставив в много практики и получить доступ к различным проблемам. Чем больше проблем вы сталкиваетесь, тем больше вы способны начать распознавать общие закономерности в проблемах и повторяющиеся решения, которые часто меняются лишь минимально. Отличный способ получить опыт решения задач программирования-это воспользоваться сервисом типа Daily Coding Problem .

Ежедневная проблема кодирования – это сервис, на который вы можете подписаться и который каждый день будет посылать вам по электронной почте другую проблему программирования, представленную в Python, чтобы вы могли ее решить. Например, на домашней странице Ежедневной задачи программирования приведен пример типов задач, которые вы можете ожидать получить, например: “Есть лестница с N ступенями, и вы можете подняться по 1 или 2 ступенькам за раз. Учитывая N, напишите функцию, которая возвращает количество уникальных способов, которыми вы можете подняться по лестнице. Порядок шагов имеет значение”.

Интересно, что перестановки различных комбинаций шагов упрощаются до суммирования комбинаций шагов для (N – 1) + (N – 2), которые вы можете признать основной логикой реализации алгоритма для последовательности Фибоначчи N-го числа.

Позвольте мне подробнее остановиться на этом.

Сколько различных способов вы можете подняться по одной лестнице, делая по 1 или 2 шага за раз? Набор ровно один [1].

N = 1 => [1]

Теперь как насчет двух ступенек)?

N = 2 => [1, 1], [2]

Тогда для формулы(N – 1) + f(N – 2) до тех пор, пока N > 0

[1] + ([1,1], [2]) = [1,1,1], [1,2], [2,1] 

Как я уже упоминал ранее, это рекурсивная реализация последовательности Фибоначчи, и в Python она выглядит так.

def step_combinations(stairs):
    if stairs <= 1:
        return 1
    return step_combinations(stairs - 1) + step_combinations(stairs - 2)

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

Глазурь на торте

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

Мой совет – обратить внимание на вспомогательные технологии, которые часто фигурируют в списке вакансий в таких разделах, как “Nice to haves”, где могут быть перечислены такие вещи, как JavaScript, CSS, Java и т. Д. Это показывает, что вы способны и готовы учиться другим вещам, которые принесут пользу компании, на которую вы претендуете.

Еще одна полезная вещь-это иметь некоторые знания о компании. Проведите фундаментальное исследование компании, в которую вы обратились. Сосредоточьтесь на таких вещах, как определение ключевых источников дохода и любых культурных идентичностей, которые компания может иметь или пытается установить.

И последнее, но не менее важное: я хотел бы коснуться одевания для интервью. Само собой разумеется, что платно одеваться, чтобы произвести впечатление, но я действительно слышал и видел, как разработчики приходят на собеседования в джинсах и толстовках… Доинк! По крайней мере, если культура компании достаточно свободна, вы должны одеваться в деловой повседневный стиль, но я все же рекомендую костюм.

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

Проще говоря, гордитесь своей внешностью, а не только своими навыками Питона .

Вывод

В этой статье я попытался сформулировать то, что я пришел, чтобы найти ключевые отличия, которые могут поставить вас впереди конкурентов во время собеседования на роль разработчика Python. Я уже упоминал о важности фактического знания Python, полезности общих структур данных и алгоритмов, о том, как стать лучшим решателем проблем, столкнувшись со многими проблемами с помощью таких сервисов, как Daily Coding Problem, и даже с такими основами, как исследования компании и соответствующая одежда. Я надеюсь, что вы нашли какую-то ценность в этой статье, но больше всего я надеюсь, что она поможет вам закрепить это предстоящее интервью с Python.

Как всегда, я благодарю вас за чтение и приветствую комментарии и критику ниже.

Ресурсы