Что такое декомпозиция и зачем она нужна?

Я дpuzzleавно хотел написать цикл статей о том, как научится программировать. И сначала думал сделать статью о мышлении программиста. Одной из ее частей должна была стать «Декомпозиция». Но она стала слишком большой и я решил, что необходимо вынести ее в отдельную статью. Кроме того, кому программирование не интересно — все равно советую почитать, особенно в конце статьи для вас тоже будет полезная информация.

Декомпозиция — это разбиение одной большой задачи на меньшие, связанные между собой. Все кто сталкивался с программированием, сталкивались с декомпозицией. Это могли быть как части ООП в вашей Java программе, так и разные template какой-нибудь CMS. Так как само понятие задачи абстрактно, задачей можно назвать создание целого проекта, в тоже время «исправить ошибку в тексте программы» — тоже задача.

Если простыми словами, можно сказать следующим образом. У вас в программировании или даже в обычной жизни есть какие-то цели. Чтобы реализовать цель, нужно выполнить какое-то количество задач. Грубо говоря цель это такая очень большая задача. Вы ее разбиваете постепенно на что-то небольшое, а потом решаете эти части.

Зачем нужна Декомпозиция?

Умение быстро декомпозировать задачи является крайне необходимым навыком для решения задач в программировании и не только. Я бы даже сказал это очень большая часть из всего процесса мышления. Например, другой важный навык — дивергентное мышление.

Одна из причин по которой декомпозиция применяется в программировании это попытка сделать так, что бы ваш мозг смог видеть решение текущей мелкой задачи целиком. Это позволяет вам проще и быстрее найти решение, а так же абстрагироваться от других задач.

Например, вам нужно создать громоздкий PHP скрипт, который будет скачивать страницы какого-либо вебпортала и структурировать данные из них. Решение целиком для подобной задачи трудно представить. Но, ее можно разбить на следующие части: получение страниц вебпортала, парсинг данных, структурирование данных. Уже стало немного легче, так как мы можем пока оставить парсинг данных и структурирование и занятся получением данных. Когда эта задача будет решена, можно будет перейти к следующей и так далее.

Вторая причина — программирование в команде. Над большим проектом всегда работает много людей. Они просто не смогут работать вместе, если задача не будет разбита на мелкие части. А если разбить общую задачу на множество небольших подзадач, то каждый разработчик сможет писать универсальный код, который будет взаимодействовать с кодом других разработчиков.

Третей причиной можно назвать — создание плагинов к существующему ПО. Разработчику плагина не нужно знать как устроен ваш проект. Он создает свой плагин для решения какой-то небольшой задачи. При этом, его плагин общается с общей системой по специальному интерфейсу, который описан где-то в документации. Во всяком случае в хорошей программе описан. И получается что такой разработчик помог решать общую задачу системы.

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

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

Как научиться декомпозировать задачи?

Идеальное обучение — практика. Но сложно начинать практиковатся на реальных задачах, если вы еще не до конца понимаете весь процесс. Как же быть? Я вижу два вектора тренировок.

1. Задачи из реальной жизни

Дело в том, что вы так или иначе занимаетесь декомпозицией каждый день. Когда вам нужно сделать какое-то большое дело, оно скорее всего состоит из многих мелких задач. Ну например, вам нужно завать чай. Для этого нужно пойти на кухню, поставить чайник, подождать пока закипит вода, заварить чай, добавь по желанию сахар и потом уже получить результат. Но! В этой задаче (заварить чай) каждая подзадача слишком мала. Вашему мозгу не нужно много думать, чтобы «подождать пока закипит вода в чайнике». Поэтому вы не ощущаете что продекомпозировали данную задачу. Но мозг на подсознательном уровне это сделал.

Но не все так просто в нашей жизни. Когда задачи простые, мозг декомпозирует задачу подсознательно. Вы не задумываетесь особо над этим. Вы сталкивались когда-то с ощущением, что вам нужно что-то сделать и не знаете с чего начать и кажется что эта задача непосильная и вообще это почти невозможно? Я думаю да. Так вот. Насамом деле не нужно паниковать или долго думать как подойти.

  1. Разбейте сложную задачу на множество простых. Если они кажутся все равно сложными — разбейте их еще раз.
  2. Придуймайте решение каждой.
  3. Выстройте план действий.
  4. Приступите к выполнению.

Конечно поначалу применяя мой совет будет сложно. Нужно будет думать как разбить задачу, потом что с ней делать, какой-то план составлять и так далее. Но, человеческий мозг крутая штука. Если вы будете регулярно так делать со временем эти процессы начнут занимать мало времени. Из личного примера — многие сложные задачи я решаю подобным образом автоматически. Мой мозг уже привык подобным образом мыслить. Конечно у всех разные интеллектуальные способности, но это не значит что нельзя научится так делать. Просто кто-то научится быстрее, кто-то медленней.

2. Поиск объяснения устройства различных процессов

Что я имею ввиду? Ищите объяснения как устроены привычные для вас вещи. Вы когда то думали как устроен замок в вашей двери? Или, например, как работает электрический чайник?

Дело в том, что даже относительно простые механизмы, которые вас окружают состоят из нескольких деталей. Каждая деталь выполняет определенную функцию. Находите сходство с декомпозицией?

Практиковаться в этом направлении просто. Когда у вас появилась свободная минутка оглянитесь вокруг. Начните обращать внимание на привычные для вас предметы. К слову, это вообще крутая практика тренировка внимания, но это тема для другой статьи. Найдите из этих предметов какой-то механизм. Пока я писал статью, первое на что я обратил внимание это компьютерная мышь. Из каких частей она состоит? Попробуйте подумать сами, а потом еще поискать в интернете. Возможно эта информация никогда не будет вам полезна. Особенно если вы не собираетесь чинить компьютерные мыши :). Но дело тут в другом. Подобные размышления тренируют мозг в правильном направлении.

Кроме того, вы можете задумываться как работаю не только механизмы созданные людьми, но и живые организмы или природные процессы (например вспышки на солнце).

С другой стороны практикуясь подобным образом вы не только тренируете мозг в решение задач декомпозиции, но и узнаете много нового. Вдруг что-то пригодится?

Выводы

Декомпозиция это просто деление большой задачи на более мелкие. Казалось бы простой процесс и что тут сложного? Ничего сложного, но на деле в среднем люди редко применяют этот процесс эффективно. Ведь дело не в том, чтобы понимать что такое декомпозиция, а в том чтобы ею пользоваться. Это как абонемент в спортзал. Его нужно не только купить, но еще и ходить заниматься.

Тренироваться в этом направлении не сложно. Я описал два простых направления как прокачать свой мозг декомпозировать задачи быстро и тщательно. Первый — это применять декомпозицию не только в работе, а в реальной жизни. Грубо говоря — везде. Второй — это узнавать как работают разные устройства или процессы вокруг вас.

Пробуйте, развивайте свое мышление и решайте свои проблемы, достигайте целей!

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *