От новичка до разработчика за девять месяцев

История разработчика Human API Остина Такаберри о том, как он самостоятельно научился программированию и сменил работу.

Остин Такаберри
Остин Такаберри

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

Скрывать нечего

Итак, в средней школе я прошёл курс по VBA (девять лет назад). На первом курсе колледжа немного изучил C, Python, Matlab и Labview (семь лет назад). Учился я на химика-технолога и окончил университет с хорошим средним баллом (три года назад). Вне учёбы программированием я никогда не занимался.

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

Почему я хотел сменить профессию

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

Около года назад, 27 мая, я в очередной раз искал информацию о программах MBA и случайно наткнулся на программы по разработке ПО. Вот оно, подумал я.

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

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

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

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

Цель

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

За год получить работу разработчика ПО с зарплатой не ниже, чем нынешняя.

План

Обозначив цель, займитесь планом её достижения. Как раз на этом этапе следует прочесть как можно больше историй успешных людей. Да, ни одна из них не впишется в вашу жизнь целиком, но из каждой можно извлечь полезный урок. Свой план я составил, используя, например, сабреддит learnprogramming, форум freeCodeCamp и Medium.

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

В итоге мой план, претерпевший множество изменений, приобрёл вот такой вид.

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

Довольно просто для начала. Своё обучение я решил построить вокруг программы для разработчиков от Google и поэтому начал с Udacity CS101, рекомендованного вводного курса.

Месяц первый — Udacity CS101, Harvard CS50

Как только я со всем определился, меня охватила эйфория. По возвращении домой с работы я сразу начинал писать код и сидел до самой ночи, в том числе и по выходным. В Udacity CS101 есть замечательная шкала прогресса, которая послужила неплохим мотиватором. Я отмечал свой прогресс каждый день, преодолев 75% программы за десять дней. Последние 25% дались мне не так легко, эта часть была нацелена на повторение. На весь курс у меня ушло 20 дней.

Занимаясь по Udacity CS101, я налёг на чтение сабреддита learnprogramming. Там я вычитал, что для разработчика-самоучки, который хочет сменить работу, очень важно быть активным в сети. Используя своё реальное имя, я создал новые аккаунты на Twitter, Reddit, Stack Overflow, Medium и Quora, чтобы нарастить присутствие в интернете.

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

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

Месяц второй — Harvard CS50, Linux, freeCodeCamp и первый семинар

К середине месяца я разделался с CS50. Не стану много рассказывать о своём опыте, ему я посвятил отдельную статью. В двух словах: программа великолепная, рекомендую. Дэвид Малан — блестящий лектор, сам курс полон вспомогательных материалов. Занятия начинаются с языка C, затем идёт Python, следом — веб-разработки. Расписание очень насыщенное. Обязательно попробуйте.

Окончив курс, я решил установить на свой Dell XPS 15 две ОС — Windows и Ubuntu. Выходные выдались тяжёлыми — я напутал с разделом диска и едва не угробил ноутбук.

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

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

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

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

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

Как раз в то время внутри меня зрела неопределённость — предстояло решить, разработчиком какого ПО я хотел стать.

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

Руководитель еженедельных семинаров, которые я посещал, знал Ruby и хотел заниматься проектами на этом языке, и во многом подтолкнул меня к решению поставить всё на Odin Project. Но через пару дней я передумал.

Это один из минусов самообучения — вечером ты уверен в своём выборе учебной программы, а на утро неприятно удивлён вчерашним решением. Оказалось, Ruby теряет популярность, в чём я убедился, сравнив число вакансий с Ruby и JavaScript.

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

Месяц третий — YDKJS, фронтенд на freeCodeCamp, React

В качестве дополнения к программе freeCodeCamp многие рекомендовали книгу «Вы не знаете JS» Кайла Симпсона, поэтому я взялся и за чтение. Несколько глав, правда, пришлось перечитать, так как книга оказалась не из лёгких. Тем не менее она послужила отличным подспорьем в работе и помогла разобраться в тех элементах JavaScript, о которых я слышал, но к которым боялся подступиться из-за сложности.

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

Сейчас я понимаю, что мне следовало бы отдавать предпочтение более интересным проектам. Вполне возможно, это помогло бы мне глубже освоить CSS. Теперь же я расскажу о React.

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

Cходу разобраться в React у меня не получилось. От кого-то я услышал, если React не идёт, то ты просто недостаточно хорошо понимаешь JavaScript. К сожалению, тогда на примете не оказалось хороших обучающих программ (теперь их наберётся сотня). Я снова вернулся к чтению «Вы не знаете JS», но толком так и не продвинулся.

Месяц четвёртый — freeCodeCamp React, CodeClub, начало курса по бэкенду на freeCodeCamp

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

В то же время моя группа на семинаре решила отказаться от Ruby в пользу JavaScript. Первым нашим полноценным проектом стал сайт для наших встреч CodeClub.Social.

