Недавно, ковыряя один не особо популярный фреймворк, я наткнулся на следующий кусок кода.


Потому что роботы-убийцы любят единорогов!

Не знаю, какую мысль и в каком настроении хотел донести автор, но это навело меня на размышления: как часто мы используем комментарии не совсем по назначению? Немного находок под катом.

//Не рекомендуется к прочтению, если Вы не любите пятничные посты во вторник.

Существуют разные мнения на тему комментирования кода. Есть адепты self-explanatory code (самообъясняющего кода). Согласно этой концепции переменные и функции именуются максимально развёрнуто, что во многих случаях избавляет от необходимости писать дополнительные комментарии. Другие предпочитают описывать каждый свой шаг в комментариях в помощь себе и тем, кому в дальнейшем придётся работать с кодом. Некоторые пишут 3-этажные конструкции в одну строку и никак их не комментируют (сам таким грешил, признаюсь). Но есть и другие случаи.

Печальное признание


Приходилось ли Вам писать что-то, за что Вы сами себя ненавидели? Вы понимали, что так делать плохо и некрасиво, но обстоятельства (требования заказчика, например) были сильнее Вас? У некоторых такое бывало.

//This code sucks, you know it and I know it.
//Move on and call me an idiot later.

Этот код отвратителен, Вы знаете это и я это знаю. Двигайтесь дальше, потом назовёте меня идиотом.

// I am not responsible of this code.
// They made me write it, against my will.

Я не в ответе за этот код. Меня заставили это написать, против моей воли.

// I have to find a better job

Пора найти работу получше

// I dedicate all this code, all my work, to my wife, Darlene, who will 
// have to support me and our three children and the dog once it gets 
// released into the public.

Я посвящаю весь этот код, всю мою работу, моей жене Дарлен, которой придётся заботиться обо мне, наших троих детях и собаке, как только это увидит свет.

А иногда корпоративные стандарты написания кода заставляют делать что-то, что не поддаётся внутренней логике разработчика.

const int TEN=10; // As if the value of 10 will fluctuate... 

Будто значение 10 может варьироваться...

Вспомнился случай, когда мне на фрилансе достался небольшой кусок работы над одним каталогом. Система взаимодействия была выстроена сложным образом, в результате чего прямой обратной связи с заказчиком не было. И нужно было сделать «как на картинке, потому что так утвердил заказчик», хоть это и было некрасиво с точки зрения кода. Вам тоже такие попадались?

Предупреждения и утерянные знания


Бывает, что в какой-то код лучше не вмешиваться. Не пытаться его рефакторить, оптимизировать или каким-либо ещё образом улучшить.

/*
 * You may think you know what the following code does.
 * But you dont. Trust me.
 * Fiddle with it, and youll spend many a sleepless
 * night cursing the moment you thought youd be clever
 * enough to "optimize" the code below.
 * Now close this file and go play with something else.
 */ 

Вам может показаться, Вы знаете, что делает последующий код. Это не так. Поверьте мне. Влезьте в него, и Вы проведёте много бессонных ночей, проклиная момент, когда Вы подумали, что достаточно умны для его «оптимизации». А теперь закройте этот файл и пойдите поиграйтесь с чем-то другим.

/*
 * Dear Maintainer
 *
 * Once you are done trying to ‘optimize’ this routine,
 * and you have realized what a terrible mistake that was,
 * please increment the following counter as a warning
 * to the next guy.
 *
 * total_hours_wasted_here = 73
 */

Уважаемый Сопровождающий! Когда Вы закончили свою попытку «оптимизировать» этот процесс и поняли, насколько чудовищной была эта ошибка, увеличьте последующий счётчик в назидание тем, кто придёт за Вами.

// Magic. Do not touch.

Магия. Не трогать.

/*
after hours of consulting the tome of google
i have discovered that by the will of unknown forces
without the below line, IE7 believes that 6px = 12px
*/
font-size: 0px;

После часов консультаций и гугления, я обнаружил, что по воле неведомых сил без последующей строки IE7 считает, что 6px = 12px

// Autogenerated, do NOT edit. All changes will be undone.

Сгенерировано автоматически, НЕ редактировать. Все изменения будут отменены.

Последнее, кстати — интересный пример сообразительности в борьбе с попытками влезть в Ваш код. Говорят, работает.

Боль и отчаянье


