Пользователь
11,2
рейтинг
4 июля 2012 в 20:04

Разработка → Коаны о программировании

От переводчика: The Codeless Code — сборник побасенок о философии программирования. Побасенки в сборнике разные — некоторые весьма кровожадные, некоторые достаточно хардкорные с технической точки зрения (родной язык автора — Java), но встречаются очень емкие. Представляю вам перевод семи наиболее полюбившихся мне историй, остальные 30+ (новые добавляются каждую неделю) можно найти на сайте.

Пустяк


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

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

Мастер ответил: «Здесь есть изъян, и я размышляю, как лучше его исправить.»

Послушник воскликнул: «Но вы же проповедуете важность расстановки приоритетов, как же можете вы зацикливаться на чем-то столь мелком и незначительном?»

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

Инкапсуляция


Молодой монах объявлял открытыми не только все методы классов, но также и все атрибуты. Настоятель монастыря устал делать ему замечания и обратился за советом к мастеру.

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

«Вспороть тебе живот,» — отвечал мастер, — «чтобы положить туда рис и налить чай. У меня на сегодня плотное расписание, и мне кажется, такой метод угощения гостей будет очень эффективным.»

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

Бесконечности


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

«Сколько уже она выполняется?» спросил настоятель монастыря.

«Не больше получаса,» ответил худой бледный монах.

«Но и не меньше этого,» уточнил полный смуглый монах.

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

Настоятель рассказал об этом мастеру. Тот сказал, «Худой монах считает, что цикл не бесконечен. Дайте ему мех вина за мудрость — никакой цикл не может быть бесконечен. Однажды произойдет сбой питания, или сервер рассыпется в пыль, или солнце поглотит Землю.»

Настоятель спросил, «А как же толстый монах, который считает, что цикл бесконечен?»

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

Эволюция


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

Во время следующего обзора кода послушник с удивлением увидел, что мастер крайне недоволен.

«Но мастер,» — запротестовал он, — «Я следовал вашему примеру с точностью до последней точки с запятой. Вот ваш класс, написанный в том месяце — разве не похож он на мой, как два яйца из одной кладки?»

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

Сорняки


Храму был нужен новый монах, и два потенциальных адепта претендовали на это место. Мастер велел монаху провести собеседование с обоими. В тот же вечер монах доложил:

«Они были полностью равны во всех отношениях — возраст, вес, внешность, манеры, обращение с мечом и предпочтения относительно кофеиносодержащих напитков. Тогда я дал им одну и ту же логическую задачу; один из них решил ее, второй — нет.»

Тогда мастер велел монаху отвести его в комнаты, где проводились собеседования. Вначале они отправились в комнату кандидата, который не справился с задачей. На доске еще оставались его наброски к задаче: болезненно аккуратные цифры выстроились в ровные строчки и столбики. Мастер быстро нашел ошибку в рассуждениях кандидата и сказал «Вот ростки гороха, пытающиеся пробиться через зимний снег. Если мы взрастим их, весной у нас будет славный обед.»

Затем они перешли в комнату кандидата, который решил задачу. Его записи тоже оставались на доске, расползаясь по ней без заметного порядка. Поспешно нацарапанные каракули вились зигзагами, иногда наползая друг на друга — паутина ахинеи. Мастер покачал головой: «Ты говоришь, что здесь душистый укроп и лимонная трава, но я не могу найти их среди сорняков.»

Река чая


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

Мастер изучила листинг и обнаружила, что каждый метод в нем тщательно задокументирован. Для метода setName класса Person было указано, что он устанавливает имя человека; метод getName подтверждал, что он возвращает имя, установленное setName; и даже метод toString клялся, что он вернет строку.

Мастер отбросила листинг и сидела в молчании. Через некоторое время послушник спросил, недовольна ли она.

«Интересный вопрос,» — ответила мастер и указала на код, — Это бумага, лежащая на татами. На бумаге чернила. Чернила складываются в много слов. На кипарисе снаружи сидит птица. У птицы два крыла с перьями и два глаза..."

Она продолжала в том же духе, пока послушник не покраснел. Он собрал свой код и удалился, пристыженный, но просветленный.

Мусор


Мастер изучала программу, написанную в удаленном монастыре. На ее мониторе большие фрагменты кода светились не черным, а зеленым — они были закомментированы.

«Любопытно,» — сказала мастер, — «Я открыла точные часы и обнаружила внутри кожуру апельсина и рыбьи кости.»

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

«Это можно понять,» — кивнула мастер.

