• Главная
  • О сайте
    • С нуля до работы photo

      С нуля до работы

      Блог о продвижении новичка к профессии программиста

    • Подробнее
    • Email
    • Twitter
    • Facebook
    • LinkedIn
    • Github
  • Посты
    • Все посты
    • Все теги
  • RSS
  • Проекты

Неделя#25. Первое тестовое задание.

Пт, 27 Октября 2017

Время прочтения ~11 минут

Всем снова привет!

На этот раз вот уж действительно: задержался с выходом нового поста — так задержался :) Но на это были свои причины. Во-первых в те дни, когда я обычно начинаю подготавливать пост, у меня вообще не было свободной минутки. Работа, домашние дела и всё такое. Ну а потом случилось нечто такое, что перевернуло весь мой привычный жизненный уклад и вообще выбило из колеи. И для того, чтобы прийти в себя и снова взять себя в руки, мне понадобилось еще пару дней. Ну и от работы на заводе, к сожалению, никуда не денешься. В общем, раз уж такое дело — решил, что лучше теперь всегда буду публиковать новые посты в конце недели, а не в начале, поскольку так реально намного удобнее. И как я раньше до этого не додумался! ))

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

Однажды вечером в одном из каналов в слаке Хекслета некто опубликовал ссылку на вакансию удалённого сотрудника в одном израильском стартапе с довольно неплохими условиями и поинтересовался: в чём тут подвох, ведь не может же всё быть прямо так идеально). На самом деле, никакого подвоха здесь не было, компания действительно довольно известная и крутая, в чем можно убедиться, глядя на инстаграмм или почитав корпоративный ДНК. Поскольку офис компаниии расположен в часе-полтора езды от моего дома, а искали как раз таки JS-разработчика (хотя и далеко не джуниора, судя по требованиям), я решил всё же попытать счастья, впрочем, не питая особых надежд, и отправил письмо со своим резюме по адресу, указанному в вакансии. В сопроводительном письме (кстати, на русском языке) я вкратце рассказал о себе, примерно описал свой нынешний уровень, дал понять, что до синьора мне, конечно, еще далеко, но может быть, компания может приютить убогого за хлеб и воду заинтересована в том, чтобы нанять свежего джуна без опыта работы, но с огромной мотивацией, готового учиться и выкладываться на 200%.

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

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

В назначенный час я связался с рекрутером и получил по почте ссылку на документ Google Docs, в котором уже содержались условия заданий. Выполнять задание нужно было там же, без использования редакторов кода, копипасты и любых других вспомогательных средств, поскольку работодателю важно видеть мой рабочий процесс и ход моих мыслей. Всего заданий было 2, и на прохождение обоих давалось всего полчаса (потом добавили еще 20 минут дополнительно).

В первом задании нужно было реализовать функцию, проверяющую правильность скобочной последовательности (для трёх видов скобок) в переданной строке. Задание, в принципе, не такое уж и тяжёлое, на Хекслете решал и посложнее, но учитывая обстоятельства: волнение, наблюдение за моими действиями, отсутствие привычного редактора и очень ограниченное время на выполнение, мой уровень стресса в этот момент просто зашкаливал. Первые минут десять я просто сидел, как остолбеневший в полном шоке от происходящего и пялился в экран, хаотично перебирая в уме варианты того, с какой стороны вообще подступиться к задаче и время от времени пытаясь что-то накалякать карандашом на листке бумаги. Потом всё же опомнился и взял себя в руки. Я уже понял, что за такое время написать рабочее решение будет нереально, но нужно было показать работодателю хотя бы какой-то ход мыслей, поэтому я принялся судорожно печатать всё, что в этот момент приходило мне в голову, пытаясь успеть выстроить хотя-бы какой-то каркас моего будущего решения. На самом деле подобная задача решается при помощи обыкновенного стека и впоследствии я вполне благополучно справился с ней (хотя, конечно, и не за полчаса, а где-то за час-полтора, вместе с тестами). Но во время выполнения задания меня почему-то понесло в сторону автоматного программирования и вместо простого складывания в стек открывающих скобок и последующего сравнения с закрывающими, я принялся реализовывать конечный автомат и в ужасе понял, что за оставшиеся 15 минут все возможные его состояния мне уже точно не продумать. Поэтому решил попытать счастья со второй задачей.

Второе задание заключалось в том, чтобы отрефакторить некую функцию, состоящую из 300 с лишним символов и 35 строчек кода таким образом, чтобы в итоге она занимала 5 строк и 50-60 символов. На самом деле, при дальнейшем рассмотрении в спокойной обстановке, это тоже оказалось довольно просто. И с применением синтаксиса ES6, мне удалось передать всё то же самое всего навсего в одной строчке :) Всё, что для этого было нужно - это просто понять, как работает данная функция и какой она должна возвращать результат. Но во время теста времени на это у меня не было и всё, что я смог сделать на тот момент, это только убрать ненужные “элс-ифы”, какие-то скобочки, поменять вары на консты (зачем???). В общем, понял, что занимаюсь какими-то полнейшими глупостями и это точно не то, что от меня требуется, поэтому забил и вернулся к первому заданию, пытаясь успеть хотя бы что-то.

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

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

