Является ли DRY врагом управления программными проектами?

83

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

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

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

Если вместо этого вы применяете принцип СУХОЙ и пытаетесь найти абстракцию, которая более или менее устраняет дублирующийся код, все иначе. Обычно есть много возможностей, вы должны принимать решения, заниматься исследованиями, быть творческими. Вы можете найти лучшее решение в более короткие сроки, но вы также можете потерпеть неудачу. Большую часть времени вы не можете сказать, сколько осталось работы. Вы худший кошмар менеджера проекта.

Конечно, я преувеличиваю, но, очевидно, возникает дилемма. Мои вопросы: по каким критериям решить, если разработчик переусердствовал с СУХОЙ? Как мы можем найти хороший компромисс? Или есть способ полностью преодолеть эту дилемму, а не просто найти компромисс?

Примечание: этот вопрос основан на той же идее, что и мой предыдущий, « Объем рутинной работы в разработке программного обеспечения и его влияние на оценку» , но я думаю, что это проясняет мою точку зрения, извините за повторение :).

Фрэнк Пуффер
источник
96
Дайте нам знать, что чувствуют ваши сотрудники по управлению проектами, когда приходит время что-то выследить, изменить и протестировать во всех 100 экземплярах, которые были скопированы и вставлены. И не забывайте дополнительное время, которое будет потрачено на выяснение причин его поломки, потому что только 98 из них действительно изменились.
Blrfl
16
@Blrfl, с другой стороны, преждевременное высыхание кода до того, как станет понятна хорошая абстракция, также может реально снизить производительность, так как разделяемая абстракция - это общая зависимость. Между прочим, я не согласен, просто указываю на то, что баланс определенно должен быть найден.
GoatInTheMachine
16
Принцип, который мешает DRY выйти из-под контроля, - это принцип YAGNI (он вам не понадобится) .
Филипп
88
Здесь нет дилеммы. Если менеджер проекта хочет, чтобы вы выполняли много лишней ручной работы, потому что это легко оценить, тогда очевидное решение - уволить менеджера проекта.
JacquesB
10
Если вы повторяете себя, то вам все равно придется выполнять всю эту трудную для оценки работу , а также какую-то дополнительную бессмысленную работу. Так как это поможет проекту?
user253751

Ответы:

134

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

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

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

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

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

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

JacquesB
источник
21
Я полностью согласен с вашими утверждениями здесь, но я думаю, что следует отметить, что есть много паршивых менеджеров проектов, которые действительно предпочитают предсказуемость, а не скорость или качество. Большинство людей, у которых нет подготовки по управлению проектами, узнают то, что они знают об этом, из того, что они видели, и мой опыт заключается в том, что менеджеров проектов, которые могут спокойно и рационально справляться с неопределенностью, мало и они далеко друг от друга.
JimmyJames
5
@FrankPuffer Я был там. Как много времени это займет? Одним из вариантов здесь является предоставление диапазона. Читайте о PERT специально по 3-балльным оценкам, потому что они должны знать об этом уже. Процент завершен? Это самое раздражающее. Попробуйте игнорировать это, но если вы не можете вспомнить, что это процентное время, а не процент кодированных строк или что-то еще. То, что они действительно хотят знать, - Когда это будет закончено? С самого начала делайте консервативные прогнозы по каждой задаче и уточняйте их по мере выполнения. Ожидание до последней минуты, чтобы сказать вам больше времени, сделает людей сумасшедшими.
JimmyJames
11
Как много времени это займет? Я на 60% уверен, что мы можем закончить его к х, но есть 10% -ный шанс, что это займет в пять раз больше времени.
Дэвид
18
@ Дэвид: Это вероятно свело бы с ума премьер-министра, потому что он знает из опыта, что этот 10% -ый шанс фактически случается 80% случаев :)
Фрэнк Пэффер
7
Реальность такова, что многие места хотели бы отследить проект до основания, а затем неожиданно преуспеть. Премьер-министры часто получают вознаграждение за точные прогнозы, поэтому у них есть извращенные стимулы. Это проблема главного агента .
Сани
39