Вам приходилось работать с чем-то, что приводило Вас в полнейшее отчаянье? Разработчик просмотрщика изображений Xee столкнулся с разбором формата PSD. Но с кем может поделиться программист своими страданиями, как не с комментарием? Ниже — перевод, оригинал на данный момент лежит на гитхабе.

Здесь я хотел бы остановиться на минутку и рассказать о формате Adobe PSD. PSD не является хорошим форматом. PSD даже не является плохим форматом. Назвать его так было бы оскорблением для других плохих форматов, таких как PCX или JPEG. Нет, PSD — чудовищный формат. Несколько недель работы над этим кодом возвели мою ненависть к PSD до уровня яростного огня, пылающего лютой страстью миллиона солнц.

Если есть два способа что-то сделать, PSD использует оба, в разных местах. Вдобавок он создаст ещё три способа, которые бы не пришли в голову любому здравому человеку, и использует их заодно. PSD возводит несогласованность до уровня искусства. Почему, например, он решил, что именно эти блоки должны быть выровнены на четыре байта, и это выравнивание не должно быть включено в размер? Другие блоки в других местах либо не выравниваются, либо включают выравнивание в размер. Тут, впрочем, оно не включено. Любой из этих трёх способов подошёл бы. Разумный формат остановился бы на одном. PSD, конечно же, использует все три, и другие.

Попытаться извлечь данные из PSD файла — всё равно, что искать что-то на чердаке Вашего эксцентричного старого дядюшки, умершего от атаки взбесившейся пресноводной акулы на свой 58-й день рождения. Последняя деталь не имеет особого значения для повествования, но в данный момент я провожу немало времени, представляя занятные судьбы для людей, ответственных за этого Руба Голдберга среди файловых форматов.

Ранее я пытался заполучить свежие спецификации формата PSD. Для этого мне пришлось обратиться к ним за разрешением обратиться к ним для рассмотрения возможности отправки мне этого священного тома. Процесс включал отправку им по факсу копий тех или иных документов, возможно, подписанных кровью. Единственное приходящее мне в голову объяснение такой сложности процесса — им чрезвычайно стыдно за создание этой мерзости. Естественно, я не был в состоянии пройти эту процедуру, но если бы я смог, я бы распечатал все до единой странички этой спецификации, и сжёг бы их. Будь это в моих силах, я бы собрал все копии спецификации в мире, и отправил их ракетой прямо на Солнце.

PSD — не мой любимый формат.

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

Способ развлечь себя


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

    #Christmas tree initializer  
    toConnect = []  
    toRead =   [  ]  
    toWrite = [    ]   
    primes = [      ]  
    responses = {}  
    remaining = {}  

Инициализатор новогодней ёлочки

/////////////////////////////////////// this is a well commented line

Хорошо закомментированная строка

Repeat
    ...
Until (JesusChristsReturn) ' Not sure

Религиозные догмы под сомнением...

// if i ever see this again i'm going to start bringing guns to work

Ещё раз такое увижу — начну носить оружие на работу

//Abandon all hope ye who enter beyond this point

Оставь надежду, всяк сюда входящий

// drunk, fix later

Пьян, исправить позже

Шутки шутками, а когда-то я оставлял себе похожую записку на стикере на мониторе: «Протрезвеешь — проверь классы XXX, YYY»…

catch (Exception e) {
 //who cares?
}

Кому какое дело?

// I don't understand how the following bit works, but it worked in the program I stole it from.

Не знаю, как работает этот кусок, но он работал в программе, откуда я его спёр.

// This code was written by a genius so don't try to understand it with
// your tiny little brain.

Этот код написан гением. Не пытайся понять его своим миниатюрным мозгом.

double penetration; // ouch

И правда, ой...

// Added because boss changed his mind : 20020111,20020501,20020820, ...
// Commented out because boss changed his mind : 20020201,20020614,20020908, ...

Добавлено, т.к. босс передумал… Закомментировано, т.к. босс передумал...

//Haleluya i can go home!

Алелуйя, я могу идти домой

Я пошёл домой. А Вы расскажите, каким был Ваш самый памятный или забавный комментарий.

