
Привет, коллега. 👨💻 Если ты читаешь это, то, скорее всего, столкнулся с ситуацией, где твой код или код твоей команды стал предметом спора, аудита или просто серьёзных сомнений. Меня зовут Максим, я lead developer с 12-летним стажем, и последние 5 лет я параллельно погрузился в мир судебной и независимой программной экспертизы. Это не про сухие юридические протоколы. Это про то, как мы, разработчики, можем на языке фактов, метрик и конкретных строчек кода объяснить, что наша работа стоит денег, или доказать, что с нами поступили нечестно. В Москве и МО, где IT-рынок горяч как процессор под load test’ом, этот навык становится must-have.
Чем «судебная» отличается от «независимой»? Грубо, но понятно
Представь себе git.
- Независимая экспертиза программ — это когда ты сам, по своей инициативе, делаешь глубокий git bisect и git blame на проблему, прежде чем создать тикет или пойти на конфликт. Ты собираешь log, метрики, профилирование, чтобы аргументированно поговорить с заказчиком или коллегой. Цель — не доводить до суда, а иметь железобетонные аргументы для переговоров.
- Судебная программная экспертиза — это когда конфликт уже ушёл в арбитражный суд в Москве, и судья, который в жизни не видел console.log(), назначает тебя «экспертом». Твой git bisect теперь называется «исследованием», а выводы из git log — «заключением». Это процессуальная штука, но в основе — те же самые техники, что и в первом случае, только с криминалистическим протоколом (фиксация хэшей, неизменность данных).
Мой стек для проведения экспертизы (независимой или судебной)
Когда я берусь за программную экспертизу, я не изобретаю велосипед. Я использую и комбинирую инструменты, которые и так есть в арсенале любого серьёзного dev’а.
- Статический анализ и метрики:SonarQube, Checkstyle, PMD, CLOC. Мне нужны цифры: цикломатическая сложность (Cyclomatic Complexity), поддержка долга (Technical Debt), количество строк кода (SLOC). Это не просто цифры — это объективные свидетели. Если в договоре был модуль «средней сложности», а по метрикам Холстеда его V (volume) зашкаливает, это аргумент. 📊
• Анализ зависимостей (Dependency Graph): deptry, OWASP Dependency-Check. Кто и что подключил? Граф зависимостей — это карта проекта. Резкое изменение графа между версиями может указывать на «заимствования». npm audit или его аналоги — для выявления известных уязвимостей, которые могли привести к инциденту. 📦
• Сравнение кода (Code Diffing): Тут нужно что-то мощнее git diff. Я использую jscpd для поиска дублированного кода даже после рефакторинга и специализированные утилиты для семантического сравнения (анализ AST — Abstract Syntax Tree). Это чтобы найти не просто копипаст, а адаптированные фрагменты. 🔍
• Профилирование и динамический анализ: JProfiler, Chrome DevTools, Wireshark. Когда говорят «система тормозит» или «память течёт», мы не гадаем на кофейной гуще. Мы снимаем дампы, строим flame graphs, смотрим на аллокации. Это позволяет с точностью до строчки кода указать на O(n^2) там, где обещали O(n log n). ⚡
• Инструменты реверс-инжиниринга (для бинарей): Ghidra, IDA Pro, JD-GUI. Когда исходников нет, но нужно понять, что делает black box. Особенно актуально в спорах вокруг проприетарных библиотек или мобильных приложений.
Какие вопросы мы решаем? Примеры из практики (Москва/МО)
Блок вопросов по качеству кода и соответствию ТЗ:
• «Соответствует ли фактическая архитектура сервиса (например, монолит vs. микросервисы) той, что была согласована в дизайн-документе?» → Строим граф коммуникаций сервисов и сравниваем с диаграммой в Confluence. 🏗️
• «Содержит ли код ошибки, которые могут считаться критичными с точки зрения соглашения об уровне обслуживания (SLA)?» → Ищем unhandled exceptions, проверяем таймауты, анализируем реализацию retry-логики. 🐛
• «Является ли низкая производительность API следствием ошибки в алгоритме или недостаточности инфраструктуры?» → Проводим нагрузочное тестирование (k6, JMeter) с профайлингом, изолируем код от инфраструктуры. ⏱️
Блок вопросов по авторству и заимствованиям:
• «Насколько уникален алгоритм рекомендаций в нашем продукте?» → Выделяем ядро алгоритма, сравниваем его семантику (а не синтаксис) с открытыми аналогами и кодом конкурента через анализ AST. 🧠
• «Можно ли доказать, что бывший сотрудник использовал наш код в стартапе?» → Ищем уникальные «артефакты»: специфичные названия переменных, структуры конфигов, комментарии с внутренними шутками, одинаковые «костыли». 👨💼➡️🚀
• «Каков вклад каждого разработчика в итоговый код?» → Анализ git blame и git log с учётом сложности изменённых модулей (метрики). Не просто количество коммитов, а взвешенная оценка.
Блок вопросов по инцидентам и безопасности:
• «Что стало первопричиной (root cause) падения продакшн-базы данных?» → Анализируем логи БД, код миграций, изучаем, какое именно изменение (ALTER TABLE без DEFAULT) привело к каскадному отказу. 💥
• «Был ли в код внедрен backdoor?» → Ищем неочевидные сетевые вызовы, анализ зависимостей на предмет поддельных пакетов (dependency confusion), странные условия, срабатывающие по времени или внешним признакам. 🚨
• «Привела ли конкретная SQL-инъекция к утечке данных?» → Воспроизводим уязвимость на тестовом стенде, трассируем поток данных от входа до сетевого пакета. 🛡️
Пять реальных кейсов из нашей практики (Москва и область)
Кейс 1: «Дырявый» алгоритм расчёта стоимости доставки (Москва, e-commerce)
Контекст: Заказчик обвинил нашу команду в том, что алгоритм, который мы передали, даёт стоимость на 15-20% выше рынка. Требовали штраф.
Что делали (независимая экспертиза программ):
- Взяли эталонный алгоритм из ТЗ (математическая формула в PDF).
- Реализовали его на Python («эталон»).
- Инструментировали продовый код на Java (через AspectJ) для логирования всех входных данных и промежуточных результатов.
- Запустили оба алгоритма на одном срезе исторических заказов.
Находка: Расхождение было только для заказов с весом > 100 кг. В ТЗ было: «при весе > 100 кг применяется коэффициент K». В нашей реализации было условие if (weight > 100) { k = k * 1.15 }. В эталоне — if (weight >= 100) { … }. Проблема в пограничном условии! Для веса ровно 100 кг коэффициент не применялся.
Итог: Предоставили заказчику отчёт с логами, показывающими, что ошибка — в интерпретации ТЗ, а не в некомпетентности. Спор свели к уточнению ТЗ и небольшой доработке. Форма независимой экспертизы программ спасла отношения. 📦➡️🧮➡️🤝
Кейс 2: «Чей это микросервис?» (Московская область, финтех)
Контекст: Две команды после реорганизации спорили, кто написал ключевой сервис валидации платежей. От этого зависело распределение бонусов.
Что делали (фактически, судебная программная экспертиза по внутреннему запросу):
- Подняли историю Git за 3 года. git log —pretty=format:»%H %an %ad %s» —date=short и т.д.
- Применили git fame и подобные инструменты для анализа вклада.
- Ключевое: провели стилометрический анализ. Сравнили паттерны кода (например, предпочитает ли разработчик for или .forEach(), как именует приватные поля, оформляет Javadoc) в спорном сервисе и в других, бесспорно написанных каждой из команд.
Находка: Ядро сервиса (80% логики) имело стиль, статистически значимо совпадающий с кодом Команды А. Однако, важный модуль логирования и мониторинга (20%) был выполнен в стиле Команды Б и закоммичен позже.
Итог: Представили вывод: сервис был создан Командой А, а затем существенно доработан и «оплачен» Командой Б. Распределили признание и бонусы пропорционально. Графики из git fame и таблицы со стилевыми метриками были убедительнее любых слов. 👥➡️💻➡️⚖️
Кейс 3: Самоуничтожающийся легаси-код (Москва, ритейл)
Контекст: Старая система учёта, написанная на Delphi, после определённой даты начала «глючить»: замедлять расчёты. Подозревали саботаж уволившегося разработчика.
Что делали (комплексная независимая программная экспертиза):
- Декомпилировали бинарники (с помощью Hex-Rays).
- Искали в коде проверки на дату. Нашли функцию CheckDate().
- Внутри был неочевидный алгоритм: если дата позже определённого дня, система запускала фоновый поток, который вхолостую гонял тяжелые математические вычисления, потребляя CPU.
- Проанализировали git-аналоги той эпохи (историю в SVN) — кто и когда вносил эту функцию.
Находка: «Логическая бомба» была заложена за полгода до увольнения главного разработчика. Код был замаскирован под «прогрев кэша».
Итог: Предоставили руководству компании подробный отчёт с дизассемблированным кодом и трассировкой выполнения. Это помогло не только устранить проблему, но и послужило основанием для обращения в правоохранительные органы. 💣➡️🕰️➡️🔨
Кейс 4: «Оно просто не масштабируется!» (Московская область, SaaS-платформа)
Контекст: Заказчик отказывался принимать продукт, утверждая, что он не выдерживает обещанные 10к одновременных пользователей.
Что делали (экспертиза в рамках арбитража, почти судебная):
- Воссоздали тестовое окружение.
- Провели серию нагрузочных тестов с k6, фиксируя не только общие метрики (RPS, latency), но и детальное профилирование (async-profiler) и метрики БД.
- Сравнили поведение системы под нагрузкой с графами из дизайн-документа.
Находка: Проблема была не в «масштабируемости» вообще, а в одном конкретном запросе /api/v1/report/generate. При высокой нагрузке он начинал выполнять SELECT N+1 в цикле, что убивало БД. Остальная система работала стабильно.
Итог: В заключении чётко указали: «Система не соответствует требованию ТЗ по показателю latency для эндпоинта /api/v1/report/generate при нагрузке > 8k RPS. Остальной функционал соответствует». Это позволило суду назначить соразмерную неустойку, а не отказываться от всего продукта. 📈➡️🐌➡️🔧
Кейс 5: «Чужой» модуль в опенсорсе (Москва, стартап в edtech)
Контекст: Привлеченный инвестор усомнился в уникальности нашего ядра — движка для проверки заданий по программированию.
Что делали (независимая экспертиза для due diligence):
- Составили полный граф зависимостей нашего проекта.
- Для каждого ключевого модуля провели поиск по GitHub (с помощью github-search-api) и в базах открытого кода.
- Где находили похожие решения — делали глубокое семантическое сравнение (не text diff, а сравнение логики).
Находка: Нашли 3 открытых библиотеки, которые мы использовали и модифицировали (что было OK). Но также нашли, что наш «уникальный» алгоритм сравнения AST-деревьев для поиска плагиата у студентов на 70% совпадал с исследовательским кодом из arXiv. Мы его существенно доработали, но корень был не наш.
Итог: Мы честно представили инвестору карту: вот что уникальное наше (и мы это доказали метриками и сравнениями), вот что взято извне. Прозрачность усилила доверие, а не убила сделку. Потому что качественная независимая программная экспертиза — это про правду, а не про то, чтобы что-то скрыть. 🎓➡️🔍➡️✅
Философия
Для меня судебная и независимая программная экспертиза — это не адвокатская контора. Это engineering investigation. Мы не «защищаем» и не «обвиняем». Мы исследуем код, как исследуют лог-файлы после инцидента. Мы ищем баг в процессе, ошибку в коммуникации, нестыковку в требованиях. Наш вывод — это root cause analysis, а наше заключение — это подробный post-mortem, понятный технарям, менеджерам и, при необходимости, судье в арбитраже Москвы.
Если твой код попал в переделку, или тебе нужно понять, что на самом деле происходит в чужом репозитории — пиши. Будем разбираться как инженеры.
Связаться и заказать судебную или независимую программную экспертизу: https://kompexp.ru/ 👨💻⚖️🔍🐛📊

Бесплатная консультация экспертов
Здравствуйте! Вынесен штраф за нарушение габаритов прицепа на 14 см. Фактически нарушения небыло. Груз -…
Добрый день. Нужна автотехническая экспертиза по назначению суда.
Гербовая печать в трудовой книжке неразборчива. Нужно, чтобы ваши эксперты расшифровали печать и чтобы я…
Задавайте любые вопросы