Я, например, используя React и Meetup API, разработал страницу для записи на три предстоящих занятия. Было немного сложно переключиться с заданий на freeCodeCamp, но такую возможность я упустить не мог. Я был рад поработать над проектом в небольшой команде. Наш сайт также помог мне разобраться в Git и Github. Месяц ещё не подошёл к концу, когда я приступил к секции бэкенда на freeCodeCamp.

Месяц пятый — с бэкендом покончено, Yeggle

Со временем я проработал все доступные на freeCodeCamp проекты, связанные с API. Однако приступив к слоям абстракции, я начал отходить от программы, так как у меня появилась идея для собственной разработки.

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

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

Закончив, я был ужасно горд собой, хотя приложение и выглядело жутко. Зато работало. На freeCodeCamp я учился определять, какие проекты мне по силам, и наконец-то почувствовал, что готов писать полноценные приложения, которыми не стыдно было бы поделиться и вложить в портфолио.

В поисках нового кафе я часто пользовался Yelp и Google Maps, чтобы ознакомиться с отзывами. А что если сделать приложение, которое объединило бы отзывы с этих платформ?

Так появился Yeggle. При разработке я использовал Node, Express и React, а ещё API Google Maps и Yelp. Да, была пара препятствий, которые, казалось, мне преодолеть не по силам, но я справился и остался доволен проделанной работой. Я опубликовал приложение на Reddit, но никто не обратил на него внимание, что немного меня расстроило. Но я не опустил руки.

Месяц шестой — StockIT

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

Тут я вспомнил про одну игру: на экране выстраивается график Dow Jones, а у вас есть одна возможность купить и продать акции. Задача — обойти рынок. Я задумал создать похожую игру, только вместо рынка противником будет самообучающийся алгоритм. В результате появился StockIT.

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

Вместо этого мой выбор пал на простую модель линейной регрессии. Я предполагал, что самой сложной частью станет как раз машинное обучение, но не тут-то было. Самым сложным оказалось совместить работу библиотек D3 и React, так как обе пытались контролировать DOM. Наладить их работу мне удалось с помощью других библиотек, при этом меня не покидало ощущение, что код слишком раздут. В итоге я использовал D3 для генерации SVG, а React оставил для DOM.

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

Месяц седьмой — jobSort() и подготовка к поиску работы

Едва закончив StockIT, я приступил к реализации другого проекта — доске объявлений, на которой были собраны вакансии с таких сайтов, как Stack Overflow, Github и Hacker News. Чтобы придать разработке индивидуальности, я решил добавить фильтры — пользователь мог сам выбрать область, в которой хотел бы работать, и определял степень своего желания. Замысел получил название jobSort().

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

Над этим проектом пришлось попотеть и пару раз даже сменить курс, но я остался доволен результатом. При создании приложения я задействовал React, Node, Express и MySQL. Опубликовав проект на сабреддите cscareerquestions, я получил 650 просмотров, затем мою запись удалили, так как в этом разделе размещать персональные проекты запрещено. Из-за возникших проблем я провозился с jobSort() большую часть месяца.

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

Месяц восьмой — отладка, поиск работы

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

На сайте нашего семинара я добавил поддержку флексбоксов, чтобы улучшить отклик, а также обновил графический интерфейс мобильной версии jobSort(), проведя тестирование с помощью Mocha, Chai и Enzyme. Над последним пришлось поломать голову.

К концу месяца я разослал 63 заявления, как бы оценивая самого себя: хороши ли мои портфолио и резюме? Если да — над чем следует поработать, чтобы как следует подготовиться к собеседованию? Сначала я размещал объявления на Hacker News: Who is Hiring и сайте Indeed. Для HN я использовал jobSort() — так легче выделить технологические компании. На Indeed я оставлял заявки на работу в предприятиях, не связанных с ИТ — просто хотел узнать, перезвонят ли мне вообще.

Сперва я делал быструю рассылку, не вдаваясь в подробности ни в резюме, ни в сопроводительном письме. Затем всё-таки я решил рассказать о себе поподробнее и сразу отправлял письма прямо в компанию, а не на сайт. Такой подход оправдал себя.

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

  • Подряд в отделе интеграции разработки и эксплуатации в одной дотком-компании. Сюда же отнесём и отладку продукта.
  • Место в развивающейся компании по анализу продуктов питания.
  • Должность в меру большом и успешном стартапе, недавно приобретённом крупной корпорацией.

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

В сети только ленивый не писал: на старте от начинающих разработчиков никто не ждёт чего-то особого. Главное — любить своё дело и желание учиться. Легко, мотивации у меня хоть отбавляй. Звонки же дали мне понять: разработчик-любитель никому не нужен. С первого рабочего дня от вас ждут чёткого понимания того, чем вы занимаетесь. Итак, усвоил я следующее.

  • Будь готов повышать отдачу с первого дня.
  • Будь достаточно уверен, чтобы убедить в своей готовности работодателя.

