Если вы видите что-то необычное, просто сообщите мне. Skip to main content

Часть 3: Haskell и взвешенная практика

Вы были в ситуации когда вы пытаетесь изучить что-то в определенное время, и застряли на этом? Шанс, что вы изучаете предмет не лучшим способом. Но как вы можете узнать, что входит в это "хорошее" изучние вашей темы? Оно может разочаровать при попытке найти что-то в интернете. Большинство людей не думают о том способе которым они изучают новое. Они изучают, но они не могут выразить и обучить других людей тому, что они делают, потому что для этого нет инструкции.

Часть 1 этой главы говорит нам о том, почему вы не должны бояться пробовать изучить Haskell. Часть 2 обсуждает некоторые техники на высшем уровне. Эта часть пройдется по паре ключевых идей из "Art of Learning" Джоша Вайтцкина. Мы рассмотрим на то, как избежать проблему застрявания.

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

Мы раскроем это в 4 части, в которой разберем применение этой техники в изучении Haskell.

Некоторые техники проще понять, если вы уже имеете какую-то практику в изучении Haskell.

Взвешенная практика

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

  1. Это "очевидный" выбор.
  2. Он позволяет нам проиграть часть, которую мы уже узнали и получить удовольствие от этого.
  3. Скорей всего в результате мы выучим композицию.

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

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

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

Ошибки

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

Вайцкин отмети в "Art of Learning": Если студент любого предмета может избежать хотябы повтора одной и той же ошибки дважды, они быстро достигнут высот в изучаемой теме. Мы так же можем сделать это если будем избегать ошибок в целом, но это не возможно. Мы всегда делаем ошибки, пробуя что-то впервые.

Сначала нужно принять, что ошибки будут случаться. Как только мы это сделаелм, у нас будет решение как этого избежать. Невозможно избежать повторения ошибок, но мы можем предпринять шаги, которые сократят их количество. И если мы такое можем сделать, то увидим существенное улучшение. Наше решение будет хранить все ошибки которые мы сделаем. Описывая всё, что происходит, мы резко сократим повторение ошибок.

Практикуем HASKELL

Теперь нам нужно сделать шаг назад в мир написания кода и спросить себя, как мы можем применить эти идеи к Haskell. На каких темах практики написания кода мы можем остановиться?

Вы можете написать приложение, и сфокусироваться на приобретении следующей привычки: прежде чем вы напишете функцию, нужно вынести неопределенности и убедиться, что типы сигнатур комплируются(мы это обсудим дальше в части 4). Не важно если вы всё остальное сделали правильно! Приобретя эту привычку можноприступать к следующему шагу. Вы можете убедиться в том, что вы всегда пишете вызов функции прежде чем вы её реализуете.

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

Есть еще несколько похожих идей:

  1. Прежде чем писать функцию, напишите коммент описывающий эту функцию.
  2. Прежде чем использовать выражение из библиотеки, добавьте её в ваш .cabal файл. Затем, напишите выражение import чтобы убедиться, что вы используете правильную зависимость.

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

В большинстве случаев триггером для приобретения этой привычки это написание новой функции. Триггер это важная часть приобретения новой ошибки. Это действие которое подсказывает вашему мозгу, что вы должны делать что-то не привычное. В этом случае, триггером будет написание :: для сигнатуры. Каждый раз, выполняя это, вспоминайте о вашей цели.

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

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

Это важдые вещи. Не пытайтесь выучить сразу все! Вам нужно выбрать одну, практиковать её пока она будет работать подсознательно, и затем двигайтесь к другой. Это самая сложная часть взвешенной практики: управлять своим терпением. Самое большое влечение это двигаться и пробовать новые вещи, прежде чем усвоится привычка. Как только вы переключитесь на другие вещи, вы можете потерять, то над чем работали. Помните, обучение сложный процесс! Вам нужно сделать небольшое исследование которое требует определенное время. Вы не сможете ускорить этот процесс.

Отслеживание ошибок

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

  1. Как себя повел сборщик?
  2. В чем заключалась проблема с кодом?
  3. Как это можно исправить?

SoДля forпримера, anподумайте example,о thinkвремени aboutкогда aвы timeбыли youуверенны wereо certainтом, yourчто codeкод wasверен. correct.Взгляните Youна lookошибку, atзатем theна error,ваш thenкод, backопять toна yourошибку. code,И thenвы backвсё toеще theуверенны, error.что Andкод you'reправильный. stillКонечно, sureкомпилятор yourпочти codeвсегда isправ. right.Вы Ofхотите course,это theзаписать, compilerчтобы isвас (almost)нельзя alwaysбыло right.обвести Youвокруг wantпальца toеще document these so they don't trip you up again.раз.

OtherДругой goodхороший candidatesкандидат, areэто thoseошибки runtimeисполнения errorsгде whereвы youне cannotможете forникаким theобразом lifeпонять ofгде youошибка trackвозникает downв whereвашем theкоде. errorВы evenхотите occurredзаписать inэтот yourопыт code.таким You’llобразом, wantчтобы toв writeследующий downраз whatвы thisмогли experienceбыстро wasрешить likeпроблему. soВыписывание theзаставляет nextвас timeизбегать itповторений happens, you’ll be able to fix it quickly. By writing about it, you’ll also motivate yourself to avoid it as well.ошибок.

