Как убедить коллегу, что дублирование кода - это плохо?

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

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

Как мне убедить его, что такое дублирование кода - это плохо?

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


person vitaut    schedule 19.11.2010    source источник
comment
В следующий раз, когда потребуется что-то изменить в обоих файлах, убедитесь, что задача назначена ему. А еще лучше подумайте, сможете ли вы убедить его, что, поскольку он считает, что дублирование - это нормально, ему следует владеть всеми такими будущими задачами. ЗАТЕМ посмотри, как ему нравится выполнять одну и ту же работу дважды.   -  person FrustratedWithFormsDesigner    schedule 19.11.2010
comment
У меня есть такой коллега ... Я чувствую твою боль. :(   -  person Ashley Grenon    schedule 19.11.2010
comment
@Caladain - Такой возможности больше нет. См. Эту мета-ветку: meta.stackexchange .com / questions / 67581 /   -  person Oded    schedule 19.11.2010
comment
@ Одед: Ну ... это прискорбно.   -  person Caladain    schedule 19.11.2010
comment
Я сочувствую - у меня есть несколько коллег, которые занимаются подобными вещами, и это сводит меня с ума - обычно это потому, что они не инженеры-программисты - они являются экспертами в других областях, которые сами научились программировать (с печальными результатами, например, это).   -  person Paul R    schedule 19.11.2010
comment
@FrustratedWithFormsDesigner: Хорошая идея. К сожалению, он привык к такого рода задачам - я видел его другой проект, и было в среднем по 10 версий каждого файла (не все из них были построены на самом деле, но это другая история).   -  person vitaut    schedule 19.11.2010
comment
@vitaut: Это, вероятно, увеличивает время проекта. Знает ли лицо, отвечающее за бюджет, во сколько это обходятся проектам? Вашему коллеге может быть все равно, но человеку, который должен составлять бюджеты, вероятно, не все равно.   -  person FrustratedWithFormsDesigner    schedule 19.11.2010
comment
Кстати о дублировании ...   -  person Bill the Lizard    schedule 19.11.2010
comment
@Bill the Lizard: Я бы не сказал, что этот вопрос является точным дубликатом, потому что меня больше интересуют более технические аргументы (возможно, некоторые ссылки, такие как ссылка на рефакторинг, который уже был дан), в то время как ответы на этот вопрос ориентированный на нетехнического специалиста, мне не очень помогает. Я уже пробовал такие простые аргументы. Должен ли я уточнить это в вопросе?   -  person vitaut    schedule 19.11.2010
comment
@viaut: Я не думаю, что есть более техническое объяснение, чем главный ответ на другой вопрос. Вы получаете те же ответы.   -  person Bill the Lizard    schedule 19.11.2010
comment
@Bill the Lizard: Он старый парень, размахивая рукой и указывая на веб-статьи на эту тему, не очень помогли. У меня уже есть хорошая ссылка (книга по рефакторингу), которая отсутствовала в ответах на другой вопрос, потому что она предназначена для технической аудитории и надеется получить больше.   -  person vitaut    schedule 19.11.2010
comment
@vitaut: Хорошо, я думаю, поскольку Dr. Strangedupe: «Или как я научился перестать беспокоиться и полюбить дублирование» - все еще самая свежая статья в блоге, и я тоже должен научиться принимать ее. Удачи!   -  person Bill the Lizard    schedule 19.11.2010
comment
@ Ящерица Билла: Ура! Будем бороться с огнем огнем =).   -  person vitaut    schedule 19.11.2010
comment
Как программист встраиваемых систем для небольших систем, я предпочитаю дублировать код между проектами, а не использовать общие библиотеки. Часто улучшение фрагмента кода в одном проекте включает в себя: (1) обеспечение поддержки дополнительных функций, увеличивая таким образом размер кода, или (2) уменьшение размера кода, возможно, путем удаления функциональности, которая не требуется для данного проекта. . Применение таких изменений ко всем проектам было бы не лучшим решением.   -  person supercat    schedule 19.11.2010
comment
При этом дублирование кода взаимодействия может создать некоторые серьезные проблемы. К сожалению, такое дублирование может быть неизбежным, если разные системы используют разные языки, но когда такие вещи, как определения констант, могут быть общими, это полезно.   -  person supercat    schedule 19.11.2010
comment
возможный дубликат Почему копирование и вставка кода опасно?   -  person gnovice    schedule 19.11.2010


Ответы (14)


Спросите его, что он будет делать, когда обнаружит ошибку в своем коде. В скольких местах ему теперь нужно будет это починить?

Вы также можете показать ему ответы на этот вопрос (Почему опасно ли «копировать и вставлять» код?).

person Oded    schedule 19.11.2010

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

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

person Brad    schedule 19.11.2010

Здесь есть два варианта:

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

  2. Он упрямый осел: Тогда не стоит тратить на него силы. Идите к его боссу и позвольте боссу позаботиться об этом. Некоторые люди просто такие.

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

И, наконец, если ваш начальник считает, что вы ошибаетесь, вы, вероятно, не в том месте.

