Страница произведения
Войти
Зарегистрироваться
Страница произведения

Амальгама. Гл. 41-...


Жанр:
Опубликован:
07.02.2026 — 03.08.2026
Читателей:
2
Аннотация:
Текст книги стал слишком большим для одного файла, большой файл сложно редактировать, поэтому поделил на части. Комменты пишите в комментах первой части.
Предыдущая глава  
↓ Содержание ↓
↑ Свернуть ↑
  Следующая глава
 
 

— Это долго, — скривилась командир наблюдателей. — И ненадёжно. Кто-нибудь отменит приказ, или прикажет спустить всё на тормозах.

— Быстрее, чем ты думаешь, — Вере Фолиум пощёлкал тумблерами селектора. — Марина? Кто у тебя в отделе может организовать нейропоиск?

— Люсия лучше всех в этом разбирается, — ответила Марина Септима.

— Хорошо. Я скину вам имена, ИНН, номера автомобилей и прочие данные по некоторым антро. Пусть Люсия поищет, надо собрать как можно больше улик.

— Хотите устроить большой шухер? — в голосе Марины послышался смешок. — Сделаем.

— Большой нам не нужен, — усмехнулся куратор проекта 'Морф'. — Но виновных накажем.

Он отключил трансляцию, посмотрел на Фулгур и добавил:

— Любая коррумпированная иерархическая структура в случае опасности эффективно обрезает все нити, ведущие от конкретных исполнителей наверх. Они наверняка попробуют спустить дело на тормозах, но при этом устранят тех, кто отдавал приказы, чтобы уберечь от разоблачения других, кто сидит намного выше.

— Хорошо, действуй, — кивнула командир наблюдателей. — Это будет славная охота.

Фулгур любила иногда цитировать литературу антро. В этот раз она выбрала Киплинга.

Получив информацию, Марина просмотрела фамилии, имена, адреса, ИНН и прочие данные и сбросила их Люсии с указанием:

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

'Поняла, — ответила Люсия через пару минут. — С удовольствием помогу. Я как раз переобучила LLM из эквиноида и хотела её потестить на сложной многоэтапной задаче. Сейчас напишу сценарий поиска и запущу рой AI-агентов'.

-=W=-

Нови Сад, Сербия.

2022 год н. э.

Пару дней после последней переписки в чате ни Люсия, ни Марина на связь не выходили. Дмитрий уже начал беспокоиться и написал сам, пытаясь выяснить, что и как. Через несколько минут в чате появилось сообщение от Марины:

'Здравствуйте. Просим прощения за задержку. У нас было много работы, чрезвычайные обстоятельства. Ваш друг Андрей был ранен во время перехода. Встречающие друзья унесли его с собой. Сейчас его жизнь вне опасности, но ему ещё предстоит лечение'.

'Ранен? Что случилось? — написал Дмитрий. — Кто мог его ранить?'

'Его преследовали люди в камуфляже, с оружием, — ответила Марина. — Мы слишком поздно получили информацию'.

'Понял, — ответил программист. — Но он в порядке?'

'Он жив и поправляется, это главное', — написала в ответ Марина.

'А как насчёт мне поработать у вас? — спросил Дмитрий. — Не обсуждали это?'

'Обсуждали, — ответила Марина. — Но сразу предупреждаю, у нас не самая высокая зарплата. Немного выше средней по рынку для профессии. Если у вас большие ожидания по зарплате, то вас это может не устроить. Зато работа удалённая, и мы не запрещаем подработки и фриланс'.

'Понял, — написал программист. — В принципе нормально, конкретную сумму хотелось бы уточнить'.

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

Через минуту в чате появилась Люсия:

'Привет! — написала она. — В общем, у нас несколько основных направлений. Из них я могу тебе предложить веб-дизайн и поддержку форума, либо то, чем я в основном занимаюсь — разработку систем управления автономными объектами на базе искусственного интеллекта. Это сложнее, но намного интереснее. Придётся подучиться. А чему именно учиться, мы сейчас выясним'.

Она начала задавать вопросы:

'Прежде чем мы перейдём к архитектуре, давай пройдёмся по основам. Расскажи мне о своём опыте работы с базами данных'.

