Про помытую посуду
Много лет назад я прочитал, как Джо Армстронг описывал процесс создания эрланга. В основу были положены принципы функционирования социума в целом и человеческого мозга в частности. Вместо того, чтобы выдумывать наобум правила поведения, авторы нового языка программирования просто перенесли паттерны, хорошо известные из истории и социологии как полезные в коммуникации.
Так появился синтаксис эрланга, копирующий по мере возможности английский текст не только орфографией ключевых слов, но также синтаксисом и пунктуацией. Так была выбрана акторная модель, имитирующая стандартную схему взаимодействия людей («я не могу читать мысли»).
We don’t have shared memory. I have my memory. You have yours. We have two brains, one each. They are not joined. To change your memory, I send you a message: I talk, or I wave my arms.
You listen, you see, and your memory changes; however, without asking you a question or observing your response, I do not know that you have received my messages.
~ Joe Armstrong, Programming Erlang
С тех пор я стараюсь решать все задачи, с которыми сталкиваюсь в работе, путем проецирования их на свой (или чужой) жизненный опыт. Такого рода примеры очень помогают понять где ты прав, а в чем сильно ошибаешься.
Я часто привожу в спорах об индустрии — кулинарные аналогии. Не потому даже, что поварское дело во многом сродни разработке программного обеспечения (хотя и это тоже), но для пущего контраста. Иная предметная область позволяет четче сфокусироваться на важных аспектах и не вдаваться в терминологические дискуссии о незначительных деталях.
Наверняка всем знаком типаж «великого повара по оказии». Знаете, такой человек, который готовить особо не любит, время, проведенное на кухне — считает потерянным, но имеет в запасе пару коронных блюд, которыми неизменно стремится поразить новых знакомых. «Какая гадость эта ваша заливная рыба!».
Эти блюда, благодаря многократным повторениям и отточенной за годы механической процедуре, всегда получаются действительно, по-настоящему вкусными. Без изюминки, как в хорошем ресторане. Тут обсуждать особо нечего, и зайца можно научить курить, было бы время и усердие. Поэтому я всегда украдкой выглядываю на кухню после свершившегося ритуала приготовления коронной фуагры под оливковым мармеладом с трюфелями. И — если из раковины на нас украдкой смотрит гора немытой посуды — я лучше буду закусывать маринованным огурчиком из банки, а по дороге домой — съем шаверму. Хороший повар не ждет, что посуду за ним помоет мальчик на побегушках.
С программным обеспечением все ровно так же. Пока гуру от индустрии ранжируют код по скорости исполнения, читаемости, поддерживаемости, масштабируемости, еще бог знает каким критериям, я подхожу к оценке весьма поверхностно: код просто должен быть опрятным. Неряшливый код всегда на поверку окажется медленным, нечитаемым и плохо поддающимся изменениям, не говоря про расширения. Опрятность кода — как та самая помытая после готовки посуда — расскажет наблюдательному зрителю целую историю: про опыт поддержки собственного кода, изменения чужого, сопровождения проектов и про много иных очень важных (в отличие от так называемых «паттернов проектирования») вещей.
Эстетический вкус вообще исключительный (и пагубно недооцененный) атрибут действительно хорошего программиста. Именно поэтому я немного напрягаюсь, когда люди хвалят Go или используют в работе IDEA. Именно поэтому я трачу час на настройку цветовой гаммы, шрифтов и окружения даже тех ноутбуков, которые я на три дня беру с собой на конференцию. К сожалению, люди, лишенные хорошего вкуса, очень подвержены влиянию модных трендов. Отсюда все эти айфоны, луивуттоны и безобразные джипы последних лет. А ведь и телефоны и автомобили (не говоря про одежду) еще двадцать лет назад умудрялись делать стильными. Но тогда и деревья были высокими, а трава — зеленой.
Грамотно спроектированный язык программирования буквально мешает писать грязный, эстетически неприятный код. Каждый раз, когда я обнаруживаю себя в дебрях условного оператора на эликсире, я безжалостно стираю весь только что написанный кусок, который меня туда завел, и начинаю с чистого листа. Запутанно, коряво, неэстетично? — Стало быть, ты что-то сделал не так, чувак. Перепиши с нуля.
К сожалению, большинство языков просто не предоставляют возможности писать изящный код. Достаточно запустить автоформаттер в достаточно нетривиальном куске на хаскеле, и это станет очевидно. Даже джава, с ее не поддающейся никакому внятному объяснению многословностью — и то выглядит не так отвратительно. Хоть обложись алгебраическими типами, но они не позволят писать внятный код, когда у тебя в Prelude — пятьсот функций с неразличимыми трехбуквенными именами, делающие вообще непонятно что. На какой строке нужно поставить закрывающую скобку и сколько пробелов должно быть в табуляции — вопрос привычки, не более. Но код на питоне, в котором взгляду буквально не за что зацепиться — это за гранью добра и зла. Поэтому любой проект на питоне на сотой строке кода превращается в месиво, понятное только автору. Даже перл выгоднее смотрится в этом плане, он запутан, придуман инопланетянами, понятен только Ларри Уоллу — но он эстетически изящен.
Возвращаясь к исходному тезису, я просто хочу сказать, что если вместо заковыристых вопросов про паттерны проектирования в общем и замыкания в джаваскрипте в частности — просто отвести кандидата на кухню и посмотреть, как он приготовит чахохбили — проку выйдет гораздо больше. Если он не умеет чахохбили — это YAGNI-тип с узким кругозором и стремлением все сделать по единственному лекалу, которое у него с собой с первого курса института. Если он потребует цхали-сунели и мельницу для зерен кинзы — это педант, который вас измучает претензиями к инструментарию, окружению и пятистам сторонним библиотекам. Жахнет в кастрюлю курицу и посыплет сверху неочищенными дольками чеснока? — Это ворк-лайф балансер, у которого работа вместо тумбочки, из которой он достает деньги. Но если кандидат молча приготовит что-нибудь, вымоет за собой посуду и только потом позовет вас, пряча улыбку — доставайте из кармана оффер. Это ваш человек. Не упустите.