Найти тему
Я, Golang-инженер

#62. Топ библиотек для Telegram-ботов на Go; написание TG-бота; работа с PostgreSQL и pgAdmin через Docker Compose, и другие тестовые задачи

Оглавление

Это статья об основах программирования на Go. На канале я рассказываю об опыте перехода в IT с нуля, структурирую информацию и делюсь мнением.

Хой, джедаи и амазонки!

В предыдущем посте рассказывал, что начал искать работу go-разработчиком. В этом посте поделюсь наработками и видением ситуации по части выполнения тестовых задач на позицию go-разработчик, а также коснусь легенды, будто для джунов нет вакансий. Поделюсь собственными исследованиями в поиске библиотек для написания Телеграм-ботов на Go и расскажу, зачем задался этой целью. А также расскажу о написании Телеграм-бота без сторонних библиотек. Поехали!

https://ru.freepik.com/free-photo/man-racing-dirt-bike-fantasy-environment_187145409.htm
https://ru.freepik.com/free-photo/man-racing-dirt-bike-fantasy-environment_187145409.htm

1. Тестовые задания

С начала поиска работы я получил четыре тестовых задания, не считая контеста Яндекса или тестов на знание языка и СУБД. Все тестовые задания рассчитаны на junior-специалиста. Т.е., по-логике, там не запредельный уровень сложности.

1.1. Описание тестовых заданий

1.1.1. Первое тестовое задание

На первое тестовое задание я потратил неделю и не написал ни строчки кода - основной проблемой было отсутствие понимания, что такое Kafka и как с ней работать (нужно было её использовать по тестовому). Полистал интернет, купил недорогой курс на Stepik по этой теме и позанимался на нём. В итоге и на курс забил, и задание не сделал.

1.1.2. Второе тестовое задание

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

1.1.3. Третье тестовое задание

Третье тестовое было просто объёмным, решения принимались до 1 августа. Т.е. кто первый успел увидеть вакансию, у того было больше времени сделать задачу. У меня было несколько дней на задачу, я даже не брался за него. К тому же там вновь была Kafka и сервис нужно было запустить на сервере (!) Пока не представляю, как это сделать. Если интересно посмотреть условия этого или других тестовых, u are welcom в мой ТГ-канал, ссылка в конце публикации.

1.1.4. Четвёртое тестовое задание

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

  • Составить топ библиотек для написания телеграм-бота на Go;
  • Написать любого бота на Go + разобраться с API телеграм;
  • Разобраться с WebApp и БД.

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

1.2. Тестовое задание №2

https://ru.freepik.com/free-photo/futuristic-scene-with-high-tech-robot-used-construction-industry_154036639.htm
https://ru.freepik.com/free-photo/futuristic-scene-with-high-tech-robot-used-construction-industry_154036639.htm

1.2.1. БД

Первой проблемой было создать БД через СУБД PostgreSQL. Я поверхностно был знаком с SQLite, а вот с PostgreSQL - нет. У меня Linux Manjaro, и что-то PostgreSQL не ставился на него. Кроме того, помимо БД, нужно было установить приложение для визуальной работы с БД. Таким аналогом для SQLite у меня была программа DB Browser for SQLite, а в PostgreSQL это был pgAdmin.

Не знаю уж что было не так, сам не смог разобраться - установщик Manjaro постоянно выдавал ошибку при установке PostgreSQL. Много разных вариантов пробовал, ничего не помогало и я готов был установить Linux попроще, и даже сделал образ и установил Ubuntu.

В итоге остался на Manjaro за счёт того, что нашёл текстовый файл в формате .yaml грубо говоря на 50 строк, который решал задачу.

Ниже фрагмент из .yaml файла, чтобы было понятно о чём речь:

Фрагмент compose.yaml файла для запуска контейнеров
Фрагмент compose.yaml файла для запуска контейнеров

