metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2009-07-19 03:24 pm

Адский холивар

На тему "зачем нужен reflection и метаданные, если все можно писать вручную в коде".
Это пиздец, граждане. Я подозревал, что есть люди абстрагированные от мира реальной разработки и его проблем, но не подозревал, что настолько.

ссылко 1
ссылко 2

[livejournal.com profile] zabivator и второй персонаж оттуда усиленно убеждают, что ничего этого не нужно, а потом комментом ниже предлагают решения, которые являются ничем иным, как закатом солнца реализацией рефлекшена и метаданных вручную.

Я тут сижу, думаю, как бы это вообще всю эту метаданную жопу вынести на уровень модели и генерить из нее код, затем мержить с написанной вручную нетривиальностью и таким образом избавится от 1000-кратного писания одного и того же кода "база данных->sqlreader->поле объекта->веб-сервис->поле объекта на клиенте->элемент гуя->поле объекта->веб-сервис->поле объекта->sqlparameter->база данных". Потому что у меня за пару дней может база на 3-5 таблиц увеличится, в каждой по 10-20 полей, и это все надо выставить юзеру на редактирование, да еще красиво, с подписями на трех разных языках и чтобы работать можно было и с мыши и с клавиатуры и чтобы не тормозило, и чтобы неправильных данных при всем желании запилить нельзя было.

А народу пофег, как я посмотрю. Нужно конфиг руками читать - читают. Понадобится изменения сделать - будут дописывать case в switch или там if/else и молиться, что остальные команды разработчиков код сохранения не поломают, и что имена будут одинаковые.

Видимо, я что-то в современной софторазработке и принятой в ней эффективности работы отдельных разработчиков не понимаю.

[identity profile] dmzlj.livejournal.com 2009-07-19 01:31 pm (UTC)(link)
Да вроде кодогенерацией из какой-нить статической метаинформации решается, разве нет? по крайней мере я видел довольно большие проекты, где это было сделано. Есть же даже ормы для статических языков. Что-то то ли я от жары туплю, но не понимаю, о чем базар-вокзал вообще. Есть рефлексия - можно делать и так и сяк, нет рефлексии - можно делать автоматической кодогенерацией из какой-нить метаинформации или DSL.

С конфигом вроде еще проще - забил грамматику, оно тебе разобрало в какую надо структуру.
Рефлексия вообще не вперлась, если структура конфига в рантайме не меняется. Какой еще свич-кейс?

[identity profile] metaclass.livejournal.com 2009-07-19 01:37 pm (UTC)(link)
Ну вот все варианты - кодогенерация, рефлекшен, базовая модель из которой это все создается - это все более менее гуманные варианты. А предлагается что-то вроде:
Field1=ReadIniStr("Section","Name1");
Field2=ReadIniStr("Section","Name2");
итд, и поддерживать это ручками в живом состоянии при изменениях

[identity profile] dmzlj.livejournal.com 2009-07-19 01:45 pm (UTC)(link)
А зачем?


Там тристакамментоф, ниасилю.

[personal profile] alll 2009-07-19 02:05 pm (UTC)(link)
Затем что [livejournal.com profile] zabivator делает движок для реляционных баз данных, а не клиентов для реляционных баз данных. Изделие штучное, с очень жёстко заданными свойствами (что снижает актуальность осознанно используемых метаданных) и жёсткими требованиями к быстродействию (что исключает предметы роскоши в рантайме). Кодогенерация там, афаик, применяется массово (шаблоны C++ - та же кодогенерация), но повод для флейма, насколько я понял - именно рефлекшены и прочие излишества в рантайме.

[identity profile] volodymir-k.livejournal.com 2009-07-19 06:22 pm (UTC)(link)
> Да вроде кодогенерацией из какой-нить статической метаинформации решается, разве нет?

Если код ещё не написан, то где получить его метаинформацию?
Или написан, но исходники не даются?
Да и просто, где и как её получать -- есть стандартные тулы для всех платформ?

[identity profile] dmzlj.livejournal.com 2009-07-19 06:56 pm (UTC)(link)
Метаинформацию можно написать перед тем, как писать код. Ну и не любой код нужно серализовывать или класть в базу. Соответственно, часто большую часть DAO / CRUD можно генерировать автоматически.

Или зайти с другой стороны - генерировать код из DDL.

[identity profile] volodymir-k.livejournal.com 2009-07-19 07:31 pm (UTC)(link)
> Метаинформацию можно написать перед тем, как писать код

САМОМУ??? В 2009 ГОДУ???

[identity profile] metaclass.livejournal.com 2009-07-19 07:35 pm (UTC)(link)
Можно. Если потом код из нее сгенерить. У меня тут выходит, что это было бы удобнее, чем пихать ее целиком в код в виде атрибутов/аннотаций. Но формально метаинформация-модель и код с атрибутами изоморфны друг другу, но для первого нормальных тулсов нет, а для второго есть :)

[identity profile] volodymir-k.livejournal.com 2009-07-19 09:39 pm (UTC)(link)
Это для узкого использования (БД, др.внешние источники данных).
Для, скажем, скриптинга или сериализации, или вообще "конфигуратора" всё наоборот: сначала пишут код, а потом думают, как прикрутить фичи.

