Почему тип указателя не гарантирует безопасность памяти
Указатель сохраняет тип, даже когда байты по его адресу уже означают другое. В примере на Zig структура с меткой сначала хранит срез байтов. Код берёт указатель на это поле, записывает в ту же структуру 128-битное число, а затем разыменовывает старый указатель. Адрес и тип указателя прежние, но внутри уже число: возникает путаница типов.
Автор называет этот случай самым трудным контрпримером для безопасности памяти. Он не зависит от кучи и деструкторов; похожий сценарий ломает и Ada. Практическую опасность автор не преувеличивает: насколько такой баг пригоден для эксплуатации, неясно. Куда более распространённое переполнение буфера компилятор может закрыть проверкой границ.
В разборе Memory Safety’s Hardest Problem есть код, вывод программы и аргумент, почему встроенные границы массивов в C могли предотвратить немало проблем.
Указатель сохраняет тип, даже когда байты по его адресу уже означают другое. В примере на Zig структура с меткой сначала хранит срез байтов. Код берёт указатель на это поле, записывает в ту же структуру 128-битное число, а затем разыменовывает старый указатель. Адрес и тип указателя прежние, но внутри уже число: возникает путаница типов.
Автор называет этот случай самым трудным контрпримером для безопасности памяти. Он не зависит от кучи и деструкторов; похожий сценарий ломает и Ada. Практическую опасность автор не преувеличивает: насколько такой баг пригоден для эксплуатации, неясно. Куда более распространённое переполнение буфера компилятор может закрыть проверкой границ.
В разборе Memory Safety’s Hardest Problem есть код, вывод программы и аргумент, почему встроенные границы массивов в C могли предотвратить немало проблем.
matklad.github.io
Memory Safety's Hardest Problem
Uplifting a lobsters comment for easier reference.
1👌6🎉5🤝3🤩2🌚2🎃2👍1😢1🙏1🎄1🦄1
Forwarded from Data Analysis / Big Data
Мы вернулись из Суздаля с новым взглядом на магазин у дома
Были на tech-туре MAGNIT TECH «Без предела: Исходный код ритейла» и нам понравилось, как сошлись место и тема. Сначала купеческие ряды Суздаля, затем разговор о технологиях современной торговли на ГЭС на Нерли. В программе были и воздушный шар, и общение с инженерами у самовара. Получилась поездка, в которой было время и Суздалем полюбоваться, и познакомиться с людьми, стоящими за проектами.
Из выступлений особенно запомнился доклад Максима Покусенко о прогнозировании спроса. 17 млрд прогнозов ежедневно впечатляют, когда понимаешь связь с совершенно обыденной, казалось бы, вещью: приходишь в магазин, а нужный товар лежит на полке. Доклад помог увидеть, сколько расчётов стоит за этим привычным удобством.
Презентацию советуем посмотреть и тем, кто не работает с ритейлом. На одном понятном примере здесь можно проследить, как результат ML-модели становится решением о поставке.
Были на tech-туре MAGNIT TECH «Без предела: Исходный код ритейла» и нам понравилось, как сошлись место и тема. Сначала купеческие ряды Суздаля, затем разговор о технологиях современной торговли на ГЭС на Нерли. В программе были и воздушный шар, и общение с инженерами у самовара. Получилась поездка, в которой было время и Суздалем полюбоваться, и познакомиться с людьми, стоящими за проектами.
Из выступлений особенно запомнился доклад Максима Покусенко о прогнозировании спроса. 17 млрд прогнозов ежедневно впечатляют, когда понимаешь связь с совершенно обыденной, казалось бы, вещью: приходишь в магазин, а нужный товар лежит на полке. Доклад помог увидеть, сколько расчётов стоит за этим привычным удобством.
Презентацию советуем посмотреть и тем, кто не работает с ритейлом. На одном понятном примере здесь можно проследить, как результат ML-модели становится решением о поставке.
🔥10💘3👏2😢2🎉2🕊2💯2🤷♀1😁1🫡1🎅1
Как повторное использование ReverseProxy ускорило прокси на Go в 3,8 раза
Автор нагрузил свой обратный прокси и обнаружил хвост медленных запросов. Причина оказалась в обработчике: тот создавал новый
Вместе с прокси заново создавался
В тесте пропускная способность выросла с 1710 до 6541 запроса в секунду, а средняя задержка упала примерно с 58 до 7,6 мс. Если строите сервис на
Автор нагрузил свой обратный прокси и обнаружил хвост медленных запросов. Причина оказалась в обработчике: тот создавал новый
httputil.ReverseProxy для каждого запроса.Вместе с прокси заново создавался
http.Transport. Соединения с целевым сервером не переиспользовались, поэтому каждый запрос платил за новое подключение. Исправление: хранить по одному ReverseProxy на каждый целевой сервер в sync.Map.В тесте пропускная способность выросла с 1710 до 6541 запроса в секунду, а средняя задержка упала примерно с 58 до 7,6 мс. Если строите сервис на
ReverseProxy, http.Client или http.Transport, создавайте объект один раз для каждого адреса и не пересобирайте его внутри обработчика.👍15👏12❤11🏆7👀6🙉4👌3🎉2👾2🤔1🤣1
Как раздать 8,8 Гбит/с видео на одном ядре Go
Ошибочно отправленная ссылка уложила сервер: зрители одновременно открыли HLS-трансляцию, память закончилась, потоки оборвались. Автор собрал Ruseon Core на Go без перекодирования видео.
Кадр один раз попадает в буфер, а зрители читают те же байты. Отстающему подписчику сервер пропускает кадры до следующего ключевого, поэтому не хранит отдельную очередь видео для каждого.
В тесте 1000 пользователей за 70 секунд получили 81 ГБ данных: 8,8 Гбит/с и 60 822 HTTP-ответа без ошибок. В разборе Ruseon Core есть архитектура, исходники и нагрузочные тесты.
Ошибочно отправленная ссылка уложила сервер: зрители одновременно открыли HLS-трансляцию, память закончилась, потоки оборвались. Автор собрал Ruseon Core на Go без перекодирования видео.
Кадр один раз попадает в буфер, а зрители читают те же байты. Отстающему подписчику сервер пропускает кадры до следующего ключевого, поэтому не хранит отдельную очередь видео для каждого.
В тесте 1000 пользователей за 70 секунд получили 81 ГБ данных: 8,8 Гбит/с и 60 822 HTTP-ответа без ошибок. В разборе Ruseon Core есть архитектура, исходники и нагрузочные тесты.
👍21👏13🤩3😈3😴3🐳2🙈2🥰1😍1💋1🗿1
Иногда важнее понять, как всё устроено, чем выучить очередной инструмент. Эти статьи про логику и процессы: без привязки к конкретным технологиям, зато с идеями, которые пригодятся в любой команде. Будет полезно командам и разработчикам, которые хотят больше понимания процессов на уровне концепций!
Как выстроить работу с выделенной командой
Как работает IT-команда: путь задачи от бэклога до релиза
7 стратегий модернизации легаси
Стратегии деплоя, которые не роняют прод
Как сделать ИБ по-настоящему надёжной
Зачем бизнесу многофакторка
Использование разных фреймворков качает мозг
Как выстроить работу с выделенной командой
Как работает IT-команда: путь задачи от бэклога до релиза
7 стратегий модернизации легаси
Стратегии деплоя, которые не роняют прод
Как сделать ИБ по-настоящему надёжной
Зачем бизнесу многофакторка
Использование разных фреймворков качает мозг
🔥9👍8❤🔥4🆒3😁2😐2🙉2🙊2💔1🙈1🤗1
Архитектор решений: чем он занимается и как войти в профессию
Одна пропущенная система на схеме может обернуться сдвигом сроков и ростом бюджета: её доработку просто не заложат в проект. Архитектор решений должен заметить такой промах до реализации.
Он разбирает бизнес-требования на функции, распределяет их по системам и проектирует обмен данными между ними. Результат: архитектурный вижен, то есть диаграммы систем, интеграций, процессов и ролей. Это концепция будущих изменений, которую уточняют на следующих этапах.
Материал пригодится разработчикам, аналитикам, тимлидам и руководителям, которые присматриваются к роли архитектора решений. В нём разобраны необходимые знания, онбординг, первый год работы и собеседование с практическими задачами: кандидату нужно запросить недостающие данные, сравнить варианты и защитить решение.
Одна пропущенная система на схеме может обернуться сдвигом сроков и ростом бюджета: её доработку просто не заложат в проект. Архитектор решений должен заметить такой промах до реализации.
Он разбирает бизнес-требования на функции, распределяет их по системам и проектирует обмен данными между ними. Результат: архитектурный вижен, то есть диаграммы систем, интеграций, процессов и ролей. Это концепция будущих изменений, которую уточняют на следующих этапах.
Материал пригодится разработчикам, аналитикам, тимлидам и руководителям, которые присматриваются к роли архитектора решений. В нём разобраны необходимые знания, онбординг, первый год работы и собеседование с практическими задачами: кандидату нужно запросить недостающие данные, сравнить варианты и защитить решение.
❤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
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