Что делать если я не понимаю программирование
Перейти к содержимому

Что делать если я не понимаю программирование

  • автор:

План изучения программирования сосредоточенный на проблемах новичков | Часть 0 ⁠ ⁠

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

Поскольку подразумевается серия постов(примерно 10-12), чтобы текст не был слишком большим, буду ссылаться на прошлые посты, лежащие здесь или на моем на канале — https://t.me/tobeprog (там же будут выходить посты дополняющие и раскрывающие план). Если будет подобная ссылка, то сразу будет краткое изложение сути материала на другой ее стороне.

Зачем нужен очередной план изучения программирования?

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

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

Почему так сложно понять проблемы новичков?

Побочка индустрии, она развивается так быстро, потому что технологии как бы наслаиваются друг на друга. Знания тоже, выучиваешь одно, на его основе второе, третье и так до бесконечности. Ко всему прочему, программирование — ремесло. Сложно вспоминать проблемы с основами ООП, когда они погребены под большим пластом практики. И это — очевидный ‘затык’, сколько про него написано материалов, предлагающих свой подход к его преодолению. Что уж говорить про то, что рано легло в основу, и стало чем то сверх очевидным.

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

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

Тоже касается и книг/курсов. Предположим программисту предложат прочитать курс по вводу в какой нибудь оояп. Как сделать этот курс максимально полезным? Ну разумеется все возможное время посвятить ООП. Курс точно так же, может быть хорош, может отлично объясняться парадигма и даваться интересные задачи, и при этом ученик не научиться программировать.

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

И как же это исправить?

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

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

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

Примерный план

Кратко опишу суть, аргументировав основные решения. Мне кажется, это даст понять примерное направление. Чтобы лишний раз не повторяться — два больших поста, которые хорошо дополнят сказанное:

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

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

2 этап. CS и теория, тут важно уточнить, теория в данном случае, не просто общие познания, это именно подъем на другой уровень самого практического навыка. Необходимость, особенно после Python(на этом этапе от него ненадолго отступим), он отлично решает проблему первого этапа, но при этом обладает рядом существенных недостатков. Если упростить — на нем можно писать откровенно плохой код. И ‘теоретическое’ дополнение должно решить эту проблему.

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

3 этап. Может показаться, что если уже есть понимание самого процесса, наложена практика с теорией, то цель достигнута. Это так, но все же стоит это все объединить, закрыв какие то непонятные моменты. Снова возвращаемся к Python, но уже с несколько другим, более глубоким взглядом.

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

Как учиться программировать: 6 вещей, которые я понял, учась на Хекслете

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

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

Большинство этих вещей до меня дошли именно в процессе обучения и общения с ребятами-программистами на Хекслете. Для кого-то это явно будут откровения Капитана Очевидность, но, возможно, кому-то оно и принесет пользу.

Какой язык программирования изучать первым? Неважно!

Не нужно тратить сильно много времени на выбор и мучаться этим. Берите Ruby, Python, JavaScript, PHP, Java, Lisp, да хоть паскаль — не ошибетесь. Для начала вам все равно нужно будет освоить базовые вещи, такие как циклы, условия, переменные, функции, объекты, рекурсию и т.п. Я когда-то в школе немного программировал на всяких бейсиках и C++, но к тому времени, как решил стать программистом, все это успешно забыл.

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

Новички так серьезно подходят к вопросу «Какой же язык программирования выбрать», будто им предстоит подписать договор с дьяволом, и всю жизнь писать только на этом единожды выбранном языке. Лично для меня просветлением стало, когда я увидел профили высокооплачиваемых программистов на бирже Upwork, почему-то очень во многих из них было написано примерно следующее — могу Django, могу Rails, а еще Meteor и Angular, да и Spring тоже. И Joomla само собой.