Месяц девятый — ночные смены, Redux, волонтёрство, настоящее собеседование

Тут мне пришлось нелегко. 40 дней я работал в ночную смену — шесть дней в неделю, 12 часов в день, с пяти вечера до пяти утра. Я понимал, что с таким графиком много не сделаю, но у меня была цель, и я хотел достичь её, потому не мог себе позволить выпасть на целый месяц.

Сперва я переписал jobSort() с использованием Redux, что, к моему удивлению, оказалось не так сложно. Честно говоря, с этой библиотекой я разобрался, только когда начал ею пользоваться: ни подкасты, ни статьи не помогали.

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

В дополнение ко всему этот месяц был полон волонтёрской работы. Я намеревался сделать свой первый вклад в проект с открытым исходным кодом — не в какой-нибудь, а в React. И пусть он был бы небольшим, я всё равно решил попробовать.

Для начала я проштудировал все официальные документы, а затем погрузился в базу кода, пытаясь отыскать неполадки. Чтение документов оказалось весьма полезным занятием. И всё же довольно быстро я смекнул: серьёзных проблем в React не так много, да и те живо расхватывают.

На одном из семинаров Энтони обратил моё внимание на Downshift, виджет автозаполнений, созданный Кентом Доддсом. Наконец-таки идеальный проект. Мало того, что я неплохо разбирался в подобных вещах — виджет Доддса оказался достаточно сложным, и его предстояло доработать, несмотря на чистый хорошо отлаженный код. К тому же в добровольцев, готовых помочь, набралось немного, да и сопроводитель был просто прекрасным. Downshift здорово помог мне с решением некоторых проблем jobSort().

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

Они искали программиста с таким же набором навыков, как у меня — React, Redux и D3. Большую часть времени я рассказывал о своих разработках и причинах принятия того или иного решения. В итоге они пригласили меня на настоящее собеседование. Моё первое собеседование в качестве разработчика.

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

Терять было нечего: в худшем случае я бы просто получил ценный опыт, в лучшем — приглашение на работу.

Сперва я засомневался в собственных знаниях — вспомню ли я всё без того, чтобы куда-то подсмотреть? Когда я понял, что в любом случае не выполню задание до конца, мне стало всё равно, и я спокойно искал ответы в интернете, не оглядываясь на работодателя. Тест я так и не закончил, а в голове вертелось: «Полный провал».

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

Месяц десятый — приглашение на работу

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

Советы

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

  • Определите, что вас мотивирует и используйте это с выгодой для себя. Мне нравилось визуализировать свой прогресс, а также общаться в разных сообществах. Если у вас нет мотивации, добиться желаемого вам не поможет ничего.
  • Ставьте цели и достигайте их. Я бы сказал, что цели нужно ставить и на год, и на месяц, и на день. Так вы не собьётесь с пути и не будете лениться, думая при этом, что в чём-то продвинулись. Сравнивайте свои успехи за день, за месяц и год с намеченными целями.
  • Посещайте семинары, не задумываясь, готовы ли вы к ним. Да, может быть страшно. Но на деле все очень милые и отзывчивые. Кто-то, конечно, не захочет с вами общаться, но таких немного. И вот ещё: все любят давать советы (прямо как я сейчас).
  • Работайте над проектами с открытым кодом, не задумываясь, готовы ли вы к ним. Поначалу Github вселяет ужас, но в действительности там очень тепло относятся к новичкам. Более того, на Github можно ознакомиться с хорошим кодом и представить свой. Если же вы до сих пор сомневаетесь, можете прочесть мою запись.
  • Подавайте заявления на работу, не задумываясь, готовы ли вы к ней. Этот пункт дался мне тяжело, ведь я считал себя особенным. Я думал: «Зачем мне изучать рынок, я и так соображу, в каком направлении продолжить развитие». Я был уверен, что пойму, когда буду готов к работе. Говорю откровенно — не ждите, такой момент не настанет. Поэтому начинайте искать место прямо сейчас. Конечно, не стоит сходить с ума и отправлять заявки в 300 компаний, когда вы даже не усвоили неопределённые циклы. И всё же лучший ориентир для развития дают изучение рынка и попытки найти работу.
3838
76 комментариев
Комментарий удалён модератором

Я тоже решил научиться. Могу я у Вашей собаки проконсультироваться? Попрошу её моим ментором быть?

12
Ответить

Кому лень читать: чувак "нащупал" дело по душе, поставил промежуточные цели, упорно к ним двигался и в итоге нашел работу. Вместо программирования можно подставить любое "ремесло". Молодец короче.

8
Ответить

Норм, у меня так знакомая замуж вышла

7
Ответить

можно поподробнее )?

Ответить

Комментарий недоступен

4
Ответить

Это ИТ-Россия. Мир токсичных взаимодействий. Завышенное ЧСВ надо кормить каждую секунду.

10
Ответить