Таков путь или как я познавал Ruby +16


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

Почему Ruby?

Если бы меня сейчас спросили, почему я выбрал именно Ruby, я бы ответил, что это отличный язык с кодом, который читается как книга, на нем можно быстро сделать web-приложение, которое будет вполне достойно работать и выдерживать большие нагрузки. В фреймворке Rails есть отличные средства автоматизированного тестирования, что ускоряет переход проекта от стадии «программа написана» к стадии «программа работает без ошибок». Так же не могу не отметить, что Ruby on Rails обеспечивает отличную безопасность проекта: при использовании инструментов RoR исключены SQL-инъекции и XSS-атаки, все входные параметры экранируется по умолчанию, выводимые переменные в шаблонах также экранируются. У разработчика просто нет шансов допустить ошибку безопасности (только если он не намеренно сам «выстрелил себе в ногу»).

Но если бы меня спросили раньше, то я бы думал дольше, чем Internet Explorer загружает странички, и, скорее всего, так бы и не нашел ответа на этот вопрос. Раньше я отшучивался, что я посмотрел на Ruby, он на меня, искра, ruby, безумие. Но как я вообще узнал о таком языке и почему же все-таки выбрал его?

Когда я начинал учиться в университете, то я изучал такие языки, как С++ и С#, а сам слышал еще о JS, Python, Java и PHP. Я совсем не знал, какой язык выбрать и чем я вообще буду заниматься. Было просто дикое желание стать программистом и связать свою жизнь с разработкой (тогда я еще вообще не представлял о зарплате программистов и знал наверняка, что тестирование не мое). Спустя два курса универа (после второго семестра меня отчислили за академическую задолженность по матанализу, но я восстановился и проучился еще год), я решил отчислиться и ненадолго отложить свои планы, так как нужно было зарабатывать деньги (я в то время совмещал учебу и работу в McDonald’s, но слишком много не заработаешь, и пришлось уделять больше времени работе). К счастью, вопрос с армией был решенным, поэтому мог спокойно работать. Но желание стать программистом никуда не исчезло.

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

И вот тут моя работа в общепите помогла мне в реализации моих планов (да-да, сам бы не поверил, если бы такое услышал). Я познакомился с парнем, который на тот момент был нашим постоянным клиентом и, как мне очень повезло, ruby-разработчиком (в последствии, он стал моим лучшим другом и даже был свидетелем на моей свадьбе). Мы с ним разговорились, я поведал ему мою историю, он мне рассказал про свою работу и предложил мне показать, что же за язык такой Ruby и с чем его едят. После всего этого он сказал фразу, которая и проложила мне дорогу в IT: "Если тебе понравился ruby, я могу тебя научить". Я согласился и мы начали мое замечательное путешествие в мир программирования.

Первые шаги

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

Мое обучение началось с того, что мой товарищ рассказал мне вообще, как появился ruby, фреймворк rails и какие известные проекты были реализованы на нем (как же сильно я удивился, когда услышал, что Netflix, Twitter, Airbnb, SoundCloud, GitHub, Hulu и многие другие были реализованы именно на RoR). К моему счастью, мои родители с самого детства знали, что английский мне определенно пригодиться, поэтому у меня был репетитор по нему с 1 по 11 класс и проблем с английским у меня не было. Так что я мог сразу приступать к изучению (если у вас проблемы с английским или вы его вовсе не знаете, то рекомендую начинать обучение именно с него, без английского языка в IT будет крайне сложно, а местами даже невозможно).

Мне очень повезло, что я обучался не самостоятельно, так как сам я бы не знал, как и с чего начать. Мой товарищ же составил борду в Trello, чтобы я изучал все в правильной последовательности. Сначала я читал общие статьи: что такое ООП (да, я уже изучал это во время обучения в университете, но прошло 1,5 года, да и изучал я это более подробно, чем давалось на лекциях), основы Linux (раньше я пользовался только Windows, поэтому это было очень актуально и полезно), какие методологии разработки бывают, SOLID, ACID, как пользоваться гитом и так далее. После всего этого я приступил к изучению основ самого Ruby: что такое интерпретатор, rvm, nvm, классы, модули, какие типы данных бывают, что такое pry, блоки, проки, лямбды, методы, область видимости и тому подобное.

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

Не зная еще, что некоторые основы я изучил весьма посредственно, мы двинулись дальше. Мне предстояло пройти 4 базовых курса на Codecademy: Ruby, Html, CSS и SQL (они бесплатные, поэтому очень рекомендую их пройти, если вы так же, как и я, решили изучать Ruby). И вот тут из-за моей первой ошибки, я ее допустил снова: не пытался разобраться, как работают те или иные методы, как и когда лучше использовать их. Но, к сожалению, мы опять не заметили этой ошибки (сугубо моя вина, так как товарищ был загружен на своем рабочем проекте и не мог постоянно отвлекаться на меня, к тому же, я не задавал никаких вопросов, поэтому ему, как и мне, казалось, что я все понимаю). После этого, мы думали, что я готов к следующему шагу, и теперь поговорим о нем.

