metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-03-06 08:17 pm

Better safe than sorry или О иммутабельности

Сегодня с утра устроили с [livejournal.com profile] artureg срачь на тему "почему мутабельные структуры данных это плохо".
Вообще все началось с того что он пишет некую хитрую штуку на кложури, но при этом использует ее не в идиоматическом стиле, в то с мысле, что вместо кошерных иммутабельных структур использует 100500 ref которые ссылаются на структуры внутри которых еще ref и в итоге у него это все автоматически не сериализуется в json. То есть закат солнца вручную и изготовление из кложури перла и цэ-с-крестиками и поселение там ядовитых жаб и пауков. И все это внутри Software Transactional Memory, т.е. (dosync ...)
Два дня на пару с [livejournal.com profile] theiced пытались ему объяснить почему ему не нужно столько ref, особенно вложенных, и как кошерно пользоваться иммутабельными структурами данных. Но артурег отнекивается, не желая менять парадигму.
Впрочем, ему там и структуры такой сложности не нужны, посколько достаточно хранить обновления для этих структур в виде списка, а текущее состояние интегрировать исходя из них.

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

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

[identity profile] http://users.livejournal.com/_navi_/ 2012-03-07 06:30 am (UTC)(link)
ага, прекрасный аргумент, «уже сейчас видно, что всё это будет глючить и тормозить»

[identity profile] vp.livejournal.com 2012-03-07 06:35 am (UTC)(link)
Ви не поняли. Я как только узнал, что это не штука для включения-выключения освещения, а для поезда, сразу же пришел в восторог.

[identity profile] bydl0coder.livejournal.com 2012-03-07 06:35 am (UTC)(link)
>не понять зачем нужная overengineered фича
это правда. ну, понятно, зачем нужно, но совершенно точно overengineered.

(ворчливо) ... Опять всякой фигни притащил ...

[identity profile] pingback-bot.livejournal.com 2012-03-07 06:38 am (UTC)(link)
User [livejournal.com profile] mdajoke referenced to your post from (ворчливо) ... Опять всякой фигни притащил ... (http://mdajoke.livejournal.com/72938.html) saying: [...] (http://metaclass.livejournal.com/670899.html [...]

[identity profile] bydl0coder.livejournal.com 2012-03-07 06:42 am (UTC)(link)
Если чо, то dependency injection я делаю примерно так
OldShittyService = NewShinyService
все.

Про іммутабельність

[identity profile] pingback-bot.livejournal.com 2012-03-07 06:55 am (UTC)(link)
User [livejournal.com profile] madf referenced to your post from Про іммутабельність (http://madf.livejournal.com/223848.html) saying: [...] уровня паранойи, ограничиваю себя в возможности отстрелить себе ногу, так как не верю даже себе." [...]

[identity profile] artureg.livejournal.com 2012-03-07 07:44 am (UTC)(link)
да!

[identity profile] denisioru.livejournal.com 2012-03-07 07:44 am (UTC)(link)
плохо чо...

Сарказм?

[identity profile] artureg.livejournal.com 2012-03-07 07:47 am (UTC)(link)
Вы только что обозвали языки с функциями высшего порядка - тинейжерскими?

[identity profile] dr-hyder.livejournal.com 2012-03-07 07:53 am (UTC)(link)
Я?

[identity profile] measles.livejournal.com 2012-03-07 07:53 am (UTC)(link)
"...и немедленно выпил" (с)

[identity profile] dr-hyder.livejournal.com 2012-03-07 07:54 am (UTC)(link)
Ай маладец! Пойду пацанам скажу!

[identity profile] artureg.livejournal.com 2012-03-07 07:55 am (UTC)(link)
вы :) хотя я допускаю то, что не правильно понял смысл вашего предыдущего сообщения

[identity profile] dr-hyder.livejournal.com 2012-03-07 07:57 am (UTC)(link)
Комментарий http://metaclass.livejournal.com/670899.html?thread=11475379#t11475379 - не мой.

[identity profile] artureg.livejournal.com 2012-03-07 07:59 am (UTC)(link)
промазал, прошу прощения :)

