Модуль 27

Чанкінг та розбиття задач

Ось урок у стилі CS50, адаптований під тему "Чанкінг та розбиття задач".


🎓 CS50: Мистецтво "їсти слона", або Чанкінг та Розбиття Задач

Привіт, друзі! Ласкаво просимо! 👋

Сьогодні ми не будемо писати код одразу. Ми зробимо дещо важливіше — ми навчимося думати так, щоб код писався легко. Ми поговоримо про суперсилу, яка відрізняє сеньйор-розробника від студента, що панікує перед дедлайном.

Тема сьогоднішнього уроку: Декомпозиція, Чанкінг та Розбиття задач.


1. 🔥 Вступ: Проблема та мотивація

Уявіть ситуацію. Ви прокидаєтесь вранці, дивитесь у свій планер, а там лише один пункт: "Створити аналог Instagram".

Що ви відчуваєте? Страх? Паніку? Бажання закрити ноутбук і піти пити каву до вечора? Це абсолютно нормальна реакція мозку. Коли завдання виглядає як величезна монолітна гора, наш мозок вмикає режим "бий або біжи" (зазвичай "біжи").

Звучить знайомо?

А тепер уявіть іншу ситуацію. Ви заходите на кухню, щоб приготувати бутерброд. 1. Взяти хліб. 2. Намастити масло. 3. Покласти сир.

Ви ж не панікуєте перед бутербродом? Чому? Тому що ви бачите послідовність простих кроків.

Навіщо нам це в IT? У комп’ютерних науках ми рідко вирішуємо прості задачі. Ми будуємо складні системи. Якщо ви спробуєте тримати в голові весь проект одночасно, ваш "оперативний мозок" переповниться, і ви отримаєте Stack Overflow у власній голові.

Без вміння розбивати задачі ви будете писати код, який неможливо читати, неможливо тестувати і неможливо підтримувати.


2. 🧠 Теоретична база (Що там "під капотом"?)

Давайте розберемося з термінологією, але без нудних визначень.

Що таке Декомпозиція?

Це процес розбиття великої складної системи на менші, простіші частини. * Аналогія: Це як LEGO. Замок Хогвартс (велика система) складається з тисяч маленьких цеглинок (підзадач).

Що таке Чанкінг (Chunking)?

Це групування цих маленьких частин у логічні блоки. Наш мозок може ефективно тримати в увазі лише 4–7 об'єктів одночасно. * Замість того, щоб запам'ятовувати номер 0971234567, ми запам'ятовуємо 097-123-45-67. Це і є чанкінг.

Як це працює в архітектурі?

Уявіть собі дерево. * Корінь: Ваша головна мета (наприклад, "Створити гру"). * Гілки: Основні модулі (Графіка, Фізика, Управління гравцем). * Листя: Конкретні функції (move_player(), load_texture()).

🛑 Що треба запам’ятати залізно: Комп'ютер (і ваш мозок) найкраще працює, коли вирішує одну маленьку задачу за раз.

👉 Інтуїтивне правило: Якщо ви не можете пояснити, що робить ця частина коду/задачі одним реченням — вона занадто велика. Розбивайте її!


3. 🧪 Приклади: Від кави до коду

Давайте подивимось, як це працює на практиці.

Приклад 1: "Зробити каву" (Побутовий рівень)

Якби ви програмували робота, команда make_coffee() була б для нього незрозумілою.

Очікування студента: Робот просто робить каву. Реальність: Робот зависає, бо не знає, де чашка.

Розбиття (Декомпозиція): 1. Знайти чашку. 2. Перевірити наявність води. 3. Якщо води немає -> долити. 4. Нагріти воду. 5. ... і так далі.

Приклад 2: "Форма реєстрації на сайті" (Реальний проект)

Уявіть, вам треба зробити реєстрацію. Новачок кидається писати HTML, CSS і базу даних в одному файлі.