Дмитрий замялся на секунду, этот вопрос он совсем не ожидал:

'Использовал для бекенда, — ответил он, стараясь говорить чётко. — Почти везде PostgreSQL последней версии внутри Докера. Доступ из Python через SQLAlchemy, было несколько проектов на других ORM. Изменение структуры базы данных только через миграции, знаю, как не допустить SQL-инъекции в коде'.

'Хорошо, твой опыт релевантен только для реляционных СУБД? — уточнила Люсия. — А если мы говорим о распределённых системах? Допустим, у нас есть множество автономных интеллектуальных агентов, как это назвали бы в прошлом веке. Как бы ты обеспечил согласованность данных между ними при частичной потере связи?'

'Тут уже моих знаний недостаточно, но я бы взял существующую хорошо известную распределённую СУБД, и если конфиги позволяют, то хранил бы полную копию данных на каждой ноде. Если кластер рассыплется на несколько частей или несколько нод станут временно недоступными из-за сетевых проблем, то, по крайней мере, сохранятся данные. А при восстановлении связи алгоритмы консенсуса сольют данные в согласованное состояние. Но повторюсь: с распределёнными СУБД я не работал, лишь знаю, что в качестве первичных ключей используют не уникальный счётчик, а guid, которые гарантированно не повторяются на разных нодах'.

'Вопрос по теории, расскажи про гарантии, которая даёт СУБД, и как ты их понимаешь'.

'Всего их четыре: атомарность, согласованность, изоляция и устойчивость. С атомарностью всё просто: изменения данных происходят внутри транзакции, и все изменения либо фиксируются единым целым, либо полностью отменяются, без промежуточных состояний. Согласованность обеспечивает целостность данных каким-либо правилам внутри базы данных, например, ссылочную целостность или обязательность заполнения некоторых полей. Изоляция позволяет старым транзакциям читать старые версии данных и работать с одной и той же базой данных нескольким транзакциям одновременно. Почти все современные базы данных не позволяют "грязное чтение", когда другая транзакция видит незафиксированные данные чужой транзакции. И последнее: устойчивость. Если транзакция зафиксирована, то данные гарантированно сохранены в постоянное хранилище, даже сбой по питанию не уничтожит данные'.

Про уровни изоляции упоминать он не стал, так как почти не разбирался в этом. И так пришлось незаметно погуглить на смартфоне, он воздал славу высшему образованию, что в памяти хоть что-то осталось от 'ненужных' дисциплин, иначе у него точно не получилось найти даже это. 'Ты прыгаешь выше головы! Ты — обычный CRUD-формошлёп. Да в некоторых твоих проектах даже не было ссылочной целостности, все проверки только на уровне кода. Сейчас они скажут, что все существующие реализации им не подходят из-за низкой производительности, и дадут тебе задание написать движок СУБД на чистом Си'.

Люсия сделала паузу, видимо, обдумывая его ответ.

'Ты хорошо справляешься с теорией. Но давай проверим практику. У меня есть небольшой фрагмент кода на Python, который управляет очередью задач для обработки сигналов. Он работает... допустим. Можешь взглянуть на него прямо сейчас? Я скину ссылку в чат'.

В окне чата появилась ссылка на Pastebin.

Дмитрий увидел... ну код определённо был на Python, асинхронный. Запросы на SQL были вшиты прямо в код, а не генерировались ORM. Он пригляделся, выискивая бизнес-логику. Её не было, весь код был просто клеем, который слеплял разные куски кода.

'Дай мне полчаса на развёртывание окружения', — сказал он, открывая редактор кода.

Он начал быстро просматривать строки. Библиотеки не подцепились из интернета, код было невозможно даже запустить. Первый SQL-запрос хитрым образом через for update skip locked забирал из очереди задач пачку данных, одновременно помечая, что эти задачи взяты в работу. Дальше функция эмулировала тяжёлую обработку путём нескольких миллиардов итераций в цикле и 'вычисленные' данные записывались в другую очередь через on conflict do nothing, при этом задача помечалась как окончательно выполненная.