person Eldad Mor    schedule 19.11.2010
comment
Он третий вариант. У него большой опыт программирования странным способом копирования и вставки. На самом деле ему удалось развить удивительную способность поддерживать большую часть такого кода, который более или менее работает. К счастью, большая часть этого находится в другом проекте, и я бы предпочел поцарапать глаза, чем увидеть этот код. Но, возможно, он не совсем безнадежен и мог бы убедиться, что есть способ лучше. - person vitaut; 19.11.2010
comment
Это становится проблемой управления. Опытных программистов с плохими навыками программирования сложно обучить. В большинстве случаев заставить их увидеть свою ошибку - просто позволить им почувствовать боль. Сообщая им, что они будут нести ответственность за поддержание всех созданных дубликатов, независимо от исходного программиста. К сожалению, ты не на должности менеджера. Надеюсь, ваш менеджер с вами согласен :-) - person Eldad Mor; 19.11.2010
comment
@vitaut, судя по твоему описанию, я говорю, что он тип 2: упрямая задница. Может быть, он умеет писать качественный код, но твердо придерживается своих идеалов в ущерб себе. - person Brad; 23.11.2010

Дайте ему копию Рефакторинга.

person Etienne de Martel    schedule 19.11.2010
comment
Хорошее предложение. Я действительно надеялся получить такую ​​ссылку. Спасибо. - person vitaut; 19.11.2010
comment
В качестве справочника для новичков вроде меня: amazon.com / Refactoring-Improving-Design-Existing-Code / dp / - person Max; 02.12.2010

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

person Alex Brown    schedule 19.11.2010
comment
+1 А если после этого вы обнаружите ошибку в своей версии - ему нужно исправить ее в своей. Это особенно хорошо работает, если ваши версии сильно расходятся. - person Audrius; 19.11.2010

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

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

См. Список в Википедии о повторяющихся кодах.

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

person Ira Baxter    schedule 22.11.2010

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

person khachik    schedule 19.11.2010

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

person Caladain    schedule 19.11.2010
comment
Если кто-то так настроен, обращение к высшему авторитету часто оказывается единственным способом заставить его подчиниться. Старая поговорка про ведение лошади на воду .. - person Caladain; 19.11.2010

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

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

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

Удачи.

person Jinesh Parekh    schedule 19.11.2010

Существует множество веских причин не дублировать код, но просто спросите ... ваша команда хочет поддерживать 100 000 строк кода (с дублированием кода) или 50 000 строк кода? Может показаться, что дублирование кода на данном этапе минимально, поэтому ваш коллега не видит важности концепции DRY, но представьте, будет ли он / она дублировать все больше и больше кода в течение следующих 5 лет. Кто будет поддерживать этот код? Твоя команда? Что, если однажды он уйдет с работы? Ваша команда хочет поддерживать это дерьмо? :) Если нет, то вы уже сделали очень убедительный аргумент в пользу того, чтобы не дублировать код, не говоря уже о том, что «больше дубликатов» = «больше подвержено ошибкам в будущем».

person limc    schedule 19.11.2010

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

person Pacane    schedule 19.11.2010

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

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

person Carlos    schedule 19.11.2010
comment
Если исходный код работает, вероятно, он не сломался. Тем не менее, если брать концепцию, что если она не сломана, не чините ее слишком далеко, также означает, что никогда ничего не УЛУЧШАЙТЕ. Непрерывность не означает быть хорошим, и код измеряется не только количеством ошибок, но также измеряется поддерживаемостью метрик, ясностью, возможностью повторного использования и многими другими. - person Eldad Mor; 19.11.2010
comment
Это правда. Я просто думаю о том, как убедить кого-то, кто очень сосредоточен на этом конкретном копировании / вставке. Я полагаю, вам нужно ввести расстановку приоритетов. Что сейчас важнее в вашем проекте? Есть какие-то сроки? Предстоит ли общий обзор кода? - person Carlos; 19.11.2010
comment
Согласен, может, сейчас уже поздно, раз уж он это сделал, и исправление копирования / вставки придется подождать. Кроме того, может быть, есть особая причина для этой конкретной копии / вставки, хотя мне довольно сложно ее оправдать. - person Eldad Mor; 19.11.2010
comment
Если вы имеете в виду поиск ошибки в коде, я, вероятно, смогу это сделать, но как доказать, что дублирование - зло? Под словом «не исправляйте», если он не сломан, я думаю, он имеет в виду, что хочет исправить только настоящие ошибки, а не такие проблемы с кодом, как дублирование. - person vitaut; 19.11.2010
comment
В более широком смысле ошибки - это не просто проблемы с функциональностью пользователя. Если что-то невозможно поддерживать, это большая проблема. Наверняка ваш коллега понимает, что код становится громоздким, если вы продолжаете копировать / вставлять? Если вам удастся показать ему, насколько раздражает его образ действий, возможно, он передумает. - person Carlos; 19.11.2010

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

Если он равен вам, вы можете отчитаться перед своим начальником, предложив это решение (которое является лучшим).

Если вы превосходите его, просто «попросите» его поступить по-вашему ...

person csg    schedule 19.11.2010

Во-первых, признайте, что он прав: копирование и вставка действительно быстрее сейчас.

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

Это идея Ивара Якобсона об программной энтропии.

person reinierpost    schedule 24.11.2010