1 of 77

Екстремальне програмування

к.т.н., доцент Каратанов Олександр Володимирович

2 of 77

Agile marketing statistics

3 of 77

Екстремальне програмування (англ. Extreme Programming, XP) − гнучка методологія розробки ПЗ в умовах неясних або швидко мінливих вимог для невеликих та середніх за розміром команд розробників.

4 of 77

Екстремальне програмування (англ. Extreme Programming, XP) − гнучка методологія розробки ПЗ в умовах неясних або швидко мінливих вимог для невеликих та середніх за розміром команд розробників.

5 of 77

Екстремальне програмування

  • Назва методології виходить з ідеї застосувати корисні традиційні методи і практики розробки програмного забезпечення, піднявши їх на новий «екстремальний» рівень.

Код-рев'ю

Парне програмування

Екстремум функції

6 of 77

Екстремальне програмування

  • Дванадцять основних прийомів (практик) екстремального програмування (за першим виданням книги Extreme programming explained) можуть бути об'єднані в чотири групи:
  • Короткий цикл зворотного зв'язку (Fine-scale feedback)
    1. Розробка через тестування (Test-driven development)
    2. Гра в планування (Planning game)
    3. Замовник завжди поруч (Whole team, Onsite customer)
    4. Парне програмування (Pair programming)
  • Безперервний, а не пакетний процес
    • Безперервна інтеграція (Continuous integration)
    • Рефакторинг (Design improvement, Refactoring)
    • Часті невеликі релізи (Small releases)
  • Розуміння, що поділяється всіма
    • Простота (Simple design)
    • Метафора системи (System metaphor)
    • Колективне володіння кодом (Collective code ownership) або вибраними шаблонами проектування (Collective patterns ownership)
    • Стандарт кодування (Coding standard or Coding conventions)
  • Соціальна захищеність програміста (Programmer welfare):
    • 40-годинний робочий тиждень (Sustainable pace, Forty-hour week)

7 of 77

Практики екстремального програмування

Рефакторинг

Гра в планування

Стандарт кодування

Замовник завжди поруч

Практики екстремального програмування

Розробка через тестування

Парне програмування

Безперервна інтеграція

Часті невеликі релізи

Метафора

Простий дизайн

Колективне володіння кодом

40-годинний робочий тиждень

Приймальне тестування

8 of 77

Управлінські та інженерні практики

Інженерні

    • TDD
    • Pair Programming
    • CI
    • Simple Design
    • Refactoring
    • Code Ownership
    • Coding Standards

Управлінські

    • Release Planning
    • Iteration Planning
    • Small Releases
    • On-Site Customer
    • Acceptance Tests
    • Sustainable Pace
    • Spike

9 of 77

Управлінські та інженерні практики

10 of 77

Інженерні (технічні) практики

Test-Driven Development (TDD)

    • Пишемо тести перед написанням коду.

Програмування парами (Pair Programming)

    • Двоє розробників разом працюють над одним фрагментом коду.

Безперервна інтеграція (Continuous Integration)

    • Часте об'єднання змін у головну гілку з автоматичними тестами.

Простий дизайн (Simple Design)

    • Мінімально необхідна архітектура для виконання поточних вимог.

Рефакторинг (Refactoring)

    • Постійне вдосконалення структури коду без зміни його поведінки.

Колективна власність коду (Collective Code Ownership)

    • Будь-хто може редагувати будь-який код.

Стандарти кодування (Coding Standards)

    • Узгоджений стиль коду для всієї команди.

Спрямовані на якість коду, тестованість і ефективність розробки:

11 of 77

Управлінські (організаційні) практики

Малі релізи (Small Releases)

    • Часті поставки нових функцій клієнту.

Ітераційне планування (Iteration Planning)

    • Планування коротких ітерацій (1–2 тижні) разом з командою.

Планування релізу (Release Planning)

    • Визначення довгострокових цілей спільно з клієнтом.

Замовник на місці (On-Site Customer)

    • Постійний доступ до представника замовника в команді.

Клієнтські тести (Customer Tests / Acceptance Tests)

    • Критерії прийнятності, що визначає замовник.

