Путь айтишника
130 subscribers
865 photos
1 file
482 links
Путь становления айтишника глазами практикующего специалиста. Личный опыт, полезные инструменты, разбор технологий, план развития и взгляд на индустрию изнутри.
Download Telegram
Продолжаю делать компьютерную HTML5‑игру для Telegram «Memento mori». Неделя прошла не в геймдеве, а в тихой и упрямой войне под названием DevOps. Проект мало написать — его нужно доставить на удалённый сервер, который живёт 24/7 и не интересуется твоим вдохновением.

В качестве CI/CD я использую GitLab. Он получает код, по кнопке собирает Docker‑образы, складывает их в свой registry и запускает команды на удалённом сервере, чтобы вытянуть свежие образы и перезапустить контейнеры. Схема известная и рабочая. Но дьявол, как обычно, в нюансах: права, зависимости, мелкие несостыковки, которые съедают часы и нервы.

В 2026 году использовать Nginx как реверс‑прокси уже выглядит странно. OpenSource‑версия фактически умерла, активное развитие уехало в коммерческую сторону. Русская команда сделала форк и назвала его Angie https://angie.software/ — по сути, тот же Nginx, но с новыми модулями: Brotli, защита от DDoS, поддержка HTTP/3 и главное — модуль ACME.

Раньше всё было просто и муторно одновременно. Нужен SSL — ставишь certbot, получаешь бесплатный сертификат от Let’s Encrypt, через 90 дней обновляешь. Certbot в cron, то работает, то нет. И в какой‑то момент сайт внезапно с просроченным сертификатом. Мелочь, а геморроя вагон. В Angie модуль ACME берёт это на себя — сам получает и продлевает сертификаты, нужно только один раз грамотно настроить. Вот хороший видеоурок «Автоматические TLS‑сертификаты: модуль ACME» https://www.youtube.com/watch?v=ywJQ25tDwaY

И тут я решил усложнить себе жизнь — купить VPS в Латвии. Поднял сервер на 80‑м порту, подключил домен, всё заработало с первого раза. Почувствовал себя победителем. Но как только получил сертификат и включил 443 порт — сайт умер. Я перелопатил конфиги Angie, сетевые настройки, проверил TLS руками через openssl, убил кучу времени. А потом выяснилось, что Роскомнадзор активно режет зарубежные хостинги по 443 порту — в поисках сервисов из трёх букв, которые нельзя называть. Перенёс проект на хостинг в Санкт‑Петербург — и всё заработало мгновенно. Борьба идёт, но явно не с теми.

Вот сайт проекта https://mementus.ru/, а вот бот https://t.me/memento_mori_game_bot. Пока это даже не бета, а скорее заглушка, но фундамент уже стоит.

Смысл этой игры — не деньги, а прокачка навыков программиста и DevOps. Есть золотое правило: внедрять за раз одну новую технологию, а остальное держать старым и проверенным. Я же умудрился параллельно учить NextJS, Phaser, Angie и Claude AI. Вероятность не довести проект до конца при таком наборе растёт не линейно, а умножается. Технологии могут быть модными, но проблемы никуда не исчезают — их просто красиво асфальтируют маркетингом.

На работе, как только я рассказал про игру, посыпались вопросы. «А что будет, когда Telegram отключат?» — пока его собираются не отключать, а замедлять и отпиливать функции. Даже если полностью прикроют, технически переехать в VK или куда‑то ещё не проблема. Технической разницы почти нет.

«Сколько заработаешь?» — нисколько. Это pet‑проект. Чтобы зарабатывать, надо сначала понимать, кому ты продаёшь, какие у людей боли и за что они готовы платить. Игры для детей, подростков и взрослых — это три разных мира. А в простых головоломках уровня “три в ряд” конкуренция такая, что без продуманной стратегии туда лучше не лезть.

«Когда выйдет в Steam?» — никогда. Там и без меня 80% проектов очень странного качества. Пополнять этот список желания нет.

