Написать пост

Как, изучив основы программирования, перейти к решению сложных задач? Отвечают эксперты

Аватар Никита Прияцелюк

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

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

Многие начинающие программисты испытывают страх перед сложными задачами, боятся перейти от условного «Hello, world!» к решению серьёзных проблем. Как побороть этот страх? Узнаем у экспертов.

Опираясь на свой опыт, могу сказать, что одной внутренней мотивации для роста недостаточно. Многим программистам нужна мотивация извне, чтобы «сорвать оковы». Новые задачи вызывают естественный страх — у человека ещё нет алгоритма решения и ему тяжело сформулировать чёткую цель. А без конкретных рамок, увы, далеко не у всех получается эффективно выполнять задачи.

Нашей команде в работе с новичками-разработчиками помогают небольшие задачи с понятными дедлайнами. Так junior программисты быстрее и «безопаснее» знакомятся с платформой и постепенно избавляются от страха или нежелания принимать решения. Если представить, что новичок преодолевает гору новых задач, то понятные измеримые метрики станут надёжными выступами, о которые можно опереться. Дедлайны — ещё один стрессовый и для новичков, и для опытных программистов фактор. В условиях ограниченного времени умения и навыки прокачиваются намного эффективнее, проявляется решительность. Но если мы хотим, чтобы новичок быстрее освоился в команде, нельзя зацикливаться только на них — важную роль играют поддержка команды и менторство.

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

Работая над проектом, новичок постоянно контактирует с коллегами, перенимает опыт и установленные «правила игры». Принимая решение за решением, соглашаясь с последующей ответственностью, новичок сам не успевает заметить, как становится специалистом совершенно другого уровня.

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

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

Этап 1. Тренироваться на простых задачах

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

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

Этап 2. Написать что-то своё и выложить это в открытый доступ

Что же делать после того, как вы уже освоились с написанием простых программ? Если вы хотите получить больше навыков работы с самыми популярными фреймворками выбранного языка программирования, нужно дополнить теорию практикой! Самый очевидный путь — использование одного из шаблонов при написании типового приложения.

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

Когда создадите проект, выложите его на GitHub (не забудьте добавить описание в README.md). При дальнейшем трудоустройстве вы сможете показать этот проект работодателю — наличие даже простого проекта в портфолио будет лучше, чем его отсутствие.

Этап 3. Наконец-то устроиться на работу

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

И самое главное — будьте целеустремленными! Как говориться, дорога возникает под шагами идущего.

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

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

К тому же, такой мини-проект отлично покажет начинающему программисту его пробелы в образовании.

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

Участие в open-source проекте прибавит знаний о правильно организованном процессе разработки, научит работать с системами отслеживания ошибок и т. п.

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

Компетентность в программировании, как и в любом другом направлении, можно условно разделить на 4 уровня:

  1. Неосознанная некомпетентность — когда вы не знаете, как делать правильно, и не понимаете это.
  2. Осознанная некомпетентность — когда вы не знаете, как делать правильно и понимаете это.
  3. Осознанная компетентность — когда вы знаете, как делать правильно.
  4. Неосознанная компетентность — когда правильные действия выполняются на «автопилоте» без обдумывания каждого шага.

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

  1. Продолжать обучение по выбранному направлению. Сейчас существует очень много курсов по разным технологическим стекам на разных уровнях от новичка до эксперта. Очень много вариантов для дистанционного обучения в Интернете (лично я советую рассмотреть такие сервисы как, например, Udemy или Coursera).
  2. Найти себе наставника. Важно найти одного или, ещё лучше, несколько более опытных людей, с которыми вы сможете советоваться и обсуждать, куда именно вам надо двигаться дальше. Это могут быть как ваши знакомые из различных IT-сообществ, так и коллеги на работе.
  3. Решать практические задачи. Я убежден, что для всестороннего развития одного обучения недостаточно, и важно параллельно с обучением устроиться на начальную позицию разработчика и заниматься решением практических задач. Здесь, на мой взгляд, необходимо правильно договориться с работодателем о том, как будет организована ваша работа и развитие в компании: а) какой у вас будет план развития от младшего до среднего или старшего разработчика; б) кто и как из более опытных коллег будет контролировать результаты вашей работы и советовать, что нужно доработать. Очень часто начинающих разработчиков в IT-компаниях бросают один на один со сложными техническими задачами и смотрят: «выплывет или нет». Такой подход, по моему мнению, в корне неправильный и никого не приведёт к хорошим результатам.
  4. Получить высшее образование по специальности. Если у вас непрофильное образование — идеальный, на мой взгляд, вариант в совокупности с предыдущими пунктами получить высшее образование по технической специальности. Я считаю, что есть существенная разница между тем, чтобы отдельно изучать язык программирования, и тем, чтобы в комплексе узнать, что в жизни не всё так просто, как кажется. Московские вузы, которые дают отличную техническую базу: Высшая Школа Экономики, МГУ, МФТИ, МГТУ и МИФИ.

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

