Архитектор решений: чем он занимается и как войти в профессию
Одна пропущенная система на схеме может обернуться сдвигом сроков и ростом бюджета: её доработку просто не заложат в проект. Архитектор решений должен заметить такой промах до реализации.
Он разбирает бизнес-требования на функции, распределяет их по системам и проектирует обмен данными между ними. Результат: архитектурный вижен, то есть диаграммы систем, интеграций, процессов и ролей. Это концепция будущих изменений, которую уточняют на следующих этапах.
Материал пригодится разработчикам, аналитикам, тимлидам и руководителям, которые присматриваются к роли архитектора решений. В нём разобраны необходимые знания, онбординг, первый год работы и собеседование с практическими задачами: кандидату нужно запросить недостающие данные, сравнить варианты и защитить решение.
Одна пропущенная система на схеме может обернуться сдвигом сроков и ростом бюджета: её доработку просто не заложат в проект. Архитектор решений должен заметить такой промах до реализации.
Он разбирает бизнес-требования на функции, распределяет их по системам и проектирует обмен данными между ними. Результат: архитектурный вижен, то есть диаграммы систем, интеграций, процессов и ролей. Это концепция будущих изменений, которую уточняют на следующих этапах.
Материал пригодится разработчикам, аналитикам, тимлидам и руководителям, которые присматриваются к роли архитектора решений. В нём разобраны необходимые знания, онбординг, первый год работы и собеседование с практическими задачами: кандидату нужно запросить недостающие данные, сравнить варианты и защитить решение.
❤13🔥9⚡3👍3🤔3🎉3👎1😱1🌚1😈1😭1
Кто должен решать, к данным какого клиента обращается ИИ-агент
Модель может составить безупречный вызов инструмента и запросить договор из чужого аккаунта. Схема верна, аргумент подходит, но договор принадлежит другому клиенту. Более строгий промпт снизит риск, однако границей авторизации не станет.
Автор собрал экспериментальную Rust-библиотеку TenantInvariant. Модель передаёт только идентификатор ресурса, сервер сам находит владельца в базе и сравнивает его с аккаунтом авторизованного пользователя. Если владельцы различаются или поиск ничего не вернул, вызов блокируется.
Код и сценарные тесты охватывают поддельный идентификатор клиента и пакет ресурсов от разных владельцев. При этом библиотека не заменяет проверку разрешений и запросы с ограничением по клиенту. Для SaaS здесь полезнее самой библиотеки порядок проверок: модель предлагает ресурс, а полномочия определяет сервер.
Модель может составить безупречный вызов инструмента и запросить договор из чужого аккаунта. Схема верна, аргумент подходит, но договор принадлежит другому клиенту. Более строгий промпт снизит риск, однако границей авторизации не станет.
Автор собрал экспериментальную Rust-библиотеку TenantInvariant. Модель передаёт только идентификатор ресурса, сервер сам находит владельца в базе и сравнивает его с аккаунтом авторизованного пользователя. Если владельцы различаются или поиск ничего не вернул, вызов блокируется.
Код и сценарные тесты охватывают поддельный идентификатор клиента и пакет ресурсов от разных владельцев. При этом библиотека не заменяет проверку разрешений и запросы с ограничением по клиенту. Для SaaS здесь полезнее самой библиотеки порядок проверок: модель предлагает ресурс, а полномочия определяет сервер.
👏9❤7🤝4😢3👎2💯2😴2🎃2🎅2🆒2😘1
Как реализовать приложения в гибриде?
Гибридная инфраструктура хороша тем, что позволяет не держать всю нагрузку в одном месте. Например, часть ресурсов можно оставить on-premises, а переменную или более тяжёлую нагрузку переносить в облако — в зависимости от требований и стоимости.
В Yandex Cloud для этого есть Cloud Interconnect: он соединяет разные контуры по приватному соединению без выхода в интернет. BareMetal Extend: Virtualization позволяет развернуть готовое частное облако на выделенных серверах, а VPC Private Endpoint — организовать защищенную связь между ресурсами внутри облачной инфраструктуры.
Отдельный пласт — управление расходами. Intelligent Tiering в Object Storage сам перемещает данные между классами хранения, а через публичный API Yandex Cloud Billing можно получать детализацию потребления и расходов по периодам.
Гибридная инфраструктура хороша тем, что позволяет не держать всю нагрузку в одном месте. Например, часть ресурсов можно оставить on-premises, а переменную или более тяжёлую нагрузку переносить в облако — в зависимости от требований и стоимости.
В Yandex Cloud для этого есть Cloud Interconnect: он соединяет разные контуры по приватному соединению без выхода в интернет. BareMetal Extend: Virtualization позволяет развернуть готовое частное облако на выделенных серверах, а VPC Private Endpoint — организовать защищенную связь между ресурсами внутри облачной инфраструктуры.
Отдельный пласт — управление расходами. Intelligent Tiering в Object Storage сам перемещает данные между классами хранения, а через публичный API Yandex Cloud Billing можно получать детализацию потребления и расходов по периодам.
❤12👍9👏5🔥4🤷♂2👎2👌2🫡2😘2😢1🌚1
Forwarded from Веб-страница
Как читать HTML-реликты из эпохи браузерных войн
В старом
Другие теги защищали страницу от вмешательства сторонних программ. Skype Toolbar превращал номера телефонов в кнопки и мог ломать вёрстку, поэтому сайт отключал его отдельным метатегом. Baidu пропускала мобильные страницы через свой сервис, перестраивала макет, удаляла стили и подменяла рекламу; от этой обработки тоже можно было отказаться в разметке.
Разбор Antiquated HTML Snippets and Artefacts пригодится при ревизии унаследованных шаблонов: сначала выясните, какую интеграцию обслуживала незнакомая строка и существует ли её цель, а затем решайте, удалять ли её.
В старом
head можно встретить строки, смысл которых уже не восстановить по имени. Например, X-UA-Compatible заставлял Internet Explorer выбирать самый новый доступный режим документа, а условные комментарии показывали разную разметку отдельным версиям браузера.Другие теги защищали страницу от вмешательства сторонних программ. Skype Toolbar превращал номера телефонов в кнопки и мог ломать вёрстку, поэтому сайт отключал его отдельным метатегом. Baidu пропускала мобильные страницы через свой сервис, перестраивала макет, удаляла стили и подменяла рекламу; от этой обработки тоже можно было отказаться в разметке.
Разбор Antiquated HTML Snippets and Artefacts пригодится при ревизии унаследованных шаблонов: сначала выясните, какую интеграцию обслуживала незнакомая строка и существует ли её цель, а затем решайте, удалять ли её.
🤔7👀4🔥3🍾3👍2👌2👾2☃1❤1🍓1😘1
Как GitHub перенёс движок Copilot на Rust силами Copilot
GitHub переписал общий движок Copilot с TypeScript на Rust: вышло более 800 тысяч строк производственного кода. Большую часть написали ИИ-агенты, а 128 пул-реквестов вливали в основную ветку и выпускали постепенно.
Раньше каждое приложение через SDK запускало отдельный процесс с Node.js и V8. Это означало минимум около 100 МБ памяти и обмен данными между процессами. Версию на Rust можно встраивать в приложение.
Для больших переписываний интересна стратегия: каждый пул-реквест заменял реализацию одного компонента и оставлял прослойку, которая передавала вызовы Rust-коду. Основная ветка оставалась готовой к выпуску. В материале разобраны причины выбора Rust, компромиссы и регрессии постепенного переноса.
GitHub переписал общий движок Copilot с TypeScript на Rust: вышло более 800 тысяч строк производственного кода. Большую часть написали ИИ-агенты, а 128 пул-реквестов вливали в основную ветку и выпускали постепенно.
Раньше каждое приложение через SDK запускало отдельный процесс с Node.js и V8. Это означало минимум около 100 МБ памяти и обмен данными между процессами. Версию на Rust можно встраивать в приложение.
Для больших переписываний интересна стратегия: каждый пул-реквест заменял реализацию одного компонента и оставлял прослойку, которая передавала вызовы Rust-коду. Основная ветка оставалась готовой к выпуску. В материале разобраны причины выбора Rust, компромиссы и регрессии постепенного переноса.
🤔6🤗5✍3👎3🍾3😴3🙏2🕊2👀2🦄2😎2
Как передавать Minecraft-сервер между компьютерами игроков
Экзамены одного игрока выключили Minecraft-сервер для всей компании на неделю: мир работал только на его компьютере. В ответ появился Nomad, который позволяет запускать тот же мир у любого участника.
Проект выбирает хоста через файл
В разборе Nomad есть жизненный цикл хоста, схема защиты от одновременного запуска и ссылка на код проекта.
Экзамены одного игрока выключили Minecraft-сервер для всей компании на неделю: мир работал только на его компьютере. В ответ появился Nomad, который позволяет запускать тот же мир у любого участника.
Проект выбирает хоста через файл
lease.json в общем хранилище. Если два игрока запускают сервер одновременно, условная запись разрешает это только одному. Хост подтверждает работу каждые 20 секунд, а после сбоя право запуска переходит другому игроку, когда истекают пять минут аренды. Перед передачей Nomad загружает сохранение мира в Cloudflare R2, Git или совместимое с S3 хранилище.В разборе Nomad есть жизненный цикл хоста, схема защиты от одновременного запуска и ссылка на код проекта.
❤14👏7👍5🤷♂4🎉4🙈2💊2⚡1🫡1🦄1😘1
Почему JOIN с блокировкой строки может вернуть пустоту в PostgreSQL
Строка есть, внешний ключ заполнен, но INNER JOIN ничего не возвращает. Это возможно, когда две транзакции одновременно меняют связанную запись.
В Read Committed PostgreSQL после снятия блокировки перепроверяет условие JOIN по новой версии строки, но связанную запись не загружает заново. Условие больше не совпадает: INNER JOIN отбрасывает строку, а LEFT JOIN вернёт пустые поля.
В подробном разборе автор воспроизводит гонку и проверяет способы защиты.
Строка есть, внешний ключ заполнен, но INNER JOIN ничего не возвращает. Это возможно, когда две транзакции одновременно меняют связанную запись.
В Read Committed PostgreSQL после снятия блокировки перепроверяет условие JOIN по новой версии строки, но связанную запись не загружает заново. Условие больше не совпадает: INNER JOIN отбрасывает строку, а LEFT JOIN вернёт пустые поля.
В подробном разборе автор воспроизводит гонку и проверяет способы защиты.
🤯16❤7👌5🤔3😭3⚡2🔥2🎉2😇2☃1🕊1
Как научить небольшую языковую модель соблюдать структуру ответа
Модель на 350 млн параметров дообучили всего за 100 шагов и подняли результат в IFStruct с 22,6% до 29,7%. Этот тест проверяет, выдаёт ли модель корректный JSON или YAML по заданной схеме, а не просто правдоподобный текст.
Для обучения взяли около 500 примеров и метод группового сравнения ответов GRPO. Модель получала награду за три вещи: ответ можно разобрать программно, число полей совпадает с заданием, а результат проходит проверку по JSON Schema. В итоге даже такой короткий прогон заметно сократил разрыв с более крупными моделями.
В разборе Hugging Face есть открытый ноутбук, настройки LoRA и весь пайплайн. Обучение помещается на бесплатный GPU в Colab или Kaggle, поэтому эксперимент можно воспроизвести без собственной фермы ускорителей.
Модель на 350 млн параметров дообучили всего за 100 шагов и подняли результат в IFStruct с 22,6% до 29,7%. Этот тест проверяет, выдаёт ли модель корректный JSON или YAML по заданной схеме, а не просто правдоподобный текст.
Для обучения взяли около 500 примеров и метод группового сравнения ответов GRPO. Модель получала награду за три вещи: ответ можно разобрать программно, число полей совпадает с заданием, а результат проходит проверку по JSON Schema. В итоге даже такой короткий прогон заметно сократил разрыв с более крупными моделями.
В разборе Hugging Face есть открытый ноутбук, настройки LoRA и весь пайплайн. Обучение помещается на бесплатный GPU в Colab или Kaggle, поэтому эксперимент можно воспроизвести без собственной фермы ускорителей.
❤8🤔7🤷♀4⚡2☃2🥰2🏆1😈1😴1👻1🙉1
Как Bitwarden шифрует хранилище и при чём здесь пароль
Парольная фраза не шифрует ваши данные напрямую. Клиент получает из неё ключ и расшифровывает им случайный 64-байтный мастер-ключ. Уже тот открывает логины, пароли, URL, заметки и даже названия записей. Сервер хранит только зашифрованные данные.
Мастер-ключ делится пополам: первые 32 байта служат ключом шифрования AES, вторые создают HMAC-подпись для проверки целостности. Если подпись не совпала, запись считают повреждённой или изменённой и не расшифровывают. Чтобы заблокировать хранилище, клиент удаляет расшифрованный мастер-ключ.
Держите разбор How Bitwarden Encrypts and Decrypts Secrets: автор восстановил детали по исходному коду Bitwarden и Vaultwarden и приложил рабочий скрипт на Python. Он пригодится, если нужно читать резервную копию базы Vaultwarden или собирать собственный клиент.
Парольная фраза не шифрует ваши данные напрямую. Клиент получает из неё ключ и расшифровывает им случайный 64-байтный мастер-ключ. Уже тот открывает логины, пароли, URL, заметки и даже названия записей. Сервер хранит только зашифрованные данные.
Мастер-ключ делится пополам: первые 32 байта служат ключом шифрования AES, вторые создают HMAC-подпись для проверки целостности. Если подпись не совпала, запись считают повреждённой или изменённой и не расшифровывают. Чтобы заблокировать хранилище, клиент удаляет расшифрованный мастер-ключ.
Держите разбор How Bitwarden Encrypts and Decrypts Secrets: автор восстановил детали по исходному коду Bitwarden и Vaultwarden и приложил рабочий скрипт на Python. Он пригодится, если нужно читать резервную копию базы Vaultwarden или собирать собственный клиент.
👍15🤷♀4🤩3🎄3😢2🏆2💔2😴2😭2😇1💊1
Сколько стоит превратить enum в строку через рефлексию C++26
Чистый код без макросов оказался не бесплатным: в GCC 16 подключение
Предкомпилированный заголовок сократил время до 81 мс, а модули GCC подняли его до 403 мс.
В разборе cost of enum-to-string есть код и замеры для enum от 4 до 1024 значений. Цифры относятся к текущей реализации GCC 16 на одном компьютере: для экспериментов с рефлексией сначала подключите предкомпилированный заголовок, а модули проверьте отдельным замером.
Чистый код без макросов оказался не бесплатным: в GCC 16 подключение
<meta> заняло около 181 мс на единицу трансляции. Для enum из четырёх значений компиляция заняла 187 мс против 27 мс у X-macro с const char*.Предкомпилированный заголовок сократил время до 81 мс, а модули GCC подняли его до 403 мс.
В разборе cost of enum-to-string есть код и замеры для enum от 4 до 1024 значений. Цифры относятся к текущей реализации GCC 16 на одном компьютере: для экспериментов с рефлексией сначала подключите предкомпилированный заголовок, а модули проверьте отдельным замером.
👍8❤6🤣6🏆6🤪3👎2🙈2🍌1😐1😘1🤷1
Зачем Cloudflare Workers переписали реестр модулей под правила Node.js
Старый реестр разбирал импорты как пути в файловой системе и заранее компилировал всю сборку для каждой изолированной копии Worker в V8. Поэтому
Новый реестр считает спецификаторы настоящими URL и компилирует модуль только при первом импорте. Есть занятное следствие:
Механику уже можно проверить с флагом
Старый реестр разбирал импорты как пути в файловой системе и заранее компилировал всю сборку для каждой изолированной копии Worker в V8. Поэтому
import.meta.resolve() не работал, а один и тот же исходный код мог компилироваться несколько раз и храниться в памяти в нескольких копиях.Новый реестр считает спецификаторы настоящими URL и компилирует модуль только при первом импорте. Есть занятное следствие:
counter.js?a и counter.js?b получат отдельное состояние, хотя загрузят один исходный файл. Встроенный модуль Node.js, напротив, останется одним экземпляром независимо от способа обращения к нему.Механику уже можно проверить с флагом
new_module_registry. В инженерном разборе Cloudflare показаны правила для ESM, CommonJS, WebAssembly, атрибутов импорта и API import.meta.❤7💔4🙉4🏆3🌚2🍾2🙏1👌1🤣1👻1🤪1
Как фиксированный объём работы помогает пережить пиковую нагрузку
Память ещё есть, значит можно принять ещё одну биржевую заявку? Такой подход способен закончиться тем, что ядро завершит весь движок вместе с уже принятыми заявками.
Автор предлагает при запуске выделить массив под заданный максимум, а всё сверх лимита отклонять. Свободные позиции обрабатываются как нейтральные заявки: вычислений всегда одинаково много, а последовательный обход проще оптимизировать.
В разборе статического выделения памяти показаны и границы подхода.
Память ещё есть, значит можно принять ещё одну биржевую заявку? Такой подход способен закончиться тем, что ядро завершит весь движок вместе с уже принятыми заявками.
Автор предлагает при запуске выделить массив под заданный максимум, а всё сверх лимита отклонять. Свободные позиции обрабатываются как нейтральные заявки: вычислений всегда одинаково много, а последовательный обход проще оптимизировать.
В разборе статического выделения памяти показаны и границы подхода.
matklad.github.io
Static Allocation, Constant Work
In reply to this email:
🎉4🤣3❤1👍1👎1🔥1🤩1😈1😴1🤓1😘1
Нетипичные оптимизации PostgreSQL для отчётов и индексов
Обычный индекс по
Другой приём пригодится для аналитических запросов. Условие
В разборе нетипичных оптимизаций PostgreSQL есть SQL-запросы, планы выполнения и границы применимости каждого приёма.
Обычный индекс по
sold_at ускорил отчёт с 627 до 187 мс, но занял 214 МБ. При этом ежедневному отчёту не нужна точность времени до миллисекунд. Автор проиндексировал только дату и получил индекс на 66 МБ: повторяющихся значений стало больше, поэтому PostgreSQL смог сжать их дедупликацией.Другой приём пригодится для аналитических запросов. Условие
plan = 'Pro' против ограничения с вариантами free и pro заставило базу проверить 100 тысяч строк. После включения constraint_exclusion PostgreSQL сопоставил условие с ограничением и вовсе пропустил сканирование. Для простых запросов режим добавляет расходы на планирование, поэтому автор предлагает включать его точечно в системах отчётности.В разборе нетипичных оптимизаций PostgreSQL есть SQL-запросы, планы выполнения и границы применимости каждого приёма.
👍5❤2😁2😢2✍1❤🔥1🤩1😇1🤝1🎄1🙊1
Кодить — это хорошо, а разбираться в том, что происходит за кадром, тоже полезно. Что там анализируют, зачем нужны метрики, кто такой этот ваш UX, какие задачи решает дизайн? Материалы ниже как раз об этом. Вникать во всё на сто процентов, конечно, не нужно, но базовое понимание поможет находить общий язык с коллегами и видеть чуть дальше кодовой базы.
Как один лотерейный билет превратился в несколько сотен требований, десятки интеграций и пять месяцев Discovery
Очнуться от мрака метрик: три истории от продакта о том, как решать неочевидные проблемы бизнеса
Как проверять продукт на UX на примере личного кабинета студента
Как тестировать пуши и диплинки в финансовом приложении
Дизайн в маркетинге: как фирменный стиль решает бизнес-задачи
Как один лотерейный билет превратился в несколько сотен требований, десятки интеграций и пять месяцев Discovery
Очнуться от мрака метрик: три истории от продакта о том, как решать неочевидные проблемы бизнеса
Как проверять продукт на UX на примере личного кабинета студента
Как тестировать пуши и диплинки в финансовом приложении
Дизайн в маркетинге: как фирменный стиль решает бизнес-задачи
👏4💋4🤝3👍2👀2🤷♀1😱1🤩1🐳1💯1😘1
Для айтишников выпустят свой сет роллов и за состав можно проголосовать
Ёёёёёёё и Yandex Cloud готовят совместный сет и перед релизом собирают пожелания у будущих пользователей!
Вопросы извечные: 32 или 48 штук, мержить ли запечённые с холодными, нужен ли один ролл уровня «деплой в пятницу вечером»? Если какой-нибудь ингредиент видеть в роллах не хочется — для этого есть отдельный вопрос.
Итоги опроса помогут создать сет, который попадёт в реальное меню! Займёт около трёх минут.
Ёёёёёёё и Yandex Cloud готовят совместный сет и перед релизом собирают пожелания у будущих пользователей!
Вопросы извечные: 32 или 48 штук, мержить ли запечённые с холодными, нужен ли один ролл уровня «деплой в пятницу вечером»? Если какой-нибудь ингредиент видеть в роллах не хочется — для этого есть отдельный вопрос.
Итоги опроса помогут создать сет, который попадёт в реальное меню! Займёт около трёх минут.
👎18🎉7😢2🤗2😎2⚡1🐳1🏆1😴1🎃1👾1
Как перестать доверять ИИ управление многошаговым сценарием
Большой системный промпт проводил техническое интервью правильно примерно в 80% случаев. В остальных модель могла закончить его после первого вопроса, выдать ответ вместо подсказки или перейти к оценке до отправки кода. Около 15 переписываний промпта проблему не сняли.
Автор вынес этапы интервью в конечный автомат: он решает, какой шаг активен и куда можно перейти. ИИ оставили содержательную работу внутри этапа: сформулировать вопрос, подсказку или оценку. Подсказка включается после 35 секунд без нажатий клавиш, а оценка начинается лишь после отправки и запуска кода в песочнице.
В разборе архитектуры есть схема состояний и упрощённая логика переходов. Подход пригодится в процессах, где модель генерирует содержание, но не должна сама решать, что случится дальше.
Большой системный промпт проводил техническое интервью правильно примерно в 80% случаев. В остальных модель могла закончить его после первого вопроса, выдать ответ вместо подсказки или перейти к оценке до отправки кода. Около 15 переписываний промпта проблему не сняли.
Автор вынес этапы интервью в конечный автомат: он решает, какой шаг активен и куда можно перейти. ИИ оставили содержательную работу внутри этапа: сформулировать вопрос, подсказку или оценку. Подсказка включается после 35 секунд без нажатий клавиш, а оценка начинается лишь после отправки и запуска кода в песочнице.
В разборе архитектуры есть схема состояний и упрощённая логика переходов. Подход пригодится в процессах, где модель генерирует содержание, но не должна сама решать, что случится дальше.
🤣5⚡3🌚3😢2🤗2☃1🕊1🐳1🍾1😴1🤷1
Как строго монотонное время помогает ловить ошибки
По документации монотонные часы не идут назад. В реальности ОС иногда нарушает это обещание, поэтому результат системного вызова дополнительно ограничивают предыдущим значением внутри процесса.
В заметке «Considering Strictly Monotonic Time» предлагается усилить защиту: возвращать максимум из показания ОС и предыдущего времени плюс одна наносекунда. Тогда проверку
Ограничение у приёма одно: точности значения должно хватать, чтобы повторные прибавления наносекунды не увели время вперёд. Автор считает наносекундную точность достаточной.
По документации монотонные часы не идут назад. В реальности ОС иногда нарушает это обещание, поэтому результат системного вызова дополнительно ограничивают предыдущим значением внутри процесса.
В заметке «Considering Strictly Monotonic Time» предлагается усилить защиту: возвращать максимум из показания ОС и предыдущего времени плюс одна наносекунда. Тогда проверку
past <= present можно заменить на past < present. Она поймает не только движение времени назад, но и случайную передачу одного и того же значения вместо нового вызова часов.Ограничение у приёма одно: точности значения должно хватать, чтобы повторные прибавления наносекунды не увели время вперёд. Автор считает наносекундную точность достаточной.
matklad.github.io
Considering Strictly Monotonic Time
Monotonic time is a frequently used, load bearing abstraction. Monotonicity is often enforced using the following code:
👍6🫡4❤1👏1😢1🎉1🤓1👻1🎃1🤗1💘1
Как собрать генеративное тестирование на Zig в 256 строк
Для эксперимента с алгоритмом согласования состояния между узлами автор сначала за пару часов написал свою библиотеку, а затем тест, который сам собирает случайные сценарии. Он нашёл дюжину обычных ошибок в коде и глубокий изъян в самой идее алгоритма.
Парадокс в основе: генератор не создаёт бесконечный поток чисел, а читает заранее подготовленный массив байтов и сообщает, когда тот закончился. Из этих байтов тест выбирает узел, данные запроса и следующее действие: запрос, доставку сообщения или сбой.
В разборе реализации есть путь от выдачи байтов и целых чисел до взвешенного выбора событий в симуляции. Материал пригодится, если хочется понять механику генеративных тестов без большой готовой библиотеки и изучить самодостаточные примеры на Zig.
Для эксперимента с алгоритмом согласования состояния между узлами автор сначала за пару часов написал свою библиотеку, а затем тест, который сам собирает случайные сценарии. Он нашёл дюжину обычных ошибок в коде и глубокий изъян в самой идее алгоритма.
Парадокс в основе: генератор не создаёт бесконечный поток чисел, а читает заранее подготовленный массив байтов и сообщает, когда тот закончился. Из этих байтов тест выбирает узел, данные запроса и следующее действие: запрос, доставку сообщения или сбой.
В разборе реализации есть путь от выдачи байтов и целых чисел до взвешенного выбора событий в симуляции. Материал пригодится, если хочется понять механику генеративных тестов без большой готовой библиотеки и изучить самодостаточные примеры на Zig.
matklad.github.io
256 Lines or Less: Test Case Minimization
Property Based Testing and fuzzing are a deep and science-intensive topic. There are enough advanced techniques there for a couple of PhDs, a PBT daemon, and a client-server architecture. But I have this weird parlor-trick PBT library, implementable in a…
🤔4😢4👏3🔥2🎅2🎄2❤1🏆1👻1😇1😨1
Сентябрь, учебный год, сессия не так далеко, как вы думаете. Это всё про вас? Тогда загляните в подборку подборок для студентов!
Подготовка к сессии
Полезные сервисы для студентов-технарей: от учёбы до стажировки
9 ИИ для презентаций
Подготовка к сессии
Полезные сервисы для студентов-технарей: от учёбы до стажировки
9 ИИ для презентаций
❤6👏5😁2🤔2🤩2🎅2🤪2💘2🏆1😴1😘1