metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-10-11 03:22 pm

Динамическая типизация, или статическая типизация для ленивых

Вчера [livejournal.com profile] ivan_gandhi сделал замечание что я, пользуясь динамически типизированной кложурью, при этом требую, чтобы в Java проверяли входные параметры на валидность. (Если что, проверка валидности в дотнете есть на каждом шагу, а объяснения вида "экономят циклы и не делаю проверки" в контексте жабы, тяжелого железа, JIT и прочего звучат крайне странно).
Собирался на эту тему устроить срач с утра, но [livejournal.com profile] thedeemon уже начал, так что я продолжу :)

Так вот, динамически типизированными языками мы пользуемся от бедности - нету статически типизированных языков, которые давали бы ту же функциональность.

Например, я хочу использовать кортеж с именованными полями (потому что позиционные кортежи нихера нечитабельны и их тип вида int*string*smallint*money*bool*Chervie ни о о чем не говорят). От входа в F# при этом нужно:
1) объявить этот чертов record где-то
2) сослаться на модуль с объявлением везде где он нужен
3) создавать экземпляры рекорда кривопачвярными конструкциями, причем оставить поля значениями по умолчанию нельзя.
4) паттерн матчинг с декомпозицией вроде не работает с рекордами.

Хаскель сразу закапываем - там на каждый случай имеется 3-4 расширения и 10 пакетов в hackage различной степени недоделанности, идиоматический подход - писать в point-free style, чтобы коллеги не разобрались, а работать в продакшене можно только с теми сторонними библиотеками, которые я могу сам починить.

При этом, у меня при работе с оперденями постоянно ситуации вида: есть запись с тремя полями, полученная из БД, мне нужно произвести обработку этой записи и добавить результат обработки в виде четвертого поля, получив новый тип записи.
Я НЕ хочу объявлять каждый раз такое руками и в Clojure это делается элементарно, добавлением нового ключа в map в функции-обработчике записей.

При этом РЕАЛЬНО динамическую типизацию я не использую. Она мне почти не нужна, потому что единственная ситуация, где вменяемый человек будет на одном цикле биндить к имени число, на втором строку, на третьем - список записей - это когда по условию задачи нужна, например, EAV-модель во все поля. И то - обычно EAV делается от безысходности, потому что пользователь не может нормально работать со схемой БД, а задача требует чего-нибудь вроде "добавить к части записей атрибут "фаза луны в которую производилась приемка товара"". В норме должны быть зависимые типы и миграции и пользователи бы пользовались той же системой типов что и разработчик.
Т.е. нормальный вывод типов - это когда программа берет типы из тут же описанного SQL-запроса, а рекорды расширяемые и объявлять их не нужно.

Второй use-case, где "вроде бы динамическая типизация" - это когда я делаю документы в виде кложурных структур данных, подгоняя комбинации списков-мапов-массивов-множеств под предметную область. В кложуре же это делается в лоб, а в хаскеле в один список не положишь три разных по структуре(типу) раздела документа. Но на самом деле, то что я делаю в кложури - это просто алгебраический тип данных "для бедных", без объявления заранее и без явно выделенных-именованных конструкторов данных. Если бы была возможность делать расширяемые и объявляемые по месту типы данных (чтобы каждый раз при разработке не переключаться между объявлением типа и конструированием данных по этому типу) - то было бы то же самое что в кложури - но статически типизированное.

PS: На ту же тему: http://justy-tylor.livejournal.com/190153.html

[identity profile] zw0rk.blogspot.nl (from livejournal.com) 2012-10-11 10:31 pm (UTC)(link)
Еще раз. Коль скоро существуют компании, которые вовсю пишут на хаскелле/используют FreeBSD/ковыряют в носу шваброй вместо использования Истинно Истинных Технологий -- значит их метод ведения бизнеса жизнеспособен. Это же закон рынка, неэффективные компании выживают только в монопольном положении.