Фреймворк Rails и последняя незамеченная ошибка

Мне предстояло познакомиться наконец с самим фреймворком Rails и начать писать свой первый проект. Я прочитал все статьи по рельсам, которые сбросил мне товарищ и собирался начинать изучать книгу Agile Web Development with Rails 6, по которой я бы и написал свой первый проект на рельсах. Но на статьях по основам рельсов я опять допустил эту вопиющую ошибку (мое лицо должно быть уже красным от количества граблей, на которые я наступил во время обучения). К сожалению, я шел по книге и мне казалось, что все не так уж и сложно, мне все понятно, все получается (конечно получается, ведь я читал и переписывал то, что было в книге) и я закончил свой первый проект. Неожиданно для меня, меня пригласили на мое первое собеседование (периодически я откликался на вакансии, вдруг повезет)

Первое собеседование

Мы договорились о времени и дате и в назначенный час началось мое первое собеседование. Не буду врать - волновался я очень сильно. Собеседование проходило в 3 этапа: общая часть, техническая часть и английский. Общую часть проводила Hr-менеджер и в принципе ничего сложного в ней не было. Техническую часть проводил тимлид, в команде которого при успехе я бы и работал. Сразу дам вам совет: обязательно записывайте все вопросы, которые у вас спрашивают. 30-40 % вопросов будут и на других собеседованиях, к тому же так легче определить, что вы изучили, а что нет. На какую-то часть вопросов я ответил, на какую-то - нет, но я думал, что их разберу подробнее на практике. Затем был английский, его проверял директор, к счастью, там все было отлично. Все друг друга поблагодарили и договорились связаться через неделю, чтобы обсудить результаты. Спустя неделю мне ответили, что не могут на данный момент сделать мне оффер, но договорились оставаться на связи и в случае чего пообщаться еще раз (стандартная практика, как я понял в дальнейшем, но мы так больше и не связывались). Но, хоть я и не получил заветную работу, я ни капли не расстроился. Ведь я получил опыт и узнал, что именно нужно подтянуть (а это были лишь 10 % от всего, что на самом деле нужно было заново изучить, как я узнал далее). Поэтому при любой возможности ходите на собеседования, даже если уверены, что вас не возьмут. На собеседованиях также учатся.

"Коммерческий" проект и последствие моих ошибок

Знакомый моего товарища хотел сделать сайт для своего бизнеса, поэтому попросил моего друга помочь ему с этим, а он в свою очередь подтянул меня, мол, опыт, плюс тут еще и работа в команде. Я с радостью согласился, ведь опыта много не бывает, плюс изучу новые технологии, а это приблизит меня к моей цели, к тому же обещали n-денег, а товарищ сказал, что всю сумму отдаст мне, так как ему не так сильно надо, как мне (на носу была свадьба, плюс было пару кредитов, которые было бы неплохо закрыть). На тот момент я уже полгода изучал ruby и его фреймворк, поэтому мне казалось, что проблем не должно возникнуть. И мы приступили к работе: обсудили, что должно быть на сайте, какие технологии и для чего будем использовать, кто что будет делать и тому подобное. Сроков никаких не было, так как заказчик понимал, что мы оба работаем и будем делать, когда будет такая возможность. Поэтому, если какую-то технологию не знаю, смогу спокойно изучить, а затем и применить. Мы сделали борду в Trello, чтобы структурировать наши задачи, и приступили непосредственно к разработке. Поначалу никаких проблем не возникало. Может у меня и были пробелы в знаниях, но такие базовые вещи, как создать проект, подключить нужные гемы (гемы в руби - это библиотеки, которые подключаются для использования тех или иных технологий), залить все на GitHub и пушить в нужные мне ветки, я мог сделать. Затем я начал писать какие-то базовые вещи и, когда что-то не получалось, спрашивал у товарища, как это исправить. Сначала это казалось нормально, ведь опыта еще совсем мало. Тем более задавать вопросы - можно и нужно. Но когда я начал задавать вопросы по каким-то базовым вещам, мой друг насторожился. Ведь я читал про них, а вопросов у меня не возникало. И тут он решил поспрашивать меня по абсолютно базовым вещам... Как вы могли догадаться, я ответил лишь на маленькую часть этих вопросов. И тут мы поняли, что еще совсем рано мне браться за такие вещи. Мне нужно заново изучать все эти базовые аспекты, ведь на том количестве знаний я далеко не уеду. И я начал все по новой.

Первые шаги 2.0