Вы правы - копирование-вставка прекрасно работает, и DRY не имеет смысла, когда ваша задача - создать программу, для которой ни копируемый шаблон, ни копия не будут нуждаться в поддержке или развитии в будущем. Когда эти два программных компонента имеют совершенно разный жизненный цикл, объединение их вместе путем рефакторинга общего кода в общую библиотеку, которая сама находится в стадии интенсивной разработки, может действительно иметь непредсказуемые последствия для усилий. С другой стороны, при копировании разделов кода внутри одной программы или программной системы все эти части обычно имеют одинаковый жизненный цикл. Ниже я проиллюстрирую, что это значит для СУХОГО и управления проектами.

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

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

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

пример

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

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

Разработчик, который получает эту задачу, создает первое (допустим, что это занимает 3 дня), после того, как некоторые изменения или незначительные исправления ошибок из-за QA и проверки клиентов завершены, кажется, что все работает нормально. Затем он начал создавать следующий отчет, вставив копию и изменив все, затем следующий, и для каждого нового отчета ему нужно в среднем ~ 1 день. Очень предсказуемо, на первый взгляд ...

Теперь, после того, как 100 отчетов «готовы», программа переходит в реальное производство, и возникают некоторые проблемы, которые были упущены во время QA. Может быть, есть проблемы с производительностью, может быть, отчеты сбои на регулярной основе, может быть, другие вещи не работают, как задумано Теперь, когда был применен принцип СУХОГО, 90% этих проблем можно было бы решить, изменив кодовую базу в одном месте. Но благодаря подходу копирования и вставки, проблема должна решаться 100 раз, а не один раз. И из-за изменений, уже внесенных из одного отчета в другой, разработчик не может быстро скопировать и вставить исправление для первого отчета в другой 99. Он должен просмотреть все 100 отчетов, прочитать их, перевести изменение в измененный сообщите, протестируйте и, возможно, отладьте каждый из них в отдельности. Для ПМ, это начинает становиться действительно трудным - он, конечно, может потратить время на «обычное» исправление ошибки (скажем, 3 часа) и умножить это на 100, но на самом деле, это, скорее всего, неправильная оценка, некоторые из исправлений могут быть легче сделать, чем другие, другие могут быть сложнее. И даже если эта оценка верна, затраты на отладку в 100 раз больше, чем нужно, обойдутся вашей компании в большие деньги.

То же самое произойдет в следующий раз, когда клиент попросит изменить цвет эмблемы своей компании во всех этих отчетах, настроить размер страницы или установить какое-либо другое новое требование, которое аналогичным образом влияет на все отчеты. Таким образом, если это произойдет, вы можете сделать оценку затрат и выставить счет клиенту в 100 раз дороже, чем он должен был заплатить, если код был СУХИМ. Однако попробуйте сделать это несколько раз, и тогда клиент отменит проект, потому что он, вероятно, не захочет оплачивать ваши непомерные затраты на развитие. И, возможно, в этот момент кто-то задаст вопрос, почему это произошло, и покажет пальцем на человека, который принял решение для этого программирования копирования-вставки.

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

Док Браун
источник
4
Вероятно, хороший ответ, но слишком многословный по сравнению с другими хорошими ответами.
Винс О'Салливан
4
Вы можете игнорировать DRY, когда «копию не нужно будет обслуживать или развивать в будущем», но код, который никогда не будет использоваться снова, часто в любом случае снова начинает использоваться.
Энди Лестер
"копипаста прекрасно работает ..." - не согласен! Даже если программа одноразовая и гарантированно никогда не выйдет за пределы первоначального выпуска, код копирования-вставки все равно делает ее намного более трудоемкой и рискует исправить ошибки, обнаруженные при разработке первоначальной версии программы. Если вы никогда не делаете ошибок, в этом случае вы Бог.
JacquesB
1
@JacquesB: вы должны прочитать мой ответ более внимательно, я не написал что-то другое.
Док Браун
Компьютерное программирование просто отличается от создания одинаковых машин с конвейера. Да. Кто бы мог подумать? Может быть, у нас должны быть программисты, работающие в качестве руководителей. Но тогда нам понадобятся программисты как менеджеры. Программисты как акционеры. Программисты как клиенты ... Стреляй, просто научи всех программировать и с этим покончить. (Другими словами: неспециалисты никогда не поймут превратностей, известных экспертам.)
19

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