[identity profile] zamotivator.livejournal.com 2012-10-11 10:34 pm (UTC)(link)
Ну, FreeBSD в последнее время становится меньше, это сильно радует.

Haskell - их особо много и не было, да и нет, и слава богу.

[identity profile] zw0rk.blogspot.nl (from livejournal.com) 2012-10-11 10:36 pm (UTC)(link)
Это страусиная позиция, извините. Их немного, значит их нет? Контор, которые используют R или erlang, например, тоже немного (в относительных величинах) -- это значит что R/erlang плохой и его надо заменить на то, что вы считаете правильным? Вот они так не думают и живут себе, засранцы.

[identity profile] zamotivator.livejournal.com 2012-10-11 10:40 pm (UTC)(link)
erlang сейчас существенно больше. Только за последний месяц меня с указанным в резюме "erlang: beginner" позвали в три разных места (!!!)
erlang выходит в mainstream, это их многих мест слышно, да и знакомые не пугаются при его виде.

R - вы простите, но у меня на рабоет с ним работать приходится. Биндинги в него писать. И он популярным в scientific кругах стал уже весьма прочно, последний год - так вполне определённо.

У каждого своя ниша. erlang позволяет легко писать в event-driven стиле распределённые системы (распределённые не обязательно из соображений производительности. Язык так себе, достаточно, к тому же, тормозной. Но есть и killer feature - типа общего пространства процессов и отсутствие необходимости в IPC/RPC как класса. Это всё искупает)

R - научные вычисления. Как и octave, как и matlab.

А где ниша Haskell?

[identity profile] zw0rk.blogspot.nl (from livejournal.com) 2012-10-11 10:45 pm (UTC)(link)
> erlang сейчас существенно больше. Только за последний месяц меня с указанным в резюме "erlang: beginner" позвали в три разных места (!!!)

Ну, это конечно фундаментальный показатель.

> R - вы простите, но у меня на рабоет с ним работать приходится. Биндинги в него писать. И он популярным в scientific кругах стал уже весьма прочно, последний год - так вполне определённо.

То есть R -- нужен? Потому что его используют. Но ведь у него те же проблемы, что и у хаскелля, нет? Тоже мало кто его знает, тоже понапишут шибко умные, потом сиди разбирайся.

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

Это очень похоже на разновидность луддизма.

> А где ниша Haskell?

На этот вопрос я вам не отвечу, я хаскель использую редко.

[identity profile] zamotivator.livejournal.com 2012-10-11 10:50 pm (UTC)(link)
> Ну, это конечно фундаментальный показатель.

Это очень важный показатель. Есть спрос - будут программисты - будет кому заменить человека в команде после ухода

> То есть R -- нужен? Потому что его используют. Но ведь у него те же проблемы, что и у хаскелля, нет? Тоже мало кто его знает, тоже понапишут шибко умные, потом сиди разбирайся.

"шибко умные" - это когда файлы сканируются на диске через эндофункторы или нужен гамак с лыжами и монадами для скачки файлов по http.

R сидит хорошо в своей нише - научные вычисления. Линейная алгебра, та же. Люди что берут R они знают, что такое матрицы, и язык ими выбранный адекватен их задаче.

Человек, что пишет простого робота для анализа сайтов для своей мелкой хотелки - ему нафиг не впёрлись эти монады и доллары. Ему нужно РЕШИТЬ ЗАДАЧУ. Вот на Питон это элементарно. Пара запросов в гугль. Этим скачиваем странички. Этим парсим и и ищем нужную нам инфу. А вот так складываем результат в файлик. Всё просто и понятно.

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

Как же с Хаскелл-фанатиками туго-то, а. Речь идёт не про то, лучше ищи хуже язык. Речь идёт про адекватность языка поставленным задачам и риски компании связанные с его использованием.

> На этот вопрос я вам не отвечу, я хаскель использую редко.
Нишы Ерланга и R я описал. Могу и нишу Питона описать - это скриптовый язык, что работает везде, и оптимально годится для автоматизации мелких рутинных задач.
Лучше чем shell.

