Як отримати гарний дизайн при використанні спритних методів?


15

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

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

Проблема: Складність отримати хороший дизайн

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

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

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

Питання : Хто-небудь мав подібний досвід? Я застосовую SCRUM неправильно або на що слід звернути увагу, якщо я хочу розвиватися невеликими кроками і все-таки закінчуватись добре розробленою програмою? Або я повинен запланувати історію користувача дизайну, перш ніж розпочати фактичне кодування? Чи вважається це гарною практикою, принаймні для особливостей, які складніші за середні?

Редагувати - ПРИМІТКА

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

Наприклад, я не переймаюся хорошим дизайном, якщо мені доведеться реалізувати простий компонент, який (1) повинен бути готовий якнайшвидше, (2) буде використовуватися лише один раз, (3) використовується іншими частинами системи (YAGNI).

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


5
The only well-designed module I could produce recently I obtained by taking a different approach- Ви відповіли на власне запитання. Вам все одно потрібна якась передня конструкція; не можна сподіватися, що хороший дизайн просто органічно виросте від рефакторингу. Це не працює так.
Роберт Харві

1
Ні. Тому що, можливо, я не застосовую SCRUM правильно.
Джорджіо

3
Немає такого поняття, як "SCRUM правильно". Є лише той процес, який дає бажаний результат.
Роберт Харві

1
Ось чому їх називають "керівництвом" :) У будь-якому разі, здійснювати щодня, мати короткі (1 тиждень - 1 місяць) спринти, такі правила взагалі не говорять про розробку. Ви все одно маєте дизайн.
Роберт Харві

Відповіді:


13

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

Тоді не робіть цього.

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

У більш загальному випадку, я бачив, що я зробив 3 речі для отримання гарного дизайну в Agile:

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

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

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


3
+1 (+10, якщо у мене було більше одного голосу!) За "Примушування їх до цього поля спричинить лише неполадки".
Джорджіо

17

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

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


+1: Гаразд. Тому я повинен запланувати історію рефакторингу, коли я думаю, що в цьому є потреба, і не додавати нових функцій, поки я знову не матиму достатньо гарного дизайну. Це, мабуть, те, чого нам не вистачає в нашому процесі (крім того, що, ІМО, прирости, які ми розробляємо, часто занадто малі).
Джорджіо

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

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

4
"Історія рефакторингу" або "історія технічного боргу" не повинна відбуватися. Ніколи. Вартість рефакторингу є частиною розробки і не повинна бути окремим завданням. Це слід робити безперервно невеликими кроками, а не спланованими, після факту, історіями. Я це знаю, наша команда спробувала історії рефакторингу, це погано. Коли ви почнете рефакторинг "на ходу", ви побачите, що рефакторинг стає частиною вашого кодування, а не окремим завданням.
Паткос Чаба

1
Якщо ви вважаєте, що кодова база не зможе зручно обробляти історію X без значної реструктуризації / переписування, то ця реструктуризація повинна бути частиною історії X, і робота, необхідна для цієї реструктуризації, повинна враховуватися при оцінці історії X.
Бух

6

"Добре продуманий" є суб'єктивним

Що для вас означає "добре розроблений" ? власнику продукту? замовнику?

Чи "добре розроблена " мета власника продукту? мета замовника? чи просто Ти?

Це те, що ви вважаєте "недостатньо добре розробленим", все ще відповідає очікуванням Власників продукції та робить клієнта задоволеним? Тоді це досить "добре розроблено" .

Хороший Досить і ЯГНІ

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

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

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

СКРУМ

Agile Методологія, яку можна записати, не є Agile Methodology. "- Джаррод Роберсон

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

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

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

Взагалі

Загалом "добре спроектована" система є достатньою і слідкує за YAGNI.

Agile та SCRUM, зокрема, як реалізація Agile, докладніше розглядають питання про те, як зробити продукт максимально прозорим для Власника продукту / Спонсорів.

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


2
Чи "добре розроблена" мета власника товару: Не пряма мета. Побічно, так: добре розроблені засоби простіше налагоджувати та підтримувати. Мені довелося витрачати тижні на пошук критичних помилок (які розбивали додаток) у брудному, погано розробленому коді.
Джорджіо

3
Яка гнітюча відповідь. Це в основному гарантує посереднє програмне забезпечення, що охоплює планету, як сірий гуг.
Роберт Харві

@ Джорджо це не мета, це неявне очікування.

@RobertHarvey Я знаю, що ти бачив відео "Великий бал бруду" і читав "Паперу". Це справжнє життя, зокрема SCRUM - це визнання BBOM і його застосовує в методології, приймаючи ентропію як частину процесу та керуючи нею, намагаючись документувати її (технічний дебют) і сповільнювати її (рефакторинг). Так, слід починати якнайдалі від загальної BBOM / ентропії, але в реальному житті це не завжди так.

1
Гаразд, але ви не можете з'їсти "мається на увазі очікування". Це просто махання руками. "Це буде добре архітектурно, бо я професіонал і знаю, що роблю". (використовуючи мій найкращий голос Білла Мюррея) Так, правильно.
Роберт Харві

3

Ми працюємо з Scrum вже кілька місяців, і я хочу поділитися своїм досвідом щодо вашої проблеми.

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

Я розробив весь робочий процес, а потім структуру та класи БД.

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

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


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

1

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

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

Чому хтось із історією успішних проектів з падіння води перейшов на спритну методологію?


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

0

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


Чи є гарною практикою планувати історію користувача дизайну ?
Джорджіо

@Giorgio: Це, мабуть, непотрібно, але власник продукту повинен хоча б дати команді огляд очікувань замовника від проекту до початку проекту та пояснення того, як він був розбитий, як це було.
Джеймс

1
Якщо хтось зголосився, будь ласка, вкажіть причину
Джеймс

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