Чи більшість програмістів копіює та вставляє код? [зачинено]


48

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

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

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

Отже, чи більшість програмістів вирізають і вставляють код?


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

Нещодавно виникло питання щодо вирізання та вставки. Чому ти не перевіриш це ?
Наргул

Якщо я це розумію.
Джонні

Відповіді:


46

Два загальних випадки:

Від одного проекту до іншого:

Більшість програмістів вирізають і вставляють код у цій якості. Вони можуть знайти попередній проект чи щось в Інтернеті та точно скопіювати / вставити його або скопіювати / вставити та внести зміни до нього. Я думаю, що ця практика зазвичай чудова. Це особливо добре, коли це перевірено кодом. (Приклади: якийсь об’єкт утиліти з минулого проекту, який добре працював, або, можливо, з блогу з кількома необхідними змінами). Де це може бути погано, це коли ви копіюєте код, який ви не розумієте, або де код поганий, або де є набагато краще альтернативне рішення, ніж код, який ви вставляєте.

Всередині того ж проекту: Копіювання та вставлення в один проект, як правило, не є хорошою ідеєю. Це неприємний запах, що код, який копіюється, просто повинен бути десь у методі / класі та викликається повторно. З цього є деякі винятки, але, як правило, програміст повинен думати: " Чи можна параметризувати цей код, який я копіюю? ".


5
Як правило, це правда, якщо ви не пишете код, який вимагає анти-шаблонів, як це може бути у випадку з кодом проти антибактерій, наприклад, для ліцензування програмного забезпечення.
Роб Перкінс

+1 Так, я зробив обидві ці речі. Я давно не робив вирізати та вставляти код у рамках одного проекту (хоча, зізнаюся, рідко це робив під екстремальним тиском із зареєстрованою помилкою, щоб повернутися до нього). Що стосується класів утиліти, то мій проект копіювання проекту зараз ізольовані для копіювання повних файлів.
Джон Макінтайр

2
Під час написання коду бази даних я зазвичай вирізаю і вставляю частину його в нову функцію і змінюю сам sql, щоб отримати бажаний результат, і не потрібно перейматися тим, щоб повторно вводити деякі передумови для здійснення зазначених дзвінків до бази даних. Хоча загалом я погоджуюся з обома зауваженнями.
Кріс

1
@Chris: Скопіюйте та модифікуйте серце в ньому зовсім інше, ніж просто вставити його як є.
Лорен Печтел

1
@ Лорен Печтел: Тим не менш, він все ще включає акт копіювання та вставки коду.
Кріс

37

Більшість програмістів це роблять, але це не означає, що слід

Одна з моїх мантр програмування: "Якщо я копіюю і вставляю код, я роблю щось не так" . По суті, СУХА .

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

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

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

Може бути дискусійним питання про те, чи варто чи не слід копіювати та вставляти код, оскільки клієнт / начальник не хвилює (принаймні безпосередньо та в короткий термін), і ви можете закінчитися тими ж результатами, але проблема справді виникає, коли це призводить до помилок, втрати модульності і, в кінцевому рахунку, пекла технічного обслуговування.

Що ви повинні зробити: рефактор якомога швидше

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

Врешті-решт, ви зрештою отримаєте хороший код , навіть якщо скопіюєте та вставте.

Хороший кодекс

через XKCD


15
Я часто бачив, як "рефактор пізніше" перетворюється на "рефактор ніколи", або ще гірше "я такий гарячий кадр, якийсь інший SUCKER може рефактор і виправити мій майже-але не зовсім-нормально код". Я вірую в те, що робити це прямо вперед, адже інакше це як завтра - воно ніколи не настане.
швидко_значення

1
@quickly_now - re: "Я такий гарячий кадр, якийсь інший SUCKER може рефактор і виправити мій майже-але не зовсім-нормальний код" ... Я не можу вам висловити лише те, наскільки я ненавиджу ці ривки.
Джон Макінтайр

Гей, Джон. Я чую тебе. Я витратив роки свого життя, будучи присоскою ... заплатив удвічі більше і потів до півночі, отримуючи дійсно хороше розуміння того, що відбувається (і переписувати чудові плити кодового коду) - поки гарячий кадр продовжував накручувати щось ще. Зітхнути.
quick_now

