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

Не могу сказать, что на улице было холодно, но, переступив порог бара, ощущалась приятная духота. Все заведение уже заполонили айтишники, кажется, ещё полчаса назад я застал их в кулуарах — они обложили одного из спикеров, допытывая его вопросами про локальные LLM. Найти свободное местечко оказалось нетривиальной задачей, я бы сказал, NP-полной. Пройдя вглубь зала, моя коллега заметила пустой столик в самом конце помещения. Туда и направились. Я обратил внимание на большую шумную компанию. Они соединили два стола и что-то громко обсуждали. И без того в баре было достаточно шумно, но краем уха я выцепил, что, кажется, их тимлид жаловался на появление новых метрик от бизнеса. Метрики, конечно, были связаны с наискорейшим внедрением AI.
Мы наконец-то уселись. На фоне красивого дубового стола бьющим по глазу пятном лежало неумело сгенерированное нейронкой меню.
Темный шоколадный стаут отлично скрасит предстоящий разговор, который, по моему предчувствию, будет в очередной раз про ИИ.
— И что ты думаешь про все это? — сказала Маша, выбив меня этой фразой из размышлений в своей голове.
— Ты про что? — ответил я в надежде, что предчувствие меня подвело.
— Про ИИ-историю вокруг.
— А так ли важно, что думаю я, а самое главное, влияет ли это на что-то?
— Не знаю, просто ты всё-таки тимлид, интересно послушать, как изменилась разработка с позиции не просто рабочего крестьянина, хах.
— Слушай, изменилась. Изменилась довольно сильно. И продолжает меняться. И я пока не понимаю, что с этим делать.
По её улыбке я понял, что соскочить с этого диалога вряд ли получится.
— А давай сначала ты расскажешь о своих мыслях и переживаниях, а потом я поделюсь своими наблюдениями.
— ШТОЖ, довольно честно. Мне сильно не нравится, куда это все идёт. Нет, не пойми меня неправильно, я не луддит, поджигать офис корпорации зла не планирую, но… Короче, у меня буквально два тейка.
Во-первых, мне кажется, что у меня уже буквально мозг разжижился от этого клод-марионетства. Как будто IQ уже на 30 пунктов упал с момента появления корп. подписки.
А второе, я недавно подкаст слушала «Мы обречены», ну, знаешь их, и этот тейк буквально поразил меня. Вот есть у тебя какая-то игра, в которую ты любишь играть? Где тебе нравятся механики и кор-геймплей.
— Да, есть. Left 4 Dead, Risk of Rain, Ranch Simulator. Да много таких.
— Вооот, а теперь представь, что геймплей из этих игр пропал. И все они превратились в интерактивное кино по типу Detroit или Heavy Rain. Где ты только делаешь выборы и участвуешь в диалогах. Тебе бы по-прежнему нравилось в них играть? Такое же я сейчас ощущаю от программирования с агентами. Я никогда не была айти-гиком, но потеря этого вайба писать код, проектировать систему сильно бьёт по мотивации. Как будто я любила писать код, придумывать решения, но не любила все другое в этой сфере. А сейчас как будто осталось только «все другое».
Машу прервала официантка, которая как раз принесла два тёмных, как перо ворона, с бриллиантовыми отблесками бокала.
— Я высказалась. Передаю микрофон товарищу власть имущему.
— Окей, давай попробую поделиться тем, что начал подмечать я, какие, на мой взгляд, появились проблемы и какие мысли у меня есть по поводу их решения. Но перед этим предлагаю поднять бокалы.
— За кожаных мешков?
— За интересное время, в котором мы живём.
Я почувствовал мягкий и обволакивающий вкус, в котором соединены тона тёмного шоколада, какао-бобов, жареного солода и лёгкого кофе, уравновешенные сливочной сладостью и деликатной хмелевой горчинкой.
— Такс, давай по порядку. Из очевидного, что я, ты, наши ребята стали делать кратно больше мерж-реквестов.
Мерж-реквестов, которые все ещё надо ревьюить, наверное… Поначалу это не казалось проблемой. Да, время как будто стало уходить чуть больше, но и задач мы берём в работу больше, вроде закономерно, вроде мы этого все и хотели.
Однако чем дальше мы начали улучшать harness, оплачивать более хорошие модели, писать более всеобъемлющие скиллы… Этот рост уже перестал быть контролируемым. Пару недель назад мне закинули малютку на 25к строк совокупного диффа. Этот мерж-реквест полностью переводит вычитку из Кафки на новый контракт. И тут я поймал себя на мысли, что даже если я прочитаю все это, вероятно, контекстного окна в моей голове просто не хватит, чтобы все это качественно обработать. И дело даже не в простыне кода. Даже если разбить этот один МР на 10 или 20 отдельных МРов, то все равно когнитивная нагрузка от объёма проделанной работы будет выше, чем сможет переварить мой мозг. Ну, то есть раньше мы эту работу могли делать месяц, и все ревью и тестирование плавно размазывались на месяц. А теперь все можно сделать за пару дней. Поэтому даже 20 маленьких МРов придется переварить за кратно меньший срок.
Есть подозрение, что автор этих изменений тоже не смог переварить это, а может, даже и не пытался. Мб, и мне не ревьюить? Или ревьюить нейронкой? Дааа, прикольно получается, — поймал я тогда себя на мысли. Нейронкой нагенерил решение, нейронкой поревьюил, осталось проверить нейронкой.
Знаешь, чувство на стыке страха и неловкости в этот момент. Страшно, что я не могу это всё охватить, страшно, что человек, который проделал эту работу, тоже не может это все охватить. Страшно, что мы даже до конца не понимаем, что происходит там в коде. И стыдно, что у меня нет решения этой ситуации. Ладно, быть может, это только моя проблема? Как оказалось, нет. Я стал замечать, что даже небольшие и средние МРы команда стала ревьюить с помощью ИИ. Ребята из других компаний тоже это подмечают. А самое страшное, что все это неявно избавляет всех от ответственности. Разработчик доверяется нейронке, что она сделала задачу правильно. Я доверюсь нейронке, что она правильно заревьюила. Заказчик верит, что с помощью нейронки можно качественно сделать задачу за один день, хотя работы там на неделю. Окей, а как отказать себе в возможности ваншотнуть недельную задачу за час? А самое главное, как отказать в этом бизнесу?
— Ах, вот из-за чего началась эта эпопея с тестами? И какой у тебя план?
— Ага, в моей голове базовая идея была следующей. Для начала мы перерабатываем наш агентский пайплайн на TDD-ориентированный. Параллельно мы максимально обкладываем важный функционал тестами, тестами, которые чётко продумывает человек совместно с QA-инженером, плюс тесты, которые родила нейронка. Если тесты уже есть, проверяем, что они репрезентативные. Дописываем, чего не хватает. Во все CI/CD-пайплайны добавляем джобы с тестами, если их не было. Ах да, к нашим нейротестам надо обязательно добавить автоген-тесты на основе OpenAPI. Тот же Schemathesis, например. Хочется быть уверенным хоть в каких-то тестах, хаха. Schemathesis и подобные инструменты берут OpenAPI- или GraphQL-схему и автоматически генерируют тысячи запросов к API, проверяя, что сервер ведёт себя так, как обещает спецификация. Ручные тесты проверяют сценарии, которые пришли в голову разработчику, — сама знаешь, обычно happy path и пару очевидных ошибок; нейронки просто любят писать тесты под себя, как удобно их коду. Генератор же подставляет пустые строки, огромные числа, отрицательные значения, unicode и emoji, нулевые байты, null там, где его не ждали, массивы на миллион элементов.
— Звучит сочно.
— Да, скиллы, рулзы, md и txt и файлы с другими расширениями, конечно, круто. Но было принято ответственное решение ужесточить правила всех линтеров. Буквально всех: бэкенд, фронтенд, гит коммит месседж и т. д. Оживить все хуки и даже не давать делать коммит без соответствующих проверок. Тут в помощь pre-commit и husky. Кстати, в плане всех этих стандартов для меня находкой стало wemake-template и wemake-styleguide. Еще у Wemake.Service есть kira bot. Перенесём в него наш стайлгайд и также на уровне CI/CD будет проверять код на его соответствие. Конечно, для нейронок стайлгайд описан в рулсах, но штука это недетерминированная, лишней проверки не будет. Думаю, нелишним докинуть ещё парочку линтеров, которые мы не использовали раньше, например, importlinter. Ну и, как говорится, клин клином вышибает. Навайбкодим ещё линтер миграций, чтобы дедлок не словить и ещё ряд исторических кейсов, которые мы уже ловили, покрывать. Это позволит хотя бы базово снизить хрупкость системы. Ещё я, кстати, недавно graphify подкинул, чтобы вся эта машинерия помогала лучше ориентироваться по проекту.
А дальше — самое сложное. Надо научить наших ребят делать задачи с помощью агентов. Понимаешь, я испытываю тревогу из-за того, что многие просто копируют ТЗ и добавляют что-то типа «Ты профессиональный делальщик задач, сделай с первого раза и без ошибок». Конечно, есть тестировщик на это, но зачем нам лишний цикл возвратов? Безусловно, у нас в команде есть энтузиасты, которые в теме ИИ разбираются гораздо лучше нас с тобой вместе взятых, но в команде есть и другие ребята. Для кого это все в новинку или кто погружен на базовом уровне. Думаю, начнем с того, что хотя бы научим их гриллить задачи через grill me. Это набор скиллов от Matt Pocock. Эта штука кого угодно задолбает вопросами и уточнениями, волей-неволей придётся погрузиться в задачу.
— Что, прям все гриллить?
— Мы как-то обсуждали это с нашим CTO, пока выработали следующую шпаргалку:
plan-mode — пришли, сказали сделать что-то в пределах 2–4 часов и что-то, что не особо глубоко сидит в системе;
tdd-feature-flow — нужно сделать что-то стандартное, типикал таска на денёк-два;
Супапаверсы — по сути, душнее и дольше, но выше процент эффективности + доступен мультиагентный подход из коробки, тип думает Fable/Opus, а имплементирует Sonnet;
grill me — проверить, насколько план хорош, точно ли все понимают задачу. И уже для слвсем биг бой таскс.
Опишем в доку, покажем, проведем внутренний митап. Люди — это самый ценный ресурс, в них надо вкладываться, а не жаловаться, что они из коробки что-то не умеют.
Кроме того, лишний раз напомним, что за нейронку отвечает все ещё человек, а значит, если они используют ИИ как основной инструмент, это не снимает ответственности с них, с тебя, с меня. Надо постоянно держать это в голове.
— Ответственность — это, конечно, круто. Но мне кажется, некоторые как не читали ТЗ, как не запускали локально код, так ничего делать и не будут. Думаешь, твоё отеческое наставление поможет всем «почувствовать» ответственность?
— Может, и нет, тогда будем говорить с каждым отдельно. Думаешь, до нейронок не было айтишников, которые делали свою работу абы как? Были, просто сейчас это больше бросается в глаза. Но, концептуально, не поверишь, но если просто с глазу на глаз поговорить с человеком, по-людски, как есть, это даёт зачастую невероятный эффект. Без наездов, просто на ван-ту-ване обговорить проблематику. Объяснить, что, как и зачем мы делаем, где человек косячит, сколько раз это произошло, сколько всего уже сломалось по его вине и сколько еще сломается. Если не поможет раз, два, три, то, надо думать, возможно, даже прощаться, не знаю. Meat-прокси, который просто копирует и вставляет код, даже не убедившись, что он хотя бы запустится, думаю, вряд ли нам будет полезен. А если человек ответственно продумал решение, проработал тесты, уточнился по бизнес-правилам, локально потыкал, перед тем как отдать МР на ревью. Нейронка в таких руках точно усиление.
А, ну и да, дробить большие МРы на маленькие все ещё не панацея, но всё-таки лучше, чем ничего. Их хотя бы разбить на несколько ревьюеров можно в случае чего. Мы договорились, что я, аналитики и ПМы хорошенечко займутся декомпозицией задачи, прежде чем отдать её в разработку. А разрабы, в свою очередь, не поленятся нарезать потом это все на отдельные небольшие МРы. Логические группы МРов по 2–3 штучки можно делить на команду. При текущей интенсивности клодомашины это работает хотя бы как-то. Большие МРы ревьюеры будут разворачивать. Да, наверное, отказаться от парного ревью совместно с нейронкой уже не получится, но так хотя бы есть шанс, что, пока гудит машина, человек параллельно сможет смотреть эти сто строчек и будет сравнивать свое мнение с мнением Бога-машины. Пока, конечно, все на уровне договоренностей Meat-прокси с Meat-прокси. Если плохо себя покажет, добавим ещё один линтер в CI, который не пропустит кучу текста.
— Хех, от упоминания Meat-прокси даже захотелось заказать колбасок. Ну окей. С тонной сомнительного кода понятно. Есть ещё что-то?
— Да, буквально логическое продолжение. Все задачи на RnD, анализ чего-либо или составление документации превращаются в 500 строк (в лучшем случае) нейрослопа, которые просто скопировали из окна чата и вставили в тикет.
— Ага, ну это я видела, как ты решал.
— Да, к сожалению, никакой магии. На ван-ту-ванах, в регламентах, при ревью и приёмке задач я для всех явно обозначил: нейронкой можно и нужно пользоваться для анализа и ресерча. Но эта информация требует вашего человеческого процессинга. Вы все инженеры с экспертизой, вам платят за это. Я для каждого лично обозначил: просто скопировать из нейронки и вставить без вашей обработки, обработки как от специалиста, — не считается выполненной задачей. Тикет просто будет откинут на возврат. Я попытался донести до них мысль, что вставить вопрос в Клод и получить ответ я могу и сам. После чего задал резонный вопрос: зачем они в этой цепочке? Вроде как помогло. Пока что.
Ко мне после доклада сегодня, кстати, подходило несколько тимлидов, чтобы спросить совета, что делать с этими двумя проблемами, про которые я вот уже сколько тебе вещаю.
— Ты им рассказал то же самое?
— Да, магии нет, серебряной пули тоже.
В твоих силах заделать максимум, чтобы система не позволяла делать ошибки. Решаем это линтерами, тестами, хорошим харнесом, точной методологией. Дальше — работа с людьми. Научить работать с нейронками, показывать пример и постоянно напоминать про личную ответственность за результат. Не знаю, может, и есть решение лучше. Но я пока что не смог придумать ничего лучше. Ведь оно всегда так было: раньше копировали из SO, а не нейронок, но почему-то только нейронки убрали чувство ответственности. Не знаю. Вообще нейронки требуют от тебя максимальной осознанности и самоконтроля, а он есть не у каждого. Да что говорить, мне кажется, в нужной степени и у меня его нет.
— Звучит как подводка к ещё одному наблюдению.
— Так и есть.
Музыка стала чуть тише. Дело приближалось к ночи. Стало чуть менее душно. Компания за соседним столом куда-то исчезла. Пошла покорять следующий бар или вайбкодить новенький b2b ai saas? Так или иначе, стало заметно тише, и уже не приходилось так напрягаться, чтобы вести нашу чудесную светскую беседу.
— Как водится, зайдём издалека. Я читал какое-то исследование, и там было сказано, что наш мозг уже сейчас не готов к тем объёмам информации, которые через него проходят. А появление ИИ увеличило этот поток в десятки, а может, и сотни раз. Я даже по себе стал замечать, что если раньше я делал одну-две задачи, а сейчас я могу запустить пачку агентов делать задачи, ещё одного агента анализировать доку и параллельно сам ещё что-то смотреть по другой задаче. И проблема в том, что задачи эти я все равно пропускаю через себя: контекст, выводы по результатам, статусы. Добавь к этому постоянные переключения контекста, когда ты уже в принципе не работаешь сконцентрированно и получаешь чрезвычайную физическую, эмоциональную и моральную усталость. Я буквально ощущаю наступление киберпсихоза. Как, помнишь, это было в Cyberpunk 2077? Когда они ставили себе слишком много имплантов, и в определённый момент их голова уже не вывозила, и люди сходили с ума. Я чувствую: вот ещё немного, ещё чуть-чуть бизнес подкинет дровишек в уже и так разогнанный до безумия темп, и люди буквально начнут как минимум выгорать пачками, как максимум — ловить киберпсихоз. Мне иногда кажется, что я уже давно сошел с ума, подозреваю, что даже тебя не существует и я говорю сам с собой или с нейронкой, хахах. Хотя, как и импланты в киберпанке, агенты ощущаются как энергия солнца в твоих руках. Главное — не повторить участь доктора Отто Октавиуса из «Человека-паука 2», хаха. На самом деле спасаться от киберпсихоза важно не только из-за эгоистических соображений. Ты ведь и бизнесу лучше этим делаешь. Т. к. все задачи делаются в расфокусе, то и качество падает из-за недостаточного погружения. Надо стараться приструнять эту вымученную многопоточность. Ты не замечала за собой, что даже если хорошо отревьюила машинный код, то все равно уже завтра почти не помнишь, про что была задача?
— Да, есть такое, я тоже замечала за собой. Мб, не в таком объёме, как у тебя, но бывало. Зачатки AI-психоза наблюдаются. И как ты борешься с этим?
— Так же, как и борюсь просто с чрезмерным трудоголизмом. Через самоограничение. Очень быстро привыкаешь к хорошему. Смотрела мультик «ВАЛЛ-И»? Там технологии дошли до того, что люди перестали вообще что-либо делать сами и превратились в круглых толстяков, которые даже передвигаться самостоятельно не могут. Тут такая же история. Без самоограничения ты и думать перестанешь, если не будешь процессить инфу от нейронок, и просто перегреешься, если засунешь в себя ещё больше задач. Со спортом так же: форма и здоровье поддерживаются через дисциплину и самоограничение. Всегда клево ничего не делать, лежать на диване или пить пиво в баре. Но это путь в один конец. Гораздо более качественный путь, увы, через самоограничение. Давай, может, выйдем подышать?
Людей в баре стало чуть поменьше. Мы без особой давки переместились на улицу. Остановка «Ступеньки британского паба». Заметно похолодало. Возможно, зря я не взял куртку. Однако сегодня был последний более-менее тёплый денёк. Осенняя прохлада еще не остужала, а освежала.
— Кстати, вот впихивают в себя все задачи. А стали они делаться быстрее-то? Ты, небось, там за какими-то метриками следишь?
— Смотря что подразумевать под «быстрее», Маш. Если брать цикл от перехода задачи в работу до тестирования, то да, стали в некоторых случаях быстрее. Где-то больше, где-то меньше, но в целом можно заключить, что быстрее. Разного рода ресерчи ускорились, RnD-отдел заработал с небывалым энтузиазмом. Доку в конце концов наконец-то стали охотно и, что самое главное, быстро писать. С некоторыми оговорками, конечно, но такое есть. А если под «ускорением» подразумевать именно тайм-ту-маркет, то тут много нюансов.
Как по мне, непосредственно разработка никогда не была бутылочным горлышком, а если и была, то редко. Зачастую задачи не доезжают до релиза не потому, что мы долго писали код или не могли придумать, как реализовать эту фичу. Узким местом всегда была коммуникация. Продукт, сам не до конца продумав задачу, отдал её ПМу, ПМ по сломанному телефону исказил формулировку и отдал аналитику или разработчику, тот не до конца понял, что требуется, но решил не уточнять, взял под кепку как есть, сделал как есть. «Ниче, тестировщик потом посмотрит» — и тут начинается порочный круг возвратов из тестирования в разработку. Разработчик пока возьмёт эту задачу, пока вспомнит, пока поправит, пока зальет, пока тестер до нее дойдёт. И так задача на 4 часа может встрять на 3 дня. Говорить ртом очень помогает в этом процессе, но не каждый это делает.
А сейчас ещё, кстати, мы все действительно стали производить больше кода, больше задач брать в спринт, но, кажется, мы не подумали, что ресурс QA не резиновый.
— Я вот только хотела спросить за QA. Как там у них дела?
— Сильнее напряжённые, чем раньше, хаха. Мы взяли с рынка ещё парочку человек. Начали поднимать квалификацию наших ребят. Да, с непривычки мы словили ботлнек на тестировании, ну, ты помнишь. Но потом стало очевидно, что качественное планирование никто не отменял. Его не заменили нейронки. Оказывается, для планирования спринта и перед обещанием чего-то клиенту нужно учитывать не только капасити команды разработки, но и капасити команды QA. Кто же знал? Да, жонглировать нагрузкой было тяжело и раньше. Нужно сделать так, чтобы и разрабы не простаивали, и QA не зашивались. Благо у нас в бэклоге задачи пополняются достаточно быстро. Конечно, очередь на тестирование все равно иногда копится, но за счёт упражнения, которое называется приоритизация, удаётся с этим справляться.
— Не боишься, что пара солидных задач осядет на деве и мы утонем в бесконечном резолве конфликтов?
— Нет, не боюсь. Именно для этого Господь дал вам фича-флаги и Unleash, а я на протяжении года делаю акцент на модульности кода при ревью. Если какая-то фича будет давать нам кучу конфликтов и она застрянет на тестировании, то катнем её сразу на прод за выключенным фича-флагом. Так её код уже попадёт в мастер, но видимого эффекта это не даст. А там по ходу дела уже будем тестить, фиксить, докатывать.
Нас выдернули из разговора восторженные крики толпы рядом с баром. Оказывается, один из айтишников притащил с собой домашнюю лису. Она быстро стала центром внимания. Даже люди с другой улицы стали подходить, чтобы полюбоваться ей. Маша тоже не отказала себе в удовольствии подойти и погладить её.
— Блин, она прикольная, — сказала сияющая от восторга Маша. Мы вернулись уже в полупустой бар.
— Такс, а что ты думаешь по поводу моих тейков, которые я озвучила ранее?
— Хех, ну, касаемо разжижения мозга, есть такое. Но это ощущение из-за того, что ты не вникаешь в инфу или решение от нейронки. Мы начали пользоваться ими буквально как ГДЗ в школе, не вникая и не пропуская через себя. Если осмыслить происходящее, то сильно меньше ощущаешь этот дебаф, хаха. Я, кстати, ещё в качестве разминки для ума LeetCode стал решать и Codewars. Как математика, разум в порядок приводит. Хотя бы чуть-чуть. Попробуй.
— Справедливо. А что насчёт интереса к профессии?
— Да, слушай, аналогия с играми и интерактивным кино шикарная. Я буду её теперь всегда использовать, хаха. Может, даже в какой-то статье использую. Лично мне все ещё интересно проектировать какие-то штуки. Пусть и руками миньона-агента. Пропала ли часть той романтики? Для меня — да, но айти-сфера интересна не только набором символов в IDE, в ней интересные люди, например, сколько клёвых и интересных чуваков мы встретили сегодня на конфе. Меня лично общение с ними жёстко забустило и замотивировало. А чувство «созидания» никуда не делось. А лично для меня оно было первостепенным. Задачи в целом тоже интересные проскакивают периодически, хаха. Да, индустрия изменилась. Раньше и трава была зеленее, и комьюнити теплее. Но, если честно, если бы дали возможность вернуться туда, в прошлое. Я бы уже не хотел. Мы прошли определённый путь, и надо двигаться дальше. Ну и напомню: мы всё-таки с тобой профессионалы, ремесленники. Изменение инструментария не отменяет того, что мы должны хорошо делать свою работу. Экспертиза-то наша никуда не утекла. Расслабься и получай удовольствие. В конце концов, мы все участники большой системы, ты либо играешь по её правилам, либо нет. Я так из универа уволился. Понял, что систему мне не побороть, а играть по её правилам я не хочу. Так в случае чего опция свичнуть из айти в гусиную ферму всегда есть.
— Хахаха. Хорошо, я обдумаю это.
— Кстати, а что по рыночку сейчас думаешь? Уже имеет смысл взять три работы? Нас же теперь трое — Клод, Кодекс и я.
— Бога ради, давай этот разгон оставим до следующего раза. Вместе с разгоном, что нейронки больше не обучаются, а только подыгрывают людям, чтобы потом их поработить.
Маша рассмеялась. По её взгляду было видно, что она начинает потихоньку засыпать.
— ШТОЖ, я как тимлид на этой философско-ностальгической ноте предлагаю расход.
— Да, уже действительно поздно. Надо расплачиваться и выдвигаться.
Мы вышли из бара. Шумная компания айтишников, видимо, пошла все-таки покорять остальные заведения Нижнего Новгорода. Думаю, до самого утра их будут узнавать по бейджикам с конференции.
— Слушай, а неплохо поболтали, на самом деле. Проговорив с тобой многие вещи вслух, я поняла, что все не так уж и плохо, хах. В целом, я бы даже сказала, решаемо.
— Даааа. Наш бизнес — терпеть, и в нём мы лучшие!
Кажется, пришло время прощаться. Был рад тебя увидеть вживую. Айтишный шарик маленький. Может, ещё пересечемся.
Мы обнялись, Маша потопала вниз по Рождественской. А я направился в сторону гостиницы. Надо не забыть ещё скинуть Никите материал с Хабра про конкурс статей о внедрении ИИ. Может, и сам поучаствую. Чем черт не шутит.
ссылка на оригинал статьи https://habr.com/ru/articles/1097636/