ЗЫ - нужно чтобы было установлено приложение Docker Compose на компьютере, чтобы воспользоваться этим файлом.

Файл запускался командой в терминале:

docker compose up -d

После запуска команды, терминал выглядит примерно так:

Запуск контейнеров
Запуск контейнеров

Запустился контейнер и с PostgreSQL и с pgAdmin - это web GUI для работы с БД. Интерфейс pgAdmin в браузере после всех настроек выглядит примерно так:

Интерфейс pgAdmin
Интерфейс pgAdmin

В нижней правой части экрана созданная БД через СУБД PostgreSQL. Но до этого было ещё далеко - pgAdmin в первую очередь нужно было зарегистрировать сервер.

Страница в браузере pgAdmin после входа в неё
Страница в браузере pgAdmin после входа в неё

Кстати, чтобы войти в pgAdmin, нужно было разобраться что вводить в поисковую строку браузера: эта информация была из .yaml-файла. Далее регистрировался сервер:

Фрагмент регистрации сервера на pgAdmin
Фрагмент регистрации сервера на pgAdmin

Здесь столкнулся с проблемой - сервер не хотел регистрироваться. В частности, я не задавал "пароль".

Затем зарегистрировал сервер:

Работа сервера PostgreSQL
Работа сервера PostgreSQL

И настроил работу с БД через терминал:

Фрагмент запроса к БД через терминал
Фрагмент запроса к БД через терминал

Далее была проблема найти содержимое БД через pgAdmin. Просто для удобства работы. Общий порядок был такой - нужно раскрыть вкладки Servers - postgres - Schemas - public - Tables - и выбрать требуемую таблицу. На первом скриншоте pgAdmin выше, все вкладки указаны в левом блоке таблицы.

Тут ещё интересная штука - после изменений в БД, выполняемых через программу Postman, отображаемое в GUI (окне браузера) содержимое БД в pgAdmin не менялось. Для отображения изменений, нужно нажимать кнопку, которая выглядит как "плей" и обозначается "Execute script".

Тут много чего можно ещё рассказать, например как создавать БД через миграции, а не константный код, но это уже тема чуть ли не отдельной серии публикаций.

1.2.3. Swagger

Ещё познакомился с так называемым swagger или openapi. Если вкратце - это стандарт документирования API.

В тестовом выдали описание API, которое нужно было реализовать; вот фрагмент:

Фрагмент спецификации стандарта openapi
Фрагмент спецификации стандарта openapi

И далее возник вопрос - что это и как с этим работать.

Есть сайт для графической работы с openapi:

Шаблон спецификации по стандартам openapi
Шаблон спецификации по стандартам openapi

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

Кроме того, по заданию нужно было написать свой API и написать на него документацию. Есть сервисы генерации такой документации, я в них пока не разобрался, и писал документацию вручную. А в этом мне помог этот блог на >>> youtube <<<

Фрагмент видео
Фрагмент видео

1.2.4. Идеальное тестовое задание

Ещё мне очень помогло в разработке тестового задания опубликованное опять же на youtube решение "идеального тестового задания для junior go-developer". Тема задания была совсем другая, я усвоил принципы построения архитектуры приложения из видео.

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

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

1.2.5. Слои

В предыдущем пункте я упомянул о слоях. Речь о том, где хранить разные фрагменты кода - в каких каталогах и каких пакетах. Частично об этом говорится в видео "идеальное тестовое", но этого недостаточно. Можно дополнительно посмотреть эти два источника как устроить хранение файлов и пакетов на GitHub:

1.2.6. Готовое тестовое