Ваше базовое утверждение неверно.

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

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

Telastyn
источник
2
Я бы сказал, что большинство инженерных профессий - это «делать что-то новое каждый день»
BlueRaja - Дэнни Пфлугхофт
12
@ BlueRaja-DannyPflughoeft: Не совсем. Поработав инженером-электронщиком / электриком, я могу засвидетельствовать, что большинство крупных инженерных профессий (те проекты, которые требуют ввода в эксплуатацию, например, строительство кораблей и силовых установок) - это обеспечение того, чтобы люди, которые что-то делали, испытывали и испытывали это правильно. Это то, что бизнес считает "инжинирингом". Создание чего-то нового - это «R & D»
slebetman
3
@slebetman Может быть, вы просто не заметили всю работу, которую делал ваш менеджмент; даже когда вы делаете одно и то же снова и снова, окружающая среда каждый раз меняется - у вас нет шаблона электростанции, который вы можете просто доставить клиенту и покончить с этим, вам нужно провести съемку, выяснить, как снабжать завод сырьем и вывозить продукцию обратно, управлять всем сырьем для строительства, решать проблемы с поставками, нехватку работы и миллион других вещей. Это похоже на работу с шаблонами (как это делают многие программисты), но на самом деле это не так.
Luaan
1
@Luaan: Да, но ничего из этого не делает что-то новое. Все они «делают то, что мы знаем, как делать». Разработка программного обеспечения отличается. Прежде всего потому, что в программном обеспечении, в отличие от проектов в области физической инженерии, мы склонны заключать в библиотеки то, что мы уже знаем, как это делать, поэтому нам не нужно вручную «проводить съемку» и т. Д. Мы просто импортировали бы библиотеку для этого и использовали бы ее ,
slebetman
2
@slebetman Почти все написанное программное обеспечение - это «то, что мы знаем, как делать». Библиотеки также живут в среде, которая всегда меняется. И у вас нет 100% знаний и опыта со всей библиотекой, со всеми зависимостями этой библиотеки и других ваших зависимостей, и есть множество странных систем и конфигураций оборудования, которые просто отказываются работать так, как должна делать разумная система. работай. Инкапсуляция отличная, но все равно дорогая и требует тонны съемок. И у инженерии тоже есть инкапсуляция - сборные блоки, микросхемы и т. Д.
Luaan
12

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

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

Кевин Клайн
источник
Он думает, что это лучший мозг, а не лучшая технология. Технология приходит из мозга, верно? Что случилось с «Думай умнее, а не сложнее»?
10

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

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

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

Так что делать? Код для статус-кво (в конце концов, YAGNI ). В то время как код должен быть написан для простоты модификации, написание целого ряда наворотов для чего-то, что может не понадобиться, - это просто сжигание денег.

Робби Ди
источник
6
Обратите внимание, что это означает, что вы должны прокомментировать, что вы скопировали код (в обоих местах), так что вы не должны знать, собираетесь ли вы копировать его снова!
Марк Херд
3
Я сделал это в случае, когда двум классам требовался один и тот же метод, но они были едва связаны - вроде как дальние родственники. Я должен был бы добавить зависимости почти к дюжине классов, чтобы они действительно разделяли код. Так что мне понравилось то, что предложил Марк - скопировал метод и оставил большой, очевидный комментарий, в котором указано другое место для этого метода.
Jeutnarg
@MarkHurd Да - отличный момент ...
Робби Ди
8

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