Самое забавное — я думал, что основная работа будет в игровом движке. По факту backend, frontend и DevOps съедают процентов 95 времени. До самого геймплея добираюсь урывками. И это я ещё не трогал полноценный мультиплеер с сетевым взаимодействием и многопоточную обработку данных.

Смысл всего этого один — довести проект до конца, несмотря на инфраструктурные грабли, блокировки, несовпадение ожиданий и реальности. Потому что прохождение курсов — это иллюзия прогресса. А реальный проект быстро показывает, чего ты на самом деле стоишь.
👍7❤1
Пока делаешь пет‑проект, постоянно натыкаешься на вещи, о которых обычно не думаешь. На этой неделе я воевал не с кодом, а с дизайном.

Продолжаю делать компьютерную HTML5-игру для Telegram «Memento mori». Вот сайт проекта https://mementus.ru/, а вот бот https://t.me/memento_mori_game_bot. Следующий этап этой невидимой войны — дизайн. И вот тут быстро выяснилось, что красивые ИИ-эскизы и реальная вёрстка — это две большие разницы. Картинка на одном телефоне сидит нормально, на другом уже уехала, а там, где нужны точно поставленные интерактивные элементы, всё начинает разваливаться при первом же масштабировании.

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

В итоге пришлось расчехлять Photoshop и доводить всё напильником. Чтобы был понятен масштаб бедствия: я попросил ИИ нарисовать обычный крестик для закрытия окна в готическом стиле. Он нарисовал не кнопку закрытия, а какой-то мрачный крест с черепом, словно это артефакт из тёмного фэнтези. Я попросил сделать проще — получил тот же крест с черепом, только уже без фона. Убрал слово «готический» — и меня мгновенно унесло в киберпанк. В какой-то момент я плюнул и просто сам вырезал фон в Photoshop, чтобы получить нормальный объёмный металлический крестик, а не очередной полёт чужой фантазии.

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

На работе в это же время всплыла другая история. Корпоративная система неверно ищет телефонные звонки в базе данных АТС. Я написал подробное техзадание: что есть, в чём проблема, как её исправить, какие есть нефункциональные требования. Специально расписал всё очень подробно, почти как для джунов: с примерами кода, подсказками и пояснениями по ходу. Просто я не знаю реальный уровень наших программистов, а потому решил, что лучше переобъяснить, чем потом разгребать недопонимание и костыли.

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

В итоге я поймал себя на простой мысли. ИИ хорошо помогает там, где всё можно строго формализовать: алгоритмы, данные, граничные случаи. Но как только начинается дизайн, интерфейсы и реальная вёрстка под десятки экранов — приходится возвращаться к старому инженерному инструменту: голове и напильнику. Пет‑проекты хороши тем, что очень быстро ставят всё на свои места.
👍4
Иногда обычная рабочая неделя неожиданно превращается в сборник технических историй: немного администрирования, немного борьбы с кривыми конфигами, немного экспериментов с AI и параллельно разработка собственной игры. Каждая такая задача сначала выглядит мелкой и рутинной, но стоит копнуть глубже — и она внезапно превращается в маленькую археологическую экспедицию по старому коду, странным решениям и забытым настройкам.
На работе возникла задача синхронизировать фамилии из телефонного справочника с названиями телефонов. Ситуация типичная: условно телефон закреплён за Ивановым, Иванов уволился, вместо него пришёл Петров — а телефон продолжает показывать, что это Иванов. Просто потому, что никто не поменял CallerID.
Проблем оказалось две. Первая — в конфигурации АТС числилась куча телефонов, которые физически зарегистрированы и при этом отсутствуют в справочнике. Лишний мусор. Пришлось написать скрипт, который прошёлся по конфигу и вычистил всё, что не используется.
Вторая проблема оказалась веселее: конфигурационный файл с телефонами оказался «битый». У Asterisk есть забавная привычка — при одной ошибке он может орать, что всё пропало, но при этом спокойно игнорировать опечатки в ключах. Например: pickguproup вместо pickupgroup или usename вместо username. Плюс у части телефонов вообще пустые значения в callerid.
Руками такое не исправишь: телефонов больше трёхсот. Поэтому я написал несколько скриптов, которые прошлись по конфигу, поправили ключи, проверили callerid и привели всё в порядок. В итоге удалось восстановить 29 «сбойных» телефонов — и заодно отсортировать результаты по алфавиту.

