Путь айтишника
130 subscribers
865 photos
1 file
482 links
Путь становления айтишника глазами практикующего специалиста. Личный опыт, полезные инструменты, разбор технологий, план развития и взгляд на индустрию изнутри.
Download Telegram
Кажется, 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
Есть ощущение, что OCR работает ровно до первого реального чека. Пока смотришь демо — всё красиво, как только попадаешь в прод — начинается цирк с буквами и цифрами, которые внезапно меняются местами. И вот ты уже не распознаёшь текст, а разгадываешь квест.

Неделя ушла на борьбу с одной, казалось бы, простой вещью — чеками банкоматов. На бумаге всё выглядит тривиально: есть код ошибки, его надо распознать и сохранить. В реальности OCR спокойно превращает 6 в 0, 5 в S и делает из фиксированного кода какой-то криптографический ребус, который потом нужно как-то интерпретировать.

Кодов ошибок банкоматов оказалось около 20 тысяч, но плюс в том, что они фиксированы. Я просто сложил их все в PostgreSQL и пошёл от обратного: не доверять OCR, а искать ближайшее совпадение. Беру распознанный код и через нечёткий поиск + расстояние Левенштейна нахожу то, что он «хотел сказать».

Нечёткий поиск — это способ находить строки, которые похожи, а не полностью совпадают с запросом (например, с опечатками или разным написанием).
В PostgreSQL он реализуется через метрики сходства similarity и позволяет искать «ближайшие» совпадения вместо точных.
Есть расстояние Левенштейна — это метрика, которая показывает, сколько минимальных операций (вставка, удаление, замена символа) нужно, чтобы превратить одну строку в другую.

Сначала фильтр по similarity, потом сортировка по расстоянию — и на выходе наиболее вероятный вариант.

SELECT code, levenshtein(code, '526D6O0') AS dist
FROM atm_error_codes
WHERE similarity(code, '526D6O0') > 0.3
ORDER BY dist ASC
LIMIT 1;


Фактически этим запросом я закрываю 1–2 ошибки распознавания без отдельной логики. OCR ошибся — база поправила. Никакой магии, просто аккуратно использованные инструменты. Похожий подход, кстати, используется и в FineReader.

Параллельно открыл свой старый проект на NodeJS. Посмотрел код и поймал странное ощущение: вроде бы писал я, но читать больно. Очень быстро становится понятно, как растёшь — по тому, насколько раздражает собственный код из прошлого.

Отдельный цирк был с AI-агентом. Сломалась сборка из-за библиотеки figlet, и «умное» решение оказалось простым: удалить библиотеку и захардкодить ascii-арт. Логика железная. Пришлось руками дожимать до нормального решения и заменить на cfonts. В очередной раз убедился: AI отлично ускоряет, но мусора генерирует не меньше.

В итоге для CLI-интерфейса взял @clack/prompts https://www.npmjs.com/package/@clack/prompts — неожиданно аккуратная библиотека. Минимум лишнего, всё работает как надо.

Чем дальше копаюсь в таких задачах, тем яснее вижу: проблема редко в «сложной технологии». Обычно всё ломается на стыке — OCR, данные, логика. И вот там уже начинается настоящая работа.
👍3
Хотел просто переименовать файлы — получил счёт на тысячу рублей.

Начал делать CLI-утилиту smart-renamer https://github.com/orion55/smart-renamer — автоматическое переименование медиафайлов с переводом названий на русский через YandexGPT. На входе обычный «зоопарк» скачанных файлов вроде:

The.Walking.Dead.S05E03.720p.BluRay.x264-DEMAND.mkv
Game.of.Thrones.2011.S01E01.WEB-DL.1080p.mkv
Pochuvstvuj.moj.golos.2026.NF.WEB-DLRip.AVC/


На выходе хочется получить что-то человеческое:

Ходячие мертвецы/0503.mkv
Игра престолов/01.mkv
Почувствуй мой голос.mkv


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

Сначала попробовал через Яндекс.Переводчик. На выходе получается полная дичь. Английские и русские названия фильмов живут своей жизнью и редко совпадают. Решил пойти «умнее» — подключить AI. Написал жирный промпт, добавил логику «если не знаешь — сходи в интернет», взял YandexGPT 5.1 Pro, включил многопоточность, ретраи — всё как положено.

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

В итоге выкинул всё это великолепие и поставил более простую модель Alice AI LLM. И внезапно всё заработало: без интернета, без ретраев, без параллелизма. Просто возвращает нужные названия. Вывод банальный, но неприятный: «умнее» не значит «лучше», особенно когда платишь за каждый токен.

Отдельный бонус — код от Claude. Поймал странный баг: функция ничего не возвращает, хотя должна. Начал разбираться — а там тихо мутируется исходный массив. Та самая классика с тихими, почти невидимыми side-эффектами. По факту — глупая новичковая ошибка: не уследил за мутацией и сам себе сломал логику. Та самая ситуация, где «всё вроде правильно», но не работает. Когда ткнул в это ИИ носом — исправилось. А если бы не ткнул?

