Aliskhan | Backend на Go
60 subscribers
12 photos
11 links
Backend Разработчик. Пишу на Go. Пишу про Go. Рассказываю о своих проектах.
Download Telegram
بسم اللّه‏ الرحمن الرحيم

Наконец-то после месяца упорной работы готов представить вам бота для изучения 99 имён Аллаха (Асма уль‑Хусна). Если вы давно хотели начать, но откладывали — это хороший момент: можно успеть выучить имена к Рамадану, ин ша Аллах.

Что это за бот

Asma‑ul‑Husna Bot — телеграм-бот, который помогает учить имена Всевышнего через короткие занятия, квизы и систему повторений.

Как он помогает учить

Бот даёт карточки имён (арабский текст, транслитерация, перевод, значение и аудио), квизы с разными режимами, учёт прогресса (новое / в изучении / выучено), лимит «имён в день» (1–5) и напоминания, чтобы не забрасывать.

Ссылка на бота:
@asma_ul_husna_bot

Это первая версия, поэтому возможны недочёты. Если заметите баг или есть идеи, что улучшить — пишите в поддержку:
@husna_support

Пусть этот бот станет причиной облегчения в изучении имён Всевышнего для нас всех, с дозволения Аллаха.

Если нужен бот, API или сайт — обращайтесь: @aliskhannn

И буду благодарен за репост этого поста: так о боте узнает больше людей.
👍104🔥2🏆2
Недавно спустя несколько месяцев простоя снова зашёл в Factorio.

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

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

И это очень похоже на программирование.

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

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

Очень часто желание учиться приходит не до сложности, а после того, как ты её прошёл.
🔥53
В разработке бот для таксопарка

Он автоматизирует рутину вокруг смен и путевых листов (через Telegram + админку).

Workflow довольно прост:

1. Водитель отправляет свои данные диспетчеру
2. Диспетчер через админ-панель заносит данные в базу
3. Дальше все просто:
- В начале смены водитель в боте нажимает «Начать смену» и отправляет текущий пробег автомобиля
- В конце смены нажимает «Завершить смену», вводит снова пробег и бот формирует путевой лист в PDF

Доп. фичи:
- Отслеживание штрафов: учет, чтобы ничего не терялось
- Загрузка чеков АЗС: водитель прикрепляет фото, чек сохраняется и привязывается к смене

По плану через 5 дней нужно собрать MVP и показать демо.
🔥12👍1
Подключил знакомого к разработке бота для таксопарка — чтобы оба получили опыт работы в команде и прокачали процесс, а не просто "написали код".

Разработка максимально приближена к коммерческой:
- Типичный Gitflow: ветки под задачи, аккуратные коммиты.
- PR на каждую фичу.
- Ревью кода перед мерджем.

Ревью провожу я. Каждый PR проходит строгий контроль и не попадает в основную ветку, пока всё не будет доведено до нормального уровня (читаемость, крайние кейсы, ошибки, структура).

Хоть это и не "работа в бигтехе", ответственность тут настоящая: это реальный проект под клиента, и цель — отдать качественный продукт, который дальше будет работать как часы и легко поддерживаться.
🔥10👍3
Курьёз в ревью: коллега чуть не подрался из-за errors.Is

После моего ревью знакомый написал:

«Мне не нравится, что ты удалил мои дубликаты ошибок и тащишь их из сервиса».


Суть в том, что он в каждом слое — и в сервисе, и в хэндлере — дублировал одну и ту же кастомную ошибку. Примерно так:

var ErrUserAlreadyExists = errors.New("user already exists")


В сервисе он объявлял ошибку и возвращал её. А в хэндлере создавал такую же, с тем же текстом, и проверял:

if errors.Is(err, ErrUserAlreadyExists) {
...
}


Знакомый был уверен, что если текст ошибок одинаковый, то errors.Is вернёт true.
Но это не так. Давайте разберёмся почему.

Как сравниваются указатели

Go-спецификация говорит:

Два указателя равны, если они указывают на одну и ту же переменную, либо оба nil.

Указатели на разные переменные (даже с одинаковым содержимым) — не равны.


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

Что делает errors.New

Посмотрим на реализацию:

func New(text string) error {
return &errorString{text}
}


Каждый вызов errors.New создаёт новую переменную в памяти и возвращает на неё указатель. Поэтому такой код:

err1 := errors.New("custom error")
err2 := errors.New("custom error")
fmt.Println(err1 == err2)


выведет false.

Что это значит

Если ты объявил ErrUserAlreadyExists в разных пакетах — у тебя получились две разные ошибки.
Тексты одинаковые, но значения (указатели) разные, и errors.Is никогда не сочтёт их равными.

Поэтому правильный подход — определять ошибку в одном месте (например, в пакете сервиса) и использовать именно её:

if errors.Is(err, service.ErrUserAlreadyExists) {
...
}


Так ты избежишь путаницы и неожиданных сравнений, которые "на глаз" казались логичными.
🔥6
Давно тут не писал. Всё это время допиливал Telegram-бота и админку для таксопарка, параллельно вел ещё один проект.

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

С этого дня хочу вернуться к регулярным постам: хотя бы 1–2 в неделю, даже если завален делами. Думаю, у меня есть что рассказать.
9👍1
Сейчас закрываю пробелы в знаниях, чтобы увереннее проходить собеседования.

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

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

Параллельно хочу запустить отдельный блог в формате личного сайта: там будут уже не короткие заметки, как здесь в канале, а более развернутые разборы по Go и backend-разработке.

Первая статья, скорее всего, будет как раз про аллокатор.
🔥6👍3
Решил прокачаться в алгоритмах и структурах данных.

Зачем? Хочу пройти Яндекс Контест — там алгоритмы обязательны. Плюс прокачает решение задач на собесах.

План: NeetCode-роадмап + 75 Study Plan на LeetCode.

Старт завтра. Кто проходил Контест — кидайте опыт в комменты.
🔥6
🔵 Вышла Telegram Bot API 9.4

Добавили цвет для кнопок: danger, success, primary и стандартный. Теперь можно визуально расставлять акценты и делать интерфейс понятнее.

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

Для разработчиков, которые держат ботов в проде, это явный шаг в сторону удобного и интуитивно понятного UX.

Весь changelog — https://core.telegram.org/bots/api
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Обновил бота «99 имён Аллаха»

Прошло больше 1,5 месяца с запуска. За это время в поддержку написало несколько человек: кому-то было непонятно, как бот работает, а кто-то просил сделать его проще.

Для Telegram‑бота это оказалось лишним. Поэтому убрал квизы, напоминания и часть прогресса, оставив только самое нужное.

Теперь всё проще: /today показывает имена по дневной квоте, прогресс сохранён — новые имена продолжают идти с последнего изученного.

Получился не апгрейд, а даунгрейд, но именно в ту сторону, в которую людям станет удобнее.
👍5🔥3
У вас бывало так, что прилетает приглашение на собес — и начинается марафон: искать вопросы по разным сайтам, пересматривать видео, лезть в старые конспекты, чтобы освежить базу?

У меня такое происходит часто. В какой‑то момент я устал каждый раз искать одно и то же и начал сохранять вопросы в Obsidian — из собственного опыта и с разных площадок.

На этом родилась идея сделать отдельную платформу для подготовки к бэкенд‑собеседованиям. Это будет место, где собраны реальные вопросы с собесов, с удобной навигацией по темам.

Сейчас я сделал дизайн MVP: список вопросов, список тем, карточки вопросов и полный справочник.

Дальше — разработка. Буду показывать, как из набора заметок в Obsidian постепенно вырастает рабочий инструмент для подготовки к собеседованиям.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🏆4
🔛 Начал разработку платформы для подготовки к backend-собеседованиям.

Сейчас пишу backend-часть. А пока можно заценить дизайн первой версии — прикрепил несколько экранов в темном режиме.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11
🆕 Запустил официальный канал BackForge — https://t.me/backforge

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

Под проект взял домен https://backforge.tech — позже платформа будет доступна именно там.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍61🔥1
📂 Структура Go‑сервисов

Практически с самого начала изучения backend‑разработки я ломал голову над тем, как организовать сервис: куда класть бизнес‑логику, конфиги, репозитории, модели и т.д.

Со временем я пришёл к простому выводу: идеальной универсальной архитектуры не существует — структура зависит от проекта и задач.

В своей первой статье в блоге я подробно разобрал, как сейчас организую сервис на Go: слои, директории и принцип разделения ответственности.

Почитать можно здесь: https://aliskhan.ru/blog/go-service-project-structure

Это мой личный подход — берите, что подходит, и адаптируйте под себя
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍3🔥2
Кстати, блог я сделал на Hugo.

Hugo — это быстрый и гибкий генератор статических сайтов, написанный на Go: идеален, чтобы быстро поднять свой блог без лишней возни.

Контент — обычные Markdown‑файлы, а сам Hugo превращает их в HTML‑страницы. Для меня это удобно: можно писать статьи прямо в редакторе кода или в Obsidian, не связываясь с громоздкими rich text‑редакторами.
3👍3🔥2
Ранее я писал, что по аллокатору памяти в Go мало хороших и понятных статей.

Кажется, вышла нормальная статья от Timeweb Cloud на Habr. Пока сам не читал, но выглядит солидно: подробно разбирают все механизмы аллокатора.

Но в то же время местами всё выглядит довольно сложно — придётся самому копаться и разбираться.

https://habr.com/ru/companies/timeweb/articles/1000232/
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2