Недавно я вернулся к изучению Эликсира с того места, на котором в последний раз остановился в начале этого года. Одна из целей, которые я имел в виду при изучении этого языка, заключалась в том, чтобы получить хорошее представление о различных функциональных концепциях языка, таких как сопоставление с образцом и т. Д., Путем фактического решения проблем, чтобы я мог лучше усвоить эти концепции. Как человек, который очень верит в обучение на практике, я выбрал Exercism в качестве основного способа изучения Elixir.

Учитывая, что я ранее уже решил несколько упражнений Exercism в Elixir, я хотел тщательно выбрать следующее упражнение, которое я хотел решить, на основе концепций, которые я хотел лучше понять. Обнаружив это очень полезное обсуждение трека упражнений Elixir на github, я решил поработать над упражнением подсписок, поскольку хотел лучше понять, как можно использовать такие концепции, как сопоставление с образцом. , рекурсия и списки в Эликсире.

Путешествие

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

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

Исправление теста, связанного с "Огромный подсписок не в большом списке"

Попытка 1: я изначально пытался исправить этот тест, используя метод MapSet’s subset? / 2 как часть решения, представленного здесь. Это решение смогло исправить этот и все другие тестовые примеры для упражнения с подсписками, за исключением теста, связанного с recurring values unequal, поскольку функция подмножества Mapset не принимает во внимание порядок или повторяющиеся элементы.

Попытка 2: я попытался подойти к этому по-другому, пытаясь найти разницу между двумя списками с помощью этого решения. Это не сработало, по крайней мере, для тестового примера, связанного сrecurring values unequal (потому что в Elixir он находит разницу между списками для каждого элемента, а не для всего списка в целом), и выполнение теста, связанного с huge sublist not in huge list, с помощью этого подхода заняло так много времени мне, что я решил двигаться дальше.

#Elixir calculates difference between lists on a per element basis
iex(10)> [1,2,3,1,2,3,2,3,2,1] -- [1,2,1,2,3]
[3, 2, 3, 2, 1]

После двух попыток не пройти все тесты возникло чувство застревания.

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

Взгляд за пределы синдрома самозванца

А. Размышления

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

  1. Вы честно пытались исправить ситуацию сами, чтобы знать, какой подход вы использовали в работе над данным вопросом?
  2. Нашли ли вы способы выбраться из затруднительного положения, а также достаточно ли быстро вы откладывались, чтобы продолжать двигаться вперед?
  3. Вы определили недостающие пробелы между вашим мыслительным процессом и мыслительным процессом других? Что-то новое, что вы могли бы использовать в следующий раз, когда будете работать над чем-то подобным в будущем?
  4. Это нормально - просить совета по поводу упражнений, но может быть и другое, когда вы пытаетесь решить данную проблему, что определенно может дать вам лучшую идею думать в правильном направлении при работе над решение. Это заставило меня осознать, что это то же самое, что иногда люди делают на интервью, и это совсем не считается плохим! Я даже не думал о том, чтобы делать что-то таким образом, но весь этот опыт просто открыл мне новые способы найти способ обойти постоянные препятствия, с которыми мы время от времени сталкиваемся в жизни.
  5. Каждый новичок будет знать меньше, чем то, что знают другие люди, и нам просто нужно принять это. Изучив другие мысли о синдроме самозванца, я наткнулся на проницательный пост Алисии Лю У вас нет синдрома самозванца, и я мог многое связать с ее приведенной ниже цитатой в том посте, в которой говорилось:

Научиться программировать сложно, как и научиться делать что-нибудь стоящее, когда вы только начинаете. - Алисия Лю

Диаграмма ниже, созданная Алисией Лю, очень хорошо передает ту же мысль -

Б. Мои уроки, полученные при решении этого упражнения

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

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

Заключительные мысли

Я благодарен за работу, которую Катрина Оуэн и многие другие участники приложили, чтобы сделать Exercism тем, чем он является сегодня, а также за их постоянную работу, направленную на то, чтобы сделать его лучше в рамках Nextercism. ». Хотя я пытаюсь решить данную проблему примерно через 3 года после того, как она была решена упомянутыми выше людьми, чьи беседы мне очень помогли, мое обучение по-прежнему кажется очень интересным и совместным! Это дает мне повод с нетерпением ждать каждый раз, когда я беру новое упражнение, которое мне нужно решить. Беседы об упражнениях очень ценны!

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

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

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

В итоге я выполнил 5 итераций упражнения из подсписка и получил массу знаний (более подробно упомянул о своих знаниях в комментариях к платформе Exercism) от всего лишь решения одного упражнения на Exercism. Мои выводы, полученные в ходе прохождения каждой из этих итераций, привели к моим самым важным выводам. Для меня это был пример того, как Exercism демонстрирует свои лучшие качества!

В конце туннеля я нашел намного больше, чем ожидал, и это напомнило мне, что несмотря ни на что, продолжайте двигаться вперед! И это также заставило осознать, что путешествие - это награда!