Параллельно продолжаю делать HTML5‑игру для Telegram «Memento mori». Вот сайт проекта [https://mementus.ru/](https://mementus.ru/) , а вот бот [https://t.me/memento_mori_game_bot](https://t.me/memento_mori_game_bot) .

Читая документацию по Claude, я долго удивлялся: зачем там столько сущностей — субагенты, скилы, оркестрация. На практике быстро выяснилось, что у AI память очень короткая. После длинного диалога он начинает забывать критические детали.
Отсюда и появляется архитектура из маленьких агентов. Универсальный «многорукий» помощник, который делает всё сразу, работает плохо. А вот отдельный агент с чёткой задачей — например проанализировать код или подготовить текст — справляется заметно лучше.
Хорошо об этом написано в статье «Контекст‑инжиниринг для coding‑агентов: почему агент тупит не из‑за модели» [https://habr.com/ru/companies/cloud_ru/articles/1008522/](https://habr.com/ru/companies/cloud_ru/articles/1008522/)
На практике диалог с coding‑агентом быстро превращается в стабильный шаблон:
Сначала: «прочитай эти файлы и объясни, как устроен модуль и где могут быть баги».
Потом: «предложи план изменений по шагам, код пока не трогай».
И только после этого: «вноси изменения строго по плану; если от него отходишь — объясни почему».
По сути, текстовые файлы и куски контекста просто путешествуют между разными агентами. Когда задача чёткая и ограниченная — например «внести правку в код» или «проанализировать текст» — всё работает отлично. Когда задача становится слишком общей, агент начинает быстро забывать детали.

Был и забавный эпизод. Перестало собираться приложение. Я был уверен, что AI исправит это за пару минут. В итоге он два часа создавал и удалял строки, переписал половину проекта и почти всё вернул обратно. Ошибка же решилась заменой одной строки. Единственное полезное открытие из этой истории — ключ claude --dangerously-skip-permissions, который отключает бесконечные запросы подтверждения.
Но случилось маленькое эпохальное событие: вчера я наконец добрался до работы с игровым движком Phaser. Прошёл ровно месяц с начала проекта.
За это время удалось:
- создать мини-лендинг для [https://mementus.ru/](https://mementus.ru/)
- реализовать backend: авторизацию через Telegram, таблицу лидеров и игровые сессии
- настроить интеграцию с Telegram
- собрать CI/CD и перенести проект на VPS
- подготовить дизайн экранов
- реализовать три интерфейса: начало игры, таблицу лидеров и настройки

Я наивно думал, что такой объём работы уложится в одну‑две недели. Но без всей этой «невидимой» подготовки сам игровой процесс просто не запустить.
Плюс параллельно пришлось осваивать кучу новых инструментов. И главный вопрос всё время был не «что делать», а «как именно это сделать».
Но проект движется. А значит всё идёт правильно.

И чем дальше, тем яснее простая мысль: большие проекты собираются из десятков мелких задач, которые по отдельности выглядят совершенно безобидно. Сегодня ты просто «чуть‑чуть поправил конфиг», завтра «немного поговорил с AI», а через месяц внезапно понимаешь, что у тебя уже работает половина игры — хотя вроде бы всё это время занимался какой‑то ерундой.
👍4
Кажется, AI — это просто, пока не начинаешь его внедрять.
На работе опять подъехала задача из разряда «сначала звучит просто, потом начинаешь копать». Речь про классификацию телефонных звонков: запись уходит на удалённый сервер, там расшифровывается, классифицируется по ряду параметров и результат возвращается в 1С. По идее — считать эффективность менеджеров по продажам. По факту — ещё одна система, которую потом надо будет поддерживать.
Сам AI я писать не буду, но поддерживать — буду. И вот это как раз настораживает. Голосовое меню я уже переделывал три раза, пока не закрыл все «хотелки» бизнеса, и здесь ощущения те же: сначала «давайте быстро», потом бесконечные правки. Вариантов решений, по сути, три: МТС https://mws.ru/, Яндекс https://aistudio.yandex.ru/ru и Мегафон. У всех есть свои no-code и low-code инструменты, но к no-code у меня стойкое недоверие.
Они хорошо работают на презентациях: простые кейсы, красивые схемы, всё кликается. Было хорошее сравнение — это как инвалидная коляска на рельсах: можно ехать и даже наслаждаться, но встать нельзя, и приедешь ровно туда, куда тебя везут. Но как только доходит до реальной логики, то, что в коде делается на одном экране, превращается в гигантскую потоковую диаграмму, в которой невозможно ориентироваться. В особо изощрённых случаях даже цикл собрать — отдельный квест. Да, здесь есть low-code, можно дописывать руками, но вопрос в том, насколько этого хватит, когда начнётся настоящая работа с данными.
А вся суть, как обычно, именно в данных. Видел кейс с AI-стартапом, который по факту делает несколько запросов к ChatGPT. Звучит просто, но основной объём работы — это подготовка данных: они кривые, неполные, противоречивые. Потом результат надо интерпретировать, проверить другой нейронкой и только после этого отдавать в BI или инфраструктуру заказчика. В итоге нейронки занимают процентов 10, всё остальное — грязная инженерная работа. Хорошо это разобрано в статье про внедрение AI в производство «Скучная правда про LLM: эффект дают не громкие слова, а простые сценарии с очевидной ценностью» https://habr.com/ru/companies/ru_mts/articles/925834/
Со своей стороны я пока закрыл самый приземлённый кусок — подготовку записей звонков. Нейронка лучше работает, если передавать звук в стерео: оператор в одном канале, абонент в другом. Asterisk это умеет, но делает максимально неудобно — пишет два отдельных файла без сжатия. Пришлось писать скрипт, который собирает их в один стерео WAV, а потом сжимает в mp3. Теперь осталось это всё стабильно отправлять на удалённый сервер и не сломать по дороге.

Параллельно продолжаю делать HTML5‑игру для Telegram «Memento mori». Вот сайт проекта https://mementus.ru/, а вот бот https://t.me/memento_mori_game_bot. Перед тем как бросаться реализовывать фичи, решил сделать как советуют все умные люди — сначала план. Написал субагента-планировщика и получил список из 17 шагов. Я почему-то был уверен, что осталось 2-3 шага до победы.
Процесс работы с AI теперь выглядит так: спецификация → план → маленькие итерации → ревью → фиксация изменений в git. Начал реализовывать и сразу столкнулся с классикой: AI упорно изобретает свои «велосипеды» — таймеры, рандом, перемещения — вместо того, чтобы использовать то, что уже есть в Phaser. Приходится постоянно возвращать его в реальность.
Заодно открыл для себя, что в Phaser можно спокойно использовать реактивный подход через Zustand, причём даже без React. Это оказалось неожиданно удобно: состояние контролируемое, логика прозрачнее, и не надо городить лишние сущности. Игровое поле уже есть, играть даже можно, хотя с размерами карт я, конечно, промахнулся — придётся переделывать.
Чем дальше в это всё лезу, тем больше ощущение, что AI — это не про «умную магию», а про аккуратную инженерную рутину вокруг него. И если эту рутину не сделать нормально, никакая нейронка не спасёт.
👍3
ИИ не пишет стартапы на миллион. Он забирает скучную работу.

Посмотрел видео «Как изменится разработка с приходом ИИ» https://vk.com/video-163338141_456239886 — и оно слишком точно попало в мои мысли.
Владилен Минин разбирает разработку как цикл: анализ → дизайн → разработка → тестирование → деплой → поддержка. ИИ уже уверенно сидит в разработке и тестировании, но магии не случилось. Запрос уровня «сделай мне AI‑стартап на миллион в день без ошибок» остаётся фантазией. Рабочий вопрос проще: могу ли я отдать это джуну? Если да — это работа для AI‑агента. Всё остальное пока остаётся за человеком.
С языками ровно та же история. Новые не убили старые, и ИИ их тоже не убьёт. Там, где нужен C — будет C, где Java — будет Java. Просто появится ещё один инструмент в стеке. Пузырь это или нет — не так важно. Даже если пузырь, он слишком жирный, чтобы исчезнуть: датацентры с видеокартами никуда не денутся, просто займут своё место.

Параллельно продолжаю делать HTML5‑игру для Telegram «Memento mori». Вот сайт проекта https://mementus.ru/, а вот бот https://t.me/memento_mori_game_bot. Игра уже процентов на 90 готова, в неё можно играть. Осталось довести лендинг и прикрутить мониторинг — и будет законченный продукт, а не вечный «ещё чуть-чуть».

Отдельное приключение — звуки. С картинками было проще. Нужно было найти звук переворачивающейся карты — решил сгенерировать через нейросети. ChatGPT выдал «мелодию» из одной ноты. После десятка попыток стало ясно: это уровень школьника с синтезатором на первом уроке. Подключил SUNO https://suno.com/ — получил трек на 3,5 минуты с мужским вокалом про переворачивание карты. Ну почти.
В итоге всё решилось через https://freesound.org/. Но и там свой цирк — я просто искал фанфары. Обычные, оркестровые, с трубами. А нашёл фанфары на ксилофоне, с криком петуха, в стиле аниме. Отдельный жанр — «композиторы», которые берут нормальную мелодию и мешают туда всё подряд. Найти нормальные фанфары оказалось задачей со звёздочкой. Нашёл. Остальное — техника: выровнять громкость, обрезать хвосты, привести форматы.

С Phaser тоже было весело. Абсолютное позиционирование — это боль. Простая задача: на десктопе 4 кнопки в ряд, на мобилке — 2×2. Во фронте это несколько строк. Здесь — функция с перерасчётом координат, куча арифметики ради четырёх кнопок. И это хороший пример того, как «игровой движок решает всё» — не совсем правда.

Когда начинал писать игру, думал, что буду в основном работать с движком и визуалом. По факту он закрывает только UI: отрисовка, ввод, взаимодействие. Всё остальное — бекенд, бизнес-логика на ООП, графика, devops — съедает львиную долю времени. Сам движок занял процентов десять от всей работы. Такой вот геймдев.

Если есть желание — зайдите в бот и попробуйте игру. Интересно, насколько она вообще воспринимается со стороны.

В итоге всё упирается не в инструменты, а в задачи: ИИ закрывает рутину, но думать и собирать систему по-прежнему приходится самому. И чем дальше, тем больше становится видно, где заканчивается «магия» и начинается обычная работа.
👍4❤1
Есть задачи, которые выглядят простыми ровно до того момента, пока не начнёшь их делать. А дальше они начинают раскрываться слоями — и каждый следующий слой требует всё больше усилий.

На работе прилетела задача: распознавание и классификация информационных чеков банкоматов. Нужно понять — есть ли смысл вообще лезть в Yandex AI Studio. Я думал, что проблема — распознать чек. Ошибся. Сначала кажется — ну что там, распознать чек. Потом понимаешь, что чек — это вообще не главное. Архитектура выглядела просто: сканируем папку с изображениями, гоним через Gemma 3 для OCR, потом через Qwen3 вытаскиваем структуру и сохраняем в JSON. Всё это на базе Yandex AI Studio.
Я написал спецификацию, показал коллеге. Линейный пайплайн одобрили. Дальше — реальность. Модель внезапно начала плохо распознавать чеки. И тут вскрылась простая вещь: нельзя пытаться распознавать чек прямо на фотографии банкомата. Рабочая стратегия — сначала вырезать сам чек, потом почистить изображение, и только потом отдавать в OCR. Иначе мусор на входе — мусор на выходе.
После OCR тоже не сказка. Текст «грязный» почти всегда. Поэтому минимум:
— убираем лишние пробелы
— нормализуем переносы
Всё выглядит аккуратно на схеме, пока не начинаешь это реально делать.

Вот эти видео действительно полезные:
Yandex AI Studio Series https://www.youtube.com/playlist?list=PL1x4ET76A10aeW4WyNRZXd0cyTvCbThKO
Воркшоп “Как создать мультиагентную систему в Yandex AI Studio” https://www.youtube.com/watch?v=Iyf17k0Hf2M&t=1484s

Параллельно закрыл свою давнюю историю — допилил игру.
Сайт: https://mementus.ru/ Бот: https://t.me/memento_mori_game_bot

В голове всё выглядело просто: изучил Phaser, подключил ИИ — и поехали. На практике оказалось, что кодинг — это максимум половина задачи. Всё остальное: бизнес-логика, графика, звук, DevOps. ИИ в этом помогает, но очень неровно.
Самая неприятная часть — без нормальной спецификации ИИ начинает «фантазировать». Вместо pet-проекта предлагает архитектуру уровня Яндекса с многоуровневыми кэшами и горизонтальным масштабированием на сотни серверов. Пока сам не структурируешь задачу — толку не будет.
Вывод простой: чтобы ИИ дал нормальный результат, нужно самому знать хотя бы половину ответа. А лучше — процентов 70. Он отлично закрывает задачи уровня джуна. Всё, что сложнее — начинает плыть.
Отдельно зашла идея с субагентами: один планирует, второй пишет, третий проверяет. Потому что код может запускаться и «работать», но при этом быть дырявым по безопасности.
С графикой тоже иллюзии быстро закончились. Наброски — ок. Финал — нет. На одной картинке вместо «Кубки» получилось «Кувки», и исправить это ИИ не смог. В итоге часть правок делал руками в Photoshop. Со звуком ещё хуже: песню генерит легко, а вот нормальный звук переворота карты — это уже квест.
Phaser тоже быстро расставил всё по местам. Это не «магия геймдева», а по сути UI-движок: загрузка ресурсов, обработка кликов, анимации, физика. Вся логика — на тебе. Нажал на карту — а дальше куча состояний и правил, которые ты сам описываешь через ООП.
И да, 2D — это ещё цветочки. В 3D надо уже рисовать модели, анимировать, работать со светом и текстурами. Там совсем другой уровень боли.
По итогу: на сам движок ушло процентов 10 работы. Остальное — инфраструктура, логика и куча мелких решений, о которых даже не думаешь в начале.
Параллельно изучал сразу четыре технологии: NextJS, Phaser, Angie и Claude AI. Тяжело. Очень.
В итоге закрыл детскую мечту — сделал свою игру. Детские мечты должны умирать в детстве. Посмотрел на геймдев изнутри и понял: это отдельная вселенная. Пока не моя.

Написал статью "Когда связист становится разработчиком, программирование Asterisk на практике", где обобщил свой опыт разработки под Asterisk:
https://vk.com/@programmer_path-kogda-svyazist-stanovitsya-razrabotchikom-programmirovanie-a

Вывод простой: ИИ ускоряет, но не заменяет мышление. Без структуры он плодит хаос, со структурой — экономит часы. В итоге выигрывает не тот, у кого модель мощнее, а тот, кто чётче формулирует задачу.
👍4❤1