dbit.one© 2026
000
booting_
Loading experience0%
dbit.one
Кто отвечает за результат

Дониёр
Ботиров.

Основатель · Пишет архитектуру сам

Вы получаете инженера, который писал код, а не аккаунт-менеджера с презентацией.

Ташкент · UTC+5Пятый год в разработкеОтвечает лично
Дониёр Ботиров
Наведите — свет идёт за курсором

Позиция

Разработку продают часами и людьми. Покупают результат и спокойствие. Поэтому я показываю не резюме команды, а измеримые вещи: что было до, что стало после и чем померено.

Я тимлид по складу: собираю команду вокруг задачи и остаюсь в ней до релиза, а не передаю проект дальше по конвейеру. За пять лет в разработке я ни разу не видел, чтобы смена рук после подписания договора шла проекту на пользу.

Любую систему проще сделать быстрой сразу, чем потом объяснять, почему она медленная. Первый экран этого сайта я довёл с 6,4 до 2,2 секунды — на своём сайте, а не на клиентском: чужие цифры проверить нельзя, а мои можно прямо сейчас.

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

Что это значит на проекте

01

Архитектуру пишу сам

Проект не переходит в другие руки после подписания договора. Кто продавал — тот и строит.

02

На созвонах — я, а не менеджер

Технические вопросы решаются в момент разговора, а не «уточню у команды и вернусь».

03

Гарантия не заканчивается вместе с оплатой

Дефекты в коде, который написали мы, чиним бесплатно — без срока давности.

04

Отказываюсь, если не потяну

«Нет» на созвоне дешевле для вас, чем сорванный срок через три месяца.

Проверьте на этом сайте

Клиентские системы под NDA, и на слово их принимать не нужно. Зато этот сайт сделан теми же руками, и всё в нём измеримо — включая то, что было сделано плохо и потом исправлено.

6,4 → 2,2 с
Первый экран на мобильном. Причина и методика замера — в блоге.
−79 %
Вес фотографий на телефоне после переработки конвейера изображений.
0 → 60
Блоков, читаемых без JavaScript. Было ноль из шестидесяти.
42
Технических материалов на трёх языках. Включая разбор собственной ошибки.

Системы, которые строил

Управление парком тяжёлой техникиМировой производитель
Национальная система здравоохраненияГосударственный масштаб
ИИ-ассистент врачаУниверситетский госпиталь
Аналитический контур розничного банкаФинтех
CRM сети учебных заведенийЦентральная Азия

Имена заказчиков под NDA. Названия, договоры и контакты для рекомендаций показываю на созвоне под встречное соглашение.

Открытый код

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

Метод
unflakeСмотреть на GitHub

Асинхронные баги не случайны. Случаен лишь порядок выполнения, который выбирает операционная система, — поэтому ошибка всплывает раз в триста прогонов и не воспроизводится. unflake отбирает этот выбор у ОС: время, таймеры и порядок готовых колбэков становятся значениями из сида. Один сид — один и тот же прогон, побайтово. Найденный баг сжимается до минимального расписания и повторяется на любой машине.

TypeScriptMITНоль зависимостейОпубликован в npm
Метод: согласие между машинами
bulwarkСмотреть на GitHub

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

TypeScriptMIT5 свойств безопасностиМузей багов: 7 экспонатовnpm: @botiroff/bulwark
Метод: согласие внутри одной
adyaСмотреть на GitHub

Каждая база данных заявляет уровни изоляции. Почти никто не может показать, что его уровень на самом деле допускает. Фраза «у нас snapshot isolation» — это два утверждения сразу: что ничего слабее не случается и что это действительно SI, а не что-то более строгое под тем же именем. Ни одно не проверяется чтением кода — это свойства исполнений, а не текста. adya ловит исполнения и допрашивает их: с одной стороны MVCC-движок с четырьмя уровнями изоляции, где serializable сделан алгоритмом Кэхилла — тем самым, что стоит в PostgreSQL; с другой — проверка, которая строит из наблюдаемой истории граф зависимостей, ищет в нём циклы и называет найденное именами из диссертации Адьи: G0, G1a, G1b, G1c, G-single, G2-item. Каждый уровень проверяется в обе стороны: он не производит того, что обязан предотвращать, и производит то, что предотвращает следующий. Ни одной стороне не доверяют отдельно — они уличают друг друга.

TypeScriptMIT4 уровня изоляции6 феноменов по Адьеnpm: @botiroff/adya
Доказательство вместо выборки
pnueliСмотреть на GitHub

Этот репозиторий существует из-за одной фразы в разделе ограничений unflake: сотни сидов — очень хороший фаззинг, но не теорема. Выборка расписаний находит баги и никогда не доказывает их отсутствие; доказать — значит обойти все достижимые состояния, а это экспонента. Поэтому содержательная часть model checker — не поиск, а то, что позволяет не искать: симметрия (шесть взаимозаменяемых процессов дают 15 625 назначений, но всего 210 мультимножеств) и частично-упорядоченное сокращение. Ключевая проблема в том, что сломанное сокращение отвечает ровно то же, что и рабочее, — «нарушений не найдено». Поэтому полный перебор оставлен рядом, медленный и неспособный ошибиться, и каждая спецификация обязана дать в обоих совпадающий вердикт. Живость проверяется под слабой справедливостью: спинлок ловится контрпримером, алгоритм Петерсона проходит.

TypeScriptMITПолный перебор рядом с сокращениямиnpm: @botiroff/pnueli

Прямая линия

Почта
[email protected]
Телефон
+1 (929) 435-5537
Telegram
@dbitone
GitHub
BOTIROFF-D
Ответ
в течение рабочего дня