Що ви робите, якщо досягнете дизайнерського тупику в таких еволюційних методах, як Agile або XP?


11

Коли я читав відомий пост блогу Мартіна Фаулера Is Design Dead? Одне з найяскравіших вражень, яке я маю, полягає в тому, що, враховуючи той факт, що в Agile Методології та Екстремальному програмуванні дизайн та програмування еволюціонують, завжди є моменти, коли все потребує відновлення.

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

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

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

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

Відповіді:


17

Я щойно прочитав посилання на статтю, яку ви опублікували, я мушу сказати, що Фаулер зробив деякі дуже хороші моменти, і багато чого, що він сказав, я виступав з нашою командою роками.

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

Оскільки я родом з OO land, для мене кожен блок є класом, а площа поверхні цього блоку - це публічний інтерфейс (те, що видно зовнішніми або похідними класами). Якщо ви будете дотримуватися хороших принципів SOLID, ви переконаєтесь, що кожен блок є надзвичайно простим і має інтуїтивно зрозумілий інтерфейс. Повертаючись до моєї аналогії, ви хочете переконатися, що код створює лише прості форми. Кожного разу, коли ви створюєте занадто складні класи (багато функцій, багато змінних), ви створюєте фігури, які важко повторно використовувати, коли вимоги змінюються.

Я погоджуюся з Фаулером у тому, що найбільший ризик / виклик для еволюційного дизайну полягає в тому, що ви залишаєте дизайнерські рішення на час кодування, і ви очікуєте, що кожен окремий розробник прийме ці рішення. Тут система може вийти з ладу, якщо у вас немає належних механізмів зворотного зв’язку. Кожного разу, коли вимагається нова функція, надзвичайно спокусливо просто знайти функцію, яку потрібно розширити, помістити в неї якийсь умовний характер і просто додати цілу купу коду прямо у цю функцію. Іноді це може бути все, що потрібно, але це також (IMO) єдина найпоширеніша практика, яка призводить до тупикових компонентів. Це не має нічого спільного з еволюційним дизайном. Це те, що називається "без дизайну".

Поки ви знайдете час, щоб відступити назад і сказати, почекайте хвилину, цей клас вже має 15 змінних членів, дозвольте мені витягнути 6 з них і помістити їх у власний автономний клас, ваше програмне забезпечення буде складатися з дуже легкого - вагові, гнучкі та багаторазові будівельні блоки. Впевнені, що якщо прем'єр-міністри зійдуть і змінять половину вимог до вас, можливо, доведеться вийняти кілька своїх блоків, покласти їх назад на полицю і скласти нові (так само, як при будівництві замку, ви можете використовувати не всі ваші циліндри). Але на той момент це лише частина ведення бізнесу. Вимоги змінилися, і зберігаючи свій код гнучким та модульним, ви зможете змінити свій продукт, щоб він відповідав вашому новому напрямку бізнесу.

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

Я лише намагаюся сказати, що вважаю себе відносно пристойним у розробці програмного забезпечення. У той же час, якщо ви попросили мене написати документ на 100 сторінок, дати його кодеру і очікувати, що він спрацює, я, ймовірно, не міг створити себе з паперового пакета. Починаючи роботу, я іноді малював би декілька UML-подібних (дуже спрощених, не повних мов) діаграм, але, коли я починаю кодувати, я б переробляв за необхідності, і мій кінцевий код ніколи не буде схожий на те, що я спочатку намалював. Навіть якщо я витрачаю місяць-два на роздуми над кожною дрібницею, я не можу уявити, як хтось інший зможе взяти мої діаграми та придумати суцільний програмний продукт, не змінюючи дизайн, який вони кодують.

На іншому кінці спектру, в даний час у моїй команді (зараз спритна, і я це повністю підтримую) у нас є пару хлопців, які приєдналися до нас із вбудованої землі, де вони робили лише C протягом останніх 15 років. Я, очевидно, допоміг з початковим плануванням та складанням занять, але я також переконався, що слідкуйте за регулярними оглядами коду та сеансами мозкового штурму, де ми обговорюємо застосування програм SOLID та принципи проектування. Вони створили код спагетті, який трохи змусив мене, але, лише злегка відштовхнувшись від мене, вони почали переробляти те, що вже було вироблено. сказати це, але після переміщення цього коду це виглядає набагато зрозуміліше і зрозуміліше. Тупик відвернутий. Точка I ' Я намагаюся зробити те, що навіть той, хто є абсолютно новим для OO, може створити дещо пристойний код, якщо він має наставника з більшим досвідом, щоб нагадати йому, що "еволюційний дизайн" - це не те саме, що "no design". І навіть деякі його "складніші" класи не такі страшні, тому що кожен клас не має такої великої відповідальності (тобто не так багато коду), так що найгірше стає гірше, якщо цей клас "тупикові", ми патронник і записувати клас заміни, який має той самий публічний інтерфейс (поки що я ніколи не бачив необхідності в цій надзвичайній ситуації ні в чому, про що ми писали, і я робив огляд коду двічі на тиждень).

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

