fbpx

Каталог статей

Каталог статей для размещения статей информационного характера

Как выучить

Как освоить алгоритмы и структуры данных, не сжигая свой мозг

Как освоить алгоритмы и структуры данных, не сжигая свой мозг

Эта тема заслуживает отдельной книги, написанной крутым компьютерщиком. На самом деле, их существует множество. И есть, по крайней мере, тысяча статей/ответов на вопросы Quora, советующих лучшую книгу/курс для изучения алгоритмов и структур данных.

Эта статья больше сосредоточена на подходе, а не на ресурсах.

Иметь предпринимательские амбиции:

Мыслите (дизайн) глобально; действуйте (код) локально.

-Анонимка

Говоря “предпринимательские”, я не имею в виду, что каждый начинающий кодер должен стремиться открыть новый бизнес.

(Не стоит только начинать гуглить “seed investor for faster link list”. Хотя впоследствии вы можете спросить себя: почему бы и нет?)

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

Что лучшего я могу извлечь из своего компьютера (как вариант, также из API web, Kaggle, GitHub Explore и многих других реестров пакетов, таких как NPM JS) сегодня, что может принести пользу мне, моим друзьям и обществу в целом?

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

Наличие цели попасть в FAAMG также может мотивировать вас, но это труднодостижимая цель. (см. ниже)

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

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

Если это недостаточно мотивирует вас, примите это: Программное обеспечение – это единственная (теперь уже первая) дисциплина, в которой вы можете в одиночку создать целую линию сборки продукта. Во времена облачных рабочих процессов и распределенных блокчейнов это верно как никогда в истории.

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

Сведите к минимуму экранное время:

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

-Малькольм Гладуэлл

Ваша компетентность в алгоритмах и структурах данных зависит от времени, которое вы проводите с ними.

В книге Малкольма Гладуэлла “Outliers” (“Посторонние”) сформулировано известное правило 10000 часов. Самая упрощенная версия этого правила гласит, что если вы будете практиковаться 10000 часов, то сможете стать экспертом в любой области.

Хотя это правило находится под пристальным вниманием многих экспертов, для программистов

Сначала они читают “Взлом интервью по кодированию”. Затем они идут на один из сайтов братства LeetCode, Codechef, Hackerrank или TopCoder. Эти места приклеивают их к экрану своими проблемами, форумами и интенсивно геймифицированными достижениями.

Это просто слишком быстро истощает энергию. Зачем тратить ее на то, чтобы напрягать глаза, если можно использовать ее для мозга?

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

Если кто-то составит список проблем, для решения которых нужны машины, алгоритмы и структуры данных будут на последнем месте. На первом месте – устранение неполадок. На втором месте – тестирование.

Единственными инструментами Эйнштейна для переписывания космических правил были ручка и бумага. С Ньютоном дела обстояли не лучше.

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

Единственными инструментами Эйнштейна для переписывания космических правил были ручка и бумага.

Все, что вам нужно – это вещь, на которой вы можете написать свой псевдокод; компьютер – довольно мощное устройство для этого!

Вот предлагаемый подход:

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

  • Посетите онлайн-задачи, связанные с темой.
  • Визуализируйте проблему.
  • Нарисуйте структуры входных и выходных данных (например, для перестановки строк “abcde” – это вход, а “edcba” – выход). Именно здесь находятся ваши данные.
  • Самое важное: Записывайте изменения состояния в структуры данных (например, для Фибоначчи: f(n) = (n-1) + (n-2)). Это желаемая серия операций, которую вы должны согласовать. Нарисуйте соответствующие ведра для ваших элементов, например, для Linked List, не забудьте про связи между узлами.
  • Используйте карандаш и бумагу (или доску) для решения. Даже если вы знаете, что ваше решение отстойное, попробуйте довести его до совершенства, насколько это возможно в автономном режиме.
  • Пишите псевдокод, а не синтаксис.
  • Пишите значения на каждом шаге. Если нужно, нарисуйте диаграмму состояний.
  • Как только решение будет готово, напечатайте его на ПК/Mac/веб-консоли.
  • Если по ошибке у вас не получилось решить задачу своим способом, попробуйте визуализатор алгоритмов, но не переусердствуйте за счет своих глаз.
  • Этот первоначальный медленный подход многократно вознаградит вас при повторном решении той же задачи.

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

Используйте незадействованные нити:

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

– Роберт А. Хайнлайн

Процессор, о котором мы говорим, – это ваш мозг.

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

Без перерыва нет возможности обдумать свой дизайн.

На самом деле, эта истина не нуждается в доказательствах. Почему еще, несмотря на то, что дети – отличные хватальщики, им разрешают отдыхать в школьное время?

Как вы можете использовать свободное время для решения проблем с алгоритмами:

Прочитайте задачу на сайте Code Challenge. Вникните в нее досконально.

  • Вскоре после этого покиньте свой стол. Возьмите случайную задачу, которая не связана ни с кем другим. Прогуляйтесь, займитесь домашними делами, приготовьте кофе или сходите в обычный магазин, который не требует особого выбора.
  • Подумайте о решении случайной задачи.
  • Мысленно разделите 1) Что у вас есть 2) Что вы можете получить 3) Чего у вас нет. Запишите их.
  • Попробуйте сделать первый набросок на бумаге/доске.
  • Если вам не хватает логики, спросите у своих сверстников/учителя. В конце концов, программирование – это дисциплина, направленная на создание структуры. Структурированный вы производите более структурированный код и более структурированные вопросы для других, чтобы помочь вам.
  • Вернитесь к работе, доработайте решение.
  • Включите компьютер и напечатайте/отправьте его.
  • Используйте время перерыва в работе вашего мозга как можно больше для создания мысленной конструкции. Не тратьте свою осанку и глаза на чтение с экрана или бесполезный треп.

Будьте в зоне:

Лучший выход – всегда через него.

– Роберт Фрост

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

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

Мозг не просто забывает то, чему учится. Но если последняя встреча не была недавней, ему требуется больше времени, чтобы восстановить полезный результат.

Мой учитель по программированию сказал:

Если хорошо потренироваться, то можно написать лучший код во сне.

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

Для большинства кодеров совершенствование алгоритмов происходит непрерывно:

Изучите концепцию (например, бинарный поиск).

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

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

Главное – грамотно переплетать реальную (нерабочую) жизнь с кодом.

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

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

Никогда не позволяйте полосе прерваться. Никогда не выходить из зоны.

Ключ к этому – не соревноваться постоянно на LeetCode / Topcoder.

Это утомительно. Это неэффективно. Если у вас есть семья, это практически невозможно.

Ключ в том, чтобы разумно переплетать свою реальную (не рабочую) жизнь с кодом.

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

  • Если вы путешествуете по воздуху, подумайте о наиболее эффективных маршрутах. (Проблема сортировки)
  • Если вы находитесь в продуктовом магазине, подумайте о том, как избавиться от плохих яблок (бинарный поиск).
  • Подводя итог, можно сказать, что во время безделья думайте о проблемах, а не о решениях, и увидите, как пространство ваших решений мгновенно расширяется в геометрической прогрессии.
  • Однако не переусердствуйте, так как это может нанести определенный урон вашей личной жизни. Один из способов смягчить это – обсуждать проблему с партнерами (друзьями или семьей), опустив технические детали, такие как нотация Big O . Это отличный способ открыть свой канал совместного решения проблем. Это пригодится вам в будущих собеседованиях и обсуждениях развития.

Когда у меня не хватает времени на решение задач, еще один прием, который я с большим успехом опробовал (часто на рабочем месте), – это посещение StackOverflow для поиска наиболее популярных алгоритмических вопросов. StackOverflow известен только как сайт по устранению неполадок, но его место в этой области сильно недооценено. Вы получаете бесплатные советы от опытных ветеранов отрасли. Качество этих советов – это то, чего не могут дать ни авторы книг (закоренелые академики), ни те, кто зарабатывает на учебниках (преподаватели Udemy/Youtube).

Держите под рукой профессиональные хитрости:

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

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

Экономьте циклы процессора: O(1) всегда лучше, чем все. O(n) лучше, чем O(n^x). O(n^x) – наихудший вариант. В большинстве интервью ваша первая задача – преобразовать проблему в ту, которая решается подходом O(1) или O(n).

  • Экономьте память: Мемоизация (динамическое программирование) лучше, чем рекурсия.
  • Оптимизация для информационной иерархии: (В дереве), если вам нужны разнообразные данные, рекомендуется BFS (Breadth-first search). Если вам нужны релевантные данные, вам нужен DFS (поиск в глубину).
  • Не стремитесь только к FAAMG+:

“Проблема крысиных бегов в том, что даже если вы выиграете, вы все равно останетесь крысой”.

– Лили Томлин

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

Вот краткое объяснение причин:

Проблема не в самой компании FAAMG (и ее братьях и сестрах среднего звена, таких как Netflix, Uber и т.д.). Это ложное чувство амбициозности, связанное с ярлыками вместо совершенства.

  • Погоня за большой целью завышает ставки, тем самым увеличивая стресс. Давление сверстников отвлекает вас от истинной любви к программированию.
  • Получение работы отвлекает от учебы. Погоня за высшей должностью – еще больше. Есть множество примеров отличных кодеров, которые достигли вершины еще до того, как достигли возраста трудоустройства. Теперь не они гонятся за работой, а работа гонится за ними.
  • Конкуренция (более 100 тысяч заявок в год) в сочетании с 4-7 изнурительными раундами собеседований делают исход FAAMG гораздо менее предсказуемым.
  • Иногда, несмотря на все ваши усилия, вы становитесь жертвой сложной паутины рекрутеров.
  • Когда вы проваливаете собеседование, вы совершаете ошибку, ставя под сомнение достоверность своих алгоритмических способностей. На самом деле вам следует усомниться в своих неуместных амбициях, связанных с громкими именами.
  • Не меняйте свою реальную силу на виртуальную. Изучайте алгоритмы и структуры данных ради их изучения. Если появится крупное имя и вы почувствуете себя достаточно уверенно, попробуйте, и добейтесь успеха или провала без чувства вины.

Сделайте FAAMG+ не пунктом назначения, а потенциальной точкой в вашем путешествии.

Заключение:

Программирование (особенно алгоритмы и структуры данных) – это навык, кривая обучения которому очень странная.

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

Это хорошо. Но для многих это также скучно.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *