Екстремальне програмування
к.т.н., доцент Каратанов Олександр Володимирович
Agile marketing statistics
Екстремальне програмування (англ. Extreme Programming, XP) − гнучка методологія розробки ПЗ в умовах неясних або швидко мінливих вимог для невеликих та середніх за розміром команд розробників.
Екстремальне програмування (англ. Extreme Programming, XP) − гнучка методологія розробки ПЗ в умовах неясних або швидко мінливих вимог для невеликих та середніх за розміром команд розробників.
Екстремальне програмування
Код-рев'ю
Парне програмування
Екстремум функції
Екстремальне програмування
Практики екстремального програмування
Рефакторинг
Гра в планування
Стандарт кодування
Замовник завжди поруч
Практики екстремального програмування
Розробка через тестування
Парне програмування
Безперервна інтеграція
Часті невеликі релізи
Метафора
Простий дизайн
Колективне володіння кодом
40-годинний робочий тиждень
Приймальне тестування
Управлінські та інженерні практики
Інженерні
Управлінські
Управлінські та інженерні практики
Інженерні (технічні) практики
Test-Driven Development (TDD)
Програмування парами (Pair Programming)
Безперервна інтеграція (Continuous Integration)
Простий дизайн (Simple Design)
Рефакторинг (Refactoring)
Колективна власність коду (Collective Code Ownership)
Стандарти кодування (Coding Standards)
Спрямовані на якість коду, тестованість і ефективність розробки:
Управлінські (організаційні) практики
Малі релізи (Small Releases)
Ітераційне планування (Iteration Planning)
Планування релізу (Release Planning)
Замовник на місці (On-Site Customer)
Клієнтські тести (Customer Tests / Acceptance Tests)
Сталий темп (Sustainable Pace / 40-Hour Week)
Спайки (Architectural Spike)
Спрямовані на управління командою, взаємодію із замовником та керування планами:
Розробка через тестування �(test-driven development)
Розробка через тестування �(test-driven development)
Розробка через тестування �(test-driven development)
Acceptance Testing — тестування прийнятності
🧪 Приклад Acceptance Test
User Story:�"Як покупець, я хочу мати змогу додати товар у кошик, щоб згодом його придбати."
Acceptance Criteria:
Feature: Додавання товару у кошик
Scenario: Додавання одного товару
Given я знаходжусь на сторінці товару
When я натискаю "Додати в кошик"
Then товар має з’явитись у кошику
And кількість товарів у кошику дорівнює 1
Acceptance Test (написаний мовою Gherkin)
Планування процесу (planning game)
Управлінська практика
Планування процесу (planning game)
Управлінська практика
Spike
Навіщо потрібен Spike?
Формат 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 |
Тісна взаємодія із замовником �(feed-back, on-site customer)
Управлінська практика
Тісна взаємодія із замовником �(feed-back, on-site customer)
Управлінська практика
Парне програмування �(pair programming)
Ролі програмістів
Як це виглядає насправді
Штурман
Драйвер
Що ти, чорт забирай, таке пишеш?
мейн пишеться через 'е' чи 'а'?
Види парного програмування
Безперервна інтеграція �та часті релізи
Безперервна інтеграція �(continuous integration)
Часті релізи (small releases)
Часті релізи (small releases)
Рефакторинг (refactoring)
Рефакторинг (refactoring)
Проста архітектура (simple design)
Проста архітектура (simple design)
Принципи простої архітектури
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}
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("Ви ввели неправильне число для пострілу.");�}
WET
KISS
Less is more
Закон Деметри
YAGNI
Метафора системи
Колективне володіння кодом �(collective code ownership)
Колективне володіння кодом �(collective code ownership)
Стандарти кодування �(coding conventions)
Стандарти кодування �(coding conventions)
Стандарт оформлення коду
Форматування програмного коду
if (<cond>) {
········<body>
}
if (<cond>)
{
········<body>
}
if (<cond>)
········{
········<body>
········}
if (<cond>)
··{
····<body>
··}
Стиль GNU
Стиль Уайтсмітс
Стиль Олмана
стиль за промовчанням пропонується у Microsoft Visual Studio
Стиль «K&R»
з книги Кернігана та Рітчі «Мова програмування Сі»
Стандарт оформлення коду. Загальне
const int VOTING_AGE = 18;
Стандарт оформлення коду. склад
Пробіли та відступи
// Погана практика
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();
}
Гайд із оформлення коду на С++ від Стенфордського університету
Пробіли та відступи
int x = (a + b) * c / d + foo();
int result = reallyLongFunctionOne() +
reallyLongFunctionTwo() +
reallyLongFunctionThree() +
reallyLongFunctionFour();
Прогалини та відступи
void foo()
{
...
}
// Порожня лінія
void bar()
{
...
}
Поради щодо стилю коду
C vs C++
// Погана практика: текстовий рядок у стилі Cі
char *str = "Hello there";
// Гарна практика: текстовий рядок у стилі C++
string str = "Hello there";
// Погана практика
printf( "Hello, world!\n" );
// Гарна практика
cout << "Hello, world!" << endl;
Правила іменування
Коментарі
Коментарі
Ефективність
// Погана практика
if (reallySlowSearchForIndex("abc") >= 0) {
remove(reallySlowSearchForIndex("abc"));
}
// Гарна практика
int index = reallySlowSearchForIndex("abc");
if (index >= 0) {
remove(index);
}
Коли використовуєте оператори управління на зразок if/else, for, while, завжди використовуйте {} і відповідні відступи, навіть якщо тіло всього оператора управління складається лише з одного рядка:
Ефективність if else
// Погана практика
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!" ;
}
Перевірка значень
// Погана практика
if (x == true) {
...
}
else if (x != true) {
...
}
// Гарна практика
if (x) {
...
}
else {
...
}
Рівні вкладеності
for (var i = 0; i < 10; i++)
{
if (i підходить)
{
//<- рівень вкладеності 2
}
}
for (var i = 0; i < 10; i++)
{
if (i не підходить) continue;
// <- рівень вкладеності 1
}
Надмірність
// Погана практика
foo();
x = 10;
y++;
...
foo();
x = 15;
y++;
// Гарна практика
helper(10);
helper(15);
...
void helper(int newX) {
foo();
x = newX ;
y++;
}
Функції
// Погана практика
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;
}
Функції
// Погана практика
if (score1 == score2) {
return true;
}
else {
return false;
}
// Гарна практика
return score1 == score2;
Вказівник або посилання як аргумент функції
// Погана практика
// Приймає покажчик
void process(BankAccount* account) {...}
// Гарна практика
// Приймає адресне посилання
void process(BankAccount& account) {...}
Константне посилання
// Погана практика
// Приймає покажчик
void display(BankAccount account) {...}
// Гарна практика
// Приймає константне посилання
void display(const BankAccount& account) {...}
Класи
class Student
{
private:
int homeworkScore;
...
40-годинний робочий тиждень
Управлінська практика
40-годинний робочий тиждень
Управлінська практика
Цінності XP
Сміливість
Комунікація
Простота
Повага
Зворотний зв'язок
План релізів
План ітерації
Приймальне тестування
Щоденна зустріч
Парне обговорення
Модульне тестування
Парне програмування
Код
Гілки планування та зворотнього зв’язку в екстремальному програмуванні
Повсякденне життя ХР команди
Місяці
Тижні
Дні
День
Години
Хвилини
Секунди
Цікаво, що хоча XP далеко не найпоширеніша методологія у чистому вигляді, її практики використовуються більшістю компаній, що працюють за гнучкими методологіями.
За 2016
Практики різних методологій
ВИДИ ЗАБЕЗПЕЧЕННЯ
Методичний
Лінгвістичне
Математичне
Програмне
Технічне
Інформаційне
Організаційне