metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-01-31 12:31 pm

Special Enterprise Programming Olympics

[livejournal.com profile] theiced и [livejournal.com profile] skif_by и [livejournal.com profile] artureg решили устроить соревнование на тему "какой язык программирования более адекватен в руках профессионала" и попросили придумать им задание. Поскольку синтетические задания с результатом в виде консольных утилит это скучно, а они все умеют веб хорошо, я им придумал задачку с не сильно сложным веб-приложением. Условие под катом:

Special Enterprise Programming Olympics

Problem 1:

You need to implement universal web-based application for report generation.

Application consists of:
* Database. You can use any relational DBMS you like, but you should have in mind ease of linux deployment.
* Web application deployed to your favorite web-server, app-server, whatever.
* Client-side JavaScript application working in modern browsers (>=IE7,Firefox>=5,Chrome)

* Web application must have report configuration file which contains:
** Unique system report id. Any string
** User-friendly name of report. For report titles and page headers.
** SQL query for report generation. SQL query is arbitrary and should contain parameters. SQL query will be in native format of used RDBMS.
** Query parameter description list.
Each parameter description contains parameter name, user-friendly caption,type,
output format and default value.
If you can infer parameter list from SQL query then this information is optional and
parameter list can be generated automatically.

** Query result field list. Field description should contain name, user-friendly name,
visibility flag(visible/not visible) and output format.
Field descriptions are optional - without description report should contain field
with default(returned from query) name and default output format.

* Types allowed for query parameters: integer,double,date,datetime,string,bool,decimal (money)

* Default values allowed for date or datetime parameters:
** Culture-invariant (!) string representation of any date or datetime
** If default value is prefixed with “@” then default parameter value is calculated as follows:
** @now - today (date) or current time(datetime)
** @prevmonthbeg - beginning of previous month
** @prevmonthend - end of previous month. Beware of difference in date and datetime (last day of month is 30/31, but last datetime of month is <00:00:00 01-of-nextmonth)
** @currmonthbeg - beginning of current month
** @currmonthend - end of current month
** @prevyearbeg - beginning of previous year
** @prevyearend - end of previous year
** @curryearbeg - beginning of current year
** @curryearend - end of current year

* Report configuration file will be edited once in a while based on
customers (report end-user) requirements.

Errors in configuration file format or in queries should be processed with
displaying of user-friendly error messages in client application and
error logging on server.


* Client application must show report list in any usable way(list of links, menu, tree, etc)
* Click on report must open report page which consists of:
** Report header (user-friendly report name)
** Report parameters table with user-friendly labels and editable parameters.
** "Refresh Report" button
** Report result table which is populated after click on "Refresh Report" button
or after Enter key press in any of parameter's edit controls.

* Paging or lazy result loading is not usually needed - most reports contains no more than 5 pages of data.

* When printing, report should follow the same structure as page, except for "Refresh" button.

* Report data is desirable to return in json or xml format, so it will be possible to
use wget/curl/any http client application to connect to server and get report data.


* Problem solution must contain:
** Deployment package for linux (any distro you like, but Ubuntu 10.04 LTS is preferred ). Also any deployment/configuration management system can be used.
** Deployment instructions.

Configuration file example: http://www.cacodaemon.org/content/so/ReportConfig.xml

Времени им - вообще до понедельника, но я бы добавил еще несколько дней на доработки по результатам.

[identity profile] npocmu.livejournal.com 2012-02-01 04:48 am (UTC)(link)
"Поскольку за месяц набиралось дофига данных и если все эти базы в одну сливать, то она будет еле ворочаться. "

Давно интересовало, откуда берутся такие странные представления о механизмах работы СУБД?

[identity profile] metaclass.livejournal.com 2012-02-01 04:53 am (UTC)(link)
1С же. Кроме того, если не делать заранее рассчитанных агрегатов, данные лежат по страницам "плохо" или же фуллсканы в запросах - оно в итоге так и получается. Это все сдыхает тупо за счет i/o.

