Це питання дійсно містить два питання, які потрібно вирішити окремо:
Чому деякі команди мають суворий процес розробки?
Проста відповідь полягає в тому, що якщо цього не відбувається, трапляються помилки. Дорогі помилки. Це стосується розробок, і це стосується також і решти ІТ-галузі (системних адміністраторів, DBA тощо).
Для багатьох розробників та ІТ-працівників це дуже важко зрозуміти, тому що більшість із нас коли-небудь працювали в одній з «крайнощів» - чи великих, фірм у стилі «Фортуна», що мають принаймні десяток розробників і суворі процеси, які слід виконувати, або невеликі мікро-ISV або навіть позаштатні роботи, де люди просто не викручуються погано, або вартість викрутки низька.
Але якщо ви коли-небудь бачили компанію між цими фазами - навіть компанію з яскравим талановитим ІТ-персоналом, - ви зрозумієте, яка небезпека не мати процесу або мати процес напівзростання. Розумієте, спілкування між персоналом страждає від проблеми комбінаторного вибуху ; як тільки ви досягнете рівня близько 6-10 розробників в одній команді, основною причиною основних або критичних дефектів є не дефіцит таланту чи ноу-хау, а швидше відсутність спілкування.
Аліса запитує вранці в понеділок і вирішує, що це добре робити реконструктивну операцію в багажнику, тому що ніхто інший не працює над цією частиною. Боб приїжджає через годину, повернувшись зі своєї відпустки і сповнений енергії, і вирішує, що збирається реалізувати нову головну особливість саме в цій самій області, і навіщо турбуватися з гілкою, оскільки ніхто ніколи не торкається цього коду? Тож Аліса розплачується тим "технічним боргом", Боб реалізує свою вбивчу функцію, яка працює на задніх пальниках 6 місяців, і коли вони нарешті перевіряють свій код (звичайно перед тим, як закрити час у п’ятницю, звичайно!), Весь Команда повинна залишитися позаду і спробувати пережити кошмарне пекло конфліктів, які продовжують жити як помилки та регресії протягом наступних двох тижнів.
Аліса та Боб обидва чудово справились із завданнями кодування, але вони обоє почали з поганого рішення ("що найгіршого, що може статися?"). Керівник команди або керівник проекту переносить їх через смерть і забиває контрольний список, щоб запобігти цьому повторення:
- Заходи повинні бути щоденними, щоб мінімізувати вплив конфліктів;
- Зміни, які займуть значно більше 1 дня, повинні здійснюватися на гілках;
- Усі важливі завдання (включаючи нефункціональні роботи, такі як рефакторинг) повинні бути належним чином відстежені та призначені у трекері помилок.
Б'юсь об заклад, що багатьом із нас цей "процес" просто здається здоровим глуздом. Це стара шапка. Але чи знали ви, що багато менших команд цього не роблять? Команда з двома людьми може взагалі не заважати контролю над джерелами. Кого хвилює? Це, чесно кажучи, не потрібно. Проблеми починають виникати лише тоді, коли команда зростає, але процес цього не відбувається.
Звичайно, оптимізація процесів схожа на оптимізацію продуктивності; випливає зворотна експоненціальна крива. Контрольний список, наведений вище, може усунути 80% дефектів, але після його втілення ви виявите, що на якісь інші речі припадає решта 80% дефектів. У нашому вигаданому, але знайомому прикладі це можуть бути помилки збирання через наявність різних середовищ збирання, що, в свою чергу, пояснюється тим, що немає стандартного обладнання та розробники використовують бібліотеки з відкритим кодом, які оновлюються кожні 2 тижні.
Отже, у вас є три варіанти: або (а) стандартизуйте обладнання та суворо обмежте використання сторонніх бібліотек, що коштує дорого і може значно зашкодити продуктивності, або (b) налаштувати сервер збірки, який вимагає співпраці групи sysadmin та штатний розробник, щоб підтримувати його, або (в) дозволити розробникам робити це самостійно, розповсюджуючи стандартну віртуальну машину і повідомляючи розробникам будувати на цьому. Очевидно, що (б) є найкращим довгостроковим рішенням, але (в) має кращий короткостроковий баланс надійності та доцільності.
Цикл продовжується і продовжується. Кожна «політика», яку ви бачите, як правило, була створена для вирішення реальної проблеми. Як Йоел Спольський писав ще в 2000 році (на зовсім іншу тему ви пам’ятаєте, але все-таки актуальною):
Коли ви заходите в ресторан і бачите табличку, на якій написано "Не дозволено собак", ви можете подумати, що цей знак є суто привабливим: містер Ресторан не любить собак навколо, тому, коли він побудував ресторан, він поставив цей знак.
Якби це було все, що відбувалося, також був би знак "Без змій"; зрештою, змій ніхто не любить. І знак "Без слонів", бо вони розбивають стільці, коли сідають.
Реальна причина того, що знак є історичні: це історичний маркер , який вказує на те, що люди використовували , щоб спробувати привести їх собак в ресторані.
Це так само в більшості (я не скажу всіх) програмних команд: Політика на зразок "Вам потрібно додати тестовий випадок для кожного виправлення помилок" майже незмінно вказує на те, що в команди історично виникли проблеми з регресіями. Регресії - ще одна з тих проблем, які найчастіше зумовлені розривом спілкування, а не некомпетентністю. Поки ви розумієте політику, ви, можливо, зможете скористатися законними ярликами (наприклад, мені довелося виправити 6 невеликих помилок, але всі вони були в одній і тій же функції, тому я можу фактично просто написати один тестовий випадок для всіх 9 з них).
Це пояснює, чому процеси відбуваються, але це не вся історія. Інша половина:
Чому процес так важко слідкувати?
Насправді на простіше відповісти на це питання: це тому, що команда (або її керівництво) зосереджена на повторюваних результатах та мінімізації дефектів (як вище), але не приділяла достатньої уваги оптимізації та автоматизації цього процесу.
Наприклад, в оригінальному запитанні я бачу кілька проблем:
Система контролю ревізії (CVS) застаріла за сьогоднішніми стандартами. Для нових проектів його майже повністю витіснив підрив (SVN), який сам по собі швидко затьмарюється розподіленими системами, такими як Mercurial (Hg). Перехід на Hg зробить розгалуження та злиття набагато простішим, і навіть у моєму гіпотетичному прикладі вище, щоденна потреба у виконанні стане набагато менш болісною. Код навіть не потрібно компілювати, оскільки сховище локальне; - насправді розробники лазерів могли навіть автоматизувати цей крок, якщо хотіли, встановивши сценарій виходу з системи, щоб автоматично здійснювати зміни до локального сховища.
Не витрачалося часу на автоматизацію процесу на віртуальній машині. Весь процес отримання, налаштування та завантаження джерела / бібліотек на віртуальну машину може бути 100% автоматизованим. Це може бути процес без нагляду, який ви десь запускаєте на центральному сервері, коли ви працюєте над виправленням помилок на вашій локальній машині (і використовуєте VM лише для забезпечення чистої збірки).
З іншого боку, у певному масштабі рішення VM на розробника починає ставати дурним, і вам просто слід мати сервер постійної інтеграції. Ось тут і реальні переваги продуктивності, оскільки це (здебільшого) звільняє окремих розробників від того, щоб взагалі турбуватися про нарощування. Не потрібно турбуватися про налаштування чистих віртуальних машин, оскільки сервер збирання завжди чистий.
Формулювання запитання ("тестовий випадок з усіма кроками") означає, що триває певне ручне тестування. Це, знову ж таки, може працювати для невеликих команд з відносно низьким навантаженням, але в більшому масштабі взагалі не має сенсу. Регресійні тести можуть і повинні бути автоматизовані; немає "кроків", просто клас або метод, доданий до набору тестів / інтеграції.
Зайве говорити, що перехід від Bugzilla до нової (кращої) системи відстеження помилок зробить цю частину досвіду набагато менш болісною.
Компанії не обов'язково дешеві або дурні лише тому, що вони не вирішили цих проблем. Все, що вони знають, - це те, що поточний процес працює , а в деяких випадках вони ризикують і не хочуть щось змінювати. Але насправді їх просто потрібно переконати в перевагах .
Якщо розробники витратили тиждень на відстеження свого часу на всі завдання, що не кодують, то ви могли б легко додати його, показати керівництву, що (наприклад) нульовий капітал, 100-годинна інвестиція в оновлення до Mercurial буде усуньте до 10 людино-годин на вирішення конфліктів злиття, тоді це виплата за 10 тижнів, і вони майже напевно погодиться на це. Ця ж ідея з серверами збірки (CI) або кращим відстеженням помилок.
Резюме: Команди ще цього не робили, тому що ніхто не переконав керівництво, що це важливо зробити сьогодні . Тож візьміть на себе ініціативу та перетворіть її на рівняння витрат та вигод; з'ясувати, скільки часу витрачається на завдання, які можна було б спростити / автоматизувати з мінімальним ризиком, та обчислити точку беззбитковості та можливу окупність нового інструменту чи техніки. Якщо вони все ще не слухають, то ви вже знаєте, які є ваші інші варіанти.
Якщо розробники витратили тиждень на відстеження свого часу на всі завдання, що не кодують, ви можете легко додати його, показати управління ... і перетворити його в рівняння вартості та вигоди тощо ...
Зверху детальніше виглядає подальше розширення.
Я можу підтвердити, що це працює. Програмісти кілька разів використовували його в одному з проектів, над якими я працював, і кожен раз це призводило до бажаних змін.
Моє загальне враження було, що якщо зробити це правильно, цей трюк може перемогти досить великі обсяги незнання керівництва та інерції.
Я хотів би відзначити , однак , що компанія , в якій ми (розробники) довелося вдатися до такого роду зроби сам підхід був дуже незрілими IT-навхрест. У більш досвідчених виробників програмного забезпечення я бачив подібні речі, які в основному роблять самі менеджери. І, як правило, вони були в цьому більш продуктивними, ніж ми, програмісти. Набагато продуктивніший.