Данг, я багато писав. Вибач за те.


1
+1 Це було варте кожного слова. Я зіткнувся з цими ситуаціями, як ви описали, і після того, як буде встановлений термін, попросіть їх очистити (прочитати рефактор) більше від того, що, на мою думку, є здоровим дизайном. Але часто люди повторюють одне і те ж питання - Чому я знову роблю те саме? Я думаю, зараз у мене є відповідь - якщо вам потрібен швидший час на ринок, і дозволити дизайну розвиватися, рефакторинг - це не компенсація за ваші старі гріхи, а насправді законна річ.
Діпан Мехта

Так, ви багато писали, але це було добре. Дійсно насолоджувався його читанням :).
Раду Мурзеа

11

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

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

Зворотний бік полягає в тому, що навіть при спритних методах важливо мати життєздатне бачення дизайну системи, яке приводить рішення від ітерації до ітерації. Я думаю, що Кен Швабер сказав щось подібне, якщо у вас є команда жахливих розробників, вони створюватимуть погану програму послідовно ітерацією шляхом ітерації. Agile просто означає, що не витрачайте багато часу наперед, тому що ви обмежені в тому, що можете навчитися чи уявити, перш ніж почати впроваджувати ( і вимоги також змінюються). Однак є деякі ситуації, коли вам доведеться виконувати попередню роботу (наприклад, дослідження), і тоді ви повинні це зробити.

Як уникнути тупиків?

Я б сказав, головним чином, передбачаючи майбутні вимоги. Це щось, що ви отримуєте з досвідом та знайомством з подібними проектами / продуктами. Частково це передбачення допомагає вам поставити хороший дизайн, оскільки ви задаєте собі багато питань "що якщо" щодо вашої поточної системи. Для мене це критична складова. Такі методи як ОО просто допомагають вам, коли ви вже знаєте, що робите.

Що ви робите, якщо у вас тупик?

А «тупиковий» не відрізняється від будь-якого іншого технічного блоку , який ви будете вдарив під час розробки чого - або , що є новим. Перше, що потрібно усвідомити, це те, що насправді немає справжніх «тупиків», які змушують вас повністю відступити. Принаймні, ваше навчання до цього моменту - це те, що дає змогу йти вперед, щоб зусилля не були витрачені даремно. Коли ви потрапили в тупик, у вас є проблеми . Проблема полягає в тому, що потрібно змінити, щоб виконати якусь нову (або стару) вимогу та як оптимізувати внесення цих змін. Все, що вам потрібно зробити зараз, це вирішити цю проблему. Будьте вдячні, що це програмне забезпечення, а не, наприклад, конструкція літака, оскільки змінити набагато простіше. Визначте проблеми, виправте їх == refactor == інженерія програмного забезпечення. Іноді задіяно багато роботи ...

Якщо ви використовуєте Scrum, ця зміна, природно, повинна бути пов'язана з історіями користувачів (що користувач отримує від цієї зміни?) Процес розпочнеться з однієї історії, яку неможливо легко прийняти за сучасним дизайном (ой), і з власником продукту відбудеться дискусія про те, як зламати цю історію. Ви продовжуєте застосовувати гнучкі принципи завдяки цій зміні.

Кілька відомих великих вимог із світу ОС, які мені спадають на думку:

Як би ви не дивилися на них, вони багато працюють. Оригінальний дизайн майже напевно не враховував можливості цього (тобто розсипчастість не була великою вимогою). Чи дизайн був OO чи ні, ймовірно, теж не величезний фактор. У гарному дизайні певні частини платформи будуть дещо ізольованими, а робота буде легшою.


Насправді ранні версії Windows NT реалізували "Екстрактивний апаратний шар" та підтримували DEC Apha, а також x86. Оскільки ніхто ніколи не купував DEC-машини на основі альфа, це було тихо відпало. Я б міг уявити, що ця "машинна незалежність" все ще існує у непередбаченому форматі в поточному випуску, тому порт ARM може бути не таким складним.
Джеймс Андерсон

3

Я рефакторирую свої проекти постійно, а також використовую діаграми класів UML. Я маю на увазі, що я створюю одну або кілька діаграм класів за пакетами. Кожна діаграма зберігається в корені пакета. Кожен класифікатор UML має власний ідентифікатор, який відображається на відповідний Java Id. Це означає, що коли я відкриваю свою діаграму, вона автоматично оновлюється до останніх змін рефакторингу коду. Я також можу безпосередньо змінити свої діаграми класів на графічному рівні, і весь мій проект негайно відновлений. Він працює досить добре, але ніколи не замінить людський. Моя діаграма класів UML - це лише графічний вигляд мого коду. Дуже важливо не змішувати код і модель, як це робиться затемнення ЕМП, оскільки, як тільки проводиться рефакторинг, інформація про модель також втрачається. Я ніколи не використовую генератор моделей керованого коду розвитку, оскільки це марно. Я не '