[identity profile] zw0rk.blogspot.nl (from livejournal.com) 2012-10-11 10:56 pm (UTC)(link)
> Это очень важный показатель. Есть спрос - будут программисты - будет кому заменить человека в команде после ухода

Опять двадцатьпять. Мы уже это обсуждали. Это вопрос менеджмента -- ну вот выживают конторы сумасшедших хаскелефилов, стало быть находят они специалистов. Не иначе как без вмешательства сатаны не обходиться.

> "шибко умные" - это когда файлы сканируются на диске через эндофункторы или нужен гамак с лыжами и монадами для скачки файлов по http.

Шибко умные, это когда зачем-то свои матрицы и детерминанты тащат в СЛУ. Ведь любому дураку понятно, что можно решить простым перебором. Тоже ведь подход? И найти таких решателей на рынке еще проще, чем тех, кто знает про алгебру что-то?

> Человек, что пишет простого робота для анализа сайтов для своей мелкой хотелки - ему нафиг не впёрлись эти монады и доллары. Ему нужно РЕШИТЬ ЗАДАЧУ. Вот на Питон это элементарно. Пара запросов в гугль. Этим скачиваем странички. Этим парсим и и ищем нужную нам инфу. А вот так складываем результат в файлик. Всё просто и понятно.

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

> Как же с Хаскелл-фанатиками туго-то, а. Речь идёт не про то, лучше ищи хуже язык. Речь идёт про адекватность языка поставленным задачам и риски компании связанные с его использованием.

Ну вот я уже и фанатик. Я привёл уже довод о законах рынка и хаскель/скала/whatever-конторах. Ну разбейте этот довод, раз я фанатик.

[identity profile] zamotivator.livejournal.com 2012-10-11 11:08 pm (UTC)(link)
> Опять двадцатьпять. Мы уже это обсуждали. Это вопрос менеджмента -- ну вот выживают конторы сумасшедших хаскелефилов, стало быть находят они специалистов. Не иначе как без вмешательства сатаны не обходиться.

Либо они работают за такие деньги, на которые нормальных специалистов на других языках не наймёшь. Это называется "демпинг" и говорит не в пользу Haskell.

> Шибко умные, это когда зачем-то свои матрицы и детерминанты тащат в СЛУ. Ведь любому дураку понятно, что можно решить простым перебором. Тоже ведь подход? И найти таких решателей на рынке еще проще, чем тех, кто знает про алгебру что-то?

Никому "СЛУ" работе решать не нужно. Людям нужно решать задачи, то поставил менеджмент.
Один знакомый не так давно пришёл тимлидом в проект по написанию систему рекомендаций.
Почитал что и как делают в machine learning, почесал репу, взял Java + Hadoop, вспомнил матрицы, заколбасил решение, работает. СЛУ в процессе тоже решать приходилось. Только это детали реализации, особенности алгоритмов такие, что их удобней делать через СЛУ и линейную алгебру.

Для скачивания файла по http не нужно знать всякого дерьма типа монад.
Правильное решение задачи выглядит так:
import urllib
urllib.urlretrieve ("http://www.example.com/songs/mp3.mp3", "mp3.mp3")

И что, сука, характерно, будет работать на любом линуксе сразу, без всяких приседаний. запихивается в script.
Не нужно решать квест "как скачать haskell", квест "какую лтбу взять" и квест "как мне пофильтровать из скачанного файла через монады бесплатно без смс" когда приспичит.

> Ну порадуемся за человека. А другой пишет "на эндофункторах" и у него тоже задача решается. Надо его убить, чтобы не смущал?

Если он это притащил в рабочий проект без чёткого письменного обоснования почему это нужно и подписей менеджмента - то это попахивает саботажем, с моей точки зрения.
Вообще говоря, любые свои решения в проекте нужно обосновывать. Не абстрактными "эффективность выше", а конкретикой - вот линейная алгебра нужна, потому что через неё существенно проще описывать рекомендации и веса, алгоритм линейной регрессии через неё работает - другими способами решать сложней.
Понимаете? Когда ДРУГИЕ РЕШЕНИЯ - СЛОЖНЕЕ.