Сразу же, после завершения “собеседования” я пошёл в слак, чтобы обсудить произошедшее со своими учителями и более опытными однокурсниками. Очень хорошо пообщались и я вынес из этого общения много выводов для себя. Одним из основных и самых ценных стало для меня замечание Кирилла о том, что на самом деле, если контора действительно хорошая (а в моём случае, я уверен, что это действительно так), то при рассмотрении моей кандидатуры их будет в первую очередь волновать не моё знание всяких там баз данных с jQuery и экспрессами, а именно моё умение решать алгоритмические задачи, а также способность сохранять хладнокровие и мыслить трезво в стрессовых ситуациях. А для того, чтобы научиться этому — есть только один способ: решать как можно больше таких-вот олимпиадных задачек и делать это до тех пор, пока не стану щелкать их как семечки.

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

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

Кстати, на прошлой неделе таки зарегистрировался на Exercism. Кто не помнит — это также сборник задачек разного уровня и для большого количества языков программирования. Но только в отличии от того же кодварса, экзерцизм, на мой взгляд, какой-то более гиковский. Как минимум, для того, чтобы начать им пользоваться, нужно уметь хоть немного пользоваться командной строкой и npm-ом, понимать как работают и подключаются тесты, устанавливаются зависимости, ну и вообще: в целом знать как устроен типичный нпм-овский пакет. Поскольку для меня все эти сакральные знания уже не являются тайной, я прошёл там несколько заданий, чтобы понять: что к чему. Тоже по-своему прикольно. Думаю, задания отсюда тоже имеет смысл порешать для прокачки. Ну а пока вот ссылка на мой почти пустой профайл на сайте.

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

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

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

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

Реляционная модель данных

В последнее время в связи с постоянно растущими объёмами данных и потребности в масштабируемости также набирают популярность разнообразные подходы к построению баз данных не использующие в своей основе реляционную модель. Совокупность таких нетрадиционных подходов именуют NoSQL (что расшифровывается как Not only SQL).

Для создания и управления базами данных применяется специальное программное обеспечение, именуемое СУБД (система управления базами данных). Таких систем существует достаточно много, одной из самых распространённых и популярных является, например, знаменитая MySQL. В курсах Хекслета используется другая свободная объектно-реляционная СУБД с открытым исходным кодом, разрабатываемая группой энтузиастов: PostgreSQL. При этом, на том же Хекслете подчёркивается, что ни в коем случае не следует зацикливаться на изучении какой-либо конкретной СУБД, знания в этом случае придут с опытом. А вот чему действительно следует уделять внимание — это языку, на котором происходит взаимодействие с БД.

Для манипулирования данными, хранящимися в реляционных базах данных применяется специальный структурированный язык запросов — SQL (Structured Query Language, произносится “эс-кью-эл” или ещё иногда “сиквел”). SQL это декларативный язык, который на самом деле является языком программирования, пусть и не тьюринг-полным (хотя впрочем…). Поскольку SQL является декларативным языком (т.е программные инструкции в нем описывают именно что нужно сделать, а не как это сделать), фактически он имеет довольно читаемый синтаксис, практически ничем не отличающийся от обычного английского языка. Вот, например, типичный пример запроса на языке SQL:

SELECT * FROM users WHERE age IS NOT NULL

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

На самом деле SQL это обобщающее понятие и если копнуть более глубоко — можно выделить в нём целых 3 языковых подмножества различного назначения:

  • DDL (Data Definition Language, язык описания данных), служащий для описания структуры БД.
  • DML (Data Manipulation Language, язык управления данными). Именно он позволяет делать запросы и манипулировать данными, хранящимися в базе (вставка, изменение, удаление и т.п.).
  • DCL (Data Control Language). Язык, предназначенный для выполнения административных функций, связанных с БД. Вроде, как не рассматривается в рамках курса на Хекслете, ну и бог с ним :)

ссылки:

  • Базы данных: Википедия, Youtube — серия лекций от Технострим. На том же канале есть более старая серия лекций — от 2013 года. Не знаю какая из них лучше, поэтому приведу ссылки на обе. Сам смотрю более новую, 2017 года и мне очень нравится. Вместе с практикой от Хекслета заходит очень хорошо.
  • SQL (DDL/DML): wiki1, wiki2, wiki3.
  • СУБД: вики, и вики.

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

Всем всего!

Неделя #24. На распутье. Неделя#26. Ушел на базу, вернусь не сразу)


базы данныхsqlpostgresqlпоиск работытестовые задания Share Tweet +1