Я думаю, что другая проблема заключается в том, что вы принимаете DRY, концепцию, касающуюся повторения информации, и пытаетесь применить ее для управления задачами. DRY просто говорит, что у вас должно быть только одно официальное представление информации. Менеджеры проектов должны принять это, поскольку это означает, что каждый будет знать, куда обращаться за информацией, сообщать об изменениях будет легко, а изменениями можно будет контролировать и управлять ими. СУХОЙ, используя многократно используемые части, помогает снизить долгосрочные затраты, помогает поддерживать долгосрочные графики и улучшать качество - три части к треугольнику управления проектами . Требуются определенные затраты времени и денег, чтобы эффективно сделать вещи СУХОЙ, но работа менеджера проекта заключается в том, чтобы найти компромисс между временем, стоимостью, графиком и качеством.

Томас Оуэнс
источник
Конечно, разработка программного обеспечения - это работа знаний. На самом деле я даже не считаю, что мой первый пример (копирование / вставка) в строгом смысле является разработкой программного обеспечения. Тем не менее, управлять этим типом работы гораздо сложнее, поэтому премьер-министр, даже если он имеет опыт разработки и знает все это, в своей роли премьер-министра он склонен игнорировать это. (Я не говорю, что это хорошо, это то, что я наблюдал много раз. Я также не думаю, что эти менеджеры глупы или некомпетентны. Это больше похоже на роль, которая иногда заставляет их вести себя так. )
Фрэнк Пуффер
3
@FrankPuffer Я не согласен с тем, что роль руководителя проекта заставляет человека принимать конкретные решения. Это скорее образовательная или организационная сила. Из того, что я видел, большая часть обучения управлению проектами фокусируется на более традиционных методах управления проектами (вероятно, потому, что они чаще применимы к большему количеству проектов), чем на методах управления проектами программного обеспечения. Это может сказаться на организациях, которые ожидают этого и не обращают внимания на другие методы управления проектами работы с знаниями, такими как разработка программного обеспечения.
Томас Оуэнс
2
@FrankPuffer Конечно, это сложнее, но это обеспечивает большую ценность. Если начальник вашего босса достаточно умен, он избавится от менеджера, который пытается «облегчить себе жизнь», и найдет кого-то, кто действительно сможет выполнять свою работу. Не поймите меня неправильно, если упрощение создает ценность, продолжайте в том же духе - но в том, что вы описываете, это почти наверняка наносит ущерб конечной ценности.
Luaan
4

Написание нового кода - это лишь небольшая часть задачи.

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

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

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

Петерис
источник
Неплохо подмечено. Однако СУХОЙ или аналогичные принципы также применяются к другим задачам, таким как тестирование или интеграция. Большинство вещей может быть сделано механическим способом, без особого размышления или более разумными способами. Интеллектуальные решения часто намного быстрее, но они сопряжены с риском отказа. Кроме того, вы должны приложить немало усилий, чтобы получить какой-либо результат.
Фрэнк Пуффер
Нет «риска неудачи», есть определенность неудачи. Все рухнет рано или поздно. Вы просто выбираете, насколько дорогой катафалк и как быстро вы едете.
4

СУХОЙ полезна, но она также завышена. Некоторые люди могут зайти слишком далеко. Многие разработчики не могут понять, что всякий раз, когда вы внедряете DRY для использования одного и того же метода для двух (слегка) разных целей, вы вводите своего рода очень тесную связь между различными видами использования. Теперь каждый раз, когда вы меняете код для первого варианта использования, вы также должны проверять, регрессирует ли он для второго варианта использования. Если это широко независимые варианты использования, то очень сомнительно, должны ли они быть тесно связаны - вероятно, не должно быть.

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

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

