«Вторая программа» на Python¶
Начинающие программисты часто задаются вопросом - какую программу написать сразу после написания "Hello, World!"? Какая программа должна быть следующей? С одной стороны, что-то слишком простое (вроде калькулятора, который складывает два числа, введенные пользователем) будет неинтересно, с другой стороны, что-то чрезмерно сложное (вроде современного микросервиса с логами, мониторингом и масштабируемостью) будет непропорционально тяжело и скучно.
Я постарался накидать список «вторых программ», приложений, которые стоит попробовать разработать после ознакомления с базовыми возможностями языка программирования. Проекты расположены примерно в порядке возрастания сложности, и их поэтапная разработка может стать неплохим вариантом старта в профессии программиста. Часть этих приложений я постараюсь написать сам, в свободное от работы время, чтобы примерно продемонстрировать варианты подхода к разработке ПО, кажущиеся мне соответствующими поставленной задаче.
Конкретно этот список ориентирован на начинающих Python разработчиков, и в нём отсутствуют приложения с графическим интерфейсом, так как, на мой взгляд, GUI не является сильной стороной Python-разработки. Но, конечно, если вы изучаете C# + WPF/MAUI или C++/Qt, то вам стоит основательно дополнить этот список приложениями с GUI.
Итак, вот примерный список приложений, которые я вам рекомендовал бы попробовать разработать после того, как вы удачно написали, запустили и отладили ваш первый "Hello, World!":
- Игра 2048 (без графического интерфейса, на базе Command-line interface, или CLI; все игры, упомянутые ниже, также реализованы на базе CLI).
Здесь стоит сделать два небольших, но важных замечания.
Во-первых, старайтесь параллельно с изучением собственно языка программирования практиковать применение современных архитектурных подходов. Вполне возможно, что прямо сейчас такие подходы, как SOLID или CQRS, выглядят для вас несколько чужеродно и непрактично, но по мере усложнения разрабатываемого вами ПО вы будете понимать, что на самом деле в этих архитектурных принципах заложен крайне полезный опыт бывалых разработчиков. Например, уже сейчас, при написании своего первого приложения попробуйте применить на практике простейшую рекомендацию «Чистой архитектуры» — отделите логику игры от интерфейса взаимодействия с пользователем.
Во-вторых, постарайтесь делать каждый следующий проект чуточку «круче» предыдущего. Например, если ваша первая игра минимальный рабочий функционал, то во вторую добавьте, например, взаимодействие с конфигурационным файлом, который позволяет хранить достижения игрока и текущее состояние игры. Согласитесь, вам, как пользователю, было бы приятно вернуться к игре, которая после перерыва умеет восстанавливать своё игровое поле. Разобрались с конфигурационными файлами? Добавьте логгирование. Освоили логгирование? Добавьте обработку аргументов командной строки или еще какой-нибудь функционал.
- Игра Змейка (Snake).
- Игра Космические захватчики (Space Invaders).
- Игра Виселица (Hangman).
- Игра Тетрис (Tetris).
- Игра жанра «3-в-ряд», вроде Биджувэлд (Bejeweled).
- Игра Сапёр (Minesweeper).
- Игра Понг (Pong).
Разумеется, совершенно необязательно писать все эти игры. Думаю, такая задача вполне способна серьезно притушить как вашу тягу к программированию, так и любовь к компьютерным играм. Пишите то, что ближе вам по духу и вызывает интерес даже безотносительно программирования.
Синхронизатор директорий для быстрой актуализации архивных копий. Представьте, что на съёмном диске лежит ваш рабочий архив (несколько сотен тысяч файлов, десятки гигабайт информации), а на жестком диске компьютера лежат те же самые данные, но с относительно небольшим добавлением — работой, сделанной вами за несколько последних дней. Вместо того, чтобы снова копировать весь объем информации на съёмный диск, попробуйте найти новые файлы или файлы с изменёнными характеристиками (длина, время последней записи) и скопировать на съёмный диск только их.
Сделайте преобразователь изображения в Unicode ASCII Art, причем пользователь может задавать размер выходной «картинки», скажем, как «не больше 100 символов в ширину».
Язык Go, как известно, имеет мощные встроенные механизмы обеспечения асинхронной обработки информации. Попробуйте проанализировать Go Concurrency Patterns и переписать их на Python при помощи библиотеки asyncio.
Что ж, вы основательно поработали на своей локальной машине и теперь готовы к знакомству с сетевыми возможностями Python.
Обновление локальной базы данных с запросом информации у внешнего источника по API. Например, вы можете запрашивать курсы акций при помощи бесплатного API Alphavantage или другого источника и формировать локальную копию полученной информации в БД SQLite (если чувствуете прилив Силы, то попробуйте вместо SQLite использовать MySQL или PostgreSQL). Напишите программу, которая запускается раз в сутки и обновляет информацию о курсе всех доступных акций.
Укорачиватель ссылок (URL shortener). Напишите своё собственное API, которое в связке с БД будет выдавать в ответ на адрес ссылки - короткую версию, а в ответ на короткую версию - полный вариант.
Напишите API блога, которое позволяет создавать, редактировать и удалять посты. Можете ограничиться бэкендом или попробовать добавить frontend часть на каком-нибудь Python web-фреймворке, вроде Flask, или даже на Javascript-фреймворке, вроде Vue. Подберите инструмент, который вам по душе.
Напишите API сайта объявлений. Попробуйте расширить функционал по сравнению с API блога, например, в случае слишком большого количества запросов выдавайте быстрый статический ответ с объяснением сложившейся ситуации и предложением зайти позже; лучше обработать часть запросов быстро и часть не обработать, чем пытаться медленно обработать все запросы.
Создайте бэкенд сайта, который проводит вычисления на базе полученных по внешнему API данных, например, на базе финансовой информации, полученной в рамках задачи № 12 и выдачу вычисленных данных уже при помощи своего API. Попробуйте добавить к имеющимся у вас курсам акций пару финансовых индикаторов или, например, индикатор тренда и отдавайте эту информацию по запросу.
Попробуйте добавить к предыдущему пункту связку с ChatGPT или другой LLM, предлагая AI проанализировать имеющиеся у вас финансовые данные и по запросу выдавая и эту информацию.
Научитесь создавать распределённые системы, используя брокеры сообщений вроде Kafka и передачу информации по REST/gRPC. Подумайте над обеспечением graceful degradation, стараясь сохранить основной функционал при перегрузке или отказе отдельных частей системы.
Перейдите к работе с CI/CD при помощи GitHub Actions и Docker, автоматически получая обновлённый функционал вашего приложения сразу после коммита на GitHub.
Научитесь масштабировать ваше приложение в зависимости от нагрузки при помощи Docker Swarm.
Настройте управление Docker-контейнерами, а также научитесь автоматически балансировать нагрузку, запуская приложение сразу на нескольких серверах при помощи Kubernetes. Конкретно эта ступенька, пожалуй, слегка высоковата, и освоение Kubernetes может занять довольно много времени, но вам, по крайней мере, стоит научиться хорошо ориентироваться в вопросах правильного проектирования ПО с учётом требований Kubernetes.