Як це бачить профі (Чанкінг): Ми ділимо задачу на шари: 1. Front-end (Вигляд): Поля вводу, кнопка "Реєстрація", валідація (чи ввів юзер @ в пошті?). 2. Back-end (Логіка): Отримати дані, перевірити, чи немає вже такого юзера. 3. Database (Пам'ять): Зберегти юзера в таблицю.

Бачите? Замість "Зробити реєстрацію" у нас тепер 3 зрозумілі задачі.

Приклад 3: Функція у коді (Трохи складніше)

Припустимо, ми пишемо функцію для обробки замовлення.

Поганий підхід (Моноліт):

def process_order(order):
    # 50 рядків коду перевірки наявності товару
    # 40 рядків коду списання грошей з картки
    # 30 рядків коду відправки email
    # 20 рядків коду запису в базу
    pass

Чому це погано? Якщо зламається відправка email, ви будете шукати помилку серед 140 рядків коду.

Хороший підхід (Декомпозиція):

def process_order(order):
    check_inventory(order)
    payment_status = charge_card(order)
    if payment_status == "success":
        save_to_db(order)
        send_email(order)

Чому це круто? Функція process_order тепер читається як англійський текст. Ми сховали складність всередину менших функцій.


4. 🛠 Практична частина

А тепер ваша черга! Увімкніть логіку.

Завдання 1: Організатор вечірки У вас задача: "Організувати День народження друга". 🔹 Завдання: Розпишіть цю задачу на 3 основні категорії (чанки), а в кожній категорії — по 2-3 конкретні дії.

Завдання 2: Рефакторинг життя Уявіть функцію clean_house(). Вона надто велика. 🔹 Завдання: Напишіть псевдокод (словами або кодом), розбивши її на функції clean_kitchen(), clean_bedroom() тощо. Що буде всередині clean_kitchen()?

Завдання 3: Пошук помилки У вас є величезна інструкція зі збору шафи на 50 сторінок суцільним текстом. Ви застрягли. 🔹 Питання: Якби інструкція була розбита на кроки (Зібрати каркас -> Вставити полиці -> Прикрутити двері), як би це допомогло вам швидше знайти, де саме ви прикрутили деталь не тим боком?

Завдання 4: Міні-кейс "Чорна скринька" Ви робите програму "Калькулятор калорій". 🔹 Питання: Які мінімальні незалежні частини (модулі) вам потрібні? (Підказка: база продуктів, математика, інтерфейс користувача).

Завдання 5: А що, якщо... Ви розбили задачу на частини, але раптом замовник каже: "Ми більше не використовуємо електронну пошту, ми відправляємо SMS". 🔹 Питання: Якщо ваш код розбитий на функції (як у прикладі 3), скільки місць у коді вам доведеться змінити? А якщо не розбитий?


5. 💡 Мислення як у розробника

Ось тут криється різниця між кодером і інженером.

🚩 Типові помилки новачків:

  1. "Я запам'ятаю": Намагання тримати всю структуру в голові. Спойлер: ви щось забудете через 5 хвилин.
  2. "Напишу все в main": Створюється файл на 1000 рядків, який страшно відкривати.
  3. Передчасна деталізація: Ви ще не знаєте, як працюватиме програма в цілому, але вже 2 години обираєте колір кнопки.

🧠 Як думає сеньйор (David Malan mode on):

  • Divide and Conquer (Розділяй і володарюй): Якщо задача здається складною, вона просто недостатньо розбита. Діли її до тих пір, поки рішення шматочка не стане очевидним (або "тривіальним", як ми любимо казати).
  • Інтерфейси: Сеньйор думає: "Мені байдуже, як працює функція send_email всередині, головне, що вона приймає адресу і текст". Це називається абстракція.
  • Чек-листи: Досвідчені розробники обожнюють списки (To-Do lists). Викреслення маленького пункту дає дофамін і мотивацію рухатись далі.

Порада дня: Перш ніж написати перший рядок коду, візьміть листок паперу і ручку. Намалюйте схему. Код — це лише переклад ваших думок мовою машини. Якщо думки не структуровані, код буде сміттям.


6. 🧩 Підсумок

Ну що, видихнули?

Сьогодні ми зрозуміли, що: 1. Великі задачі — це ілюзія. Вони складаються з багатьох маленьких. 2. Чанкінг рятує наш мозок від перевантаження. 3. Декомпозиція робить код чистим, а життя розробника — спокійнішим.

Тепер ви вмієте не просто "писати код", а проектувати рішення. Ви більше не боїтеся порожнього текстового редактора, бо знаєте: будь-якого слона можна з'їсти, якщо нарізати його на стейки.

🔜 Що далі? Тепер, коли ми маємо купу маленьких "шматочків" задачі, як нам їх виконувати? По одному? Всі разом? Як знайти найшвидший шлях? На наступному уроці ми поговоримо про Алгоритми — рецепти, за якими ми готуємо наші "шматочки".

Це був CS50. Побачимось! 👋