Поиск для созидателя: карта трека и почему это отдельный навык
Сцена, знакомая каждому. Вы пишете сервис. Всё идёт нормально ровно до момента, когда очередь начинает терять сообщения при перезапуске брокера, а в документации написано «at-least-once delivery» — и больше ничего. Работа встаёт. Не потому, что вы не умеете программировать, а потому, что вы не знаете одной конкретной вещи, и эта вещь где-то записана. Вопрос только — где, и как отличить правильный ответ от убедительного.
Дальше есть два способа действовать. Первый: открыть поисковик, вбить текст ошибки, открыть шесть вкладок, прочитать три ответа на Stack Overflow разной степени древности, скопировать конфиг из четвёртого, перезапустить, увидеть, что стало иначе, но не лучше, и потерять полдня. Второй: за десять минут понять, как называется механизм, за который вы зацепились, за двадцать найти нормативное описание этого механизма, за пять — убедиться, что оно относится к вашей версии, и за час поставить эксперимент, который отличает вашу гипотезу от соседней.
Разница между этими двумя способами — не в скорости чтения и не в удаче. Это навык, у которого есть внутреннее устройство, и ему посвящён этот трек.
Что здесь называется поиском
Важное сужение темы, чтобы не было недоразумений.
Это не трек про устройство поисковых систем. Инвертированный индекс, ранжирование, BM25, векторный поиск — интересные вещи, но они здесь ни при чём. Если вам нужно понять, как поиск работает изнутри, и тем более построить свой, идите в трек ИИ-инженерия, где разбирается ретривал, и в трек про базы данных, где разбираются индексы.
Это не трек про информационный поиск как научную дисциплину и не про SEO с обратной стороны прилавка.
Это не трек про то, как усваивать и запоминать найденное. Про извлечение из памяти, интервальное повторение, чтение технических текстов ради понимания и заметки как внешнюю память написан соседний трек Как учиться. Мы будем на него ссылаться там, где темы граничат, и не будем его пересказывать. Грубая, но рабочая граница: там — про то, что происходит с информацией после того, как вы её получили; здесь — про то, как её добыть и как понять, можно ли ей верить.
Здесь поиск — это инженерная разведка: последовательность действий, которая превращает «я упёрся и не знаю» в «я знаю достаточно, чтобы принять решение и обосновать его». Отличие от бытового поиска в четырёх вещах.
| Бытовой поиск | Поиск созидателя | |
|---|---|---|
| Что нужно на выходе | правдоподобный ответ | решение, за которое вы отвечаете |
| Цена ошибки | ноль | инцидент, переписанная подсистема, потерянные данные |
| Проверяемость | обычно никакая | почти всегда можно поставить эксперимент |
| Словарь | ваш обычный язык | язык предметной области, которого вы пока не знаете |
Последняя строка — ключевая и самая недооценённая. Большая часть неудачных поисков проваливается не на этапе поиска, а на этапе формулировки: человек ищет описание своих ощущений, а искать надо имя механизма. Этому посвящена первая глава.
Что про это известно из измерений
Область переполнена советами без данных, поэтому сразу оговорим, что здесь можно опереть на исследования, а что — только на отраслевую практику. Работ немного, они старше, чем хотелось бы, и почти все сделаны на разработчиках крупных компаний, то есть переносятся с оговорками. Но кое-что они показывают устойчиво.
- Поиск — не редкое событие, а часть цикла написания кода. Caitlin Sadowski, Kathryn Stolee и Sebastian Elbaum в работе How Developers Search for Code: A Case Study (FSE 2015, исследование на инженерах Google) зафиксировали медиану порядка десятка поисковых сессий по коду в рабочий день, причём большая часть — короткие, на несколько секунд, с целью вспомнить сигнатуру или найти пример использования.
- Веб встроен в процесс программирования, а не приделан сбоку. Joel Brandt с соавторами в Two Studies of Opportunistic Programming (CHI 2009) показали, что разработчики используют веб на трёх разных уровнях одновременно: чтобы вспомнить забытую деталь, чтобы разобраться в незнакомой технологии и чтобы разведать возможность подхода. Стратегия запроса на этих уровнях разная, а инструмент один — отсюда часть неудач.
- Категории поисковых задач различаются по успешности. Xin Xia с соавторами в What Do Developers Search for on the Web? (Empirical Software Engineering, 2017) собрали таксономию из десятков типов задач и показали, что тяжелее всего идут поиски, связанные с производительностью, надёжностью и выбором между технологиями, — то есть ровно те, где ответа в виде готового куска кода не существует.
- Переформулировка — норма, а не признак неумения. В исследованиях поисковых сессий разработчиков доля сессий с несколькими последовательными запросами велика; исходная формулировка почти никогда не финальная. Это укрепляет тезис, к которому мы вернёмся не раз: первый запрос делается ради словаря.
Чего в литературе нет: контролируемых экспериментов, показывающих, что конкретная методика поиска даёт измеримый выигрыш по времени решения задачи. Поэтому всё, что дальше в треке названо приёмом, — это разобранная отраслевая практика с объяснённым механизмом, а не доказанный протокол. Отличать одно от другого — само по себе часть навыка, и этому посвящена седьмая глава.
Цикл разведки
Поиск полезно представлять не как одно действие «спросить у поисковика», а как цикл с обратной связью, в котором каждый оборот улучшает словарь запроса.
кто знает Словарь --> Запрос: операторы, площадка, время Запрос --> Улов: кандидаты в источники Улов --> Оценка: первичность, дата, авторство Оценка --> Словарь: нашлись новые термины Оценка --> Проверка: источник выглядит годным Проверка --> Эксперимент: проверяю у себя Эксперимент --> След: записал результат и ссылку Эксперимент --> Формулировка: гипотеза не подтвердилась След --> [*] Затык --> Эксперимент: дешевле проверить,
чем искать
Три вещи, которые видно из этой картинки и которые обычно пропускают.
Возврат из «Оценки» в «Словарь» — главный оборот. Первый заход в поиск почти всегда неудачен, и его настоящая ценность не в найденном ответе, а в найденных словах. Вы ищете «падает при большой нагрузке», натыкаетесь на страницу, где встречается слово «backpressure», и второй запрос уже другого качества. Опытный поиск — это два-три таких оборота, а не один длинный запрос.
Стрелка напрямую из «Затыка» в «Эксперимент». Есть класс вопросов, на которые дешевле ответить измерением, чем чтением: «сколько это занимает памяти», «сработает ли этот флаг», «в каком порядке приходят события». Умение вовремя не пойти искать — часть навыка, и ей посвящена одиннадцатая глава.
Узел «След». Если после разведки не осталось записи, через полгода вы пройдёте тот же путь заново, и это будет не быстрее. Про то, как выглядит дешёвый и работающий след, — тринадцатая глава.
Пять видов незнания, и почему стратегия у каждого своя
Одинаково искать ответы на разные типы вопросов — самая частая системная ошибка. Тип вопроса определяет, где смотреть и когда останавливаться.
| Тип | Пример вопроса | Где ответ | Признак, что вы ищете не там |
|---|---|---|---|
| Фактический | какое значение по умолчанию у fsync в этой версии |
документация, исходники, changelog | вы читаете блог-пост вместо reference |
| Терминологический | как называется явление, когда клиенты синхронно ретраят | глоссарии, обзорные статьи, спецификации | вы описываете симптом длинной фразой |
| Нормативный | обязан ли сервер вернуть 400 в этом случае | спецификация, RFC, стандарт | вы читаете чужую реализацию как истину |
| Опытный | стоит ли брать этот брокер под такой профиль нагрузки | постмортемы, отчёты, разговор с людьми | вы ищете «X vs Y» в статьях с таблицей галочек |
| Причинный | почему у нас конкретно ломается вот это | ваши логи, эксперимент, история изменений | вы ищете в интернете то, что есть только у вас |
Последняя строка стоит отдельного упоминания, потому что на ней теряют больше всего времени. Вопрос «почему падает у нас» в интернете не имеет ответа в принципе: там нет ваших данных, вашей версии и вашей конфигурации. Интернет может дать вам механизм и класс причин, но конкретную причину даёт только ваша система. Про это — глава про поиск во время отладки.
Как выбрать глубину: два параметра
Сколько усилий вкладывать в разведку — решение, а не рефлекс. Полезно оценивать вопрос по двум осям: во что обойдётся ошибка и насколько дёшево проверить ответ у себя.
Практический смысл: в левом нижнем углу читать спецификацию — потеря времени, там достаточно первого разумного ответа и проверки за минуту. В правом верхнем углу первый разумный ответ — это заявка на инцидент: там нужен нормативный источник, и он у вас, скорее всего, есть. Ошибка происходит, когда человек применяет привычку одного угла к вопросу из другого.
Почему информационная среда стала хуже, и что это меняет
Приёмы поиска, которые работали десять лет назад, работают заметно хуже, и дело не в ностальгии. Изменилось несколько вещей одновременно.
Стимулы производителей контента сместились к объёму. Страница, которая пересказывает документацию своими словами и добавляет вступление на три абзаца, приносит деньги. Точный ответ в двух строках — нет. В результате первая страница выдачи по техническому запросу часто состоит из пересказов одного и того же первоисточника, причём пересказов, сделанных без понимания.
Порог производства текста упал до нуля. Генеративные модели сделали производство правдоподобных технических текстов почти бесплатным. Побочный эффект: доля страниц, которые выглядят как ответ, но написаны без проверки, выросла. Отдельный неприятный жанр — сгенерированные «туториалы», описывающие API, которого не существует.
Основная площадка вопросов и ответов сжалась. Активность на Stack Overflow после 2022 года заметно упала — данные о числе новых вопросов публичны и доступны в Stack Exchange Data Explorer. Часть трафика ушла в модели, часть — в закрытые Discord-серверы, которые не индексируются вообще. Практическое следствие: ответы на новые вопросы всё чаще существуют не в вебе, а в issue-трекерах, чатах и головах конкретных людей.
Веб перестал быть надёжно наблюдаемым. Google убрал оператор cache: и ссылку на кэш из выдачи в 2024 году; часть площадок закрыла API. Это делает Wayback Machine не экзотикой, а рабочим инструментом.
Что из этого следует для практики — три вещи, которые проходят через весь трек:
- Смещайте вес с веб-поиска на индексы, где мусора структурно меньше: исходники, issue-трекеры, changelog, спецификации, рассылки, поиск по коду.
- Проверяйте дату и версию раньше, чем содержание. Правдоподобный ответ, верный для версии 2016 года, дороже отсутствия ответа: он выглядит как знание.
- Считайте модель отдельным источником с собственным профилем ошибок, а не заменой поиска и не оракулом. Об этом — восьмая глава.
Иерархия источников: короткая версия
Полный разбор — в четвёртой главе, здесь только скелет, потому что он нужен уже с первой страницы.
Правило, из которого вырастает вся глава: чем ближе источник к тому, что исполняется, тем меньше в нём слоёв интерпретации, и тем он дороже в чтении. Исходник не врёт никогда, но читать его дольше всего. Блог-пост читается за три минуты, но между вами и истиной стоит человек, который мог не понять, мог упростить и почти наверняка писал про другую версию.
Из этого не следует «всегда читайте исходники». Из этого следует, что вы должны знать, на каком уровне находитесь, и уметь спуститься на уровень ниже, когда ответ важен.
Карта трека
созидателя)) Формулировка от симптома к термину операторы и движки поиск по коду Источники первичность незнакомая документация исходники и история Доверие датировка и авторство модель как источник академический слой Среда языки и корпуса сообщества и вопросы Границы когда остановиться отладка как жанр след после поиска
Тринадцать глав после этой:
- От симптома к термину — как превратить «что-то не работает» в запрос, на который есть ответ. Почему поиск по тексту ошибки работает хуже, чем поиск по имени механизма, и как добывать словарь предметной области, которого у вас пока нет.
- Операторы, движки и время — механика запроса: что из синтаксиса действительно работает, как ограничивать поиск площадкой и временем, чем отличаются движки и какие специализированные индексы стоит держать под рукой.
- Поиск по коду и артефактам — GitHub code search, grep.app, поиск по реестрам пакетов и по локальному дереву. Как найти живой пример использования API, который нигде не описан.
- Первоисточник против пересказа — спецификация, RFC, исходники, changelog, issue tracker. Как строить цепочку от чужого ответа к нормативному тексту и почему это занимает меньше времени, чем кажется.
- Документация, которую вы видите впервые — как за двадцать минут понять, что в этой документации есть, где это лежит и чему в ней можно верить.
- Когда документации нет — исходники, история изменений, issue-трекер и рассылки как основной источник. Приёмы археологии: pickaxe, blame, bisect, чтение обсуждений вокруг коммита.
- Проверка: дата, автор, воспроизводимость — как отличить «работает» от «работало в 2016 на другой версии», как читать бенчмарки с конфликтом интересов и что такое триангуляция источников.
- Модель как источник — профиль ошибок генеративной модели, почему уверенный тон не коррелирует с точностью, как строить проверяемые запросы и когда модель полезнее поиска.
- Академический слой — arXiv, Scholar, препринты и рецензирование. Как читать статью, не будучи учёным, и как понять, меняет ли она ваши действия.
- Где живут ответы — языки и корпуса: почему англоязычный запрос даёт другой набор ответов. Где находятся сообщества и как задать вопрос так, чтобы на него ответили.
- Когда перестать искать — стоимость поиска против стоимости эксперимента, таймбоксы, признаки тупика и как проектировать проверку, которая закрывает вопрос.
- Поиск во время отладки — отдельный жанр со своим порядком действий: что делать до первого запроса, что искать, а что искать бесполезно.
- Воспроизводимый след — что оставить после разведки, чтобы через год не искать заново, и как это связано с решениями, которые вы принимаете сегодня.
Как читать этот трек
Главы связаны, но не строго последовательны. Три разумных маршрута:
- Полный, если вы учитесь. 00 → 13 подряд. Первые шесть глав — про добычу, следующие три — про доверие, дальше — про среду и границы.
- Аварийный, если у вас горит прямо сейчас. Глава 12 (отладка) → глава 01 (формулировка) → глава 06 (история изменений). Этого хватает, чтобы не потерять день.
- Гигиенический, если вы много читаете и вам кажется, что вы тонете. Главы 04, 07, 11, 13: первичность, проверка, остановка, след. Это четыре главы про то, как не производить работу вхолостую.
Трек рассчитан на инженера, который уже что-то строит. Если вы пока строите мало, а учитесь много, полезнее сначала пройти Как учиться, а сюда вернуться, когда появится поток реальных вопросов: без него приёмы отсюда негде применять, и они забудутся ровно так, как описано в главе про иллюзию компетентности.
Словарь трека
Несколько слов будут встречаться постоянно, поэтому договоримся о значениях сразу.
| Термин | Что означает здесь |
|---|---|
| Первичный источник | текст, произведённый теми, кто отвечает за поведение системы: спецификация, документация проекта, исходники, changelog, обсуждение в трекере. Противоположность — пересказ |
| Датировка | установление, к какому моменту и к какой версии относится утверждение. Не «когда опубликовано», а «когда это было правдой» |
| Триангуляция | подтверждение утверждения двумя независимыми источниками. Два блога, переписавших один пост, — не триангуляция |
| Корпус | множество текстов, среди которых вообще может найтись ответ. У англоязычного и русскоязычного запроса корпуса разные, и это не про качество перевода |
| Таймбокс | заранее назначенный лимит времени на разведку, после которого вы обязаны переключиться на другой способ получить ответ |
| След | то, что осталось после разведки в виде, пригодном для повторного использования: ссылка, цитата, версия, воспроизводимая команда |
| Профиль ошибок источника | характерный способ, которым конкретный тип источника врёт. У блога — устаревание, у вендора — умолчание, у модели — уверенно выдуманная деталь |
Последняя строка — самая полезная идея трека, если запоминать одну. Не бывает «надёжных» и «ненадёжных» источников вообще. Бывают источники с известным профилем ошибок, и с ними можно работать, потому что вы знаете, что именно проверять.
Как этот трек связан с остальным порталом
(этот трек)"] L["Как учиться"] LG["Логика и аргументация"] EE["Инженерный английский"] TW["Техническое письмо"] AI["ИИ: основы / ИИ-агенты"] G["Git"] RS -->|"найденное надо усвоить"| L L -->|"чтобы понять, что усваивать,
надо найти"| RS RS -->|"оценка аргументов
и статистики"| LG RS -->|"язык доков,
issue и рассылок"| EE RS -->|"как оставить след,
который прочитают"| TW RS -->|"модель как источник
и как инструмент"| AI RS -->|"история изменений
как источник"| G
Практическое чтение схемы: если по ходу трека вам покажется, что какая-то тема раскрыта слишком коротко, скорее всего, она подробно разобрана в соседнем треке, и в тексте будет ссылка. Дублировать соседей мы намеренно не будем.
Чего в этом тексте не будет
Чтобы не создавать ложных ожиданий:
- Списка «лучших сайтов для программиста». Такие списки протухают за год, а навык — нет.
- Обещания, что поиск заменит понимание. Он не заменяет; более того, чем лучше вы понимаете область, тем эффективнее ищете, и это односторонняя зависимость. Хороший запрос требует знания слова, а слово берётся из понимания.
- Оценок конкретных сервисов в духе «этот лучше того». Где такое неизбежно, будет сказано, на какой момент это верно и как проверить самому.
- Разговора про сбор данных о людях. Это другая тема с другой этикой, и здесь её нет.
Антипаттерны, которые видно со стороны
Если вы наблюдаете за коллегой (или за собой на записи экрана), плохой поиск опознаётся по шести признакам. Каждый из них разбирается дальше в треке.
- Двадцать открытых вкладок и ни одной прочитанной до конца. Признак того, что вопрос не атомарен: человек ищет всё сразу и поэтому ничему не может дать оценку.
- Копирование команды из ответа без чтения того, что она делает. Работает до первого случая, когда не работает, — и тогда откатиться некуда, потому что модель происходящего не построена.
- Возврат к тому же запросу третий раз за неделю. Признак отсутствующего следа: разведка была, результат испарился.
- Спор о поведении системы без ссылки на источник. Двое обсуждают, что делает библиотека, вместо того чтобы за минуту открыть её исходники.
- Аргумент «я где-то читал». Утверждение без датировки и без автора — это не знание, а воспоминание о знании.
- Час поиска там, где эксперимент занимает пять минут. Самый дорогой антипаттерн и самый незаметный, потому что поиск ощущается как работа.
Мини-итог
- Поиск созидателя отличается от бытового ценой ошибки, наличием возможности проверить и незнакомым словарём предметной области.
- Это цикл, а не действие: главную ценность даёт возврат «нашёл новые слова → переформулировал запрос», а не первый заход.
- Тип вопроса определяет стратегию: фактический, терминологический, нормативный, опытный и причинный вопросы ищутся в разных местах и заканчиваются по-разному.
- Глубину разведки задают два параметра: цена ошибки и цена проверки. Вопросы из разных углов этой плоскости требуют разного поведения.
- Среда стала хуже: больше пересказов, меньше живых площадок, менее наблюдаемый веб. Ответ на это — смещение к первичным индексам, ранняя проверка даты и версии, осознанная работа с моделью как с отдельным типом источника.
- Разведка, после которой не осталось следа, будет повторена целиком.
Три уровня владения навыком
Полезно понимать, куда вы движетесь. Границы условны, но переходы между уровнями заметны со стороны.
| Что делает | Что не делает | Типичное время до ответа | |
|---|---|---|---|
| Уровень 1 | вбивает описание симптома, берёт первый подходящий ответ, копирует решение | не проверяет версию, не различает пересказ и первоисточник | от получаса до бесконечности |
| Уровень 2 | формулирует через термин, различает документацию и блог, смотрит на дату | не ходит в исходники, не ставит эксперимент вместо чтения, не оставляет следа | 10–30 минут, но повторно ищет то же самое через месяц |
| Уровень 3 | заранее знает, где лежит ответ на вопрос этого типа; проверяет версию до содержания; вовремя останавливается и ставит эксперимент; оставляет след | не тратит время на разведку там, где проверка дешевле | минуты, а на дорогих вопросах — осознанные часы с понятным результатом |
Разница между вторым и третьим уровнем — не в знании сайтов, а в двух метаумениях: выбирать источник под тип вопроса и прекращать поиск. Оба они разобраны ближе к концу трека и оба неочевидны, потому что интуиция подсказывает обратное: искать дальше кажется продуктивным, а прекратить — сдаться.
Как проверить, что глава усвоена
Простое упражнение, которое имеет смысл проделать после каждой главы трека и особенно после этой. Возьмите последний реальный случай, когда вы что-то искали дольше двадцати минут, и ответьте письменно:
- Какого типа был вопрос — фактический, терминологический, нормативный, опытный или причинный?
- В каком типе источника лежал ответ и когда вы туда попали — сразу или после нескольких кругов?
- Что было бы дешевле: продолжать искать или поставить эксперимент?
- Осталось ли от этой разведки что-нибудь, кроме памяти?
Если на четвёртый вопрос ответ «ничего», вы уже знаете, какую главу читать первой.
Источники
- Sadowski C., Stolee K. T., Elbaum S. (2015). How Developers Search for Code: A Case Study. ESEC/FSE 2015 — dl.acm.org/doi/10.1145/2786805.2786855.
- Brandt J., Guo P. J., Lewenstein J., Dontcheva M., Klemmer S. R. (2009). Two Studies of Opportunistic Programming: Interleaving Web Foraging, Learning, and Writing Code. CHI 2009 — dl.acm.org/doi/10.1145/1518701.1518944.
- Xia X., Bao L., Lo D., Kochhar P. S., Hassan A. E., Xing Z. (2017). What Do Developers Search for on the Web? Empirical Software Engineering, 22 — link.springer.com/article/10.1007/s10664-017-9514-4.
- Stack Exchange Data Explorer — открытая база вопросов и активности, на которой можно самостоятельно проверить утверждения о динамике площадки: data.stackexchange.com.
- Internet Archive Wayback Machine — web.archive.org.
- Diátaxis — систематика технической документации Даниэля Проциды, полезная как карта чужих доков: diataxis.fr.
- Eric S. Raymond, Rick Moen. How To Ask Questions The Smart Way — catb.org/~esr/faqs/smart-questions.html.
- Bjork R. A., Dunlosky J., Kornell N. (2013). Self-Regulated Learning: Beliefs, Techniques, and Illusions. Annual Review of Psychology, 64 — про то, почему субъективная лёгкость плохо предсказывает знание; в поиске это проявляется как «прочитал ответ и решил, что понял».
Что дальше
Начнём с того места, где теряется больше всего времени, — с формулировки. От симптома к термину: как превратить незнание в запрос.