Копипаста
Сначала были только книги и журналы. Код из них, конечно, можно было перепечатать, но к катастрофам это не приводило.
Появился Google (как первый удобный поисковик), и разработчики стали много гуглить. Непонятные куски кода стали появляться в проектах. «Эта штука делает то-то, и не трогайте внутри» стало нормой. Но такими кусками закрывались какие-то дыры, где компетенций не хватало.
Появился StackOverflow, и код часто стал состоять из таких скопированных кусков, а разработчики только криво сшивали их между собой.
И, наконец, вершиной копипасты стали большие языковые модели (ChatGPT и аналоги), которые умеют сшивать разные фрагменты кода между собой лучше бездумного копирования.
Симптомы
- В проекте фрагменты «откуда-то из интернета», которые никто не понимает до конца.
- Мелкие копии одного и того же кода в разных местах.
- «Не трогайте внутри — работает же» как принцип.
- Код, сгенерированный ИИ, без тестов и без понимания граничных случаев.
Почему возникает
В результате может получиться или прекрасная экономия времени, если вы понимаете каждую строчку кода, или лютейший отборный мусорный код, который со временем доставит много проблем всем остальным.
ИИ-ассистенты добавляют новое измерение: они производят код быстро и уверенно, поэтому соблазн принять его без разбора ещё выше. Ошибки языковых моделей коварны именно правдоподобием.
Пример
«Плохой» вариант: скопированный сниппет без понимания и с непроверенным граничным поведением:
# взято со StackOverflow, не трогать
def parse_dates(s):
import re
return [d for d in re.split(r'\s+', s) if d]
«Хороший» вариант: явное понимание и тест на граничные случаи:
def split_tokens(s: str) -> list[str]:
"""Разбить строку на токены по пробелам, пустые — пропустить."""
return s.split()
def test_split_tokens():
assert split_tokens("a b") == ["a", "b"]
assert split_tokens("") == []
Как исправить
- Не вставлять код, который вы не понимаете построчно.
- Сводить дубли в библиотеки и функции.
- Код из интернета и от ИИ — пропускать через код-ревью и тесты.
- Объяснять «магические» фрагменты комментариями, пока не разобрались.