GTD

индекс
196,71

Перевод статьи «Work 2.0 – the interruptible programmer» из песочницы

Автор: Steve Streeting
Оригинал статьи: www.stevestreeting.com/2010/09/04/work-2-0/

Работа 2.0 — Прерываемый программист


Мне 37 лет, и я был (профессиональным) разработчиком в течение 16 лет. Ты мог бы подумать, что за это время я выработал эффективный стиль работы, приносящий желаемый результат и не вызывающий неприятных побочных эффектов. Но, к сожалению, это не так. Мне кажется, тот стиль, в котором я работал в течение первых 15 лет моей карьеры, был практически такой же, как и у любого другого разработчика, увлеченного своей профессией: ты тратишь на работу огромное количество времени. 12-16 часов в день, марафоны программирования по вечерам и по выходным, пицца на клавиатуре, тяжелые периоды, отладка в 3 часа ночи, когда ты не можешь лечь спать, потому что чувствуешь, что вот-вот отловишь этот долбаный баг, отчаянные попытки доделать работу за минуту до дедлайна, когда ты умудряешься завершить последний кусок кода, как в лихо закрученном боевике, в последнюю секунду до того, как мир был готов отправиться прямиком в ад. Если ты из тех, о ком я говорю, ты понимающе кивал и, вероятно, слегка улыбался, вспоминая о былых испытаниях и победах. Такую безумную преданность работе уважают в наших кругах и в значительной степени ожидают от любого разработчика с высокой кармой.

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

Но я «в ударе»!!!

Итак, я хотел бы поговорить о самой большой проблеме, с которой я столкнулся: периоды концентрации. Я не могу непрерывно просидеть за столом больше часа. Если я не буду минимум раз в час вставать и ходить, делать небольшие растяжки и тому подобное, то я поплачусь за это, как только сделаю шаг, и вероятно буду еще расплачиваться в течение нескольких дней. Я также больше не могу работать не чувствуя боли больше стандартных 8 часов в день. Проблема была в том, что стиль, в котором я работал больше 15 лет, приучил меня к постепенному вхождению в состояние «в ударе» и непрерывному кодированию в течение длительного времени. Это общая тема для программистов, которые любят уходить в работу с головой на многие часы, одевают наушники, чтобы ничего не отвлекало, полностью отключаются от внешнего мира и тому подобное — и это также является причиной того, что мы обычно плохо реагируем, когда нас прерывают. Программирование требует концентрации, и похоже, что концентрация давит на клапан системы: требуется какое-то время, чтобы разогреться, и когда это происходит, вы не хотите отключать его, так как повторный запуск является трудной задачей.

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

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

1. Принимай прерывания

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

2. Все время держи контекст вне своей головы

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

2.1. Веди рабочие заметки к текущей задаче

Я — мой собственный летописец. Я все время пишу заметки о том, что я делаю: добавляю комментарии к задаче, часто делаю коммиты и пишу детальные описания (ты ведь используешь распределенную VCS, чтобы было удобно делать частые коммиты, не так ли? ;) ), делаю наброски на (упорядоченных) клочках бумаги. В действительности это не так уж обременительно, и на деле извлечение твоих мыслей из головы часто может помочь тебе прояснить их. Основное правило состоит в том, что примерно каждые 30 минут я должен получать какую-то новую часть контекста, которая сохранена где-то еще кроме моей головы. Если этого не произошло, то в случае прерывания я буду иметь больше проблем, заново собирая контекст в уме. Это не занимает много времени, а также имеет и другие преимущества, такие как запись твоих мыслей и процесса принятия решений.

2.2. Безжалостно игнорируй косвенные вопросы

Ты мог заметить, что в предыдущем пункте я написал «текущая задача» в единственном числе, а не «задачи». Не бывает такого, чтобы было несколько текущих задач. Есть только одна задача, над которой ты работаешь в текущее время, и отвлекающие факторы.

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

Чтобы это работало, нужна быстрая и легкая система для управления задачами, не требующая от тебя дотошности в описании новой задачи. Ты должен открыть ее и закрыть в течение 30 секунд, чтобы выгрузить мысль, не отвлекаясь от текущей задачи. Ты можешь вернуться к ней позже.

2.3. Всегда знай, что ты будешь делать следующим

Это одно из правил GTD («Следующие действия»), но оно очень полезное. Когда ты возвращаешься к работе после перерыва или прерывания, ты не должен тратить время на выяснение того, что тебе нужно сделать следующим. Твоя система задач поможет тебе в этом, в том числе и комментарии, которые, будем надеяться, ты не забыл добавлять к текущей задаче. Если ты был вынужден переключиться между проектами, и при этом повсюду поддерживал внешний контекст, ты не должен иметь проблем с определением следующего действия. Важно иметь только одно следующее действие для каждого проекта. Если их несколько, ты должен будешь потратить время на выбор между ними, а это — зря потраченное время (смотри следующий раздел о приоритетах). В любой момент времени ты должен иметь не только одну текущую задачу, но и одно однозначное следующее действие по этой задаче. Половина проблемы эффективной работы состоит в знании, что ты будешь делать следующим.