Готовый проект по тестовому заданию №2 смотреть >>> здесь <<< на GitHub'е. Он далеко не идеальный (т.к. получил отказ от компании), вот фрагмент обратной связи от проверяющего:

  1. Не стоит забывать про индексы при создании БД.
  2. Не стоит использовать debug-логи для логирования ошибок //Прим. - по ТЗ требовалось сделать только -debug и -info логи.
  3. Есть механизмы автогенерации сваггера, которые создают помимо yaml еще и json-описание + предоставляют функционал отправки запросов прям из веб морды сваггера.
  4. Пагинации нет //Прим. - она была реализована, но видимо, не так, как принято.
  5. В get-запросах не принято передавать тело. Более того. некоторые клиенты игнорируют тело, когда к ним приходит get-запрос.
  6. Отчество - необязательное поле и работать с ним нужно соответственно.
  7. Нет возможности обновить одно свойство //Прим. - была такая возможность.
  8. По одной задаче нет возможности поработать несколько раз.

Вот такая обратная связь. Дорабатывать приложение в планах нет, учту эти замечания при последующих разработках где используются такие же решения: работа с PostgreSQL, get-запросах и т.д.

2. Телеграм-бот

Текущее тестовое задание (бесплатная неофициальная стажировка) состоит из нескольких частей. Первой частью было составить список библиотек для написания telegram-бота на Go и проранжировать их в порядке приоритета. Задача экстремальная для junior-специалиста, но когда нас это останавливало? Кстати, hr компании связался со мной сам благодаря куратору акселерации трудоустройства Яндекс Практикум, в котором я участвую.

https://ru.freepik.com/free-photo/futuristic-scene-with-high-tech-robot-used-construction-industry_154036582.htm
https://ru.freepik.com/free-photo/futuristic-scene-with-high-tech-robot-used-construction-industry_154036582.htm

2.1. Перечень библиотек для TG-ботов на Go

Первым делом я пересмотрел, какие уже есть подборки по этой теме и на основе нескольких источников, в которых говорилось о ботах для сервисов вообще, а не Телеграм в частности, сделал выборку и дополнил её краткой справкой по ботам, дате релиза, количеству звёзд на GitHub'е и другой информацией. Затем выбрал топ пять библиотек по полученной выборке. Выглядит мой личный топ библиотек так:

2.1.1. Топ библиотек

1. telegram-bot-api

Краткое описание: Считается простым и понятным
Provides webhooks and inline keyboards for interaction with users. Supports deep linking to external websites and content within the Telegram app. Offers a unique set of features such as group chats, channels, and sticker sets. The good news here is that telegram-bot-api works as a wrapper for API without extra features.
Звёзд GitHub: 5600
Форков: 868
Первое/последнее обновление: 05.2016-11.2021
Лицензия: MIT

2. telebot

Краткое описание: Offers secure bot creation and hosting with built-in features to protect user data. Designed to deliver reliable performance even when handling large volumes of requests. Offers advanced features such as inline keyboards, custom commands and user profiles. Telebot is nothing but a Bot framework for Telegram bot API. No other Bot framework offers a better API for command routing, inline query requests, keyboards and callbacks than Telebot.
Звёзд GitHub: 3800
Форков: 451
Первое/последнее обновление: 06.2020-06.2023
Лицензия: MIT

3. bot

Краткое описание: Библиотека для создания Telegram-ботов с нулевыми зависимостями
Звёзд GitHub: 560
Форков: 49
Первое/последнее обновление: 04.2023-07.2024
Лицензия: MIT

4. echotron

Краткое описание: Echotron is an elegant and concurrent library for the Telegram bot API in Go.
Звёзд GitHub: 352
Форков: 26
Первое/последнее обновление: 02.2019-06.2024
Лицензия: LGPL-3.0 license

5. go-tg

Краткое описание: Код для типов и методов Bot API генерируется с помощью встроенной официальной документации. Поддержка context.Context. Клиент API и фреймворк для ботов строго разделены, вы можете использовать их независимо. Нет накладных расходов на отражение во время выполнения. Поддерживает Webhook и опрос изначально; Ответ Webhook для высоконагруженных ботов; Поддерживаются обработчики, фильтры и промежуточное программное обеспечение. Помощники веб-приложений и виджета входа. Поддержка деловых связей
Звёзд GitHub: 84
Форков: 7
Первое/последнее обновление: 03.2023-04.2024
Лицензия: MIT

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

