Як дізнатися правильний підхід до реалізації половини функції? [зачинено]


12

Я очолюю команду розробників і хочу випустити наш продукт якомога частіше (безперервна доставка).

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

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

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

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

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

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


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


1
Різні типи автоматизованого тестування можуть зменшити ризик помилок у зміні коду. Перевірити. Я шукаю підхід використовувати як розробник, який повинен реалізувати велику функцію, яка може включати 75% змін у існуючому коді та 26% нового коду (додаткові відсотки є для додаткової таємниці).
Нільс Брінч

1
@Niels: Ви повинні мати дивовижних розробників, щоб вони могли мати робочий код в кінці кожного дня, який можна перевірити в основній гілці та пройти всі тести. Або це, або вони роблять лише мінімум голих кісток, щоб вони могли перевірити свій код до кінця дня.
Данк

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

Відповіді:


14

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

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

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

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

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

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


Мені б дуже цікаво дізнатися більше про стратегію розгалуження, про яку ви посилаєтесь. Чи є у вас посилання на статтю чи щось інше, що більш поглиблено пояснює концепцію, про яку ви посилаєтесь?
Нільс Брінч


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

6

Тут є дві проблеми: одна реалізує половину функції; інший - підтримувати роботу транспортного товару під час постійної розробки.

Реалізація половини функції

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

Тестування може включати макетні версії коду для інших частин функції; це допомагає згладити перехід, коли ви переходите до реалізації другої половини.

Продовження роботи товару для доставки

Тут є кілька варіантів:

  1. Вимкніть функцію "вимкнено" у постачаному продукті. Тільки тому, що код є у продукті, це не означає, що він повинен бути виконаний або представлений користувачам. Мінус полягає в тому, що ви не будете надавати додаткову цінність своїм користувачам, і не отримаєте зворотного зв'язку.
  2. Розкрийте для користувачів краю функції. Покажіть, що у вас є, і вкажіть, що має бути.
  3. Дозвольте користувачам перемикатися між новими та старими функціоналами. Для цього іноді потрібно підтримувати два кодові контури, готові кінцевому користувачеві.

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


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

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

Але чи може відповідь на моє запитання просто "виконувати хорошу практику роботи з кодом та робити одиничні тести" тощо ...?
Нільс Брінч

1

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

Навчаючи їх. (да)

Навчання передбачає ітерацію: спробувати щось, побачити, як це працює, а потім змінити свій підхід для досягнення кращих результатів. Для подібних речей я б виступав за огляд дизайну / коду. Ви можете побачити, як розроблена / впроваджена напівфункція та маєте можливість надати відгуки. "Це і те не буде працювати, оскільки вони порушать наш CI; як щодо XYZ?", "Хороша робота тут, це справді чисто".

Виконання оглядів як команда допоможе кожному засвоїти те, що ви вже інтуїтивно знаєте.


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

1

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

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

Фактично цей підхід до конфігурації описується Мартіном Фаулером як Feature Toggle.

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


Мені здається, що привласнення всього коду до однієї гілки та весь час розгортання мого коду є частиною гарної стратегії постійної інтеграції?
Нільс Брінч

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

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

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