Найти в Дзене

Многопоточность на самом бытовом примере для детей

Поскольку институт, обучающий меня инженерному делу, не специализировался на подготовке суровых программистов – познавать таинства профессии мне пришлось самостоятельно. Как раз в моду входило такое понятие как многопоточность. Относительно шустро разобравшись с базовыми понятиями объектно-ориентированного программирования, помню как туго шло понимание что же за сверь такой «поток» и как программный код разделять на отдельные потоки. Вопрос был отложен до лучших времен, которые настали очень не скоро.

Проблема была в том, что книги, рассказывающие мне про эту концепцию, объясняли это абстрактными моделями, не предлагая каких-то реальных примеров оптимизации за счет разделения потоков. Я считаю это гигантской проблемой. Программист, в своей работе, не изобретает новую вселенную. Большинство наших оптимизаций связано с упрощением сложных процессов и избавление рабочего процесса от ненужных шагов. К счастью в жизни есть, на мой взгляд, прекрасный пример для визуализации как проблемы низкой производительности, так и оптимизации его за счет использования многопоточности.

Пример сей – общественный туалет. Да, вот так вот низкопробно. Как мы все знаем – очередь в мужском туалете всегда меньше, чем в женском. И это никак не связано с анекдотом про 10 мужчин и одно ведро. Если наткнетесь на общественный мужской туалет без писуаров – увидите туже очередь что и в женском. В контексте оптимизации программного кода – это связано с отсутствием необходимости совершать дополнительные действия.

Но я тут про многопоточность говорю. Тут будем смотреть с другой стороны. И так – у нас есть задача, состоящая из двух шагов. 1) Осуществить задуманное, 2) Помыть руки(ну мы же все-таки за гигиену). Разумеется второй шаг можно убрать совсем, но тут как и любая тупая оптимизация – появляются новые риски.

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

Приведенный пример должен быть очевиден даже ребенку. Может быть, если программированию обучали на самых банальных жизненных примерах – у нас бы в мире были гораздо более надежные программные продукты. Данный пример не требует дополнительного труда тестировщика или еженедельного нагрузочного тестирования. Тут просто самый простейший жизненный пример того как может работать многопоточность и как появляется польза от разделения сущностей.