[identity profile] zw0rk.blogspot.nl (from livejournal.com) 2012-10-11 11:11 pm (UTC)(link)
> И что, сука, характерно, будет работать на любом линуксе сразу, без всяких приседаний. запихивается в script.

Нет, не на любом.

[identity profile] zamotivator.livejournal.com 2012-10-11 11:12 pm (UTC)(link)
На любом современном линуксе - начиная от deprecated Red Hat 5.4 что уже сыпется от старости и заканчивая ubuntu 12.10 beta иили Fedora Rawhide

[identity profile] zamotivator.livejournal.com 2012-10-11 11:13 pm (UTC)(link)
Найдите мне дистрибьютив линукса, что не имеет Питон в default поставке.
desktop или сервер версию. embedded - там другие линуксы, там не только haskell, но и python не пахнет.

[identity profile] metaclass.livejournal.com 2012-10-12 05:16 am (UTC)(link)
Надо заметить что на уровне двухстрочника оно и в хаскеле работает.
Вопросы начнутся, когда потребуется чтобы при плохо работающем DNS и тормозящем сайте можно было прервать скачивание кнопочкой с GUI и чтобы при этом в лог были записаны ошибки, а в программе не было утечек хендлов. И чтобы это было оформлено в DLL, которую руками грузят и выгружают из какой-нибудь 1C.

Если что - хаскель рантайм под виндой не умеет работать после однократной переинициализации извне. Там статические переменные. Не очищаются инициализацией/деинициализацией, да :)

[identity profile] thesz.livejournal.com 2012-10-11 10:52 pm (UTC)(link)
Чем Cloud Haskell не ниша Хаскеля? Помимо всякого другого, той же REPA.

[identity profile] zamotivator.livejournal.com 2012-10-11 10:53 pm (UTC)(link)
Вот когда I/O, монады и ленивость починят, вот тогда и станет нишей. А пока не тянет.

[identity profile] thesz.livejournal.com 2012-10-11 10:55 pm (UTC)(link)
То есть, надо починить только то, что вы не смогли освоить? Так?

[identity profile] zamotivator.livejournal.com 2012-10-11 11:01 pm (UTC)(link)
Нет, починить нужно сущности, неадекватные по сложности или неудовлитворительные по потреблению ресурсов решаемым задачам.

[identity profile] thesz.livejournal.com 2012-10-11 11:10 pm (UTC)(link)
Вот смотрите, вынесенное в отдельную сущность IO позволило Хаскелю стать одним из первых языков с хорошей поддержкой SMP. fortkIO это примерно конец 1990-х, если я не ошибаюсь.

Если это полезное качество - вы можете быть против, конечно, - то может быть стоит считать это полезным архитектурным решением, чем неадекватным по сложности излишеством?

К слову, Cloud Haskell работает в своей монаде. А Cloud Haskell это практически Erlang 2.0, ибо использует исправленную семантику Эрланга.

Если счесть и это полезным свойством, то, может, и монады полезны?

[identity profile] zamotivator.livejournal.com 2012-10-11 11:17 pm (UTC)(link)
> Вот смотрите, вынесенное в отдельную сущность IO позволило Хаскелю стать одним из первых языков с хорошей поддержкой SMP. fortkIO это примерно конец 1990-х, если я не ошибаюсь.

А толку? MySQL на сях долго страдал на ядрах больше четырёх, но его взяли и починил в итоге.
Починили, а не на haskell переписали.

И я вам сейчас открою страшный-страшный секрет. Я вот в октябре 2010 был на Monty Programming Conference.
Туда приехал представитель компании Intel. За свой счёт (счёт Intel я имею ввиду). Он советовался с разработчиками MySQL, как ему правильно тестировать качество сгенерированного интеловским компилятором кода и качество новых процессоров на примере MySQL.