[identity profile] npocmu.livejournal.com 2012-02-01 08:17 am (UTC)(link)
"Ситуация такая - есть десяток филиалов, в каждом своя автономная база. Каждый месяц все базы архивируются и обрезаются, то есть в каждой базе данные только за один месяц. Получается 12 баз в год на филиал, или примерно 120 баз в год всего. Базы эти приезжают в центральный филиал и складываются в отдельную папку. Потом данные из этих баз выдергивались и раскладывались по отдельным "чистовым" базам разных юр.лиц.

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


Где тут про 1С??? Тут только про тараканы в голове. Вместо организации нормального хранилища и OLAP поверх него - "запиливание" супербаз

[identity profile] metaclass.livejournal.com 2012-02-01 08:28 am (UTC)(link)
http://metaclass.livejournal.com/658955.html?thread=11081227 "Там на не шибко мощном сервере была 1С 7.7, которая быстро работает только с локальной базой"
Я предполагаю, что "слияние баз филиалов" и тому подобное тоже делается для 1C.

[identity profile] serbod.livejournal.com 2012-02-01 08:54 am (UTC)(link)
true =)

[identity profile] serbod.livejournal.com 2012-02-01 05:26 am (UTC)(link)
Из практики. Перелить гигабайт мелких записей из одной базы в другую занимает прилично времени. А еще восстановление индексов и тестирование при сбое занимает тоже очень дофига времени. А еще есть два вида данных - первичные и расчетные. Если перегонять первичные, то потом придется делать расчет недостающих данных (итоги по периодам), а это тоже очень дофига времени и не факт, что данные будут сходиться в оригинале и копии.

[identity profile] npocmu.livejournal.com 2012-02-01 08:27 am (UTC)(link)
"Перелить гигабайт мелких записей из одной базы в другую занимает прилично времени."

Ну если их програмно читать, затем програмно писать - то да. Но вообще-то есть инструменты в комплекте СУБД по пакетной (bulk) вставке записей. Работают они обычно практически сопоставимо со скоростью записи данных на жесткий диск

[identity profile] serbod.livejournal.com 2012-02-01 09:27 am (UTC)(link)
В данном случае тупое копирование записей из таблицы в таблицу неприменимо.

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

[identity profile] serbod.livejournal.com 2012-02-01 05:35 am (UTC)(link)
Еще такой интересный момент - работа с несколькими базами легко распараллеливается без потерь производительности, за счет того, что базы могут лежать на разных носителях и общая скорость не упирается в iops носителя. =)

[identity profile] npocmu.livejournal.com 2012-02-01 08:14 am (UTC)(link)
Есть такой интересный момент, что работа с несколькими базами ведется только с использованием программной надстройки и программиста при ней.
То есть любой запрос вида "выдать итоги за 10 лет просуммированные по кварталам" превращается в неплохой источник профита для прикладного программиста.

[identity profile] serbod.livejournal.com 2012-02-01 08:57 am (UTC)(link)
Любой новый отчет - источник профита для программиста. Ну не учить же бухов и манагеров строить запросы на SQL.

[identity profile] npocmu.livejournal.com 2012-02-01 09:15 am (UTC)(link)
Ну вообще-то анализировать данные, в то числе и средствами SQL это не работа для программиста. Программист только должен дать инструмент.
Загвоздка вот в чем - в нормально спроектированной БД, с 90% процентов реальных запросов, вполне способен справиться обслуживающий персонал, с применением штатных средств: анализатора/построителя запросов, построителя отчетов и т.д. А вот для хитровывернутых "оптимизированных" БД программист нужен на каждый новый чих.

ЗЫ Если чо, я "кровавый" (ТМ) энтерпрайз имею в виду. Где есть отделы разработки, сопровождения etc.

[identity profile] serbod.livejournal.com 2012-02-01 09:20 am (UTC)(link)
Пойми, нет принципиальной разницы между отчетом для одной базы и тем же самым отчетом, последовательно запущенным на нескольких базах.

