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] juan-gandhi.livejournal.com 2012-03-06 06:24 pm (UTC)(link)
А я так уже устал спорить. Если человек хочет научиться чему-то новому, он разует уши и будет слушать умных людей. А учиться каждый может найти чему. Если же человек не хочет учиться, да ты хоть кол на голове теши, у него другие мысли, и всё. Так что встать и пойти.

[identity profile] dr-hyder.livejournal.com 2012-03-06 06:32 pm (UTC)(link)
Я недавно пытался обьяснить одному человеку смысл dependency injection на примере в guice. У него было(и осталось, по моему) твёрдое убеждение что это какая то дикая не понять зачем нужная overengineered фича. Просто до некоторых вещей нужно самому как то дозреть, осознать смысл и необходимость. А то вроде как понятно и зачем и как использовать, но не понятен смысл "а я вот так делаю всю жизнь и всё нормально, зачем мне это?".

[identity profile] metaclass.livejournal.com 2012-03-06 06:40 pm (UTC)(link)
Насчет "дозреть" очень верно.

[identity profile] plumqqz.livejournal.com 2012-03-06 06:44 pm (UTC)(link)
После жабы очень хорошо понимаешь, что инджекшенами этими очень удобно не пользоваться.

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

[identity profile] http://users.livejournal.com/_windwalker_/ 2012-03-07 10:34 pm (UTC)(link)
Есть spring, а есть atg dynamo.

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

[identity profile] http://users.livejournal.com/_aive_/ 2012-03-06 06:54 pm (UTC)(link)
Может для его задач действительно не зачем? :)

[identity profile] dr-hyder.livejournal.com 2012-03-06 07:28 pm (UTC)(link)
Ну так ведь и иммутабл типами можно не пользоваться, особенно если не религиозен :-)

[identity profile] tretiy3.livejournal.com 2012-03-06 07:03 pm (UTC)(link)
все же dependency injection может показаться оч мутной штукой когда пишешь на языке, в котором в функцию можно передать функцию.
эти языки, понятно, для тинейджеров. но тинейджеры дозреют когда-нить до мутного энтерпрайза с прикольными названиями тривиальных вещей, обернутых тучей xml конфигов.

[identity profile] dr-hyder.livejournal.com 2012-03-06 07:32 pm (UTC)(link)
Честно говоря мне думается что до ентерпрайза сложно дозреть, этому делу скорее заставляют. Хочешь денег - дозревай до ентегпрайза :-)

[identity profile] tretiy3.livejournal.com 2012-03-06 07:39 pm (UTC)(link)
вроде того, да. как в комсомол вступить :)

[identity profile] theiced.livejournal.com 2012-03-06 08:08 pm (UTC)(link)
быгыы. это верно только для говнокодеров.

(no subject)

[identity profile] dr-hyder.livejournal.com - 2012-03-06 20:21 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-03-06 20:28 (UTC) - Expand

(no subject)

[identity profile] dr-hyder.livejournal.com - 2012-03-06 20:39 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-03-06 20:41 (UTC) - Expand

(no subject)

[identity profile] dr-hyder.livejournal.com - 2012-03-06 21:01 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-03-06 21:06 (UTC) - Expand

(no subject)

[identity profile] dr-hyder.livejournal.com - 2012-03-06 21:13 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-03-06 21:16 (UTC) - Expand

(no subject)

[identity profile] dr-hyder.livejournal.com - 2012-03-06 21:20 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-03-06 21:40 (UTC) - Expand

(no subject)

[identity profile] dr-hyder.livejournal.com - 2012-03-06 21:44 (UTC) - Expand

Сарказм?

[identity profile] artureg.livejournal.com - 2012-03-07 07:47 (UTC) - Expand

(no subject)

[identity profile] dr-hyder.livejournal.com - 2012-03-07 07:53 (UTC) - Expand

(no subject)

[identity profile] artureg.livejournal.com - 2012-03-07 07:55 (UTC) - Expand

(no subject)

[identity profile] dr-hyder.livejournal.com - 2012-03-07 07:57 (UTC) - Expand