Потом я спрашивал некоторых знакомых (и малознакомых) программистов об их карьере, и увидел некий паттерн, которого раньше не понимал. Человек может, например, год работать с PHP, потом уйти на Java, потом плюнуть и выучить руби, стать RoR разработчиком, и в итоге заняться Node.js или Clojure. Любой нормальный программист знает несколько языков хорошо и десяток поверхностно. Поэтому не ломайте голову, не пытайтесь выбрать Самый Лучший Язык и строчить для этого тысяча первый вопрос на тостере. Просто берите любой язык и прочитайте по нему хотя бы одну книгу/пройдите курс. Попытки выбрать Самый Лучший Фреймворк из той же серии.

Про первую работу

Очень многие программисты начинают свою работу с весьма непрестижных компаний и крошечных зарплат. И это нормально. Но это сложно принять, особенно тем, кто решает «войти в айти» уже не в юном возрасте, имея семью и детей. Мифам об огромных зарплатах программистов зачастую способствуют школы программирования, которым нужно продавать свои курсы и в итоге на своих лендингах они крупным шрифтом пишут какие-то заоблачные цифры, вроде «средняя зарплата JavaScript программиста 150 000 рублей», при этом часто забывают сказать, что такую зарплату получают люди с опытом в несколько лет (или даже десяток лет), которые могут решать реальные сложные задачи, а вам после их курсов на старте светит тысяч 30 на испытательный срок, и это в Москве. А то и вообще попросят бесплатно поработать. За опыт и еду. Не нужно бояться идти на непрестижную и малооплачиваемую работу, потому что как только вы официально начнете работать программистом, даже за 20 тысяч в месяц, ваша привлекательность в глазах других работодателей и HRов сильно вырастет. На старте работу никто не мешает менять хоть каждые 3-6 месяцев, каждый раз уходя на бОльшую зарплату и более интересные задачи.

Но я, конечно же, не говорю, что нужно идти работать за еду, может конкретно вы найдете первую работу и за 100 000 в месяц. Просто нужно понять, что карьера тоже требует немалых усилий, и необходимо активно изучать рынок труда, время от времени общаться с рекрутерами и ходить на собеседования, чтобы адекватно себя оценивать в каждый момент времени. А первая работа — это не навсегда.

Учиться программировать сложно

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

Лично я долго (слишком долго) учился на всяких курсах из серии «посмотри на меня, делай как я». Когда начал учиться на Хекслете, у меня от некоторых заданий просто мозг кипел, да и сейчас кипит. Одно задание я пытался сделать 3 дня. Но в итоге я прокачался, и теперь могу решать более сложные задания, чем раньше. Мне кажется, именно в этом должна быть цель хороших курсов программирования. Не в том, чтобы натренировать вашу память на запоминание 1000 функций из какой-то библиотеки. А в том, чтобы заставить мозг напрягаться и с каждым днем решать все более сложные задачи.

Про code kata

На определенном этапе (почти сразу после изучения основного синтаксиса одного из языков программирования), нужно набить руку в решении простых (хотя бы простых, для начала), алгоритмических задачек. Есть десятки разных сервисов, где это можно делать — codewars.com, exercism.io, hackerrank.com и т.п. Проскочить этот этап не получится. Если вы зашли на codewars и просто не понимаете, что от вас хотят, и как решать даже самые простые задачи первых уровней, срочно вливайтесь в какое-то сообщество, где есть программисты и единомышленники, изучающие программирование, и где можно будет задавать вопросы и получать помощь. Одно из таких мест — слак чат Хекслета. Если вы не научитесь решать эти простые задания, вероятность резиста того, что вы сможете решать какие-то реальные рабочие задачи, крайне мала.

Не нужно зубрить названия функций

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

К примеру, если я знаю, что обычно в языках программирования есть возможность привести строку к нижнему регистру. C этим знанием общей концепции, если я захочу например, писать на COBOL, просто загуглю — tolowercase in Cobol. И вуаля Lower-case(Item-1) . Если я буду много писать на каком-то определенном языке, я загуглю основные функции по 100 раз, и на каком-то этапе уже их запомню.

