Абсурдный код или «как не стоит писать»

    Совсем недавно я поделился постом, в котором собрал забавные комменты в исходном коде и читателям зашло. И я решил, а почему бы не сделать похожую подборку, только с кривым кодом? Кому интересно, добро пожаловать под кат.



    Как и в предыдущий раз, вдохновился я на этот пост благодаря очень популярному вопросу на Quora, а именно: Какой самый абсурдный код вы когда-либо видели? (Ориг. What is the most absurd code you've ever seen?)


    Вопрос размещен пару лет назад, но туда все продолжают прилетать ответы. Несколькими из них я и поделюсь ниже.


    Ответ пользователя Prashant Asthana


    “Психологическая атака во время интервью”


    Девушка с опытом работы с хорошо известными сервисами разработки на MNC. Согласно резюме, она была «разработчиком Java» и «звездным исполнителем». Я попросил ее написать алгоритм сортировки, но она надолго с ним застряла.


    Я: Что ж, это требует времени. Можете ли вы просто написать программу для поиска наибольшего числа в массиве, а не полную сортировку?
    Она: Легко.


    У нее заняло около 10 минут, чтобы написать вот это:


    int largestNumber = 0;
    for (int i = 0; i < array.length - 1; i++) {
     largestNumber =
          array[i] > array[i+1] ?
              array[i] : array [i+1];
    }
    
    System.out.println(largestNumber);

    Я был уверен, что это просто глупая ошибка.


    Я: Можете, пожалуйста, протестировать, будет ли этот код работать согласно ожиданиям?


    Прошло еще 5 минут.


    Она: Да, все работает хорошо.
    Я: Каков был входной набор?
    Она: 1,2,3,4,5
    Я (затаив дыхание): Просто сделайте реверс массива и проверьте еще раз.


    Прошло еще 5 долгих минут.


    Она: Ой, точно, глупая ошибка. Я сейчас все поправлю.


    int largestNumber = 0;
    for (int i = array.length - 1; i > 0; i--) {
     largestNumber =
          array[i] > array[i-1] ?
             array[i] : array [i-1];
    }
    
    System.out.println(largestNumber);

    Она: Теперь все работает отлично на 5,4,3,2,1. Я всё проверила.


    Пытаясь отвлечься от этой продолжающейся психологической атаки…


    Я: Так почему вы хотите сменить компанию?
    Она: Я в поиске более сложной работы...


    Ответ пользователя Thomas Breckinridge


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


    Проблема была в том, что пацан был настолько умен, что сделал все свои переменные зависимыми от регистра и длины сочетаний букв haht. По какой-то причине ему это нравилось. Например, hahthahthaht отличается от hahtHahthaht, и снова от hahthahthaHt и hahthAhthahT.


    Я не потратил слишком много времени, чтобы решить, что тысячи строк кода, как


    if (hahthAhthahT >= hahthahthaht ) then hahtHahthaht(hahtHahtHaht,HAhtHahthaht);
    else
     hahTHahthaht(hahtHahtHaht,HAhtHahthaht);

    не стоят внимания и решил отправить всю эту хрень в bitbucket.


    Небольшое обновление:
    Изначально мне казалось, что это был код Borland Delphi/Object Pascal, пока в комментариях не указали, что Pascal нечувствителен к регистру, что абсолютно правильно. Это повышает вероятность того, что код был C ++ Builder, хотя возможно, что парень играл с невосприимчивостью к регистру, зависимостью от изменения идентификатора по длине и повторением строк haht. В то время мы широко использовали оба продукта Borland в большинстве наших проектов, VisualBasic, и Win32 API C / C ++. Тем не менее, этот код заставлял кровоточить глаза всех, кто его читал.


    Ответ пользователя Alan Chavez


    Какой-то идиот написал вот это на JavaScript:


    var obj = "{\"firstname\":\"" + firstName + "\",
    \"lastname\":\"" + lastName + "\"}";
    var res = JSON.parse(obj);
    return res;

    Это довольно глупо, потому что он объединяет строки для построения JSON… В JavaScript!
    Нет необходимости объединять строки для построения JSON в JavaScript. Нет причин вообще.
    Этот фрагмент был доведен до моего сведения, когда программа начала ломаться, и идиот, который ее написал, продолжал говорить: «Эти странные символы портят программу».


    Мне потребовалась 1 минута и 36 секунд, чтобы понять, что это кавычка в имени (O’Conelly), нарушающая код. Мне потребовалось 2 минуты, чтобы переписать код правильно.
    Этот код был написан «VP of Engineering». Пару недель спустя его уволили.


    Ответ пользователя Ross Dickey



    Это просто безобидный пример из базы кода, но здесь есть ряд вещей, которые сводят меня с ума:


    1. Имя функции от первого лица («мы хотим» неявно, не делайте так)
    2. Имя функции с использованием CamelCase (это Python, а не C#)
    3. Комментарии, которые объясняют простые очевидные строки
    4. Использование хэша, где сработал бы if
    5. Или, если вам нужен хэш, сделайте его статическим и не переопределяйте его одинаково при каждом запуске функции
    6. 5 вечера указано в комментарии, где час> 16. Это сбивает с толку. Пропустите комментарий или используйте> = 17 в коде, чтобы числа совпадали
    7. Числа, передаваемые в виде строк
    8. Отрицательный ноль (?!?)
    9. Табы. Это Python, а не C++. Используйте пробелы.

    Может, я что-то упустил?


    Ответ пользователя Yoseph Radding


    Ох, ребят. Я работаю с человеком, который не должен быть разработчиком. Совсем. Он имеет 10-летний опыт работы и пишет код хуже, чем junior разработчик. Самый абсурдный код, который я когда-либо видел, это его код.


    Вот, что стало последней каплей:


    function foo(a) {
       if (a) {
           return transform(a);
       }
       return transform(a);
    }

    Ага. Он написал функцию, которая проверяет некоторые условия и выполняет некоторые действия. И если это условие не выполняется… оно выполняет то же самое чертово действие.
    Этот кусок кода он писал с множеством изменений, которые при этом были еще и запутанными. Ему понадобилось 3 дня, чтобы написать весь код и решить простейшую задачу.


    Мне потребовался 1 день, чтобы зайти и исправить его код и заставить его работать должным образом.


    Ответ пользователя Ryan Lam


    #!/usr/bin/sh
    #  Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T
    #  All Rights Reserved
    
    #  THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T
    #  The copyright notice above does not evidence any
    #  actual or intended publication of such source code.
    
    #ident  "@(#)true.sh  1.6  93/01/11 SMI"  /* SVr4.0 1.4  */

    Это исходный код программы / bin / true в какой-то UNIX-системе, созданной AT&T. Для непосвященных true — это обычная команда оболочки, которая по сути ничего не делает и возвращает успешный результат. (Это полезно в контексте бесконечных циклов, например, while true и т.д.) Такое поведение может быть легко достигнуто с помощью пустого сценария оболочки с “нулевыми” командами.


    Может показаться, что в ходе консультаций с мудрыми юристами AT&T, кто-то решил, что им необходимо защищать авторские права на содержимое / bin / true для AT&T UNIX. Поэтому они вставили шаблонное уведомление об авторских правах в пустой сценарий оболочки, который ничего не делает, и в процессе фактически заявили об авторском праве на пустой файл с абсолютно нулевыми инструкциями.


    Поэтому в следующий раз, когда вы напишите пустой сценарий оболочки без кода, обязательно проконсультируйтесь с юристом. Вы можете нарушать авторские права AT&T на…ничего.


    Ответ пользователя Khaled Bakhit


    rows= SELECT * FROM users
    int count= 0
    for each row in rows
       count= count + 1
    return count

    Ответ API занимал целую вечность.


    Что делало приведенный выше код еще хуже (помимо использования простой статической функции), select запрос вызывал бы все доступные столбцы. При условии, что мы имеем дело с очень большой таблицей, у системы просто не хватило бы памяти и она бы сломалась.


    Но подождите, это не так!


    Я посмотрел развернутый фрагмент от того же самого разработчика на куске кода, который он написал год спустя (и как ему только удалось продержаться так долго, не понятно). На этот раз он узнал о функции Count, но совершенно неправильно использовал ее.


    rows= SELECT * FROM users
    int count= 0
    for each row in rows
      count = count + 1
    
    checkCount= SELECT count(*) FROM users
    
    if count != checkCount
       throw Error
    return count

    Этот фрагмент кода часто вызывал исключения, потому как к моменту выполнения первого счетчика, таблица заполнялась бOльшим количеством записей, предоставляя второму счетчику другое значение…


    Правдивая история. Хотел бы я, чтобы это было не так.


    Заключение


    Почитать больше ответов в оригинале можно здесь. Ну и по традиции, делитесь своими вариантами абсурдного/глупого/странного кода, который вы встречали в вашей практике. Думаю, почитать будет интересно не только мне, но и всем, кто наткнется на эту статью :)

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 33

      +19

      Пример на python уж очень натянуто выглядит, если сравнивать с другими.

        +2

        Да и отрицательный ноль — вполне самодостаточное число в мире чисел с плавающей точкой

        0
        Хуже когда надо построить гусеничный самолет с бетонными крыльями и даже самый прекрасный код его не спасёт — взлететь он может только раз и то если его столкнуть с высокой горы…
          +3

          Да без проблем.
          Лет 10 назад, на собеседовании, одного разработчика попросили написать простейший пример как выбрать элемент на странице по его id. Интервьюемый спросил можно ли использовать jQuery. Ему разрешили. И тогда он наваял это:


          var id = 'id-of-element';
          var element = null;
          $('*').each(function(index, el) {
              if ($(el).id() == id) element = el;
          });
          console.log(element);
            +1
            Знаю человека который «изобрёл» свой implode) И заюзал его 6 раз в одном файле

            image
              0
              Видимо, свое роднее и понятнее
              +3

              Множество раз в жизни сталкивался с ужасным кодом, на уровне примеров из статьи. Нередко, эти ужасы были написаны лицами с должностями "Senior Developer", "VP Of Engineering".


              Но не веду никакого дневника с примерами такого кода. Лень, да и смысла особого нет. Идиотов много, и среди разработчиков тоже, и бывает, что по карьерной лестнице это совершенно никак не мешает подниматься.


              Из легко вспоминающегося: филиппинские "разработчики" налабали код типа:


              rows = db.query("SELECT * FROM very_big_table")
              rows.sort()
              return rows[0]

              И у них так было сделано везде! Надо ли говорить, что сайт после прикладывания их рук, стал тормозить просто неимоверно! Разработчиков поставляла аутсорсинговая компания из США. Рейтинг этой компании везде около 5* (на различных сайтах типа Yelp, и т.д.), с массой положительных отзывов.


              Деньги, потраченные на несколько месяцев работы этих разработчиков, вернуть отказались.

                +4
                Странно, что govnokod.ru не вспомнили. Там, признаться, и моих «перлов» парочка есть.
                +10

                Я — учитель в универе. У меня таких приколов каждый семестр хоть отбавляй. Но им, более менее, простительно. Вот из последних, который запомнился:


                function isArray(arr) {
                    if (Array.isArray(arr)) {
                        return true
                    } else {
                        return false
                    }
                }
                  +1

                  Эталонный индусокод моей юности:
                  if((a>b).toString().length()==4)

                    0
                    У меня отец информатику в школе преподает, как то ему тоже рассказывал, что предыдущие поколение разработчиков повсюду на оставляли подобных перлов, на что он мне спокойно ответил:
                    А так в школьных учебниках написано, ибо автору нужно показаь школьникам пример с if, а реальных примеров они придумать не могут
                      +1

                      Студенческий код — это для особых ценителей, да.


                      Слабонервным не смотреть

                      (если что, смысла в этом коде и не должно быть много, тут ассемблер разбирался; претензии к эстетике скорее )





                      Но ладно, тут люди просто еще не понимают, что тут такого — работает же! Какие еще отступы :)

                      0
                      Последний кусок SQL-кода я бы сдал в палату мер и весов на вечное хранение.
                        +2

                        Ну, если тут начали вспоминать всякие мелочи — то вариации вот этого кода я видел многократно:


                        for (int i=0; i<N; i++) {
                            if (array[i] == foo) {
                                write('Элемент найден');
                            } else {
                                write('Элемент не найден');
                            }
                        }
                          0
                          Не понимаю, а в чём проблема? Заменить for на foreach, break добавить и норм. Ну ещё можно в отдельную функцию, возвращающую boolean, вынести.

                          Или вы имеете в виду, что надо было использовать встроенную функцию для этого? Ну, да, но не везде она есть, а где есть реализована скорее всего примерно также.
                            +3

                            Проблема в том, что вывод "Элемент не найден" можно делать только по окончанию цикла, а никак не на каждой итерации.

                              +2
                              Блин, не заметил(
                          0
                          Не ЖЭУ, а ДЖЭУ.
                            +1

                            Один из таких примеров я даже на говнокод постил.


                            $opl1_type_arr = array("no","yes");
                             for($i=0;$i<2;$i++){
                                        $str_pr = $opl1_type_arr[$i];
                                        echo "<option value=\"$str_pr\"";
                                        if($RowOP['pay_peredano']==$str_pr) echo " selected";
                                        switch ($str_pr) {
                                case 'yes':
                                 echo ">Да</option>";
                                 break;
                                case 'no':
                                 echo ">Нет</option>";
                                 break;
                               }
                             }
                              0
                              if (hahthAhthahT >= hahthahthaht ) then hahtHahthaht(hahtHahtHaht,HAhtHahthaht);
                              else
                              hahTHahthaht(hahtHahtHaht,HAhtHahthaht);

                              Это повышает вероятность того, что код был C ++ Builder
                              Вот серьезно? Там точно был then?? Это в какой же версии? Сдается мне, что тут нашла коса на камень в плане профессионализма.
                                0
                                Но и не Delphi, раз уж; перед else. Да, автору сначала лучше было бы определиться с языком…
                                0

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

                                  0
                                  Возможно, баян:

                                  int n = 100;
                                  for (int i = 0; i < n; n++)
                                  {
                                  // do something
                                  }

                                  Комментарий: «почему-то этот цикл жутко тормозит»
                                    0
                                    здесь скорее не тупость, а банальная невнимательность/очепятка.
                                    +2
                                    Из наследия после одной не очень известной аутсорс галеры, которую послали нафиг, ибо проект стало поддерживать нереально дорого, и наняли меня «спасать ситуацию».
                                    Про банальщину вроде функций вида
                                    if(condition) return true;
                                    else return false;
                                    
                                    даже говорить влом…
                                    Но вот такие перлы реально убивают до сих пор:
                                    let chain = Promise.resolve();
                                    chain
                                      .then(() => {
                                        doSomething1();
                                      })
                                      .then(() => {
                                        doSomething2();
                                      })
                                      .then(() => {
                                        doSomething3();    
                                      });
                                    
                                    В первый месяц у меня еще была возможность спросить «зачем?». На что я получил закономерный ответ: «ну чтоб дожидалось запросов в тех функциях». А на мое объяснение, что если не вернуть из колбэка промис, то ждать не будет, а у него ни колбэк, ни вызываемые функции ничего не возвращают, я услышал лишь «разве?».
                                    Надеюсь он больше не будет так делать… Но человек реально верил в «магию» промисов в js и даже не догадывался, что это работает несколько иначе, чем он хотел.

                                    А вот еще одинт финт, я нашел уже когда обратная связь оборвалась:
                                    <div v-for="(item, i) of array" v-if="i === index">
                                     ...
                                    </div>
                                    Если кто не знает, это такой способ написать цикл for и if в шаблонах vue. И я бы мог списать это на то, что человек не понимает шаблонов и пишет как умеет… Но я увидел абсолютно аналогичную штуку в js коде:
                                    let item;
                                    for(let i = 0; i < array.length; i++) {
                                      if(i === index) {
                                        item = array[i];
                                      }
                                    }
                                    
                                    Я так и не понял сокрального смысла сия кода, и почему нельзя было просто написать
                                    const item = array[index];

                                    Остается только предполагать, что у человека не было дома отопления, и он грелся таким образом от проца.
                                      +1

                                      Я думал, что меня одного if'ы типа: if (condition) return true... вместо return condition раздражают.


                                      Есть еще просто непаханное поле регекспов. Раньше я не понимал высказывания "now you have two problems" про регекспы. Но теперь вижу, что 99.99% разработчиков не имеют даже минимального понимания, что такое регекспы и как они работают.


                                      Если бы, например, мне платили по доллару за каждый увиденный регексп /.*something.*/, стал бы уже миллионером.

                                      +1

                                      Сталкивался с кодом уровн:


                                      try {
                                        data = parseAsFirstDataType(someFile)
                                      } catch() {
                                        data = parseAsSecondDataType(someFile)
                                      }

                                      Те считалось, что если не удалось распарсить файл первым типом, то второй тип парса обязательно спасет. (Наткнулся на код, когда не мог понять почему приложение падает, а исключения нет)

                                        0
                                        А когда-то, я написал веселую статью с примерами различного некорректного тестирования, и меня забанили на Хабре за цитирование… эх…
                                          +2
                                          Мотоцикл не мой, прислали по Скайпу кусок вот такого кода на Delphi

                                          pointer := nil;
                                          pointer.Free;

                                            –1
                                            Интересно, кто-нить заметил, что оба кода из статьи будут врать, если массив содержит только отрицательные элементы? )))
                                              –1

                                              Ну почему же? Первый код отлично работает на -5 -4 -3 -2 -1, а второй — на -1 -2 -3 -4 -5!

                                              +1
                                              Работаю с индусским продуктом. Php знаю поверхностно. Вижу такое:
                                              if (условие) {
                                              $row[0]['<option1>'] = $row[0]['<option1>'];
                                              $row[0]['<option2>'] = $row[0]['<option2>'];
                                              } else { ... }
                                              

                                              Я не ошибся, обе стороны выражения равны! Может в Php это имеет какой-то смысл?
                                              Думаю, «ну задумали что-то, ну забыли исправить, бывает». Исправляю, читаю код дальше. Ан нет, такое сплошь и рядом.
                                              Ещё часто вижу что-то типа:
                                              if ($_REQUEST['userType'] == '<somevalue>') {
                                              $var = $_REQUEST['userType'];
                                              } else {
                                              $var = $_REQUEST['userType'];
                                              

                                              Что мешало в одну строку написать? Ребята видимо в количествах строк кода получают зарплату. Любой мало-мальски адекватный IDE покажет предупреждения.
                                              А уж бесконечные цепочки из if else даже упоминать не буду. Switch case видимо в Индии запрещён.

                                              Only users with full accounts can post comments. Log in, please.