На следующий день монахи собрались на встречу с мастером. Их беспокоило то, что настоятеля нигде не могли найти. Мастер указала им вверх, на стропила, где висело тело настоятеля.

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

В своем отчете мастер отмечала быстрое изменение методов работы клана. Она приписывала это хорошему примеру покойного настоятеля и писала «Нам следует рассмотреть возможность его восстановления в должности.»
Мария @Nicolette
карма
425,0
рейтинг 11,2
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

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

  • +31
    бесподобно
    • +4
      Так как Вы уже заняли правильный эпитет, воспользуюсь другим: шикарно :)
      • +5
        Можно и метафорой)

        Жемчужина!
        • +7
          какие все правильные. это охуенно!
  • +32
    «В этом-то и проблема,» нахмурился мастер. «Вчера я был глупцом, на прошлой неделе — идиотом, а месяц назад — имбецилом. Не показывай мне код, который я мог бы написать вчера, покажи мне код, который я мог бы написать завтра.»

    как знакомо!
    • +3
      Самое оно, тронуло.
      • +7
        Степени умственной отсталости:
        Лёгкая (F70.) — дебильность. IQ 50—69.
        Умеренная (F71.) — имбецильность. IQ 35—49.
        Тяжёлая (F72.) — имбецильность, тяжёлая умственная субнормальность. IQ 20—34.
        Глубокая (F73.) — идиотия. IQ < 20

        Простите за занудство
  • +9
    это все вымысел… и все герои вымышленные… ведь правда????
    • НЛО прилетело и опубликовало эту надпись здесь
      • +3
        Так появилось 1С.
  • +7
    Для заинтересовавшихся стоит упомянуть что идея формата и названия заимствованы у «Rootless root», Unix-коанов Эрика Рэймонда. А Эрик ссылается на Дао де цзин, но это уже другая история :)
    • +3
      А Эрик, надо полагать, на «правильное» Дао ссылается?
      • +1
        Да, есть такая отсылка, проглядел во вступлении. Думал что Эрик первый начал писать коаны.
        Спасибо :)
    • 0
      Кстати, есть книжка такая — «101 история дзен», сборник коанов с коментариями к ним в конце книги. Очень интересное чтиво.
  • +13
    «Вспороть тебе живот,» — отвечал мастер, — «чтобы положить туда рис и налить чай. У меня на сегодня плотное расписание, и мне кажется, такой метод угощения гостей будет очень эффективным.»

    Прекрасно!))) Более прямого ответа и придумать нельзя)
  • +2
    Река чая преподнесла и меня в просветленное состояние. Чувствую, что сегодняшний вечер накрылся и я буду утерян по предоставленной Вами ссылке.
    Не очень ясна мораль «Бесконечности»… Ведь оба монаха ничего не делали но получили суммарный профит в виде 3-х мехов вина. Я наверное чего-то не понял.
    • +5
      это дао веб-разработчика
    • +2
      Ответ не на поверхности… Это цикл Шредингера — одновременно и бесконечный, и нет.
  • +8
    Ах да, и еще один поклон автору данного перевода за придание мастерам гендерных отличий. На мой взгляд очень точный и уместный трюк.
    • +2
      там в оригинале местоимение she используется
      • +2
        Тогда я поступил непрофессионально, и не читая оригинала, зная, что род в английском языке — дело скользкое, посчитал это идеей автора. Ошибся. Искренне каюсь.
    • +6
      это всё политкорректные янки
  • +13
    Она продолжала в том же духе, пока послушник не покраснел. Он собрал свой код и удалился, ...
    Хорошо, что на этот раз она ничего ему не сломала.
  • +5
    Это прекрасно! Особенно про инкапсуляцию, избыточные комментарии и закомментированный код.
  • 0
    Многие побасенки далеко не универсальны. Та же «Инкапсуляция», не всегда ООП является верным подходом.
    • +2
      Вы считаете, что делать все атрибуты класса public — это выход?
      • +7
        * Лучше сделать все приватными и открывать по мере появления ошибок доступа *
        • +1
          Приватным нужно сделать все, изменение чего приведет класс-сущность в невалидное состояние (несуществующее в реальности или не имеющее смысла в контексте). Ни больше, ни меньше, если уж следовать канонам ООП.

          А класс может вообще играть роль DTO — тогда вообще не нужно ничего закрывать.
      • +2
        А вам не доводилось работать с не в меру закрытым API?
        • +6
          В коане про инкапсуляцию говорится о всех атрибутах public, что мне кажется неправильным. Мне кажется, что любое излишество — плохо. Но если выбирать из двух зол: между «слишком открыто» и «слишком закрыто», я, пожалуй, выберу второе.
          • –4
            API пусть лучше будет излишне открытым, никто не заставляет, используя его, ложить рис прямо в желудок. Хотя искушение может и быть =)
            • +1
              Что значит «пусть лучше будет излишне открытым»?
              Все должно быть открыто либо закрыто по ясным причинам.

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

              Так получается.
              • 0
                Прежде чем минусовать, прочитали бы выше, речь шла о выборе из двух крайностей.
                А то, что все должно быть открыто либо закрыто по ясным причинам, я не отрицал.

                Да, пульт сломался, а кнопок и разъемов на телевизоре нету.
      • +7
        Я считаю что есть и другие подходы кроме ООП. И есть другие языки, в которых ООП даже близко нету =)
        Если говорить всё же о ООП, если сделать все методы и поля открытыми, то от этого само по себе не чего не сломается, просто увеличивается риск что-то сломать самому. А вот разрезание живота сразу ведёт к фатальным последствиям =)
        • +2
          Исходя из опыта и мнения более опытных чем я, разница между «сломалось» и «увеличивается риск что-то сломать самому» есть лишь разница во времени :) Так что по фатальности приравнять, я думаю, все же можно.
          И я ведь ничего не сказал, о других подходах кроме ООП, сам когда-то на С писал :) Но в коане как раз оно, только в извращенном использовании.
          Лично мне понравилась некая жестокость данного коана. Жертва лояльностью в пользу назидательности.
    • +1
      Боюсь, Вам нужно еще помедитировать :)
  • +19
    Решил попробовать перевести оттуда же.

    Коан №44
    Пятящийся монах.

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

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

    Мастер Java по имени Банзен прознав об этом сказал, — «Стоит исследовать подобный стиль»

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

    Пятящийся монах остался в одиночестве.

    Забравшись на скалу для прыжка в воду, старейший из монахов в испуге отпрянул, взглянув вниз.
    «Мастер!» — закричал он. «Кто то разобрал камни дамбы, вода ушла из бассейна, оставив лишь острые камни и сорняки!»

    Банзен подтолкнул к нему его молодых коллег.

    «Конечно,», — сказал Мастер, — «вы можете решить эту проблему достигнув дна.»
    • 0
      А я вот эту не понял ни в оригинале, ни в переводе. Толи она менее остроумна, либо это я торможу. Можете расшифровать идею?
      • +8
        Мастер Банзен предложил противникам TDD реализовать свой подход к разработке в реальной жизни — сначала действие (разработка), а потом уже проверка и исправление. «Пятившийся» же монах сначала вырабатывает условия возможности действия (работы кода), а потом уже делает действие (разрабатывает).
        Поэтому остальным манахам и предлагалось сначала нырнуть в бассейн не глядя, а уж потом разбираться с отсутвием воды.
        Как-то так.
        • 0
          Ага, просто мне то напрашивалась другая аналогия. Что программирование тестов без кода, это как раз плавание в бассейне (использование кода) до того, как туда залили воду (написали код). И получалась полная каша. Спасибо, теперь понятно, что имел ввиду автор.
        • 0
          Для реальной жизни, похоже оно даже более актуально. :)
        • 0
          по-моему, всё проще:
          «Думай, потом пиши», а не «Сначала напиши, а потом подумай»
      • +1
        Если вы напишете тесты заранее, вы заранее обезопасите себя от (большинства) ошибок — наберете воды в бассейн.
        Написав же сразу код, вы долго-долго будете отлавливать в нем ошибки. Что чревато, как и ныряние в бассейн без воды.
        Как-то так :).
  • 0
    какая красота!
  • +3
    Прочитал на одном дыхании. Монахи-программисты… Сразу всплыли ассоциации с «Анафемом» Нила Стивенсона, подобных людей там называли «инаками», или же «теорами». Правда они не вспарывали друг другу животы, а просто изгоняли «неверных» в экстрамурос (обычный мир, вне «монастырей»), либо заставляли «зубрить книгу» (тоже очень интересная штука, но не буду сильно спойлерить). В общем, рекомендую.
    • +2
      > «зубрить книгу»
      RTFM?
      • 0
        Оно самое. Вот только вся загвоздка заключается в букве F. Ибо эта особенность в зазубриваемой книге является ключевой. Из-за этого «зубрение книги» является чуть-ли не высшей мерой наказания, ведь потом ещё и сдавать по ней экзамен :)
  • +2
    Перевод очень хорош! Больше всего понравился «Пустяк».
  • 0
    Симпатично, но к коанам не имеет никакого отношения.
  • +2
    В копилку, кто ещё не в курсе: taopooh.narod.ru/5/dao_prog.html
  • +4
    Когда-то я баловался такого рода сочинительством на ЛОРе.
  • –7
    Не понравилось почему-то.
    После первых двух историй стало совсем скучно и неинтересно.
  • +1
    Очень хочется при чтении чужого кода говорить автору: «Так, прочитай Коан „Инкапсуляция“ 4 раза и перепиши класс.
    • +2
      Иногда бывает это, когда перечитываешь свой же код
  • +2
    Инкапсуляци — шедевр!
  • +1
    Эволюция мне больше всего понравилось!
    Хотя вообще все Коаны супер
  • 0
    Повесил на стену в офисе :)
  • +1
    Ха, слово «побасенка» употреблял только один известный мне человек… Школа Шлезингера ;)
    • +1
      Конечно! Культовый преподаватель.
  • +4
    Предложил автору оригинального сайта сделать версии на разных языках. Его ответ

    «My feeling is that if anyone wants to translate any of the koans into another language and send the translation to me (in UTF-8 HTML) I would find a way to post it. I am quite glad to have readers, in any country. :-)»

    Nicolette, может быть вы отправите свои переводы автору сайта?
    • 0
      Отправлю, отчего же нет, тем более что хабраприоритет публикации соблюден в лучшем виде.
  • 0
    Очень мило.
  • +1
    На последних строках перевода внезапно догадался, какое имя увижу в поле «Автор текста».
    Прошу считать комплиментом.
  • 0
    Должен признать, в «Сорняки» ожидал другого исхода событий.
  • 0
    Чето я недопонял про «реку чая» прочитал в оригинале всеравно непонял. Видно жара скзывается.
    Может кто-то из просвещенных просветит меня?
    • +1
      Для метода setName класса Person было указано, что он устанавливает имя человека

      Если у класса Person есть метод setName, то скорее всего (если, конечно, разработчик не полный мудак) этот метод делает ни что иное, как устанавливает имя человека. Комментарий для подобного метода банально излишен, что и продемонстрировал учитель, начав перечислять очевидные глазу вещи.
      • 0
        (facepalm) дошло, жара всетаки
      • 0
        А почему именно «река чая»? Типа мастер так долго перечислял очевидное, что успел выпить много чая?
        Я вот понял смысл коана, но не понял, почему он так называется.
        • 0
          Потому что «чай не водка».
        • +2
          Вот представьте себе реку чая. Вот прям настоящую реку из чая. Представили? А есть ли от неё толк? В смысле есть ли толк в том, что у вас целая река чая. Нет. Всё, что вам нужно — это одна чашка. Ну две. Ну три максимум. Всё остальное попросту не нужно.
          Так и с методом Person::setName() — всё, что вам нужно, у вас уже есть: имя класса, имя метода и тип параметра. Этой информации достаточно для того, чтобы понять, что же именно делает данный метод.
          Можно, конечно, добавить комментарий «Этот метод делает то-то», можно расписать параметры "@param name — person's name to be set", можно даже пример использования туда же воткнуть, но всё это — лишнее. Всё это как раз и является той «рекой чая», которая вам не нужна, т.к. вам достаточно нескольких чашек.
  • +4
    Ну теперь я напишу ну не в японском стиле, а в нашем — Славянском.

    Досталась както юному послушнику программа написанная другими монахами из далекой азиатской страны. Начал послушник просматривать листинги, а там полнейший разврат и содомия — лесенки проместо циклов да виборки, потоки плодятся подобно крысам на амбаре, копипаст змием холодным расползя по телу софтинушки, утечки памяти изедают ресурсы вычислительные да живительные, ужаснулся послушник сему горю-горюшку, пошол к инокам да настоятелю просить времени на рефакторинг да оптимизацию, поперед имплементации нового функционала. А настоятель да иноки на смех послушника подняли, словами погаными его обзывали — на хлеб на воду посадить грозили, распиналися сколько убытка монастырю привнесет рефакторинг да оптимизация, что времени на сию красоту нет и работать надобно так. И как бы времени им не хватало, да вечером сели они свои повозки славные да отправились корпоратив чествовать — греху чревоугодия предаватся, а послушник сидел в своей келье да рыдал горе-горевал, а потом послал их срамным местом и сбежал из монастыря — ибо нефиг.
    • +3
      И пошел он дождями мочимый, ветрами гонимый до городу Парижу… В городах сайты-визитки лабал, да кому надо что подверстать — подправить, тем в дороге и жил… ))

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.