Вася в роли компилятора

    Василий Викторович (далее просто Вася) работал в конторе уже третий год. Программист по образованию, он был на хорошем счету у директора Александра Ивановича, тот нисколько не сомневался в его профессиональных навыках и готов был доверить ему любую важную задачу. Директор часто набирал новых сотрудников в помощь Васе, но все они подолгу не задерживались — Вася жаловался, что, мол, плохие с них программисты, работать не хотят, пишут код, в котором сам чёрт ногу сломит, к тому же пичкают повсюду своё ООП и паттерны.
    — Вася, так может ты сам поработаешь? Уже десять человек уволили… Понимаю, специалистов в наше время не сыскать, понимаю, одному работать трудно, но может всё-таки попробуешь, а?
    — Иваныч, я бы с радостью, но кто тогда мелкими делами будет заниматься? Я пишу важнейшие вещи, а отвлекаться на пустяки всегда очень трудно. Найди мне хорошего человека, Иваныч! Я верю, однажды попадётся тот самый, который сможет работать как я, а то и лучше!
    — Да что ты, Вася, я уже убедился — лучше тебя никого мне не найти. Я постараюсь, Вась, постараюсь!
    Директор похлопал его по плечу и вышел из кабинета. А Вася нажал Alt+Tab и продолжил читать ленту.


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

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

    Андрей открыл проект и ужаснулся: в коде не было ни единого комментария, форматирование просто отсутствовало, названия переменных и методов не соответствовали действительности. Андрей знал, что этот день настанет. Еще с университета он готовился к самому худшему варианту, но к увиденному он не был готов — улыбка паренька бесследно исчезла, а на глаза наворачивались слёзы. «Держись, Андрейка, держись», — подбадривал себя паренёк изо дня в день. За десять дней работы в этой ужасной конторе Андрей понял, что Василий Викторович самый что ни на есть быдлокодер. Кое-какие знания у него, конечно же, были, иначе Александр Иванович сразу бы заподозрил некомпетентность этого «специалиста», но в остальном же он не хотел нормально программировать.

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


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

    Build started.

    — Эй ты, торопись, нужно прочитать вот эти файлы исходного кода.
    — Ч-ч-то? Какие фа…
    — А ну живо, я сказал, — послышался удар плетью, сопровождающийся криком Васи. — Читаешь эти файлы, всю информацию заносишь в таблицу лексем. Если что-то непонятное встретится, жми стоп-кран с соответствующей надписью об ошибке. И ПОТОРАПЛИВАЙСЯ!

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

    Покончив с одним файлом, Вася присел передохнуть и тут же получил серию новых ударов. Спохватившись, он развернул другой свиток с именем «Krname» и начал всё по-новой. Затем были файлы «qwerty», «MegaUtils», «dList» и т.д. Глаза Васи начали уставать, спина болела от нескончаемых ударов плетью и розгами, руки тряслись от постоянного записывания лексем в таблицу — Вася попал в ад.

    Спустя очень большое количество времени, Вася всё-таки сумел просмотреть все файлы и занести информацию в таблицу лексем. «Ну наконец-то», — вытер он пот со лба.

    — Чего развалился? Бери таблицы лексем, проверяй их синтаксическую правильность и строй по этим данным дерево разбора! Если что-то пропустишь, будешь заново всё переделывать. За работу!

    Вася принялся сверять данные в таблице с Книгой Правил и вычерчивать на огромном листе бумаги дерево операторов и операндов. Строка за строкой, лексема за лексемой, он сверял записи. Вершина за вершиной, ребро за ребром, он рисовал дерево. В глазах маячили символы, много символов, им не было конца. И тут Васе на глаза попала строчка, не указанная в правилах. Недолго думая, он дёрнул рычажок с надписью «Syntax error». Тот час же работа остановилась, удары плетью закончились, лист, в котором рисовалось дерево очистился, в помещении снова наступила зловещая тишина. Вася свалился на пол, обессилев. Отдыхать ему долго не пришлось, уже спустя две минуты работа началась… заново. Вася крикнул в отчаянии «Нет», но его спину прожгло парой новых ударов, пришлось читать все файлы по новой.

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

    — Эй, бери синтаксическое дерево и помечай правильность типизации, — скомандовал голос, ударяя плетью беднягу.

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

    — Теперь сгенерируй то, что у тебя есть в промежуточный язык. И не забудь оптимизировать полученное!!!
    Вася вздрогнул — еще никогда он не делал никаких оптимизаций. Он не любил заключать повторяющиеся куски кода в отдельный метод, не часто использовал циклы, он даже переменные называл как можно короче, ведь считал, что все эти мелочи отвлекают от основного занятия — программирования. Зачем думать об оптимизации, если важна сама работа программы? Но каким бы критичным не было мнение Васи, пара ударов плетью сделали своё дело — он начал оптимизировать. Он рассматривал отдельные строки кода и пытался найти им наиболее оптимальный вариант. Он разворачивал циклы, собирал последовательности строк в пару более кратких, переписывал некоторые фрагменты.

    Голова Васи гудела. Казалось, сам дьявол наказывает его за долгие годы написания плохого кода. Оптимизировав последнюю оставшуюся строку, Вася упал на колени и выдавил:
    — Я так больше не могу.
    — Как это ты не можешь? А машинный код кто будет генерировать? Я, между прочим, делаю это по сотни раз на день и не жалуюсь. Я каждый день читаю твой ужасный код, изучаю типы твоих бессмысленных переменных, оптимизирую всё твоё бездарное творчество, чтобы на выходе получить программу, которая даже не запустится, потому что ты забыл прописать вызов модуля! Я вынужден вновь и вновь это делать, пока ты не удосужишься всё-таки его прописать. И я не получаю ни единого слова благодарности, напротив, я постоянно слышу «Компилься ты быстрей, зараза!», «Что это еще за ошибка? У меня в коде всё правильно!». Я не имею возможности сказать то, что думаю о тебе, потому что не имею рычагов с нужными фразами. Но если бы они были, ты боялся бы нажимать «Compile»… А сейчас поднимайся и генерируй машинный код!

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

    Build successfull. Elapsed time: 00:01:19.

    … Вася открыл глаза. В кабинете не было никого. На экране монитора была открыта среда разработки. На одной из неотформатированных строк мигал курсор. Вася потянулся к клавиатуре и зажал Ctrl+Backspace. Курсор побежал, забирая с собой всё, что было написано за последние месяцы работы. Оставив чистый файл исходника, Вася встал, посмотрел на консоль вывода компилятора и сказал: «Спасибо».
    Поделиться публикацией

    Похожие публикации

    Комментарии 46
      +16
      Мило. Зачитался. Но как-то такое я был бы рад видеть на IT happens, а не тут.
        +4
        Как-то я даже и не знал про IT Happens. Спасибо, в следующий раз напишу туда.
          +27
          Мне кажется, что вечером в субботу пойдет и сюда.

          А вообще, было бы интересно добавить особое поведение компилятору, чтобы он ругался на быдлокод.

          MyClass.cpp:354:5: error: What the fuck? Why method count() contains 9 variables with one letter names?
            +3
            pmd, checkstyle, sonar этим и занимаются.
              0
              Насколько я понимаю, эти решения исключительно под Java?
                +1
                Нет, в sonar'е куча плагинов для разных языков
                  0
                  Удивительно, но про сонар на русском не нашел практически ничего. Даже удивился, встретив этот комментарий.

                  Но опять же не совсем корректно его упоминание. Sonar только собирает данные от конкретных инструментов, которые можно использовать и без него.
                    0
                    Вы не одиноки. Я практически ничего не нашел и на английском, а что нашел, относилось только к Java, поэтому и задал вопрос.
                      0
                      Сонар может быть своеобразным «агрегатором» выхлопа из pmd, checkstyle, e.t.c. Помимо них, к Сонару можно прикручивать его же плагины. Сонар активно используется здесь: www.cloudbees.com/platform-service-sonarsource.cb
                      Сам я про сонар узнал из рассылки вышеупомянутоого сервиса.
                  0
                  google, для Java очень много всего, под cpp и др. популярные языки тоже можно найти.
                  Мы используем: pmd, checkstyle, cobertura (test coverage) + встроенный анализатор кода в Идее.
                  +1
                  Я вас ненавижу за упоминание sonar.
                  Через 3 часа вставать на работу, еле настроил всю кухню для проверки php кода в sonar, проверил пару опенсорцных библиотек и сильно опечалился результатом :(
                    0
                    Это ок. Я пишу всякие Хадуп приложения, иногда приходится патчить либы Хадупа, написанные на Джава. Ситуация та же — в общем и целом качество кода посредственное.
              +19
              Боюсь, что если бы Вася писал программу, которую было бы удобно компилировать, Андрею она бы тоже не очень понравилась. Такая программа была бы чересчур привязана к конкретным типам данных, конкретной архитектуре железа и т.п. Действительно, зачем здесь писать виртуальные функции, если мы знаем, что реализация интерфейса сегодня только одна? Ведь компилятору придётся отрабатывать наследование классов, проверять его корректность, генерировать код для каждого вызова (возможно, с кучей проверок)… Нет уж, оставим пока невиртуальный метод — с кодом будет разбираться проще. А то, что его труднее будет развивать и переносить, то это проблемы не компилятора, а программистов…
                0
                Он хоть и стал компилятором, но остался человеком, в том смысле, что ему легче компилировать человекочитаемый код.
                +23
                Сюжет про компилирование, а мораль и все примеры про читаемость кода. Разные вещи, вообще-то.
                  +23

                  Функционально программирование VS Объектно-Ориентированное программирование.
                  Программирование «на один раз» VS LTS-программирование
                  Самокомментирующийся код VS Полезные комментарии
                    +2
                    Я думаю, в рассказе было Процедурное программирование VS Объектно-ориентрованное. И по поводу самокомментирующегося кода с названиями переменных из трех букв (хе-хе), тут что-то не вяжется.
                      0
                      Если названия переменных следуют соглашениям венгерской нотации, то и трех букв будет более чем достаточно. =)
                      +1
                      На все эти темы у меня сформировалось одно мнение. Звучит так: во всём нужно искать «золотую середину». Нельзя впадать в крайность, становиться только на одну сторону. Для каждого конкретного случая использовать наиболее подходящую парадигму (функциональную, ОО или др.). В этом плане мне нравится C# с его гибридными возможностями, да и многие современные языки позволяют программировать в разных стилях. Код комментировать только при необходимости, если нужна документация — использовать комментарии для её последующего автоматического создания.

                      Стоит заметить, что такого рода «спец. олимпиады» чаще всего несут в себе может и небольшую, но положительную, ценность.
                      +7
                      Здорово. Правда, низкое качество кода не обязательно свзязано с какими-то дополнительными напрягами для компиляторов. Да и оптимизация, так скажем, вовсе не обязательно улучшает читабельность кода. Хотя, с другой стороны, когда-то давно я столкнулся с одной довольно занятной ситуацией. Товарищ в институте написал некислую расчётную программу, которая думала примерно полтора часа (на пне-120). Пока она считалась, он обычно ходил обедать в столовую. Штука была написана под линух, и, как-то взглянув на это творчество, я его спросил — а ты не хочешь добавить -O2 к CFLAGS в Makefile? Ну, добавил… Время работы упало с полутора часов до считанных секунд. Вот так вот испортил человеку обеденный перерыв, а всего-то дело было в том, что в программе было с десяток уровней вложенности циклов, и на самом внутреннем считался набор значений, который можно было бы посчитать заранее, о чём gcc в режиме оптимизации без труда догадался.

                      А из программерских баек меня больше всего за душу берёт сказка про программиста и эльфов.
                        0
                        «транслятор с С на Фортран» это хорошо :)
                        +4
                        Мне вот интересно, почему Андрей просто не развернулся, и не ушел(ну, в более вежливой форме, конечно)? Зачем было так стараться, переучивать Васю? Нравится ему говнокод писать? Нравится его директору такой результат, — ну так и дай Б-г. Пусть работают, раз всех все устраивает. Странная история, в общем.
                          +3
                          Поддерживаю, можно было и более преближенную к действительности историю придумать. А то — десятки увольнений и безграничная любовь начальника к Васе, дар гипноза по щелчку пальцев, слёзы программиста при виде говнокода… Не продумано, ИМХО.
                            +2
                            *приближенную
                          +2
                          А я был в роли Васи, когда занимался реверс-инжинирингом обфусцированного кода на smali. Целую стопку бумаги изрисовал диаграммами последовательностей вызовов. В конце-концов нашёл весьма элегантное решение, только оценить его некому.
                            0
                            только оценить его некому
                            Ошибаетесь :)
                            Занимался в почти тем же самым (декомпиляцией кода приложения на Андроиде). Тоже рисовал схемы логических веток и поиска способа записать ветвистое дерево вызовов в линейный код :)
                              0
                              Я вот что сделал. Написал простой скрипт, который 1) в начале каждого метода smali добавляет вызов статичного метода нашего класса, в духе MyClass.doN(), где N от 0 до количества методов ко всех классах 2) генерит названный класс со всем статичными методами, каждый метод пишет в лог число N. Замет я это снова собрал, подписал и залил на девайс. Итого — лог посыпалась куча чисел, означающих последовательность вызова. Найти нужный кусок в коде уже не представлялось проблемой.
                            +6
                            Не хватает женщины в сюжете. Видимо, забыли. Дело было так. Андрей пришел в офис и увидел прекрасную секретаршу Наташу. Влюбился. Сначала хотел уходить из конторы, но потом передумал и решил переучить Василия, раз уж работать вместе придется. Василий был уже тайно влюблен в секретаршу Наташу, но она не отвечала ему взаимностью. Наташа любила шефа, но он тоже не отвечал ей взаимностью. Вот такая Санта-Барбара. В итоге Андрей и шеф подрались на дуэли. Андрей смертельно ранил шефа. Шеф умер. Андрей занял место директора и фирма переквалифицировалась в аутсорсинговую компанию. А Наташа вышла замуж за Андрея и родила ему троих детей.
                              +2
                              Veni, vidi, vici!
                                +7
                                Одним из этих детей был Альберт Эйнштейн.
                                +7
                                Замечательно. Единственное но, компилятору абсолютно все равно какой код компилировать :) это нам какое-то подобие структуры подавай, да еще и с комментариями и документацией, а компилятору до фени. Но написано увлекательно, хотя и не понятно что именно Андрей пытался сделать с Васей, в смысле горбатого могила исправит.
                                  +1
                                  Андрей покарает тебя быдлокодер!
                                    +4
                                    Казнить нельзя помиловать?
                                      0
                                      А потом добить выжившего.
                                    +3
                                    Я вот что не понял. Если «Вася… работал в конторе уже третий год. Программист по образованию, он был на хорошем счету у директора Александра Ивановича, тот нисколько не сомневался в его профессиональных навыках и готов был доверить ему любую важную задачу.» — то в чем проблема-то?
                                    Какая разница как форматирует код Вася и какие паттерны он применяет/не применяет, если все довольны?
                                    Андрей с двумя годами после универа, которого через 7 месяцев работы попёрли из Яндекса — это гуру программирования чтоль?
                                      +1
                                      Читайте дальше, «Когда дверь за директором захлопнулась, Вася указал новенькому на компьютер и подкинул ему парочку «простеньких задач», над которыми, если честно, трудился уже не один месяц.» Вася не умел (не хотел) нормально программировать и постоянно нуждался в помощниках. Хорошее отношение директора позволяло Васе спихивать все его недостатки на этих вот помощников.
                                        +2
                                        Тогда кто лучше владеет искусством гипноза? Андрей, который щелкает пальцами перед носом у Васи, или Вася, который умудряется безо всяких ухищрений три года водить за нос директора Александра Ивановича?
                                      +3
                                      Не совсем верная аналогия, компиляторам как раз все равно что компилировать, лишь бы оно не нарушало формальных правил. Например, браузер легко разбирает даже сильно обфусцированный JS.
                                        +3
                                        Существует очень распространенная ошибка в анализе работы систем (которая нам косвенно навязывается) этим рассказом. Это «одушевление неодушевленного».
                                        Изначально компьютер как раз и является исполнителем, который:
                                        1) не устает
                                        2) не ошибается (если ему поданы корректные исходные данные и правильные инструкции по их обработке).
                                        Т.е. компьютеру как раз неважно, рутина это или не рутина, интересно заниматься этим процессом, или нет.

                                        А этот рассказик пытается нам пропихнуть в подсознание мысль, что «некрасивый исходный код компьютеру _трудно_ компилировать».
                                          +1
                                          а я понял что это был не компьютер, а андрюха всё это ему под гипнозом пояснял.
                                          и поэтому некрасивый исходный код по мнению андрюхи надо было переделать, а причина для этого самая логичная для данной ситуации — что бы компилировалось нормально (косвенная отсылка к читаемости кода)
                                            +1
                                            Вопрос не в том, что Андрюха говорил Васе, т.к. оба вымышленные, а в том, что рассказ говорит нам, т.к. примерно половина нас все-таки реальные.
                                            Уже выше писали, что компилировалось оно и так нормально. Т.е. вообще компилировалось.
                                          +2
                                          Взглянув на название, ожидал увидеть какой-нибудь дельный совет по рефакторингу, или хотя бы пониманию такого вот некрасивого кода. А вместо этого увидел какую-то сказочку про белого бычка.
                                            +2
                                            Так был же вполне себе адекватный совет! Розги — новое слово в управлении проектами!
                                            +2
                                            Идите нафиг со своим графоманством.

                                            Как было выше (1, 2) замечено, компилятор обработает любые данные, удовлетворяющие грамматике. А комментарии пропускаются на уровне лексического анализа.
                                              0
                                              Избиение розгами в целях стимулирования мозговой деятельности. Очень интересный подход к увеличению продуктивности.
                                                +1
                                                Погодите, так Вася же матросом был!

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

                                                Самое читаемое