[Перевод - recovery mode ] Хорошие программисты копируют, великие программисты воруют
Простое копирование кода может быть опасным. Однако так можно сказать про множество других аспектов в разработке программного обеспечения при условии неосторожного с ними обращения. В этом посте я разберу такие вопросы как:
- Что на самом деле обозначает копирование кода в разработке ПО?
- Что значит правильное воровство кода?
- Каковы подводные камни неправильного копирования?
Ни для кого из программистов не секрет, что примерный код, который публикуют в качестве ответов на вопросы здесь, на Stack Overflow, часто оказывается в конечном варианте программ. Может быть вы задали вопрос, и вам в ответе прислали идеальную схему цикла for
. Может быть вы нашли отличный ответ, в котором присутствовала часть кода с async await
, которая подошла для вашего приложения.
Последняя книга по программированию, которая вам когда-либо понадобится:
Когда я наткнулся на твит, в котором говорилось о преимуществах воровства, я задумался: может ли копирование кода быть выгодным?
Work smarter.
Steal code.
— Laurie (@laurieontech) May 14, 2020
Вам на заметку, я не сторонник того, чтобы вы без разбора копировали код из нашего 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: