Простое копирование кода может быть опасным. Однако так можно сказать про множество других аспектов в разработке программного обеспечения при условии неосторожного с ними обращения. В этом посте я разберу такие вопросы как:
Ни для кого из программистов не секрет, что примерный код, который публикуют в качестве ответов на вопросы здесь, на Stack Overflow, часто оказывается в конечном варианте программ. Может быть вы задали вопрос, и вам в ответе прислали идеальную схему цикла
Последняя книга по программированию, которая вам когда-либо понадобится:
Когда я наткнулся на твит, в котором говорилось о преимуществах воровства, я задумался: может ли копирование кода быть выгодным?
Вам на заметку, я не сторонник того, чтобы вы без разбора копировали код из нашего Q&A раздела. Иногда из-за этого у вас могут появиться проблемы. Но, как показала нам наша гостья в подкасте Anna Lytical, этот подход можно использовать для быстрой разработки функционирующих прототипов.
Если вы копируете примеры кода, пожалуйста, оставляйте ссылку на лицензию. В зависимости от того, когда последний раз код редактировался на Stack Overflow, он лицензирован одной из версий лицензии Creative Commons. Наиболее новые коды лицензированы CC BY-SA 4.0, на которую требуется ссылка.
Копирование кода с Stack Overflow это форма плагиата, то есть это дублирование кода из одного или нескольких проектов и повторное его использование. Смотря у какого программиста вы спросите, но может оказаться, что в его работе от 5 до 10 или даже от 7 до 23 процентов кода скопированы из какого-то другого источника. Правильно или нет сделано заимствование — это уже вопрос для обсуждения.
Вне зависимости от действительного процента заимствования в отдельных проектах можно точно сказать, что дублирование кода чрезвычайно распространено. Boilerplate code это код, который регулярно повторяется на протяжении всего проекта. Велика вероятность, что программисты не набирают его каждый раз сами. Такие библиотеки как Lombok дают возможность снизить необходимость писать boilerplate, но факт остается фактом:
И
Говоря о зависимостях, можно упомянуть библиотеки и внешние зависимости, которые являются действенным способом повторно использовать функциональность кода без его копирования. Это работает почти как копирование кода, с той лишь разницей, что в данном случае вы не несете ответственность за поддержание работы скопированной части кода. Черт, да сейчас большая часть Интернета работает на различных платформах и библиотеках плагинов, которые упрощают разработку. Повторное использование кода в библиотеках невероятно эффективно, так как оно позволяет каждой библиотеке делать что-то одно, и при том делать это хорошо. И в отличие от того, как нужно указывать все источники при написании работ в научных кругах, многим таким библиотекам вообще ничего не требуется с вашей стороны, чтобы указать, что вы программируете с использованием чужого кода или что используете чужой код как основу.
Менеджер пакетов JavaScript npm доводит это до крайности. Вы можете установить малюсенькие, однофункциональные библиотеки (некоторые размером всего со строчку кода) в свой проект через командную строку. Вы можете взять себе любой из более чем миллиона бесплатных пакетов с открытым исходным кодом и начать встраивать его функции в свое приложение.
Конечно, как и у любого подхода, у этого метода тоже есть минус. После установки пакета, вы теряете часть контроля над кодом. Некоторые злоумышленники создавали действительно полезные пакеты, ждали, пока они получат достойный уровень скачивания, а затем подправляли код, чтобы красть кошельки биткоин. Надо отдать должное сотрудникам npm, так как им удается довольно быстро отражать подобные атаки. Однако чем больше у вас внешних зависимостей, тем большую площадь для атаки вы представляете.
Даже ответы на Stack Overflow не защищены от дублирования кода. Независимый исследователь обнаружил несколько ответов на Stack Overflow, в которых код был скопирован из других источников. Один фрагмент кода Java был обнаружен в более чем 40 ответах.
В мире искусства воровство это тоже часть создания великих творений. Помню, как я ходил в музей Ван Гога в Амстердаме и видел там его ранние работы. Я был потрясен. Но тогда я не знал, что на самом деле те картины были вдохновлены японской живописью и ксилографией (гравюра по дереву). То, что я подумал, было стилем, уникальным для его времени, было на самом деле частью истории развития, но не той, о которой я думал. Вместо того чтобы идти по тому пути развития, который уже проложили датские мастера художники, Ван Гог использовал идеи из японских гравюр, которые он нашел в Париже (он использовал идеи построения композиции и стиля мазков) и соединил их в своих работах.
Пикассо приписывают такое высказывание: “Хорошие художники копируют, великие художники воруют”. Сам Пикассо почерпнул много идей из африканского и полинезийского искусства и соединил их со своими этюдами. Сама по себе идея воровства ощущается неправильной. Действительно, называть чужую работу своей это плагиат. Заимствованная вещь все равно принадлежит кому-то другому. Вы копируете стиль, и он все равно принадлежит владельцу. Однако, чтобы украсть, нужно сделать эту идею своей. Объявить себя создателем чьей-то идеи это заимствование. Но Пикассо имел в виду, что нужно понять и вплести идею в свою работу, чтобы ее «украсть». Стив Джобс любил эту цитату, и компания Apple обрела успех под его началом, потому что они воровали идеи, объединяли их и улучшали.
Когда вы копируете код, вы рискуете просто его позаимствовать. Заимствованный код помещается в проект полностью, если он хорошо встраивается и не вызывает ошибок, но он может иметь в себе баги или может быть создан злоумышленниками с возможностью использования в их целях, о чем вы знать не будете. Количество рисков, связанных с неправильно скопированным кодом (или скопированным с поправками) огромно. На самом деле, по жалобам на дублированный код можно отследить плагиатора. Если вы не понимаете код, вы с высокой вероятностью оставите дыры в защите того, что изначально должно было быть всего лишь демонстрацией концепта. Даже самый копируемый фрагмент кода на Stack Overflow не обделен багом.
С другой стороны, когда вы воруете код, то определенно знаете, что он делает. Его ядро и его особенности вписываются в ваш собственный код. Если вы можете написать его еще раз по памяти, то это знак того, что код украден правильно. Это значит, что переработка кода дала вам нечто большее, чем просто копию. Она дала вам нечто новое и оригинальное.
Итак, да, воруйте код. Берите его, понимайте и применяйте в своих проектах. Делайте его своим. Вы можете набраться опыта, улучшить свои проекты и, может быть, даже ваше резюме (aka ваши ctrl+C ctrl+V). Но если вы копируете без абсолютного понимания новоприобретенного кода и того, что он делает, вы рискуете сделать свой собственный код только хуже.
Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя онлайн-курсы SkillFactory:
- Что на самом деле обозначает копирование кода в разработке ПО?
- Что значит правильное воровство кода?
- Каковы подводные камни неправильного копирования?
Ни для кого из программистов не секрет, что примерный код, который публикуют в качестве ответов на вопросы здесь, на Stack Overflow, часто оказывается в конечном варианте программ. Может быть вы задали вопрос, и вам в ответе прислали идеальную схему цикла
for
. Может быть вы нашли отличный ответ, в котором присутствовала часть кода с async await
, которая подошла для вашего приложения.Последняя книга по программированию, которая вам когда-либо понадобится:
Когда я наткнулся на твит, в котором говорилось о преимуществах воровства, я задумался: может ли копирование кода быть выгодным?
Вам на заметку, я не сторонник того, чтобы вы без разбора копировали код из нашего Q&A раздела. Иногда из-за этого у вас могут появиться проблемы. Но, как показала нам наша гостья в подкасте Anna Lytical, этот подход можно использовать для быстрой разработки функционирующих прототипов.
Если вы копируете примеры кода, пожалуйста, оставляйте ссылку на лицензию. В зависимости от того, когда последний раз код редактировался на Stack Overflow, он лицензирован одной из версий лицензии Creative Commons. Наиболее новые коды лицензированы CC BY-SA 4.0, на которую требуется ссылка.
Напиши код один раз, запусти в работу миллион раз
Копирование кода с Stack Overflow это форма плагиата, то есть это дублирование кода из одного или нескольких проектов и повторное его использование. Смотря у какого программиста вы спросите, но может оказаться, что в его работе от 5 до 10 или даже от 7 до 23 процентов кода скопированы из какого-то другого источника. Правильно или нет сделано заимствование — это уже вопрос для обсуждения.
Вне зависимости от действительного процента заимствования в отдельных проектах можно точно сказать, что дублирование кода чрезвычайно распространено. Boilerplate code это код, который регулярно повторяется на протяжении всего проекта. Велика вероятность, что программисты не набирают его каждый раз сами. Такие библиотеки как Lombok дают возможность снизить необходимость писать boilerplate, но факт остается фактом:
- Всегда будут такие части кода, которые должны будут появляться снова и снова на протяжении всего проекта
И
- Из-за того, что этим частям скорее всего все-таки понадобятся маленькие изменения, эти фрагменты кода нельзя убрать в отдельную функцию или зависимость.
Говоря о зависимостях, можно упомянуть библиотеки и внешние зависимости, которые являются действенным способом повторно использовать функциональность кода без его копирования. Это работает почти как копирование кода, с той лишь разницей, что в данном случае вы не несете ответственность за поддержание работы скопированной части кода. Черт, да сейчас большая часть Интернета работает на различных платформах и библиотеках плагинов, которые упрощают разработку. Повторное использование кода в библиотеках невероятно эффективно, так как оно позволяет каждой библиотеке делать что-то одно, и при том делать это хорошо. И в отличие от того, как нужно указывать все источники при написании работ в научных кругах, многим таким библиотекам вообще ничего не требуется с вашей стороны, чтобы указать, что вы программируете с использованием чужого кода или что используете чужой код как основу.
Менеджер пакетов JavaScript npm доводит это до крайности. Вы можете установить малюсенькие, однофункциональные библиотеки (некоторые размером всего со строчку кода) в свой проект через командную строку. Вы можете взять себе любой из более чем миллиона бесплатных пакетов с открытым исходным кодом и начать встраивать его функции в свое приложение.
Конечно, как и у любого подхода, у этого метода тоже есть минус. После установки пакета, вы теряете часть контроля над кодом. Некоторые злоумышленники создавали действительно полезные пакеты, ждали, пока они получат достойный уровень скачивания, а затем подправляли код, чтобы красть кошельки биткоин. Надо отдать должное сотрудникам npm, так как им удается довольно быстро отражать подобные атаки. Однако чем больше у вас внешних зависимостей, тем большую площадь для атаки вы представляете.
Даже ответы на Stack Overflow не защищены от дублирования кода. Независимый исследователь обнаружил несколько ответов на Stack Overflow, в которых код был скопирован из других источников. Один фрагмент кода Java был обнаружен в более чем 40 ответах.
Хорошие художники копируют, великие художники воруют
В мире искусства воровство это тоже часть создания великих творений. Помню, как я ходил в музей Ван Гога в Амстердаме и видел там его ранние работы. Я был потрясен. Но тогда я не знал, что на самом деле те картины были вдохновлены японской живописью и ксилографией (гравюра по дереву). То, что я подумал, было стилем, уникальным для его времени, было на самом деле частью истории развития, но не той, о которой я думал. Вместо того чтобы идти по тому пути развития, который уже проложили датские мастера художники, Ван Гог использовал идеи из японских гравюр, которые он нашел в Париже (он использовал идеи построения композиции и стиля мазков) и соединил их в своих работах.
Пикассо приписывают такое высказывание: “Хорошие художники копируют, великие художники воруют”. Сам Пикассо почерпнул много идей из африканского и полинезийского искусства и соединил их со своими этюдами. Сама по себе идея воровства ощущается неправильной. Действительно, называть чужую работу своей это плагиат. Заимствованная вещь все равно принадлежит кому-то другому. Вы копируете стиль, и он все равно принадлежит владельцу. Однако, чтобы украсть, нужно сделать эту идею своей. Объявить себя создателем чьей-то идеи это заимствование. Но Пикассо имел в виду, что нужно понять и вплести идею в свою работу, чтобы ее «украсть». Стив Джобс любил эту цитату, и компания Apple обрела успех под его началом, потому что они воровали идеи, объединяли их и улучшали.
Когда вы копируете код, вы рискуете просто его позаимствовать. Заимствованный код помещается в проект полностью, если он хорошо встраивается и не вызывает ошибок, но он может иметь в себе баги или может быть создан злоумышленниками с возможностью использования в их целях, о чем вы знать не будете. Количество рисков, связанных с неправильно скопированным кодом (или скопированным с поправками) огромно. На самом деле, по жалобам на дублированный код можно отследить плагиатора. Если вы не понимаете код, вы с высокой вероятностью оставите дыры в защите того, что изначально должно было быть всего лишь демонстрацией концепта. Даже самый копируемый фрагмент кода на Stack Overflow не обделен багом.
С другой стороны, когда вы воруете код, то определенно знаете, что он делает. Его ядро и его особенности вписываются в ваш собственный код. Если вы можете написать его еще раз по памяти, то это знак того, что код украден правильно. Это значит, что переработка кода дала вам нечто большее, чем просто копию. Она дала вам нечто новое и оригинальное.
Итак, да, воруйте код. Берите его, понимайте и применяйте в своих проектах. Делайте его своим. Вы можете набраться опыта, улучшить свои проекты и, может быть, даже ваше резюме (aka ваши ctrl+C ctrl+V). Но если вы копируете без абсолютного понимания новоприобретенного кода и того, что он делает, вы рискуете сделать свой собственный код только хуже.
Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя онлайн-курсы SkillFactory:
- Курс «Профессия Data Scientist» (24 месяца)
- Курс «Профессия Data Analyst» (18 месяцев)
- Курс «Python для веб-разработки» (9 месяцев)
kovserg
Когда что-то воруют оно исчезает у того у кого оно было. В данном случае слово «воровство» это подмена понятий. Есть еще замечательные слова изнасилование, убийство и т.п. Удивляет как еще обучение в школе еще не переименовали в воровство?
sshikov
Вообще это широко известная цитата, которую приписывают П. Пикассо, а на самом деле она видимо принадлежит Томасу Стернзу Элиоту. В 1920 году он написал: «Молодые поэты подражают, зрелые поэты воруют». Применительно к Пикассо имеются в виду художники.
kovserg
Всё развитие итерационное, на основу уже имеющегося вносятся изменения, которые могут революционно менять то что уже есть. Создавать на пустом месте можно, но нужны миллионы лет эволюции. И нахрена пытаться давить естественные процессы, пытаясь белое называть черным.
ps: Что мешает вместо слова воровство использовать заимствование, использование, копирование и взятие за основу.
ar2rsoft
Тогда пиратство это не воровство?
dvserg
Как говорили в Зеленом фургоне — это взять во «временное пользование».
perfect_genius
Т.е. потом возвращать надо?
bgBrother
Kroid
Далеко не в первый раз отдельные слова естественного языка имеют несколько разных значений. Так чем же «воровство» хуже «лука»?
adsensei
Статью не читал, но заголовок так вижу: хорошие изобретают библиотеки заново, великие используют готовые.
Я вот лично люблю заново велосипеды изобретать, нравится мне самому все с нуля сделать и понять как каждая шестеренка работает.
Politura
А если прочитать саму статью, то придется перевернуть ваше понимание заголовка. Исходя из определений в статье, использование чьей-то готовой библиотеки будет копированием, а использование идей из чьей-то библиотеки для того, чтобы создать свою библиотеку будет воровством, по замыслу автора статьи.
somurzakov
почти любой код почти всегда является копированием, т.к. скорее всего описан где-то в документации. Наример вызовите любой метод из майкрософтовской библиотеки, и скорее всего вы копируете из MSDN
OneType
Хорошие копируют, великие воруют, а создают посредственные?
undestroyer
Создают те, кто не искал чужие реализации)
undestroyer
Вот эту фразу нужно попапом показывать при Ctrl+C из StackOverflow. Сколько было испорчено кода тупым заимствованием. В большинстве случаев спасает нормальный git, хотя и его тоже умудряются портить.
General_Failure
Refridgerator
По-моему, в статье не разделяются понятия «код» и «алгоритм» там, где это разделение критически важно.
Ar0x13
Кража/Воровство — это в первую очередь ТАЙНОЕ похищение чужого имущества, в нашем же случае когда когда код лежит на Stack Overflow и других ПУБЛИЧНЫХ ресурсах это совсем другое. Так что если автор просто хотел процитировать великих и гениальных это ОК, а в других случаях это просто странно.
DeepFakescovery
Opensource — это двигатель прогресса. Многие этого не понимают.
Мне наоборот нравится, что если кому-то мой код из stackoverflow ответов пригодился.
Значит кто-то сэкономил время создавая новую технологию/инструмент.