Большинство программистов копируют и вставляют код? [закрыто]

48

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

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

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

Итак, большинство программистов вырезать и вставить код?

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

Ответы:

46

Два общих случая:

Из одного проекта в другой:

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

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

JZD
источник
5
Как правило, это так, если только вы не пишете код, который требует анти-шаблонов, как это может быть в случае с кодом противодействия, например, для лицензирования программного обеспечения.
Роб Перкинс
+1 Да, я сделал обе эти вещи. Я давно не копировал и не вставлял код из одного и того же проекта (хотя признаюсь, что редко делал это под сильным давлением с зарегистрированной ошибкой, чтобы вернуться к нему). Что касается служебных классов, то мой проект копировать проект теперь изолирован для копирования полных файлов.
Джон Макинтайр
2
При написании кода базы данных я обычно вырезал и вставлял некоторые из них в новую функцию и изменял сам sql для получения желаемого результата, и мне не нужно беспокоиться о повторном вводе некоторых предпосылок для выполнения указанных вызовов базы данных. Хотя в целом я согласен с обоими замечаниями.
Крис
1
@Chris: Скопируйте и измените его суть, это не то же самое, что просто вставить его как есть.
Лорен Печтел
1
@Loren Pechtel: Тем не менее, это все еще включает в себя процесс копирования и вставки кода.
Крис
37

Большинство программистов делают это, но это не значит, что вы должны

Одна из моих программных мантр гласит: «Если я копирую и вставляю код, я делаю что-то не так» . По сути, СУХОЙ .

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

После того, как я потрачу еще немного времени с этим кодом, я получу следующее:

  • Компонент (смотри также: разделение интересов )
  • Я могу прибегнуть к размышлениям, чтобы сделать вещи проще, чище и легче повторять в будущем.
  • Лучший дизайн , потому что, даже если он работает, почему бы не сделать это снова после того, как вы выучили уроки?
  • Шаблон, который я могу абстрагировать, превратить в компонент библиотеки и удалить дублированный код.

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

Что вы должны сделать: рефакторинг как можно скорее

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

В конце концов, в конце вы получите хороший код , даже если вы скопируете и вставите.

Хороший код

через XKCD

dukeofgaming
источник
15
Я часто видел, как «рефакторинг позже» превращался в «рефакторинг никогда», или, что еще хуже, «я такой крутой шанс, что какой-то другой SUCKER может рефакторинг и исправить мой почти, но не совсем нормально код». Я верю, что делаю это сразу, потому что иначе это как завтра - никогда не наступит.
быстро,
1
@quickly_now - re: «Я такой крутой, что другой SUCKER может рефакторинг и исправить мой почти, но не совсем нормальный код» ... Я не могу выразить вам, насколько сильно я ненавижу этих придурков.
Джон Макинтайр
Привет, Джон. Я слышу тебя. Я потратил годы своей жизни на то, что присосался ... заплатил вдвое меньше и потел до полуночи, получая по-настоящему хорошее понимание того, что происходит (и переписывая большие куски дерьмового кода) - в то время как горячая попытка продолжалась, чтобы облажаться что-то другое. Вздох.
quick_now
1
Чем больше людей в команде, тем больше «рефакторинг позже» становится «рефактором никогда», насколько я мог видеть: /
wildpeaks
8

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

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

Мартин Уикман
источник
4
Я всегда говорил «хороший разработчик - ленивый разработчик». Я не изобретаю велосипед, если это уже сделал кто-то другой. Но я держу это маленьким ... Я никогда не копирую больше, чем несколько строк кода, и никогда ничего, что я не понимаю полностью.
morganpdx
Я весь для того, чтобы учиться у других, но разве вы не находите, что, если вы не ищете конкретную проблему, просто сосредоточиться на том, что сделал другой человек, больше времени, чем просто делать это с нуля? (обратите внимание, я говорю о «коде», а не о полных единицах функциональности, таких как классы и т. д.)
Джон Макинтайр
@John MacIntyre Может быть, но обычно, когда я вставляю небольшой фрагмент кода, я формирую его до тех пор, пока не буду доволен им. Часто его нужно адаптировать (в функцию, более общую, улучшенную, оптимизированную и т. Д.) В любом случае.
Мартин Уикман
@John: фрагменты кода предоставляют те части, которые показывают вам, как делать вещи. Конечно, вырезать и вставлять. Но, как указывает Мартин, узнайте, что делает этот код. Вы потратите гораздо больше времени на поиск конкретного метода, название которого вы не знаете. Когда вы не знаете, что означает слово; Вы смотрите это в словаре. Определения на 100% ясны; но как часто вы смотрите на примеры использования? Примеры кода похожи на примеры использования словаря. MSDN не всегда включает примеры использования или часто неполные.
IAbstract
6

Я собираюсь поговорить о копировании / вставке кода других людей здесь. Захват части моей работы из моей личной библиотеки - это честная игра. Я их знаю и понимаю по определению.

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

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

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

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