Вы понимаете? Под презренный MySQL написанный на презренном Си INTEL ЖЕЛЕЗО ЗАТАЧИВАЕТ.

Ваш haskell со своим SMP могут продолжать гнить на задворках. Под android и ios его до сих пор нету, ЕМНИП.
Си, Джава - есть.

Хорошая поддержка SMP. И это всё? Сочувствую.

[identity profile] thesz.livejournal.com 2012-10-11 11:20 pm (UTC)(link)
Вы говорите про существующую программу. В этом случае понятно, что переписывать не стоит.

Спрошу с другой стороны. Стоит ли писать новую программу на Хаскеле? Ту, которую вы до сих пор не писали, но от которой много ждёте.

[identity profile] zamotivator.livejournal.com 2012-10-11 11:24 pm (UTC)(link)
Смотря какую программу.
Назовите задачу, и скажу:
1) компетентен ли и квалифицирован ли я достаточно в этой области, чтобы выбирать язык программирования для этой задачи
2) если (1) - да, то какая язык и платформу следует выбирать и почему.
Edited 2012-10-11 23:24 (UTC)

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-11 23:50 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 23:55 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-12 00:03 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-12 00:08 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-12 00:17 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-12 00:19 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-12 00:22 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-12 00:23 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-12 00:29 (UTC) - Expand

(no subject)

[identity profile] berezovsky.livejournal.com - 2012-10-12 00:29 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-12 00:29 (UTC) - Expand

(no subject)

[identity profile] berezovsky.livejournal.com - 2012-10-12 00:39 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-12 00:40 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-12 00:39 (UTC) - Expand

(no subject)

[identity profile] berezovsky.livejournal.com - 2012-10-12 00:40 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-12 00:47 (UTC) - Expand

(no subject)

[identity profile] voidex.livejournal.com - 2012-10-12 09:21 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-12 05:23 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-12 11:41 (UTC) - Expand

(no subject)

(Anonymous) - 2012-10-13 15:19 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-15 01:07 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-15 01:10 (UTC) - Expand

(no subject)

(Anonymous) - 2012-10-15 14:07 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-15 14:47 (UTC) - Expand

(no subject)

(Anonymous) - 2012-10-15 20:13 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-15 21:06 (UTC) - Expand

(no subject)

(Anonymous) - 2012-10-15 22:04 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-15 23:19 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-15 23:20 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-11 23:54 (UTC) - Expand

[identity profile] migmit.livejournal.com 2012-10-15 07:30 am (UTC)(link)
> починить нужно сущности, неадекватные по сложности

Супер. Вот когда в императивных языках починят присваивание, тогда приходите.

[identity profile] metaclass.livejournal.com 2012-10-12 05:12 am (UTC)(link)
Это ты еще внутренностей виндовс-рантайма хаскеля не смотрел наверно :)
Там все эти сказки про зеленые потоки, ожидания i/o и прочая асинхронность превращены в ебаную срань из костылей и утечек хендлов.
Короче, любимый пример с пиздатейшим TCP-сервером на хаскеле в пару строк под виндой под небольшой нагрузкой дохнет в сраку :)

[identity profile] nivanych.livejournal.com 2012-10-12 05:38 pm (UTC)(link)
Что-то тут не то.
Пару лет назад, я писал падвенду на хацкеле — ничего не падало, коннектов воспринимало сколько угодно.
Не хочется больше падвенду писать, но по другим причинам, с GHC не связанным.

[identity profile] thesz.livejournal.com 2012-10-12 07:41 pm (UTC)(link)
Что за любимый пример?

Спрашивали ли вы у [livejournal.com profile] awson насчёт веб-сервера под Windows? Он прицепил кого-то из Хаскельных серверов к веб-серверу в ядре Windows и получил производительность уровня Линукса.

[identity profile] metaclass.livejournal.com 2012-10-12 07:56 pm (UTC)(link)
Хм, в таком виде может получится неплохо. В винде http.sys поддерживает API для http-серверов.