[identity profile] artureg.livejournal.com 2012-03-07 07:59 am (UTC)(link)
Вы только что обозвали языки с функциями высшего порядка - тинейжерскими?

[identity profile] tretiy3.livejournal.com 2012-03-07 09:04 am (UTC)(link)
Я так себе представляю точку зрения разработчика, который закопан в своих ioc контейнерах. Такие товарищи, как правило, свысока поглядывают на тех кто пилит на каком-нибудь жабоскрипте.

[identity profile] sorhed.livejournal.com 2012-03-07 09:06 am (UTC)(link)
С другой стороны, я чему-то научился во многом говоря тому, что умные люди постоянно твердили о хороших вещах, и не сдавались перед моим идиотизмом. :)

[identity profile] sorhed.livejournal.com 2012-03-07 09:09 am (UTC)(link)
Янепонял.

[livejournal.com profile] antilamer же уже давно написал исчерпывающую статью про иммутабельность (на Кровавой Энтерпрайзной Джаве, чтобы уж совсем для тупых), ссылку на которую я и предлагаю давать всем заинтересованным лицам для окончательного решения вопроса.

Ну, а кто не просветился — тот сам себе злобный буратино, и ConcurrentModificationException ему в горбатую спину.

[identity profile] dr-hyder.livejournal.com 2012-03-07 09:45 am (UTC)(link)
У программеров очень большое эго. Очень! Поэтому они свысока поглядывают на всех, тут вопрос только в нахождении формального повода. Поглядите хотя бы на этот тред - это ж праздник какой то. Статически-тайпнутые свысока смотрят на динамически-тайпнутых называя их тинейджерами. Динамически-тайпнутые свысока смотрят на статически, называя тех "i hate those fucking cobol dinosaurs!"(дословная цитата моего старого коллеги, насколько я помню речь шла о джаве). Энтерпрайз vs не-энтерпрайз, пайтон vs руби ну и т.п. Эго программерское без всего этого чахнет и возвращается на землю, где нас ТАК НЕ ЦЕНЯТ, умных таких.
Edited 2012-03-07 09:50 (UTC)

[identity profile] tonsky.livejournal.com 2012-03-07 10:01 am (UTC)(link)
Хм, а почему вы решили, что это он не дозрел, а не вы, например? Он вас не слушал, так ведь и вы его не слушали.

Я как-то читал статью про депенденси инжекшн, как раз от авторов гуйса, кажется, и вот там в самый решительный момент, когда они честно признались, что скорее всего вам придется все ваше приложение переписать, утверждали, что this is a good thing. Тогда-то я и понял, что серьезных аргументов у них за него нет.

Сама концепция IOC как бы вырастает из простой функциональной декомпозиции, я против ничего не имею, но непонятно, зачем этому придумали аж два новых названия. А вот зачем нужны специальные библиотеки для него, для меня остается загадкой и по сей день.

[identity profile] dr-hyder.livejournal.com 2012-03-07 10:19 am (UTC)(link)
> Хм, а почему вы решили, что это он не дозрел, а не вы, например? Он вас не слушал, так ведь и вы его не слушали.

Вам чувствую очень хочется пообсуждать с кем нибудь свои мысли по поводу dependency injection. "Я против ничего не имею", но мне не очень интересно, все эти вещи уже сто раз разжёваны везде где только можно. А он не дозрел а не я просто потому что вы не знаете никакого контекста, но пытаетесь его угадать.

> А вот зачем нужны специальные библиотеки для него, для меня остается загадкой и по сей день.

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

Самое смешное что мы guice не использовали и вообще старались от всех энтерпрайзных тулзов держаться подальше, но "это надо знать".
Edited 2012-03-07 10:20 (UTC)

[identity profile] bydl0coder.livejournal.com 2012-03-07 10:26 am (UTC)(link)
Главное, кушать не забывайте.

[identity profile] theiced.livejournal.com 2012-03-07 10:39 am (UTC)(link)
это вы троллите так?

[identity profile] bydl0coder.livejournal.com 2012-03-07 10:48 am (UTC)(link)
Вы так говорите, как будто это что-то плохое.
Мне кажется, что именно JS будет локомотивом прогресса, в том числе и потому, что он говно.

Page 3 of 5