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


61

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

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

Что я должен сделать, чтобы бороться с этой проблемой?



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

Ответы:


35

Два простых правила:

  1. Сделайте самое простое, что может сработать.
  2. Рефакторинг постоянно.

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

Помните, что проверка будущего означает облегчение изменения кода, а не попытки предвидеть все возможные пути изменения кода.


4
Непрерывный рефакторинг целесообразен, только если у вас есть хорошее тестовое покрытие. Поэтому я бы сказал: «Напишите модульный тест. Затем выполните простейшую вещь, чтобы пройти тест. Рефакторинг. Повторите».
Кевин Клайн

Определенно согласен. «Красный, зеленый, рефакторинг» - это путь.
Рейн Хенрикс

5
Прекрасный маленький кусочек из справочника по XP, но на самом деле не очень хороший совет, если вырваться из контекста.
Аарона

2
Вне контекста, это буквально эквивалентно ковбойскому кодированию. Видишь, Фаулер - это мертвый дизайн? который предостерегает против принципов выбора вишни от XP и подобных методологий. Возможно, вы превосходный дизайнер и программист, и по сути и неявно способны и мотивированы поддерживать концептуальную целостность при рефакторинге, но большинство программистов этого не делают, и давать им этот совет вне контекста безответственно (хотя все они любят это слышать, поскольку это значит меньше работы для них).
Ааронаут

1
«Делай самое простое, что может сработать», не требует дополнительного контекста. Рефакторинг делает, но как тот, кто не знает контекста, узнает, как рефакторинг, но изучая контекст?
Рейн Хенрикс

9

Обычно, когда я так чувствую, мне нужно попробовать:

  1. Встаньте, прогуляйтесь и убедитесь, что вся биология работает нормально.
  2. Подойдите к доске и нарисуйте, пока у меня не появится чувство уверенности.
  3. Найдите «приятеля по проектным жалобам», с которым вы можете просто обсудить проблему.

Если проблема связана с синтаксисом и небольшими кусочками, то:

  1. Удовлетворите себя тем, что, даже если это некрасиво, оно где-то красиво заключено в капсулу и представляет собой чисто местный вид разлуки.
  2. Добавьте маркеры TODO или просто комментарии, которые объясняют, почему код вызывает ошибки.
  3. Переходите к следующему заданию.

+1 для первого и второго # 2. Рисование рамок, линий, маркировка и получение больших картинок обычно помогает мне выбрать один из вариантов. Если у вас есть хороший анализатор кода, который отслеживает задачи (Hudson может отслеживать TODO и отображать их в ваших сборках), вы можете легко отслеживать вещи, которые вам не нравятся.
Рэнди

5

Очень легко думать о себе как о бездействии. Даже если вам удастся как-то найти лучшее решение прямо сейчас, которое может легко измениться до завершения проекта, и что потом?

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


Я знаю об этом, но мне все еще трудно выбрать какой-либо один вариант.
Энн Нонимус

@anne: Лучше сделать что-то конструктивное сразу, чем правильно делать слишком поздно. Единственная вещь, которая наверняка будет неправильной, это ничего не делать.
Satanicpuppy

4

Я также учусь избегать паралича анализа, так что слава нам =) Это часто случается, потому что мы хотим сделать «лучший дизайн». На самом деле, «лучшее» находится в глазах смотрящего . Моя формула, чтобы избежать анализа паралича, заключается в применении достаточно хорошего принципа проектирования . Как мне это сделать? Я привожу переменные, такие как временные ограничения, планирую и спрашиваю себя, каков самый простой дизайн, который может выполнить работу (это не означает самый простой) без ущерба для качества, но в то же время я проверяю, что это тестируемый и открыты для расширения закрытого для модификации (ОСР)дизайн, а также. Что я подразумеваю под тестируемым и OCP? Ну, вместо того, чтобы искать то, что я считал лучшим, я подумал о дизайне, который может сказать мне, когда дела идут плохо, и попытаться сделать достаточно кода, который позволит мне реорганизовать и улучшить позже. Кроме того, попробуйте отделить код, который будет меняться, с кодом, который останется прежним. Рефакторинг становится проще, потому что код, который не должен изменяться, защищен от вашего будущего, вас или кого-то еще.


2