Кстати, это очень полезная штука и для изучения иностранных языков, я лично просто ненавижу делать какие-то списки, карточки и зубрить слова. Особенно у меня вызывают желание ругаться матом наборы слов, вырванные из контекста, типа «100 прилагательных на тему Погода». Это просто нереально запомнить, а даже если и зазубрил сегодня, через месяц 80 процентов забудешь. Гораздо эффективнее просто читать/смотреть интересный тебе контент на языке и искать незнакомые слова в словаре каждый раз, таким образом через какое-то время самые употребительные слова запоминаются естественным образом.

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

Начните изучать разработку с бесплатного курса «Основы современной вёрстки». Вы научитесь создавать статические веб-страницы, стилизовать элементы, использовать редакторы кода с полезными расширениями. В конце курса вы опубликуете свой первый сайт на GitHub Pages.

Тупить — это нормально. (с) Елена Малышева

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

То есть люди, которые занимались программированием много лет, иногда тоже не могут самостоятельно разобраться в какой-то новой фиче, и совершенно не стесняются просить совета и помощи. Однако, с вероятностью 99% предварительно они пытались сами решить эту проблему, обратились к Google и Stackoverflow, но безуспешно.

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

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

Что значит программировать, и почему многие не понимают этот процесс

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

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

Мой канал в телеге — https://t.me/tobeprog (там о самих методах обучения и обзоры на уч.материалы).

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

Программирование — процесс который не понимают

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

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

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

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

Довольно интересно наблюдать, как сами разработчики пытаются подобрать понятную метафору для этого процесса, к примеру, нередки сравнения с творчеством(если хочется покопаться в теме метафор, то довольно интересно это описывает Макконнелл, во 2 главе “Совершенного кода”)

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

При этом, со стороны программистов, эти свойства, эти описания и вообще сам процесс настолько очевидны/логичны/правильны, что об этом как будто бы, нет смысла даже говорить.

Немного про сам процесс

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

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

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

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

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

Как же понять этот самый процесс?

Вернемся к тем 2-ум пунктам из поста про уч.материалы, но перед этим, пару слов о питоне и почему вообще, это один из лучших вариантов первого япа.

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

1. Чтобы понять процесс программирования, для начала надо его увидеть.(увидеть процесс программирования и досконально понять код — разные вещи, нам нужно именно само мышление).

https://www.youtube.com/watch?v=vpyWbpdk3Xs серия видео, где показан именно тот самый процесс мышления при написании программы.

Будет позитивной практикой, время от времени пересматривать и отмечать что-то новое, трекать свой прогресс. Можно считать видео ориентиром, когда подобный способ понят, понят и сам процесс программирования.

2. https://stepik.org/course/4519 курс в котором учат гуглить, искать на StackOverflow, читать документацию, и юзать библиотеки. Это тот самый подход, про такую — трушную практику. В каком то смысле, здесь учат делать, как в видео выше.

Забавная штука насчет этого курса, пару раз видел реакцию, из разряда — “какой ужас, в нем ищут ответы на StackOverflow”. Это идеально иллюстрирует то самое “непонимание процесса” из начала поста.

Программирование всегда про рациональный подход

Есть еще один важный момент, касаемый странных свойств процесса — программирование всегда про рациональность.

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

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

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

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

Почему научиться программировать так чертовски тяжело?

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

  • С чего начать обучение программированию?
  • У вас есть курс по Java для новичков, но я слышал, что нужно изучать Python, правда ли это?
  • На других сайтах все просто и понятно, а у вас какие-то компиляции и тесты!
  • Непонятно зачем нужен этот ваш курс по алгоритмам, в реальной жизни все алгоритмы уже реализованы в стандартных библиотеках

Квинси Ларсон был просто “офисным парнем в костюме”. Он решил научиться программировать. Начал спрашивать людей вокруг. Изучил немного Руби, потом быстренько посмотрел на другие языки вроде Scala, Clojure и Go. Он изучил Emacs, а потом Vim, а потом раскладку Dvorak. Он втыкал в Линукс, копался с Лиспом и кодил на Питоне, и жил при этом в командной строке больше полутора лет.

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

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

Ох. Звучит знакомо?

Фаза 1: Медовый месяц

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

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

