From bbd5784e2afc9ae436390df82c186dca6030398e Mon Sep 17 00:00:00 2001 From: Dmitry Dementev Date: Sat, 6 Jun 2026 18:14:07 +0300 Subject: [PATCH] =?UTF-8?q?docs(course):=20=D1=81=D0=B8=D0=BD=D1=85=D1=80?= =?UTF-8?q?=D0=BE=D0=BD=D0=B8=D0=B7=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=20?= =?UTF-8?q?LEARNING=5FPLAN=20=D1=81=20=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D0=BC?= =?UTF-8?q?=20=E2=80=94=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=C2=A73.1?= =?UTF-8?q?=20=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Зачем: - все 11 чекбоксов §3.1 по урокам 2–3 были `[ ]`, хотя правки давно в коде/уроках; план вводил в заблуждение «работа не сделана». - Что: - проставлены `[x]` по урокам 2 и 3 после сверки с реальным кодом (шапки «поток данных», DQ-split «зачем», чистка legacy-MV, демоут DM, seed 1919, war-story kafka_ts, recap цепочки). - в §4 добавлена строка статуса: уроки 0–6 написаны, контент собран. - Проверка: - grep '\[ \]' docs/course/LEARNING_PLAN.md # незакрытых пунктов §3.1 нет --- docs/course/LEARNING_PLAN.md | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/docs/course/LEARNING_PLAN.md b/docs/course/LEARNING_PLAN.md index e31c4f0..2d582aa 100644 --- a/docs/course/LEARNING_PLAN.md +++ b/docs/course/LEARNING_PLAN.md @@ -83,32 +83,32 @@ Kafka из роадмапа — оно даёт словарь терминов. - В финале урока — мост к уроку 2: вопрос «почему дальше не MV?». **Урок 2 — STG→ODS, типизация + DQ-split (`sql/ods/20_stg_to_ods.sql` + DDL `sql/ddl/ods/20_ods.sql`):** -- [ ] **Кандидат на war-story по типам:** баг `kafka_ts` из урока 1 (`toInt64(DateTime64)` +- [x] **Кандидат на war-story по типам:** баг `kafka_ts` из урока 1 (`toInt64(DateTime64)` молча срезал миллисекунды → 1970). Это идеальная иллюстрация темы урока — «тихая - потеря данных на неверном типе». Решить при написании, давать ли как пример. -- [ ] Добавить однострочный «поток данных» в шапку `20_stg_to_ods.sql` + потеря данных на неверном типе». Решено: дан как пример в уроке 2 (war-story в финале). +- [x] Добавить однострочный «поток данных» в шапку `20_stg_to_ods.sql` (`stg.*_raw → ods.* + ods.*_errors`) — п.3 чеклиста. -- [ ] Добавить строку «зачем»: основная таблица = валидный ключ (но может иметь +- [x] Добавить строку «зачем»: основная таблица = валидный ключ (но может иметь `parse_errors` по неключевым полям), а `*_errors` = любая ошибка. Без этого непонятно, почему одна строка попадает в оба места (двойной учёт) — проваливается тест одного прохода. -- [ ] Убрать мусор: в `sql/ddl/ods/20_ods.sql` (стр. ~15–25) — восемь +- [x] Убрать мусор: в `sql/ddl/ods/20_ods.sql` (стр. ~15–25) — восемь `DROP TABLE IF EXISTS stg.mv_*_to_ods` (чистка legacy-MV). Шум прошлой архитектуры, мента читает его раньше сути. Вынести из учебного файла. -- [ ] Минор: в `20_ods.sql` разнобой партиционирования (`browser` по `event_date`, +- [x] Минор: в `20_ods.sql` разнобой партиционирования (`browser` по `event_date`, остальные по `src_ingest_ts`) — одна строка «почему» либо унифицировать. - В «Зачем» урока — ответ на мост из урока 1: батч ради наблюдаемости/управляемости. **Урок 3 — ODS→DDS, сборка сущностей (`sql/dds/30_ods_to_dds.sql` + DDL `sql/ddl/dds/30_dds.sql`):** -- [ ] Добавить однострочный «поток данных» в шапку `30_ods_to_dds.sql` +- [x] Добавить однострочный «поток данных» в шапку `30_ods_to_dds.sql` (`ods.* → dds.click + dds.event`) — п.3 чеклиста. -- [ ] В финале урока — **recap всей цепочки** STG→ODS→DDS: защита от фрагментации после +- [x] В финале урока — **recap всей цепочки** STG→ODS→DDS: защита от фрагментации после расщепления середины (менти должен собрать сквозную модель, а не три изолированных слоя). -- [ ] **Демоут DM** оформляем здесь: убрать мусор в `sql/dm/40_dds_to_dm.sql` +- [x] **Демоут DM** оформляем здесь: убрать мусор в `sql/dm/40_dds_to_dm.sql` (стр. ~14–37, закомментированный «пример материализации витрины») и превратить его в короткую заметку «VIEW сейчас, материализуем если затормозит, см. `docs/ARCHITECTURE.md`». Добавить «поток данных» в шапку `40_dds_to_dm.sql`. -- [ ] Минор: `sql/ddl/dm/40_dm.sql` — магическое `1919` в `groupArraySample` +- [x] Минор: `sql/ddl/dm/40_dm.sql` — магическое `1919` в `groupArraySample` (строка «зачем» или упростить). - Сами витрины DM показываем в деле в уроках 5–6, отдельного разбора не делаем. @@ -140,6 +140,10 @@ Kafka из роадмапа — оно даёт словарь терминов. ## 4. Что дальше -Пишем уроки по одному, по шаблону из `LESSON_STANDARD.md`, начиная с урока 1 -(Kafka→CH). Урок 0 (разминка на Kafka UI) можно готовить параллельно — он не зависит -от полировки кода. Правки кода из §3.1 применяем в составе соответствующего урока. +Все уроки 0–6 написаны (`lessons/`), правки кода §3.1 применены в составе уроков — +чекбоксы выше сверены с реальным кодом 2026-06-06. Базовый контент курса собран. + +Исходный план фазы написания (оставлен как контекст): пишем уроки по одному, по +шаблону из `LESSON_STANDARD.md`, начиная с урока 1 (Kafka→CH); урок 0 (разминка на +Kafka UI) готовим параллельно — он не зависит от полировки кода; правки кода из §3.1 +применяем в составе соответствующего урока.