Сталий темп (Sustainable Pace / 40-Hour Week)

    • Уникнення перевтоми, стабільна продуктивність.

Спайки (Architectural Spike)

    • Короткі дослідження для зниження невизначеності.

Спрямовані на управління командою, взаємодію із замовником та керування планами:

12 of 77

Розробка через тестування �(test-driven development)

  • Простий підхід: спочатку код, а потім до нього пишуть тести.

  • В екстремальному програмуванні використовують test-driven development, тобто тестами вперед. Сенс у тому, щоб спочатку написати автоматичний тест, який пройде лише код із потрібною нам логікою, а після цього написати сам код. Якщо код не буде вирішувати наше завдання, то він не пройде тест. А якщо пройде, то він робить те, що потрібно.

  • Тести це в будь-якому випадку добре.

13 of 77

Розробка через тестування �(test-driven development)

  • На відміну більшості інших методологій тестування в XP — одне з найважливіших складових.

  • Екстремальний підхід у тому, що тести пишуться до написання коду.

  • Кожен модуль повинен мати unit test — тест цього модуля; таким чином, у XP здійснюється regression testing (поворотне тестування, "непогіршення якості" при додаванні функціональності).

14 of 77

Розробка через тестування �(test-driven development)

  • Більшість помилок виправляються на стадії кодування.

  • Тести пишуть самі програмісти; будь-який програміст має право написати тест для будь-якого модуля.

  • Ще один важливий принцип: тест визначає код, а не навпаки (такий підхід носить назву test-driven development), тобто шматок коду кладеться в сховище тоді і тільки тоді, коли всі тести пройшли успішно, інакше ця зміна коду відкидається.

15 of 77

Acceptance Testing — тестування прийнятності

  • Це процес створення автоматизованих (іноді ручних) тестів, що перевіряють, чи система відповідає бізнес-вимогам і очікуванням замовника або користувача.
  • На відміну від Unit tests (які пишуть розробники для коду), Acceptance Tests зазвичай пишуться спільно з бізнесом або QA.

🧪 Приклад Acceptance Test

User Story:�"Як покупець, я хочу мати змогу додати товар у кошик, щоб згодом його придбати."

Acceptance Criteria:

  • Кнопка «Додати в кошик» доступна для всіх товарів
  • Після натискання товар з'являється в кошику
  • У кошику відображається правильна кількість товарів

Feature: Додавання товару у кошик

Scenario: Додавання одного товару

Given я знаходжусь на сторінці товару

When я натискаю "Додати в кошик"

Then товар має з’явитись у кошику

And кількість товарів у кошику дорівнює 1

Acceptance Test (написаний мовою Gherkin)

16 of 77

Планування процесу (planning game)

  • Звичайний підхід: у команди є зразковий графік виходу релізів та розуміння, що має вийти на виході.
  • В екстремальному програмуванні команда зустрічається із замовником кожні кілька тижнів і планує наступний етап: що робимо, що не робимо, що найважливіше зробити для проекту. Іноді це справді нагадує гру, коли у команди є записані на картках побажання замовника і їх потрібно вибудувати в оптимальному для реалізації порядку.
  • ✅ Планування не зашкодило ще жодному проекту.
  • ❌ Замовник повинен бути дуже залученим.

Управлінська практика

17 of 77

Планування процесу (planning game)

  • Вся команда збирається разом, приймається колективне рішення про те, які характеристики системи будуть реалізовані в найближчій ітерації.

  • Набір властивостей визначається користувачами.

  • У XP трудомісткість кожної якості визначається самими програмістами (тим, хто її реалізовувати).

Управлінська практика

18 of 77

Spike

  • Spike — це дослідження, завдання-розвідка, яке команда виконує з метою з’ясування невідомих аспектів, пов'язаних із технічним рішенням або оцінкою складності завдання.

  • Spike не створює безпосередньо функціональність, а допомагає:
    • обрати правильний підхід;
    • вивчити технологію;
    • перевірити гіпотезу;
    • зменшити ризики невизначеності.

19 of 77

