«Вот не получается и не получается раз за разом, что ни делай! И непонятно, почему так!» Знакомая ситуация? Думается, с такой ситуацией можно столкнуться в любой сфере деятельности, начиная от космических проектов изучения Луны и заканчивая попытками помочь сделать домашние задания ребенку-пятикласснику.
А уж как часто сталкиваются с этим программисты, когда перед глазами гигабайты кода, а программа все равно не работает или работает не так, как было задумано! Вот они и придумали метод утенка, помогающий решить проблему (не путать с методом гадкого утенка, применяемым в медицинской диагностике, и синдромом утенка, открытым зоологом Конрадом Лоренцом).
А сегодня мы изучим метод утенка или, как его еще называют, «метод желтого утенка», потому что совсем маленькие утята сначала желтые, а потом становятся белыми. И даже те особи, которые во взрослом возрасте станут серыми или черными, в раннем детстве имеют желтый пушок на грудке.
Что такое метод утенка?
Метод утенка – это психологический метод решения задач путем «делегирования» вымышленному помощнику. Для того чтобы делегировать задачу, ее сначала нужно внятно объяснить. Настолько внятно, чтобы даже утенок понял, что случилось и начал думать вместе с вами. Для этого приходится подробно изложить практически весь алгоритм действий, который и привел к возникшей проблеме.
Суть метода утенка в том, что на каком-то этапе подробного изложения проблемы человек начинает понимать, почему она возникла. Зачастую именно те пункты алгоритма, которые не получается «объяснить» утенку, как раз и содержат недоработки. А если удалось обнаружить момент, когда потерялась нить логического перехода от одного действия к другому, тогда восстановление логики процесса зачастую решает задачу.
Для большей наглядности процесс рекомендуется визуализировать, взяв игрушечного утенка яркой расцветки. В принципе, взять можно любое другое животное, и даже не в виде игрушки, а просто представить его в своих мыслях, но авторы метода предложили утенка. К слову, оригинальное название метода на английском звучит как Rubber duck debugging, потому что авторы предложили использовать самый доступный вариант резиновой игрушки, которая есть у многих американцев в ванной (Rubber переводится с английского как «резина»).
Подробно про этот метод они рассказали в своей книге The Pragmatic Programmer («Прагматичный программист»), которая вышла еще в прошлом веке в 1999 году. Советы из книги сохранили актуальность и сегодня, поэтому к 20-летию «премьеры» было подготовлено юбилейное издание с некоторыми актуальными дополнениями.
Все, кто давно интересуется IT-технологиями, наверняка опознали в предложенном методе знаменитый «бабушка-тест», когда программисту предлагается объяснить суть своей работы бабушке, далекой от новинок цивилизации. Нечто общее тут есть, однако следует понимать, что авторы метода утенка творили в США, где компьютерные технологии распространились намного раньше и быстрее, чем у нас, поэтому многие бабушки весьма неплохо разбираются в базовых понятиях.
На сегодняшний день цифровые технологии широко распространены во всем мире, и за последнюю четверть века появилось большое количество бабушек, успевших познакомиться с «цифрой» в силу профессиональных и коммуникативных потребностей. Не говоря уже о том, что бабушка – это не всегда пожилая женщина, всю жизнь прожившая в деревне, но и, к примеру, вышедшая на пенсию доцент кафедры радиоэлектроники, которая много чего поймет с полуслова, и детальные пояснения ей ни к чему.
Поэтому для максимально подробного объяснения утенок и любое другое существо, потенциально способное спокойно посидеть и послушать какое-то время, годится намного лучше. В принципе, этот метод можно применить в любой сфере деятельности, а не только в программировании. Но, коль скоро он зародился в среде программистов, давайте начнем с применения метода утенка в программировании.
Программирование: метод утенка
Итак, как же работает метод утенка для программиста? Для того чтобы это понять, нам нужно вернуться к книге The Pragmatic Programmer, в которой описан данный метод. Программист, герой этой книги, постоянно носил с собой желтого резинового утенка, и каждый раз, когда работа стопорилась, он заставлял себя «объяснять» утенку написанный код буквально построчно. И на каком-то этапе обязательно обнаруживал проблему.
Как это получается? Дело в том, что при описании того, как должен работать код, и при наблюдении за тем, как он работает на самом деле, несоответствие между этими двумя понятиями сразу становится заметным. Причем опция построчного объяснения кода дает возможность сразу локализовать неполадку, что уже облегчает отладку кода.
Конечно, возможна ситуация, когда при исправлении одной неполадки ухудшится работа какой-то другой функции и появится другая неполадка. Однако это уже технические нюансы, которые можно откорректировать, применив метод утенка еще раз. Вот так описывают свой метод авторы.
И, пожалуй, наиболее яркое объяснение можно найти в статье The Psychology Underlying the Power of Rubber Duck Debugging («Психология, лежащая в основе силы Rubber Duck Debugging»). Там наглядно показана разница между тем, как обрабатывают информацию компьютеры, и как обрабатывают информацию люди. Показана эта разница на примере абсолютно невинного вопроса: «На улице холодно?»
Люди обычно отвечают на этот вопрос, почти не задумываясь, подразумевая, что у собеседника такие же представления о том, что такое «холодно», как и у того, кто отвечает на вопрос. Если же этот вопрос задать компьютеру, ему для начала нужно будет уточнить, что значит «холодно».
Как уточнить? Казалось бы, все очень просто. Температуру измеряют термометром, поэтому нужно просто определить для компьютера показатели, где заканчивается «холодно» и где начинается «тепло». Однако тут не все так однозначно, потому что, к примеру, +8°C летом – это холодно, а +8°C зимой – это тепло. Опять же, многое зависит от локации, потому что где-нибудь в Кении +8°C зимой – это все равно холодно, т.к. зимой даже ночью там +15°C, а на юге и все +20°C.
Конечно, можно задать компьютеру уточняющие характеристики понятий «тепло» и «холодно». В частности, для зимы, лета, весны, осени, страны и региона. Но это еще несколько строчек кода, которые нужно продумать и написать. И, пока вы не напишете эти строчки кода, компьютер не сможет вам корректно ответить на простой человеческий вопрос: «На улице холодно?»
Так почему же все это означает, что вы должны рассказать о своей проблеме с программированием утенку? Из-за огромной разницы между тем, как говорит и думает большинство людей, и тем, как функционируют компьютеры, программисту, особенно начинающему, бывает трудно быстро научиться думать «как компьютер». Можно сказать, что компьютеры «болезненно точны», и именно это предопределяет большинство ошибок в программном коде, написанном людьми.
Вот тут и приходит на помощь «метод утенка» или Rubber Duck Debugging. Напомним, что «резиновость» или «уткообразность» объекта не принципиальны, и объяснять цель программы можно практически кому угодно, будь это «ваша собака, ваша кошка, ваш ребенок, ваш офисный стул, ваш плюшевый мишка или бутылка острого соуса». Главное, не останавливаться и не тушеваться, если не получается объяснить сразу.
Возможно, что в момент, когда «не получается», вы как раз и «нащупали» тот самый «баг», который не дает работать всей программе. Нужно терпеливо обрисовывать цели и задачи программы, построчно объяснять, что делает тот или другой сегмент кода, какими символами задается та или иная функция. Быть может, где-то закралась опечатка, и вы просто забыли поставить точку там, где она должна быть.
В чем секрет эффективности отладки кода при помощи метода утенка? Когда вы что-то объясняете кому-то другому, у вас в голове «сдвигаются» две важные вещи. Во-первых, вы, скорее всего, «замедлитесь» и будете подбирать выражения более тщательно, чем, когда вы что-то пишете, изливая на бумагу или монитор компьютера свои мысли, пусть даже в виде программного кода. Большинство людей думает намного быстрее, чем говорит, поэтому, когда начинается устное объяснение, оно всегда будет медленнее и точнее.
Во-вторых, вы будете формулировать пояснения, зная, что резиновая уточка, которой вы объясняете свой код, не сильна в программировании и не знает так много, как вы. Учитывая, что программисты обычно объясняют нюансы кода таким же программистам, как они сами, мало кто может с ходу сделать такую поправку на восприятие игрушечного утенка. Однако в момент, когда это удается, объяснения становятся максимально внятными.
Из-за необходимости быть точными, помогая кому-то другому понять вашу проблему, вы вынуждены уделять очень пристальное внимание всему, что раньше считали само собой разумеющимся. Поэтому, кстати, преподавание часто рекомендуется, как отличный способ продолжить свое обучение, ведь оно уходит своими корнями в ту же самую смену восприятия. Как говорится, хочешь усовершенствоваться в чем-то сам, научи этому кого-то другого.
Почему правильная формулировка вопроса часто приводит к ответу? Сообщества программистов и отдельные разработчики, работающие по данному методу, раскрывают пошаговый алгоритм работы метода утенка». И признаются, что много раз у каждого из них получалось следующее:
- Возникла проблема.
- Решил задать вопрос онлайн.
- Записал свой вопрос.
- Понял, что вопрос не имеет никакого смысла.
- Следующие 15 минут думал, как сформулировать вопрос так, чтобы он имел смысл.
- Понял, что решаю проблему совершенно не с той стороны.
- Начал с нуля и нашел решение.
Таким образом, иногда правильный вопрос на тему возникшей проблемы наполовину решает проблему. А для того? чтобы задать правильный вопрос, как раз и нужен метод утенка. Вот что рекомендуют сообщества программистов своим клиентам, чтобы те получили максимально исчерпывающий ответ на этот вопрос:
- Предоставьте нам необходимую информацию, чтобы понять, что происходит, даже если мы не являемся экспертами в вашей конкретной области.
- Расскажите, почему вам нужно знать ответ. Что привело вас сюда? Это праздное любопытство или это как-то блокирует ваш проект? Нам не нужна история всей вашей жизни, просто дайте нам немного контекста.
- Поделитесь своим исследованием вашей проблемы. Что вы уже предприняли и почему это не сработало? И если вы до сих пор ничего не предприняли для понимания своей проблемы, стоит ли вам задавать кому-то вопросы?
- Если вы предлагаете нам потратить наше драгоценное время, помогая вам, будет справедливо, если вы потратите разумное количество своего драгоценного времени на разработку понятного вопроса. Помогите нам помочь вам!
Думается, мы достаточно подробно объяснили, как работает метод утенка для программиста. Собственно, примерно так он работает и в любой другой области. В заметке Quack Attack: How rubber ducks help solving problems («Шарлатанская атака: как резиновые уточки помогают решать проблемы») можно найти краткую инструкцию по применению метода.
Итак, когда дело доходит до применения метода утенка, необходимо выполнить несколько ключевых шагов:
- Четко и максимально кратко определить проблему или задачу.
- Как можно проще объяснить проблему игрушечному утенку или кому-то еще, чтобы прояснить ситуацию.
- В процессе объяснения анализировать приходящие в голову решения, их преимущества и недостатки, выбирая лучшее.
- Применить лучшие идеи и решения, обнаруженные методом утенка, к проблеме.
Не устаем напоминать, что желтый утенок – это условность, для использования метода годится любая игрушка, фигурка, предмет, можно самодельный. Так, группа разработчиков поделилась опытом и совершенно серьезно рассказала про The Contribution of the Cardboard Cutout Dog to Software Reliability and Maintainability («Вклад вырезанной из картона собачки в надежность и ремонтопригодность программного обеспечения»).
Сначала эти милые люди пытались привлечь себе в помощь уборщиц, секретарей и менеджеров, ничего не смыслящих в программировании. Потом решили, что пусть лучше каждый занимается в рабочее время тем, за что получает зарплату, и «озадачили» своими проблемами кота, который тут же уснул. «Помочь» им смог только лабрадор Джейк, поэтому после того, как тот ушел в «лучший собачий мир», решили вырезать фигурку собаки из картона.
Фанатам «живого» общения с животными эти ребята советуют не связываться с агрессивными и постоянно лающими особями, мешающими объяснению, и мелкими вертлявыми собачками, которые не в состоянии спокойно сидеть и «слушать», потому что это будет отвлекать объясняющего. Заменять собаку аквариумной рыбкой нежелательно, потому что она может в любой момент объяснения развернуться и уплыть в одном ей ведомом направлении.
Еще несколько интересных примеров вы найдете в статье «Как метод утенка и коридорное тестирование помогают решать сложные нестандартные задачи». Думается, после того, как мы рассказали о методе утенка для программиста, все остальные и сами смогут применить его для своей сферы деятельности. Но, пожалуй, стоит удалить отдельное внимание такой важной сфере, как психология.
Метод желтого утенка в психологии
Каковы же особенности применения метода желтого утенка в психологии? Нам в помощь статья «Метод утки: Как решить проблему без психотерапевта». И полезные советы из статьи «Метод желтого утенка как метод решения проблем».
Для начала психологи объясняют, как правильно проводить консультации для «себя любимого»:
- Шаг первый – берем и ставим перед собой игрушечного утенка либо представляем его мысленно.
- Шаг второй – объясняем ему свою проблему и задаем вопросы, вслух или мысленно. Лучше вслух, это располагает к более четким формулировкам.
- Шаг третий – отвечаем на вопросы, возникшие у нашего безмолвного собеседника, и ищем оптимальный вариант.
Предполагается, что в процессе этих рассуждений получится найти решение или, как минимум, выговориться и разрядиться эмоционально. Разница между решением технических и психологических задач заключается в том, что при решении личных проблем мы в большей степени подвержены эмоциям. В процессе межличностного общения культурные люди вынуждены их сдерживать, а утенку или любой другой игрушке мы можем высказать что угодно.
Выплеснув лишние эмоции, мы получаем возможность мыслить логически и воспользоваться всеми преимуществами метода, о которых мы говорили ранее. В первую очередь, «замедлиться» и тщательно обдумать все нюансы сложившейся ситуации. Лучше делать это в формате диалога, представляя, что мог бы спросить у вас утенок, имей он такую возможность. В принципе, и для обсуждения технических задач диалог может быть полезен, однако для решения проблем межличностных отношений он просто необходим.
В целом, как в программировании, так и в психологии метод утенка построен на том, что, собирая обрывочные мысли в упорядоченную речь, мы упорядочиваем и всю доступную нам информацию. Это позволяет правильно расставить приоритеты, понять, какой информации не хватает для правильного решения. Или, быть может, не хватает решимости воплотить в жизнь давно имеющееся решение.
В этом заключается еще одно отличие применения «метода утенка» в психологии. В программировании нам вряд ли что-то помешает переписать фрагмент кода для того, чтобы его улучшить. А в решении жизненных проблем человеку свойственна инерция мышления, мешающая предпринимать даже самоочевидные действия.
Так или иначе, при использовании метода утенка очень важно объяснять ему ситуацию максимально подробно. Исходить нужно их того, что он способен вам ответить и поддержать беседу. И представить, что утенок задает наводящие вопросы или вопросы, напрямую следующие из вашего рассказа.
Так ли уж нужен метод желтого утенка в психологии, как в программировании? И почему бы нам не воспользоваться традиционным способом и не посоветоваться с друзьями или родными и близкими? Скажем так, далеко не все жизненные ситуации можно обсудить с друзьями, родными и близкими. Так, если вас бросила любовница, вы вряд ли сможете обсудить это с женой. А если бросил любовник, это не обсудишь даже с подругой, потому что та быстренько побежит и заложит вас вашему мужу.
Таким образом, метод желтого утенка в психологии имеет ряд существенных преимуществ:
- Возможность разобраться со своими проблемами сохранив конфиденциальность.
- Возможность сэкономить деньги и не тратить их на прием у психолога или психотерапевта.
- Возможность «замедлиться» и тщательно обдумать все, что вас беспокоит.
- Возможность упорядочить свои мысли за последние много лет.
- Возможность, наконец, понять, в чем суть вашей проблемы, когда будете ее формулировать по методу утенка.
- Возможность выплеснуть эмоции, никого не обидев и не испортив ни с кем отношения.
- Возможность обрести трезвый взгляд на вещи, разрядившись эмоционально и разложив все по полочкам.
Итак, мы сегодня узнали много интересного, и теперь самое время подвести некоторые итоги. Итак, что же мы узнали про метод утенка? Это психологический метод решения задач путем «делегирования» этих задач вымышленному помощнику. Процесс происходит следующим образом:
- Создание мысленного помощника – нужно посадить перед собой игрушечного утенка или любого другого помощника, несведущего в ваших проблемах.
- Определение задачи – необходимо четко определить задачу, которую вы пытаетесь решить. Чем точнее и яснее сформулирована задача, тем проще будет работать с ней.
- Разделение задачи – при необходимости задачу нужно разделить на подзадачи. Например, как объемный многостраничный код, который нужно будет объяснять построчно.
- Общение с помощником – обсудить задачу с вашим мысленным помощником в формате монолога или диалога. Идеально, если вы будете задавать вопросы и прислушиваться к своему «внутреннему голосу».
- Анализ и выбор решения – в процессе общения с утенком или другим выбранным помощником нужно анализировать возникающие идеи и предложения, выбирая лучшие.
- Применение решения – когда вы пришли к окончательному решению, просто начать его воплощать в жизнь.
Психологический метод с использованием мысленного помощника позволяет смотреть на задачу с разных сторон, выявлять новые идеи и рассматривать их под разными углами зрения. Метод утенка особенно полезен в ситуациях, когда вам нужно преодолеть затруднительный момент или решить сложную проблему, требующую анализа с разных точек зрения.
«Гигабайты кода»? Даже представить страшно. Может все-таки мегабайты?
Интересно, стоит попробовать, когда появится проблема. Спасибо!