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

推荐订阅源

SecWiki News
SecWiki News
N
Netflix TechBlog - Medium
D
Docker
Stack Overflow Blog
Stack Overflow Blog
云风的 BLOG
云风的 BLOG
U
Unit 42
Recorded Future
Recorded Future
G
Google Developers Blog
T
Threatpost
Google DeepMind News
Google DeepMind News
D
DataBreaches.Net
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
The Blog of Author Tim Ferriss
C
Cyber Attacks, Cyber Crime and Cyber Security
A
Arctic Wolf
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
GbyAI
GbyAI
V
Vulnerabilities – Threatpost
Project Zero
Project Zero
WordPress大学
WordPress大学
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
M
MIT News - Artificial intelligence
月光博客
月光博客
Spread Privacy
Spread Privacy
Know Your Adversary
Know Your Adversary
人人都是产品经理
人人都是产品经理
D
Darknet – Hacking Tools, Hacker News & Cyber Security
The Hacker News
The Hacker News
K
Kaspersky official blog
Simon Willison's Weblog
Simon Willison's Weblog
MongoDB | Blog
MongoDB | Blog
J
Java Code Geeks
I
Intezer
Y
Y Combinator Blog
P
Proofpoint News Feed
G
GRAHAM CLULEY
L
LINUX DO - 热门话题
Schneier on Security
Schneier on Security
B
Blog
Jina AI
Jina AI
V2EX - 技术
V2EX - 技术
雷峰网
雷峰网
Last Week in AI
Last Week in AI
V
V2EX
Martin Fowler
Martin Fowler
P
Palo Alto Networks Blog
Latest news
Latest news
Google DeepMind News
Google DeepMind News
L
Lohrmann on Cybersecurity
The Last Watchdog
The Last Watchdog

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

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет 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 миллионов точек без потерь
Когда онбординг длится 2 месяца: день 2 — карта репозиториев
Sadie · 2026-05-10 · via Все публикации подряд на Хабре

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

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

Охват и читатели5

Кейс

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

Добро пожаловать в 50% IT-компаний вторую статью цикла про онбординг в сложную систему!

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

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

В этой статье я продолжаю разбирать публичный проект ThemeParks и собираю repository map — карту ключевых репозиториев, их ролей и связей. Это не точная внутренняя архитектура команды, а onboarding-map по публичным данным. Цель - понять, через какие репозитории проходит основной поток данных.

К концу статьи у нас будет:

  • короткое описание ключевых репозиториев;

  • dependency matrix — таблица проверенных связей;

  • схема их вероятных взаимосвязей;

1. Доступы есть, понимания нет

Обычно новичку дают доступы ко всем репозиториям и, если повезёт, объясняют:

“Вот основной бекенд, тут фронтенд, тут сервис для проверки того-то, тут вторая версия такого-то сервиса, а этот репозиторий отвечает за генерацию клиентов. Начни с основного сервиса, потом посмотри документацию и конечно наши терабайты записей тренингов. Если установка не заведётся — поправь потом в инструкции”.

Иногда там даже есть README и часто инструкции по установке. И это уже неплохо.

Я часто замечала, что README обычно объясняет отдельный репозиторий, а не систему между репозиториями.

В итоге у новичка появляется плоский список:

  • основной бекенд;

  • фронтенд;

  • сервис для проверки того-то;

  • вторая версия такого-то сервиса;

  • генератор клиентов;

Такой список тоже нужен. Мы его составим как промежуточный артефакт. Но он не помогает начать работать из-за своей плоскости.

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

Поэтому на этом этапе я хочу перейти от списка репозиториев к карте их ролей и связей.

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

Будь ThemeParks чуть более сложен с точки зрения бизнес-логики, мы бы прошлись по его основным 2-3 сценариям и составили бы краткую документацию по ним. И у меня уже есть на примете проект где я покажу как это делать.

Помимо уже озвученного плюса repository map есть еще один важный момент - на него отлично ложится схема data flow. Это уже чуть более детализированная по данным схема потока.

Что обидно: такую схему почти никогда не дают на старте. Хотя именно она могла бы сильно сократить первые дни или даже недели онбординга. И сделать ее ничего не стоит, когда ты понимаешь систему.

Если вы разработчик и перед вами новый проект — составьте такую карту хотя бы для себя. А потом включите в пресловутую инструкцию по установке, которая, надеюсь, сработала.

2. Что получим в конце

