Логотип ConstructiCat
CodeBust.
Навигация по разделу ▾

Карго-культ программирование.

Карго-культ программирование — ритуальное добавление кода, паттернов или практик, скопированных без понимания того, зачем они нужны и нужны ли вообще.

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

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

Этимология

Культы карго — это милленаристские движения, возникшие в Меланезии при колониальном правлении и вдохновившие Ричарда Фейнмана ввести выражение наука культа карго. По описанию Фейнмана, после окончания Второй мировой войны последователи верили, что воздушная доставка грузов возобновится, если они проведут надлежащие ритуалы, такие как строительство взлётно-посадочных полос, разведение рядом с ними костров и ношение наушников, вырезанных из дерева, сидя в построенных диспетчерских вышках. «Форма безупречна. Выглядит точно так же, как выглядело раньше. Но оно не работает».

Затем термин стал использоваться шире как метафора пустых ритуалов. Термин «программирование по культу карго» появился в версии 2.5.1 Jargon File — глоссария компьютерного сленга, выпущенного в январе 1991 года. Между тем самого термина «культ карго» в антропологии всё чаще избегают, поскольку он не отражает сложности меланезийских верований.

Разработка ПО по культу карго

Родственным программированию по культу карго термином в программной инженерии является разработка ПО по культу карго, введённый Стивом Макконнеллом.

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

В обоих случаях Макконнелл утверждает, что в конечном счёте именно компетентность определяет, удастся проект или провалится, независимо от выбранного подхода к разработке; более того, он заявляет, что некомпетентные «организации-самозванцы» (которые лишь имитируют форму успешных организаций по разработке ПО) на самом деле занимаются тем, что он называет разработкой ПО по культу карго.

Пример

Этот метод собран из фрагментов, смысла которых автор не понимал. Присваивание локальной переменной null ничего не освобождает — объект и так станет недостижимым после возврата из метода, — а System.gc() может при каждом вызове запускать ненужную полную сборку мусора.

static String readFirstLine(Path path) throws IOException {
    BufferedReader reader = null;
    try {
        reader = Files.newBufferedReader(path);
        String line = reader.readLine();
        return line;
    } finally {
        if (reader != null) {
            reader.close();
        }
        reader = null; // «помогает сборщику мусора»
        System.gc();   // скопировано из старого ответа; никто не знает зачем
    }
}

Конструкция try-with-resources закрывает поток при любом исходе, а у каждой оставшейся строки есть причина существовать.

static String readFirstLine(Path path) throws IOException {
    try (BufferedReader reader = Files.newBufferedReader(path)) {
        return reader.readLine();
    }
}

Адаптировано по статье Википедии “Cargo cult programming” (версия 1350711895), распространяется по лицензии CC BY-SA 4.0; текст переведён и отредактирован, добавлены примеры.