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

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

*Обращаем ваше внимание, что позиция автора может не всегда совпадать с мнением МойОфис.


Как научиться учиться?

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

  • когда я была ребенком, то 7 лет занималась математикой по методике Kumon, которая нацелена на самостоятельное изучение предмета. Так я освоила всю программу начальной и средней школы — от умножения до алгебры и математического анализа. Думаю, это было важно, и я благодарна своей маме (она помогает детям учиться самостоятельно уже более 20 лет) за то, что она направила мою учебу в нужное русло;

  • я получила степень по фундаментальной математике, и в процессе мне было важно иметь четкое представление о том, что я понимаю, а что — нет;

  • я посещала Recurse Center — образовательное сообщество для тех, кто хочет улучшить навыки программирования, состоящее из самостоятельных учеников;

  • я разработчик, а в этой сфере, как вы знаете, постоянно узнавать что-то новое — один из важнейших навыков. :)

Вот еще пара вещей, которые, как мне кажется, могут развить умение учиться:

  • домашнее обучение или школа c большим акцентом на инициативу и самостоятельный ресерч;

  • получение PhD — конечно, если это нужно для вашей работы.

Я понимаю, что «самостоятельное изучение математики, когда тебе 8 лет», стоящее в одном ряду с «получением PhD» выглядит немного странно. Но мне кажется, что понимание ребенком дробей, так же значимо для мозга, как и открытие новых идей взрослым исследователем. Эти ментальные практики для меня равноценны по своей пользе.

Но, хватит о математике. Перейдем непосредственно к тому, чему посвящена моя статья — давайте разберем некоторые навыки обучения.

Первый навык: поймите, что вы не понимаете

Я считаю этот навык одним из самых важных. Это умение трансформировать «я запутался, я не понимаю» в «у меня есть конкретный вопрос по X».

Например, когда я изучала Rust, меня очень смущали ссылки и заимствование. Мне потребовалось время, чтобы разобраться, почему случился этот затык, но в конце концов я поняла, что просто не знала, как ответить на вопросы ниже (ответы можете посмотреть в другой моей статье — What's a reference in Rust?):

  • что на самом деле означает символ & в Rust?

  • как определить, что переменная выделяется в stack, а не в heap? И всегда ли возможно это определить?

  • как избежать установки времени жизни для моих структур в Rust?

Как только я ответила на эти вопросы, то стала гораздо лучше понимать все, что касается ссылок и заимствования. Как следствие — проблемы с написанием кода в Rust уменьшились.

Первый навык (продолжение): определить, что вы не понимаете очень и очень важно, но ужасно трудно

Если бы я не смогла найти, где именно застряла в своих изысканиях на тему Rust, мне бы пришлось:

  • попросить кого-то найти мою проблему за меня, а это — почти неосуществимо;

  • найти курс / статью в блоге / книгу, где кто-то уже разложил по полочкам все, что мне нужно;

  • решить не разбираться со сложными и запутанными вещами — это было бы настоящей катастрофой.

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

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

Второй навык: будьте уверены в своих знаниях

Конечно, одним определением того, что вы не понимаете дело не ограничивается. Также важно адекватно оценивать багаж ваших знаний. Например, я не знаю все о сетевых технологиях. Но в одном я уверена на 100% — существует 65 535 портов TCP. Поля src/dest портов в TCP-заголовке состоят из 16 бит (2^16 = 65 536), так что для других портов там просто нет места.

Знания, в которых я не сомневаюсь, очень важны, когда я пытаюсь разобраться в сложной проблеме. Например, представьте, что программа выводит в логе «порт 1 823 832». Это не потому, что количество портов мистическим образом увеличились, а я просто глупая и не знаю об этом. Нет! Просто в программе ошибка, и порта 1 823 832 не существует. Конечно, пример слишком детский, но мне постоянно приходится отлаживать сложные проблемы, и если бы я не была уверена в том, что знаю, мне бы пришлось бы терять время и действовать наугад.

Если и тратить в таком случае драгоценные часы, то на суперполезную вещь, а именно — взять часть информации, в которой вы уверены («всего есть 65 535 портов, так сказала Википедия») и сделать ее железобетонной («это потому, что поле порта в заголовке TCP состоит всего из 16 бит»). Ведь существует огромная разница между «я на 97 % уверен, что это правда» и «я уверен в этом на 100 % и никогда больше не должен в этом сомневаться». На то, что я знаю на 100 %, гораздо легче положиться.

Третий навык: задавайте вопросы

Речь о том, чтобы взять то, что вас смущает (например, «в чем разница между TLS 1.3 и 1.2?»), и превратить это в вопросы. Если что — вот моя статья о том, как задавать правильные вопросы.

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

  • поиск нужных групп в Slack или нужных IRC-каналов / рассылок;

  • задавать вопросы на Stack Overflow (что у меня никогда не получалось).

Четвертый навык: ресерч!

Что для этого нужно уметь делать:

  • гуглить;

  • знать, где найти самую полезную документацию в вашей области;

  • иметь или находить книги, в которых есть нужная информация. Stack Overflow — не панацея. Если у меня сложности с Linux, я часто обращаюсь к книге Michael Kerrisk The Linux Programming Interface, вместо того, чтобы лазить в сети;

  • читать исходный код — когда другие перечисленные источники не помогают.

Я не знаю ни одного хорошего руководства по методике технического ресерча. Хотя, думаю, что это было бы чертовски полезно — знания и нужная информация рассыпаны по разным источникам, каналам и носителям (мануалы, книги, рассылки и т.д.). Какая-то документация РЕАЛЬНО профессиональнее и, следовательно, полезнее другой. Было бы неплохо, чтобы в поисках можно было на что-то ориентироваться.

Пятый навык: признайте, что тупик — верный знак того, что скоро вы узнаете что-то новое

И последнее, что оказалось для меня очень важным — умение распознавать моменты, когда передо мной встают какие-то проблемы, и не расстраиваться из-за своей мнимой глупости («О нет! Я не знаю этого! Катастрофа!»), а признавать, что это НОРМАЛЬНО и означает, лишь то, что я просто собираюсь чему-то научиться!

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

  1. Я признаю, что запуталась.

  2. Четко определяю тему, с которой возникла сложность.

  3. Превращаю свое замешательство в конкретные вопросы.

  4. Спрашиваю у кого-то или изучаю вопрос сама, чтобы получить ответы.

  5. Готово — я узнала что-то новое!

Конечно, это не универсальная схема и я поступаю так не каждый раз. Иногда я просто отмечаю: «Ага, меня смущает Х. Возможно, я разберусь в этом когда-нибудь, но не сегодня». И это тоже нормально! Обучение — это проект длинною в жизнь :)

Работа над этими навыками имеет огромное значение

Я не думаю, что смогла бы сделать карьеру программиста, если бы не вкладывалась в изучение новых вещей. Почти все, из чего состоит моя рутинная работа, я узнала сама, и многое из этого — совсем недавно (в последние 2-3 года). Поэтому я без остановки стараюсь улучшать свои познавательные навыки. Вот некоторые из них, где я еще не дотягиваю до идеала, но очень этого хочу:

  • брать большой/сложный кусок документации с открытым исходным кодом и определять, какая информация в нем есть, а какой — нет;

  • эффективнее пользоваться группами в Slack/IRC с открытым исходным кодом;

  • искать полезные и надежные справочники, на которые можно опереться.

Комментарии (0)