Как вы боретесь со сложностью дизайна?[закрыто]

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

Вопрос

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

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

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

Мы все слышали припев:Будь проще, Глупый ™.

Как вы боретесь с чрезмерной сложностью в своей команде?


Один из примеров, с которым мне неоднократно приходилось работать в последнее время, - это когда было принято решение перейти к полностью денормализованному дизайну базы данных, а не к СУБД."потому что так быстрее!" Полностью денормализованные базы данных действительно сложно получить правильно, и они подходят только для действительно специализированных задач с данными, таких как Flickr или ebay, и которые могут быть чрезвычайно дорогостоящими с точки зрения времени разработчика по сравнению с остальной частью вашей разработки.

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

Решение

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

Зачем создавать что-то простое и эффективное, когда это может быть сложным и замечательным?

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

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

Обязательно делитесь любыми идеями, которые у вас есть, с кем-то другим.Часто мы настолько погружаемся в то, чтобы делать все определенным образом, что требуется другая пара глаз, чтобы настроить вас на правильный лад.Было много раз, когда я решал трудные проблемы, имея рядом кого-то другого, кто мог бы сказать: "а мы в самом деле тебе это нужно?" Это помогает упростить мой код.

Что касается общения с людьми, с которыми вы не согласны, Уорд Каннингем прав:

Это был поворотный момент в моей карьере программиста, когда я понял, что мне не обязательно побеждать в каждом споре.Я бы говорил с кем-нибудь о коде и сказал: "Я думаю, лучший способ сделать это - A." А они бы ответили: "Я думаю, лучший способ сделать это - B.Я бы сказал: "Ну нет, на самом деле это A.", А они бы ответили: "Ну, мы хотим сделать B." Это был поворотный момент для меня, когда я мог сказать: "Отлично.Сделай Б.Нам не так уж сильно повредит, если я ошибусь.Нам не так уж сильно повредит, если я окажусь прав, а вы сделаете "Б", потому что мы можем исправлять ошибки.Итак, давайте выясним, не ошибка ли это....Обычно это оказывается C.Это полезный опыт для нас обоих.Если мы принимаем решение без опыта, ни один из нас по-настоящему ничему не учится.Уорд победил, а кто-то другой - нет.Или наоборот.Это слишком напряженная битва.Почему бы не сказать: "Ну, давайте просто закодируем это и посмотрим, что получится.Если это не сработает, мы это изменим"."

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

Я где-то видел эту формулу:

навык = сложность проблемы / сложность решения http://img39.imageshack.us/img39/1586/whatisskill.png

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

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

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

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

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

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

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

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

Это прекрасно - иметь все эзотерические функции, о которых пользователи никогда не узнают и...

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

Один из примеров, с которым мне приходилось работать неоднократно в последнее время, - это когда было принято решение перейти к полностью денормализованному дизайну базы данных, а не к СУБД."потому что так быстрее!"

В этом случае может происходить несколько вещей.Один из них заключается в том, что вы можете ошибаться, и эти люди действительно могут знать, что говорят, потому что они работали с очень похожими примерами.Другое дело, что они могут быть неправильными, т.е.их дизайн не дает тех преимуществ в скорости, на которые они претендуют.В этом случае могут возникнуть две разные ситуации:(1) Они придают скорости слишком большое значение в своей конструкции, или (2) скорость действительно важна.Если скорость действительно так важна, команда не должна полагаться только на предположения - они должны попробовать разные прототипы и оценить их скорость на критических путях.Вы не строите автомобиль Формулы-1 каким-то одним способом только "потому, что он быстрее", вместо этого вы продолжаете пробовать несколько альтернативных дизайнерских решений и выбираете самое быстрое, которое при этом не слишком увеличивает расходы на обслуживание.

Иногда вы можете поспорить с этим и прийти к соглашению, иногда нет.Это жизнь.

Но все же последнее слово. Ты этого не делаешь сражаться сложность.Ты лечишь это. Вы определяете действительно важные вещи и действуете соответственно.

Я предполагаю, что вы имеете в виду "полностью денормализованный дизайн базы данных, а не нормализованную модель (например, третьей или четвертой нормальной формы)", потому что реляционная модель управляется СУБД независимо от того, насколько она нормализована.

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

Я боюсь, что ваше предостережение от ПОЦЕЛУЯ может не сработать в данном случае, потому что одна большая денормализованная таблица может быть защищена как самая простая вещь из возможных.

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

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

"Твердые мнения, которых легко придерживаться" должны быть вашим девизом.

Иногда технический момент не стоит того, чтобы оттолкнуть всю вашу команду.Иногда так и есть.Твой звонок.

Ты сражаешься чей-то еще чрезмерный дизайн / изменение функциональности несколькими способами:

  1. Запрашивайте приоритет функции, основываясь на реальных требованиях пользователя.Смоделируйте функции для альфа- и бета-тестеров и спросите, готовы ли они обменять на это N месяцев задержки.

  2. Агрессивный рефакторинг, чтобы избежать специальной оболочки.Разбивайте код на уровни или модульные компоненты, когда это уместно.Найдите баланс между "сейчас работает просто отлично" и "легко расширить позже".

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

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

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

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

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

(числа являются полуслучайными и могут отличаться в зависимости от других факторов)

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

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

Лично я многое делал легким путем и многое - трудным, и я никогда не бываю счастлив, когда выбираю что-то легкое, а не трудное.Теперь я научился таким трюкам, как "никогда не передавайте коллекцию naked по кругу, всегда упаковывайте ее в бизнес-класс".

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

Решение должно быть не более сложным, чем сама проблема.

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

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

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

Не пытайтесь делать все сразу.Разбейте каждую проблему / поручение на управляемые фрагменты.Затем расставьте приоритеты, помня о KISS и YAGNI.Это поможет вам сосредоточиться на создании того, что вы хотите потребность.Если вы все сделали правильно, у вас будет хорошая основа, которую вы сможете дополнить позже, при наличии времени, денег, ресурсов и вдохновения.

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