Пошук між інструментами для розробників: код – не те місце
Більшість рішень розробників знаходиться поза кодом. Ось як побудувати наскрізний пошук між Slack, Linear, GitHub та Notion.
By Ellis Keane · 2026-03-17
Ваша кодова база – найменш корисне місце для пошуку причини прийнятого рішення.
Знаю, що це звучить парадоксально. Ми витрачаємо роки на вивчення прапорів ripgrep, налаштування пошуку в IDE, запам'ятовування шаблонів regex – і жоден із цих навичок не допомагає, коли питання не "де ця функція?", а "чому ми обрали цей підхід замість трьох альтернатив, які обговорювали?" Відповідь на друге питання майже ніколи не знаходиться в коді. Вона в треді Slack чотиримісячної давності, у коментарі Linear, похованому під оновленнями статусу, в документі Notion, який хтось почав і ніколи не завершив, та в рецензії PR, де справжня дискусія відбулася у відповіді на відповідь на відповідь.
Ось у чому полягає проблема пошуку між інструментами для розробників – контекст рішень розкиданий по інструментах без єдиного шляху запиту. У кожному інструменті є пошук, який добре працює в межах нього – пошук Slack непоганий, пошук коду GitHub чудовий, Linear має фільтри для всього – але немає нічого, що шукало б поміж ними. Рішення, які визначили вашу архітектуру, знаходяться у п'яти різних місцях, і ви маєте пам'ятати, де саме шукати.
Отже – ось як побудувати пошук між інструментами за допомогою того, що вже є. Нових інструментів не потрібно (майже – згадаю один наприкінці, але без нього теж працює).
Анатомія розкиданого рішення
Розберу конкретний приклад. Минулого року ми вирішували, використовувати BullMQ чи Temporal для черги завдань. Ось де насправді жило це рішення:
- Slack (#engineering): Три окремі треди протягом двох днів. Перший – посилання, яке хтось поділився на блог-пост Temporal. Другий – дискусія, чи потрібна нам durable execution. Третій (тижнем пізніше, інший канал) – хтось запитує: "стоп, ми вже вирішили питання з чергою?"
- Linear: Issue під назвою "Оцінити варіанти черги завдань" із шістьма коментарями, зокрема порівняльна таблиця, яку один із наших інженерів витратив півдня на написання.
- GitHub: Опис PR для реалізації BullMQ, де написано "як обговорювалося" – без жодного посилання на місце обговорення.
- Notion: Напівзавершений запис архітектурного рішення, що охоплював плюси Temporal, але так і не був оновлений фінальним вибором.
- Google Docs: Нотатки зустрічі, на якій ми фактично прийняли рішення, поховані в пунктах списку між двома непов'язаними пунктами порядку денного.
П'ять інструментів. Одне рішення. І якщо б ви шукали в будь-якому окремому інструменті, знайшли б лише фрагмент – ніколи не повну картину. PR говорить, що ми обрали. Треди Slack говорять, що ми розглядали. Issue Linear говорить про компроміси. Документ Notion – про половину обґрунтування. Нотатки зустрічі – про момент фіналізації.
Це не виняток. Це, якось так, стан мистецтва того, як інженерні команди відстежують рішення у 2026 році. Є ШІ, що генерує код, і пошукові системи, що індексують весь інтернет, але щоб з'ясувати, чому ваша команда обрала BullMQ замість Temporal, треба перевірити п'ять додатків і сподіватися, що чиясь пам'ять не підведе.
Що робить пошук між інструментами складним для розробників
Це не проблема API – кожен інструмент, яким ми користуємося, має чудовий API пошуку. Проблема дивніша:
Різні форми даних. Slack повертає повідомлення з часовими мітками та ідентифікаторами каналів. Linear повертає issues зі статусами та мітками. GitHub повертає commits, PR та збіги коду в абсолютно різних форматах відповідей. Щоб об'єднати їх у зв'язну хронологію, потрібна нормалізація, яку ніхто не береться будувати (бо, чесно кажучи, це та робота, яка не з'являється в демонстраціях спринтів).
Фрагментація контексту. Повідомлення Slack "підемо з варіантом Б" позбавлене сенсу без треду, де визначено варіанти А, Б та В. Але пошук Slack повертає окремі повідомлення, а не дуги розмов. Ви знаходите висновок без обґрунтування.
Часовий зсув. Процес прийняття рішень часто розтягується на дні або тижні з перервами, коли нічого не відбувалося, бо всі були зайняті іншою роботою. Пошук за ключовими словами може виявити початок і кінець розмови, пропустивши вирішальну середину – просто тому, що на різних етапах використовувалися різні слова.
Пошук між інструментами для розробників – це не проблема API; у кожного інструменту є чудовий endpoint пошуку. Це проблема контексту: рішення розкидані по інструментах у несумісних форматах, фрагментовані дугами розмов та розділені часовим зсувом. Пошук за ключовими словами знаходить фрагменти; лише зв'язний контекст дає повну картину.
Побудова пошуку між інструментами з наявними засобами
Ось практична частина. Для трьох-чотирьох інструментів з пошуком лише для читання розраховуйте на пів дня для запуску MVP – більша частина часу піде на налаштування автентифікації та нормалізацію відповідей, а не на саму логіку пошуку.
Налаштування доступу до API
Вам знадобляться токени для кожного інструменту:
- Slack: Токен користувача зі scope
search:read (методи пошуку Slack вимагають токенів користувача, а не ботів – створіть через сторінку Slack API apps)
- Linear: Особистий API-ключ у Налаштуваннях, розділ API
- GitHub: Деталізований PAT із доступом на читання до ваших репозиторіїв
- Notion: Токен внутрішньої інтеграції у Налаштуваннях, розділ Connections
Скрипт розподіленого запиту
Базовий шаблон до ніяковості простий – надішліть той самий пошуковий запит до кожного API та зберіть результати:
```typescript interface SearchResult { source: 'slack' | 'linear' | 'github' | 'notion'; title: string; snippet: string; url: string; timestamp: Date; }
async function crossToolSearch(query: string): Promise<SearchResult[]> { const results = await Promise.all([ searchSlack(query), searchLinear(query), searchGitHub(query), searchNotion(query), ]);
return results .flat() .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime()); } ```
Кожна функція search* обгортає відповідний API. Для Slack це search.messages. Для Linear – GraphQL-запит до їхніх пошукових полів. Для GitHub – REST endpoint пошуку. Для Notion – endpoint пошуку з параметром query.
Нормалізація та дедублікація
Складна частина – не пошук, а перетворення результатів на щось корисне. Вам знадобиться:
- Нормалізувати часові мітки по всіх інструментах (Slack використовує Unix epoch, Linear – ISO-рядки, GitHub – ISO зі зміщенням часового поясу)
- Групувати пов'язані результати – якщо той самий тред Slack з'явився тричі через три збіги повідомлень, згорніть їх в один результат із URL треду
- Ранжувати за релевантністю – більшість API повертають власні оцінки релевантності, але вони непорівнянні між інструментами. Проста евристика: точні збіги ключових слів у заголовках ранжуються вище за збіги в тілі, а новіші результати перевищують старші за рівної релевантності
Обгортання в CLI
Я використовую для цього Commander.js (здебільшого за звичкою, але підійде будь-що):
```bash $ cross-search "bullmq vs temporal"
Found 14 results across 4 tools:
[Slack] #engineering – 2025-11-14 "I've been comparing BullMQ and Temporal for the job queue..." https://myteam.slack.com/archives/C0X.../p17318...
[Linear] ENG-342 – 2025-11-15 "Evaluate job queue options – BullMQ vs Temporal" https://linear.app/myteam/issue/ENG-342
[GitHub] PR #289 – 2025-11-22 "feat: implement BullMQ job queue (as discussed)" https://github.com/myorg/myrepo/pull/289
[Notion] Architecture Decisions – 2025-11-13 "Job Queue Evaluation: Temporal vs BullMQ" https://notion.so/myteam/abc123... ```
Чотирнадцять результатів, відсортованих за часом, по чотирьох інструментах. Можна побачити повну дугу рішення в одному місці: спершу був розпочатий документ Notion, потім відбулася дискусія в Slack, потім для відстеження був створений issue в Linear, і нарешті тижнем пізніше з'явився PR.
Зробити це справді якісним
Базова версія вище працює, але є кілька прикрих граней. Ось як її покращити:
Розгортання тредів у Slack. Коли знаходите відповідне повідомлення, завантажте весь тред через conversations.replies. Знайдене повідомлення може бути "та, підемо з BullMQ" – без попередніх 40 повідомлень дискусії це марно. Відображайте уривок треду, а не лише відповідне повідомлення.
Коментарі до рецензій PR. API пошуку GitHub не показує коментарі рецензій під час пошуку PR – для їх отримання потрібен окремий виклик до endpoint рецензій pull request. Саме там живе реальна технічна дискусія.
Зворотні посилання. Знайшовши issue Linear, перевірте, чи є повідомлення Slack, що містять URL цього issue. Пошук Slack підтримує фільтри has:link у поєднанні з ключовими словами. Це виявляє неформальне обговорення навколо офіційного відстеження.
Кешування. Якщо команда генерує багато контенту (а чия не генерує), ви швидко наткнетеся на обмеження частоти запитів. Кешуйте результати локально з TTL 30 хвилин – більшість архівних рішень не змінюються так швидко.
Коли текстовий пошук дає збій
Тут буду відвертим щодо обмежень. Пошук за ключовими словами між інструментами дивно далеко заходить – а потім натикається на стіну.
Стіна така: рішення розвиваються. Тред Slack про "черги завдань" міг жодного разу не згадати "BullMQ" – натомість хтось поділився посиланням, хтось інший сказав "мені подобається варіант на Redis", а третій – "погоджуюся, підемо з ним". Ваш пошук "BullMQ" пропускає весь тред, бо слово ніколи не вживалося. Люди в треді знали, що означає "варіант на Redis". Ваш пошук – ні.
Це фундаментально проблема графа, а не тексту. Що вам насправді потрібно: "покажи мені все, пов'язане з рішенням, що призвело до PR #289." Це означає розуміння того, що PR посилається на issue Linear, який був створений після дискусії в Slack, яка почалася, бо хтось прочитав документ Notion. Зв'язки є неявними – люди створювали їх, копіюючи URL та кажучи "як обговорювалося" – і пошук за ключовими словами не може їх відновити.
Частково це можна вирішити, слідуючи посиланням. Витягайте URL із повідомлень Slack, описів PR та коментарів Linear. Побудуйте простий список суміжності: цей тред Slack посилається на цей issue Linear, який згадується в цьому PR. Тоді, коли хтось шукає, ви можете розширити результати, включивши пов'язані елементи навіть якщо вони не відповідають ключовому слову.
Цей підхід зі списком суміжності – по суті зачатковий граф знань – і саме тут знаходиться справжня цінність пошуку між інструментами для розробників. Не в знаходженні окремих повідомлень, а в простеженні нитки рішення по всіх інструментах, яких воно торкнулося. Це менше "пошук" і більше управління знаннями розробника – розуміння того, як інформація тече між вашими інструментами, щоб ви могли відновити контекст, коли він потрібен.
Проблема обслуговування (та скорочений шлях)
Скриптовий підхід чудово працює приблизно три місяці, а потім хтось змінює Slack-воркспейс, або Linear оновлює GraphQL-схему, або ви додаєте новий інструмент і ніхто не пам'ятає оновити скрипт пошуку. Я будував це рівно двічі і двічі кидав (що, мабуть, говорить більше про мою відданість обслуговуванню, ніж про сам підхід).
Якщо хочете пошук між інструментами для розробників, який залишається актуальним без нагляду, саме для цього створені інструменти на кшталт Sugarbug – він автоматично підтримує граф знань та зберігає зв'язки живими в міру зміни ваших інструментів. Але версія "зроби сам" вище справді корисна, якщо ви готові її обслуговувати.
Припиніть шукати в п'яти інструментах окремо. Sugarbug будує граф знань, щоб ви могли знайти будь-яке рішення, обговорення чи commit в одному місці.
Q: Як здійснювати пошук одразу в кількох інструментах розробника? A: Можна побудувати легкий пошук між інструментами, об'єднавши API кожного з них – search.messages Slack, issueSearch Linear та endpoint пошуку коду GitHub – в один скрипт, який розподіляє запити та об'єднує результати за часовою міткою. Наведені вище приклади коду допоможуть розпочати за половину дня. Головна складність – не сам пошук, а нормалізація різних форматів відповідей у зв'язну хронологію.
Q: Чи надає Sugarbug пошук між інструментами для розробників? A: Так. Sugarbug збирає сигнали з Linear, GitHub, Slack, Figma, Notion та інших інструментів у граф знань, тому можна шукати рішення чи обговорення та знаходити кожен пов'язаний тред, issue та commit в одному місці. Він автоматично обробляє нормалізацію, дедублікацію та відстеження посилань – те, що робить підхід "зроби сам" ненадійним з часом.
Q: Чому я не можу знайти архітектурні рішення в кодовій базі? A: Тому що більшість рішень приймається в тредах Slack, коментарях Linear, документах Notion та рецензіях PR – не в самому коді. Код фіксує результат рішення (функція існує, бібліотека вибрана), але обґрунтування, компроміси та обговорені альтернативи розкидані по ваших комунікаційних інструментах. git blame скаже, хто змінив рядок і коли, але не чому вони обрали саме цей підхід замість альтернатив.
Q: Чи може Sugarbug замінити ADR-документи для відстеження рішень? A: Sugarbug не замінює ADR, але фіксує рішення, які ніколи не потрапляють до ADR. Більшість команд пишуть ADR для приблизно 10% своїх архітектурних рішень – решта розчиняється в тредах Slack та коментарях PR. Sugarbug виявляє їх, зв'язуючи розмови зі змінами коду, які вони породили, – тому ви отримуєте відстеження рішень для решти 90%, не змінюючи нічийого робочого процесу.