Я начал все обучение с нуля, только уже я старался не повторить своих ошибок. Я начал пытаться разбираться в основах более подробно: если что-то мог сам понять, то изучал самостоятельно, а если нет - обращался к товарищу с вопросами. Некоторые моменты я все равно понимал не до конца, но эти моменты я бы разобрал подробнее как раз тогда, когда бы попробовал их на практике. Когда я заново прочел все статьи по основам Ruby и заново прошел Codecademy, мой товарищ решил, что надо еще чуть более подробно изучить сам язык, прежде чем приступать к рельсам. Он сбросил мне отличную книгу Ruby Notes for Professionals, а после нее предложил мне поделать задачки на Codewars (настоятельно рекомендую, очень полезно для обучения). Касательно задач я понял следующее: если у вас не получается сейчас какая-то задача, отложите ее. Возможно, со временем вы поймете, как решить ее, либо же, решив какое-то количество задач попроще, будете готовы решить ту самую задачу, которая у вас никак не получалась. Ведь самое главное не решить самую сложную задачу или же прорешать 100500 задач, а научиться правильно использовать методы и продумывать алгоритмы. Когда я решил некоторое количество задач, мы решили, что можно продолжить изучать уже сам фреймворк. Я опять прочел статьи по рельсам (но уже стараясь вникать, как, что и почему работает) и приступил заново изучать Agile Web Development with Rails 6. Иногда, даже если не возникало никаких проблем и все было понятно, весьма полезно заново перечитывать какой-либо материал. И эта книга была не исключением. Я уже разбирался получше и мог видеть некоторые недочеты, местами даже понимал, как можно сделать ту или иную вещь получше. После этого мой друг сбросил мне еще одну книгу - Ruby on Rails Notes for Professionals. Изучив и ее, я немного еще поработал с товарищем по тому "коммерческому" проекту, но повезет, если я сделал 15 % от всей работы, в то время как мой товарищ сделал почти всю работу самостоятельно (сейчас я очень жалею, что с самого начала обучался не так, как нужно было, ибо моему другу пришлось одному делать работу за двоих, а деньги, как и обсуждали в начале, он собирался отдать мне, за что мне было стыдно вдвойне, но он меня этим очень сильно выручил, чем я ему безумно благодарен и вряд ли когда-нибудь рассчитаюсь с ним за это, ведь не в деньгах дело, а в самой ситуации). Поэтому лучше выявлять пробелы в знаниях как можно раньше и сразу же их закрывать.

Второе собеседование и проект "сделай сам"

Меня пригласили на уже второе собеседование, причем я не откликался на вакансию этой компании. Я с удовольствием согласился. Оно было проще, чем мое первое собеседование. Его проводила только Hr-менеджер. Мы пообщались на общие вопросы, она проверила мой английский и затем рассказала о специфике их компании. Еще до конца собеседования я знал, что не пойду к ним работать (было много очень мутных моментов, о которых я, из вежливости к ним, не буду говорить). Но меня заинтересовало следующее: у них нет технического собеседования, но есть тестовое задание. Выполнишь - берут на работу. Я изучил его, увидел много технологий, которые просят использовать (большинство из них я еще не использовал, а о некоторых даже не знал), и решил: а почему бы мне не написать свой проект, изучив эти технологии? Я вежливо им ответил, что на данный момент не готов рассмотреть их предложение, и сразу же принялся думать, как и что мне сделать. Составил план действий, проконсультировался с товарищем о правильности моих решений касательно этого проекта и принялся за разработку. На разработку у меня пошло чуть более 2 недель. Пока я его делал, я сходил еще на два собеседования, но уже не буду о них писать, так как ничего нового там не было. Но знаний с каждым становилось все больше (на последнем собеседовании я ответил на 70 % вопросов). Во время разработки проекта мой товарищ лишь изредка мог подсказать мне, как поправить тот или иной баг, и периодически смотрел, правильно ли у меня все в коде (к сожалению, он был очень загружен по работе, и не мог уделять мне много времени, но зато я научился самостоятельно разбираться с технологиями и думать, что и как лучше сделать). На этом проекте я очень сильно прокачал свои знания, пополнил свое портфолио и стал уверен, что заветная работа программистом уже не за горами.

Подведение итогов

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

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

  • Старайтесь сразу до конца разбираться с той или иной темой (много уже об этом говорил, поэтому повторяться не буду).

  • Лучший язык для старта - английский.

  • Ходите по собеседованиям при любой возможности. Чем больше их будет, чем лучше для вас.

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

  • Не пытайтесь ухватиться за любую вакансию. Лучше поискать работу подольше, чем идти в компанию, которая вам вовсе не нравится.

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

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

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

Надеюсь вам было интересно читать эту статью. Желаю всем поменьше ошибок в коде и побольше интересных проектов!




К сожалению, не доступен сервер mySQL