Задача: баг или фича?

В рабо­те у про­грам­ми­ста есть про­ект, в кото­ром нуж­но пофик­сить три бага и доба­вить три фичи. За час про­грам­мист может пофик­сить 1–2 бага или доба­вить 1–2 фичи. Но он посто­ян­но отвле­ка­ет­ся на фору­мы и соц­се­ти, поэто­му каж­дый час рабо­та идёт так:

  • Если он пофик­сит один баг, то выле­зут два новых.
  • Если он пофик­сит за час сра­зу два бага, то в тре­ке­ре появит­ся зада­ние сде­лать ещё одну новую фичу, и не факт, что она вой­дёт в финаль­ный релиз.
  • Если он доба­вит одну фичу, то в тре­ке­ре появит­ся запись, что ему обя­за­тель­но нуж­но доба­вить ещё одну фичу, но попро­ще, и без это­го про­ект не сдать.
  • И толь­ко если он за час доба­вит сра­зу две фичи, то новых задач не прибавится.

Сколь­ко мини­маль­но вре­ме­ни потре­бу­ет­ся про­грам­ми­сту, что­бы сдать про­ект без багов и с пустым тре­ке­ром задач?

РЕШЕНИЕ

Един­ствен­ное дей­ствие, при кото­ром не появ­ля­ет­ся новых багов и фич — это когда про­грам­мист за час добав­ля­ет сра­зу две фичи. Полу­ча­ет­ся, что для успеш­но­го завер­ше­ния нуж­но сде­лать чёт­ное коли­че­ство фич под­ряд — 2, 4, 6, 8 или что-то подобное.

Полу­ча­ет­ся, что зада­ча про­грам­ми­ста — сво­и­ми дей­стви­я­ми как мож­но быст­рее прий­ти к тому, что­бы в про­ек­те оста­лись нена­пи­сан­ны­ми толь­ко фичи и что­бы их чис­ло дели­лось на 2. На стар­те ему нуж­но сде­лать 3 фичи, зна­чит, новая цель — из трёх багов полу­чить нечёт­ное коли­че­ство фич-заданий в тре­ке­ре. В ито­ге это даст про­грам­ми­сту их чёт­ное коли­че­ство, и он их попар­но выполнит.

Нечёт­ное коли­че­ство фич — это 1, 3, 5 и так далее. Если мы закро­ем сра­зу два бага, то это даст нам толь­ко одну новую фичу в тре­ке­ре, и оста­нет­ся ещё один баг. Дела­ем это за пер­вый час:

Исход­ные дан­ные: 3 бага, 3 фичи.

Час 1: 1 баг, 4 фичи (пофик­си­ли 2 бага, полу­чи­ли +1 фичу в трекере).


У нас появи­лось чёт­ное коли­че­ство фич, кото­рые мож­но сра­зу попар­но закрыть. Тра­тим ещё 2 часа.

Час 2: 1 баг, 2 фичи (реа­ли­зо­ва­ли сра­зу 2 фичи, новых зада­ний не появилось).

Час 3: 1 баг (реа­ли­зо­ва­ли сра­зу 2 фичи, новых зада­ний не появилось).


Уже хоро­шо. Теперь един­ствен­ное, что оста­ёт­ся про­грам­ми­сту — отра­бо­тать этот баг.

Час 4: 2 бага (пофик­си­ли 1 баг, полу­чи­ли 2 новых).


А вот тут мож­но попасть в ловуш­ку, если сра­зу пофик­сить 2 бага и полу­чить фичу. Дело в том, что если оста­ёт­ся толь­ко одна фича, то после её выпол­не­ния в тре­ке­ре появ­ля­ет­ся запись, что нуж­но сде­лать ещё одну. Полу­ча­ет­ся бес­ко­неч­ный цикл. Зна­чит, нам нуж­но фик­сить по одно­му багу по очереди.

Час 5: 3 бага (пофик­си­ли 1 баг, полу­чи­ли 2 новых).


Ага, у нас уже 3 бага, а это зна­чит, что мож­но сде­лать одно­вре­мен­но 2 из них, и не попасть потом в замкну­тый круг. Проверим.

Час 6: 1 баг, 1 фича (пофик­си­ли 2 бага, полу­чи­ли +1 фичу в трекере).

Но мы уже встре­ча­ли ситу­а­цию, когда был толь­ко один баг, и зна­ем, как из него полу­чить 2, а из двух — фичу. Делаем.


Час 7: 2 бага, 1 фича (пофик­си­ли 1 баг, полу­чи­ли 2 новых).

Час 8: 2 фичи (пофик­си­ли 2 бага, полу­чи­ли +1 фичу в трекере).


И сно­ва появи­лось чёт­ное коли­че­ство фич, кото­рые нуж­но сде­лать. Закры­ва­ем про­ект финаль­ным шагом.

Час 9: всё сде­ла­но (реа­ли­зо­ва­ли сра­зу 2 фичи, новых зада­ний не появилось).

Ответ: про­грам­ми­сту потре­бу­ет­ся мини­мум 9 часов.