РЕДАКТИРОВАТЬ: за комментарий, я согласен, однако, что, поскольку это облегчает оценку времени разработки, избегая DRY может иногда уменьшить количество неопределенности. Но я полагаю, что это незначительная проблема в связи с более насущными вопросами: (1) как долго будут соблюдаться требования бизнеса, (2) какая техническая задолженность берется на вооружение в процессе, и (3) риски для общей стоимости право собственности на архитектурный выбор - делать ли СУХОЙ или нет во многих случаях - это выбор дизайна, который должен основываться больше на риске / вознаграждении за эти факторы, чем на том, облегчает ли это предоставление менеджерам проектов более точной информации ,

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

Я думаю, что вы неправильно понимаете СУХОЙ.

Давайте использовать пример:

public Class A
{
    public int Multiply(int x, int y)
    {
        return x * y;
    }
}

public Class B
{
    public int Multiply(int x, int y)
    {
        return x * y;
    }

    public int Add(int x, int y)
    {
        return x + y;
    }
}

против

public Class C : A
{
    public int Add(int x, int y)
    {
        return x + y;
    }
}

Заменив класс B на C, мы следовали принципу DRY и сократили дублирование кода. Но мы не увеличили неизвестность или риск для проекта (если вы никогда не делали наследование раньше).

Я думаю, что вы имеете в виду, когда говорите о «СУХОЙ», что-то вроде дизайнерской задачи. То есть:

public Class A
{
    public int Multiply(int x, int y)
    {
        return x * y;
    }
}

!!! Новое требование! Некоторые клиенты должны иметь возможность умножать удвоения !!

// Use class B for new clients!!
public Class B
{
    public int Multiply(double x, double y)
    {
        return x * y;
    }
}

против

public Class A // Version 2
{
    public int Multiply(int x, int y)
    {
        return Multiply(x as double, y as double);
    }

    public int Multiply(double x, double y)
    {
        return x * y;
    }
}

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

Итак, мы должны взять B или A версию 2 в этом случае?

  • B будет более конкретным для фактического запрашиваемого изменения с меньшим количеством побочных эффектов и будет легче оценить и быстрее сделать.

  • Версия 2 приведет к уменьшению общего объема кода и станет более элегантным решением.

Я снова скажу, что все сводится к качеству спецификации и требованиям.

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

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

Ewan
источник
7
Я не согласна Наследование - это не то, что вы делаете один раз, а затем осваиваете. Есть много подводных камней. Есть причины, по которым композиция должна быть предпочтительнее наследования. Итак, мы должны принять решение: наследование? Сочинение? Что-то другое? Это решение, вероятно, будет трудным в реальном мире. Во втором примере также есть много альтернатив. Как насчет дженериков / шаблонов? Может быть, какой-то функциональный подход с использованием лямбд? Опять же: множество возможностей, каждая из которых будет иметь конкретные последствия.
Фрэнк Пуффер
4
Дело в том, что в первом примере вы буквально удаляете дублирующийся код любым методом. но точно такой же код выполняется в любом случае. Таким образом, функциональность не меняется. Во втором примере вы меняете подход к чему-то, что, как вы надеетесь, функционально эквивалентно, но на самом деле другой код
Ewan
1
Я был в ситуации, когда ваш «экстренный запрос» был нормой. Компания, в которой я работал, создала индивидуальные системы данных для множества разных клиентов. Сначала они создали одну систему с Cobol, затем скопировали ее для следующего клиента и т. Д., Пока у них не было 100 клиентов. Теперь у них была работа, которая пыталась вносить систематические улучшения и обновления. Я работал над системой, которая могла воспроизводить поведение большинства из этих систем, используя единый набор исходного кода, но настройки сохранялись в данных конфигурации. Мы не могли сделать все, и некоторые вещи не могли быть добавлены.
1

Абзац за абзацем

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

Верный.

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

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

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

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

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