ThenЕсть thereеще areглупые alsoошибки, dumbкоторые mistakesвы thatдолжны youзаписывать shouldпотому, recordчто becauseони it’llучат teachвас youбыстрее. theНапример, rightвначале wayвы faster.можете Likeиспользовать when you’re starting out you might use the (+) operatorоператор toдля tryскладывания toдвух appendстрок, twoвместо strings instead of the (++) operator.оператора. ByВыписывание writingтаких downошибок errorsпозволит likeвыучить this,свойство you'llгораздо learn quirky language features much faster.быстрее.

OneПоследняя finalгруппа groupвещей, ofкоторые thingsнужно youвыписывать shouldотличноее trackрешение. downНе isпросто awesomeисправление solutions.багов, Notно justрешение bugваших fixes,главных butпроблем solutionsпрограммирования. toДля yourпример, centralвы programmingнаходите problems.вашу Forпрограмму instance,слишком youмедленной, foundно yourвы programиспользовали wasнаилучшие tooсткруктуры slow,данных butдля youулучшения. usedУ aвас betterтак dataже structureимеются toзаписи improveтого, it.что Notвы onlyделали. doesТаким itобразом, feelу goodвас toбудет writeвозможность aboutприменить thingsрешение thatеще wentи well,в you’llследующий haveраз. aЭти recordвещи ofдают whatпищу youдля did.размышления Thatв way,собеседованиях. you’llСобеседования beчасто ableможно toуслышать applyвопросы itо nextпроблемах timeкоторые asвы well.решали, Theseчтобы kindsпонять ofваши itemsмотивационные (both the good and the bad) make good fodder for technical interviews. Interviewers are often keen to see what kinds of challenges you’ve overcome to show your growth potential as an engineer.способности.

IУ haveменя oneесть exampleодин thatпример, demonstratesкоторый theпоказывает goodхорошее andи badплохое ofраспознавание recordingошибок. mistakes.У Iменя hadесть aжуткий nastyбаг, bugкогда whenя Iпытаюсь was trying to build myсобрать Haskell projectпроект usingиспользуя Cabal. IЯ rememberпомню itбыла beingошибка aкомпоновщика, linkerкоторая errorне thatуказаывала didn’tна pointотдельный toфайл. anyЯ particularсделал file.отличную Iмысленную didзаметку, aчто goodрешение jobбыло inдобавить makingчто-то aв mentalфайл note.cabal. thatНо theя solutionне wasзаписал toполнстью addконтекст somethingили toрешение. theВ будущем, я увидел ошибку компоновщика и зная что нужно что-то сделать в .cabal”cabal file.файле, Butно Iя didn’tне writeпомнил, downчто theименно fullнужно. contextПоэтому orмне fullприходилось solution.повторять Soэту inошкбу theпока future,я I'llне seeвыписал aполностью linkerрешение error and know I have to do something in the “вопроса.cabal” file, but I won’t be sure exactly what. So I’ll still be more likely to repeat this error than I would if I had written down the full resolution.

SUMMARYЗаключение

It’sЭто anчасто oft-repeatedповторяемая mantraмантра, thatчто practiceпрактика makesделат perfect.всё Butлучше. asНо anyoneкто who’sулучшает masteredсвои aнавыки, skillможет canвам tellсказать, you,только onlyхорошие goodпрактики practiceулучшают. makesПлохие perfect.или Badбезумные orпрактики mindlessбудет practiceмешать willвам leaveдвигаться youдальше. stuck.Или Orхуже, worse,будут itпрививать willвам ingrainплохие poorпривычки, habitsкоторые thatбудут willтребовать takeдополнительное moreвремя timeдля toих undo.отмены. DeliberateВзвешенная practiceпрактика isэто theпроцесс processукрепления ofзнания solidifyingс knowledgeпомощью byсоздания buildingпривычки. upВы tinyвыбираете habits.одну Youи pickфокусируетесь oneна thingней, toи focusогнорируете on,всё andостальное. ignoreЗатем everythingвы else.её Thenиспользуете youпока learnона thatне focusпопадет untilвам itна hasзакорку. becomeИ subconscious.только Onlyпотом thenвы doдвигаетесь youдальше. moveЭтот onподход toтребует learningогромного other things. This approach requires a great deal of patience.терпения.

OneПоследняя finalвещь, thingкоторую weнужно haveпонять toо understandобучении aboutнужно learningпринять isвозможность theошибки. needКак toтолько embraceэто theбудет possibilityсделано, thatмы weможем willсделать makeплан mistakes.записи Onceэтих weошибок. haveТогда doneмы this,можем weизучить canих makeи aне planповторять forбольше. recordingЭто thoseрезко mistakes.увеличит Thisскорость way, we can learn from them and not repeat them. This will dramatically improve our pace of development.разработки.

Now you should move onto the fourth and final part of our Haskell Brain series! You'll learn about Compile Driven Learning, a specific Haskell technique for deliberate practice!

If you want to get more hands on with deliberate practice, you should download our Recursion Workbook! In addition to some content on recursion, it contains 10 practice problems. The answers start from undefined so you can build up your solutions step-by-step. It's a great way to learn deliberate practice ideas!

If you’ve never written a line of Haskell before, don’t be afraid! You should start with our Beginner's Checklist. It will walk you through installing Haskell and give you some helpful tools for starting on your Haskell journey!