Адам Лир
источник
1
Возможно, многие программисты не копируют / вставляют фактический код в больших масштабах, но они с радостью используют готовую библиотеку (бесплатную или иную), не глядя ни на одну строчку кода ...
hplbsh
1
@Stuart Правда, но я думаю, что различие в том, что эта библиотека не будет востребована как собственная работа программиста. И, честно говоря, до тех пор, пока библиотека работает и делает то, что мне нужно, мне не особенно интересно изучать ее источник. (Предполагается, что в противном случае проводится должная проверка того, насколько авторитетна / надежна библиотека в первую очередь.)
Адам Лир
В каком-то смысле это вопрос намерений, как со стороны издателя, так и потребителя :)
hplbsh
@stuart - я бы не стал включать библиотеку в это обсуждение, поскольку это единое целое ... не совсем "потерять" код, если вы понимаете, о чем я.
Джон Макинтайр
На самом деле, думая о ваших комментариях, я, честно говоря, должен задаться вопросом, возможно ли программисту собрать и вставить целую систему вместе. Я думаю, что вес их гордыни быстро обрушится, сокрушив их прогресс.
Джон Макинтайр
4

Плохо: копировать и вставлять один и тот же блок кода снова и снова

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

Хорошо: копирование блока кода, который, как известно, работает

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

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

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

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

Эван Плейс
источник
Вместо того, чтобы копировать и вставлять код, можно полностью написать его повторно. Тогда используйте это вместо того, чтобы копировать и вставлять это.
Бьорн
1
@BjornTipling Да, обычно предпочтительнее разбивать код на многократно используемые функции, если только этот процесс не добавляет сложности и код никогда не будет повторно использоваться
Эван Плейс,
Если вы копируете и вставляете это, вы снова используете это. Я согласен, что люди должны использовать свои головы и что условия могут это оправдать. Я обнаружил, что копирую и вставляю тексты при написании тестов, но даже там я пытаюсь создавать многократно используемые функции, но есть две или три строки, которые почти совпадают, но я не могу достаточно обобщить это, чтобы превратить в многоразовая функция.
Бьорн
3

После 25 лет написания кода были времена, когда (не имея доступа к коду, который я написал для предыдущего работодателя), мне хотелось бы вырезать и вставить. ОДНАКО это было очень редко (и продолжайте читать).

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

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

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

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

Без понимания вы действительно не представляете, что вы только что добавили в РЕАЛЬНО, при не только счастливых, но и несчастных обстоятельствах или условиях ввода. Иногда это не имеет значения, потому что вам повезло. И иногда это причиняет много долговременной боли.

quickly_now
источник
4
с другой стороны, есть программисты, которые сами пишут код и до сих пор не понимают его ...
hplbsh
3

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

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

user1249
источник
Исправление: Существует настоящий бейлиф, где вы в основном думаете, что вам НУЖНО сделать это, чтобы быть продуктивным. Следовательно, вы копируете и вставляете свой способ, чтобы выпустить что-то, что каким-то образом работает, и проводите вечность, терпя свой путь, чтобы восстановить ущерб.
Newtopian
3

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

Я хочу убедиться, что я постоянно учусь, а не просто специалист в области вырезать и вставить

Даррен Янг
источник
1

У меня так много чувств к этой теме, и я не могу честно сказать, что любое из них является полностью объективным.

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

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

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

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

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

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

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

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

оборота BenAlabaster
источник
Что вы думаете об использовании кода из постов блога, которые решают конкретную проблему, с которой вы столкнулись? Является ли физическое копирование / вставка кода тем, что вы считаете нарушением этики, или перепечатывание решения в вашем проекте относится к той же категории? Влияет ли на ваш взгляд размер «заимствованного» кода (т. Е. Полная программа / функция против небольшого фрагмента)?
Адам Лир
2
Я чувствую, что если это сообщение в блоге, то автор намеревался сделать его общедоступным, поэтому, если оно вам пригодится, то это честная игра. Однако я почти никогда не сталкивался с фрагментами кода, которые можно было бы дословно скопировать. Они обычно требуют небольшого раздора.
Пемдас
У меня нет проблем с кодом из используемых уроков или постов в блоге - просто поймите, что он делает. Предположительно, если он был опубликован, он доступен.
быстро,
«Не нацеливаю этот ответ на тебя, Джон» ... я на самом деле не думал, что ты был ... ну, по крайней мере, пока я не прочту это. LOL
Джон Макинтайр
Мне нравятся ваши комментарии о плагиате и полном понимании кода, но вы действительно думаете, что более эффективно копировать / вставлять чужой код, чем просто писать его самостоятельно? Я обнаружил, что вы либо не до конца поймете это, но позже у вас возникнут проблемы, ИЛИ ваши попытки полностью понять это займут больше времени, чем простое написание. KWIM?
Джон Макинтайр
0

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

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

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

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

Арджанг
источник
Я определенно согласен с общей библиотекой, но стоит ли вырезать и вставить этот код или создать его с нуля?
Джон Макинтайр
Самый быстрый способ импортировать код - это скопировать и вставить, но нужно проверить и, если необходимо, изменить код, прежде чем вставить его в проект и забыть о нем.
Арджанг
0

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

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

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

Дж. Мэйс
источник
-1

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

scrappedcola
источник
-1

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

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

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