С другой стороны, движение «Learn to Code” проделало фантастическую работу по удалению барьеров, и показало что кодить на самом деле довольно просто. Инструменты вроде Codecademy, Treehouse и Code School так мягко и за ручку подводят тебя к коду, что можно быть уверенным – я не просто смогу научиться программировать, я смогу стать полноценным разработчиком!

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

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

Проблема в том, что вы находитесь в фазе “медового месяца”. Может казаться, что конец близок, но в реальности вы прошли лишь крохотный отрезок пути. Это только начало…

Рисуем маршрут

Перед тем как перейти к Фазе 2, давайте взглянем взглянем на весь путь.

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

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

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

Мы рассмотрим уникальные испытания, которые ждут нас в следующих трех фазах, но для начала вкратце рассмотрим каждую фазу:

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

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

3. Пустыня отчаяния это долгий и одинокий путь через бездорожье, где каждое новое направление кажется верным, но часто вы просто ходите кругами и голодаете по ресурсам, которые могли бы помочь. Остерегайтесь “миражей мании” как сирен пустыни! Они уведут вас в никуда.

4. Подъем благоговения это та часть, где вы наконец находите путь через пустыню и начинаете понимать как создавать приложения. Ваш код все еще дырявый и хрупкий как карточный домик. Вера в себя растет потому что ваши сайты вроде как работают, вы изучили несколько важных паттернов, ваши друзья считают ваши интерфейсы крутыми, но вам страшно заглянуть под капот, и вы не знаете как делать production-ready код. Как отсюда построить мост к состоянию “готов к реальной работе”?

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

Давайте вернемся к фазе 2…

Фаза 2: Скала смятения

Итак, вы находитесь в фазе 1 – „Медовый месяц“. Вы заполняете пробелы и завершаете задачи, связанные с кодом в то время как ваша уверенность и возможности растут. Это не так уж плохо… К чему суета? Вы поднялись на «Гору иррационального изобилия»…

Будьте осторожны! Вы собираетесь переступить пропасть, которая ломает многих сильных учеников, вытесняя их в лагерь под названием „кодинг — это слишком тяжело“. Точный момент этого скачка происходит тогда, когда вы садитесь за клавиатуру, открываете свой текстовый редактор и пытаетесь в первый раз создать проект с нуля без каких-либо встроенных в браузер редакторов, костылей кода или полезных советов.

Вы можете немного оттянуть этот момент, продолжая следовать учебникам, но никто ещё не достиг неба, не оторвавшись от земли, и настанет момент, когда вы будете творить волшебство в пустом текстовом файле. Вы только что вошли во вторую фазу обучения, где уверенность падает вниз на землю. Добро пожаловать на «Скалу смятения»:

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

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

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

Страшно то, что вы еще даже не дошли до самых «вкусных» вещей. После того, как вы, наконец, устранили достаточное количество багов, чтобы положить конец восьмой казни египетской и фактически уже закончили несколько проектов, настанёт конец второй фазы. Но у вас всё только начинается.

Для тех, кто действительно собрался сделать карьеру в программировании, выживание на «Скале смятения» часто является точкой, после которой они всецело готовы погрузиться в новую жизнь. Но слишком многие остаются позади. И, к сожалению, вы только собираетесь войти в «Пустыню отчаяния».

Два ключевых фактора

Так в чем же на самом деле разница между первой и второй фазой? Почему фаза 2 («Скала смятения») так ужасна по сравнению с фазой 1 («Медовый месяц»)? Понимание этого поможет вам понять, что вашей вины абсолютно нет в том что, ваше путешествие выглядит так, как мы только что описали.

Есть два основных момента во время прохождения каждой фазы: плотность ресурсов и объем знаний. Давайте посмотрим, что это такое, прежде чем изучать, как они выведут вас к фазе 3.

Фактор 1: плотность ресурсов

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

Введите в поисковике «Уроки программирования», и на вас обрушится стена из нужных и полезных инструментов, таких как статьи, видеоролики и учебники. И, честно говоря, это здорово! Никогда раньше не было так много способов, чтобы начать учиться программированию.