Были и странности в коде, например, 'where status::smallint = :status::smallint' в запросе, Дмитрий при рефакторинге удалил бы лишнее, но рядом стоял комментарий на латинском про собачий пенис и неработающий индекс.

'Это же диалект PostgreSQL?'

'Собственный форк, но совместимый'.

Через десять минут у него уже был поднят Докер-контейнер с СУБД и созданы две таблицы. Неизвестная библиотека была заменена на обычный драйвер PostgreSQL, остальной код остался без изменений, api оказалось и правда совместимым.

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

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

Дмитрий откинул голову на кресло. Сложность оказалась не в том, что код делал, а что код не делал или делал неправильно.

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

'Тогда мне кажется, что ты хорошо впишешься в нашу команду по разработке систем управления, — написала Люсия. — Ты понимаешь суть задачи. Но учти, работа с автономными объектами — это большая ответственность. Ошибка в коде здесь может стоить дорого. Ты готов к тому, что твои задачи будут проверяться на соответствие протоколам безопасности до мельчайших деталей?'

'Я понимаю, — ответил программист. — Если хочешь, я могу начать с написания модулей самодиагностики и тестов на отказоустойчивость именно для этих узлов'.

'Может быть... — Люсия, видимо, обдумывала предложение. — Хорошо. Сейчас доложу Марине результаты и свои рекомендации. Моё мнение — мы сработаемся, тем более, опыт совместной работы у нас уже есть. Марина назовёт сумму, эти вопросы она решает'.

'Хорошо, жду', — ответил Дмитрий.

Ждать пришлось где-то полчаса. В это время Дмитрий изучал код в редакторе, пока не всплыло уведомление о сообщении в чате. Ответ Марины был краток — просто сумма в евро. Дмитрия она более чем устроила.

'Согласен', — написал он.

'Тогда мы готовим контракт, — ответила Марина. — Всё оформим в ближайшие два-три дня, ездить далеко не придётся, к вам подъедет курьер с документами для подписи. Пока можете начать работать с Люсией, чтобы быстрее войти в курс наших разработок'.

'Я готов', — написал Дмитрий.

-=W=-

Санкт-Петербург.

2022 год н. э.

Майор стоял перед столом генерала навытяжку. И не просто так в боковом кресле сидел какой-то незнакомый майору сотрудник в сером казённом костюме, от которого за версту несло службой внутренней безопасности.

Лейтенант облажался. Майор для того и посылал этого зарвавшегося юнца на Урал. Но облажаться можно по-разному. Лейтенант обделался с таким резонансом, что скрыть провал от начальства не получилось. Теперь эта история могла крепко ударить и по самому майору.

— Ну, Иванов#все имена и события придуманы, любые совпадения с реальными людьми и событиями случайны и непреднамеренны#, — устало вздохнув, произнёс генерал. — Давай, расскажи нам, что там учудил твой Сидоров на Урале. И на каких таких основаниях?

— Лейтенант Сидоров был отправлен в служебную командировку по делу того инженера, — доложил майор. — Обстоятельства дела я вам докладывал, — он кивнул на папку с делом, лежащую на столе перед генералом.

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

— Из открытых источников, — вежливо уточнил майор. — По прибытии лейтенант Сидоров сформировал группу захвата из местных сотрудников и организовал задержание объекта. Так как объект значительно опережал группу захвата по времени, я помог обеспечить доставку группы захвата вертолётом. Мы также провели обыск в квартире фигуранта по делу. Изъяли компьютер, много отдельных радиодеталей, справочники по радиоделу. Что действительно удивило — на компьютере нашли только рабочие файлы. Жёсткий диск совершенно новый, был куплен несколько дней назад в магазине DNS. Даже ни одного удалённого файла не нашлось.

— Это всё мы уже знаем, майор, — оборвал его генерал. — Сидоров твой где? Фигурант — где? Группа захвата — где? Вертолёт, мать твою, где?

— Вертолёт мы нашли, — доложил майор. — В лесу, в восьми километрах к юго-западу от предполагаемого места высадки группы. Вертолёт упал в лес и полностью сгорел. Эксперты не исключают возможность внешнего воздействия.