Спасибо, что остаетесь с нами. Вам нравятся наши статьи? Хотите видеть больше интересных материалов? Поддержите нас оформив заказ или порекомендовав знакомым, 30% скидка для пользователей Хабра на уникальный аналог entry-level серверов, который был придуман нами для Вас: Вся правда о VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps от $20 или как правильно делить сервер? (доступны варианты с RAID1 и RAID10, до 24 ядер и до 40GB DDR4).

Dell R730xd в 2 раза дешевле? Только у нас 2 х Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100 ТВ от $249 в Нидерландах и США! Читайте о том Как построить инфраструктуру корп. класса c применением серверов Dell R730xd Е5-2650 v4 стоимостью 9000 евро за копейки?

Комментарии (69)


  1. iit
    28.08.2018 11:32
    +1

    Осторожно! phpDoc


    Заголовок спойлера
    /**
     * Class Iin
     * @package App\Classes\Support
     *
     * Класс проверки иин для казахстана
     *
     * ИИН содержит 12 цифр из которых
     * первые 6 цифр - дата рождения [гг-мм-дд]
     * 7-я цифра - пол и век (нечетные цифры - муж, четные женский)
     *      1,2 - 19 век
     *      3,4 - 20 век
     *      5,6 - 21 век
     *      7,8,9,0 - зарезирвированны на будущее
     * 8 - 11 регистрационный гос номер
     * и 12 - контрольный разряд
     *
     * Иин проверяесться по контрольной сумме через две последовательности
     * Сперва каждая цифра иин, кроме последней умножается на цифру из 1-й последовательности и суммируется
     * Результат делиться на 11 и если он от 0 до 9 и соотвествует 12-й цифре иин то иин верен,
     * если результат 0 - иин не верен, если результат 10 - то проверка продолжается по второй последовательности
     * Если результат проверки по всторой последовательности от 1 до 9 и равен 12-й цифре иин - то иин верен иначе проверка
     * заканчивается и иин не верный.
     *
     * UPD - Хьюстон у нас проблемы - некоторые безответственные работники цонов делают неверные иин с 7,8 и 9 цифрой для 22 и 23 века.
     * В итоге люди для системы как из 23 века а сами из 21 или 20 - так что пока не настал 22 и 23 век их разряды будут для 20 века.
     * Не люблю костыли но работники цонов такие работники - а менеджеры и клиенты недовольны, так что придеться
     *


    1. onix74
      28.08.2018 11:55

      Это зачОт!!!


    1. AibekAS
      28.08.2018 15:00

      Неужели процесс генерации ИИН не автоматизирован?


      1. iit
        29.08.2018 06:42

        Существует как не странно — правда на местах его походу не все и не всегда используют.


    1. ThunderCat
      28.08.2018 20:57

      Результат делиться на 11
      шайтанама…


      1. Wesha
        28.08.2018 23:39
        +1

        Ну дык ведь, как говаривала амёба, «Господь завещал делиться».


      1. boulder
        29.08.2018 00:26

        Возможно, вы удивитесь, но существует признак деления числа на 11!
        «Число делится на 11, если сумма цифр, которые стоят на четных местах, равна сумме цифр, стоящих на нечетных местах, либо отличается от неё на 11.»


        1. Yggaz
          29.08.2018 07:06

          Гррр.
          Если N = (сумма цифр на чётных местах) — (сумма цифр на нечётных местах) кратно 11.

          Это так-то просто. 1 сравнимо с 1 по модулю 11 — дальше не буду это уточнять, модуль всегда 11. 10 сравнимо с -1. 100 — с 1, 1000 — с -1 и так далее. То есть мы можем построить некоторую сумму, включив туда разряды 1, 100, 10000 и так далее со знаком плюс, а 10, 1000, 100000 и так далее — со знаком минус, и так построенная сумма будет сравнима с исходным числом. Если, в частности, она сравнима с 0 (то есть равна 0, +-11, +-22 и так далее), то и исходное число кратно 11.
          Теперь осталось только заметить, что если эта сумма сравнима с 0, то и противоположное ей число (1, 100, 10000 с минусом, 10, 1000, 100000 с плюсом) тоже будет сравнимо с 0 по модулю 11. То есть если нас интересует только делимость исходного числа на 11 (а не величина остатка) — то мы можем сказать «сложи цифры на чётных местах и вычти цифры на нечётных» или «сложи цифры на нечётных местах и вычти цифры на чётных», не заботясь о том, с какой стороны человек начнёт цифры считать.


    1. roscomtheend
      29.08.2018 12:08

      Придёться делиться… надеюсь, сам алгоритм без ошибок.


  1. zzzmmtt
    28.08.2018 11:34

    «Because killer robots like unicorns» переведён неверно. На мой взгляд тут like использован в значении such as. Вспоминаем первый закон робототехники, собственно killer robots ему противоречат, то бишь не существуют, как и единороги.


    1. Vasiliskov Автор
      28.08.2018 11:44
      +3

      Переведён согласно грамматике английского. Возможно, автор имел ввиду именно то, что Вы сказали, но тогда должно было бы быть «robots are like unicorns».


      1. zzzmmtt
        28.08.2018 11:47

        Верное замечание. Узнать, о чём думал автор, нам не дано, ибо автор для нас на данном этапе неизвестен.


        1. Wesha
          28.08.2018 19:52
          +4

          Вспомнилось знаменитое «time flies like an arrow > мухи времени любят стрелу».


        1. ainoneko
          29.08.2018 10:57

          Если «robots» переводится как «роботит» или «роботеет», то «like» может быть «как».



      1. zzzmmtt
        29.08.2018 11:18

        Собственно речь видимо об этой cms. По логике тут речь о чем-то несуществующем (не передана линия в метод или не найдено соответствие в языковом файле). Но додумывать, что имел в виду автор — бессмысленно.


        1. Vasiliskov Автор
          29.08.2018 11:44

          Речь, собственно, о фреймворке, на базе которой эта cms написана.


  1. Perlovich
    28.08.2018 11:39
    +2

    А иногда корпоративные стандарты написания кода заставляют делать что-то, что не поддаётся внутренней логике разработчика.

    const int TEN=10; // As if the value of 10 will fluctuate...


    Конечно, если так называть константы, то не увидишь в этом логики. Нормальными и полезными были бы названия: MAX_STUDENT_COUNT, SUCCESS_CODE, MAIN_GATE_ID, etc.

    Извиняюсь за занудство в юмористическом посте)


    1. vesper-bot
      28.08.2018 12:18
      +2

      Скорее всего это был запрос на рефактор из-за hardcoded constant, которая алгоритмически ничем иным, кроме как 10, не может быть.


    1. Nucleotide
      28.08.2018 15:32

      Иногда константа должна означать именно 10: BigDecimal


      1. MikailBag
        28.08.2018 22:52
        +1

        Потому что это не столько TEN, сколько RADIX


      1. ainoneko
        29.08.2018 11:42

        А она точно равна 10?

        В указанном месте она берётся из массива:

        public static final BigDecimal TEN =
                zeroThroughTen[10];
        

        А перед этим она записывается в массив — и не выглядит как просто число:
         // Cache of common small BigDecimal values.
            private static final BigDecimal zeroThroughTen[] = {
        ...
                new BigDecimal(BigInteger.TEN,          10, 0, 2),
            };
        


        1. Nucleotide
          29.08.2018 12:35

          Да, как и описано в комментарии, этот массив — кэш для первых десяти значений.
          Под десятым индексом лежит BigDecimal со значением 10.
          Тут же, кстати, можно увидеть и другую константу TEN — BigInteger.TEN.


  1. Porfel
    28.08.2018 11:42

    image


    1. Vasiliskov Автор
      28.08.2018 11:46
      +2

      Поговаривают, кто-то использовал такую goto метку:
      ICantBelieveImUsingAGoto:


      1. ilay
        28.08.2018 15:40

        Говорят, это было в исходном коде DefWindowProc из WinAPI.


      1. anamnian
        29.08.2018 13:41

        Если не ошибаюсь, то Макконнелл писал:

        Использование goto — это вопрос религии. Моя догма: в современных
        языках вы легко можете заменить девять из десяти операторов goto эквивалентными последовательными конструкциями. В этих простых случаях вы должны заменять операторы goto просто по привычке.

        В сложных случаях вы также можете изгнать goto в девяти случаях из десяти: можно разбить код на меньшие по размеру методы, использовать try%finally или вложенные if, проверять и перепроверять статусную переменную или реструктурировать условные выражения. Исключить goto в таких случаях сложнее, но это хорошее умственное упражнение, а методы, обсуждаемые в этом разделе, предлагают вам инструменты для этих целей.

        В одном случае, оставшемся из 100, в котором применение goto — вполне легальное решение задачи, подробно задокументируйте, а затем используйте его. Если
        у вас на ногах резиновые сапоги, не стоит обходить весь квартал, чтобы не запачкаться в грязной луже. Но не отвергайте варианты избавления от goto, предлагаемые другими программистами. Они могут заметить то, на что вы не обратили внимания.


  1. k12th
    28.08.2018 11:44

    Перефразируя Марка Твена, "мой дедушка на смертном одре взял с меня обещание не репостить этот сборник смешных комментариев в коде, потому что уже тогда он был с бородой."


    1. Vasiliskov Автор
      28.08.2018 11:51
      +2

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


      1. Barafu_Albino_Cheetah
        28.08.2018 12:30
        +1

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


      1. besisland
        28.08.2018 22:57
        +1

        Последний раз вроде бы было в ноябре: https://m.habr.com/post/343168/


        1. Vasiliskov Автор
          29.08.2018 00:14

          Извините, в ноябре было не до того


      1. ainoneko
        29.08.2018 11:00

        про бородатые шутки
        Иди про бородатую корову или лошадь: плохая корова, старая, изнурённая лошадь.


  1. noeer
    28.08.2018 11:47

    Уважаемый Сопровождающий! Когда Вы закончили свою попытку «оптимизировать» этот процесс и поняли, насколько чудовищной была эта ошибка, увеличьте последующий счётчик в назидание тем, кто придёт за Вами.

    Обязательно возьму на вооружение.


    1. DnV
      29.08.2018 02:15
      +1

      Обложите лучше проблемный код тестами и не придётся такие вот назидания писать.


  1. Mr_Zerg
    28.08.2018 13:55

    В секции «Боль и отчаяние», в переводе комментария во 2 абзаце на 4 строке опечатка:

    … блоки должны быть выравняны на четыре байта, ...
    . Наверное, всё-таки, выравнены.


    1. Vasiliskov Автор
      28.08.2018 13:59

      Спасибо за наводку, погуглил, исправил. Задумался: а в данном контексте выравнены или выровнены?.. :)


      1. janatem
        28.08.2018 17:11

        Здесь, конечно, «выровнены», то есть сделаны ровными (а не равными) — если правильно представить адресное пространство в виде прямоугольника, то объекты окажутся геометрически выровненными по правому краю.


        1. Vasiliskov Автор
          29.08.2018 00:11
          +1

          Договорились, исправил ещё раз. :)


  1. alexgp13
    28.08.2018 14:00

    Немного из 1С…
    Комментарий, встреченный в одном популярном модуле, распространяемом на коммерческой основе (не буду называть компанию-разработчика):
    //Вася, убери эту х****, и будет счастье.

    И из серии
    //магия, не трогать
    Как то столкнулись с ситуацией, что 1С упорно отказывалась присваивать значение переменной с первого раза, пришлось продублировать строку и добавить комментарий.


    1. darthslider
      28.08.2018 15:44
      +1

      Видел где-то скрин 1С кода со смыслом: «Если Х = нет //Сервера ответ»


      1. Apatic
        29.08.2018 02:15
        +1

        image


        1. darthslider
          29.08.2018 09:43

          Да, вот именно оно. По какому поисковому запросу вы нашли эту картинку, если не секрет? Мне вот не удалось :)


          1. Apatic
            29.08.2018 13:43

            А это просто сбой в матрице. Вчера днем мне эту картинку в мессенджере скинул знакомый 1С-ник.


  1. jack7277
    28.08.2018 14:04

    Я когда программированием контроллеров занимался, то количество экспрессивного мата в коде и комментах зашкаливало, потому что в здравом уме код туда никто не полезет читать, а во вторых меня заставляли делать костыльные программные хаки под глючные исполнительные механизмы, так что всё норм.


  1. SmilePic
    28.08.2018 14:05

    Мне запомнилось вот такое:

    int[] unlinkinPark; //массив точек, которые должны быть убраны из рассмотрения на следующем шаге работы алгоритма.

    В том проекте было много всего забавного, но не всё пройдёт цензуру)


  1. Akdmeh
    28.08.2018 14:47

    Иногда пишу что-то нелестное об умственных способностях предыдущего программиста и объясняю, что сейчас плохо, но было еще хуже.
    Чаще всего это касается случаев, когда нужно рефакторить 150 кб файл index.php, в котором находится все — классы, контроллеры, запросы в БД, шаблоны, реклама, настройки, но нет возможности переписывать на фреймворк из-за нерентабельности разработки; проблема читаемости этих файлов решается хотя бы вынесением разметки в несколько view-файлов и созданием уровня абстракции над базой данных, чтобы убрать сложные MySQL-запросы с главного файла в отдельные методы и поцепить на это все PDO с подстановкой строк для защиты.


  1. DEmon_CDXLIV
    28.08.2018 15:16
    +2

    int currentMonth;
    // А я оптимист! 
    long currentYear;
    


  1. defusioner
    28.08.2018 16:07

    Как близко моему сердцу лёг комментарий про PSD, замени его на RTF и получишь всё то что я думаю об этом прекрасном формате! Рыдаю!


    1. khim
      29.08.2018 02:04
      +1

      OOXML такой же. Да и вообще большинство форматов, изначально поддерживавшихся одной программой так устроены.


  1. dimmount
    28.08.2018 16:10
    +2

    Грустный комментарий в битриксе:

    // nobody interested in my errors :(
    



  1. m-rv
    28.08.2018 16:57
    +1

    перед костыльным кодом:
    // написал, но осуждаю

    перед генерацией исключения:
    // ошибка, которая никогда не произойдет:


  1. janatem
    28.08.2018 17:22

    Когда-то писал код с напарником, и комментарии играли роль чата:

    -- name, ты зачем эту фигню здесь написал?

    Потом в следующем комите либо фигня убиралась, либо добавлялось объяснение:
    -- name, ты зачем эту фигню здесь написал?
    -- потому что гладиолус


    1. Fly3110
      29.08.2018 06:24

      Аналогично было :)
      Писали на php, каждый использовал свой собственный символ для комментария (// и #)


  1. Gorthauer87
    28.08.2018 17:30

    // When I wrote this, only God and I understood what I was doing
    // Now, God only knows


    Пожалуй это один из самых злободневных, когда что-то действительно сложное выдумываешь, то в сам момент все понимаешь и осознаешь, а вот потом все улетучивается.


  1. ilammy
    28.08.2018 23:01

    Рассказ Брайана Кантрилла о программистском фольклоре (на английском):


  1. dunaich75
    28.08.2018 23:30

    Самый лучший заголовок, который я видел:

    Тот самый заголовок из ядра Linux
    /*
     * Generic driver for memory-mapped GPIO controllers.
     *
     * Copyright 2008 MontaVista Software, Inc.
     * Copyright 2008,2010 Anton Vorontsov <cbouatmailru@gmail.com>
     *
     * This program is free software; you can redistribute  it and/or modify it
     * under  the terms of  the GNU General  Public License as published by the
     * Free Software Foundation;  either version 2 of the  License, or (at your
     * option) any later version.
     *
     * ....``.```~~~~````.`.`.`.`.```````'',,,.........`````......`.......
     * ...``                                                         ```````..
     * ..The simplest form of a GPIO controller that the driver supports is``
     *  `.just a single "data" register, where GPIO state can be read and/or `
     *    `,..written. ,,..``~~~~ .....``.`.`.~~.```.`.........``````.```````
     *        `````````
                                        ___
    _/~~|___/~|   . ```~~~~~~       ___/___\___     ,~.`.`.`.`````.~~...,,,,...
    __________|~$@~~~        %~    /o*o*o*o*o*o\   .. Implementing such a GPIO .
    o        `                     ~~~~\___/~~~~    ` controller in FPGA is ,.`
                                                     `....trivial..'~`.```.```
     *                                                    ```````
     *  .```````~~~~`..`.``.``.
     * .  The driver supports  `...       ,..```.`~~~```````````````....````.``,,
     * .   big-endian notation, just`.  .. A bit more sophisticated controllers ,
     *  . register the device with -be`. .with a pair of set/clear-bit registers ,
     *   `.. suffix.  ```~~`````....`.`   . affecting the data register and the .`
     *     ``.`.``...```                  ```.. output pins are also supported.`
     *                        ^^             `````.`````````.,``~``~``~~``````
     *                                                   .                  ^^
     *   ,..`.`.`...````````````......`.`.`.`.`.`..`.`.`..
     * .. The expectation is that in at least some cases .    ,-~~~-,
     *  .this will be used with roll-your-own ASIC/FPGA .`     \   /
     *  .logic in Verilog or VHDL. ~~~`````````..`````~~`       \ /
     *  ..````````......```````````                             \o_
     *                                                           |
     *                              ^^                          /  *
     *           ...`````~~`.....``.`..........``````.`.``.```........``.
     *            `  8, 16, 32 and 64 bits registers are supported, and``.
     *            . the number of GPIOs is determined by the width of   ~
     *             .. the registers. ,............```.`.`..`.`.~~~.`.`.`~
     *               `.......````.```
     */
    


  1. daserge
    29.08.2018 00:07

    Еще больше перлов можно почитать на SO.


  1. gro
    29.08.2018 08:35

    Я тоже поначалу показывал в комментариях своё остроумие.
    Потом разок почитал и понял, что ни разу не остроумный.
    И перестал.
    И всем советую.


  1. rjhdby
    29.08.2018 09:24

    String fakeAnswer = "{ \"isError\" : \"unknown\" }";
                    try {
                        reader = new JSONObject(fakeAnswer);
                    } catch (JSONException e2) {
                        //Абсолютно маловероятно
                        e2.printStackTrace();
                        reader = new JSONObject();
                    }


  1. Arris
    29.08.2018 09:40

    Уважаемый Сопровождающий!

    без последующей линии

    Алелуйя


    новая эра переводов на хабре — теперь с гуглотранслейтом, но без мозга!

    P.S. Я уже видел перевод этих «смешных историй» на хабре.


  1. nikitasius
    29.08.2018 10:31

    https://habr.com/post/343168/
    и т.д. через кнопку поиска.


  1. Foreglance
    29.08.2018 11:53

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


    1. iit
      29.08.2018 12:02

      Надеюсь это чему-нибудь научило заказчика. Была история в одной фирме, что как обычно бизнес использовал "быдлокод как инструмент" и в итоге задолбавшись отлавливать баги свалил не один человек а целая комманда из 20 опытных разработчиков. После этого наняли вторую комманду и мало того чтобы их завлечь начали раздавать опционы, в итоге и эта комманда свалила. Только с третьей коммандой контора смогла выделить ресурсы и терпение на рефакторинг и теперь вроде бы у них все хорошо.


      1. Foreglance
        29.08.2018 12:23

        Трудно сказать. Специалисты на стороне заказчика были вполне адекватные, квалифицированные, но у американцев все строго — что-то не так как ожидали от консультанта — немедленная реакция.


  1. Taliesien
    29.08.2018 12:22

    В процессе, когда реализовать задачу надо было «вчера». Особо не думаешь об оптимизации и лепишь первое пришедшее в голову решение, построенное на уже существующих методах, которые могут делать много лишнего, но в процессе дают нужный результат. И такие моменты обозначаются как:
    //Переписать А когда спустя пару лет лезешь в этот самый «новый метод», который за годы начал вызываться из кучи других разных мест, с мыслями: «Руки бы оторвать тому, кто это написал» и видишь свою фамилию и скромное «переписать»…


  1. Nexta
    29.08.2018 13:18
    +1

    делали систему для компетентных органов. Обработчик одной из форм выбиравший «подозреваемых» назывался destiny. В нем были комментарии:
    // проверка правильности переменных==танцы с бубнами
    //обрабатываем попытки получить отрицательные значения времени
    //если образовалось марсианско/нептунианское время
    //конец танцев с бубнами
    из этого же проекта
    //Вызываю базу! Где там этот хренов Оракл?!!!
    // не забыть обрубить соединение базу и сессию прибить по-сильнее, а то найдется
    переменные в другом проекте:
    $bredmarketologa
    $dreem_in_summer_night


  1. atrosinenko
    29.08.2018 13:25
    +3

    Иногда попадается не только в комментариях: например, в документации QEMU


    Lines should be 80 characters; try not to make them longer.
    ...
    Rationale:
     - Some people like to tile their 24" screens with a 6x4 matrix of 80x24
       xterms and use vi in all of them.  The best way to punish them is to 
       let them keep doing it.
    ...

    А в Firefox какое-то время назад были параметры для включения экспериментального и "ваще экспериментального" WebRender:


    gfx.webrender.enabled
    gfx.webrendest.enabled