К сожалению, на более поздних этапах плотность ресурсов быстро падает. Любой, кто прошёл от стадии новичка до среднего уровня, может подтвердить, что существует БОЛЬШАЯ разница между количеством имеющихся ресурсов в самом начале и тогда, когда вы впервые ищете помощь самостоятельно, без посторонней поддержки.

Эта проблема усугубляется при переходе к третьей фазе, когда количество знаний быстро возрастает, и есть одна причина, по которой мы называем эту фазу „Пустыней отчаяния“. Как только вы пройдете её и начнете точно чувствовать, что именно вам нужно искать, то ресурсы вернутся, и вы сможете использовать в работе большее количество технических средств, таких как блоги и видеоролики. Отчасти это просто умение задать правильные вопросы.

Вот как выглядит плотность ресурсов в каждой фазе (большая концентрация линий указывает на большую плотность ресурсов):

Фактор 2: объем знаний

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

Когда вы только начали обучение, набор вещей, которые вам нужно понимать, ещё достаточно узкий. Каждому человеку, независимо от целей обучение, языка и предпосылок, необходимо изучить, что такое цикл «for», как построить логику условного оператора и познакомиться с основными структурами синтаксиса программирования. А зачастую даже и не приходится сталкиваться с некоторым из вышеприведенных базовых понятий, поэтому объем знаний на этом этапе является очень узким.

Как только вы отходите от основ, вы замечаете быстрое расширение базы знаний, так как начинаете сталкиваться с более сложными вопросами, такими как понимание разновидностей ошибок, или, когда именно использовать код, который вы знаете и как вообще его использовать. А это две разные вещи, потому что нет „правильного“ ответа на точный вопрос… Пока всё очень размыто.

По мере продвижения к третьему этапу объем знаний станет расти. Теперь вы должны понимать, какие инструменты использовать, какие языки изучать, как писать модулярный код, знать основы CS и объектно-ориентированного программирования, обладать грамотным стилем кода и уметь искать ответы на вопросы (хотя бы в нескольких источниках). Каждый заход в Google или на сайт Hacker News погружает вас в огромное множество кроличьих нор и ошеломляет вас такими вещами, которых вы не знаете, но чувствуете, что должны их знать.

Вы не знаете, чего именно вы не знаете.

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

Фаза 3: Пустыня отчаяния

С пониманием ключевых факторов, можно увидеть, что «Скала смятения» является критической точкой. Мучения, вызванные совокупностью быстро растущего объема знаний и упадка плотности ресурсов привели к фазе, которую я называю „Пустыня отчаяния“.

В сущности, это пустыня, где вы знаете, что где-то есть конец, но не знаете, как до него добраться:

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

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

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

Существует НАМНОГО больше вещей, которые предстоит узнать, чем вы, возможно, ожидали. Даже если вы в состоянии заставить работать некоторые приложения, то очень трудно не чувствовать себя слабым звеном в огромной цепочке становления настоящим профессионалом. Трудно измерить ваш прогресс. Как вы узнаете, что вам изучать, если изучаете только необходимые вещи?

Даже если вы двигаетесь в правильном направлении, трудно определить ваш прогресс. Вы будете чувствовать себя совершенно потерянным до того самого момента, когда вы, наконец, сможете создать что-то, что выглядит и действует так, как вы ожидали. Но, вооружившись упорством и хорошим компасом, вы в конечном итоге получите ваши первые несколько „реальных“ запущенных приложений и поймете, что, наконец, начинаете получать опыт.

Безусловно, до этого момента было трудно, но, возможно, вся эта история с веб-программированием и не такая сложная, в конце концов… Everything’s coming up Milhouse!

Фаза 4: Подъем благоговения

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

Это и есть «Подъем благоговения»:

Снаружи всё может выглядеть хорошо, но в глубине души вы знаете, что вы ещё не достигли цели.

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

Это фаза состоит из двух полюсов: вы чувствуете, что одна ваша половина — это пуленепробиваемый разработчик, а вторая — тонкая фанера с дикими глазами новичка, который утонул в своём пути. Чем дальше вы продвигаетесь, тем больше растет терзающее чувство неопределенности, как будто кто-то собирается «разоблачить» вас, как обманщика.