— 'Внешнего воздействия', говоришь? — уже сам тон генерала не предвещал ничего хорошего. — 'Эксперты не исключают', говоришь? Вот объясни мне, Иванов, как вертолёт мог в полёте получить такие повреждения?

— Я же не эксперт по авиационным происшествиям, тащ генерал!

— Да ты, Иванов, и в своих непосредственных обязанностях, я смотрю, не эксперт, — многообещающе заметил генерал. — Ну, так где твой Сидоров, его группа захвата и фигурант?

— Мы всё обыскали с местными, тащ генерал! — ответил майор. — Там в тот день вечером и ночью сильный ливень прошёл. Следы, похоже, смыло. Мы прочесали несколько раз весь склон от перевала на юг до реки. Ничего не нашли. Одиннадцать человек и собака как сквозь землю провалились. Фигурант, сам Сидоров, восемь местных сотрудников и местный охотник с собакой, его взяли вместо кинолога. Местные ведут себя странно. Говорят, что место там дурное.

— Ну, ты мне ещё эту байку про перевал Дятлова и студентов расскажи! — оборвал его генерал. — Туда туристы сотнями ездят и ходят с пятьдесят девятого года! Какое, б@я, 'дурное место'?

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

Майор похолодел. Разговор принимал очень неприятный оборот.

— Молчите? А вот мы поинтересовались, — продолжил подполковник. — После того, как провели обыск у вашего лейтенанта. И заинтересовало нас, откуда у вашего Сидорова деньги на трёхкомнатную квартиру в новом жилом комплексе? И на новый 'Гелендваген'? Заметьте, у него не 'Лада', и не 'Логан', а 'Гелендваген'.

— Э-э... Кредит, вероятно? — предположил майор.

— Его официальной зарплаты не хватит, чтобы одновременно выплачивать ипотеку и кредит на такую машину. Машина была куплена за наличные, — ответил подполковник. — И вот что мы ещё нашли у вашего лейтенанта. Сто шестьдесят восемь икон семнадцатого, восемнадцатого и начала девятнадцатого веков. Старинные издания, книги, в том числе рукописные, ещё более старые, пятьдесят четыре экземпляра. Золотые и серебряные монеты разных стран, дореволюционные в основном. Общую сумму только за монеты оценили около восьмидесяти миллионов рублей. В компьютере у вашего Сидорова нашли контакты тридцати трёх перекупщиков антиквариата, и о-очень интересную с ними переписку. Вы знали об увлечении лейтенанта антиквариатом?

123 ... 7778798081 ... 858687
Предыдущая глава  
↓ Содержание ↓
↑ Свернуть ↑
  Следующая глава



Иные расы и виды существ 11 списков
Ангелы (Произведений: 91)
Оборотни (Произведений: 181)
Орки, гоблины, гномы, назгулы, тролли (Произведений: 41)
Эльфы, эльфы-полукровки, дроу (Произведений: 230)
Привидения, призраки, полтергейсты, духи (Произведений: 74)
Боги, полубоги, божественные сущности (Произведений: 165)
Вампиры (Произведений: 241)
Демоны (Произведений: 265)
Драконы (Произведений: 164)
Особенная раса, вид (созданные автором) (Произведений: 122)
Редкие расы (но не авторские) (Произведений: 107)
Профессии, занятия, стили жизни 8 списков
Внутренний мир человека. Мысли и жизнь 4 списка
Миры фэнтези и фантастики: каноны, апокрифы, смешение жанров 7 списков
О взаимоотношениях 7 списков
Герои 13 списков
Земля 6 списков
Альтернативная история (Произведений: 213)
Аномальные зоны (Произведений: 73)
Городские истории (Произведений: 306)
Исторические фантазии (Произведений: 98)
Постапокалиптика (Произведений: 104)
Стилизации и этнические мотивы (Произведений: 130)
Попадалово 5 списков
Противостояние 9 списков
О чувствах 3 списка
Следующее поколение 4 списка
Детское фэнтези (Произведений: 39)
Для самых маленьких (Произведений: 34)
О животных (Произведений: 48)
Поучительные сказки, притчи (Произведений: 82)
Закрыть
Закрыть
Закрыть
↑ Вверх