# Выбор учебного проекта

Как уже было сказано в главе [programmirovanie-eto-reshenie-prikladnykh-zadach](../s-chego-nachat/programmirovanie-eto-reshenie-prikladnykh-zadach "mention"), важно не просто изучить конструкции языка, а научиться их применять для создания реальных программ, приносящих реальную пользу. Поэтому оптимальным путем изучения программирования является разработка учебного проекта параллельно с изучением.

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

Помимо правильного мышления, вы также получите и мощный заряд мотивации. Когда вы сможете установить на свой смартфон (например, если вы выбрали разработку мобильных приложений как [желаемое направление](../s-chego-nachat/kakoi-yazyk-programmirovaniya-uchit-pervym)) сделанное своими руками приложение, а потом и реально использовать его для упрощения ваших повседневных задач - это даст вам большой заряд уверенности в себе и желания продолжать.

### Каким должен быть учебный проект

Выбирая учебный проект для изучения, стоит учитывать следующие факторы:

* Проект не должен быть слишком простым, он должен покрывать много тем. Чтобы попрактиковаться в отдельных фичах языка вполне сгодятся небольшие тестовые задачи, которые есть во многих самоучителях. Они решаются в пять-десять строк, позволяют отработать одну-две концепции языка. Но не дают реальных практических навыков решения сложных задач. И не дают мотивации, так как практическая польза их неочевидная, теряется цель всего обучения.
* Проект не должен быть слишком сложным. Попытавшись взяться за задачу, сильно превосходящую ваши навыки (и требующую в реальности не одного новичка, а команду из 5-10 опытных разработчиков, год времени и несколько миллионов долларов), вы рискуете не справиться, получить серьезный удар по самолюбию и заработать ненависть к занятиям программированием.\
  Типичная ошибка, например, когда начинающий разработчик компьютерных игр берется за масштабный проект типа 3D MMO RPG. Или нового GTA, или Minecraft, или иной крупной игры. Тогда как на самом деле правильный путь для входа в геймдев - это что-то вроде "крестики-нолики - змейка - 2D платформер". Хорошо эта тема с новичками и MMO RPG разобрана в статье [https://gamedev.ru/gamedesign/articles/killer\_mmorpg\_guide](https://gamedev.ru/gamedesign/articles/killer_mmorpg_guide)&#x20;
* Проект должен доставлять удовольствие или пользу именно вам.
* Проект не должен быть чем-то очень экзотическим, вполне нормально сделать что-то, что уже сто раз сделано другими. Зато у вас будет доступ к готовым материалам, урокам, статьям в блогах людей, которые уже делали подобный проект, в которых вы сможете подчерпнуть идеи и решения, если вдруг застрянете.

### Идеи проектов

Поскольку в этом разделе книги мы рассматриваем именно развитие в Java Enterprise разработчика, то и проекты тут перечислим те, которые могут быть реализованы в виде веб-сервисов на Spring. Для идей в других сферах вы можете поискать в гугле что-то типа "training project ideas" или "pet project ideas", добавив ключевые слова по выбранным вами технологиям.

#### Простые клоны существующих популярных веб-сервисов

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

Для полноценных веб-приложений с пользовательским интерфейсом вам придется изучить еще немного веб-фронтенд: HTML/JS/CSS, основы верстки и веб-фреймворков. Это может принести дополнительные сложности, но сделает вас более востребованным разработчиком (довольно часто в небольших компаниях бэкенд-разработчик должен хотя бы минимально разбираться в веб-фронтенде)\
Примеры таких проектов:

* Классика - список задач, TODO List. Очень популярная и простая идея для тестового проекта, существует миллион вариантов на разных языках и технологиях (например, [вот сайт](https://todomvc.com) для сравнения разных JS фреймворков на примере одного и того же TODO приложения). По запросу "Spring Boot TODO app" можно найти множество гайдов, например [https://medium.com/@saitanujm/a-step-by-step-guide-todo-app-using-spring-boot-rest-react-js-b11397f39c7](https://medium.com/@saitanujm/a-step-by-step-guide-todo-app-using-spring-boot-rest-react-js-b11397f39c7)
* Простой интернет магазин с витриной товаров, формой заказа. Если вдруг вы промышляете каким-нибудь ремеслом и продаете результаты своего труда - это может стать неплохим практическим приложением такого проекта. Пример такого проекта на Spring - [https://www.baeldung.com/spring-angular-ecommerce](https://www.baeldung.com/spring-angular-ecommerce)
* Простой движок для блога. Да, в 2022 году отдельные блоги встречаются уже не так часто, большинство давно перебралось в соцсети и мессенджеры, но как практическая задача для изучения создания веб-сервисов это по-прежнему хороший вариант. [https://programmingtechie.com/2019/03/17/how-to-build-a-simple-blog-application-using-spring-boot-and-angular/](https://programmingtechie.com/2019/03/17/how-to-build-a-simple-blog-application-using-spring-boot-and-angular/)

#### Автоматизация каких-либо бизнес-процессов

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

* Веб-скрейпинг. Скачивание данных с различных веб-сайтов, парсинг HTML кода, извлечение информации из страницы и сведение в какую-нибудь таблицу или отображение на карте.\
  Статья с примером: [https://habr.com/ru/company/vdsina/blog/537174/](https://habr.com/ru/company/vdsina/blog/537174/)\
  Большой материал по скрейпингу на Java [https://www.scrapingbee.com/java-webscraping-book/](https://www.scrapingbee.com/java-webscraping-book/)\
  Возможно множество вариантов:
  * Свой поисковик по сайтам с отелями, машинами или любым другим товаром - настройте поиск так, как нужно вам.
  * Поиск новых или интересных объявлений на Avito или аналогичных площадках. Часто интересные варианты улетают буквально в первые же минуты после публикации, успеть найти их вручную невозможно. Тут работает только софт, который раз в несколько минут скачивает объявления и при нахождении нужного вам - отправляет уведомление на почту, в мессенджер или еще куда-нибудь.&#x20;
  * Поиск и выборка новостей по ключевым словам из интересных вам источников.
* Обработка документов, заполнение форм. Вместо того, чтобы вручную вбивать кучу всяких форм, можно сделать веб-страницу с необходимыми полями, остальные рассчитать или подтянуть автоматически из сторонних источников, сделать вывод в PDF для отправки на печать. К этому можно добавить сохранение заполненных форм в БД, просмотр истории, вывод какой-нибудь статистики и т.п.\
  Помню, как-то в ГИБДД наблюдал, как инспектор вручную вбивает данные в вордовом документе, затем отправляет его на печать, потом стирает данные предыдущего человека и мучительно медленно заполняет их снова (при том что половина полей там шаблонные, и должны были бы выбираться из списка в два клика). Вот такое можно было бы легко автоматизировать, сократив время ожидания посетителей в очереди.
* Финансовые операции. \
  Если вы торгуете на бирже - можете сделать своего бота, который будет торговать за вас. Статья про работу через Tinkoff Invest API в Java - [https://habr.com/ru/post/592093/](https://habr.com/ru/post/592093/)\
  Если вам регулярно нужно рассылать множество мелких платежей разным людям - можно использовать какой-нибудь платежный шлюз наподобие [https://developer.qiwi.com/ru/payout-payment/#about](https://developer.qiwi.com/ru/payout-payment/#about), сделать приложение, которое возьмет из БД данные получателей и с указанной периодичностью будет рассылать им платежи.

#### Чат-боты

Это хороший вариант, так как не требует изучения довольно объемной темы создания пользовательских интерфейсов на HTML+JS, тут весь интерфейс за вас рисует мессенджер.

&#x20;Из популярных мессенджеров сейчас самое простое и удобное API есть у Telegram.\
Про Telegram Bot API можно в общем почитать тут [https://habr.com/ru/post/543676/](https://habr.com/ru/post/543676/), а про создание бота на Java - [https://habr.com/ru/post/528694/](https://habr.com/ru/post/528694/) или в [https://javarush.ru/groups/posts/2959-sozdaem-telegram-bota-s-ispoljhzovaniem-spring-boot](https://javarush.ru/groups/posts/2959-sozdaem-telegram-bota-s-ispoljhzovaniem-spring-boot)

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

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

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

#### Свой проект

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

Подумайте, когда в последний раз вы делали что-то за компьютером и ловили себя на мысли, что вас это уже задолбало? Что это неудобно, долго, много повторяющихся действий. Возможно, именно там вы найдете идею, и кто знает, может из нее даже вырастет потом что-то, что не стыдно будет и продать другим людям. Ведь именно так, сперва с удовлетворения личных нужд,  появилось множество различных популярных проектов, например [MailChimp](https://habr.com/ru/company/skillfactory/blog/535928/) или [GitHub](https://habr.com/ru/post/122035/).\
&#x20;

