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

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

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

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

Неделя#28. Надо брать себя в руки...

Пт, 17 Ноября 2017

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

Всем привет!

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

Все это время я в основном продолжал заниматься тем же, что и раньше: проходил одно за другим задания с сайта LeetCode и наполнял свой репозиторий на гитхабе рабочими решениями. Дело, конечно, важное и нужное, и польза от этого, несомненно, есть и я ее отчетливо ощущаю. Во-первых, я чувствую, как оттачиваются мои навыки кодинга. Все меньше приходится задумываться о синтаксисе. Всякие там циклы, filter-map-reduce’ы с forEach’ами и прочие стандартные методы выходят практически на автомате и мне уже не нужно каждый раз заглядывать в справочник, чтобы вспомнить в каком порядке расставлять аргументы и все такое. Теперь мое внимание главным образом сосредоточено на самой задачи и ее решении, а не на второстепенных вещах, таких как синтаксис языка.

Но конечно же, это не самое главное. Ведь смысл решения подобных заданий заключается не в том, чтобы научиться быстро и безошибочно кодить. Этот навык рано или поздно придет в любом случае, даже если не прикладывать к этому особых усилий. Если повторять одни и те же действия как попугай изо дня в день, то в конце концов можно превратиться в ходячий интерпретатор языка, но при этом по прежнему не уметь мыслить как программист и правильно подходить к решению проблем. Главная же идея (имхо) заключается в том, чтобы научиться мыслить алгоритмически, поглубже познакомиться с различными структурами данных и знать в каких случаях более целесообразно применять ту или иную из них. И в этом плане я тоже замечаю кое-какие сдвиги. Например, если раньше, прочитав задание, я сразу же кидался в бой и прямо с ходу пытался получить что-то более-менее рабочее и уже потом плясать от этого до победного конца, то теперь я обычно начинаю с анализа: продумываю примерный алгоритм, на котором должно основываться решение, заранее решаю, какие структуры данных мне для этого понадобятся, например: очередь или стек, реализованные при помощи массива, ассоциативный массив (представленный в JavaScript’е объектами) или же я в принципе могу обойтись одними лишь простыми типами данных, стандартными методами и переменными. Если задача достаточно сложна, то обычно вначале я пытаюсь запечатлеть свой ход мыслей на бумаге (обычно в итоге получается малопонятная внешнему наблюдателю мешанина из псевдокода на разных языках, стрелочек, схемочек и т.п., но главное, что самому все понятно :))

Еще одна вещь, с которой я столкнулся впервые только на LeetCode — это вопрос эффективности. Например, часто бывает так, что написал, вроде бы вполне рабочее, короткое и красивое решение, нажимаешь кнопку Submit и внезапно оказывается, что на каком-нибудь массиве из 50000 элементов твое решение не проходит временной лимит. Приходится заново продумывать и переделывать свое решение таким образом, чтобы оно работало быстрее. Иногда это может здорово выбесить, особенно если над этим заданием ты ломаешь голову уже не первый день, но когда, наконец, удается победить и это условие - результат того стоит.

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

Исходя из этих соображений, решил, что теперь сосредоточу свои силы именно на полноценных проектах, которые можно в каком-то смысле потрогать, пощупать и порадоваться результату их работы. Для начала думаю пройти какое-то количество туториалов, в ходе которых с нуля пишешь готовое полноценное приложение, использующее полный стек веб-технологий. Подход к учебе на основе примеров мне всегда очень нравился и в прошлом он уже приносил лично для меня неплохие результаты. Я считаю, что этот метод работает эффективно потому, что, как гласит известная поговорка: лучше один раз увидеть, чем сто раз услышать. Можно месяцами и годами решать “сферические задачки в вакууме”, превратиться в этом деле в настоящего аса и победить все олимпиады в мире, но при этом абсолютно не понимать принцип работы простого сайта и того, как различные технологии должны взаимодействовать между собой для того, чтобы из них получилось готовое приложение. В то же время, иногда достаточно один-два раза увидеть своими глазами полную картину для того, чтобы “схватить” общий принцип и дальше уже дело только за практикой. Поэтому я решил, что для начала пройду несколько таких готовых примеров, где используются как бекендовые, так и фронтендовые технологии, демонстрируется работа с базами данных и все такое. А после того, как в голове более-менее вырисуется общая картина - буду продолжать работать уже над собственными небольшими пет-проектами, отталкиваясь от этих примеров. Пару свежих идей на этот счет у меня тоже уже имеется, но пока что это только общие идеи, которые еще предстоит развить и детально продумать.

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

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

Неделя#26. Ушел на базу, вернусь не сразу) Неделя #30. Пост боли


leetcodeпрактика Share Tweet +1