Стр. 1 из 3
Стр. 1 из 3

Стр. 2 из 3
Стр. 2 из 3

Стр. 3 из 3
Стр. 3 из 3

2.2. Разработка ТГ-бота

Следующий этап тестового - познакомиться с экосистемой Телеграм на примере написания ТГ-бота.

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

Рекомендую его лекции по этой и другим темам, которые можно использовать в качестве pet-проектов >>> лекции по боту <<<

Фрагмент видеоролика Т.Николая
Фрагмент видеоролика Т.Николая

Что ещё по этой части - в видео не было ссылки на API Telegram, который нужен в работе, а поисковой запрос почему-то выдаёт не совсем то, что нужно. Пришлось поискать лучше: вот ссылка на API Telegram, о которой говорится в видео.

Кстати, посмотреть как выглядит API Telegram по стандартам спецификации openapi можно >>> здесь <<<

Вот фрагмент спецификации:

Фрагмент спецификации Telegram bot по стандартам openapi
Фрагмент спецификации Telegram bot по стандартам openapi

3. Выводы

Ключевое, что я понял по поиску работы junior-специалистом и стажёром:

  1. Разные компании требуют разных видов начальных навыков. Кто-то требует мощное знание алгоритмов. Другие - базы данных и брокеры сообщений. Третьи ещё что-то. Все - хорошее знание Golang.
  2. Отказов будет много. Часто - без обратной связи.
  3. Это миф, будто Jinuor-специалисты никому не нужны. Они нужны, просто junior тоже должен обладать хорошей базой знаний и умений, а не только, условно, перебирать массивы через ключевое слово range.
  4. Нетворкинг - musthave. Налаживайте социальные и профессиональные связи через соцсети, чаты, блоги, личные знакомства и т.д. Например, файл docker compose для запуска контейнера PostgreSQL я получил через такой контакт, в т.ч. информацию как решить проблему когда не устанавливался PostgreSQL на Linux Manjaro.
  5. На тестовых задачах учишься чуть ли не лучше, чем на курсах. Но нужна база - если её нет, то часть тестовых даже не сможете начать делать ввиду дедлайнов.
  6. Отсутствие коммерческого опыта - не критично. Техлид одной из компаний сказал в своём видеообращении примерно так "Наши HR'ы не смотрят на ваши резюме из откликов на HH, мы отправляем тестовые всем, кто откликнулся. Кто смог сделать тестовое хорошо - с теми будем общаться дальше (на техсобесе)".
  7. Отдыхайте, гуляйте и разгружайтесь.

Интенсивно работал в течение длительного времени, и в один момент друг позвал на спонтанную поездку на море. Я думаю - с одной стороны, столько всего не решено по IT-тематике, а с другой будет здорово отдохнуть. Решено, съездили на пять дней. Неплохо разгрузился, и вам рекомендую:

На Японском море
На Японском море

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

Большое спасибо, что дочитали публикацию до конца. Если она вам понравилась, поставьте реакцию и напишите, какие задачи с тестовыми у вас вызвали вопросы, и как вы их решили.

Верьте в себя, свои силы и всесторонне развивайтесь. У нас всё получится как в профессиональном, так, и могу вам сказать, в личном плане. Будем на связи. Удачи!

https://ru.freepik.com/free-photo/anthropomorphic-futuristic-robot-performing-regular-human-job_94213096.htm
https://ru.freepik.com/free-photo/anthropomorphic-futuristic-robot-performing-regular-human-job_94213096.htm

Бро, ты уже здесь? 👉 Подпишись на канал для начинающих IT-специалистов «Войти в IT» в Telegram, будем изучать IT вместе 👨‍💻👩‍💻👨‍💻