1
Чим більше людей у ​​команді, тим більше "рефактор згодом" стає "рефактором ніколи", наскільки я міг бачити: /
wildpeaks

8

Коли я застряг і шукаю речі, щоб вирішити свою проблему, і трапляється якийсь корисний фрагмент коду, який робить те, що я хочу, я, природно, копіюю його. Іноді це просто суть цього. Потім я змінюю його відповідно до моїх потреб. Це трапляється частіше, коли я заглиблююся в речі, в яких я не є експертом (в даний час, Objective-C).

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


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

Я все для того, щоб вчитися у інших, але хіба ви не знаєте, що, якщо ви не шукаєте конкретної проблеми, просто обернути голову навколо того, що зробила інша людина, витрачає більше часу на те, що просто робити це з нуля? (зауважте, я говорю про "код", а не про цілі одиниці функціональності, такі як класи тощо)
Джон Макінтайр

@John MacIntyre Можливо, але зазвичай, коли я з'являю якийсь невеликий фрагмент коду, я формую його, поки не буду задоволений ним. Часто його так чи інакше потрібно адаптувати (під функцію, більш загальну, вдосконалити, оптимізувати тощо).
Мартін Вікман

@John: Фрагменти коду надають ті фрагменти, які показують, як робити справи. Звичайно, вирізати і наклеїти. Але, як зазначає Мартін, - дізнайтеся, що робить цей код. Ви витратите набагато більше часу на пошук конкретного методу, якому ви не знаєте ім'я. Коли ви не знаєте, що означає слово; ви шукаєте це в словнику. Визначення є на 100% чіткими; але як часто ви переглядаєте зразки використання? Приклади коду так само, як зразки використання словника. MSDN не завжди включає зразки використання або часто є неповними.
IАнотація

6

Я збираюся поговорити про копіювання / вставлення коду інших людей тут. Захоплення частин власної роботи з моєї особистої бібліотеки - це чесна гра. Я їх знаю і розумію за визначенням.

Я вважаю, що найчастіша ситуація, коли я "вирізаю і вставляю" код, - це коли у мене є певна проблема, і я натрапляю на публікацію в блозі, яка її вирішує. Більшість разів я повторно вкладаю рішення у свій проект (адже він, мабуть, написаний у авторському стилі блогу, якщо нічого іншого). Це насправді не мій код, але я не почуваюся поганим у використанні його в тому сценарії.

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

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

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


1
Можливо, багато програмістів не копіюють / не вставляють фактичний код у великих масштабах, але вони із задоволенням використовуватимуть готову бібліотеку (безкоштовно чи іншим способом), не дивлячись ні на один рядок коду ...
hplbsh

1
@Stuart Щоправда, але я вважаю, що відмінність полягає в тому, що ця бібліотека не вважатиметься власною роботою програміста. І чесно кажучи, доки бібліотека працює і робить те, що мені потрібно для цього, я також не переймаюся тим, щоб переглядати її джерело. (Якщо припустити належну ретельність, інакше робиться питання про те, наскільки поважна / надійна бібліотека в першу чергу.)
Адам Лір


@stuart - Я б не включав бібліотеку в цю дискусію, оскільки це згуртований блок ... не дуже "втрачаю" код, якщо ви знаєте, що я маю на увазі.
Джон Макінтайр

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

4

Погано: копіюючи та вставляючи один і той же блок коду знову і знову

Якщо ви виявите, що ви робите це, вам, ймовірно, слід замислитися на секунду, щоб подумати про те, що можна абстрагувати від копіюваного коду, і створити функцію / метод для його обробки. Тут враховується принцип НУМИ (не повторюй себе).

Добре: копіювання блоку коду, який, як відомо, працює

DRY (не повторюй себе) також поширюється тут, лише в іншому розумінні. IE, не повторюйте роботу, яку ви вже робили в минулому. Якщо ви витратили час, щоб написати розділ коду, налагодити, протестувати його, і це доведено, що він працює у виробничій кодовій базі; ти будеш німим не використовувати його повторно.

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

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

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


