Aug 17, 2016 10:37
Потерял вчера полдня, пытаясь понять, почему input рисуется без значения в нашем React/ClojureScript/Rum приложении (и сейчас уже плюс день, чтобы это починить, and counting). Разговорился с интерном, рассказал ему что там за история - и тут он заметил, как его восхищают такие вещи, как интригует ковыряться в таких сложных материях и как он тоже так хотел бы.
Тут, конечно, меня накрыло. Накрыло, потому что я всё это делаю через огромное страдание и жалею о каждой минуте, потраченой на эту возню. Конечно, если смотреть на мир софта как на данность, то у нас есть впечатляющей сложности артефакты, с которыми нам дано повозиться, и, в общем, крутизна программиста в том, насколько ловко он с этим управляется. Но если посмотреть, например, со стороны затраты/результат, то возня это как раз холостой ход и гордиться тут нечем.
У нас уже есть JS, CSS и HTML, в которых одни и те же вещи называются и работают тремя разными способами. Теперь умные люди придумывают React (и носятся с ним, как будто он дан нам свыше) и вводят четвертый способ. Реакт работает через JS, поэтому ему надо уметь конвертироваться в DOM-атрибуты (и назад!). Он также хочет рендериться на сервере, поэтому ему приходится уметь и в HTML-атрибуты. Потом появляется ClojureScript со своим kebab-case и естественно вводит пятый способ и библиотеку Sablono. Во всей этой вакханалии невозможно не потерять информацию, и она теряется, возникает куча смешных случаев типа: одно из самых популярных свойств class конфликтует с желанием использовать объекты как хэши в JS, и в итоге там оно называется className, а в ClojureScript этой проблемы нет и оно снова называется class и цепочка получается class (CLJS) → className (React) → className (JS) → class (HTML/CSS). И это я еще про консистентность в SVG атрибутах не начинал. Ну и в итоге все закономерно заканчивается тем, что и React, и мой Rum (у которого свой server-side render) вынуждены хранить полную таблицу соответствия всех возможных атрибутов со всеми. Звучит продуктивно, да?
Окей, но Реакт зато нормализует. Опять же, don’t get me started, как он нормализует, но допустим, что в этом-то плохого? Опять же, это было бы хорошо, если бы он смог если бы он был дан свыше и кроме него ничего бы не существовало. Но если смотреть на React как на просто один небольшой кусочек паззла в grand scheme of things, то он скорее мешает, чем помогает, потому что это еще одна дополнительная сторона, требующая себе внимания. Т.е. я уже не просто пишу HTML-сериализатор, я пишу сериализатор с оглядкой на то, что где-то рядом будет Реакт и их, возможно, будут использовать вместе. А у него, конечно, свой взгляд на вещи, и нужно отдельно, когда работа сделана, тратить чуть ли не еще больше времени, чтобы его уговорить. Плюс в Реакт доложено всякого, и я бы знать про это не знал и был бы счастлив, а теперь вот приходится учитывать.
Если смотреть на это как на артефакты цивилизации атлантов, конечно, масштаб впечатляет, а те, кто способен с ним совладать - полубоги. Но как результат человеческого труда, если объективно на него посмотреть, с оговоркой что это всё хорошие люди делают и они наверняка выкладываюстся на 120% и лучше так чем никак, то это артефакты, которые рождают проблемы, а не решают их. Список атрибутов устареет, события будут приходить невовремя, эмуляция placeholder в ИЕ сломается (честно, лучше бы они настоящий использовали), установка onClick на root будет мешаться на iPhone и т.д. А, и два вида инпутов на каждый, переключаться между которыми, типа, не рекомендуется! Я прям вижу, как люди, когда это писали, сидели и думали: а вот тут ты, мой дорогой, да-да, лично ты, будешь страдать, потому что мы такую вот штуку придумали и тебе с ней жить. То есть, конечно, они так не думали, но я бы хотел, чтобы как раз думали, чувствовали это постоянно (я, например, чувствую), а потом взглянули на себя в зеркало, ужаснулись и спросили «что я за человек такой? Кто дал мне право обрекать на муки других людей?»
Все привыкли ругать браузер и DOM, мол, legacy и источник проблем (а все фронтендеры, подразумевается, хорошие и всё всегда делают правильно, ха-ха). Но штука же не в этом, штука в том, что мы не можем взять DOM как данность и пойти делать более сложные вещи. Вся эта возня с JS-миром не ощущается как прогресс. Скорее как толчение воды в ступе. Или нет - как воду решетом носить. Когда вместо того, чтобы заклеить дно скотчем и работать дальше, вместо этого к нему приделывают ручку, дают более быстрому носильщику и начинают придумывать, как сделать, чтобы вода меньше расплескивалась во время бега. Это не решение проблемы и не прогресс. Хочется артефактов, которые закрывают какую-то область, пусть маленькую, но без дыр. Чтобы если ты ее взял, то ты беспокоишься о меньшем количестве вещей, а не о большем.
Опять же, я все понимаю, почему так получилось, и что от этого никуда не деться, и что проблемы всегда будут. Но давайте хотя бы радоваться и в дудки дуть не будем. Нечему. Нормальная реакция здесь - поплакать в уголке.
хотите честно,
девелопмент,
печально это все,
такова жизнь,
накрытия