Сегодня соберем 3 артефакта:

  • repo roles: короткое описание, какую роль играет каждый ключевой репозиторий.

  • dependency matrix: таблица проверенных связей между репозиториями и API boundary.

  • relationship map: схема, которая показывает, как репозитории связаны между собой.

В итоге после этого этапа у новичка появляется не набор репозиториев, а рабочая карта:

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

3. Про ThemeParks

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

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

И раз у меня нет внутреннего контекста, я собираю рабочую гипотезу по открытым признакам:

  • описаниям репозиториев;

  • README;

  • структуре проекта;

  • публичным зависимостям;

  • названиям файлов и папок;

  • ссылкам между репозиториями.

То есть я показываю не “как устроен ThemeParks на самом деле”, а как можно думать при входе в незнакомую систему.

Наша цель — не угадать чужую архитектуру идеально. Наша цель — научиться превращать разрозненные публичные следы проекта в рабочую onboarding-map.

4. Плоский список

Начинаю с плоского списка и превращаю его в карту зависимостей, потом в рабочую карту.

В GitHub organization ThemeParks сейчас видно 8 публичных репозиториев:

Репозиторий

Рабочая роль

Почему так думаю

parksapi

probable core data / integration layer

Описан как backend library для получения live theme park data. В README сказано, что библиотека получает real-time данные: wait times, schedules, entity metadata — и powers the free API at ThemeParks.wiki.  

typelib

shared types / schema layer

Описан как ThemeParks.wiki TypeScript Type Lib. В README говорится, что пакет генерирует типы из JSON schemas и даёт runtime type validation. Поэтому на первом проходе я отношу его к слою общих типов и схем.  

ThemeParks_JavaScript

JS/TS SDK for API consumers

Описан как JavaScript library для ThemeParks.Wiki API. В README он представлен как typed TypeScript/JavaScript SDK для ThemeParks.wiki API.  

ThemeParks_Python

Python SDK for API consumers

Описан как Python API Library для ThemeParks.Wiki. README называет его typed Python SDK для ThemeParks.wiki API.  

apigenerator

API client generation tooling

Описан как инструмент, который generates OpenAPI clients to interact with ThemeParks.wiki. В README отдельно упоминается генерация обновлённых клиентов и публикация JavaScript/Python SDK.  

pebble

consumer app / example client

Описан как Pebble app for ThemeParks.wiki. Поэтому я не отношу его к ядру системы, но держу рядом как возможный пример потребителя публичного API.  

PlayStoreWatch

supporting utility

Описан как Basic Play Store app version watcher. По названию и описанию это похоже на вспомогательную утилиту, а не на центральный слой движения theme park data.  

android-frida

debugging / reverse-engineering helper scripts

Описан как Frida helper scripts for debugging Android. На первом проходе я отношу его к вспомогательным debugging-инструментам, а не к основному продуктовому контуру.  

5. Dependency matrix: карта проверенных связей

Я конечно не буду предлагать строить карту из предыдущей таблицы. Потому что связи не очевидны. Тут немного сыграем в Морской бой. Сперва покажу результат, а потом скажу, как таблицу заполнить.

From / To

parksapi

typelib

ThemeParks.wiki API

ThemeParks_JavaScript

ThemeParks_Python

apigenerator

pebble

PlayStoreWatch

android-frida

parksapi

depends on

powers

typelib

types for API

ThemeParks.wiki API

consumed by

consumed by

has OpenAPI spec

consumed by

ThemeParks_JavaScript

calls API

ThemeParks_Python

calls API

apigenerator

uses OpenAPI spec

generates clients

generates clients

pebble

calls API

PlayStoreWatch

android-frida

Очевидно, пишем названия репозиториев в строчку и в столбик.

Как найти связи?

  • Прежде всего конечно в манифест файлах - package.json, pyproject.toml, requirements.txt, go.mod, Cargo.toml, pom.xml, build.gradle

  • Выполнить grep'ом поиск по репозиторию по ключевым словам пакетов

  • Проверить CI/CD файлы, там тоже часто много подсказок

Тут 8 репозиториев, не стесняйтесь использовать ИИ и автоматизацию в случае если их 80. Да и с 8 тоже не помешает.