Замість того, щоб копіювати та вставляти код, цілком можливо його написати багаторазово. Потім використовуйте це замість того, щоб скопіювати та вставити його.
Bjorn

1
@BjornTipling Так, зазвичай краще розбити код на функції багаторазового використання, якщо цей процес не додасть складності і код ніколи не буде використаний повторно
Evan Plaice

Якщо ви копіюєте та вставляєте його, ви повторно використовуєте його. Я погоджуюсь, що люди повинні використовувати голову, і що умови можуть цього робити. Коли я писав тести, я робив копіювання та вставку, але навіть там я намагаюся створити багаторазові функції, але тоді є два-три рядки, які майже однакові, але я не можу досить узагальнити це, щоб перетворитись на багаторазова функція.
Бйорн

3

Після 25 років написання коду були випадки, коли (без доступу до коду, який я писав попередньому роботодавцеві) я хотів би вирізати і вставити. ЯКЩО це було дуже рідко (і продовжуйте читати).

Мабуть, найкращий приклад - це дійсно простий синтаксичний аналізатор командного рядка, який я зустрічав років тому для операційних систем Unix. Простий цикл, що прошиває аргументи та обробляє параметри. Це було дивовижно просто і елегантно, і я багато разів використовував це (скоріше як візерунок, ніж як буквальний виріз та вставку). Це швидше виняток, ніж правило.

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

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

Я хвилююся щоразу, коли хтось просто копіює код, не зупиняючись, щоб зрозуміти його. Вони або геній (зрозумійте це та всі його тонкощі з першого погляду), або дурень. Між ними немає місця для нічого. Ой, і справжніх геніїв теж не так багато.

Не розуміючи, ви насправді не маєте уявлення про те, що саме ви кинули в НАДАЛЬНО, не тільки в щасливих, але і в нещасних обставинах чи умовах введення. Іноді це не має значення, адже вам пощастить. І іноді це доставляє багато тривалих болів.


4
з іншого боку, є програмісти, які самі пишуть код і все ще не розуміють цього ...
hplbsh

3

Існує загальна ситуація, коли вам в основному НЕОБХІДНО це робити, щоб бути результативним.

Будь-яка незнайома для вас технологія важко засвоїти, якщо у вас є робочий приклад для початку. Отже, ви копіюєте та вставляєте це, щоб мати щось, що насправді працює , а потім починайте повозитися з ним.


Виправлення: Існує фактична думка, де ви, як правило, вважаєте, що НЕОБХІДНО це робити, щоб бути результативним. Отже, ви копіюєте та вставляєте свій шлях, щоб випустити щось, що якимось чином спрацьовує, і витратити розваги, страждаючи на шляху до відновлення шкоди.
ньютопський

3

Як новий програміст (через 4 місяці моєї першої роботи) я дуже багато покладаюся на допомогу (будь то з ПС чи з інших місць). Я зазначаю, що НЕ сліпо копіювати та вставляти код інших. Навіть якщо наданий код є тим, що я буду використовувати, я наберу його у свою програму, а потім витрачу трохи часу, щоб переконатися, що я повністю розумію, що це робить, та причини цього.

Я хочу переконатися, що я постійно навчаюсь, а не просто фахівець з вирізання та пасти


1

У мене так багато почуттів щодо цієї теми, і я не можу чесно сказати, що жоден з них є цілком об'єктивним.

Існує багато аргументів для вирізання та вставки коду інших людей у ​​вашу програму. Деякі з них можуть мати сенс, деякі - ні. Наприклад, якщо у вас є метод з чийогось блогу, який бере вхід і виконує якийсь складний математичний алгоритм, який виходить за рамки ваших математичних здібностей і виплющує результат - це аргумент для вирізання та вставки - отримайте дозвіл автора на використання їх кодувати і кредитувати їх там, де належить - це почесна річ.

Є аргументи, щоб не винаходити колесо - знову ж, це має сенс теоретично. Але якщо ви не знайдете часу, щоб глибоко ознайомитися з кодом, який ви вирізаєте та вставляєте, ви не знаєте, чи є кращий спосіб вирішення цієї проблеми, ви не знаєте, чи є помилки в коді . Що робити, якщо колесо, яке ви вставляєте, зламане?