Сказавши, що мати понад 100 діаграм класів, які представляють усі деталі моєї структури проекту та повних приміток скрізь, справді корисно. Я створюю лише діаграми класів для проектів, тому що зазвичай розробники не встигають вивчити або використовувати інші діаграми. Діаграми класів також такі гарні, оскільки автоматично оновлюються. Діаграми класів можна створити після коду, просто перевернувши пакет і додавши примітки. Це швидко і завжди точно і на 100% ітеративне.

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

Вибачте, що так довго, але я думаю, що ми повинні дати другий шанс діаграм класів UML, якщо вони використовуються лише як графічний вигляд нашого проекту. Це означає, що UML охоплює повний проект і має єдину модель, складену великими діаграмами класів, що представляють повний проект. Було б смішно мати сотні маленьких переглядів і модель для кожного перегляду в рамках проекту, що має сотні переглядів :-)


1
+1, щоб показати ідею поштового коду UML! Цікаво, що ми ніколи не повертаємось до діаграмних документів після коду!
Діпан Мехта

Так, саме в цьому полягає проблема розвитку моделей, пов'язаних з UML. Ви генеруєте документацію, а потім ніколи не використовуєте її при будь-якій модифікації проекту. Злиття моделі та коду дозволяє нам використовувати UML та змінювати її стільки разів, скільки нам потрібно.
UML_GURU

3

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

Я підходив до кожного випадку так само, що, здавалося, працює добре:

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

Витрати:

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

Переваги:

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

2

Приблизно місяць-два тому наш поточний проект трохи застряг через деякі погані дизайнерські рішення (і відсутність багато дизайну в одному місці), зі стилем розробки SCRUM.

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

Зараз ми минули через це перешкоду і знову додавали нові функції.


Це ще одне велике тертя, яке потрібно знайти. Слід сказати замовнику - що ми зараз будуємо те саме - про функції, які не є новим, після передачі першої версії! Як часто і часто (якщо і колись) ви можете дозволити собі розповісти це замовнику? чи як ви навіть пояснюєте?
Діпан Мехта

У вас є два основні варіанти, або спочатку ви просто скажете просту правду - що хоч те, що у вас є, безладдя, і його потрібно прибирати, щоб рухатись вперед або друге, ви говорите, що ви будуєте інфраструктуру для підтримки постійного розвитку ( що не менш вірно, але крутиться так, щоб бути трохи більш позитивним). Ви можете переконати обидва ці речі, сказавши, що для забезпечення функціональності ми взяли на себе технічну заборгованість, яку зараз потрібно погасити.
Мерф

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

@DipanMehta Нам також пощастило, що замовники не обов’язково знають про цей проект. Це оновлення до продукту, яким вони зараз користуються, із напівточним терміном завершення приблизно до кінця цього року. Тож їм навіть не потрібно знати про затримку рефакторингу;) (Менеджер, що займається більшістю дизайнерських рішень, є власним)
Izkata

2

Ключовим фактором для обмеження витрат на зміну дизайну є збереження коду максимально СУХОМО. Це приведе більшість коду програми на дуже високий рівень, де більша частина коду безпосередньо виражає наміри, а порівняно мало задає механізм. Якщо ви це зробите, то дизайнерські рішення матимуть найменший вираз у коді, а зміни дизайну матимуть найменші можливі витрати.


2

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

Як приклад, у Netflix є функція профілю, де різні члени сім'ї можуть виставляти рахунки в один і той же план, але мають окремі черги. Кілька років тому вони оголосили, що доведеться скасувати цю функцію, тому що лише десь 10% користувачів користувалися нею, але через зламану реалізацію вона з'їла непомірний обсяг робіт з обслуговування. Після заворушення вони кусали кулю і зробили дорогий переробку, щоб утримати цих клієнтів.

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


1

Хіба не Фред Брукс сказав щось на кшталт "Плануйте викинути першого"? Не відчувайте себе занадто похмурими, тупикові конструкції також спливають у проектах, які намагаються зробити також усі проекти. Перепроекти трапляються у всіх типах розробок, чи то тому, що це було непрацездатним дизайном з самого початку (останні 20%, які осяяні більше - "чорт у деталях") або тому, що клієнт змінює свою увагу. Немає реальної потреби у дзвіночках тривоги, не варто занадто хвилюватися.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.