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] metaclass.livejournal.com 2012-01-31 05:20 pm (UTC)(link)
Эх, жаль, нету возможности два-три года в продакшене потестировать, да.

[identity profile] inhate.livejournal.com 2012-01-31 05:25 pm (UTC)(link)
Проблемы такого рода могу и без многолетного ожидания предсказывать, экстраполируя опыт.

[identity profile] serbod.livejournal.com 2012-01-31 05:25 pm (UTC)(link)
Хм, тогда непонятен смысл строить систему с нуля под файлы конфигурации заданной формы.

[identity profile] inhate.livejournal.com 2012-01-31 05:26 pm (UTC)(link)
Кстати вариант "на автомате ставит PHP из SVN" ни разу не кошерный.

[identity profile] dmzlj.livejournal.com 2012-01-31 05:29 pm (UTC)(link)
У меня в опердени для каждого репорта еще из sql строится диалог с его параметрами, включая как строки так и выбор из списка (т.е для каждый репорт пишется в табличку, там указано, как зовут репорт и какую функцию надо дернуть для инициализации [список параметров] и для генерации. Ну и какой шаблон наложить на получившуюся xml-шку)

Вся эта байда на движке опердени делается, наверное, за час - два (отпилить все лишнее и автоматизировать деплоймент).

До руби с получасами далеко, конечно, что поделать.
Edited 2012-01-31 17:30 (UTC)

[identity profile] dmzlj.livejournal.com 2012-01-31 05:31 pm (UTC)(link)
JSON будет делать очень весело, когда в репорте нужно получить не прямоугольное соединение пары-тройки таблиц, а иерархическую структуру с независимыми запросами.

[identity profile] dmzlj.livejournal.com 2012-01-31 05:33 pm (UTC)(link)
Хаскел появился. Компилируемый в JS и c FFI в этот самый JS.
Очень скоро качественно упарываться можно будет и на клиенте.

[identity profile] metaclass.livejournal.com 2012-01-31 05:37 pm (UTC)(link)
Ну, условно говоря, у системы есть два вида пользователей: настройщики (ими могут быть и сами разработчики) и пользователи отчетов.
Пользователи объясняют настройщикам, какую отчетность они хотят, настройщики это реализуют на SQL(+возможно, хранимые процедуры) и подключают к этой веб-морде, добавляя запросы в файл конфигурации. Получается расширяемая отчетность, с минимумом телодвижений.
develop7: (Default)

[personal profile] develop7 2012-01-31 05:38 pm (UTC)(link)
понятное дело, что не язык. тысячи веб- и десктопных фреймворков (причём очень желательно как минимум ориентироваться в исходниках), анты/мавены сотоварищи, и прочую обвеску.

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

[identity profile] asvil (from livejournal.com) 2012-01-31 05:39 pm (UTC)(link)
Пока подрастающее поколение клепает компиляторы в свой любимый броузер, лисповый олдскул делает кодогенераторы. Я про parenscript.

[identity profile] alexclear.livejournal.com 2012-01-31 05:39 pm (UTC)(link)
Любую иерархическую структуру можно нарисовать в виде таблицы.
Если хорошо постараться, можно это сделать еще на уровне СУБД.

[identity profile] metaclass.livejournal.com 2012-01-31 05:40 pm (UTC)(link)
Ну вот от них и требуется заготовка под такой движок, как раз задачка на несколько дней.

[identity profile] serbod.livejournal.com 2012-01-31 05:44 pm (UTC)(link)
Это-то понятно, непонятны жесткие требования к формату конфигов, которые только внутри системы используются. Впрочем, хозяин-барин. =)

[identity profile] metaclass.livejournal.com 2012-01-31 05:45 pm (UTC)(link)
Ах ты ж блин, зачем вы мне это напомнили. Я и такое уже делал, как раз в стиле описанной задачи :)

[identity profile] metaclass.livejournal.com 2012-01-31 05:53 pm (UTC)(link)
Это с меня участники вытребовали жесткий формат, я им предлагал придумывать самим, но они решили более зафиксировать условия.

[identity profile] w00dy.livejournal.com 2012-01-31 05:54 pm (UTC)(link)
от работы кони дохнут.

[identity profile] dmzlj.livejournal.com 2012-01-31 05:55 pm (UTC)(link)
postgres xml query

[identity profile] metaclass.livejournal.com 2012-01-31 05:56 pm (UTC)(link)
Много. Но там редко встречаются простые и изолированные задачи, а моск на задаче "интегрировать в уже готовую систему 100501-й вариант учетной политики клиента" потихоньку забывает настоящее программирование.

[identity profile] eternal-leave.livejournal.com 2012-01-31 06:06 pm (UTC)(link)
о! пусть еще сами и деплоят! т.е. артурег например на шапку, айсед на генту, а скиф, как самый лысый, пусть ставит на арч :)

[identity profile] metaclass.livejournal.com 2012-01-31 06:25 pm (UTC)(link)
Эээ, нет. Так просто они не отделаются.

Деплоить будут специально назначенные человеки в лице меня и [livejournal.com profile] kometa_zxc.

[identity profile] sergiej.livejournal.com 2012-01-31 06:35 pm (UTC)(link)
Самое интересное, что на работе задашь им такую задачу - уйдут на месяц курить и через месяц принесут лажу неработающую. А зазашь на "слабо" - забъют на всё и через неделю длиной красоты меряться будут.

[identity profile] inhate.livejournal.com 2012-01-31 06:35 pm (UTC)(link)
Тогда уж для правдоподобности арендуйте эникейщика в НИИГТ

[identity profile] inhate.livejournal.com 2012-01-31 06:37 pm (UTC)(link)
Я люблю свою работу,
Я приду сюда в субботу,
И, конечно, в воскресенье,
Здесь я встречу день рожденья,
Новый год, восьмое марта
Буду я встречать с азартом
Если я не заболею, не сорвусь, не озверею,
Здесь я встречу все рассветы,
Все закаты и приветы.
От работы дохнут кони
Ну а я...БЕССМЕРТНЫЙ ПОНИ!

[identity profile] metaclass.livejournal.com 2012-01-31 06:40 pm (UTC)(link)
Ну если бы именно такое задали, никакой проблемы сделать бы не было, другое дело, что в реальности к этой задаче бы добавился "деплоймент на виндах с доменной аутентификацией юзеров, права доступа к репортам и к данным репорта, аудит отделом безопасности и проч. и проч." :)

Page 4 of 10