Как вы предотвращаете чрезмерно сложные решения или проекты?[закрыто]

StackOverflow https://stackoverflow.com/questions/86308

  •  01-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Заставить кого-то нового взглянуть на это.

Другие советы

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

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

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

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

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

Вот несколько идей, как упростить дизайн:

  • прочтите несколько книг и статей по программированию, а затем применять используйте их в своей работе и пишите код
  • прочитайте много кода (хорошего и плохого), написанного другими людьми (например, проекты с открытым исходным кодом), и научитесь видеть, что работает, а что нет
  • создавайте системы безопасности (модульные тесты), позволяющие проводить эксперименты с вашим кодом
  • используйте систему управления версиями, чтобы включить откат, если эти эксперименты примут неправильный оборот
  • TDD (разработка, основанная на тестировании) и BDD (разработка, ориентированная на поведение)
  • измените свое отношение, спросите, как вы можете сделать так, чтобы "это просто работает". (соглашение о конфигурации могло бы здесь помочь;или спросите, как Apple это сделает)
  • практикуйтесь (как джазовые музыканты - джемуйте с кодом, пробуйте Код Ката)
  • напишите один и тот же код несколько раз, на разных языках, и по прошествии некоторого времени
  • изучайте новые языки с новыми концепциями (если вы используете статический язык, изучайте динамический;если вы используете процедурный язык, изучите функциональный;...) [один язык в год - это примерно нормально]
  • попросите кого-нибудь просмотреть ваш код и активно спрашивайте, как вы можете сделать свой код проще и элегантнее (а потом сделай это)
  • получите годы за плечами, выполняя вышеперечисленные действия (время помогает активному уму).

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

Прочитайте "Эффективная работа с устаревшим кодом" Майкла К.Перья.

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

Используя разработку, основанную на тестировании, и следуя примеру Роберта К.У Мартина Три правила TDD:

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

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

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

Начните с малого это еще одна отличная идея.Вам действительно нужно запихнуть в эту штуку все 10 шаблонов проектирования?Попробуйте сначала сделать это "глупым способом".Не совсем подходит?Ладно, сделай это "чуть менее глупым способом".И т.д.

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

Используйте постный язык. Такие языки, как Java или иногда C ++, иногда, кажется, поощряют неприятные, запутанные решения.Простые вещи, как правило, занимают несколько строк кода, и вам просто нужно использовать 3 внешние библиотеки и большой фреймворк, чтобы управлять всем этим.Рассмотрите возможность использования Python, Ruby и т.д.- если не для вашего проекта, то для какого-то частного использования.Это может измените свое мышление отдавать предпочтение простоте и быть уверенным, что простота возможна.

После того, как вы стали программистом, это неизбежно произойдет.Если вы серьезно недооценили затраченные усилия или столкнулись с проблемой, из-за которой ваше решение просто не работает, тогда прекратите кодирование и поговорите со своим руководителем проекта.Мне всегда нравится брать решения с собой на встречу, проблема в том, что вы можете сделать x, что займет 3 дня, или мы можем попробовать y, что займет 6 дней.Не делай выбор сам.

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

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

Вот пара приемов, которые я нахожу полезными:

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

В том же духе попросите кого-нибудь еще, с кем вы могли бы поделиться идеями.Убедитесь, что вы можете объяснить им, почему такая сложность оправдана!

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

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

Это следует из поста Бендазо "упрощай, пока это не станет легким".

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

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

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

Спросите мнения людей, которые получают удовольствие от чистых и простых решений.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top