[identity profile] lionet.livejournal.com 2009-07-20 12:16 am (UTC)(link)
Модель (хотя бы на салфетке) делается перед тем, как решать очередную подзадачу. Иначе выходит очередная лапша. А уж по модели сделать метаинформацию, кодогенерацию, и автоматическое создание дескриптора веб-сервиса — это уже не задействующие мозг трансформации.

[identity profile] volodymir-k.livejournal.com 2009-07-20 07:24 am (UTC)(link)
> Иначе выходит очередная лапша.

О! Найден Адепт Единственно Работающей Методологии!
Быстрее пишите книгу, все остальные 100500 ошибались!

> А уж по модели сделать метаинформацию, кодогенерацию, и автоматическое создание дескриптора веб-сервиса — это уже не задействующие мозг трансформации.

Но их надо писать, не так ли?
Если проделать в мозгу упражнение, поняв, что рефлекшен это как раз и есть кодогенерация на рантайме, причём уже сделанная -- в чём останется возражение?


Давайте теперь отвлечёмся от абстракций, и расскажите мне, как в уже работающую программу на Си мне добавить сервер мониторинга, удалённых вызовов и скриптинг. Желательно строк в 100-200.

[identity profile] lionet.livejournal.com 2009-07-20 07:28 am (UTC)(link)
О! Найден Адепт Единственно Работающей Методологии!
Быстрее пишите книгу, все остальные 100500 ошибались!


Ты вот ёрничаешь, а книга будет к вечеру готова (в моём журнале).

Если проделать в мозгу упражнение, поняв, что рефлекшен это как раз и есть кодогенерация на рантайме, причём уже сделанная -- в чём останется возражение?

Where do I begin? Прочитаешь в книге.

Давайте теперь отвлечёмся от абстракций, и расскажите мне, как в уже работающую программу на Си мне добавить сервер мониторинга, удалённых вызовов и скриптинг. Желательно строк в 100-200.

Откуда Си взялся? Я вообще-то пропагандирую высокоуровневые решения, а не ассемблер переносимый.

(no subject)

[identity profile] volodymir-k.livejournal.com - 2009-07-20 07:38 (UTC) - Expand

(no subject)

[identity profile] lionet.livejournal.com - 2009-07-20 07:58 (UTC) - Expand

(no subject)

[identity profile] volodymir-k.livejournal.com - 2009-07-21 13:03 (UTC) - Expand

(no subject)

[identity profile] lionet.livejournal.com - 2009-07-21 13:14 (UTC) - Expand

[identity profile] dmzlj.livejournal.com 2009-07-20 07:41 am (UTC)(link)
А зачем Вы такой нервный?

(no subject)

[identity profile] volodymir-k.livejournal.com - 2009-07-20 07:46 (UTC) - Expand

(no subject)

[identity profile] lionet.livejournal.com - 2009-07-20 08:00 (UTC) - Expand

(no subject)

[identity profile] volodymir-k.livejournal.com - 2009-07-21 13:04 (UTC) - Expand

[identity profile] dmzlj.livejournal.com 2009-07-20 02:56 am (UTC)(link)
Вы ее, видимо, как-то очень узко понимаете. Если это будет некий DSL, то с учетом того, что куча кода из него сгенерится, писанины выйдет сильно меньше, чем при наличии этого самого "рефлекшена", который достаточно низкоуровневый инструмент.

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

[identity profile] volodymir-k.livejournal.com 2009-07-20 07:32 am (UTC)(link)
> Если это будет некий DSL

ПИСАТЬ САМОМУ DSL???
Нет, ну вы кадры, ей-Богу.

> писанины выйдет сильно меньше, чем при наличии этого самого "рефлекшена", который

...который Вы не умеете готовить.

Ваше заявление весьма пионерское: "во всех случаях я лучший." Даже детсад какой-то.

Видите ли, люди применяют и то, и то (hibernate/jaxb/jsp). Очевидно, что представление в виде исходного кода частей, которые человек не увидит -- в общем случае лишнее и неэффективное. И более того, программировать данный этап сборки руками -- зло. Можете в голове заменить рефлекшен написанием кода самой виртуальной машиной -- что изменится?

[identity profile] dmzlj.livejournal.com 2009-07-20 07:38 am (UTC)(link)
Ваше заявление весьма пионерское: "во всех случаях я лучший." Даже детсад какой-то.

С чего вы взяли - это раз? У нас сейчас серверное ПО на эрланге, который один весь сплошной рефлекшн.

И вы уверены, что вы вообще со мной спорите? Это два. Я не имею ничего против рефлекшена, ващета. И если поднятся выше по треду, это видно. Может, как-то умерить градус дискуссии?

И три - какие проблемы писать руками DSL? Это делается очень быстро и просто. Это три.

И четыре - покажите, пожалуйста, где я пишу "во всех случаях я лучший." ?