[identity profile] npocmu.livejournal.com 2012-02-01 10:48 am (UTC)(link)
Кто запускает отчет "последовательно на нескольких базах"? Кто агрегирует данные "отчета последовательно запущенного на нескольких базах"? Некий говнокод специально привлеченного программиста? Нахрен это надо? На одной базе SQL запрос лепится за пять минут. Если надо красивый отчет в вебе - еще за пять минут он рисутеся в дизайнере отчетов. Вуаля... и никаких ептыть вуду программистов не надо.

[identity profile] serbod.livejournal.com 2012-02-01 11:18 am (UTC)(link)
Если вы считаете, что запустить удаленно обычный отчет с заданными параметрами и забрать результат - это секретное супер-вуду-мейджик, то вам в данной теме делать нечего.

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

[identity profile] npocmu.livejournal.com 2012-02-01 11:30 am (UTC)(link)
Вам слово "агрегирует" знакомо? Или ситуация когда надо выцепить данные сразу по нескольким расчетным периодам и/или нескольким филиалам недопускается априори? Или это будет делать бухгалтер в Экселе?
Я понимаю, конечно, гордость за изобретение "супербазы" на флешке, но пора бы уже из детсадовских штанишек вырастать.
Edited 2012-02-01 11:30 (UTC)

[identity profile] serbod.livejournal.com 2012-02-01 02:59 pm (UTC)(link)
Дяденька, я не настоящий сварщик, таких слов страшных не знаю. Уйди, извращенец, не приставай к ребенку.

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

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

А прочие аналитические отчеты выдергивали данные во временную таблицу, затем эта таблица группировалась и сортировалась, и выводилась в кошерном формате

[identity profile] metaclass.livejournal.com 2012-02-01 12:42 pm (UTC)(link)
SQL-запрос (тем более, прости господи, в построителе запросов) и показ в вебе - это все равно привлекут делать "программиста". Причем, если это будет обычный программист, с языками программирования - это будет еще дешевле, чем консультант к вуду-системе, которая "умеет все из коробки".

[identity profile] npocmu.livejournal.com 2012-02-01 01:23 pm (UTC)(link)
"SQL-запрос (тем более, прости господи, в построителе запросов) и показ в вебе - это все равно привлекут делать "программиста"."

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

(no subject)

[identity profile] serbod.livejournal.com - 2012-02-01 16:48 (UTC) - Expand

(no subject)

[identity profile] npocmu.livejournal.com - 2012-02-01 19:04 (UTC) - Expand

[identity profile] npocmu.livejournal.com 2012-02-01 08:22 am (UTC)(link)
.. да, забыл упомянуть, то что таблицы ОДНОЙ БД могут лежать в разных файлах и на разных носителях, а индексы отдельно, и тоже в разных файлах и на разных носителях - это кагбэ штатная фича всех промышленных СУБД с незапамятных времен.

[identity profile] metaclass.livejournal.com 2012-02-01 08:49 am (UTC)(link)
Кстате, да, партиционирование хитрожопое в таких случаях чрезвычайно спасает.

[identity profile] serbod.livejournal.com 2012-02-01 09:03 am (UTC)(link)
А слабо на ходу поменять конфигурацию хранилищ БД? Мне не слабо, воткнул флешку с базами филиала, и они сразу готовы к работе. Не говоря уж о цене решения. =)

[identity profile] metaclass.livejournal.com 2012-02-01 09:10 am (UTC)(link)
Тяжеловесные БД умеют на ходу менять. Но для этого к ним обязательно должен быть приставлен DBA за много денег, и сами базы тоже за много денег.

[identity profile] serbod.livejournal.com 2012-02-01 09:16 am (UTC)(link)
А еще малейший факап DBA обойдется во столько много денег (и главное - времени), что нормальный DBA на ходу базу дербанить не станет. =)

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

[identity profile] npocmu.livejournal.com 2012-02-01 10:52 am (UTC)(link)
Ну, к тяжеловесным БД DBA идет в нагрузку, по умолчанию :)