Навіщо потрібен Spike?

  • Є завдання, яке складно оцінити через нестачу знань або відсутність інформації.
  • Треба прийняти технічне рішення між кількома підходами.
  • Вивчення нового API, бібліотеки, інструмента.
  • Визначення того, які дані нам потрібні, щоб реалізувати вимогу.

  • Spike ≠ фіча, яка піде в продакшн
  • Spike = інвестиція в знання та зниження ризиків

20 of 77

Формат Spike в беклозі (Jira/Backlog)

Поле

Приклад

Summary

Spike: Дослідити Google OAuth для авторизації

Type

Spike

Acceptance Criteria

Описано кроки інтеграції OAuth, оцінено складність, запропоновано підхід

Estimate

1 день / 0.5 Story Point

Status

Done / In Progress

Sprint

Sprint 3

21 of 77

Тісна взаємодія із замовником �(feed-back, on-site customer)

  • Звичайний підхід: замовник ставить завдання, періодично дивиться на результат та відповідає на запитання команди, коли вони виникнуть.

  • В екстремальному програмуванні замовник завжди доступний для питань, з ним обговорюють код, можливості алгоритмів та функції програми. Будь-який розробник може зателефонувати замовнику будь-якої миті, щоб щось уточнити.

  • ❌ Важко знайти замовника, який буде доступний для питань 24/7 і ще розуміється на алгоритмах.

Управлінська практика

22 of 77

Тісна взаємодія із замовником �(feed-back, on-site customer)

  • Замовник має бути членом XP-команди (on-site customer).

  • Він пише власні історії, вибирає історії, які будуть реалізовані в конкретній ітерації, і відповідає на питання, що стосуються бізнесу.

  • Замовник повинен бути експертом в предметній галузі, що автоматизується.

  • Необхідна постійна наявність зворотного зв'язку із замовником (feed-back).

Управлінська практика

23 of 77

Парне програмування �(pair programming)

  • Одна з найвідоміших XP-практик.

  • Усі програмісти повинні працювати у парах: один пише код, інший дивиться.

  • Таким чином, необхідно розміщувати групу програмістів в одному місці, що найлегше зробити на території замовника (всі необхідні члени команди географічно знаходяться в одному місці); XP найбільш успішно працює у нерозподілених колективах програмістів та користувачів.

24 of 77

Ролі програмістів

  1. Драйвер – пише код.
  2. Спостерігач або штурман – переглядає кожен рядок коду у міру його введення.

  • Вони часто змінюються ролями (кожні ±30 хвилин).

  • Під час огляду спостерігач також пропонує ідеї для покращення та вирішення можливих майбутніх проблем.

25 of 77

Як це виглядає насправді

Штурман

Драйвер

Що ти, чорт забирай, таке пишеш?

мейн пишеться через 'е' чи 'а'?

26 of 77

Види парного програмування

  1. Експертексперт

  • Експертновачок

  • Новачокновачок

27 of 77

Безперервна інтеграція �та часті релізи

  • Звичайний підхід: випуск нових версій найчастіше прив'язаний до спринтів – нова версія виходить раз на 1-2 тижні.

  • В екстремальному підході слід випускати код у продакшен щодня. Як тільки код проходить усі тести, він йде на випуск.

  • 🤔 З одного боку, тести пройдені, а отже, все працює. З іншого — менше шансів переробити щось, якщо спаде на думку більш вдала думка.

28 of 77

Безперервна інтеграція �(continuous integration)

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

29 of 77

Часті релізи (small releases)

  • Мінімальна ітерація — один день, максимальна — місяць; чим частіше здійснюються релізи, тим більше недоліків системи буде виявлено.

  • Перші релізи допомагають виявити недоліки на ранніх стадіях, далі функціональність системи розширюється (на підставі тих же історій користувача).

30 of 77

Часті релізи (small releases)

  • Оскільки користувач включається в процес розробки починаючи з першого релізу, то він оцінює систему і видає історію історії плюс feedback.

  • З цього визначається така ітерація: яким буде новий реліз.

  • У XP все спрямоване на забезпечення безперервного зворотного зв'язку з користувачами.