Как насчет того, чтобы позволить вашему внутреннему чувству выбрать один из вариантов? Это должно происходить довольно быстро и хорошо сочетаться с таймбоксингом , который также предложил ammoQ . Вы можете попробовать ограничить 1 минуту, если параметры уже установлены, или 2 минуты, если вам нужно определить их в первую очередь. Или то, что кажется подходящим (определено заранее). Когда вы научитесь слушать свой внутренний инстинкт, ваш интуитивный выбор станет быстрее и лучше с практикой .

Если вас беспокоит возможность выбора не идеально, вот несколько советов по этому вопросу:

  • Если бы был вариант с четким преимуществом над остальными, вы бы не спросили себя, какой из них выбрать. Таким образом, по этой причине всякий раз, когда вы не решаетесь на какой-то выбор по не слишком сложному вопросу, это указывает на то, что варианты в целом совершенно равны; так что не так много потерять , просто выбирая какой - либо одной из них.
  • При этом интуиция вовсе не случайна, а является довольно хорошим, обоснованным предположением об оптимальном решении. Часто лучше, чем то, что можно придумать через бесконечные рыться.
  • Удовлетворяя перфекционизм, можно было бы оценить скорость принятия решения выше, чем оптимальность выбора при полусознательной оценке своей работы. Что имеет смысл с неважными вариантами выбора, но не является тривиальным в виду.

Удачи! :)


2

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


1

Чтобы преодолеть ваше нежелание принимать решения, примените timeboxing : установите будильник на несколько минут; До этого мучайте свой разум, но когда сработает будильник, выберите лучший вариант, который вы нашли до этого.


3
И тогда он может часами мучиться с тем, как долго должен быть установлен будильник! :)
Джордан

1
Джордан: Есть несколько возможных решений этой проблемы. К сожалению, я не могу решить, какой из них предложить.
user281377

0

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

После того, как вы его создали и выбросили, я был бы готов поспорить, что вам будет легче принимать эти решения.


Вы никогда не должны выбрасывать прототип, потому что, возможно, вы сможете расширить его позже, когда добавите функцию. Или, может быть, вам нужно проверить ошибку с SSCCE. Я всегда контролирую все мои прототипы в отдельном месте.
maple_shaft

2
Я думаю, что идея «выбрасывать» заключается не в том, что вы теряете данные, а в том, что вы не должны использовать прототипы в качестве основы для программы, поскольку весь смысл прототипов заключается в том, чтобы экспериментировать со свободой совершать ошибки.
Дариен

Прототип в ветке, проведите необходимое тестирование и создайте чистую версию в ядре.
zzzzBov

0

Я тоже страдаю от этой проблемы. Я бы сказал, что у вас недостаточно стимулов для завершения.

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

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


0

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

Проблема с такими умственными проблемами заключается в том, что их нелегко решить, они являются частью вас, и, очевидно, вы заботитесь (возможно, слишком) о своей работе, не имеете уверенности, чтобы согласиться с собой, слишком неопытный, чтобы подумать, что ты первый выбор был правильным с самого начала, или слишком много стресса, чтобы сделать его совершенно правильным. Зачем еще беспокоиться о таких мелочах ?!

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

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

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

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


программирование фрагментов кода - худший вид плохой практики
Нил Баттерворт

@Neil: Использование фрагментов других людей для программирования фрагментов, а также незнание того, что они делают, - плохая практика. Использование собственных фрагментов кода, как правило, хорошо, так как вполне вероятно, что вы понимаете, что написали. Если нет, то, вероятно, у вас нет надежды.
Джордан

@ Нил, у тебя сегодня особенно плохое настроение! В любом случае, у большинства старших программистов есть огромная библиотека фрагментов кода, вы просто не замечаете, что используете их. Для младших, записывая их помогает им построить это.
gbjbaanb

0

Вот стратегия, которая объединяет предложения Рейна Хенрихса ( начните с простого, рефакторинг ) и ammoQ ( timeboxing ):

  1. Дайте себе довольно строгий срок для первого решения, которое просто работает. Например, 30 секунд для имени переменной. Вы могли бы сначала придумать что-то вроде x, затем усовершенствовать это string, затем, nameпока время не истекло.
  2. Затем перейдите к другим задачам в течение определенного времени, например, 10 минут.
  3. Только тогда предоставьте себе еще одну возможность для дальнейшего улучшения своего решения, например,userHandle