На примере узла ThemeParks.wiki API этот путь будет такой:

  • в package.json засветился "@themeparks/typelib": "^1.1.5"

  • в ThemeParks_JavaScript/package.json репозиторий описан как Official SDK for the ThemeParks.wiki API => ThemeParks_JavaScript — подтверждённый SDK для публичного API

  • В ThemeParks_Python/pyproject.toml описание такое же - Official SDK for the ThemeParks.wiki API => ThemeParks_Python тоже подтверждённый SDK для публичного API

  • README у ThemeParks_JavaScript и ThemeParks_Python подтверждают связи

  • В pebble/README нашли, что Pebble - smartwatch app для ThemeParks.wiki. В architecture notes сказано, что PKJS на стороне телефона вызывает ThemeParks.wiki HTTP API и передаёт данные на часы. => pebble — подтверждённый consumer API

  • Проверили codegen / tooling: В apigenerator/README написано, что он генерирует OpenAPI clients для ThemeParks.wiki. В generate_config.js видно, что генератор использует файл ../themeparksapi/docs/v1.yaml => apigenerator связан с ThemeParks.wiki API через OpenAPI contract

Итого 6 связей нашли для этого репо:


parksapi -> typelib
parksapi ->
ThemeParks.wiki API
ThemeParks.wiki API -> ThemeParks_JavaScript
ThemeParks.wiki API -> ThemeParks_Python
ThemeParks.wiki API -> pebble
apigenerator ->
ThemeParks.wiki API / OpenAPI contract

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

6. Рабочая карта

Когда у нас на руках все связи, мы готовы сделать из этого карту. Опять же, не пренебрегайте автоматизацией, если ей владеете. Из 80 репо сделать карту вручную не так уж просто.

Отдельно поясню, почему на схеме parksapi и ThemeParks.wiki API показаны разными блоками.

Это не два репозитория с одинаковой ролью. Это два разных уровня карты.

parksapi — это репозиторий, где находится backend library для получения и подготовки live theme park data. А ThemeParks.wiki API — это публичная API-граница, через которую эти данные уже доступны внешним потребителям. В README parksapi прямо сказано, что библиотека powers the free API at ThemeParks.wiki, а клиентские библиотеки нужны, чтобы получать данные из ThemeParks.wiki API, а не запускать parksapi напрямую.  

parksapi — это место, где, судя по публичному описанию, живёт логика получения и подготовки данных.

ThemeParks.wiki API — это публичная поверхность, через которую эти данные потребляют SDK и внешние клиенты.

Для онбординга это полезное разделение.

Репозиторий отвечает на вопрос: где живёт логика сбора и подготовки данных?
API boundary отвечает на другой вопрос: через какую публичную поверхность эти данные потребляют SDK и внешние клиенты?

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

Первая часть — основной продуктовый контур:

  • parksapi — вероятное ядро сбора и подготовки данных;

  • typelib — общий язык типов и схем;

  • ThemeParks.wiki API — публичная граница, через которую данные уходят наружу;

  • ThemeParks_JavaScript и ThemeParks_Python — SDK для потребителей API;

  • apigenerator — tooling, который помогает генерировать или обновлять API-клиенты.

Вторая часть — вспомогательные и периферийные репозитории:

  • pebble — отдельное клиентское приложение, возможный потребитель публичного API;

  • PlayStoreWatch — вспомогательная утилита;

  • android-frida — debugging/helper scripts для Android.

Так плоский список репозиториев превращается в первую рабочую карту системы. Она ещё не объясняет всё, но уже показывает главное: где вероятное ядро, где публичная граница, где потребители, а где инструменты вокруг основного контура.

7. Итоговые onboarding artifacts дня

  • Таблица репозиториев

  • dependency matrix

  • relationship diagram

Relationship diagram - главный артефакт этапа. Его можно дать новичку в первый день, чтобы он не собирал эту карту заново в голове.

Этого уже достаточно, чтобы перейти от вопроса:

  • какие репозитории есть и как они связаны?

к следующему:

  • какие данные между ними движутся?

8. Дальше — data flow

Теперь у нас есть первый рабочий слой карты:

  • какие репозитории есть

  • какую роль они играют

  • как связаны между собой

Это уже сильно лучше, чем просто список доступов и README.

Но пока мы ответили только на вопрос:

  • кто есть кто?

Следующий вопрос глубже:

  • что между ними движется?

В следующей статье я наложу на эту карту data flow:

  • откуда данные приходят

  • где превращаются во внутреннюю модель

  • где нормализуются

  • куда уходят

  • кто их потребляет

На примере ThemeParks это значит: посмотреть, как данные о парках проходят путь от внешних источников к parksapi, становятся подготовленными live data, выходят через публичный API и становятся удобными для SDK.

До новых встреч и спасибо за прочтение!