После «Hello, world!» всегда следует вопрос: «Что делать дальше?». А дальше есть два варианта: учиться решать сложные задачи снизу вверх или сверху вниз.

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

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

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

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

  1. Выберите сферу разработки, которая вас больше всего интересует в данный момент (веб-сайты, мобильные приложения, игры, бизнес-приложения, Data Science, искусственный интеллект и т. д.) При выборе нужно также учитывать специфику языка, потому что язык программирования чаще всего подходит не для каждой сферы.
  2. Выберите IDE, в которой наиболее комфортно работать.
  3. Выберите подходящие библиотеки / фреймворки в соответствии с выбранной сферой. 3–5 библиотек для начала будет достаточно. Возможно, также потребуется изучение дополнительных языков. Например, если планируется работа с реляционными базами данных, то нужно будет изучить один из диалектов языка запросов SQL (рекомендую порешать задачи на этом сайте). Параллельно неплохо бы изучить хотя бы самые простые команды оболочки операционной системы, в которой вы работаете или для которой будете писать приложение.
  4. Поищите статьи, видеоуроки или курсы, в которых содержатся начальные сведения о выбранных библиотеках, а также разбираются несложные примеры или даже небольшие проекты для сферы разработки, выбранной в пункте
  5. Разберите и изучите команды, встречающиеся в проектах или примерах из пункта 4. Для этого подойдёт документация по библиотекам, а также статьи по ним на других ресурсах.
  6. Попробуйте повторить примеры или проекты из пункта 4. Добейтесь того, чтобы они заработали. Также учитесь писать программы, состоящие из нескольких файлов, разберитесь, как они связаны между собой.
  7. Если в языке, который вы изучаете, используется ООП (объектно-ориентированное программирование), изучите его основы именно для этого языка. Если же в этом языке больше в ходу функциональное программирование, почитайте про него.
  8. Попробуйте внести улучшения в изученные примеры или проекты или даже полностью перепишите их с нуля.
  9. Изучите азы Git, а также заведите аккаунт на GitHub.
  10. Найдите идею для собственного проекта и начните работу над ним, выкладывая его версии на GitHub.
  11. Параллельно с работой над проектами изучайте алгоритмы и структуры данных, а также алгоритмы, характерные для выбранной сферы разработки.
  12. Для дальнейшего развития имеет смысл получить опыт в рабочей обстановке, так как для программиста важно не только самостоятельно развиваться, но и получать живой опыт, взаимодействуя с коллегами-программистами.

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

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

А ещё лучше такие задачи решать не одному, а в компании единомышленников. Соревновательный эффект и помощь друзей — это очень сильные факторы, которые помогут сделать первые шаги в решении сложных задач.

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

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

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

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

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

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

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

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

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

Главное — не бояться отказов и пробовать свои силы раз за разом.

Переход от простых задач к сложным существует в любой отрасли, и IT в этом процессе ничем не отличается.

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