3. Расставляй приоритеты наоборот

Я упомянул следующие действия в предыдущем разделе, но как решить что будет следующим? Можно потратить много времени мучаясь с приоритетами, и я искал способ избежать этого. Логичным казалось исходить из предположения, что я хотел бы сделать все из списка, и нужно только определить, какие пункты выполнить первыми. Я обнаружил, что можно сэкономить время на планировании, и в то же время получить более точные приоритеты, инвертировав процесс принятия решения: основываясь на предположении, что я могу не выполнить любую из задач, и оценивая негативные последствия от невыполнения каждой из них. Таким образом, вопрос «Какая из функций А и Б важнее» превращается в «Предположим, мы не реализуем функцию А и Б. К каким последствиям приведет отсутствие каждой из функций?». Это может показаться несущественным различием. Но мой опыт показывает, что необходимость полностью объяснять важность выполнения задачи, вместо определения относительного порядка в предположении, что в конечном итоге все равно все будет сделано, как правило, дает более честные оценки.

4. Признай преимущества перерывов

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

Есть еще немало вещей, о которых я мог бы рассказать, но я думаю, что для начала этого будет достаточно. Я надеюсь, для кого-то это окажется интересным и полезным.
+59
20 октября 2010, 15:32
98

комментарии (26)

+4
alist #
Надо же, два перевода одновременно.

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

Рабочий день выглядит примерно так:

Пришел с утра. Если блокнотик не пуст, выполняем задания по нему. Иначе выбираем задачу, разбиваем ее по пунктам (может оказаться, что что-то где-то надо посмотреть и почитать), а потом заносим пункты в блокнотик и работаем по пунктам. Порядок выполнения не так важен, т.к. обычно блокнот описывает работу часа на три-четыре. Главное — учитывать, что уже сделал, что осталось и над чем работаю в данный момент.

Польза от этого в основном психологическая: легче возвращаться к работе, труднее терять время в инете, да и просто сложно что-то упустить или забыть сделать (у меня это раньше большой проблемой было).
0
raacer #
Спасбо за метод! Я вот все пытался понять, как бы сделать запись действий по задаче необременительными. Листик и карандаш — воистину великие вещи, иногда незаслуженно забытые :) Активно убеждаюсь сейчас в этом.
0
alist #
Ну у меня не всегда это бумажный блокнот — часто я его тоже забываю где-то, тогда просто открываю notepad или gedit и пишу. Основная штука в том, что эти todo листы через несколько часов оказываются выполненными полностью, так что сохранять их не особо нужно. Если какой-то таск сделать не удается, я запись уже в багтреккере делаю.
+2
BlastBeat #
TODO в комментах в коде — вот где сила. Большинство IDE собирают их в опрятный список.
0
addfs #
Мое мнение, что TODO в коде — это ужасная привычка. Во-первых, если проект большой то таких умников с todo комментариями довольно много и листать список даже в ide не так уж и удобно, во-вторых как и обычные комментарии они запросто забываются и спустя какое-то время становятся не только бесполезным, но и опасными т.к. дезинформируют нас.
0
raacer #
А еще для поддержания контекста может быть очень удобным Eclipse Mylyn. Это гораздо больше, чем просто списки задач.
+1
raacer #
От себя хочу добавить к статье:

Использовал Trac и Redmine для управления задачами. При всей моей дотошности, мне все равно было крайне некомфортно отвлекаться от работы, чтобы добавить туда найденный баг или случайно всплывшую в памяти задачу. Сейчас пробую Acunote. Намного легче работать: простой и быстрый интерфейс существенно упрощает взаимодействие с списком задач. И откладывание косвенных задач действительно сделало мой рабочий процесс более легким и приятным.

Отрицательные приоритеты еще не пробовал, но вот мне сейчас понравился метод «Квадрат риск-приоритет» по Мюррею Кантору.
+3
Nicolette #
Безупаречная синхронизация с habrahabr.ru/blogs/arbeit/106523/ :-)
Хабр как таковой на дубли я проверила, прежде чем переводить, а вот песочницу не догадалась…
+1
alist #
Ну поэтому и не стоит тоики минусовать — совпало и совпало. Кому тема интересна, прочтет комментарии и там, и здесь.
+1
raacer #
Да уж… Я еще пол-часа был в ступоре от такого совпадения :)
Не уверен, что у Вас была достаточно времени обнаружить мой пост в песочнице. Там получилась нестандартная ситуация с модерацией. Так что, никто не виноват, просто так совпало :)
–2
Scorpil #
Наконец то я нашел хоть какой-то плюс в курении. Как минимум раз в пару часов выхожу на свежий воздух.