31 of 77

Рефакторинг (refactoring)

  • Рефакторинг – це оптимізація існуючого коду у бік спрощення, що передбачає постійну роботу зі спрощення коду.

  • Зберігаючи код прозорим і визначаючи його елементи лише один раз, програмісти скорочують кількість помилок, які згодом доведеться усувати.

  • При реалізації кожної нової властивості системи програміст повинен подумати, чи можна спростити існуючий код і як це допоможе реалізувати нову властивість.

  • Крім того, не можна поєднувати рефакторинг із дизайном: якщо створюється новий код, рефакторинг треба відкласти.

32 of 77

Рефакторинг (refactoring)

  • Звичайний підхід: програмісти займаються рефакторингом в останню чергу (іноді й не займаються зовсім).
  • В екстремальному програмуванні рефакторингом займаються постійно: у кожному фрагменті коду, напевно, можна щось поліпшити, а значить, можна брати будь-який старий код і переписувати його в будь-який момент. Завдяки цьому всі намагаються писати простий код, щоби при рефакторингу було менше шансів зламати логіку.
  • 🤔 Іноді рефакторинг заради самого процесу не найкраще заняття у програмуванні. Але коли програму рефакторять багато разів, зазвичай вона починає працювати швидше, чого не скажеш про нові версії сучасного софту.

33 of 77

Проста архітектура (simple design)

  • Звичайний підхід: команда від початку вибирає приблизну архітектуру проекту і дотримується її.

  • Екстремальний підхід: команда обирає архітектуру та ідею реалізації лише поточної версії, не плануючи наперед. От будуть нові завдання та кроки — тоді й проектуватимемо далі.

  • ❌ Іноді це може нашкодити проекту, особливо коли замість мікросервісів виходить моноліт, якого зовсім інші вимоги.
  • ✅ Зате поточна версія бадьора, весела та зроблена на актуальних технологіях.

34 of 77

Проста архітектура (simple design)

  • Будь-яка властивість системи має бути реалізована якомога простіше.

  • Програмісти в XP-команді працюють під гаслом: «Нічого зайвого!».

  • Приймається перше найпростіше працююче рішення, реалізується необхідний рівень функціональності на даний момент. Тим самим заощаджується час програміста.

35 of 77

Принципи простої архітектури

  • DRY – не допускайте дублювання коду чи відповідальності

  • KISS – реалізуйте функціональність найпростішим із доступних способів

  • YAGNI – не реалізуйте функціональності більше, ніж потрібно для поточної ітерації

36 of 77

DRY

  • Don’t Repeat Yourself «Кожна частина знання повинна мати єдине, несуперечливе та авторитетне уявлення в рамках системи».
  • Приклад коду на CSS без DRY:

  • Приклад коду CSS з DRY:

