В этой статье я расскажу, как за девять месяцев проделал путь от практически нулевого опыта в разработке ПО до должности программиста с шестизначной зарплатой, при этом работая полный день и обучаясь собственными силами.
Всякий раз как мне попадается чья-нибудь история успеха, я первым же делом с надеждой смотрю на биографию автора — вдруг его история совпадет с моей. Пока что мне не попадался еще ни один человек, у которого все сложилось бы именно так, как у меня; скорее всего, и вы найдете некоторые отличия между моим опытом и вашим собственным. Тем не менее, я надеюсь, что это рассказ послужит вдохновением и источником ценных сведений, которые вы могли бы добавить себе в базу.
В старшей школе я прошел курс по Visual Basic для приложений (это было девять лет назад). На первом курсе университета, где учился на инженера, немного ознакомился с C, Python, Matlab и Labview (это было семь лет назад). Я получил диплом солидного университета по специальности «химическая технология» с хорошим средним баллом (это было три года назад). Помимо перечисленных занятий, я больше не практиковался в программировании, ни в школьные годы, ни в университете, пока наконец не решил в прошлом году, что хочу его освоить. После выпуска я устроился инженером процесса на нефтеперерабатывающий завод и работал там до тех пор, пока не ушел в разработчики.
Мне нравилось решать технические задачи, но при этом я осознавал, что хочу рано или поздно перейти в сферу бизнеса и стартапов. У меня мелькали мысли о том, чтобы получить MBA, но стоило только взглянуть на расценки лучших университетов, как интерес сразу угасал.
27 мая 2017 года я в очередной раз гуглил программы MBA и каким-то образом вышел на разработку ПО. Мне показалось, что это идеальный вариант. Спрос на разработчиков неуклонно растет, зарплаты достойные, к тому же эта сфера отлично подходит для того, чтобы пробиться в мир стартапов без огромного стартового капитала. Нужен только компьютер, и перед вами откроются безграничные возможности (ну, или почти безграничные).
В других технических отраслях нельзя просто придумать какую-то идею, сразу приступить к реализации, показать результат пользователям и итерировать с минимумом вложений и низким порогом вхождения. В сфере химической технологии, например, если придумаете новый продукт, вам, по сути, нужен будет либо рабочий завод, либо деньги на то, чтобы его спроектировать.
Я слышал, что некоторые бросают работу и записываются в буткемпы. Но чем больше я изучал материалы онлайн, тем яснее понимал, что все это вполне реально освоить самому при должной степени мотивации и сосредоточенности. Вы можете возразить, что такой расклад лишает возможностей по нетворкингу и помощи в поиске работы, которые предоставляют буткемпы. В этом есть доля правды, но мне повезло в том отношении, что я живу в области залива Сан-Франциско: это позволило мне посетить несколько митапов и наладить профессиональные связи там.
К тому же даже при самом худшем повороте событий я просто понял бы, что не справляюсь самостоятельно, уволился бы и пошел в буткемп.
Ставить цели необходимо, особенно если вы пытаетесь совмещать обучение с полным рабочим днем. Когда нет никакого давления извне, слишком просто допустить, чтобы процесс самообразования растянулся до бесконечности. Поэтому нужно создавать давление изнутри. Цель должна быть простой и связанной с количественными показателями. Тщательно изучите сферу, чтобы поставить перед собой разумную, достижимую цель. Я сформулировал свою так:
Теперь, когда цель поставлена, нужен план, который поможет ее достичь. Вот на этом этапе стоит читать истории успеха запоем. Они, конечно, не будут стопроцентно соответствовать вашей ситуации, но все-таки из каждой можно почерпнуть что-то полезное. Я выстроил (и итерировал) свой план с опорой на такие источники, как сабреддит learnprogramming, форум freeCodeCamp и Medium.
27 мая 2017 года я решился сделать рывок в сферу IT и бросился в нее вперед головой. В тот же день я принял решение, что буду проводить на основной работе не более 40 часов в неделю, чтобы оставалось время на написание кода по вечерам и в выходные. Хорошие новости: я довольно подробно задокументировал весь процесс.
После бесконечных переработок финальная версия моего плана приняла примерно такой вид:
Начинался мой план с простого. В тот момент я решил следовать руководству для разработчиков от Google и начал с курса, который там рекомендовали в качестве вводного — CS101 от Udacity.
От приятного чувства, что серьезное решение принято, меня накрыл прилив энергии. Едва добравшись до дома с работы, я сразу же начинал писать код и не останавливался, пока не приходило время ложиться спать. И на выходных занимался тем же. CS101 от Udacity отслеживает процент выполненных заданий, и это послужило для меня отличным источником мотивации. Каждый день, закончив занятия, я записывал текущий процент. Первые 75% курса я прошел за какие-то десять дней. Оставшиеся 25% в большей степени касались рекурсии и дались мне сложнее. В общем и целом, мне понадобилось двадцать дней, чтобы завершить курс CS101 от Udacity.
В процессе прохождения курса я также начал очень увлеченно читать сабреддит learnprogramming. Там писали, что разработчикам-самоучкам, которые хотят поменять профессию, необходимо проявлять активность онлайн. Я решил создать новые аккаунты на Twitter, Reddit, Stack Overflow, Medium и Quora под своим полным именем, чтобы засветиться в Интернет-среде.
Кроме того, я решил завязать с ресурсами вроде Instagram, Facebook и Reddit (за исключением сабреддитов по программированию), которые отвлекали меня от занятий. Я стал просматривать на телефоне только те новости и посты, которые имели отношение к разработке. Это было критически важно, чтобы узнавать лучшие методики и площадки для обучения. Именно таким образом я вышел на Гарвардский курс CS50 на edX.
Изначально меня устраивала перспектива пройти только один вводный курс, однако все наперебой советовали Гарвардский курс CS50, и я решил, что возьму его следующим. Студенты, обучавшиеся информатике в других университетах, говорили, что один этот курс дал им больше знаний, чем пара лет университетских занятий. К концу нулевого месяца я осилил пять первых лекций и домашних заданий.
Гарвардский курс CS50 я закончил где-то к середине месяца. Не буду сейчас на этом останавливаться, потому что уже посвятил этому своему опыту отдельный подробный пост.
Если вкратце: это отличный курс, очень его рекомендую. David Malan — прекрасный лектор, к тому же доступна целая куча ресурсов, которые помогут с освоением материала. Начинается все с С, потом вы переходите к Python, а в завершение рассматриваете веб-разработку. Программа очень насыщенная, материала придется пройти много, но, мне кажется, оно того стоит.
Завершив CS50, я решил установить на своем ноутбуке XPS 15 Ubuntu рядом с Windows. Выходные, когда я этим занимался, были не из приятных. Я запорол разметку и чуть не убил свой ноут. С трудом удержался, чтобы просто его не выбросить и не купить новый.
Мало-помалу я стал слезать с Windows и в конце концов полностью перешел на Ubuntu. Я хотел пусть хоть силой, но добиться того, чтобы мне стало комфортно работать с командной строкой. На мой взгляд, в какой-то мере это помогло, но мне все еще куда расти.
Я присоединился к челленджу «100 дней кода», чтобы писать код ежедневно и не позволять вниманию рассеиваться. Важно фиксировать свои достижения. Если вы записываете результаты каждый день, то может показаться, что ничего особенно и не сделано, но позже, просматривая записи за месяц или несколько месяцев, вы увидите, что достигли неплохого прогресса, и это послужит вам мотивацией продолжать.
Я знал, что от нетворкинга будет зависеть все, поэтому набрался храбрости и отправился на свой первый митап для разработчиков. Я вообще до этого на митапах не бывал, не то что на программистских. Нервы у меня разыгрались так, что когда приехал, припарковался и подошел к дверям, уже совсем был готов развернуться и уйти домой.
К счастью для меня, группа встречалась в тот день впервые. Я быстро понял, что волноваться не из-за чего. Другие участники тоже друг друга не знали, никто никого не осуждал и все были рады возможности узнать что-то новое. Этот митап стал для меня началом целой серии. В итоге, за девять месяцев я посетил более пятидесяти митапов.
Я рад, что рано начал посещать митапы. Большинство людей принимается за это уже тогда, когда приступает к поиску работы, а на этом этапе уже почти что слишком поздно. Есть много причин начинать пораньше. Вот несколько из них:
На этой стадии моего пути программиста все выглядело довольно туманно. Мне нужно было определиться, что именно я хочу разрабатывать.
В конечном итоге, я выбрал веб-разработку, так как на нее, судя по всему, был хороший спрос, а в Сети попадалось много ресурсов. Исходя из этого решения, нужно было продумать следующий шаг. Некоторые знакомые считали, что на данном этапе мне стоит определиться, какие веб-приложения я хочу сделать, и браться за работу. Другие советовали присоединиться к The Odin Project или freeCodeCamp.
Организатор еженедельных митапов, которые я посещал, знал Ruby и хотел писать проекты на нем. Во многом именно по этой причине я принял решение удариться в The Odin Project.
Два дня спустя я отказался от этой затеи.
Это один из недостатков самообучения. Сейчас вам может казаться, что вы точно знаете, в каком направлении двигаться, а на следующий день вы уже засомневаетесь, правильно ли действуете.
Я где-то прочитал, что популярность Ruby падает, и сравнение количества вакансий по Ruby и JavaScript подтвердило эту информацию. И поэтому в итоге я стал работать с freeCodeCamp. Единственное, что меня смущало в этом ресурсе — тот факт, что они предлагают свои идеи проектов, так что все участники делают одно и то же. Меня это беспокоило: мне хотелось бы чем-то зацепить взгляд работодателей. Тем не менее, мне очень понравилось на freeCodeCamp и я могу смело его рекомендовать. Если хотите узнать больше о моем опыте с этой площадкой и получить несколько советов, почитайте мой пост на эту тему.
Я взялся за серию книг «You Don’t Know JavaScript», потому что ее советуют как дополнение к курсу freeCodeCamp. Некоторые секции приходилось читать на два раза (текст весьма информационно плотный), но это отличный источник, чтобы разобраться с областями видимости, замыканиями, обещаниями и всеми другими понятиями из JavaScript, о которых вы постоянно слышите и которые хотите изучить, но не решаетесь, потому что они кажутся очень уж сложными.
Я проработал всю фронтенд-секцию freeCodeCamp. Формат списка и отображение примерного расхода времени на оставшиеся задания мотивировали меня закончить как можно быстрее. Вдобавок у меня чесались руки поскорее перейти к следующей секции и освоить React. Однако это привело к тому, что стилистика у меня проектов была минимальная. Я делал только то, чего требовали пользовательские истории, и больше ни на что не отвлекался. Оглядываясь назад, мне, возможно, стоило больше внимания уделять внешней привлекательности продуктов. Не исключено, что это помогло бы мне глубже освоить CSS.
Далее мне предстояло взяться за React, и я был полон энтузиазма.
Я очень много о нем слышал, и мне не терпелось присоединиться к компании крутых ребят. Вместе с тем, я немного колебался из-за проблем с лицензией, которые как раз возникли в тот момент. Очень рад, что сейчас они уже разрешились. Изучение React оказалось непростым делом. Тогда я еще не знал, где можно почитать хорошие туториалы (зато теперь они встречаются на каждом шагу).
Я попробовал читать документацию и идти по туториалу Tic-Tac-Toe от Facebook, но мне в них не все было понятно. Мне сказали, что если я не могу разобраться в этом материале, значит еще недостаточно хорошо знаю JavaScript. Поэтому я вернулся к книгам You Don’t Know JavaScript, но и они оказались для меня неподъемными.
В конце концов, я решил, что просто начну работать над проектами на React и посмотрю, как пойдут дела. Мой код выглядел отвратительно, но зато это помогло мне немного разобраться в языке.
Та самая группа, на встречи которой я ходил каждую неделю, решила, что будет писать проекты целиком на JavaScript, а не на Ruby, и в качестве первого проекта выбрала создание вебсайта группы — CodeClub.Social.
Используя React и API митапа, я сделал особые карточки, с помощью которых пользователь мог записаться на следующие три встречи прямо на сайте. Я с неохотой прервал курс на freeCodeCamp ради этой задачи, но такую возможность нельзя было упустить. Работать над проектом в составе небольшой группы оказалось очень здорово. К тому же, это позволило мне освоить Git и GitHub.
К концу месяца я перешел к бэкенд-секции курса freeCodeCamp.
Я выполнил все задания, связанные с API, на freeCodeCamp, но после того как дошел до проекта Image Search Abstraction Layer, начал отклоняться от программы.
Мне не терпелось скорее самому создать веб-приложение полного цикла, поэтому при первом же взгляде на название этого проекта у меня зародилась идея собственного продукта. Я решил, что сделаю приложение на node, которое будет сохранять рандомные адреса картинок с imgur в базе данных, а потом надстрою фронтенд, который будет выдавать заданное пользователем число рандомных картинок из этой базы. Люди не зря говорят, что над собственной идеей работаешь усерднее и успешнее — это чистая правда.
Я очень собой гордился, когда наконец добился того, чтобы все заработало. Система была громоздкой и не слишком красивой, но зато делала то, что от нее требовалось.
Продолжая работать над заданиями с freeCodeCamp, я параллельно прикидывал, какие проекты будут мне по силам. В то время я регулярно делал пробежки и обычно придумывал идеи как раз в это время, а вернувшись домой, записывал их. Таким образом, к тому моменту как я был готов приступить, у меня уже накопился список возможных проектов.
Наконец я ощутил, что готов начать работу над собственным высококачественным веб-приложением полного цикла, которое смогу представить пользователям и добавить в свое портфолио. Я был прямо-таки в полной боевой готовности.
Всякий раз, как мне захочется сходить в какое-нибудь новое кафе, я сначала открываю Yelp, чтобы почитать отзывы, а потом перехожу на Google Maps и смотрю, что пишут там. А что если сделать приложение, которое будет выводить оба набора отзывов на экран для сравнения?
Так появился Yeggle. При его написании я использовал Node, Express и React, а также API Yelp и Google Maps. Пару раз я сталкивался со сложностями, которые, казалось, никак не разрешить, но все-таки довел дело до конца и был очень горд своей работой. Я разместил приложение на Reddit, однако никакого интереса оно не вызвало. Было обидно, но я постарался не принимать это близко к сердцу.
Это месяц у меня получился не таким продуктивным, потому что первую его половину я провел на отдыхе в Японии и Таиланде!
Тем не менее, я начал и довел до завершения свой следующий проект. Мне часто попадались рассказы о том, как тяжело разработчику-самоучке устроиться на работу, поэтому я решил, что нужно придумать что-то эдакое. Мне вспомнилась игра, где промышленный индекс Доу — Джонса был на подъеме и у игрока была возможность совершить одну покупку и одну продажу так, чтобы получить при этом прибыль. Цель этой игры заключалась в том, чтобы донести до пользователя, как это сложно — переиграть рынок.
У меня возникла мысль создать подобную же игру, только сражаться там нужно будет не с рынком, а с алгоритмом машинного обучения. И я сделал StockIT.
Я посмотрел видеотуториал по Pandas и Scikit Learn, где описывалось несколько разных технологий машинного обучения. Сначала я хотел включить что-нибудь навороченное из deep learning, но понял, что для этого понадобится огромная база данных и значительные временные затраты, на которые я не готов.
Вместо этого я ограничился моделью линейной регрессии. Я думал, что эта часть будет самой сложной, но вышло по-другому. Сложнее всего оказалось примирить D3 с React. Обе библиотеки стремились захватить контроль над DOM. Есть некоторые другие библиотеки, которые могли бы помочь с их объединением, но они показались мне слишком тяжеловесными. В конечном счете, я использовал D3 для генерации SVG, а React — для работы с DOM, и получилось вроде бы неплохо.
На этот раз, когда я выложил проект на Reddit, он всем понравился! Оказывается, тамошняя публика, прямо как инвесторы, очень неравнодушна к машинному обучению. Положительный отклик от Reddit помог мне поверить в свои силы. Люди играли в мою игру и получали от нее удовольствие!
Покончив со StockIT, я сразу же перескочил на следующий проект. Мне хотелось сделать доску вакансий, которая объединяла бы в себе небольшие списки вакансий с отдельных вебсайтов IT направленности — Stack Overflow, Github и Hacker News. Чтобы добавить какую-то изюминку, я решил настроить сортировку по технологиям, с которыми пользователь хотел бы работать, и возможность отмечать их как более или менее приоритетные.
Например, давайте представим себе, что я ищу работу в компании, где нужен специалист по JavaScript, React и/или Python, и при этом очень хочу работать с JavaScript и React, а вот к Python не питаю сильных чувств. Тогда я задаю приоритет 3 у JavaScript и React, ну а Python ставлю единичку. Вакансии будут отсортированы соответствующим образом.
С этим проектом у меня возникало много сложностей, пару раз пришлось менять курс действий, но итоговым результатом я остался доволен. В своем конечном виде стек технологий включал React, Node, Express и MySQL. Я запостил приложение в сабреддит cscareerquestions, и он успел собрать 650 просмотров, пока его не удалили — делиться личными проектами там не разрешается.
«Финальная» версия продукта лежит здесь, а если вам интересно почитать про мои мучения и рефакторинг, отсылаю вас к этому посту.
Из-за всех этих проблем работа над jobSort() заняла большую часть месяца. Я встретился за чашкой кофе с другом, с которым познакомился на первом митапе, и он посоветовал уже начинать рассылать резюме. Я перечитал кучу историй, в которых разработчики признавались, что слишком долго с этим тянули. Да и на Reddit сколько мне ни попадалось постов с вопросом «Когда лучше рассылать резюме?», больше всего голосов всегда набирал ответ «Прямо сейчас».
Я себе все это представлял так: я буду продвигаться согласно плану, составлю солидное портфолио с личными проектами, затем поработаю над вкладами в проекты с открытым кодом, после этого уже подготовлюсь к собеседованиям, ну и наконец начну рассылать резюме. Но друг убедил меня оставить этот план и сразу приступить к поиску работы. Поэтому к концу месяца я составил портфолио и резюме. Рассылка была намечена на следующий месяц.
Этот месяц я отвел под доработку проектов и поиск работы. Также мне хотелось освоить тестирование и Redux.
Я добавил на CodeClub.Social flexbox, чтобы сделать его более интерактивным. Усовершенствовал UX в мобильной версии jobSort(). Добавил в jobSort() тестирование при помощи mocha/chai/enzyme — настроить это было сложно, запустить легко, а добиться стопроцентного покрытия — опять сложно.
К концу месяца я откликнулся на 63 вакансии. Я рассматривал это как возможность оценить себя. Произведут ли мои портфолио и резюме должное впечатление? Если да, то над чем нужно поработать, прежде чем идти на собеседование? Сначала я выбирал вакансии из раздела Who is Hiring на Hacker News и с сайта Indeed. Вакансии с Hacker News я прогнал через jobSort(), чтобы определить, на какие стоит обратить внимание. На Indeed я попробовал пробиться в компании, не работающие с ПО, просто чтобы посмотреть, удастся ли мне получить ответный звонок или приглашение на собеседование хоть где-нибудь.
Сперва я проводил рассылку по-быстрому, не пытаясь как-то персонализировать резюме и сопроводительное письмо. Позже я решил все-таки их персонализировать и пытаться напрямую связаться с кем-нибудь из сотрудников компании. Этот метод работал явно лучше, чем изначальный подход «с мороза».
За весь месяц мне перезвонили пять раз: два раза — рекрутеры, три раза — компании, специализирующиеся на разработке ПО, в частности:
В двух из них я успешно прошел телефонное интервью с кадровиками, но до этапа собеседования в офисе не дошел нигде. Я был доволен уже и тем, что мне трижды перезвонили, этот опыт многому меня научил.
В Сети все говорили, что от джуниоров никто не ждет глубоких познаний с самого начала, достаточно, чтобы у них был энтузиазм и желание учиться. «Раз плюнуть», — подумал я. У меня же столько энтузиазма и желания учиться. Однако после этих звонков мне стало ясно, что джуниоры никому не нужны. Работодатели рассчитывают на то, что кандидат с первого дня будет знать, что делает.
Эти интервью показали мне, что я должен:
Начался этот месяц с того, что на основной работе меня на сорок дней перевели в ночную смену — шесть двенадцатичасовых рабочих дней в неделю, с пяти вечера до пяти утра. Вот блин.
Я понимал, что не смогу много сделать с таким режимом, но передо мной стояла цель, и я хотел ее достигнуть, так что просто сделать месячный перерыв было нельзя.
Я провел рефакторинг кода jobSort(), чтобы внедрить Redux — к моему удивлению, это оказалось вовсе не так сложно, как я думал. Я прослушал много подкастов и прочитал много постов на эту тему, но пока я не взялся за дело сам, все как-то не укладывалось в голове.
Мне очень нравится, как Redux упорядочивает данные. Интересно сейчас читать мнения людей, которые им недовольны. У меня, конечно, еще маловато квалификации, чтобы высказываться категорично, но мне очень по душе паттерн их редюсера.
По плану, этот месяц я должен был посвятить работе с открытым кодом. Я рассчитывал сделать свой первый вклад в проект с открытым кодом, причем вклад предполагался гениальный и в первоклассную библиотеку. Я метил в сам React!
Все твердили, что их код и читать-то сложно, не то что дополнять. Но мне надо было выделиться, показать свою уникальность. Я знал, что ничего серьезного привнести не смогу, но все-таки хотел приложить руку.
Для начала я прочитал всю документацию от и до, а затем стал корпеть над кодовой базой. Пересмотрел все issues и pull requests. Доскональное изучение документации к React принесло мне много пользы, я доволен, что это сделал. Но я быстро осознал, что главная проблема со вкладами в код React состоит в том, что там не так много подходящих заданий «для новичков», и их разбирают на лету.
На одном из митапов, которые я посещал, Anthony Ng посоветовал мне обратить внимание на Downshift, библиотеку для автозаполнения авторства Kent C. Dodds. Этот совет стал для меня поворотным моментом. Это было именно то, что мне нужно. Подходящий уровень сложности, достаточно проблем, с которыми требовалась помощь, не слишком много желающих поучаствовать, всегда готовый помочь мейнтейнер и аккуратный, хорошо протестированный код. Вдобавок ко всему, там я нашел решения для многих затруднений, с которыми не мог справиться в ходе работы над jobSort().
Где-то в середине месяца мне пришло письмо от одной из компаний, которой я отправил резюме еще в предыдущем. Они предлагали мне пройти телефонное интервью, а потом — техническое собеседование, тоже по телефону. Технологии, которые их интересовали, совпадали с тем набором, который я освоил — React, Redux и D3. По большей части, я просто рассказывал о своих проектах и объяснял, почему принял то или иное решение. После этого они пригласили меня пообщаться вживую. Мое первое собеседование в офисе!
Я вообще никак не успел подготовиться, поэтому пришел с убеждением, что работу я не получу, но зато получу ценный опыт прохождения собеседования. Ко всему прочему, в тот день я спал три часа — ночная смена никуда не делась, и это было очень некстати. К счастью, в ходе технической части мне пришлось писать на доске — все ограничилось часовой сессией программирования. Задания были в общем-то стандартными, но я все равно очень нервничал.
Сначала я из кожи вон лез, чтобы показать, что все знаю и мне не нужно никуда подглядывать. Потом, когда стало ясно, что мне не хватает времени выполнить задание, я понял: надо махнуть рукой на то, какое впечатление произвожу, и просто поискать ответы в Google или на Stack Overflow. В итоге, я так и не успел до конца справиться с заданием и из этого заключил, что с треском провалился.
Смирившись с тем, что секция по программированию завалена, я провел остаток собеседования в расслабленном состоянии. В конечном счете, я ушел из офиса с гордо поднятой головой. При наихудшем раскладе событий я извлеку из этого опыта много полезного, при наилучшем — мне предложат работу.
Я получил свое первое предложение о работе спустя ровно 9 месяцев и 7 дней после того момента, как решил, что хочу окунуться в мир программирования с прицелом на смену профессии. То, что меня готовы взять после первого же личного собеседования, внушало уверенность, но с другой стороны — что если я откажусь, а других приглашений в ближайшие несколько месяцев не будет? В итоге, я принял предложение и остался очень доволен своим решением. Мне ведь хотелось писать код за деньги!
До сих пор я в основном просто рассказывал свою историю, местами вставляя рекомендации. Если вы это читаете, значит, скорее всего, либо подумываете поменять работу, либо изучаете программирование с намерением уйти в эту сферу. Я надеюсь, что приведенные ниже советы помогут вам выработать план или придерживаться того, который вы уже для себя составили, и достигнуть цели.
1. Найдите способы себя мотивировать и пользуйтесь ими. В моем случае помогали списки, документирование прогресса и общение в IT сообществах. Если у вас нет мотивации идти к цели, все остальное теряет смысл — вы просто не доведете дело до конца.
2. Ставьте перед собой цели и достигайте их. Я бы даже рискнул утверждать, что цели должны ставиться каждый месяц, если не каждый день. Ежемесячные цели помогают не отклоняться от заданного курса и двигаться к главной цели, а ежедневные нужны, чтобы заставить себя непрерывно добиваться какого-то прогресса. Для меня работала такая стратегия: я составлял планы на следующий день по вечерам. Так я избегал ситуаций, когда весь день занимаешься непродуктивной работой с ложным чувством, будто делаешь что-то полезное. Это заставляло сравнивать то, что выполнил за день, с тем, что было запланировано.
3. Посещайте митапы, не дожидаясь, пока будете готовы. Как я упоминал выше, пойти на встречу с другими разработчиками бывает страшновато. Но в целом, все, как правило, настроены дружелюбно и рады помочь. Возможно, вам встретятся люди, которые не захотят с вами общаться, но таких меньшинство, и никто не станет смотреть на вас сверху вниз. А уж давать советы любят вообще все (вот как я здесь, например).
4. Делайте вклады в открытый код, не дожидаясь, пока будете готовы. Когда только начинаешь изучать программирование, GitHub кажется страшным местом, куда в жизни не сунешься. На самом деле, там очень доброжелательно относятся к новичкам, и вообще это отличная площадка, чтобы почитать хороший код и получить фидбэк по своей работе. Если у вас еще остались сомнения, могу посоветовать свою статью «Почему вам стоит немедленно сделать вклад в открытый код».
5. Начинайте рассылать резюме задолго до того, как будете готовы. Это я усвоил с трудом: мне казалось, что у меня особая ситуация. Я думал, что мне необязательно прощупывать рынок, чтобы понять, какие слабые места нужно подтянуть. Я думал, что сам почувствую, когда буду готов приступить к поиску работы. Ну так вот, сейчас могу вам сказать: никакого озарения, что вот теперь пора, у вас не случится, так что можно с тем же успехом начинать прямо сейчас. Только не сходите с ума и не откликайтесь на 300 вакансий, прежде чем освоите оператор цикла. Просто имейте в виду, что лучший способ понять, каких знаний вам не хватает — предлагать свою кандидатуру и пробовать свои силы на рынке.
Ну а теперь возвращаемся к написанию кода!
Всякий раз как мне попадается чья-нибудь история успеха, я первым же делом с надеждой смотрю на биографию автора — вдруг его история совпадет с моей. Пока что мне не попадался еще ни один человек, у которого все сложилось бы именно так, как у меня; скорее всего, и вы найдете некоторые отличия между моим опытом и вашим собственным. Тем не менее, я надеюсь, что это рассказ послужит вдохновением и источником ценных сведений, которые вы могли бы добавить себе в базу.
Полный отчет
В старшей школе я прошел курс по Visual Basic для приложений (это было девять лет назад). На первом курсе университета, где учился на инженера, немного ознакомился с C, Python, Matlab и Labview (это было семь лет назад). Я получил диплом солидного университета по специальности «химическая технология» с хорошим средним баллом (это было три года назад). Помимо перечисленных занятий, я больше не практиковался в программировании, ни в школьные годы, ни в университете, пока наконец не решил в прошлом году, что хочу его освоить. После выпуска я устроился инженером процесса на нефтеперерабатывающий завод и работал там до тех пор, пока не ушел в разработчики.
Почему я решил сменить работу
Мне нравилось решать технические задачи, но при этом я осознавал, что хочу рано или поздно перейти в сферу бизнеса и стартапов. У меня мелькали мысли о том, чтобы получить MBA, но стоило только взглянуть на расценки лучших университетов, как интерес сразу угасал.
27 мая 2017 года я в очередной раз гуглил программы MBA и каким-то образом вышел на разработку ПО. Мне показалось, что это идеальный вариант. Спрос на разработчиков неуклонно растет, зарплаты достойные, к тому же эта сфера отлично подходит для того, чтобы пробиться в мир стартапов без огромного стартового капитала. Нужен только компьютер, и перед вами откроются безграничные возможности (ну, или почти безграничные).
В других технических отраслях нельзя просто придумать какую-то идею, сразу приступить к реализации, показать результат пользователям и итерировать с минимумом вложений и низким порогом вхождения. В сфере химической технологии, например, если придумаете новый продукт, вам, по сути, нужен будет либо рабочий завод, либо деньги на то, чтобы его спроектировать.
Я слышал, что некоторые бросают работу и записываются в буткемпы. Но чем больше я изучал материалы онлайн, тем яснее понимал, что все это вполне реально освоить самому при должной степени мотивации и сосредоточенности. Вы можете возразить, что такой расклад лишает возможностей по нетворкингу и помощи в поиске работы, которые предоставляют буткемпы. В этом есть доля правды, но мне повезло в том отношении, что я живу в области залива Сан-Франциско: это позволило мне посетить несколько митапов и наладить профессиональные связи там.
К тому же даже при самом худшем повороте событий я просто понял бы, что не справляюсь самостоятельно, уволился бы и пошел в буткемп.
Цель
Ставить цели необходимо, особенно если вы пытаетесь совмещать обучение с полным рабочим днем. Когда нет никакого давления извне, слишком просто допустить, чтобы процесс самообразования растянулся до бесконечности. Поэтому нужно создавать давление изнутри. Цель должна быть простой и связанной с количественными показателями. Тщательно изучите сферу, чтобы поставить перед собой разумную, достижимую цель. Я сформулировал свою так:
В течение года устроиться на должность разработчика с зарплатой не ниже той, которую я получаю сейчас.
План
Теперь, когда цель поставлена, нужен план, который поможет ее достичь. Вот на этом этапе стоит читать истории успеха запоем. Они, конечно, не будут стопроцентно соответствовать вашей ситуации, но все-таки из каждой можно почерпнуть что-то полезное. Я выстроил (и итерировал) свой план с опорой на такие источники, как сабреддит learnprogramming, форум freeCodeCamp и Medium.
27 мая 2017 года я решился сделать рывок в сферу IT и бросился в нее вперед головой. В тот же день я принял решение, что буду проводить на основной работе не более 40 часов в неделю, чтобы оставалось время на написание кода по вечерам и в выходные. Хорошие новости: я довольно подробно задокументировал весь процесс.
После бесконечных переработок финальная версия моего плана приняла примерно такой вид:
- Пройти курс Intro to CS (Введение в информатику), чтобы как следует разобраться в базовых понятиях.
- Работать с материалами freeCodeCamp, пока не буду в состоянии самостоятельно создавать веб-приложения полного цикла для портфолио.
- Провести рефакторинг, чтобы сделать код опрятнее, добавить тестирование, уделить внимание более сложным концептам.
- Сделать вклад в проекты с открытым кодом.
- Подготовиться к собеседованиям.
Начинался мой план с простого. В тот момент я решил следовать руководству для разработчиков от Google и начал с курса, который там рекомендовали в качестве вводного — CS101 от Udacity.
Месяц №0 — CS101 от Udacity, Гарвардский курс CS50
От приятного чувства, что серьезное решение принято, меня накрыл прилив энергии. Едва добравшись до дома с работы, я сразу же начинал писать код и не останавливался, пока не приходило время ложиться спать. И на выходных занимался тем же. CS101 от Udacity отслеживает процент выполненных заданий, и это послужило для меня отличным источником мотивации. Каждый день, закончив занятия, я записывал текущий процент. Первые 75% курса я прошел за какие-то десять дней. Оставшиеся 25% в большей степени касались рекурсии и дались мне сложнее. В общем и целом, мне понадобилось двадцать дней, чтобы завершить курс CS101 от Udacity.
В процессе прохождения курса я также начал очень увлеченно читать сабреддит learnprogramming. Там писали, что разработчикам-самоучкам, которые хотят поменять профессию, необходимо проявлять активность онлайн. Я решил создать новые аккаунты на Twitter, Reddit, Stack Overflow, Medium и Quora под своим полным именем, чтобы засветиться в Интернет-среде.
Кроме того, я решил завязать с ресурсами вроде Instagram, Facebook и Reddit (за исключением сабреддитов по программированию), которые отвлекали меня от занятий. Я стал просматривать на телефоне только те новости и посты, которые имели отношение к разработке. Это было критически важно, чтобы узнавать лучшие методики и площадки для обучения. Именно таким образом я вышел на Гарвардский курс CS50 на edX.
Изначально меня устраивала перспектива пройти только один вводный курс, однако все наперебой советовали Гарвардский курс CS50, и я решил, что возьму его следующим. Студенты, обучавшиеся информатике в других университетах, говорили, что один этот курс дал им больше знаний, чем пара лет университетских занятий. К концу нулевого месяца я осилил пять первых лекций и домашних заданий.
Месяц №1 — Гарвардский курс CS50, Linux, первый митап, freeCodeCamp
Гарвардский курс CS50 я закончил где-то к середине месяца. Не буду сейчас на этом останавливаться, потому что уже посвятил этому своему опыту отдельный подробный пост.
Если вкратце: это отличный курс, очень его рекомендую. David Malan — прекрасный лектор, к тому же доступна целая куча ресурсов, которые помогут с освоением материала. Начинается все с С, потом вы переходите к Python, а в завершение рассматриваете веб-разработку. Программа очень насыщенная, материала придется пройти много, но, мне кажется, оно того стоит.
Завершив CS50, я решил установить на своем ноутбуке XPS 15 Ubuntu рядом с Windows. Выходные, когда я этим занимался, были не из приятных. Я запорол разметку и чуть не убил свой ноут. С трудом удержался, чтобы просто его не выбросить и не купить новый.
Мало-помалу я стал слезать с Windows и в конце концов полностью перешел на Ubuntu. Я хотел пусть хоть силой, но добиться того, чтобы мне стало комфортно работать с командной строкой. На мой взгляд, в какой-то мере это помогло, но мне все еще куда расти.
Я присоединился к челленджу «100 дней кода», чтобы писать код ежедневно и не позволять вниманию рассеиваться. Важно фиксировать свои достижения. Если вы записываете результаты каждый день, то может показаться, что ничего особенно и не сделано, но позже, просматривая записи за месяц или несколько месяцев, вы увидите, что достигли неплохого прогресса, и это послужит вам мотивацией продолжать.
Я знал, что от нетворкинга будет зависеть все, поэтому набрался храбрости и отправился на свой первый митап для разработчиков. Я вообще до этого на митапах не бывал, не то что на программистских. Нервы у меня разыгрались так, что когда приехал, припарковался и подошел к дверям, уже совсем был готов развернуться и уйти домой.
К счастью для меня, группа встречалась в тот день впервые. Я быстро понял, что волноваться не из-за чего. Другие участники тоже друг друга не знали, никто никого не осуждал и все были рады возможности узнать что-то новое. Этот митап стал для меня началом целой серии. В итоге, за девять месяцев я посетил более пятидесяти митапов.
Я рад, что рано начал посещать митапы. Большинство людей принимается за это уже тогда, когда приступает к поиску работы, а на этом этапе уже почти что слишком поздно. Есть много причин начинать пораньше. Вот несколько из них:
- Чтобы выстроить отношения нужно много времени. Если вы начнете рано, к этапу поиска работы у вас образуются связи с людьми, которые смогут замолвить за вас словцо.
- Беседы на тему программирования с незнакомыми людьми — отличный способ подготовиться к собеседованию.
- У вас будет возможность узнать о новых фреймворках, инструментах и обучающих ресурсах от тех, кто продвинулся дальше вас. Это может внести коррективы в ваши будущие планы по самообразованию.
На этой стадии моего пути программиста все выглядело довольно туманно. Мне нужно было определиться, что именно я хочу разрабатывать.
В конечном итоге, я выбрал веб-разработку, так как на нее, судя по всему, был хороший спрос, а в Сети попадалось много ресурсов. Исходя из этого решения, нужно было продумать следующий шаг. Некоторые знакомые считали, что на данном этапе мне стоит определиться, какие веб-приложения я хочу сделать, и браться за работу. Другие советовали присоединиться к The Odin Project или freeCodeCamp.
Организатор еженедельных митапов, которые я посещал, знал Ruby и хотел писать проекты на нем. Во многом именно по этой причине я принял решение удариться в The Odin Project.
Два дня спустя я отказался от этой затеи.
Это один из недостатков самообучения. Сейчас вам может казаться, что вы точно знаете, в каком направлении двигаться, а на следующий день вы уже засомневаетесь, правильно ли действуете.
Я где-то прочитал, что популярность Ruby падает, и сравнение количества вакансий по Ruby и JavaScript подтвердило эту информацию. И поэтому в итоге я стал работать с freeCodeCamp. Единственное, что меня смущало в этом ресурсе — тот факт, что они предлагают свои идеи проектов, так что все участники делают одно и то же. Меня это беспокоило: мне хотелось бы чем-то зацепить взгляд работодателей. Тем не менее, мне очень понравилось на freeCodeCamp и я могу смело его рекомендовать. Если хотите узнать больше о моем опыте с этой площадкой и получить несколько советов, почитайте мой пост на эту тему.
Месяц №2 — YDKJS, фронтенд на freeCodeCamp, React
Я взялся за серию книг «You Don’t Know JavaScript», потому что ее советуют как дополнение к курсу freeCodeCamp. Некоторые секции приходилось читать на два раза (текст весьма информационно плотный), но это отличный источник, чтобы разобраться с областями видимости, замыканиями, обещаниями и всеми другими понятиями из JavaScript, о которых вы постоянно слышите и которые хотите изучить, но не решаетесь, потому что они кажутся очень уж сложными.
Я проработал всю фронтенд-секцию freeCodeCamp. Формат списка и отображение примерного расхода времени на оставшиеся задания мотивировали меня закончить как можно быстрее. Вдобавок у меня чесались руки поскорее перейти к следующей секции и освоить React. Однако это привело к тому, что стилистика у меня проектов была минимальная. Я делал только то, чего требовали пользовательские истории, и больше ни на что не отвлекался. Оглядываясь назад, мне, возможно, стоило больше внимания уделять внешней привлекательности продуктов. Не исключено, что это помогло бы мне глубже освоить CSS.
Далее мне предстояло взяться за React, и я был полон энтузиазма.
Я очень много о нем слышал, и мне не терпелось присоединиться к компании крутых ребят. Вместе с тем, я немного колебался из-за проблем с лицензией, которые как раз возникли в тот момент. Очень рад, что сейчас они уже разрешились. Изучение React оказалось непростым делом. Тогда я еще не знал, где можно почитать хорошие туториалы (зато теперь они встречаются на каждом шагу).
Я попробовал читать документацию и идти по туториалу Tic-Tac-Toe от Facebook, но мне в них не все было понятно. Мне сказали, что если я не могу разобраться в этом материале, значит еще недостаточно хорошо знаю JavaScript. Поэтому я вернулся к книгам You Don’t Know JavaScript, но и они оказались для меня неподъемными.
Месяц №3 — freeCodeCamp React, CodeClub, бэкенд курс на freeCodeCamp (начало)
В конце концов, я решил, что просто начну работать над проектами на React и посмотрю, как пойдут дела. Мой код выглядел отвратительно, но зато это помогло мне немного разобраться в языке.
Та самая группа, на встречи которой я ходил каждую неделю, решила, что будет писать проекты целиком на JavaScript, а не на Ruby, и в качестве первого проекта выбрала создание вебсайта группы — CodeClub.Social.
Используя React и API митапа, я сделал особые карточки, с помощью которых пользователь мог записаться на следующие три встречи прямо на сайте. Я с неохотой прервал курс на freeCodeCamp ради этой задачи, но такую возможность нельзя было упустить. Работать над проектом в составе небольшой группы оказалось очень здорово. К тому же, это позволило мне освоить Git и GitHub.
К концу месяца я перешел к бэкенд-секции курса freeCodeCamp.
Месяц №4 — бэкенд курс на freeCodeCamp (окончание), Yeggle
Я выполнил все задания, связанные с API, на freeCodeCamp, но после того как дошел до проекта Image Search Abstraction Layer, начал отклоняться от программы.
Мне не терпелось скорее самому создать веб-приложение полного цикла, поэтому при первом же взгляде на название этого проекта у меня зародилась идея собственного продукта. Я решил, что сделаю приложение на node, которое будет сохранять рандомные адреса картинок с imgur в базе данных, а потом надстрою фронтенд, который будет выдавать заданное пользователем число рандомных картинок из этой базы. Люди не зря говорят, что над собственной идеей работаешь усерднее и успешнее — это чистая правда.
Я очень собой гордился, когда наконец добился того, чтобы все заработало. Система была громоздкой и не слишком красивой, но зато делала то, что от нее требовалось.
Продолжая работать над заданиями с freeCodeCamp, я параллельно прикидывал, какие проекты будут мне по силам. В то время я регулярно делал пробежки и обычно придумывал идеи как раз в это время, а вернувшись домой, записывал их. Таким образом, к тому моменту как я был готов приступить, у меня уже накопился список возможных проектов.
Наконец я ощутил, что готов начать работу над собственным высококачественным веб-приложением полного цикла, которое смогу представить пользователям и добавить в свое портфолио. Я был прямо-таки в полной боевой готовности.
Всякий раз, как мне захочется сходить в какое-нибудь новое кафе, я сначала открываю Yelp, чтобы почитать отзывы, а потом перехожу на Google Maps и смотрю, что пишут там. А что если сделать приложение, которое будет выводить оба набора отзывов на экран для сравнения?
Так появился Yeggle. При его написании я использовал Node, Express и React, а также API Yelp и Google Maps. Пару раз я сталкивался со сложностями, которые, казалось, никак не разрешить, но все-таки довел дело до конца и был очень горд своей работой. Я разместил приложение на Reddit, однако никакого интереса оно не вызвало. Было обидно, но я постарался не принимать это близко к сердцу.
Месяц №5 — StockIT
Это месяц у меня получился не таким продуктивным, потому что первую его половину я провел на отдыхе в Японии и Таиланде!
Тем не менее, я начал и довел до завершения свой следующий проект. Мне часто попадались рассказы о том, как тяжело разработчику-самоучке устроиться на работу, поэтому я решил, что нужно придумать что-то эдакое. Мне вспомнилась игра, где промышленный индекс Доу — Джонса был на подъеме и у игрока была возможность совершить одну покупку и одну продажу так, чтобы получить при этом прибыль. Цель этой игры заключалась в том, чтобы донести до пользователя, как это сложно — переиграть рынок.
У меня возникла мысль создать подобную же игру, только сражаться там нужно будет не с рынком, а с алгоритмом машинного обучения. И я сделал StockIT.
Я посмотрел видеотуториал по Pandas и Scikit Learn, где описывалось несколько разных технологий машинного обучения. Сначала я хотел включить что-нибудь навороченное из deep learning, но понял, что для этого понадобится огромная база данных и значительные временные затраты, на которые я не готов.
Вместо этого я ограничился моделью линейной регрессии. Я думал, что эта часть будет самой сложной, но вышло по-другому. Сложнее всего оказалось примирить D3 с React. Обе библиотеки стремились захватить контроль над DOM. Есть некоторые другие библиотеки, которые могли бы помочь с их объединением, но они показались мне слишком тяжеловесными. В конечном счете, я использовал D3 для генерации SVG, а React — для работы с DOM, и получилось вроде бы неплохо.
На этот раз, когда я выложил проект на Reddit, он всем понравился! Оказывается, тамошняя публика, прямо как инвесторы, очень неравнодушна к машинному обучению. Положительный отклик от Reddit помог мне поверить в свои силы. Люди играли в мою игру и получали от нее удовольствие!
Месяц №6 — jobSort(), подготовка к поиску работы
Покончив со StockIT, я сразу же перескочил на следующий проект. Мне хотелось сделать доску вакансий, которая объединяла бы в себе небольшие списки вакансий с отдельных вебсайтов IT направленности — Stack Overflow, Github и Hacker News. Чтобы добавить какую-то изюминку, я решил настроить сортировку по технологиям, с которыми пользователь хотел бы работать, и возможность отмечать их как более или менее приоритетные.
Например, давайте представим себе, что я ищу работу в компании, где нужен специалист по JavaScript, React и/или Python, и при этом очень хочу работать с JavaScript и React, а вот к Python не питаю сильных чувств. Тогда я задаю приоритет 3 у JavaScript и React, ну а Python ставлю единичку. Вакансии будут отсортированы соответствующим образом.
С этим проектом у меня возникало много сложностей, пару раз пришлось менять курс действий, но итоговым результатом я остался доволен. В своем конечном виде стек технологий включал React, Node, Express и MySQL. Я запостил приложение в сабреддит cscareerquestions, и он успел собрать 650 просмотров, пока его не удалили — делиться личными проектами там не разрешается.
«Финальная» версия продукта лежит здесь, а если вам интересно почитать про мои мучения и рефакторинг, отсылаю вас к этому посту.
Из-за всех этих проблем работа над jobSort() заняла большую часть месяца. Я встретился за чашкой кофе с другом, с которым познакомился на первом митапе, и он посоветовал уже начинать рассылать резюме. Я перечитал кучу историй, в которых разработчики признавались, что слишком долго с этим тянули. Да и на Reddit сколько мне ни попадалось постов с вопросом «Когда лучше рассылать резюме?», больше всего голосов всегда набирал ответ «Прямо сейчас».
Я себе все это представлял так: я буду продвигаться согласно плану, составлю солидное портфолио с личными проектами, затем поработаю над вкладами в проекты с открытым кодом, после этого уже подготовлюсь к собеседованиям, ну и наконец начну рассылать резюме. Но друг убедил меня оставить этот план и сразу приступить к поиску работы. Поэтому к концу месяца я составил портфолио и резюме. Рассылка была намечена на следующий месяц.
Месяц №7 — Тестирование и поиск работы
Этот месяц я отвел под доработку проектов и поиск работы. Также мне хотелось освоить тестирование и Redux.
Я добавил на CodeClub.Social flexbox, чтобы сделать его более интерактивным. Усовершенствовал UX в мобильной версии jobSort(). Добавил в jobSort() тестирование при помощи mocha/chai/enzyme — настроить это было сложно, запустить легко, а добиться стопроцентного покрытия — опять сложно.
К концу месяца я откликнулся на 63 вакансии. Я рассматривал это как возможность оценить себя. Произведут ли мои портфолио и резюме должное впечатление? Если да, то над чем нужно поработать, прежде чем идти на собеседование? Сначала я выбирал вакансии из раздела Who is Hiring на Hacker News и с сайта Indeed. Вакансии с Hacker News я прогнал через jobSort(), чтобы определить, на какие стоит обратить внимание. На Indeed я попробовал пробиться в компании, не работающие с ПО, просто чтобы посмотреть, удастся ли мне получить ответный звонок или приглашение на собеседование хоть где-нибудь.
Сперва я проводил рассылку по-быстрому, не пытаясь как-то персонализировать резюме и сопроводительное письмо. Позже я решил все-таки их персонализировать и пытаться напрямую связаться с кем-нибудь из сотрудников компании. Этот метод работал явно лучше, чем изначальный подход «с мороза».
За весь месяц мне перезвонили пять раз: два раза — рекрутеры, три раза — компании, специализирующиеся на разработке ПО, в частности:
- дотком компания, которая предлагала работу по контракту, связанную с тестированием и DevOps
- недавно вышедшая на рынок компания, которая занимается аналитикой в пищевой промышленности
- довольно масштабный и успешный стартап, который недавно купила крупная корпорация
В двух из них я успешно прошел телефонное интервью с кадровиками, но до этапа собеседования в офисе не дошел нигде. Я был доволен уже и тем, что мне трижды перезвонили, этот опыт многому меня научил.
В Сети все говорили, что от джуниоров никто не ждет глубоких познаний с самого начала, достаточно, чтобы у них был энтузиазм и желание учиться. «Раз плюнуть», — подумал я. У меня же столько энтузиазма и желания учиться. Однако после этих звонков мне стало ясно, что джуниоры никому не нужны. Работодатели рассчитывают на то, что кандидат с первого дня будет знать, что делает.
Эти интервью показали мне, что я должен:
- иметь достаточно навыков, чтобы приносить пользу с первого же дня
- иметь достаточно уверенности в себе, чтобы убедить других, что я смогу приносить пользу с первого же дня
Месяц №8 — Ночная смена, Redux, Open Source, собеседование в офисе
Начался этот месяц с того, что на основной работе меня на сорок дней перевели в ночную смену — шесть двенадцатичасовых рабочих дней в неделю, с пяти вечера до пяти утра. Вот блин.
Я понимал, что не смогу много сделать с таким режимом, но передо мной стояла цель, и я хотел ее достигнуть, так что просто сделать месячный перерыв было нельзя.
Я провел рефакторинг кода jobSort(), чтобы внедрить Redux — к моему удивлению, это оказалось вовсе не так сложно, как я думал. Я прослушал много подкастов и прочитал много постов на эту тему, но пока я не взялся за дело сам, все как-то не укладывалось в голове.
Мне очень нравится, как Redux упорядочивает данные. Интересно сейчас читать мнения людей, которые им недовольны. У меня, конечно, еще маловато квалификации, чтобы высказываться категорично, но мне очень по душе паттерн их редюсера.
По плану, этот месяц я должен был посвятить работе с открытым кодом. Я рассчитывал сделать свой первый вклад в проект с открытым кодом, причем вклад предполагался гениальный и в первоклассную библиотеку. Я метил в сам React!
Все твердили, что их код и читать-то сложно, не то что дополнять. Но мне надо было выделиться, показать свою уникальность. Я знал, что ничего серьезного привнести не смогу, но все-таки хотел приложить руку.
Для начала я прочитал всю документацию от и до, а затем стал корпеть над кодовой базой. Пересмотрел все issues и pull requests. Доскональное изучение документации к React принесло мне много пользы, я доволен, что это сделал. Но я быстро осознал, что главная проблема со вкладами в код React состоит в том, что там не так много подходящих заданий «для новичков», и их разбирают на лету.
На одном из митапов, которые я посещал, Anthony Ng посоветовал мне обратить внимание на Downshift, библиотеку для автозаполнения авторства Kent C. Dodds. Этот совет стал для меня поворотным моментом. Это было именно то, что мне нужно. Подходящий уровень сложности, достаточно проблем, с которыми требовалась помощь, не слишком много желающих поучаствовать, всегда готовый помочь мейнтейнер и аккуратный, хорошо протестированный код. Вдобавок ко всему, там я нашел решения для многих затруднений, с которыми не мог справиться в ходе работы над jobSort().
Где-то в середине месяца мне пришло письмо от одной из компаний, которой я отправил резюме еще в предыдущем. Они предлагали мне пройти телефонное интервью, а потом — техническое собеседование, тоже по телефону. Технологии, которые их интересовали, совпадали с тем набором, который я освоил — React, Redux и D3. По большей части, я просто рассказывал о своих проектах и объяснял, почему принял то или иное решение. После этого они пригласили меня пообщаться вживую. Мое первое собеседование в офисе!
Я вообще никак не успел подготовиться, поэтому пришел с убеждением, что работу я не получу, но зато получу ценный опыт прохождения собеседования. Ко всему прочему, в тот день я спал три часа — ночная смена никуда не делась, и это было очень некстати. К счастью, в ходе технической части мне пришлось писать на доске — все ограничилось часовой сессией программирования. Задания были в общем-то стандартными, но я все равно очень нервничал.
Сначала я из кожи вон лез, чтобы показать, что все знаю и мне не нужно никуда подглядывать. Потом, когда стало ясно, что мне не хватает времени выполнить задание, я понял: надо махнуть рукой на то, какое впечатление произвожу, и просто поискать ответы в Google или на Stack Overflow. В итоге, я так и не успел до конца справиться с заданием и из этого заключил, что с треском провалился.
Смирившись с тем, что секция по программированию завалена, я провел остаток собеседования в расслабленном состоянии. В конечном счете, я ушел из офиса с гордо поднятой головой. При наихудшем раскладе событий я извлеку из этого опыта много полезного, при наилучшем — мне предложат работу.
Месяц №9 — Предложение о работе
Я получил свое первое предложение о работе спустя ровно 9 месяцев и 7 дней после того момента, как решил, что хочу окунуться в мир программирования с прицелом на смену профессии. То, что меня готовы взять после первого же личного собеседования, внушало уверенность, но с другой стороны — что если я откажусь, а других приглашений в ближайшие несколько месяцев не будет? В итоге, я принял предложение и остался очень доволен своим решением. Мне ведь хотелось писать код за деньги!
Советы
До сих пор я в основном просто рассказывал свою историю, местами вставляя рекомендации. Если вы это читаете, значит, скорее всего, либо подумываете поменять работу, либо изучаете программирование с намерением уйти в эту сферу. Я надеюсь, что приведенные ниже советы помогут вам выработать план или придерживаться того, который вы уже для себя составили, и достигнуть цели.
1. Найдите способы себя мотивировать и пользуйтесь ими. В моем случае помогали списки, документирование прогресса и общение в IT сообществах. Если у вас нет мотивации идти к цели, все остальное теряет смысл — вы просто не доведете дело до конца.
2. Ставьте перед собой цели и достигайте их. Я бы даже рискнул утверждать, что цели должны ставиться каждый месяц, если не каждый день. Ежемесячные цели помогают не отклоняться от заданного курса и двигаться к главной цели, а ежедневные нужны, чтобы заставить себя непрерывно добиваться какого-то прогресса. Для меня работала такая стратегия: я составлял планы на следующий день по вечерам. Так я избегал ситуаций, когда весь день занимаешься непродуктивной работой с ложным чувством, будто делаешь что-то полезное. Это заставляло сравнивать то, что выполнил за день, с тем, что было запланировано.
3. Посещайте митапы, не дожидаясь, пока будете готовы. Как я упоминал выше, пойти на встречу с другими разработчиками бывает страшновато. Но в целом, все, как правило, настроены дружелюбно и рады помочь. Возможно, вам встретятся люди, которые не захотят с вами общаться, но таких меньшинство, и никто не станет смотреть на вас сверху вниз. А уж давать советы любят вообще все (вот как я здесь, например).
4. Делайте вклады в открытый код, не дожидаясь, пока будете готовы. Когда только начинаешь изучать программирование, GitHub кажется страшным местом, куда в жизни не сунешься. На самом деле, там очень доброжелательно относятся к новичкам, и вообще это отличная площадка, чтобы почитать хороший код и получить фидбэк по своей работе. Если у вас еще остались сомнения, могу посоветовать свою статью «Почему вам стоит немедленно сделать вклад в открытый код».
5. Начинайте рассылать резюме задолго до того, как будете готовы. Это я усвоил с трудом: мне казалось, что у меня особая ситуация. Я думал, что мне необязательно прощупывать рынок, чтобы понять, какие слабые места нужно подтянуть. Я думал, что сам почувствую, когда буду готов приступить к поиску работы. Ну так вот, сейчас могу вам сказать: никакого озарения, что вот теперь пора, у вас не случится, так что можно с тем же успехом начинать прямо сейчас. Только не сходите с ума и не откликайтесь на 300 вакансий, прежде чем освоите оператор цикла. Просто имейте в виду, что лучший способ понять, каких знаний вам не хватает — предлагать свою кандидатуру и пробовать свои силы на рынке.
Ну а теперь возвращаемся к написанию кода!