Вы чувствуете, что уже должны стать разработчиком, но дистанция между кодом, который вы пишете и «профессиональной» рабочей средой не сокращается…

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

«Подъем благоговения» всегда занимает больше времени, чем вы ожидаете, и кажется бесконечным, потому что вы так близко… Но вы всё же достигнете его. Если вы настойчиво идёте в правильном направлении (тема следующего поста), то сможете убедить кого-то платить вам и спокойно продолжать учиться дальше. Работа ваша.

На что всё это похоже

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

Одно дело — знать путь, а другое дело — идти по нему. Давайте поможем вам начать.

Как дойти до конца живым

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

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

I: Как Выжить в «Медовом месяце»

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

  1. Начните пробовать разные ресурсы, чтобы найти те, которые лучше вам помогают в обучении, ищите наиболее интересные для вас проекты. Это могут быть быстрые решения от KhanAcademy, упражнения в браузере от Codecademy, книга Learn to Program Криса Пайна или школа кода Try Ruby. В начале будьте открытыми для всего и игнорируйте наставления в стиле «вы должны учить только это». На данном этапе весь код одинаковый.
  2. Далее выберите один подходящий для вас ресурс и старайтесь придерживаться только его. Пройдите курс от начала до конца, чтобы получить все основные знания, которые вам помогут написать базовые скрипты и приложения. А в дальнейшем приготовьтесь начать создавать свои собственные проекты.
II: Выживание на «Скале смятения»

Почти каждый из вас пройдёт через «Скалу смятения», поскольку единственный способ стать разработчиком — это разрабатывать. Вы можете претендовать на эту профессию, подписавшись на статьи (или на туториалы, которые выдают за «полные» курсы), но этим вы будете только откладывать неизбежное. Учебники — это хороший способ решить начальные задачи, но в некоторой момент вы должны будете отучить себя от соски и столкнуться с реальным миром.

Вот три совета, которые помогут самостоятельно перейти к компилированию:

  1. Работайте с кем-то в паре, даже если он такой же новичок как и вы. Вы будете удивлены, насколько легче отладить кажущуюся неисправимой ошибку, если подключить ещё две пары глаз.
  2. Читайте больше чужого кода, чтобы познакомиться с хорошими паттернами. Постарайтесь понять, почему автор сделал именно так, а не иначе. Вы ведь не сможете стать писателем, не читая чужих книг, не правда ли? Мы подробно рассмотрим это в следующем посте, а сейчас, заострите своё внимание на мелких проектах и задачах, для которых другие люди уже написали решения.
  3. Начните с малого и программируйте постоянно. Вы должны думать о будущих крупных и интересных проектах, но для этого ваша отладка должна стать гладкой, а поиск ресурсов не должен составлять труда. Опыт вы ничем не замените.
III: Выживание в «Пустыне отчаяния»

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

Итак, вот ключи к выходу из «Пустыни отчаяния»:

  1. Поставьте перед собой определенную цель, которую вы хотите достичь, потому что в противном случае вы закончите тем, что устанете гоняться за своим хвостом, изучая различные виды интересных, но по большому счёту ненужных вещей. Но если у вас есть свободное время, то можете опустить этот совет…
  2. Найдите верный путь, который ведет прямо к поставленной цели и убедитесь, что он действительно направляет вас к ней. Вам нужно копать глубже и не искать ответ среди рекламных лозунгов, суперобложек и улыбающиеся лиц на веб-сайтах различных курсов на вопрос „поможет ли мне это достичь поставленной цели или нет?“
  3. Сконцентрируйте всё своё внимание и не отвлекайтесь, потому что, если вы относитесь к тем людям, которым интересно изучать код, вы также заинтересуетесь изучением других интересных вещей. В те моменты, когда программирование даётся тяжело, вы должны особенно сильно продвигаться вперед, а не браться осваивать другие модные занятия.

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

IV: Выживание на «Высоком подъеме»

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

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

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

Итак… Возможно ли это вообще?

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

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

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

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

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