(no subject)

[identity profile] artureg.livejournal.com - 2012-03-07 07:59 (UTC) - Expand

[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 контейнерах. Такие товарищи, как правило, свысока поглядывают на тех кто пилит на каком-нибудь жабоскрипте.

(no subject)

[identity profile] dr-hyder.livejournal.com - 2012-03-07 09:45 (UTC) - Expand

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

(no subject)

[identity profile] artureg.livejournal.com - 2012-03-07 10:53 (UTC) - Expand

(no subject)

[identity profile] bydl0coder.livejournal.com - 2012-03-07 11:00 (UTC) - Expand

(no subject)

[identity profile] artureg.livejournal.com - 2012-03-07 11:01 (UTC) - Expand

(no subject)

[identity profile] bydl0coder.livejournal.com - 2012-03-07 11:02 (UTC) - Expand

(no subject)

[identity profile] artureg.livejournal.com - 2012-03-07 11:05 (UTC) - Expand

(no subject)

[identity profile] bydl0coder.livejournal.com - 2012-03-07 13:25 (UTC) - Expand

(no subject)

[identity profile] artureg.livejournal.com - 2012-03-07 13:32 (UTC) - Expand

(no subject)

[identity profile] bydl0coder.livejournal.com - 2012-03-07 13:45 (UTC) - Expand

(no subject)

[identity profile] artureg.livejournal.com - 2012-03-07 13:46 (UTC) - Expand

(no subject)

[identity profile] bydl0coder.livejournal.com - 2012-03-07 13:49 (UTC) - Expand

(no subject)

[identity profile] artureg.livejournal.com - 2012-03-07 13:50 (UTC) - Expand

(no subject)

[identity profile] bydl0coder.livejournal.com - 2012-03-07 13:59 (UTC) - Expand

(no subject)

[identity profile] artureg.livejournal.com - 2012-03-07 14:19 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-03-07 14:11 (UTC) - Expand

(no subject)

[identity profile] artureg.livejournal.com - 2012-03-07 14:16 (UTC) - Expand

(no subject)

[identity profile] bydl0coder.livejournal.com - 2012-03-08 09:35 (UTC) - Expand

(no subject)

[identity profile] artureg.livejournal.com - 2012-03-08 09:40 (UTC) - Expand

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

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

(no subject)

[identity profile] dr-hyder.livejournal.com - 2012-03-07 07:54 (UTC) - Expand

(no subject)

[identity profile] bydl0coder.livejournal.com - 2012-03-07 10:26 (UTC) - Expand

[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)

(no subject)

[identity profile] tonsky.livejournal.com - 2012-03-07 12:46 (UTC) - Expand

(no subject)

[identity profile] dr-hyder.livejournal.com - 2012-03-07 13:02 (UTC) - Expand

(no subject)

[identity profile] bydl0coder.livejournal.com - 2012-03-07 13:30 (UTC) - Expand

(no subject)

[identity profile] dr-hyder.livejournal.com - 2012-03-07 13:42 (UTC) - Expand

[identity profile] metaclass.livejournal.com 2012-03-07 10:49 am (UTC)(link)
Библиотеки для IOC, да еще и с xml конфигурацией - ужасает :)

(no subject)

[identity profile] dr-hyder.livejournal.com - 2012-03-07 11:30 (UTC) - Expand

[identity profile] levgem.livejournal.com 2012-03-08 09:06 pm (UTC)(link)
В Ruby открытые классы, которые можно модифицировать в рантайме. Насколько я понимаю, там dependency injection в хрен не впился.

[identity profile] dr-hyder.livejournal.com 2012-03-08 09:09 pm (UTC)(link)
А при чём тут руби?

[identity profile] anatoly borodin (from livejournal.com) 2012-03-09 12:52 am (UTC)(link)
DI — это ж просто функции высшего порядка, которым передаются замыкания, не?

[identity profile] metaclass.livejournal.com 2012-03-09 05:57 am (UTC)(link)
Практически это оно и есть, поэтому все эти паттерны в контексте ФП смотрятся смешно.

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