Декомпозиция задач: что это и зачем нужно

При­хо­дит мар­ке­то­лог интернет-магазина к раз­ра­бот­чи­ку с задачей:

Для мар­ке­то­ло­га это одна строч­ка тек­ста. Он дума­ет, что такую про­стую задач­ку мож­но сде­лать за 15 минут. А раз­ра­бот­чик пожи­ма­ет пле­ча­ми: «Поду­маю, потом назо­ву срок». Что за дичь? А вот так.

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

  • Доба­вить в базу това­ров стол­бец с коли­че­ством покупок.
  • Напи­сать новый или дора­бо­тать ста­рый метод для АПИ, что­бы сайт полу­чал зна­че­ние из это­го столбца.
  • Доба­вить стро­ку тек­ста на стра­ни­цу товара.
  • Про­те­сти­ро­вать метод и вёрстку.
  • Поду­мать, что делать с ред­ки­ми слу­ча­я­ми, напри­мер, товар купи­ли, а потом вер­ну­ли; или если товар супер­по­пу­ляр­ный и его купи­ли 9999999999999999 раз.

В зави­си­мо­сти от архи­тек­ту­ры систе­мы могут быть и дру­гие дей­ствия. Поэто­му назвать срок сра­зу раз­ра­бот­чик не может: сна­ча­ла надо понять, что вооб­ще нуж­но делать и сколь­ко вре­ме­ни зай­мёт каж­дый пункт.

Чем круп­нее зада­ча, тем слож­нее обой­тись без деком­по­зи­ции. «Покра­сить кноп­ку в крас­ный» мож­но не рас­кла­ды­вать. А «Доба­вить новый раз­дел в админ­ку» точ­но сто­ит сна­ча­ла разо­брать по частям: тут рабо­та и для фрон­тен­да, и для бэкен­да. Деком­по­зи­ция нуж­на не все­гда, но очень часто.


Была одна боль­шая зада­ча, ста­ло несколь­ко маленьких. 

Зачем декомпозировать

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

Если фрон­тенд попро­бу­ет сам пред­по­ло­жить, как будет выгля­деть запрос, то после инте­гра­ции могут всплыть непред­ви­ден­ные баги: бэкенд мог реа­ли­зо­вать АПИ не так, как думал фронтенд-разработчик. Деком­по­зи­ция помо­жет понять, с какой сто­ро­ны под­сту­пить­ся и в какой после­до­ва­тель­но­сти двигаться.

Оце­нить сро­ки. Когда зада­ча раз­ло­же­на на части, мож­но оце­нить по вре­ме­ни каж­дую и понять, сколь­ко потре­бу­ет­ся на всё вме­сте. Понят­но, что не полу­чит­ся запу­стить счёт­чик за день, если толь­ко на базу дан­ных и АПИ нуж­но два.

Упро­стить тести­ро­ва­ние. Тести­ро­вать про­ще, когда понят­но, что нуж­но про­ве­рить. В слу­чае со счёт­чи­ком: базу дан­ных, метод и вёрстку.

Рас­ста­вить при­о­ри­те­ты. Деком­по­зи­ция может пока­зать, что зада­ча боль­шая и тре­бу­ет вре­ме­ни. Напри­мер, если мар­ке­то­лог хочет ука­зать не толь­ко коли­че­ство поку­пок, но и коли­че­ство горо­дов, в кото­рые товар достав­ля­ли. Раз­ра­бот­чик может пока­зать, что делать всё вме­сте — две неде­ли, но счёт­чик поку­пок мож­но выка­тить быст­рее. А мар­ке­то­лог уже решит, как луч­ше поступить.

Как декомпозировать

Деком­по­зи­ро­вать мож­но по-разному, это зави­сит от мас­шта­ба и сути задачи.

Напри­мер, запуск мобиль­но­го при­ло­же­ния мож­но деком­по­зи­ро­вать сна­ча­ла на уровне плат­форм: iOS и Android. Потом — на уровне поль­зо­ва­тель­ских сце­на­ри­ев: реги­стра­ция, про­смотр кон­тен­та, покуп­ка, пере­пис­ка с кон­так­та­ми. Сце­на­рии мож­но раз­ло­жить на интер­фейс и сер­вер­ную часть. А их — на отдель­ные кон­крет­ные задачи.

Чаще все­го зада­чи рас­кла­ды­ва­ют вер­ти­каль­но и гори­зон­таль­но. Вер­ти­каль­но — зна­чит по типам работ. Гори­зон­таль­но — зна­чит вглубь одно­го типа рабо­ты. Вот как это рабо­та­ет со счёт­чи­ком поку­пок в интернет-магазине:

Вер­ти­каль­ная декомпозиция:

Бэкенд: счи­тать коли­че­ство поку­пок и отда­вать дан­ные на фронт.

Фрон­тенд: запра­ши­вать дан­ные при загруз­ке стра­ни­цы и выводить.

Гори­зон­таль­ная декомпозиция:

Бэкенд:

  • доба­вить стол­бец с коли­че­ством поку­пок в БД;
  • счи­тать в этом столб­це, сколь­ко раз товар купили;
  • доба­вить метод, кото­рый будет воз­вра­щать коли­че­ство поку­пок по id товара.

Фрон­тенд:

  • доба­вить на стра­ни­цу това­ра стро­ку с коли­че­ством покупок;
  • обра­щать­ся с помо­щью мето­да к БД во вре­мя загруз­ки страницы;
  • настро­ить отоб­ра­же­ние счёт­чи­ка на экра­нах раз­ных размеров.

Кто должен декомпозировать

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

Когда появ­ля­ет­ся новая боль­шая зада­ча, один из опыт­ных раз­ра­бот­чи­ков берёт её на себя. С это­го момен­та он за неё отве­ча­ет: соби­ра­ет встре­чи, даёт заказ­чи­кам обрат­ную связь, опре­де­ля­ет, как решить зада­чу, деком­по­зи­ру­ет её. Для раз­ра­бот­чи­ков это воз­мож­ность рас­ши­рить свою зону ответ­ствен­но­сти, попро­бо­вать себя в роли архи­тек­то­ра и мене­дже­ра проекта.

Ино­гда нуж­но выде­лить вре­мя и разо­брать­ся в зада­че, поду­мать про погра­нич­ные слу­чаи, изу­чить тех­но­ло­гию, при­ду­мать реше­ние. Быва­ет, что на этом эта­пе зада­ча может раз­де­лить­ся на несколь­ко эта­пов: что дела­ем сей­час, а что потом. Так было, напри­мер, с про­вер­кой домаш­них работ от сту­ден­тов: сна­ча­ла они при­хо­ди­ли в виде архи­ва на про­вер­ку, потом появил­ся пол­но­цен­ный интер­фейс для ревью кода. Систе­ма будет раз­ви­вать­ся и даль­ше, но деком­по­зи­ция помо­га­ет понять, что и в какой после­до­ва­тель­но­сти мож­но сде­лать, что­бы быст­рее полу­чить результат.

👉 Почи­тай­те пол­ное интер­вью с Алек­сан­дром Тре­ге­ром. Там боль­ше подроб­но­стей о раз­ра­бот­ке Практикума.