?

Log in

No account? Create an account

Стой под стрелой

Поступки и мысли, о которых могу вспомнить не краснея

Категория: эзотерика

С высоты-3
tonsky

Пост вызвал некоторую дискуссию, в связи с чем я не перестаю удивляться, насколько людям кажется что мир устроен так как им хочется а не так как он устроен на самом деле. Многие живут мыслью что то что они (ну или я) пишу это не настоящая Кложа, а где-то там далеко есть настоящая, и если сильно припрет то взял type hints и поправил и так-то и пишут настоящие джедаи. У них все всегда сразу достигает JVM-уровня скорости потому что они сразу везде указывают примитивные лонги и вообще все специфицируют и раскладывают сразу оптимально. Ну или разложат если будет нужно.

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

Так вот. Я сам не то чтобы чужд оптимизациям и натягиванию ужа на ежа. Я потратил достаточно много времени, пытаясь делать разные вещи быстрее, чем они есть. Придумывал какие-то оптимизированные defrecords в DataScript. Менял функции на макросы для инлайнинга. Городил макро-DSL для работы с массивами. Писал макросы, которые эмитят сразу оптимальный JS. AOT-прекомпилял Кложу в классы для быстрого стартапа. Видел тоже разного: всякие библиотеки для быстрой математики, патченные исходники с отложенной инициализацией var-ов, фоновые «прогретые» JVM для быстрого старта. Даже мантра «держи репл всегда запущенным» в общем-то про то, как бороться со тормозами на старте Кложи. Про все это можно сказать одно: это очень изнурительно, и удовольствия в этом никакого нет, только сложность и постоянное разочарование.

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

Но если уж ввязался, то просто делай как все — будет проще, приятнее и честнее. Если язык предлагает records, бери и используй records, а не городи свой хитрый макрос на deftypes. Если нужно позвать функцию — значит, нужно позвать функцию. Если компилятор при этом продалбывает arity в метаданных, чтож — значит, продалбывает, такова цена. Так устроен язык. Хорошо, если это просто по недосмотру и можно отправить патч в компилятор. Если нет, что ж. Все равно нормальный, обычный код, собранный из того, что дают, в конечном счете, на длинной дистанции, выигрывает именно своей простотой и нормальностью. Потому что локальные оптимизации всегда останутся локальными и будут только мешаться под ногами непредвиденным образом; чем дальше, тем больше.

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

Какая цель была у моего эксперимента с переписыванием, если мы даже не выжали по максимуму что можно было ни из Кложи, ни из Раста? А цель очень простая — оценить не какой-то там теоретически возможный предел, который тибетские монахи могут достигнуть на языке путем десятилетней медитации. А оценить какая получается программа в среднем, когда ее пишут обычные люди в обычные, отнюдь не бесконечные сроки, и когда им нужно балансировать фичи/качество/дедлайн, а не выдрачивать микроцикл до пикосекунд.

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

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

[...] при разработке на Кложе удобно думать в математических понятиях (а хешмэп это пожалуй самая близкая к функции структура данных). При разработке на Расте это кажется прямо-таки немного противоестственным, и хочется уже взять плоский кусок памяти, и как-то там его расчерчивать.

Язык определяет мышление, best tool for the job, вот это все. Банально, но на конкретном примере оно всегда как-то доходчивее.


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

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

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

Тем не менее, произносится то, что произносится, и это подрывает веру в осмысленность речи вещателя вообще (есть, к примеру, прием заставлять людей работать в аврале на всякий случай — откуда знать, что это как раз не он?). Если понимать изречение как указание на срочность, то работать придется наспех, как можно быстрее — что, в общем, противоречит требованию работать основательно и хорошо — и снова непонятно, ввиду столь неловкого обращения с языком, насколько вещатель понимает и хочет озвученного, или неявно ждет от объекта чуда, хочет убить двух зайцев, съесть рыбку и не только. Может, он просто оценил проблему в сравнимое с погрешностью количество человеко-часов?

Таким образом, вопрос интерпретации исходной мантры сходен вопросу основательности составителя теста — в сложных вопросах приходится гадать, рассчитывал ли составитель на настоящий ответ или сам пал жертвой общепринятого упрощения/заблуждения? Исходная мантра допускает столько интерпретаций, что здравомыслящему человеку, пытающемуся передать сообщение, не следует прибегать к ней ни под каким соусом.

закроем тему
tonsky
Родители назвали меня Никитой.
В ФизМатШколе я стал Никитонским (была такая мода у нас, да), потом череcчур длинное имя сократилось, и я стал просто -- Тонским. Как ни странно, но дофымышатских прозвищ у меня не было.

Выйдя из стен ФМШ, я попал в универ, где в своей новой компании я стал Данилой. Этот период длился год, дал очень многое с точки зрения жизненного опыта, но, к счастью, все хорошо закончилось. Сейчас уже никто меня так не называет.

Одновременно или чуть позже, когда я узнал, что такое локальные сети и как по ним общаться, оказалось, что собственное имя использовать для идентификации в чате немодно. Отнесясь к этому скептически, я выбрал самое простое, что мне пришло в голову: "aaa". Сейчас я готов признать, что в использовании выдуманного имени есть свои плюсы. Мало ли кого встретишь в сети, а без имени на тебя не смогут навести порчу или приворот (хотя это, м.б., уже минус).

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

В ЖЖ ник danila занят каким-то русскоязычным парнем из Тель-Авива (на Данилу совсем не похожим), а вот aaa абсолютно бессмысленный и зазря пропадает (что как раз очень на aaa похоже). Остается только tonsky, журнал которого вы сейчас читаете, но в реальности tonsky, очевидно, не существует.

В общем-то, на этом история заканчивается. Надеюсь, было интересно.
Всегда ваш, nikita.