Для ученого-компьютерщика концепция бинарного дерева поиска довольно проста:

Дерево — это структура данных, в которой каждый информационный узел имеет под собой дочерние узлы. «Двоичный» относится к максимальному количеству дочерних элементов (2), а «поиск» относится к нашей способности сохранять дерево организованным в неупорядоченном обходе для получения любых данных с временной сложностью O(log n) (пока дерево остается уравновешенный).

Когда я проходил собеседование на штатные должности (то есть сегодня), мне часто (и до сих пор) задавали вопросы о бинарных деревьях поиска: как их реализовать, как проверить, является ли дерево бинарным деревом поиска, и каковы их соответствующие сложности. Сколько времени требуется, чтобы вставить узел в дерево? Вытащить значение узла? Удалить узел и позволить дереву эффективно реструктурировать себя? И хотя эти головоломки забавны и увлекательны (если мы либерально относимся к нашим определениям «веселья» или «увлечения»), я не могу не задать вопрос, который задают все начинающие инженеры-программисты во всем мире: почему дело вообще?

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

Например, я мог бы разработать тему для этого блога с нуля. Для этого у меня есть навыки работы с HTML и CSS, которые мне дали мои личные проекты и проекты, данные мне моими занятиями в Мичиганском университете. Я мог бы даже добавить несколько крутых переходов Javascript, которые заставили бы неграмотных интерфейсных пользователей ходить ооо и ааа. Однако цель этого блога не в том, чтобы доказать вам, что я знаю, как создавать тему, поэтому я решил использовать готовую тему. Таким образом, я могу приступить к настоящей цели этого блога: изложить свои мысли, и я могу сделать это намного раньше, чем мне пришлось бы кодировать весь этот блог с нуля.

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

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

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

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

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

  • Университеты подготовят вас –› вы преуспеваете в собеседованиях
  • Вы знаете, как кодировать BST с нуля –> Вы преуспеваете в интервью

Таким образом, чтобы логический рабочий процесс оставался согласованным, подразумевается, что:

Университеты готовят вас, обучая кодированию BST с нуля.

Худшая часть этого вывода состоит в том, что эти профессора, которые провели свою жизнь в исследовательских лабораториях, разрабатывая свои диссертации, проверяя их и делая мощные разработки в мире вычислений, вынуждены вернуться в университеты и обучать студентов, которые не все равно, как кодировать BST с нуля. Это несправедливо по отношению к профессорам и, по остальным причинам, изложенным в этой статье, несправедливо по отношению к студентам. Разве растущая плата за обучение, которую мы тратим на поступление в лучший инженерный университет, не должна принести нам больше пользы?

Практичность этого прекращается после получения «заслуженного» предложения о работе. Нужно использовать BST на рабочем месте? Используйте объект карты C++. Сделанный. И теперь новый сотрудник остается с эффективным алгоритмом сортировки узлов в BST, все уже сделано за него или ее, и не знает, как на самом деле работать в отрасли. Как эффективно общаться в команде? Как мне использовать Node.js — фреймворк, на котором работает весь мой продукт? Как мне отправить запрос на извлечение или развернуть свой код в рабочей среде, чтобы любой мог его увидеть? Теория известна, но приложение потеряно.

Университеты пытаются исправить это, предлагая как теорию, так и приложения в своих программах CS… но ладно. Студенты каждый день отказываются от программ CS из-за теории, которая лишь немногим избранным покажется интересной или когда-нибудь понадобится, и в любом случае никогда не смогут изучить приложение, которое курсы Coursera могут преподавать бесплатно. Так зачем вообще изучать информатику? Какие практические навыки я действительно получаю от своей степени? И почему программы CS не делают больше, чтобы решить эту огромную проблему в сообществе разработчиков программного обеспечения?

Я знаю, что многие программисты смеются над этой статьей, потому что в области опций, о которых я мог бы разглагольствовать сегодня, бинарное дерево поиска не так уж сложно. И они правы! Но последствия того, как эта структура данных, наряду с десятками других, повлияла на рекрутинговую индустрию, беспрецедентны. Ни в одной другой отрасли с кандидатами не беседуют о вещах, которые они никогда не будут использовать с первого дня работы. (и если вы можете назвать несколько, я хотел бы быть опровергнутым в комментариях ниже!)

И да, я знаю, что трудно оценивать программистов по их возможностям трудоустройства. Я имею в виду, что мы действительно все одинаковые: мы покидаем эти программы CS с одинаковыми навыками и очень похожим (а значит, тусклым) опытом работы. Должен быть какой-то способ оценить нас, и именно этот способ был признан подходящим. Но если бы я был менеджером по найму в крупной технологической компании, я бы сказал, что мы должны ожидать большего применения от наших кандидатов. Зачем нашему новому выпускнику находить все четные числа в несортированной матрице, если он даже не знает, как развернуть обновленную веб-страницу в рабочей среде? Нам говорят, что наши сторонние проекты не имеют значения, какими бы интенсивными или актуальными они ни были, просто потому, что мы не можем удалить узел из двусвязного списка за время O(1).

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

Первоначально опубликовано на floppydisco.wordpress.com 13 октября 2017 г.