Є аргументи на швидкість та ефективність - ви створюєте бібліотеку коду інших людей, який ви зірвали, вкрали, в’яли чи іншим способом, придумайте це, можливо, вам навіть не знатиметься, як програмувати поза Франкенстеінгам якусь програму разом із меліорованих частин.

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

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

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

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

Додаток : Враховуючи це, я вважаю, що розрізання та вставлення власного коду між проектами цілком прийнятно - якщо тільки це не було написано як робота за наймом для когось іншого; у цьому випадку ви не володієте авторськими правами, і ви повинні отримати дозвіл того, кого ви кодували. Я виявив, що, якщо код не стосується власних функціональних концепцій, більшість роботодавців гаразд з вами повторно використовують власні ідеї для інших клієнтів.


Який ти береш на себе використання коду з публікацій блогу, який вирішує конкретну проблему? Чи фізично копіювати / вставляти код те, що ви вважаєте б порушенням етики, чи переробляєте рішення у ваш проект, належать до тієї ж категорії? Чи впливає розмір "запозиченого" коду (тобто повна програма / функція проти невеликого фрагмента) на вашу думку?
Адам Лір

2
Я відчуваю, що якщо це повідомлення на блозі, то автор призначав, щоб воно було публічним, тож якщо воно вам стане в нагоді, то це чесна гра. Однак я навряд чи коли-небудь стикався з фрагментами коду, які можна було б скопіювати дослівно. Зазвичай вони вимагають невеликого доопрацювання.
Pemdas

У мене немає проблеми з кодом із підручників чи публікацій блогу - просто зрозумійте, що це робить. Імовірно, якщо він був розміщений, його доступні.
швидко_відомо

"Не орієнтуючись на цю відповідь на тебе, Джон" ... я насправді не думав, що ти ... ну, принаймні, не, поки я все одно не прочитав це. LOL
Джон Макінтайр

Мені подобаються ваші коментарі щодо плагіату та повного розуміння коду, але ви дійсно вважаєте, що ефективніше копіювати / вставляти чужий код, ніж просто писати його самостійно? Я вважаю, що ви або не до кінця зрозумієте це, і у вас виникнуть проблеми пізніше, АБО ваші спроби повністю зрозуміти це займуть більше часу, ніж просто написати його самостійно. КВІМ?
Джон Макінтайр


0

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

Замість того, щоб загальний абсолютний закон копіювання та вставки був добрим чи поганим, слід побачити, коли ним користуватися.

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

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


Я, безумовно, погоджуюся щодо загальної бібліотеки, але чи слід вирізати та вставити цей код чи створити його з нуля?
Джон Макінтайр

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

0

У більшості випадків код, який ви знайдете в мережі, не відповідає вашим точним цілям.

Те, що я бачу, як багато роблю, - це копіювати код від когось, знімати його до самої суті, а потім додавати код, поки він не відповідає моїм вимогам. Я завжди рефактор, щоб відповідати моїм умовам іменування та стилю кодування.

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


-1

Навіщо винаходити колесо, якщо ви розумієте, що робить код, маєте дозвіл на повторне використання коду (або його відкриття), і вам не обов’язково потрібен весь код, який написала інша людина. Я часто копіюю алгоритм реалізації та модифікую його під мої власні потреби. Зазвичай, коли я просто вирізаю та вставляю, це тому, що мені не потрібно все, що було в прикладі, тому додавання іншого файлу було б просто марно (або це щось у функції). Я погоджуюсь з jzd, якщо ви вирізаєте та вставляєте власний код у рамках одного проекту, тоді є щось неправильне, і вам, мабуть, слід з’ясувати економний спосіб його зв'язати або поділити функцію.


-1

Я вважаю, що члени команди " інтеграції " або ті, хто не має настільки багато досвіду роботи з кодом або програмуванням, як правило, частіше копіюють і вставляють і не розуміють, що вони робили (потрапляючи в проблеми, згадані у вашому запитанні).

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


+1 для винахідництва. Я також знаходжу багато часу переписування коду з Інтернету замість копіювання вставлення. Я думаю, що роблю це, бо мене не обмежують строки. Я можу вільно вчитися самому і можу навчитися тому, що коли хочу.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.