惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Troy Hunt's Blog
P
Proofpoint News Feed
V
Vulnerabilities – Threatpost
C
Cybersecurity and Infrastructure Security Agency CISA
K
Kaspersky official blog
Cyberwarzone
Cyberwarzone
T
Tor Project blog
Cisco Talos Blog
Cisco Talos Blog
S
Securelist
L
Lohrmann on Cybersecurity
Security Latest
Security Latest
T
Threatpost
H
Heimdal Security Blog
W
WeLiveSecurity
A
Arctic Wolf
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
G
GRAHAM CLULEY
IT之家
IT之家
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
TaoSecurity Blog
TaoSecurity Blog
A
About on SuperTechFans
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
N
News and Events Feed by Topic
Hacker News - Newest:
Hacker News - Newest: "LLM"
Last Week in AI
Last Week in AI
T
The Blog of Author Tim Ferriss
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Microsoft Azure Blog
Microsoft Azure Blog
Hugging Face - Blog
Hugging Face - Blog
Google DeepMind News
Google DeepMind News
量子位
Stack Overflow Blog
Stack Overflow Blog
Know Your Adversary
Know Your Adversary
B
Blog RSS Feed
阮一峰的网络日志
阮一峰的网络日志
WordPress大学
WordPress大学
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
AI
AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
GbyAI
GbyAI
Vercel News
Vercel News
C
Cyber Attacks, Cyber Crime and Cyber Security
Latest news
Latest news
D
Darknet – Hacking Tools, Hacker News & Cyber Security
大猫的无限游戏
大猫的无限游戏
Forbes - Security
Forbes - Security

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
“Я потерял контекст”, или еще один инструмент для тестировщиков
Xizest (Рост · 2026-04-22 · via Все публикации подряд на Хабре

“Я потерял контекст”, или еще один инструмент для тестировщиков

Уровень сложностиПростой

Время на прочтение7 мин

Охват и читатели1.6K

Кейс

Это была пятница, шесть вечера. Я сидел перед монитором и чувствовал себя следователем, который зашёл в тупик.

Три часа назад я нашёл странное поведение в приложении. Открыл Jira, но пока заполнял поля - мысль ушла. На рабочем столе уже лежало 15 скриншотов с именами вроде «Снимок экрана 154312.png». Я открыл их наугад, но уже не помнил, к какому запросу какой относится.

«Я потерял контекст». Баг есть, даже помню, как воспроизвести. Но чтобы восстановить цепочку «действие → реакция сервера → скриншот → вывод» - нужен ещё час.

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

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

Меня зовут Александр. Я перепробовал Jira, Confluence, Notion и просто папки на диске. Всё либо медленно, либо хаотично, либо зависит от интернета. Поэтому я собрал свой локальный редактор - под себя, под тестирование. Делюсь историей и кейсом.

Инструмент я выложил в открытый доступ, ссылка будет в конце. Это не продажа, не условно-бесплатно и не лидогенерация. Просто рабочий пет-проект, которым я сам пользуюсь каждый день.

Почему стандартные инструменты перестали работать

После той пятницы я задумался: почему так вышло?

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

  • Jira и Confluence. Они отличные, но... медленные. Пока я заполню все поля, прикреплю файлы, оформлю описание - я теряю нить рассуждений. Это инструменты для результата, а не для процесса мышления.

  • Облачные блокноты (Notion, Miro или тот же Google Docs). Они классные для визуализации, но зависимы от интернета. Плюс корпоративная безопасность часто блокирует загрузку файлов или требует согласований.

  • Файлы на диске. Самый гибкий, но самый хаотичный вариант. Папка Проект_Х → внутри Скриншоты, Логи, Заметки → внутри куча файлов с непонятными датами. Через неделю вернуться к проекту и быстро продолжить работу - сложно и трудозатратно.

Мне нужно было что-то другое. Инструмент, который будет:

  1. Локальным. Чтобы не зависеть от облаков и был всегда под рукой.

  2. Скоростным. Мысль должна фиксироваться быстрее, чем исчезать.

  3. Связным. Чтобы скриншот, JSON ответа и моя заметка лежали рядом.

  4. Визуальным. Чтобы я мог видеть структуру своих мыслей, а не просто читать текст и собирать данные из разных мест.

Потом подумал: а почему бы не собрать такое самому? Под себя. Как удобный рабочий стол, где всё разложено по полкам, но при этом не мешает думать.

Так родилась идея своего редактора, со специализированными инструментами.

Как все начиналось и что под капотом

Я начал изучать различные технологии, фреймворки и подходы. Параллельно посмотрел готовые решения: Obsidian, Logseq, Notion - но они либо не заточены под тестирование, либо требуют доработки плагинами, либо тяжёлые для бытового использования.

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

Перебрав технологические варианты, я остановился на Flutter. Вот основные причины.

Кроссплатформенность. Flutter позволяет писать один код и собирать под все десктопные платформы без переписывания. Именно эта идея - один код для Windows, macOS и Linux - стала для меня решающей. Статья на Хабре https://habr.com/ru/companies/friflex/articles/966152/ как раз это подтверждала, и я окончательно утвердился в выборе Flutter.

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

Гибкий текстовый редактор. Пакет flutter_quill дал готовую основу с возможностью встраивать свои интерактивные блоки - документация позволяет довольно просто создавать кастомные элементы прямо в тексте. Не пришлось изобретать велосипед.

Архитектура: модульные блоки. Каждый блок - самостоятельный модуль: проверка, дефект, просто текст. Они не зависят друг от друга. Хочешь новый тип блока? Просто создаёшь класс в отдельной папке и регистрируешь его одной строкой - он сразу появляется в редакторе.

Помните главную боль? В Jira я терял мысль, пока сохранял данные. А если страница заметок вырастает до сотен блоков - любая задержка сохранения снова выбивает из контекста.

Поэтому скорость сохранения стала критичным требованием.

Как хранятся данные: диффы вместо монолитов

Чтобы не тормозить при сохранении больших страниц, я сделал дифференциальную систему:

  • Есть базовый файл content.json - полный слепок страницы

  • Все изменения пишутся как отдельные диффы (файлы с дельтами)

  • При загрузке система собирает базовый контент + все диффы по порядку

Когда диффов накапливается много, система автоматически создаёт новый полный снепшот и сбрасывает цепочку. Это даёт:

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

  • Встроенную историю — можно будет добавить откат изменений

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

Моментальное сохранение

Работает через дебаунс: при любом изменении запускается таймер на 2 секунды. Если за это время были новые правки - таймер сбрасывается. Если нет - происходит сохранение. Пока печатаешь - ничего не дёргает диск. Остановился на пару секунд - данные зафиксированы.

Порядок на диске

/storage/

  ├── items.json              # Список всех папок и страниц

  ├── [page_id]/              # Папка конкретной страницы

  │   ├── meta.json           # Метаданные: название, даты

  │   ├── content.json        # Полный слепок контента

  │   ├── diff_chain.json     # Список диффов в цепочке

  │   ├── diff/               # Отдельные файлы диффов

  │   │   ├── 1700000000000.diff.json

  │   │   └── 1700000001000.diff.json

  │   ├── attachments/        # Прикреплённые файлы

  │   │   ├── screenshot1.png

  │   │   └── log.txt

У каждой страницы своя папка с данными, внутри:

Всё разложено по полкам. Даже если открыть папку в проводнике - сразу понятно, что где лежит.

Код, конечно, писал не я один - без помощи ИИ (спасибо, Deepseek) пришлось бы в разы дольше разбираться с нюансами используемых библиотек. Так что значительную часть рутины отдал нейросети - сам занимался архитектурой и логикой.

Разбор одного рабочего кейса - Тестирование формы авторизации

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

Я намеренно выбрал простой кейс - форму авторизации по номеру телефона, чтобы не углубляться в сложную бизнес-логику, а сфокусироваться именно на процессе работы с инструментом.

1. Анализ требований и генерация идей (вход в контекст)

Утром я получаю задачу: «Проверить новую форму авторизации по номеру телефона». Раньше я создал бы папку «Авторизация_20251023» на рабочем столе и текстовый файлик с мыслями. Теперь я действую иначе: открываю своё приложение (оно всегда запущено и висит на втором мониторе) и создаю новую страницу. На это уходит 3 секунды (локальность и скорость).

Создал новую страницу — редактор всегда открыт на втором мониторе, это занимает 3 секунды.

Создал новую страницу — редактор всегда открыт на втором мониторе, это занимает 3 секунды.

Первым делом я не пишу тест-кейсы, я просто начинаю фиксировать требования, мысли и вопросы:

Фиксирую требования, мысли и вопросы. Блоки проверок добавлены сразу — в них потом приложу скриншоты.

Фиксирую требования, мысли и вопросы. Блоки проверок добавлены сразу — в них потом приложу скриншоты.

Я оформляю не только текстом, а сразу добавляю блоки проверок - это специальные элементы в моём приложении, которые содержат кнопки для отметки о выполнении и область для вложения файлов. Это и есть реализация принципа «связности»: я заранее создаю структуру, в которую потом буду складывать доказательства (фактические результаты).

2. Процесс тестирования: фиксация результатов «на лету»

Запускаю сборку. Начинаю двигаться по своему списку.

Ввожу тестовый номер в 11 цифр. Нажимаю «Получить код». Код успешно отправлен и получен. Я выполняю действия:

  • Делаю скриншот, сразу с копированием в буфер обмена

  • Отмечаю проверку как выполненную

  • Нажимаю “Вставить” и скриншот сразу прикрепляется к выполняемой проверке

Фиксирую фактический результат и сразу прикладываю вложения

Фиксирую фактический результат и сразу прикладываю вложения

И далее аналогично по остальным проверкам заполняя результаты и прикладывая все необходимые файлы.

Весь мой рабочий процесс теперь выглядит как единый поток: мысль -> действие (ввод данных) -> результат (скриншот или другие вложения) -> новая мысль (заметка о баге или вопросе). И всё это в одном окне, в хронологическом порядке.

3. Возврат к контексту через неделю

Проходит неделя. Меня отвлекали на другие срочные задачи. И тут разработчик пишет: «Я всё поправил по авторизации.».

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

Все мысли, проверки с результатами и вложения отображаются прямо в заметке

Все мысли, проверки с результатами и вложения отображаются прямо в заметке

Мне не нужно лезть в старые чаты, искать скриншоты в куче папок или вспоминать, что я имел в виду под «кривой авторизацией». Вся история исследования, со всеми артефактами и выводами, лежит передо мной. Именно это ощущение - исчезновение страха «потерять контекст»  и было главной целью создания приложения.

Почему это сработало?

Потому что инструмент перестал быть просто местом для хранения информации. Он стал средой, где мысль материализуется и остается связанной с доказательствами. Я не трачу силы на организацию хаоса, я трачу их на исследование продукта.

Оглядываясь на этот кейс, я понял, что все те пункты, которых мне не хватало в стандартных инструментах, здесь закрылись сами собой:

  • Локальность. Всё хранится на диске, интернет не нужен — хоть на даче работай.

  • Скорость. Мысль фиксируется мгновенно: не надо ждать, пока загрузится Jira или откроется нужная папка.

  • Связность. Скриншот, JSON ответа и заметка теперь действительно лежат рядом - в одном документе, привязанные к конкретной проверке.

  • Визуальность. Я вижу структуру: где проверки пройдены, где нет, к чему приложены файлы и что осталось без внимания.

А как у вас? Как вы фиксируете результаты исследовательского тестирования? Пишете сразу в баг-трекинг, ведёте черновики или надеетесь на память? Поделитесь в комментариях - интересно, кто как выкручивается.

Что осталось за кадром (пока)

Как обычно в pet-проектах, идей гораздо больше, чем рук. Самая амбициозная - локальный AI-ассистент, который анализирует содержимое страницы и помогает с тест-дизайном.

Задумка такая: через llama.cpp подключаешь локальную модель, а она смотрит на твои проверки, дефекты и запросы - и подсказывает, чего не хватает, подсвечивает противоречия или предлагает граничные случаи. Код даже начал писать, но быстро понял: стабильность базовых функций важнее экспериментов с нейросетями.

Так что AI пока в заморозке. Но когда редактор перестанет падать, а блоки будут вставляться без сюрпризов - обязательно вернусь к этой идее.

Если есть желание пощупать инструмент своими руками, бету можно забрать по ссылке https://qabox.ru/. Буду рад обратной связи и живым баг-репортам.