Но даже на перекурах мозг не останавливает попытки решить текущую задачу.
Думаю многим курящим программистам это состояние знакомо.
0
zdanchik #
Как раз в такие моменты лучше мысленно отключиться… Именно в таком режиме мозгу проще всего подойти к проблеме «с другого конца»
+5
Constantine #
В курении нет плюсов — выходить можно и так ;)
0
zdanchik #
Для успешного «быстрого» переключения между задачами так же очень важна хорошая память… Блокнот — вещь полезная. Но он не всегда под рукой ;)
+2
king2 #
Я обычно придерживаюсь таких правил:
1. записать на листике элементарные задачи (например — «сделать форму оплаты», «сделать server-side оплаты», «проверить оплату», «переместить поле поиска», «поставить sphinx», «сделать js на открывание-закрывание поля поиска») — на самом деле там больше пунктов, но они туда выписыааются из емейлов заказчика, записок на переговорах итд, так что после этого этот листочек — полный перечень того что надо сделать, и не надо заглядывать в разные источники, чтобы понять что еще не сделано.
2. расставляю приоритеты, если они имеются. Если их нет, задачи выбираются исходя из примерного свободного времени, если есть много времени — берется задачка побольше, если времени мало — то задачка поменьше, которую я точно успею сделать за отведенное время.
3. То, что я делаю, помечается галочкой, когда сделал — помечается плюсиком. Если я сел за комп и есть галочки — продолжаем с прерванного места (хотя, как правило, стараюсь не отвекаться, пока не завершил микрозадачку).
4. В конце дня по всем пунктам, отмеченным плюсиками, пишется отчет заказчику, незавершенные пункты переписываются на другой листик. Завтра все по новой.

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

Листиков, кстати, по одному на проект + один общий (диспетчер :) — туда пишется список проектов + какие-то дела, требующие время, от похода в магазин до обязательных звонков кому-либо).

Пробовал использовать leadertask — хорошая штуковина для хранения стратегических планов, но в тактическом плане листики РЕАЛЬНО удобнее.

Отсюда, собственно, вывод — стратегические задачи можно хранить где угодно, но иметь микролистики, на которых находятся ТОЛЬКО те задачи (по факту — тактические), которые нужны в данный момент — большое благо за счет своей конечности и хорошей обзорности.
+1
king2 #
Резюмирую — главное, разделить планирование и исполнение. чтобы в тот момент, когда надо кодить — не было вопросов «чем заняться» (и уж совсем точно — чтобы не было вопросов «как это сделать») — чтобы это было УЖЕ известно, предопределено заранее. Тогда мозг не надо напрягать в перпендикурярных плоскостях :)
+1
iexx #
Отличный пост на ночь глядя, спасибо ;)
+1
MpaK999 #
Чтобы войти в состояние «удара» я начинаю программировать с маленькой, какой-нибудь туфтовой задачки, с мелочей. Решив их уже можно браться за большую задачу по todo листу.

По быстрому задачнику, самое простое для PHP программистов делать коммент в phpdoc стиле @todo: и т.п. NetBeans как IDE например выдает все todo'шки в текущем проекте потом их можно и закрывать
0
Nashev #
А у меня файлик Notes.txt в автозагрузке. Постоянно туда что-то дописываю, иногда что-то удаляю. 63 килобайта уже…
0
alex_inside #
Была бы карма, проголосовал бы всеми руками за этот пост!

Я предпочитаю распечатывать TODO список на бумаге и потом его поддерживать и обновлять авторучкой — так всегда более нагляднее.

Список туду обычно очень несвязаный внутри себя и является просто неприоритезированным списком, но тем не менее, он позволяет видеть всю картину — а это освобождает мозг от постоянного обновления информации по другим таскам.

Я хоть и мультизадачный по своей природе, но меня ужасно раздражает на работе делать несколько тасков одновременно. А особенно когда отвлекают. Согласен что нужно отвлекаться — при возвращении к задаче получаешь гараздо большее озарение необходимое для работы.
0
kornerr #
Тоже в этом месяце перевёл данную статью: kornerr.blogspot.com/2010/10/20.html
Причём переводил её как раз небольшими порциями (см. примечание).
Взял у вас несколько трудночитаемых предложений.
Про «клапан системы» не согласен. Перевёл это как «ламповую систему».
Спасибо за перевод :)
0
raacer #
Спасио за комментарий, очень рад критике.

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

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

Про «клапан системы» не согласен с вашим несогласием :) Мне кажется, автор имел в виду, что именна сама система (вместе с нами как чатью системы) препятствует своей остановке. В случае же с лампами, это звучит так, как буд-то мы — просто сторонние наблюдатели, а нам просто как бы не хочется все останавливать. Я бы про себя так не сказал. Если я разогрелся, то я не то что не хочу остановиться, я просто не могу! А если остановился, то мне будет тяжело заставить себя снова начать. Это на подсознательном уровне, я часть системы.
0
kornerr #
Про клапанную систему — не ясно, что это за клапанная система, которая медленно стартует. А про лампы всё ясно — нагреется, потом и заработает :)

При переводе я руководствовался теми же принципами, чтобы по возможности ничего не упустить. Соседний перевод Nicolette как раз был написан как изложение, но мне тоже не нравится, когда выбрасывается много оригинала (особенно такую важную и интересную тему, как многофазный сон).
Статья тоже мне далась с трудом, но результатом я доволен :P
0
raacer #
Ну, рад, что Вы остались довольны своей работой :)
0
raacer #
Ну, рад, что Вы остались довольны своей работой :)
0
raacer #
упс, не туда

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.