Если вместо этого вы применяете принцип СУХОЙ и пытаетесь найти абстракцию, которая более или менее устраняет дублирующийся код, все иначе. Обычно есть много возможностей, вы должны принимать решения, заниматься исследованиями, быть творческими. Вы можете найти лучшее решение в более короткие сроки, но вы также можете потерпеть неудачу. Большую часть времени вы не можете сказать, сколько осталось работы. Вы худший кошмар менеджера проекта.

Удаление дубликатов приводит к единой точке отказа. Если что-то не получается, вы можете быть уверены, где это произойдет. SOLID и Design Patterns помогут решить именно эту проблему. Слишком короткие сроки имеют тенденцию провоцировать процессуальный стиль «кодирования». Больше времени, потраченного на один проект, чтобы создать что-то многократно используемое, означает, что в следующем проекте должно быть минимальное количество времени, затрачиваемое на повторное использование функции, но она должна быть настраиваемой в первую очередь.

Конечно, я преувеличиваю, но, очевидно, возникает дилемма. Мои вопросы: по каким критериям решить, если разработчик переусердствовал с СУХОЙ? Как мы можем найти хороший компромисс? Или есть способ полностью преодолеть эту дилемму, а не просто найти компромисс?

Многие люди указали, что здесь нет дилеммы. И да и нет.

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

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

Bakudan
источник
Реализуйте что-нибудь простым и быстрым способом сейчас, потому что это было запрошено. Позже, когда нужен сложный путь, первоначальные усилия напрасны, придется начинать сначала. Менеджеру это не нравится. Как будто вы сказали: «Время, проведенное за рулем на запад, было бесполезно, если теперь нам нужно идти на восток». Но первый раз обойти весь мир, просто чтобы мы могли идти на восток, тоже потраченное время.
1

речь идет вовсе не о проектировании для повторного использования в будущем или о принципе YAGNI. Речь идет о повторении кода в текущем рабочем пакете.

Это абсолютно о дизайне. Возможно не повторное использование как таковое, но, тем не менее, дизайн.

Каковы критерии, чтобы решить, переусердствует ли разработчик с СУХОЙ?

Опыт и ваше существующее окружение / ситуация. Для данной проблемы вы получите сильное понимание принципа Прадо, когда будете пытаться достичь большей степени СУХИ. Тогда вдруг соображения управления вступают в игру. Время, цели, заказчик, управление долгосрочным кодом (кто-то сказал технический долг ) и т. Д. Сообщат ваш план атаки.

Как мы можем найти хороший компромисс?

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

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

эпилог

... упомянутый вопрос и его ответы не охватывают аспект управления проектом.

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

Если вместо этого вы применяете принцип СУХОЙ и пытаетесь найти абстракцию, которая более или менее устраняет дублирующийся код, все иначе.

У меня был такой опыт: «Я потратил два дня на написание этой строки (формы с графическим интерфейсом) и два часа на написание остальной части формы». Я имею в виду, что я потратил время на то, чтобы определить повторно используемые классы - СУХОЙ - естественный побочный эффект - строку формы GUI и некоторые другие. После отладки они использовались индивидуально и в составе всей формы, которая теперь очень быстро кодируется, и тестирование было исключительно быстрым, несмотря на сложность построения. И это также прошло через формальное тестирование с удивительно низким уровнем ошибок.

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

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

В одном случае мы прилепились к нашему оружию, когда руководство заявило: «Вы тратите слишком много времени на разработку, начинайте». И коллеги говорят: «Это слишком много классов». Ну, гораздо менее сложный подпроект должен был занять около 1 месяца (я думал, что это нормально), но занял 5 месяцев. 3 месяца из этого были в тестировании / исправлении, потому что это был такой POS. «Но у нас не было времени на дизайн!». Они на самом деле так сказали.

Мои вопросы: по каким критериям решить, если разработчик переусердствовал с СУХОЙ? Как мы можем найти хороший компромисс? Или есть способ полностью преодолеть эту дилемму, а не просто найти компромисс?

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

radarbob
источник
«Измерьте с помощью микрометра, отметьте мелом, порежьте топором».