В изучении программирования те из Вас, кто находится на начальных этапах этого пути, наверняка заметили, что чтение книг и просмотр вебинаров по программированию не носят никакого смысла, если Вы не практикуетесь в написании кода и построении простых (пока) систем. Конечно, Вам надо много программировать, о чём я писал ранее здесь. И в этой статье я хочу поделиться с Вами своим мнением о поиске и постановке задач, а также процессе их решения.
День за днём Вы получаете всё больше информации в области IT, узнавая о новых возможностях выбранного Вами инструмента. Почти наверняка любой из выбранных Вами способов изучения имеет набор примеров реализации изучаемого подхода. Например, когда Вы изучаете объектно-ориентированное программирование, Вам обязательно расскажут о конструкторах, сеттерах и геттерах, а возможно ещё и паттернах проектирования. Проводя собеседования, я пугающе часто сталкиваюсь с ситуацией, когда кандидат вполне себе канонически реализует Singleton, учитывая особенности языка, но при просьбе написать класс-одиночку, решающий реальную задачу, у кандидата наступает ступор. Причина его проста. В подготовке к собеседованию он просто заучил реализацию, узнав даже, что Singleton неплохо решает задачу соединения с базами данных. Но вот написать тот же Singleton для работы с БД — задача, выходящая за пределы классических примеров. Она совершенно несложная, но требует практики в написании таких классов на нескольких проектах. После чего заучивание кода становится бессмысленным, ведь человек понимает смысл реализации.
Таким образом, Вы в скором времени поймёте, что даже воспроизведение «Hello, World» примеров — это всего лишь маленький шаг через порог большой технологии. И нельзя говорить, что Вы её знаете, если Вы не написали при её помощи ни одного хоть сколько значимого проекта. Реализуя ту или иную задачу Вы практикуетесь, вырабатывая навыки, понимание технологии, а также ноу-хау, благодаря которым Вы начинаете ориентироваться в технологии на эмпирическом уровне.
С Вашей стороны довольно логичным будет вопрос: «Всё это очень здорово, но где мне без опыта и наставников найти задачи, которые будут прокачивать моё знание языка?». Давайте подробнее рассмотрим, как найти для себя задачки.
Начну я с наиболее простого варианта. Если Вы обучаетесь на курсах, то у Вас есть преподаватель. Хороший преподаватель должен общаться с Вами и отвечать на Ваши вопросы. Это его работа, он получает за это деньги. Поэтому нет ничего плохого в том, чтобы попросить своего преподавателя дать Вам какую-нибудь задачку, приближенную к реальности. Это может быть тестовое задание для кандидатов на уровень Junior или Middle, какая-то задача, не слишком ориентированная на тонкости бизнеса. Так или иначе, Ваш преподаватель скорее всего сможет найти для Вас что-то подходящее. Будучи преподавателем, я сам очень уважаю людей, которые стремятся получить как можно больше полезных знаний. Так что не стесняйтесь спрашивать. Кстати, на любой страничке моего сайта Вы найдёте кнопку «Написать мне», которая приведёт Вас на форму обратной связи, через которую Вы сможете попросить для себя задачу для тренировки.
Теперь усложним ситуацию. Вы смотрите оффлайн-вебинары и связи с преподавателем у Вас нет. Та же ситуация сформируется и при самостоятельном обучении по книгам. Как быть в таком случае? Есть несколько вариантов, использовать которые разумеется можно совместно.
Наиболее приближенные к реальности задачи можно найти на бирже фрилансеров. Зайдите на любой сайт, где размещаются задания для фрилансеров (например, freelance.ru). Поищите задания с небольшой оплатой — скорее всего, они не будут очень сложными, и подойдут для начальных этапов обучения. Дальше продвигайтесь по пути усложнения. Со временем Вы сможете не просто разбирать эти задачи «для себя», но и решать их непосредственно для заказчиков, получая за это деньги. Вы ведь здесь за этим, не так ли? 😉
Такой вариант хорош, но не совсем. Его минус в том, что пока Вы не работаете с заказчиком, никто не сможет оценить выполнение Вашего кода. Вы просто делаете для того, чтобы сделать. Но и эта проблема, как оказывается, разрешима. Ранее я уже рассматривал сервисы тренировки навыков программирования. Сегодня мы посмотрим на них поближе. В качестве примера я возьму сервис
Codewars. Это сайт, на котором собирают множество задач по программированию — практические и теоретические. Но перед тем, как начать использовать этот ресурс, Вам надо будет выбрать язык программирования из списка доступных и доказать, что Вы с ним знакомы. Не пугайтесь, это несложно. Вам дадут небольшой кусочек кода и попросят найти в нём ошибку.
После регистрации и входа Вам становится доступен интерфейс решения задач (Kata). Все задачи имеют привязку к языкам программирования, а также градацию по сложности, схожую с поясами в восточных единоборствах. Самые простые имеют сложность 8 kyu, а самые сложные — 1 kyu и с 1 по 4 даны (dan). Также задачи разделены по тематическим тегам, чтобы Вы могли выбрать для себя наиболее подходящую задачу. У каждой задачи есть описание и набор автоматических тестов, которые покажут Вам, правильно ли с точки зрения логики Вами была решена выбранная задача.
Очень ценным является и то, что для каждой задачи доступны уже выполненные решения от других программистов. Не спешите смотреть в них! Тем более, что без решения они не будут для Вас доступны. Сравните их со своим вариантом после того, как все тесты для Вашего решения выполнятся без ошибок. Это отличный способ понять, какие пробелы в знаниях языка Вам необходимо заполнить. Также к каждой задаче есть вкладка обсуждения, на которой можно посмотреть мнения других программистов о постановке задачи или возможностях решения.
Решая задачи, Вы будете повышать и свой рейтинг программиста, который можно вполне сопоставлять со сложностью задачи, чтобы понять, подходит ли она для Вас. Также Вам будет доступен раздел Kumite, в котором решаются более комплексные задачи, чем в Kata. Но для начала Вам определенно стоит «прокачаться» в разделе Kata. Этому здорово способствует игровой процесс, похожий на развитие своего героя в какой-нибудь RPG.
Когда Вы станете выполнять всё более и более сложные задачи, совершенно естественным станет взгляд на какой-то ресурс в интернет с мыслью «а как бы это сделал я?». И это правильно. Но остерегайтесь больших задач. С ростом опыта Вы будете чувствовать свои силы и возможности, которые будут рисовать для Вас понимание того, что нужно сделать здесь вот такую архитектуру, а здесь ещё оповещение, а вот тут — красивое логирование. Не старайтесь решить все задачи сразу. Тогда Вы скорее всего переполните свою внутреннюю память, интерес к задаче утонет в груде задач, которые Вы для себя поставите, и работа над задачей сразу же остановится. Поэтому, приступая к масштабной работе, старайтесь в первую очередь декомпозировать (разделить) большую задачу на мелкие выполнимые задачи, затем запланировать их. Вы должны иметь чёткий пошаговый план выполнения большой задачи, чтобы понимать, в какой части пути находитесь, что ещё нужно сделать, а чего делать не стоит. Как я писал ранее, для любой большой работы важен чётко обозначенный финал. Тогда и только тогда он будет достижим.
Резюме aka TL;DR
1. Очень здорово, если у Вас есть преподаватель или наставник. Просите его поставить Вам задачу!
2. Ищите задачи там, где они будут наиболее приближены к практике. Например, на биржах фрилансеров.
3. Используйте проверенные онлайн-ресурсы, такие как Codewars.
Надеюсь, моя статья поможет Вам в поиске интересных и полезных задач. А я желаю Вам успехов в этом!
P.S.: дабы не быть голословным преподавателем, я подброшу задачку от себя для тех, кто уже освоился в мире программирования. Сможете создать Telegram-бота, который будет играть с Вами в игру-квест?
Какие задачи решать начинающему программисту?: 4 комментария
Здравствуйте. В данный момент с большим увлечением занимаюсь изучением и программной реализацией алгоритмов по курсу теория графов (http://www.mathros.net.ua/kategorija/doslidzhennja-operacij). Скажите пожалуйста, такого рода практика, в дальнейшем, мне пригодиться или нет?
Это очень классное начинание. Через такой подход Вы получаете фундаментальные знания о строении алгоритмов, учитесь мыслить как программист. Однако не забывайте и о сугубо коммерческих задачах. На первых порах они часто не связаны с глубокой алгоритмизацией. Стоит потренироваться в решении типовых задачах.
Смотрите в сторону паттернов проектирования, архитектурных шаблонов, общих стандартов.
Понятно Александр. Спасибо за ценные совет. Вы один из немногих авторов, которые вступают в диалог с читателями. Отдельное Вам за это спасибо.
Стараюсь соответствовать, спасибо 🙂