[identity profile] volodymir-k.livejournal.com 2009-07-20 07:51 am (UTC)(link)
4: "писанины выйдет сильно меньше, чем при наличии этого самого "рефлекшена"..."

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

В общем случае надо мерять и прикидывать. У кодогенерации есть много подводных камней.

> какие проблемы писать руками DSL? Это делается очень быстро и просто

Хотелось бы вообще не писать.

Что-то мне подсказывает, что с времён yacc написание языков -- непростое предприятие: не дай Бог где-нибудь вкрадётся ошибка. (Хотя, конечно, у Настоящих Адептов ошибок не бывает. По определению.)

[identity profile] dmzlj.livejournal.com 2009-07-20 07:57 am (UTC)(link)
4: "писанины выйдет сильно меньше, чем при наличии этого самого "рефлекшена"..."

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

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

(no subject)

[identity profile] volodymir-k.livejournal.com - 2009-07-21 13:07 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2009-08-08 06:49 (UTC) - Expand

(no subject)

[identity profile] volodymir-k.livejournal.com - 2009-08-10 14:42 (UTC) - Expand

[identity profile] metaclass.livejournal.com 2009-07-20 07:59 am (UTC)(link)
Самодельные DSL это таки идея бродящая в массах усиленно, особенно с всяким метапрограммированием и вычислениями на системах типов, где их делать проще.

[identity profile] dmzlj.livejournal.com 2009-07-20 09:36 am (UTC)(link)
Я первый раз их увидел в промышленных масштабах в инвест. банке. В системе, где часть исходников содержала таймстемпы 94-го года, около 1 гигабайта негенереных исходников (генеренных даже затрудняюсь сказать сколько) для гуя и базы. На C++. Генерился эпических размеров апп. сервер на несколько нод, с совершенно сотонинским по развесистости гуем на Motif. Где на отдельные виджеты нужна были свои лицензии, и если лицензии во время не проплатить и не проаапдейтить сервер лицензий, то вместо виджетов рисовались разноцветные прямоугольники. Сила была. Сейчас так не умеют :)

[identity profile] dmzlj.livejournal.com 2009-07-20 09:38 am (UTC)(link)
и да, DSL был написан на обычном перле

[identity profile] volodymir-k.livejournal.com 2009-07-21 01:09 pm (UTC)(link)
Иногда это оправданно -- когда рефлекшен-код на хост-языке начинает раздуваться до тысяч строк. Однако отлаживать проблемы в DSL -- это ад.

[identity profile] zamotivator.livejournal.com 2009-08-08 06:52 am (UTC)(link)
ПИСАТЬ САМОМУ DSL???
bizon/yacc/parsec + llvm/.net/java + два дня = DSL

[identity profile] metaclass.livejournal.com 2009-08-08 08:53 am (UTC)(link)
Я тебе точно скажу: за два дня ты напишешь только DSL, который работу упростит на ближайшую неделю, а усложнит тебе и тем, кто придет после тебя - на 10 лет вперед.

1) Адекватное проектирование даже простых вещей занимает от недели до месяца. А тут язык - вещь очевидно сложная
2) Реализация, отладка и иногда возврат и перепроектирование - еще неделю-две.
3) Интеграция этого с остальными процессами разработки. Вкрутить очередной тул в процесс билда и тестирования.
4) Документация

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

[identity profile] volodymir-k.livejournal.com 2009-08-10 02:57 pm (UTC)(link)
Видите ли, мы с Вами в немного разных бизнесах работаем. У нас разные временнЫе рамки. Скажем, Вы можете себе позволить одной проблематикой, достаточно чёткой и понятной, заниматься и год, и два, и три. А вот если так:
- сегодня парсим текстовые файлы в оракл, средней сложности UI, 30 простых и 10 сложных бизнес-правил;
- через два месяца javascript/html/DOM, причём на уже существующих библиотеках сущетсввующее приложение, причём интеграция с САП;
- ещё через 3 месяца веб-сервисы и дот-нет клиент;
- ещё через полтора месяца другие вебсервисы.
Проекты начинаются не со спеки, прошу заметить, а со сбора требований. Юзер как правило говорит плохо, "а чего вы сами не понимаете." И кончаются изменения требований где-то за неделю до релиза, а иногда и месяц после него.

Если я на каждом проекте буду изобретать свой DSL (когда ещё нихрена не понятна постановка), отлаживать, переделывать... Это очень неэффективно. Часто копи-паста банально БЫСТРЕЕ "правильного дизайна".
В таких проектах и J2EE не особо хороша -- perl/ruby быстрее, адекватнее. Но у них и пиар хуже, и технически...

DSL хорош, когда
- задача чётко понятна (и меняется не сильно)
- времени на решение относительно дохрена (порядка месяца)
- коллеги сильны.

Да и правильно Метакласс говорит -- не дай Бог такое ядро себе к ноге привязать, не дадут отпуск ведь. ))

(no subject)

[identity profile] dmzlj.livejournal.com - 2009-08-10 15:11 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2009-08-11 08:42 (UTC) - Expand

(no subject)

[identity profile] dmzlj.livejournal.com - 2009-08-11 09:50 (UTC) - Expand