Автор оригинала: FreeCodeCamp Community Member.
Джон Дэн
Около года назад, пока развернулся в Ираке как офицер армии, я начал кодировать для удовольствия. (Вы можете прочитать всю историю здесь .) Ну, после многих исследований я приземлился на первую первую работу в качестве инженера программного обеспечения на Snapchat ( Snap ) в Венецианском пляже.
Поиск работы не был легким. Я столкнулся с большим количеством отклонений, ложных венств и моментов сомнений. Но опыт помог мне разработать психические рамки для приближающейся деятельности, которые имеют высокую вероятность успеха в течение долгосрочной перспективы, но небольшая вероятность успеха в любой данный день – такие действия, как поиск первой работы в качестве инженера-программного обеспечения.
Потому что нахождение моего конкретная работа Был в основном из-за большого количества удачи (хорошие сроки, достойное соединение, хороший год финансирования для стартапов в Лос-Анджелесе), излагая определенные шаги, которые я взял, не был бы очень полезным для вас. Это потому, что я сделал то же самое, что все говорят вам сделать:
- построить боковые проекты
- Решать проблемы практики
- построить свою сеть
- и подать заявку на тонну рабочих мест
Действия, которые Вы взять, а акцент Вы поставить на каждого, будет сильно отличаться в зависимости от Ваш личность и конкретные обстоятельства. Это сказано, психиатрические рамки я приехал во время моего поиска работы, может помочь вам, независимо от ваших обстоятельств.
Поэтому я собираюсь поделиться с мыслительным процессом, который в конечном итоге приводит к моей психиатрической рамки, придавая вам быстрое введение в Динамический программин г одновременно. Я надеюсь, что вы найдете это полезным?!
Как работает типичный поиск разработчиков
При поиске моего первого задания программирования я прочитал довольно много личных учетных записей о том, как другие программисты по самоуставленным программистам и сортам Bootcamp нашли свои первые задания. Из их историй поиск работы казался очень последовательной моделью:
- Учитесь кодовым
- Заточить свои навыки
- сделать некоторые сети
- Работа по вопросам практики
- подать заявку на рабочие места
- интервью
- Получить предложения на работу
В условиях структуры данных я изобразил его как прохождение через узлы связанного списка.
Я думаю, что общий недостаток, когда люди пересчитают свои воспоминания (особенно если они на некоторое время работали в качестве инженера), состоит в том, что они имеют слишком много внимания на связи с причинными эффектами между конкретными действиями, которые они взяли и исход, произошедший:
Потому что у них есть преимущество задних островов, их результат кажется детерминированный. Если вы только что следуете только те же шаги, вы найдете хорошую работу.
Да. И нет. Из моего опыта, в Долгосрочный Если вы действительно привержены программированию и постоянно толкать себя, чтобы поправиться, вы в конечном итоге найду работу, достойную к вашим навыкам (независимо от того, есть ли у вас компьютерная наука из определенной школы в Пало-Альто). Спрос на инженеры программного обеспечения реально и растут только. Но в краткосрочный Процесс является супер случайным, и основан на большом количестве переменных, на которых у вас нет видимости или контроля над: потребности найма компании, тенденции рынка, какие компании HIP Technologies в настоящее время нанимают.
Когда я начал поиск работы в Лос-Анджелесе, я разослал тонну приложений, пытаясь найти что-то – что-нибудь. Я бы закодировал в обмен на бесплатную еду и футболки, если кто-то предложил мне возможность. Вот некоторые из ранних ответов, которые я получил:
Тогда [Тишина] в течение многих недель.
Ну, это были бананы. Я сделал проблему кодирования, который занял меня 6 часов, и компания не может даже прислать мне ответное письмо?
Получение каждого из этих электронных писем (и многочисленные не ответы тоже) было очень болезненным опытом для меня. Но Никогда не тратьте возможность узнать что-то полезное из трудностей Отказ Показав вам процесс мысли, который вдохновил мой поиск работы, надеюсь, эта статья даст вам инструмент для оптимизации вариантов, который вы делаете во время поиска работы, и дать вам вдохновение, чтобы продолжать толкать к своей цели.
Проблема рюкзака
Позвольте мне проиллюстрировать шаги, которые я взял, чтобы добраться до моей психиатрической базы, используя вариант общего информационного интервью-интервью: проблема рюкзака Отказ
** Обновите: я положил свой код в Github Repo с небольшим тестовым набором, позволяя вам играть с кодом и разработать сам решение. **
Вот проблема:
У вас есть набор мероприятий, которые вы можете сделать, чтобы увеличить свои шансы на поиск работы. Каждая деятельность занимает определенное количество времени, но обеспечивает некоторое количество опыта. У нас есть только ограниченное время, чтобы подготовиться к поиску работы, поэтому мы не можем сделать все. Наша цель – максимизировать количество очков опыта, выбрав оптимальный набор мероприятий.
Как вы пишете функцию, которая выберет оптимальный набор действий из списка доступных мероприятий и ограниченного количества времени?
Решение 1: грубая сила
Редактирование проблемы, вы хотите выбрать набор действий, которые:
- Требует времени для достижения, что меньше или равно общее время, которое вы имеете в наличии
- Максимизирует точки опыта (XP) возвращено
Наиболее интуитивным способом является использование того же алгоритма, который мы использовали бы в повседневной жизни. Мы бы попробовали различные комбинации мероприятий, проверяя, соответствует ли она нашему ограничением фитинга в течение ограниченного количества времени. Мы будем продолжать искать все возможные комбинации и выбрать тот, который максимизирует XP.
Вот код для этого алгоритма:
Проблема в том, что этот подход действительно комплекс Что касается времени, значение в качестве размера нашего ввода (количество мероприятий, которые мы могли бы возможно выбрать) увеличивается, количество времени, необходимое для расчета решения, увеличивается с гораздо более быстрее.
Если у нас есть 6 возможных мероприятий, мы начнем с создания каждой возможной комбинации с одной активностью, предоставляя 6 комбинации, которые содержат одну деятельность.
Тогда мы должны создать все возможные комбинации с 2 действиями. Для каждого из оригинальных 6 комбинаций мы должны создать комбинацию с каждой из 5 оставшихся мероприятий (вы можете делать только каждое действие один раз).
Затем создать все возможные комбинации с 3 действиями, мы должны взять каждое из наших комбинаций, содержащих 2 действия и созданию комбинации с каждой из 4 оставшихся мероприятий.
В конце концов у нас будет то, что выглядит (6 * 5 * 4 * 3 * 2 * 1), что является O (n!) Отказ Кроме того, потому что мы суммируем все элементы в каждой комбинации каждый раз, чтобы рассчитать общее время и XP, наша сложность окончания – O (n! * N) Отказ
Представьте, что вместо того, чтобы запустить этот алгоритм на компьютере, который может выполнять триллионы операций в секунду, вы должны запустить его на вашем ограниченном мозге, который на самом деле занимает 10 часов (в A Very оптимистичный мир), чтобы сделать боковой проект Чтобы узнать новый JavaScript MV * Framework.
А также вместо выбора 6 видов деятельности у вас есть тысячи возможных вещей, которые вы можете делать, чтобы подготовиться к поиску работы. (Просто посмотрите на «Как кодировать» в Google).
Это совершенно нецелесообразно, чтобы попробовать все возможное сочетание мероприятий для подготовки себя к поиску работы. Урок из этого примера является почти бесконечное количество вещей, которые вы могли бы делать, это увеличит ваши шансы на поиск работы, но вы не можете попробовать все их. Вам нужен лучший метод для определения вашего оптимального набора мероприятий.
Обратно
Очевидно, как программисты (и хакеры?), Мы собираемся как-то оптимизировать наше текущее решение.
Давайте попробуем Буд подход от Взломать кодирующее интервью Gayle McDowell (Удивительный приготовленный ресурс, даже если ваши интервьюеры на работе никогда не просят алгоритмические вопросы).
- Что Узкие места У нашего решения Brute Form есть?
При ищете узкое место, мы обычно пытаемся определить самую сложную часть процесса, то есть Ней! часть нашего O (n! * N) алгоритм.
узкое место или самая сложная часть нашей проблемы поиска работы в том, что мы должны динамически создавать много разных комбинаций и попробовать их. Каждый раз, когда мы добавляем еще один вариант, у нас есть много возможных комбинаций, чтобы попробовать.
Теперь я должен признать, что я привел вас к ложной дороге. Моя проблема поиска работы, как вариация проблемы рюкзак, является частью набора проблем, называемых NP-Hard Отказ Короче говоря, проблемы являются NP-Hard, когда нет никакого известного эффективного способа решения проблемы или убедитесь, что решение проблемы является правильным. Так что, если вы не изменяете в мире компьютерный ученый, вы, вероятно, не собираетесь выяснить объективно эффективно Способ совмещать все виды деятельности.
Но это нормально!!! Иногда в интервью и поисках работы мы следуем ложностям. Пока мы узнаем что-то из процесса, мы не впустуем впустую время. Даже если мы не можем найти общий эффективный способ решить проблему, мы все еще можем найти Подробнее Эффективный способ, которым мы в настоящее время используем.
Так что давайте будем двигаться дальше.
2. Мой алгоритм делает Ненужная работа или Дублированная работа ?
Это где мы можем сделать большие выгоды на нашем решении.
Одна вещь, которую мы должны измениться, это то, что для каждой возможной комбинации мы должны повторять все действия в наборе, чтобы рассчитать общее XP и общий время от этого набора мероприятий. Это Дублированная работа Потому что мы добавляем те же значения снова и снова.
Если мы только что спасли всего XP и время Из комбинации в переменной мы могли бы просто добавить XP и время каждой новой активности мы добавляем до общей сложности. Это займет наше решение от O (n! * N) к На!).
Это полезно, но не принципиально не делает нашей проблемой слишком быстрее, чтобы запустить.
Какая другая оптимизация мы можем сделать?
Мы также рассчитываем много комбинаций, которые не могли привести к действительному решению. Это Ненужная работа Отказ
Для справки здесь снова является список действий:
const ACTIVITIES = [ {name: 'side-project', time: 10, xp: 12}, {name: 'algorithms', time: 3, xp: 7}, {name: 'networking', time: 1, xp: 0.5}, {name: 'exercise', time: 2, xp: 1.5}, {name: 'systems design', time: 4, xp: 4}, {name: 'making CSS codepens', time: 3, xp: 4}];
Допустим, у нас есть 8 часов, чтобы подготовиться к нашей работе по поиску. Как бы наши комбинированные комбинации алгоритма Brute Force Check?
На основе порядка Деятельность Массив, мы сначала рассмотрим набор, в том числе Боковой проект объект. Нет действительного решения, содержащего Боковой проект Деятельность, потому что это занимает 10 часов, и у нас есть всего 8 часов.
Но наш алгоритм грубой силы (будучи грубой силой) не знает этого, и затем проверяет все возможные комбинации, которые мы можем создать с Боковой проект Отказ
Так что это проверит, если [Боковой проект, алгоритмы] является действительным решением. Нет.
И это проверит, если [Боковой проект, алгоритмы, сеть] действует. Нет.
И это проверит, если [Боковой проект, алгоритмы, сеть, упражнения] действует. Нет.
Посмотрите, насколько мы делаем ненужную работу?
Что, если мы сможем дать нашему алгоритму немного интеллекта, поэтому он может проверить, может ли наше текущее состояние (выбранные в настоящее время действиями), могут привести к действительному решению? Если мероприятия, которые мы выбрали в настоящее время, могут привести к действительному решению (в частности, если наш выбранный набор действий требует меньше или равное время, чем общее время, которое мы имеем в качестве параметра к функции), мы продолжаем выбирать новые действия и проверять, действительный.
Если нет, мы останавливаемся и не вынесете выбору последней активности, которую мы выбрали.
Например, если у нас есть 8 часов, мы сначала проверим, содержит ли комбинация только Боковые проекты может привести к действительному решению. Как мы определяли ранее, это не может, потому что это занимает больше времени, чем у нас в настоящее время.
Итак, мы не вылетели Боковые проекты, и попробуйте разные комбинации, начиная с алгоритмы. Проверяя, если наши текущие выбранные действия могут привести к действительному решению, мы избегаем необходимости проверять любую из комбинаций, содержащих Боковые проекты потому что они могут невозможны привести к действующему решению.
Этот подход называется обратно. Мы проверяем, если мы можем привести к действительному решению, если нет, мы вернемся на один шаг и попытаемся сделать другой выбор.
Вот код:
Это решение реализует две оптимизации, которые мы обсуждали ранее:
- Отслеживание всего XP и времени, чтобы мы могли рассчитать его в O (1) вместо суммирования всего набора каждый раз в O (n)
- Проверка того, приведет ли наш текущий набор к действующему решению, прежде чем мы рекурсивно добавьте новый элемент
Хотя BackTracking сохраняет много работы, она действительно не уменьшает общую сложность выполнения нашего алгоритма. Это все еще o (n!), Потому что мы все еще рекурсивно проверяем наиболее возможные комбинации.
Но реализация алгоритма Backtracking, вероятно, дала вам ключ к тому, как продолжать работать над проблемой. В решении грубой силы мы должны были собрать и проверить всю комбинацию для каждой возможной комбинации. При обратной стороне мы получаем проверку, если путь мы будем привести к действительному решению, прежде чем мы собираем всю комбинацию.
Хммммм ….
Есть ли способ рассмотреть только, следует ли мы добавить еще одно действие на наш набор? Это было бы намного проще проблемой, чем пытаться создать всю комбинацию одновременно. Это позволило бы нам разрушить нашу тяжелую проблему (нахождение оптимальной комбинации) к ряду меньших проблем (решая, следует ли добавлять единую активность).
Динамическое программирование
Динамическое программирование – это метод, в котором мы можем разделить наш большой Оптимизация Проблема (какая комбинация мероприятий я должен выбрать?) в серию управляемых Решение Проблемы (я должен включить эту деятельность в моем оптимальном решении или нет?). Мы делим и победим.
Динамическое программирование – это обычный способ решения проблем с трудом NP, таких как проблема рюкзака, и совпадаеттельно, также хороший способ подумать о поисках работы. Трудно определить, какое сочетание мероприятий сделает вас готов к поиску работы. Там нет эффективного способа найти оптимальную комбинацию или проверить, является ли ваш текущий выбор оптимальным.
Но намного проще сломать время в отдельных днях и недель, и попытаться понять, какие виды деятельности вы должны делать для каждого небольшого периода времени.
Чтобы решить эту проблему поиска работы с использованием динамического программирования, мы нарушаем проблему в серию меньших проблем (как мне оптимизировать меньший период времени?), А затем принять решение из каждой из небольших проблем и объединить их в более крупный решение.
Звучит с толку? Давайте пройдем через это:
const ACTIVITIES = [ {name: 'side-project', time: 10, xp: 12}, {name: 'algorithms', time: 3, xp: 7}, {name: 'networking', time: 1, xp: 0.5}, {name: 'exercise', time: 2, xp: 1.5}, {name: 'systems design', time: 4, xp: 4}, {name: 'making CSS codepens', time: 3, xp: 4}];
Каково оптимальное решение, если у нас будет общее время (ноль) для подготовки?
Если у нас будет нулевое время, мы не можем сделать какие-либо действия, поэтому верните пустой набор, [] Отказ
Хорошо, теперь, что оптимальное решение у нас есть общее время?
Во-первых, давайте посмотрим, какие виды деятельности можно сделать: мы не можем сделать бокового проекта (время) или алгоритмы обучения (время). Единственное, что мы можем сделать, это сеть (время).
Так что нам нужно решить Если добавление сетей на оптимальное решение для времени приведет к оптимальному решению.
Если мы добавим сеть, мы выходим с общим XP 0,5, неплохо.
Если мы не добавляем сеть, мы не сможем сделать что-то еще, поэтому мы выходим на общий XP 0.
0.5 все еще лучше, чем 0, поэтому, если у нас есть только общее время, мы должны делать сеть. Оптимальное решение для времени – [Сетевая]
Каково оптимальное решение для времени?
Какие действия возможны со временем, что мы еще не рассмотрели? Просто упражнение.
Если мы решим добавить упражнение, которое требует времени, у нас больше нет времени, чтобы сделать что-либо еще, поэтому наше решение – [Упражнение], что приводит к 1,5 XP.
Мы сравниваем оптимальное решение, включая упражнение (которое приводит к 1,5xП) и оптимальное решение, не включая упражнения (что приводит к 0,5xp). Поскольку решение, содержащее упражнение, лучше, мы выбираем, что один (в реальной жизни, я также чувствую, что с очень ограниченным временем, какой-то самообслуживание всегда более полезно, чем больше подготовителей?).
Теперь вот где это становится действительно интересно: Что такое Оптимальное решение для времени?
Опять же, какие действия возможны для времени?
У нас есть возможность выбрать из [Алгоритмы, физические упражнения, сеть].
Если мы выберем алгоритмы Что требует времени, у нас нет времени делать что-либо еще, поэтому одно возможное решение – [алгоритмы] Отказ
Если мы выберем упражнение Что требует времени, у нас есть время, чтобы сделать что-то еще? Как мы знаем, что выбрать для оставшегося времени?
Мы знаем оптимальное решение для времени, это [Сетевые], Поэтому нам не нужно рассчитать его снова. Мы знаем, что мы не можем сделать лучше, чем оптимальное решение для времени Отказ
Так что одно возможное решение – [Упражнение, сеть].
Снова мы сравниваем все возможные решения и видим, что лучшее, что мы можем сделать [алгоритмы].
Это основная структура динамического решения программирования: в каждое количество времени мы проверяем Решение о том, добавлять определенную деятельность. Мы сравниваем все возможные решения, и выясните оптимальный.
Решения для больших объемов времени создают оптимальные решения для той же проблемы с небольшим количеством времени. Это позволяет рекурсивно вызывать функцию динамической программирования.
Для моего примера я решил сортировать массив действий к тому времени, что нужно, чтобы завершить их (наименее всего на наибольшее). Это позволяет нам быстро определять, какие предметы возможны в данное время, потому что они сортируются по времени.
Ниже приведен код:
Wooooo! Если вы сделали это через этот пример впервые, то вы быстрее учусь, чем я. Я надеюсь, что это было интересно в поисках альтернативных способов решать жесткие алгоритмические вопросы!
Наконец, какова цель этой серии из трех примеров, которые вы можете спросить?
Я не только не только увидела вам некоторую практику, работаю над вопросом, очень похожим на те, которые вас можно просить в технических интервью, я показал вам шаги, которые я взял, чтобы прийти в мои умственные рамки.
Есть почти бесконечные комбинации деятельности, которые вы могли бы делать, и нет эффективного способа определить оптимальный набор действий, которые вы должны сделать. Многие пути не приводят к действующему решению, как и многие приложения и интервью на работу не приведут к работе.
Вы можете попробовать все возможные комбинации поисковой деятельности (грубой силы), но поскольку мы являемся людьми с конечными временем, это не эффективный способ прибыть на нашу цель.
Мы могли бы оптимизировать наш подход, оценивая на каждом шаге, приведет ли наш подход к нашей цели (возвратно). Например, если мы постоянно достигаем сторонних рекрутеров, чтобы помочь нам найти работу по желанию, и рекрутеры не были очень полезны в создании интервью, возможно, мы должны отступить и рассмотреть другую деятельность.
Наконец, поскольку поиск работы не является однодневым делом, мы могли бы попытаться оптимизировать каждый день и объединять дни (динамическое программирование). Таким образом, у нас есть управляемая проблема для решения (я должен изучать алгоритмы сегодня?) По сравнению с очень трудом (что мне делать на следующий месяц, чтобы подготовиться к поиску работы?).
Наконец, я просто хочу указать, что со всеми 3 подходами, хотя они не были объективно эффективными, мы сделали в конце концов достичь решения. Пока в середине поиска работы действительно важно помнить, что в долгосрочной перспективе вы Будет ли достичь своей цели и продолжать продвигаться вперед каждый день.
Мой совет по обработке поиска работы вашего разработчика
Я собираюсь поддаваться своему искушению, чтобы дать вам два совета по моему опыту.
- Супер трудно судить о собственной работе во время интервью и задачи кодирования – так что просто сосредоточиться на процессе. Вы не будете знать во время интервью или сразу после того, как у вас все хорошо или плохо.
- Успех или неудача военноплены и не должны определять ваше счастье.
Если вы ищете свое первое программирование, я надеюсь, что чтение этого было полезно или, по крайней мере, вдохновляющие для вас – посмотрите, талантливый дафутер Как я нашел отличную работу! Удачи там, и я хотел бы закрыть, поделившись лучшим советом, данным мне во время моей работы:
Спасибо за чтение, и удачи с вашим поиском работы!