Возможные преимущества этого подхода:

  • знание того, что мы вернемся к этому позже, может облегчить решение проблемы на данный момент
  • продолжая другие задачи, вы можете просто найти хорошее удовлетворительное решение, не занимая много времени в поисках
  • отпустив после шага 1 и находясь в процессе шага 2 , может быть легко сохранить шаг 3 действительно быстрым, поскольку вы хотите продолжить с шага 2, и, таким образом, счастливо просто выбрать одно достойное решение и принять его

Этот ответ кажется более конкретным и полным, чем ваш предыдущий , но оба они, кажется, охватывают одну и ту же тему. Пожалуйста, объедините их в один или выберите тот, который вы хотели бы сохранить.
Адам Лир

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

0

Когда я провёл исследование и у меня не осталось чёткого выбора, я даю себе время (обычно 5 минут), чтобы выбрать одно, а затем просто продвигаюсь вперед. Даже когда вы сталкиваетесь с препятствиями, на данный момент нет никакой гарантии, что вы бы не наткнулись на равное препятствие, приняв другое решение. Я не могу вспомнить время, когда я пожалел о своем решении.


0

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

В случае а) Установите срок, чтобы придумать разумные варианты для рассмотрения. Не решайте, какой еще. В конце времени выберите один (случайным образом, если нет явного предпочтения) из указанных опций и другое ограничение по времени. Если в конце времени не будет принято четкое решение, то оно уже выбрано. Начните кодирование и рефакторинг, если вы явно ошиблись. Если босс спросит почему, скажите: «Я подбросил монетку, у вас есть лучший способ?»

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


0

Зачастую лучшим решением является попытка объяснить свое решение коллеге. Однако, поскольку вы не хотите делать это очень часто, следующая лучшая вещь - думать на бумаге - либо с помощью бумаги / ручки, либо с пустым окном блокнота.

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

Сформулируйте проблему, затем укажите возможные решения, что хорошего в каждом из них и т. Д.

Хотя это не всегда работает, процесс вывода мыслей из вашей головы (ОЗУ) на внешний носитель (документ блокнота) дает вам больше свободы для создания новых подключений и просмотра решения с разных точек зрения.


0

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

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

TLDR; Выберите разумное решение, улучшайте его по мере продвижения.

Это также актуально:

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

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

от http://www.codinghorror.com/blog/2008/08/quantity-always-trumps-quality.html .


-8

Я никогда этого не понимал. Когда я был инструктором, я бы сказал что-то вроде:

"OK, create an integer variable and assign the return value of strlen() to it."

Можно подумать, не слишком сложно, и 95% людей написали что-то вроде:

int x;   // or y, or len, or whatever
x = strlen( s );

Но иногда был тот, кто сидел, как кролик, парализованный в свете фар. Я бы сочувственно спросил, в чем проблема, и они сказали бы: «Я не знаю, как это назвать!».

Это люди, которые должны искать другую карьеру. Как и ты должен.


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

3
И почему я должен искать другую карьеру, потому что мне трудно назвать некоторые вещи? Не каждая концепция имеет четкое, краткое отображение на естественный язык.
Энн Нонимус

2
@Anne Мне кажется, что ваш первоначальный вопрос заключается в том, что у вас возникают проблемы с тем, что естественно для хороших программистов. В этом нет ничего постыдного - большинство людей (даже большинство программистов!) Ужасно делают такие вещи. Тем не менее, предполагая, что, как и я, вы можете быть только счастливы, делая то, что у вас действительно хорошо получается, я предположил, что программирование может быть не тем, для чего вы созданы. Я провел первые 10 лет своей взрослой жизни в качестве микробиолога. Я был не очень хорош в этом, и был намного счастливее, когда я стал программистом.
Нил Баттерворт

3
Дружеское напоминание всем: если вы не согласны с ответом, не стесняйтесь использовать понижающие голоса, чтобы выразить это. Личные атаки с любой стороны будут удалены.
Адам Лир

3
В конечном счете, я чувствую, что ответ звучит довольно резко, но комментарии заставляют меня чувствовать, что это не так резко. Возможно , вам следует изменить , что в.
DeadMG
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.