.block1 {color: #fff; padding: 15 px; margin: 15 px} �.block2 {color: #fff; padding: 15 px; margin: 15 px}

.block1, .block2 {color: #fff; padding: 15 px; margin: 15 px}

37 of 77

Scanner sc = new Scanner(System.in);�int shoot;�while (true) {� if (sc.hasNextInt()) {� shoot = sc.nextInt();� if (shoot < 0 || shoot > 9) {� System.out.println("Ви ввели неправильне число для пострілу.");� System.out.println("Введіть число від 0 до 9 для пострілу");� continue;� }� break;� } else {� String temp = sc.nextLine();� System.out.println("Ви ввели неправильне число для пострілу.");� System.out.println("Введіть число від 0 до 9 для пострілу");� }�}

Scanner sc = new Scanner(System.in);�int shoot;�while (true) {� System.out.println("Введіть число від 0 до 9 для пострілу");� if (sc.hasNextInt()) {� shoot = sc.nextInt();� if (shoot >= 0 && shoot <= 9) {� break;� }� } else {� sc.nextLine();� }� System.out.println("Ви ввели неправильне число для пострілу.");�}

38 of 77

WET

  • Порушення принципу DRY називають WET –
    1. "Write Everything Twice" (Пиши все двічі)
    2. або "We Enjoy Typing" (Нам подобається друкувати).

  • Це гра англійських слів «dry» (сухий) та «wet» (вологий).

39 of 77

KISS

  • "Keep It Simple, Stupid" (Роби простіше, тупиця) – принцип проектування, прийнятий у ВМС США в 1960 році.
  • У розробці ПЗ – принцип, що забороняє використання складніших коштів, ніж необхідно.
  • Ваші методи мають бути невеликими, що не перевищують 40-50 рядків.

  • Кожен метод має вирішувати лише одну проблему.

  • У вас у проекті багато умов? Переконайтеся, що ви розбили їх на дрібніші блоки коду.

40 of 77

Less is more

  • Чим гірше, тим краще – підхід до розробки програмного забезпечення, що оголошує простоту реалізації та простоту інтерфейсу важливішими, ніж будь-які інші властивості системи.

41 of 77

Закон Деметри

  • Закон Деметри намагається розділити обов'язки між класами та зменшити пов'язаність між ними.

    • Забезпечити незалежність програмних об'єктів друг від друга.

    • Зменшити спілкування чи зв'язок між різними класами.

    • Помістити пов'язані класи в той самий пакет, модуль або каталог для досягнення узгодженості.

  • Дотримання цієї ідеї дозволить вашому додатку бути зручнішим в обслуговуванні, зрозумілим і гнучким.

42 of 77

YAGNI

  • «You aren't gonna need it» (Вам це не знадобиться) — процес і принцип проектування ПЗ, при якому як основна мета та/або цінність декларується відмова від надмірної функціональності, тобто відмова додавання функціональності, в якій немає безпосередньої потреби.

43 of 77

Метафора системи

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

44 of 77

Колективне володіння кодом �(collective code ownership)

  • Звичайний підхід: код має автора, який відповідає за його правильну роботу.

  • Екстремальний підхід: кожен може зайти в будь-який фрагмент коду та поправити там будь-що, якщо вважає за потрібне. У результаті кожен може виправити чужу помилку будь-де.

  • ❌ Це часто призводить до суперечок, чий код кращий і навіщо хтось поліз покращувати те, що й так працювало.

45 of 77

Колективне володіння кодом �(collective code ownership)

  • Кожен програміст у колективі XP повинен мати доступ до коду будь-якої частини системи та вносити зміни до будь-якого коду.

  • Обов'язкове правило: якщо програміст вніс зміни та система після цього працює некоректно, то саме цей програміст повинен виправити помилки.

  • Інакше робота системи уподібниться до тотального хаосу.

46 of 77

Стандарти кодування �(coding conventions)

  • Звичайний підхід: команда вибирає єдиний стиль оформлення та написання коду.
  • Екстремальний підхід: за оформленням дивляться супердопитливо, намагаючись регламентувати та стандартизувати кожен чих, навіть якщо він не впливає на працездатність коду в цілому. Ідеально, коли, дивлячись на код, стає незрозуміло, хто його написав, — настільки він відповідає єдиним стандартам.

  • Гарна практика, якої часто не вистачає багатьом розробникам.
  • ❌ Але не підходить, коли потрібно отримати робочий код швидко. Зачісування дрібниць займає багато часу, але не впливає на працездатність лише на зручність підтримки.

47 of 77

Стандарти кодування �(coding conventions)

  • Стандарти кодування потрібні для забезпечення інших практик: колективного володіння кодом, парного програмування та рефакторингу.

  • Без єдиного стандарту виконувати ці практики як мінімум складніше, а насправді взагалі неможливо: група працюватиме в режимі постійної нестачі часу.
  • Детальні стандарти не потрібні, необхідно стандартизувати лише важливі речі.
  • Визначення найважливіших об'єктів стандартизації в XP суб'єктивно.

48 of 77

Стандарт оформлення коду

  • Стандарт оформлення коду (стандарт кодування, стиль програмування, coding standards, coding convention чи programming style ) - набір правил і угод, що використовуються при написанні вихідного коду деякою мовою програмування.

  • Найбільш відомі стандарти:
  • K&R
  • угорська нотація
  • стандарти кодування на C# від Microsoft
  • стандарти кодування на Java від Sun

49 of 77

Форматування програмного коду

  • Це дуже корисно: щоб вирівняти програмний код – виділіть його (наприклад, CTRL+A), потім CTRL+K, CTRL+F.

  • Редагування → Додатково → Форматувати виділений фрагмент / Форматувати документ.

if (<cond>) {

········<body>

}

if (<cond>)

{

········<body>

}

if (<cond>)

········{

········<body>

········}

if (<cond>)

··{

····<body>

··}

Стиль GNU

Стиль Уайтсмітс

Стиль Олмана

стиль за промовчанням пропонується у Microsoft Visual Studio

Стиль «K&R»

з книги Кернігана та Рітчі «Мова програмування Сі»

50 of 77

Стандарт оформлення коду. Загальне

  • Поза стандартом мається на увазі:
  • відсутність магічних чисел;

  1. обмеження розміру коду по горизонталі (щоб містився на екрані, зазвичай 80 чи 120 символів) і вертикалі (щоб весь код функції чи методу вміщувався розмір одного экрана).

const int VOTING_AGE = 18;

51 of 77

Стандарт оформлення коду. склад

  • Зазвичай стандарт оформлення коду описує:
  • способи вибору назв і регістр символів для імен змінних та інших ідентифікаторів:
  • запис типу змінної в її ідентифікаторі (угорська нотація) та
  • регістр символів (нижній, верхній, верблюжий, верблюжий з малої літери), використання знаків підкреслення для поділу слів;
  • стиль відступів при оформленні логічних блоків - чи використовуються символи табуляції, ширина відступу;
  • спосіб розміщення дужок , що обмежують логічні блоки;
  • використання прогалин при оформленні логічних та арифметичних виразів;
  • стиль коментарів та використання документуючих коментарів.

52 of 77

Пробіли та відступи

  • Відокремлюйте абзацами кожен оператор:

// Погана практика

int x = 3, y = 7; double z=4.25; x++;

if (a == b) { foo(); }

// Гарна практика

int x = 3;

int y = 7;

double z = 4.25;

x++;

if (a == b)

{

foo();

}

Гайд із оформлення коду на С++ від Стенфордського університету

53 of 77

Пробіли та відступи

  • Ставте пробіли між операторами та операндами:

  • Коли рядок стає довшим за 100 символів, розділіть його на кілька рядків:

int x = (a + b) * c / d + foo();

int result = reallyLongFunctionOne() +

reallyLongFunctionTwo() +

reallyLongFunctionThree() +

reallyLongFunctionFour();

54 of 77

Прогалини та відступи

  • Залишайте порожні лінії між функціями та між групами виразів:

  • Не повинно бути більше 9 рядків коду поспіль без вертикального відступу.

void foo()

{

...

}

// Порожня лінія

void bar()

{

...

}

55 of 77

Поради щодо стилю коду

56 of 77

C vs C++

  • Використовуйте C++ замість C, якщо це можливо:

// Погана практика: текстовий рядок у стилі Cі

char *str = "Hello there";

// Гарна практика: текстовий рядок у стилі C++

string str = "Hello there";

// Погана практика

printf( "Hello, world!\n" );

// Гарна практика

cout << "Hello, world!" << endl;

57 of 77

Правила іменування

  • Назвіть змінні та функції, використовуючи верблюжийРегістр.
  • Називайте класи Паскальним Реєстром,
  • Константи – у ВЕРХНЕМ_РЕЄСТРІ.

  • Ім'я змінної – іменник.

  • Ім'я функції – дієслово або починається з дієслова. Буває, що імена для стислості роблять іменниками, але дієслова зрозуміліші.

  • Для імен використовується англійська мова (не трансліт).
  • Давайте змінним описові імена, такі як firstName або homeworkScore. Уникайте однолітерних назв на зразок x або c, за винятком ітераторів на зразок i.

58 of 77

Коментарі

  • Головний коментар. Розміщуйте великий коментар, який описує призначення файлу, вгорі кожного файлу. Припустіть, що читач вашого коментаря є сучасним програмістом, але не кимось, хто вже бачив ваш код раніше.

  • Заголовок функції/конструктора. Розмістіть заголовковий коментар на кожному конструкторі та функції вашого файлу. Заголовок повинен описувати поведінку та/або мету функції.

  • Параметри/повернення. Якщо ваша функція приймає параметри, то коротко опишіть їхню мету та зміст. Якщо ваша функція повертає значення, коротко опишіть, що вона повертає.

59 of 77

Коментарі

  • Винятки. Якщо ваша функція навмисно видає якісь винятки для певних помилкових випадків, це вимагає згадки.

  • Коментарі на одному рядку. Якщо всередині функції є секція коду, яка є довгою, складною або незрозумілою, то коротко опишіть її призначення.

  • TODO. Слід видалити всі // TODO коментарі перед тим, як закінчувати та складати програму.

60 of 77

Ефективність

  • Викликаючи велику функцію та використовуючи результат кілька разів, збережіть результат у змінній замість того, щоб постійно викликати цю функцію:

// Погана практика

if (reallySlowSearchForIndex("abc") >= 0) {

remove(reallySlowSearchForIndex("abc"));

}

// Гарна практика

int index = reallySlowSearchForIndex("abc");

if (index >= 0) {

remove(index);

}

Коли використовуєте оператори управління на зразок if/else, for, while, завжди використовуйте {} і відповідні відступи, навіть якщо тіло всього оператора управління складається лише з одного рядка:

61 of 77

Ефективність if else

  • Уникайте зайвих тестів if:

// Погана практика

if (grade >= 90)

{

cout << "You got an A!" ;

}

if (grade >= 80 && grade < 90)

{

cout << "You got a B!" ;

}

if (grade >= 70 && grade < 80)

{

cout << "You got a C!" ;

}

// Гарна практика

if (grade >= 90)

{

cout << "You got an A!" ;

}

else if (grade >= 80)

{

cout << "You got a B!" ;

}

else if (grade >= 70)

{

cout << "You got a C!" ;

}

62 of 77

Перевірка значень

  • Ніколи не перевіряйте значення логічного типу, використовуючи == або != з true чи false:

// Погана практика

if (x == true) {

...

}

else if (x != true) {

...

}

// Гарна практика

if (x) {

...

}

else {

...

}

63 of 77

Рівні вкладеності

  • Рівень вкладеності має бути небагато.
  • Наприклад, перевірки в циклах можна робити через «continue», щоб не було додаткового рівня

for (var i = 0; i < 10; i++)

{

if (i підходить)

{

//<- рівень вкладеності 2

}

}

for (var i = 0; i < 10; i++)

{

if (i не підходить) continue;

// <- рівень вкладеності 1

}

64 of 77

Надмірність

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

// Погана практика

foo();

x = 10;

y++;

...

foo();

x = 15;

y++;

// Гарна практика

helper(10);

helper(15);

...

void helper(int newX) {

foo();

x = newX ;

y++;

}

65 of 77

Функції

  • Якщо потрібно повернути значення із функції, використовуйте значення return :

// Погана практика

void max( int a,

int b,

int &result)

{

if (a > b) result = a;

else result = b;

}

// Гарна практика

int max(int a, int b)

{

if (a > b) return a;

else return b;

}

66 of 77

Функції

  • Якщо у вас є вираз if/else, який повертає логічне значення, повертайте результати тесту безпосередньо:

// Погана практика

if (score1 == score2) {

return true;

}

else {

return false;

}

// Гарна практика

return score1 == score2;

67 of 77

Вказівник або посилання як аргумент функції

  • Відправляючи об'єкт у функцію як параметр, ви повинні передавати його за посиланням, оскільки якщо його буде передано як значення, то буде скопійовано весь об'єкт. Копіювання об'єктів потребує великих витрат пам'яті.
  • Використовуйте змінні посилання, а не вказівники. Однією з причин є те, що посилальні змінні, на відміну від покажчиків, не можуть набувати значення NULL:

// Погана практика

// Приймає покажчик

void process(BankAccount* account) {...}

// Гарна практика

// Приймає адресне посилання

void process(BankAccount& account) {...}

68 of 77

Константне посилання

  • Якщо ви передаєте об'єкт у функцію і код не змінить виду об'єкта – передайте його як const-посилання:

// Погана практика

// Приймає покажчик

void display(BankAccount account) {...}

// Гарна практика

// Приймає константне посилання

void display(const BankAccount& account) {...}

69 of 77

Класи

  • Інкапсуляція. Відокремлюйте ваші об'єкти, роблячи всі поля даних у вашому класі private:

class Student

{

private:

int homeworkScore;

...

70 of 77

40-годинний робочий тиждень

  • Звичайний підхід: у команді є якась домовленість про робочий час або кількість реалізованих ідей на тиждень. При цьому, якщо треба, можна трохи переробити чи залишитись на вихідні.

  • В екстремальному програмуванні примусово обмежують робочий час — 40 годин на тиждень або 8 годин з понеділка по п'ятницю. Не встиг — твої проблеми, треба вчитися встигати.

  • ✅ Ідея в тому, щоб не переробляти та був час на відпочинок.

Управлінська практика

71 of 77

40-годинний робочий тиждень

  • Програміст не повинен працювати більше 8 годин на день.

  • Необхідність понаднормової роботи (overtime) це чіткий індикатор проблеми на даному конкретному напрямку розробки; до того ж замовник не платить за понаднормову роботу у XP.

  • Пошук причин понаднормової роботи та їх якнайшвидше усунення — одне з основних правил.

Управлінська практика

72 of 77

Цінності XP

Сміливість

Комунікація

Простота

  • Робити тільки те, що потрібно сьогодні — без зайвих функцій “на майбутнє”.
  • Мінімальний, але достатній код для вирішення завдання.

Повага

Зворотний зв'язок

  • Члени команди поважають один одного, працюють на спільний результат.
  • Кожен вносить цінність, і кожна думка має вагу.
  • Успіх проєкту залежить від постійного, відкритого обміну інформацією між усіма членами команди.
  • Код пишеться зрозуміло, знання не концентруються у “героїв”, а розподіляються.
  • Постійна перевірка якості: тести, часті релізи, коментарі від замовника.
  • Прийняття рішень на основі результатів, а не припущень.
  • Відвага змінювати код, коли це потрібно.
  • Готовність визнати помилки, рефакторити, видаляти неактуальне.

73 of 77

План релізів

План ітерації

Приймальне тестування

Щоденна зустріч

Парне обговорення

Модульне тестування

Парне програмування

Код

Гілки планування та зворотнього зв’язку в екстремальному програмуванні

Повсякденне життя ХР команди

Місяці

Тижні

Дні

День

Години

Хвилини

Секунди

74 of 77

Цікаво, що хоча XP далеко не найпоширеніша методологія у чистому вигляді, її практики використовуються більшістю компаній, що працюють за гнучкими методологіями.

75 of 77

За 2016

76 of 77

Практики різних методологій

77 of 77

ВИДИ ЗАБЕЗПЕЧЕННЯ

    • складають документи, що характеризують склад, правила відбору та експлуатації засобів автоматизованого проектування.

Методичний

    • представлено сукупністю мов, які застосовуються для опису процедур автоматизованого проектування та проектних рішень. Основна частина лінгвістичного забезпечення – мови спілкування людини з ЕОМ.

Лінгвістичне

    • включає математичні моделі (ММ) проектованих об'єктів, методи та алгоритми проектних процедур, що використовуються при автоматизованому проектуванні.

Математичне

    • поєднує власне програми для систем обробки даних на машинних носіях та програмну документацію, необхідну для експлуатації програми.

Програмне

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

Технічне

    • об'єднує всілякі дані, необхідні виконання автоматизованого проектування.

Інформаційне

    • включає положення, інструкції, накази, штатні розписи, кваліфікаційні вимоги та інші документи, що регламентують організаційну структуру підрозділів проектної організації та їхню взаємодію з комплексом засобів автоматизованого проектування

Організаційне