В итоге вся эта история не про переименование файлов. Она про контроль. За моделью, за кодом, за деньгами. Иначе очень быстро начинаешь платить за ошибки, которые даже не видишь.
👍5
Попросил ИИ «сделать как лучше» — и получил совсем не то, что нужно.

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

С дизайном история вышла не менее показательная. Решил «пусть сам предложит концепт» — и получил: «Signal Console», тёмная панель в стиле профессиональных коммутаторов, монохромный шрифт, LED‑индикаторы, кислотный циан. Звучит красиво, но по факту это просто внутренняя админка. Киберпанк там лишний.

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

Параллельно решил перейти с npm на pnpm. Разница простая: npm тащит зависимости прямо в проект и дублирует их, из-за чего всё разрастается. pnpm хранит пакеты глобально и подсовывает их через hard links — быстрее и заметно экономит место. Пока разбираюсь, но подход выглядит разумнее.

Начал читать «Грокаем машинное обучение» Луиса Серрано. Книга заявлена как «для самых маленьких», без сложной математики и с простым Python. Но даже так читается тяжело. А если открыть приложение с формулами — производные, интегралы — становится понятно, где заканчивается «игра с ИИ» и начинается настоящее машинное обучение.

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

На работе довёл до конца упрощённую внутреннюю админку для телефонии. Заодно аккуратно дожал DevOps-часть, без лишнего фанатизма — ровно столько, сколько нужно, чтобы не страдать потом на деплое.

Нашёл для себя очень удобную штуку — https://github.com/jesseduffield/lazydocker
Lazydocker — это терминальный интерфейс для управления Docker-контейнерами, образами и сетями в реальном времени. По сути, всё то же самое, что делаешь руками через CLI, только без простыней команд. Логи, перезапуск, удаление, мониторинг — всё под рукой. Для диагностики и администрирования из консоли — прям то, что нужно.

С установкой, правда, есть нюанс. Не сказать, что сложно, но и не «apt install и поехали»:

export DIR=/usr/local/bin

curl https://raw.githubusercontent.com/jesseduffield/lazydocker/master/scripts/install_update_linux.sh | bash

lazydocker


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

Посмотрел видео «AI-программист за 500 рублей: правда об агентском кодинге» https://www.youtube.com/watch?v=CjHFdsTW4ug
Обычно такие видео либо про «всё уже заменили нейросети», либо «всё пропало». Здесь редкий случай — спокойный разбор и реальный опыт без крайностей. Смотришь и понимаешь, где это работает, а где пока нет.

Claude в очередной раз улетел в бан. Продавец аккаунта руками разводит — остаётся только ждать. Решил не зависеть от одного инструмента и попробовать альтернативы. Наткнулся на https://kilo.ai/

Kilo AI — open-source ассистент для разработки, который встраивается в IDE и работает не только с отдельными кусками кода, а с проектом целиком.

Интересный момент — поддержка внешних провайдеров через API. Есть, например, OpenRouter — прокси-слой к разным LLM (Claude, GPT, Mistral и др.). Получается, можно не завязываться на одного вендора и переключаться по ситуации.

В итоге картина складывается простая. С одной стороны — инструменты вроде lazydocker, которые экономят время здесь и сейчас. С другой — AI, который пока ещё требует контроля, но уже начинает забирать на себя рутину. Вопрос не в том, заменит или нет, а в том, где именно он реально полезен.
👍5
На ближайшие две недели немного выпадаю из онлайна.
Уезжаю в отпуск на Кавказ. Горы, дороги, тишина и попытка хотя бы ненадолго перестать думать про телефонию, Docker, Asterisk и бесконечные логи.

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

Так что если внезапно пропаду, не потерялся.
Вернусь через две недели с новыми историями, наблюдениями и, скорее всего, очередной технической эпопеей.
❤6👍3
Съездил на Кавказ и быстро понял: это не отпуск в формате «полежать и отдохнуть». Это когда утром ты идёшь «немного прогуляться», а вечером часы поздравляют тебя с 10 000 шагов, ноги молчат от обиды, а впереди ещё горы, ущелья и дождь с градом.
В статье рассказал про поездку в Кабардино-Балкарию: Нальчик, Чегемское ущелье, Голубые озёра, Эльбрус, Адыр-Су, термальные источники, местные музеи и одну «мистическую шахту», которую специалисты из высокого интернета уже успели записать в работу неандертальцев и инопланетян.
Получился не рекламный тревелог, а честный рассказ: где красиво, где переоценено, где промок, где устал, а где понял, что на Эльбрус без подготовки лезть не надо.
Полная статья здесь:
https://vk.com/@grebenyov-puteshestvie-v-kabardino-balkariu-stranu-chudes
👍5❤2