Начинать легче с простых багов и переходить к фичам. Чтобы побороть страх, нужно делать как можно больше задач. Тут важна и поддержка коллег. Лучше, чтобы на начальном этапе был ментор, но можно обратиться к Google.

Также важно понимать, что сложную задачу всегда можно разбить на более мелкие подзадачи.

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

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

Начнём с декомпозиции. Что принципиально должен уметь блог в виде минимального прототипа?

  • Мы должны уметь смотреть посты;
  • Мы должны быть способны логиниться;
  • Мы должны уметь делать и удалять посты.

Теперь давайте подумаем, что нам нужно для реализации этих фич.

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

Сначала бэкенд. Мне нужно выбрать какую-нибудь СУБД для хранения моих постов в блоге и бэкенд-фреймворк, мне нужно реализовать систему авторизации любым способом, который я придумаю, и мне нужно реализовать простое API, чтобы собственно делать и получать посты со стороны клиента. Включаем волшебную Google-машину и смотрим, какие СУБД есть и какие в них плюсы и минусы, какие фреймворки существуют, и как можно организовать авторизацию и API. После поисков мы выбираем MySQL, потому что нам нужно что-то предельно простое и заезженное, Express в качестве фреймворка (ищем в Google-машине Express MySQL tutorial/example), делаем авторизацию через куки (ищем Express authorization cookie tutorial/example) и организуем API в стиле REST (Express REST tutorial/example).

Теперь мне нужно написать на React’е (потому что на чём же ещё?) морду к моему блогу, что тоже довольно легко сделать, поскольку Интернет ломится от туториалов по данному вопросу (что гуглить, я думаю, вы сами догадаетесь).

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

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

P. S. Без знания английского языка всё сильно сложнее, поэтому перед всем вышеперечисленным стоит выучить его хотя бы на уровне Intermediate.

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

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

Даже самый простой подход к планированию поможет. Сначала следует наметить границу, где задача завершается («Как я пойму, что я достиг цели?»). Потом декомпозировать её на подзадачи. И ключевые подзадачи, связанные с осязаемым промежуточным результатом, выделить как майлстоуны. В этих точках важно показать текущий прогресс, получить обратную связь, скорректировать ход разработки.

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

Развитие коммуникативности и самоорганизации наравне с техническими навыками — это общий подход, который поможет комфортнее перейти от «Hello, World!» к решению сложных проблем. Но, к сожалению, полноценно справиться со страхом новых задач новичку не поможет ничего. Только набив шишки понимаешь, что ничего страшного не произошло. Только увидев разработчиков разного уровня понимаешь, насколько фобии в программировании надуманы. Поэтому основной совет — это просто писать код как можно чаще и уделять время методической работе и рефлексии.

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

Итак, как перейти к решению сложных задач?

  • Учитесь декомпозировать задачу на простые составляющие.
  • Поставьте себе задачу написать какую-нибудь полезную программу. Обложитесь материалами для изучения нужных технологий и закрепляйте знания на практике в процессе создания вашего проекта.
  • Если вы хорошо разбираетесь в технологии, то можно попробовать разобраться в коде людей, которые пишут сложные проекты с её использованием.
  • Не стесняйтесь просить помощи у коллег и Интернета — нельзя знать всё и вся, тем более будучи новичком.
  • Попробуйте найти какой-нибудь open-source проект и внести свой, пусть даже если и небольшой, вклад.
  • Продолжайте учиться и решать практические задачи.

Напоминаем, что вы можете задать свой вопрос экспертам, а мы соберём на него ответы, если он окажется интересным. Вопросы, которые уже задавались, можно найти в списке выпусков рубрики. Если вы хотите присоединиться к числу экспертов и прислать ответ от вашей компании или лично от вас, то пишите на experts@tproger.ru, мы расскажем, как это сделать.

Следите за новыми постами
Следите за новыми постами по любимым темам
19К открытий19К показов