Oberon space

General Category => Общий раздел => Тема начата: valexey от Март 24, 2011, 03:11:57 pm

Название: Задачка архитекторная.
Отправлено: valexey от Март 24, 2011, 03:11:57 pm
Нашел на просторах интернетов. Собственно очень было бы интересно посмотеть как эта задачка решается на:
1) Oberon-07 (можно даже M)
2) Oberon-2
3) КП в динамической среде исполнения (в ББ например).

Цитировать
Маленький Эксель
----------------

Необходимо реализовать простую электронную таблицу в виде программы, выполняющейся
из командной строки. Она должна уметь обрабатывать ячейки таблицы как и более
продвинутые аналоги, только с упрощенным синтаксисом выражений. Каждая ячейка
может содержать:
 - Ничего
 - Неотрицательное целое число
 - Текстовые строки, которые начинаются с символа '
 - Строки-выражения, которые начинаются с символа '=' и могут содержать
   неотрицательные целые числа, ссылки на ячейки и простые арифметические
   выражения. Скобки запрещены, у всех операций одинаковый приоритет.
   Ссылки на ячейки состоят из одной латинской буквы и следующей за ней
   цифры.

   Эти ограничения введены для упрощения разбора выражений, поскольку разбор
   выражений не является основной частью проблемы. Вы можете спокойно
   положиться на эти ограничения. Вот грамматика содержимого ячейки:
     expression ::= '=' term {operation term}*
      term ::= cell_reference | nonnegative_number
      cell_reference ::= [A-Za-z][0-9] --
      operation ::= '+' | '-' | '*' | '/'
      text ::= '\\'' {printable_character}

Процесс обработки:
 - Все выражения должны быть заменены на вычисленный результат.
 - Все вычисления выполняются с помощью целочисленной арифметики со знаком.
 - Ячейки с текстом должны быть вычислены как соответствующий текст без
   префикса '.
 - Операции над строками текста запрещены.
 - В случае любой ошибки вычисления формулы, вычисляемая ячейка должна содержать
   слово-сообщение об ошибке, начинающееся с символа '#'. Используйте короткие,
   ясные сообщения. Не надо предоставлять подробности об ошибках в выводе.

Программа должна использовать только стандартные библиотеки и классы и не должна
вызывать сторонние программы, библиотеки или системные компоненты.


Ввод и вывод
------------

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


Выход должен содержать только ожидаемую информацию, включая сообщения об
ошибках, и никакой другой информации в выводе не должно быть, включая и
welcome text. Выход должен быть отформатирован в соответствии с приведенным
ниже примером.

Пример данных:
3            4
12          =C2       3       'Sample
=A1+B1*C1/5 =A2*B1    =B3-C3  'Spread
'Test       =4-3      5       'Sheet

Ожидаемый вывод:
12      -4      3       Sample
4       -16     -4      Spread
Test    1       5       Sheet


Указания по решению
-------------------
Необходимо промышленное качество кода. Более короткое и читаемое решение
предпочтительней. Решение должно содержать тестовые примеры и код, использованные
в процессе создания решения. Не забудьте откомментировать код в ключевых
местах. Код должен быть устойчив к ошибкам.

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

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

С этой задачей в одной конторе не справился ни один из тех, кому ее давали. Точнее, не справился в полном объеме. После более или менее успешного ее решения проводилось интервью. Задача использовалась для выявления потенциальных архитекторов.
Название: Re:Задачка архитекторная.
Отправлено: valexey от Март 24, 2011, 04:15:25 pm
Да, ТЗ задачки такой какой он есть. Уточняющие вопросы задавать не разрешается. Разрешается только сразу выдать ответ.
Название: Re:Задачка архитекторная.
Отправлено: valexey от Март 24, 2011, 04:27:14 pm
Да, времени на задачку давалось 2-3 дня (это давалось на дом, до собеседования). Впереди как раз выходные, условия у всех участников сего форума в точности те же (или лучше) нежели у тех кто был пред собеседованием.
Название: Re:Задачка архитекторная.
Отправлено: valexey от Март 24, 2011, 05:07:45 pm
кстати, вот этот пункт:
Цитировать
Программа должна использовать только стандартные библиотеки и классы и не должна
вызывать сторонние программы, библиотеки или системные компоненты.
Применительно к оберонам можно и обсудить. Потому как если руководствоваться только language report'ами, то там и Hello World не написать.
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 24, 2011, 06:55:09 pm
Ну вот моё решение: [тут покопался злобный валексей и скрыл ссылку до понедельника, жалобы принимаются]
Я справился с задачей со сверхсветовой скоростью, за -3.5 года )))
Название: Re:Задачка архитекторная.
Отправлено: valexey от Март 24, 2011, 07:44:39 pm
Ссылку скрыл, дабы народ не отвлекался на изучение чужих решений (ибо это больно уж затягивающее занятие) а написал что-нибудь своё. Хочется таки хоть одно решение на каком-нибудь Обероне.

Если geniepro возразит супротив такой меры, то моментально все верну взад. Ну, или если народ массово против вдруг будет.
Название: Re:Задачка архитекторная.
Отправлено: valexey от Март 24, 2011, 08:26:09 pm
В общем, относительно стандартных либ, я считаю так: стандартное все, что идет искаробки с выбранным компиятором/средой. Нестандартные сборки в рассчет не берутся.

То есть, если это BB, то пользоваться можно всем тем, что идет в наборе от Оминков.
Если это XDS, то пользоваться тем, что идет с ним искаропки.
Если это Oberon-07M.. Ну, похоже тут и выбора то не остается :-) Единственное но -- желательно таки в логике программы не использовать что-то WinAPI'шно-привязанное. (кроме всего прочего, решение данной задачки может и должно послужить толчком к созданию на Оберон-07М стандартной библиотеки).
Название: Re:Задачка архитекторная.
Отправлено: valexey от Март 24, 2011, 08:26:58 pm
Хотя, конечно, Оберон-2 можно было бы ограничить библиотекой из Дубовых Требований.
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 24, 2011, 10:30:20 pm
Если geniepro возразит супротив такой меры, то моментально все верну взад. Ну, или если народ массово против вдруг будет.
Да я-то до понедельника потерплю, чо уж там ))

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

То есть, если это BB, то пользоваться можно всем тем, что идет в наборе от Оминков.
Если это XDS, то пользоваться тем, что идет с ним искаропки.
То есть учебную сборку от инфо21 юзать низзя? ))
А Haskell Platform годится? Ибо он рекомендуемой производителем сборкой является и стандарт де-факто...
Название: Re:Задачка архитекторная.
Отправлено: valexey от Март 24, 2011, 10:45:14 pm
То есть учебную сборку от инфо21 юзать низзя? ))
Ни в коем ни в случае! :-)
А Haskell Platform годится? Ибо он рекомендуемой производителем сборкой является и стандарт де-факто...
А это надо подумать. Потому как, в отличае от Оберонов, у хаскеля таки есть стандартная библиотека вполне достаточная для данной задачи. Наверно так -- если получилось обойтись тем и только тем, что есть в описании стандарта (haskell 2010, кстати), то отлично. если вылезли во вне и заюзали что-то нестандартное (в плане библиотек) из Haskell Platform, то это не серьезная ошибка дизайна, при условии, что оно реализовано не только в ghc, и серьезная (но не фатальная), если есть только в ghc.
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 24, 2011, 10:49:24 pm
А это надо подумать. Потому как, в отличае от Оберонов, у хаскеля таки есть стандартная библиотека вполне достаточная для данной задачи. Наверно так -- если получилось обойтись тем и только тем, что есть в описании стандарта (haskell 2010, кстати), то отлично. если вылезли во вне и заюзали что-то нестандартное (в плане библиотек) из Haskell Platform, то это не серьезная ошибка дизайна, при условии, что оно реализовано не только в ghc, и серьезная (но не фатальная), если есть только в ghc.
Так кроме GHC других промышленных трансляторов у Хаскелла нет, а Haskell Platform -- его рекомендуемая сборка.
Название: Re:Задачка архитекторная.
Отправлено: valexey от Март 24, 2011, 10:59:29 pm
А это надо подумать. Потому как, в отличае от Оберонов, у хаскеля таки есть стандартная библиотека вполне достаточная для данной задачи. Наверно так -- если получилось обойтись тем и только тем, что есть в описании стандарта (haskell 2010, кстати), то отлично. если вылезли во вне и заюзали что-то нестандартное (в плане библиотек) из Haskell Platform, то это не серьезная ошибка дизайна, при условии, что оно реализовано не только в ghc, и серьезная (но не фатальная), если есть только в ghc.
Так кроме GHC других промышленных трансляторов у Хаскелла нет, а Haskell Platform -- его рекомендуемая сборка.
Ну, про промышленность ghc я бы таки промолчал (ну недотягивает оно до промышенных стандартов в плане стабильности и обратной совместимости, чуточку, но не дотягивает пока). Но вот ведь есть же еще и (Win)Hugs! Вполне популярная реализация haskell'я. Да, в ынтырпрайз оно возможно не пойдет как база, но вот для экспериментов, для разработки, проверки и так далее -- вполне. Оно простое и там цикл разработки быстрее чем на ghci. Оно много более легковесное. Оно дружелюбное. И да, оно умеет часть из того, что умеет и ghc, например монаду ST.
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 24, 2011, 11:16:01 pm
Ну, про промышленность ghc я бы таки промолчал (ну недотягивает оно до промышенных стандартов в плане стабильности и обратной совместимости, чуточку, но не дотягивает пока).
Однако GHC используется во вполне серьёзных промышленных проектах. Альтернативы в общме-то ему нет.

Но вот ведь есть же еще и (Win)Hugs! Вполне популярная реализация haskell'я. Да, в ынтырпрайз оно возможно не пойдет как база, но вот для экспериментов, для разработки, проверки и так далее -- вполне. Оно простое и там цикл разработки быстрее чем на ghci. Оно много более легковесное. Оно дружелюбное. И да, оно умеет часть из того, что умеет и ghc, например монаду ST.
Ага, вот только этот самый ST реализован в HUGS по другому, чем в GHC, поэтому библиотека работы с графами не компилируется в HUGS...
Да и как Вы организуете ввод/вывод из консоли в WinHUGS, скажите на милость...  ;D
Из нескольких моих решений этой задачи лишь одно запустилось в хугсе, но оно не может правильно обработать циклы в формулах -- выпадает в осадок с переполнением стека...
Название: Re:Задачка архитекторная.
Отправлено: valexey от Март 24, 2011, 11:24:19 pm
Ну, это я с удовольствием разберу все позжее. Возможно твое решение будет наилучшим просто вследствие отсутствия конкурентов :-)
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 24, 2011, 11:31:24 pm
Но вот ведь есть же еще и (Win)Hugs! Вполне популярная реализация haskell'я. Да, в ынтырпрайз оно возможно не пойдет как база, но вот для экспериментов, для разработки, проверки и так далее -- вполне. Оно простое и там цикл разработки быстрее чем на ghci.
Кстати, вот я так до сих пор и не осилил разработку в стиле REPL. С редактором текста и компилятором мне как-то проще. В Хугсе если и запускаю программу, то чисто что бы проверить, есть ли ошибки, и если нет, и алгоритм достаточно быстрый, то что бы тут же протестировать. Но это мало отличается от цикла разработки с компилятором, потому что REPL хугса я очень редко использую.
Да и в GHC есть репл -- GHСi...
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 24, 2011, 11:38:16 pm
В качестве теста для программы предложу ещё такой файл:

Input:
[тестовый файл погрыз смусмумрик, благо его все равно никто не обсуждал]

Output
[output загрыз сурок, и инпут и аутпут воскреснут после воскресенья]
Название: Re:Задачка архитекторная.
Отправлено: AlexIljin от Март 25, 2011, 05:36:53 am
     expression ::= '=' term {operation term}*
      cell_reference ::= [A-Za-z][0-9] --
      text ::= '\\'' {printable_character}
Что означает звёздочка в конце expression?
Что означают два минуса в конце cell_reference?
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 25, 2011, 05:59:47 am
     expression ::= '=' term {operation term}*
      cell_reference ::= [A-Za-z][0-9] --
      text ::= '\\'' {printable_character}
Что означает звёздочка в конце expression?
* в данной грамматике видимо означает необязательность элемента.
Примеры expression:
=A1
=A1+B1
=A1+B1*C1/5

Что означают два минуса в конце cell_reference?
Непонятно. Видимо, ошибка копипаста. Возможно, там раньше был комментарий.
Валидные примеры cell_reference:
A1
B2
C3
Zz99
и т.д.

PS. Кстати, эта задача была тестом не просто на построение хорошей архитектуры программы, а на её построение в условиях неточностей в ТЗ -- это частая ситуация в промышленности. Типа -- в неясных случаях надо догадаться и действовать сообразно здравому смыслу и принятых практик.
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 25, 2011, 06:07:07 am
PS. Кстати, эта задача была тестом не просто на построение хорошей архитектуры программы, а на её построение в условиях неточностей в ТЗ -- это частая ситуация в промышленности. Типа -- в неясных случаях надо догадаться и действовать сообразно здравому смыслу и принятых практик.
Хотя, возможно, это я уже сейчас нафантазировал... ;D
Название: Re:Задачка архитекторная.
Отправлено: AlexIljin от Март 25, 2011, 06:15:17 am
     expression ::= '=' term {operation term}*
      cell_reference ::= [A-Za-z][0-9] --
      text ::= '\\'' {printable_character}
Что означает звёздочка в конце expression?
* в данной грамматике видимо означает необязательность элемента.
Тогда звёздочка должна быть и в text, не так ли?

Валидные примеры cell_reference:
Zz99
Последнее не является валидным. В условиях оговорено, что только одна буква и одна цифра, и cell_reference это отражает (если убрать минусы).
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 25, 2011, 06:35:57 am
     expression ::= '=' term {operation term}*
      cell_reference ::= [A-Za-z][0-9] --
      text ::= '\\'' {printable_character}
Что означает звёздочка в конце expression?
* в данной грамматике видимо означает необязательность элемента.
Тогда звёздочка должна быть и в text, не так ли?
Нет, не так. Элемент в фигурных скобках повторяется 1 или более раз. Текст должен содержать хотя бы один символ.
Всё верно.
Валидные примеры cell_reference:
Zz99
Последнее не является валидным. В условиях оговорено, что только одна буква и одна цифра, и cell_reference это отражает (если убрать минусы).
Да, точно, это уже я нафантазировал. Я давно решал эту задачку, уже подзабыл ))
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 25, 2011, 06:42:56 am
Кстати, Гапертон (автор задачи) вспоминал, что корни этой задачи идут из книги Барбары Лисков про язык CLU "Abstraction and specification in programm development, 1986" ("Использование абстракций и спецификаций при разработке программ", Лисков Б., Гатэг Дж.)
Там была похожая задача, расчитанная на семестр для группы из нескольких студентов. но там требовалось ещё и интерактивный интерфейс пользователя сделать (текстовый, типа как в SuperCalc)...
Название: Re:Задачка архитекторная.
Отправлено: AlexIljin от Март 25, 2011, 06:53:25 am
Выходит, что text должен иметь хотя бы один символ, иначе ошибка? Странно.
Название: Re:Задачка архитекторная.
Отправлено: igor от Март 25, 2011, 07:09:28 am
Что означает звёздочка в конце expression?
"Иные" используют собственную нотацию, которая эквивалентна РБНФ.
Описание, если не ошибаюсь, можно посмотреть в Книге Дракона.
(Для них главное, чтобы было не как у Вирта  :))
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 25, 2011, 07:32:16 am
Выходит, что text должен иметь хотя бы один символ, иначе ошибка? Странно.
Почему странно? Пустая строка -- это пустая ячейка, значит текстовая строка должна быть непустой, раз её специально помечают кавычкой.
Название: Re:Задачка архитекторная.
Отправлено: AlexIljin от Март 25, 2011, 08:07:32 am
Выходит, что text должен иметь хотя бы один символ, иначе ошибка? Странно.
Почему странно? Пустая строка -- это пустая ячейка, значит текстовая строка должна быть непустой, раз её специально помечают кавычкой.
Я бы не стал смешивать пустую строку и пустую ячейку. Если мы потом добавляем выражения со строками, то при ссылке на пустую ячейку лучше получить ошибку "нет значения", чем считать её пустой строкой.
Название: Re:Задачка архитекторная.
Отправлено: AlexIljin от Март 25, 2011, 08:09:10 am
Что означает звёздочка в конце expression?
"Иные" используют собственную нотацию, которая эквивалентна РБНФ.
Описание, если не ошибаюсь, можно посмотреть в Книге Дракона.
(Для них главное, чтобы было не как у Вирта  :))
Я так понимаю, там зачем-то использованы регулярные выражения вместо обычного РБНФ'а.
Название: Re:Задачка архитекторная.
Отправлено: valexey от Март 25, 2011, 08:19:07 am
Я так понимаю, там зачем-то использованы регулярные выражения вместо обычного РБНФ'а.
Да нет же. Описание дадено в обычном виде, в виде описания грамматики для бизона. Оно эквивалентно РБНФ.
Название: Re:Задачка архитекторная.
Отправлено: valexey от Март 25, 2011, 08:51:46 am
Хотя я похоже не прав, это не бизоново описание грамматики. Но что-то очень-очень мне знакомое. По моему, Сишная грамматика (и оттуда С++, ява, C#) так же описана. Если мне эклер не изменяет, то оно было эквивалентно БНФ, но судя по звездочкам её таки проапгрейдили до РБНФ.
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 25, 2011, 11:56:06 am
Я бы не стал смешивать пустую строку и пустую ячейку. Если мы потом добавляем выражения со строками, то при ссылке на пустую ячейку лучше получить ошибку "нет значения", чем считать её пустой строкой.
Возьмём "взрослую" электронную таблицу, например Эксель. Он пустые ячейки считает заполненными нулями в арифметических выражениях и пустыми строками в строковых выражениях.
Название: Re:Задачка архитекторная.
Отправлено: valexey от Март 25, 2011, 12:13:34 pm
Это уже вопрос архитектуры, кстати. По сути имеем дилемму – строгая у нас будет типизация, или же не строгая.
Название: Re:Задачка архитекторная.
Отправлено: AlexIljin от Март 26, 2011, 08:30:08 pm
Это уже вопрос архитектуры, кстати. По сути имеем дилемму – строгая у нас будет типизация, или же не строгая.
Я решил сделать строгую типизацию (строгость снимается тривиально, а вот добавить туда, где её не было изначально, сложнее). Язык - XDS Oberon-2, используемые модули In и Out - "дубовые" (можно и на WinApi-консоль перейти, это не сложно).
Название: Re:Задачка архитекторная.
Отправлено: AlexIljin от Март 26, 2011, 08:40:33 pm
Теперь можно и на чужие решения поглядеть. : )
Название: Re:Задачка архитекторная.
Отправлено: valexey от Март 26, 2011, 08:43:34 pm
Теперь можно и на чужие решения поглядеть. : )
А до понедельника потерпишь? Впрочем, я могу в личку дать ссыль.
Название: Re:Задачка архитекторная.
Отправлено: valexey от Март 26, 2011, 08:45:35 pm
Ссыль уехала в личку.
Ждем кого-нибудь еще :-) Я кстати, тоже думаю попробовать.  В чужие решения я не смотрел, там страшно :-)
Название: Re:Задачка архитекторная.
Отправлено: Илья Ермаков от Март 26, 2011, 09:36:53 pm
Не публикуйте пока. Будет ишшо пример, на КП :)
Название: Re:Задачка архитекторная.
Отправлено: valexey от Март 26, 2011, 09:37:54 pm
Угу. Жду как минимум понедельника (вечера понедельника, утром обычно мне хочется на работу, и я больше ни о чем думать не могу :-) ).

По запросу могу и ещё резину потянуть :-)
Название: Re:Задачка архитекторная.
Отправлено: AlexIljin от Март 26, 2011, 09:56:23 pm
Добавлены и поправлены комментарии, плюс исправлена константа MaxHeight в процедуре LoadTable.
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 26, 2011, 10:24:37 pm
Добавлены и поправлены комментарии, плюс исправлена константа MaxHeight в процедуре LoadTable.
Мда, программа на обероне-2 внушаит -- 383 locs.
Мои два решения имеют 118 locs (первое) и 180 locs (с проверкой циклов в формулах)
Название: Re:Задачка архитекторная.
Отправлено: valexey от Март 26, 2011, 10:39:56 pm
А если в лексемах подсчитать? :-)
Название: Re:Задачка архитекторная.
Отправлено: AlexIljin от Март 26, 2011, 10:58:38 pm
Мда, программа на обероне-2 внушаит -- 383 locs.
Я 380 насчитал.
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 26, 2011, 11:00:20 pm
В лексемах слабо. Решил сравнить в размере конкретно кода, сжатого zip-ом.
Все комментарии и пустые строки выкинул, естественно. Выравнивание кода сохранил.
Оберон-2 вариант:     zip: 2565 байт, распакованный вид: 10362 байт
Haskell, 1-й вариант: zip: 1591 байт, распакованный вид:  4821 байт
Haskell, 2-й вариант: zip: 2189 байт, распакованный вид:  7795 байт
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 26, 2011, 11:01:54 pm
Мда, программа на обероне-2 внушаит -- 383 locs.
Я 380 насчитал.
Да, я позже пересчитал строки, тоже 380 вышло, но поправить пост уже не смог. ((
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 26, 2011, 11:04:32 pm
В лексемах слабо. Решил сравнить в размере конкретно кода, сжатого zip-ом.
Все комментарии и пустые строки выкинул, естественно. Выравнивание кода сохранил.
Оберон-2 вариант:     zip: 2565 байт, распакованный вид: 10362 байт
Haskell, 1-й вариант: zip: 1591 байт, распакованный вид:  4821 байт
Haskell, 2-й вариант: zip: 2189 байт, распакованный вид:  7795 байт
Ну, в общем-то это и на глаз заметно, что строки на хаскелле заметно длиннее, чем на обероне или сях. Это тоже влияет на их количество...
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 26, 2011, 11:19:24 pm
Ну, в общем-то это и на глаз заметно, что строки на хаскелле заметно длиннее, чем на обероне или сях. Это тоже влияет на их количество...

Решил уточнить средние длины строк решений (без комментариев и прочего ненужного).
На Хаскелле вышло 39 и 41 символов, на обероне-2 25 символов ;)
Название: Re:Задачка архитекторная.
Отправлено: valexey от Март 26, 2011, 11:21:26 pm
Угу. Интересны также коэффициенты сжатия:

Цитировать
Oberon-2  10362   2565    4.0397660819
Haskell 1 4821    1591    3.0301697046
Haskell 2 7795    2189    3.5609867519

Отсюда делаем вывод, что программа на хаскеле ближе к белому шуму, ну или к содержимому /dev/random, нежели код на Обероне :-)
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 26, 2011, 11:23:22 pm
В лексемах слабо. Решил сравнить в размере конкретно кода, сжатого zip-ом.
Все комментарии и пустые строки выкинул, естественно. Выравнивание кода сохранил.
Оберон-2 вариант:     zip: 2565 байт, распакованный вид: 10362 байт
Haskell, 1-й вариант: zip: 1591 байт, распакованный вид:  4821 байт
Haskell, 2-й вариант: zip: 2189 байт, распакованный вид:  7795 байт

Уточнение (три коммента пропустил):
Оберон-2 вариант:     zip: 2544 байт, распакованный вид: 10311 байт
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 26, 2011, 11:59:49 pm
Самое ТруЪ-решение Задачи-К -- это решение на языке К от самого Трурля:
O:"+-*/"; o:(+;-;*;_%)
split:{(&x _in\\: y)_ x}
mkr:{:[(x<W)&(y<H);"ref[",($y),";",($x),"]";`badref]}
mkv:{x}
mka:{:[x _sm "[a-z][0-9]"; mkr[(_ic*x)-97; (_ic x[1])-49]
       x _sm "[A-Z][0-9]"; mkr[(_ic*x)-65; (_ic x[1])-49]
       x _sm "[0-9]*"; mkv[x]; `err]}
mkf:{t:split["+",1_ x;O]; `form, +{(o[O?*x]; mka[1_ x])}'t}
parse: {:[x~"";`; *x _sm "[0-9]*"; 0$x;(*x)="'"; 1_ x; (*x)="="; mkf[x]; `err]}
read:{in: {1_'split["\\t",x;,"\\t"]}'0: x; wh:0$*in; W::wh[0]; H::wh[1]; S::parse''1 _ in}
show:{x 0:{x,"\\n",y}/{x,"\\t",y}/'$S}
ref:{if[~4:S[x;y]; force[x;y]]; S[x;y]}
force:{t:S[x;y]; if[`eval~*t; S[x;y]:`cycle]; if[`form~*t; S[x;y;0]:`eval; S[x;y]:eval[t]]}
apply:{y[x;z]}
eval:{a: .:'x[2];:[&/1={4:x}'a; apply/[0;x[1];a]; `err]}

read[`in];(!W)force'\\:!H;show[`out]

Метрика: 16 locs, 47 симв/стр, в сжатом виде 570 байта, в распакованном 782 байт, коэф. сжатия 1.372
Название: Re:Задачка архитекторная.
Отправлено: AlexIljin от Март 27, 2011, 12:54:23 pm
Самое ТруЪ-решение Задачи-К -- это решение на языке К от самого Трурля:
А что, он - первоначальный автор задания?
Ещё вопрос, в каких отношениях находятся языки K и Q?
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 27, 2011, 01:16:14 pm
Самое ТруЪ-решение Задачи-К -- это решение на языке К от самого Трурля:
А что, он - первоначальный автор задания?
Автор задания -- Влад Балин aka Gaperton, который сделал своё решение на Эрланге, обосновав это тем, что все другие языки он давно забыл, а Эрланг настолько прост, что забыть его невозможно.

А ТруЪ-решение -- ну ведь логично, что задача К должна быть решена на языке К. :о)

Ещё вопрос, в каких отношениях находятся языки K и Q?
http://en.wikipedia.org/wiki/Q_(programming_language_from_Kx_Systems)

Как я понял, Q -- более читабельная обёртка над K, используемая для запросов к базе данных KDB...
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 27, 2011, 01:26:57 pm
Ещё вопрос, в каких отношениях находятся языки K и Q?
http://en.wikipedia.org/wiki/Q_(programming_language_from_Kx_Systems)

Как я понял, Q -- более читабельная обёртка над K, используемая для запросов к базе данных KDB...

Хотя есть ещё вот такой язык Q -- это совсем уже другое, больше на Хаскелл смахивающее...
http://q-lang.sourceforge.net/
Название: Re:Задачка архитекторная.
Отправлено: белый шум от Март 27, 2011, 01:57:43 pm
Добавлены и поправлены комментарии, плюс исправлена константа MaxHeight в процедуре LoadTable.
оно даже в ББ откомпилялось
Название: Re:Задачка архитекторная.
Отправлено: AlexIljin от Март 27, 2011, 07:14:12 pm
Как я понял, Q -- более читабельная обёртка над K, используемая для запросов к базе данных KDB...
Моя первая программа на языке q: преобразует положительное целое число в последовательность символов (запись числа).
q)x:18873; L:"012345679"; res:""; while[x>0; res:res,L[x mod 10]; x:x div 10]; reverse res
"18873"
Не знаю, как векторизовать без while : (
Подскажите, как улучшить решение!
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 27, 2011, 07:21:55 pm
Как я понял, Q -- более читабельная обёртка над K, используемая для запросов к базе данных KDB...
Моя первая программа на языке q: преобразует положительное целое число в последовательность символов (запись числа).
q)x:18873; L:"012345679"; res:""; while[x>0; res:res,L[x mod 10]; x:x div 10]; reverse res
"18873"
Не знаю, как векторизовать без while : (
Подскажите, как улучшить решение!
Я не знаток этих брейнфаков, так что я пас... ;D
Название: Re:Задачка архитекторная.
Отправлено: AlexIljin от Март 27, 2011, 07:32:46 pm
Я не знаток этих брейнфаков, так что я пас... ;D
А можно аналог на Хаскеле?
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 27, 2011, 07:57:54 pm
Простейший вариант:
int'to'str :: Integer -> String
int'to'str n = show n
Но это не по-джедайски. Так что вот:
import Char

int'to'str :: Integer -> String
int'to'str 0 = ""
int'to'str n = int'to'str (n `div` 10) ++ [chr $ fromIntegral (n `mod` 10 + fromIntegral(ord '0'))]
Более эффективный на огромных числах вариант:
import Char

int'to'str :: Integer -> String
int'to'str n = i2s n ""
  where
    i2s 0 ss = ss
    i2s n ss = i2s (n `div` 10) ((chr $ fromIntegral (n `mod` 10 + fromIntegral(ord '0'))):ss)
Название: Re:Задачка архитекторная.
Отправлено: AlexIljin от Март 27, 2011, 08:03:40 pm
Простейший вариант:
int'to'str :: Int -> String
int'to'str n = show n
Но это не по-джедайски.
Да, там тоже есть, я только что дочитал:q)string 18873
"18873"
Так что вот:
import Char

int'to'str :: Int -> String
int'to'str 0 = ""
int'to'str n = int'to'str (n `div` 10) ++ [chr (n `mod` 10 + ord '0')]
Ага, рекурсия. Точно, что это я сразу не подумал?
Спасибо.
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 27, 2011, 08:09:16 pm
Ага, рекурсия. Точно, что это я сразу не подумал?
Спасибо.
Императивное мышление вынуждает думать циклами, а не рекурсиями ))

to iterate is human, to recure divine...
 ;D
Название: Re:Задачка архитекторная.
Отправлено: Илья Ермаков от Март 27, 2011, 08:46:40 pm
Практически готовое решение по этой задаче задепонировано Алексею. Опубликую, только когда напишу полную пояснительную статью. Через день-два, думаю.

Объём - 9 модулей, 713 строк (будет под 800, надо думать).
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 27, 2011, 08:58:59 pm
Объём - 9 модулей, 713 строк (будет под 800, надо думать).
Чувствуется, что подход очень серьёзный  ;D
Название: Re:Задачка архитекторная.
Отправлено: valexey от Март 27, 2011, 09:03:34 pm
Действительно чувствуется. Серьезно.

Через пару дней сяду, проанализирую. Ну или сразу статью зачту как появится :-)
Название: Re:Задачка архитекторная.
Отправлено: vlad от Март 28, 2011, 02:59:36 am
Действительно чувствуется. Серьезно.

Через пару дней сяду, проанализирую. Ну или сразу статью зачту как появится :-)

Будет решение на С++. Минимальное. Попробую выкроить время до вторника.
Название: Re:Задачка архитекторная.
Отправлено: valexey от Март 28, 2011, 07:36:31 am
Будет решение на С++. Минимальное. Попробую выкроить время до вторника.
OK. Подождем.
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 28, 2011, 09:59:48 am
Было бы любопытно сделать такую таблицу, расчёт которой занял бы ощутимое время -- интересно было бы сравнить разные варианты решений на скорость вычислений.
Но таблица размером 26*9 не очень способствует таким замерам. Вот если расширить язык этой таблицы, введя возможность вычисления формул -- было бы прикольно...
Название: Re:Задачка архитекторная.
Отправлено: AlexIljin от Март 28, 2011, 11:55:21 am
Было бы любопытно сделать такую таблицу, расчёт которой занял бы ощутимое время -- интересно было бы сравнить разные варианты решений на скорость вычислений.
Но таблица размером 26*9 не очень способствует таким замерам. Вот если расширить язык этой таблицы, введя возможность вычисления формул -- было бы прикольно...

Длину формулы, вроде, не ограничивали... : ))
Название: Re:Задачка архитекторная.
Отправлено: AlexIljin от Март 28, 2011, 03:56:20 pm
Вот если расширить язык этой таблицы, введя возможность вычисления формул -- было бы прикольно...

Хотите сказать, что в вашем решении формулы не вычисляются?
Это заставляет посмотреть на приведённые метрики с новой стороны ; )))
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 28, 2011, 04:01:33 pm
Вот если расширить язык этой таблицы, введя возможность вычисления формул -- было бы прикольно...

Хотите сказать, что в вашем решении формулы не вычисляются?
Это заставляет посмотреть на приведённые метрики с новой стороны ; )))
Да описАлся я там -- имел в виду введение пользовательских функций ))
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 28, 2011, 04:40:26 pm
Это заставляет посмотреть на приведённые метрики с новой стороны ; )))
Александр, а слабо переделать программу на разумно-модульный вид? Собственно, этого автор задачи и ожидал в качестве хорошего решения -- декомпозиция программы, удобная для развития в будущем.
И вапще прикольная тоже задачка ))
Название: Re:Задачка архитекторная.
Отправлено: AlexIljin от Март 28, 2011, 05:48:48 pm
Александр, а слабо переделать программу на разумно-модульный вид? Собственно, этого автор задачи и ожидал в качестве хорошего решения -- декомпозиция программы, удобная для развития в будущем.
Слабо, конечно. Я считаю, что процедурная декомпозиция вполне адекватна задаче. Все точки расширения вполне обозримы. Добавить строковые операции? Ищем errStringOp, добавляем нужную константу для operation. Огромные таблицы? Правим загрузку и дереференс ячейки. Избавиться от рекурсии в интерпретации выражений? Поле marked из BOOLEAN превращаем в INTEGER.
Чего тут в модулях прятать-то? Ввод и вывод и так нормально спрятаны в In и Out.
Нет, ну можно, конечно, разбить, чтобы подчеркнуть независимость ввода от расчёта и расчёта от вывода, но надо ли?
Ещё можно уменьшить требования к памяти, вычисляя простые формулы сразу при загрузке, как это сделано для целых чисел и строк. Поможет ли в этом разбиение на модули? Вряд ли.

В общем, на мой взгляд, дополнительные модули не нужны, по крайней мере пока не перевалили за 1000 строк. Посмотрим, что за учебный пример будет у Ильи. Надеюсь, он в моё решение не подглядывал : ))
Название: Re:Задачка архитекторная.
Отправлено: Илья Ермаков от Март 28, 2011, 06:12:21 pm
По поводу большой таблицы и вычислений - представьте себе какую-нибудь инкрементальную колоночку в табличке с миллионами строк. Т.е. каждая ячейка ссылается на предыдущую + 1... Хм, только в текущем языке формул нет относительного синтаксиса.
Название: Re:Задачка архитекторная.
Отправлено: AlexIljin от Март 28, 2011, 07:14:52 pm
По поводу большой таблицы и вычислений - представьте себе какую-нибудь инкрементальную колоночку в табличке с миллионами строк. Т.е. каждая ячейка ссылается на предыдущую + 1... Хм, только в текущем языке формул нет относительного синтаксиса.

Представил и без относительного синтаксиса. Что дальше? В смысле, я не понял, на что намёк?
Если это вы про рекурсивное вычисление, так ведь я решал задачу первого этапа. А про второй этап - подумал и прикинул необходимые изменения: исправить тип поля ExpressionCell.marked и добавить цикл.
Как и было в задании. : )
При таблице 26*9 максимальная глубина рекурсии = 243, а это чуть более 16Кб стэка для моего кода.

Кстати, если кому для тестов надо, вот таблица:9    26
=B1+1   =C1+1   =D1+1   =E1+1   =F1+1   =G1+1   =H1+1   =I1+1   =J1+1   =K1+1   =L1+1   =M1+1   =N1+1   =O1+1   =P1+1   =Q1+1   =R1+1   =S1+1   =T1+1   =U1+1   =V1+1   =W1+1   =X1+1   =Y1+1   =Z1+1   =A2+1
=B2+1    =C2+1   =D2+1   =E2+1   =F2+1   =G2+1   =H2+1   =I2+1   =J2+1   =K2+1   =L2+1   =M2+1   =N2+1   =O2+1   =P2+1   =Q2+1   =R2+1   =S2+1   =T2+1   =U2+1   =V2+1   =W2+1   =X2+1   =Y2+1   =Z2+1   =A3+1
=B3+1    =C3+1   =D3+1   =E3+1   =F3+1   =G3+1   =H3+1   =I3+1   =J3+1   =K3+1   =L3+1   =M3+1   =N3+1   =O3+1   =P3+1   =Q3+1   =R3+1   =S3+1   =T3+1   =U3+1   =V3+1   =W3+1   =X3+1   =Y3+1   =Z3+1   =A4+1
=B4+1    =C4+1   =D4+1   =E4+1   =F4+1   =G4+1   =H4+1   =I4+1   =J4+1   =K4+1   =L4+1   =M4+1   =N4+1   =O4+1   =P4+1   =Q4+1   =R4+1   =S4+1   =T4+1   =U4+1   =V4+1   =W4+1   =X4+1   =Y4+1   =Z4+1   =A5+1
=B5+1    =C5+1   =D5+1   =E5+1   =F5+1   =G5+1   =H5+1   =I5+1   =J5+1   =K5+1   =L5+1   =M5+1   =N5+1   =O5+1   =P5+1   =Q5+1   =R5+1   =S5+1   =T5+1   =U5+1   =V5+1   =W5+1   =X5+1   =Y5+1   =Z5+1   =A6+1
=B6+1    =C6+1   =D6+1   =E6+1   =F6+1   =G6+1   =H6+1   =I6+1   =J6+1   =K6+1   =L6+1   =M6+1   =N6+1   =O6+1   =P6+1   =Q6+1   =R6+1   =S6+1   =T6+1   =U6+1   =V6+1   =W6+1   =X6+1   =Y6+1   =Z6+1   =A7+1
=B7+1    =C7+1   =D7+1   =E7+1   =F7+1   =G7+1   =H7+1   =I7+1   =J7+1   =K7+1   =L7+1   =M7+1   =N7+1   =O7+1   =P7+1   =Q7+1   =R7+1   =S7+1   =T7+1   =U7+1   =V7+1   =W7+1   =X7+1   =Y7+1   =Z7+1   =A8+1
=B8+1    =C8+1   =D8+1   =E8+1   =F8+1   =G8+1   =H8+1   =I8+1   =J8+1   =K8+1   =L8+1   =M8+1   =N8+1   =O8+1   =P8+1   =Q8+1   =R8+1   =S8+1   =T8+1   =U8+1   =V8+1   =W8+1   =X8+1   =Y8+1   =Z8+1   =A9+1
=B9+1    =C9+1   =D9+1   =E9+1   =F9+1   =G9+1   =H9+1   =I9+1   =J9+1   =K9+1   =L9+1   =M9+1   =N9+1   =O9+1   =P9+1   =Q9+1   =R9+1   =S9+1   =T9+1   =U9+1   =V9+1   =W9+1   =X9+1   =Y9+1   =Z9+1   =1
Название: Re:Задачка архитекторная.
Отправлено: vlad от Март 28, 2011, 07:29:43 pm
Долгожданный С++ вариант :) 530 строк - самый жрный вариант, как я понимаю. Код включает все тесты, которые использовались по ходу.

Комментарии, которые возникли по ходу решения:
1. Стандартной библиотеки явно недостаточно даже для таких простых задач. C boost'ом было бы намного приятнее. Еще приятнее со своими повседневными наработками (ненулевыее указатели, например).
2. Следствие пункта 1 - непривычная головная боль и пляски с динамическими объектами (std::auto_ptr категорически недостаточно).
3. Следствие пукта 1 - пришлось писать циклы и обходится без любимых функциональный штучек (замыканий). Тоже непривычно, неудобно, многословно.
4. Код минималистичный и с минимумом диагностики, но с требуемой возможностью минимального расширения.
5. Никакой оптимизации, дубовое решение, но которое можно точить.
Название: Re:Задачка архитекторная.
Отправлено: vlad от Март 28, 2011, 07:31:16 pm
Кстати, если кому для тестов надо, вот таблица:

Спасибо, passed :)
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 28, 2011, 07:55:39 pm
При таблице 26*9 максимальная глубина рекурсии = 243, а это чуть более 16Кб стэка для моего кода.

Кстати, если кому для тестов надо, вот таблица:

Интересная попытка, но увы! Слишком мало расчётов, пролетает мгновенно, надо что-то покруче...
Да, и 26*9 = 234 всё-таки...
Название: Re:Задачка архитекторная.
Отправлено: AlexIljin от Март 28, 2011, 08:03:58 pm
Долгожданный С++ вариант :) 530 строк - самый жрный вариант, как я понимаю.

Удалил пустые строки, удалил namespace Test, в объявлении функций тип результата поставил на одну строку с именем функции, и осталось 383 строки. Практически совпадает с моим вариантом на XDS Oberon-2 (380 строк).

Не совсем понятно, правда, почему exe-файл 388Кб. Это с отладочной информацией, наверное?
Название: Re:Задачка архитекторная.
Отправлено: AlexIljin от Март 28, 2011, 08:11:29 pm
Интересная попытка, но увы! Слишком мало расчётов, пролетает мгновенно, надо что-то покруче...
Да, и 26*9 = 234 всё-таки...
Это я не для расчётов, а для глубины рекурсии. Можно сделать поиск с заменой, исправив "+1" на "*2/2*2/2*2/2*2/2*2/2..." Тогда и рекурсия будет, и расчётов сколько угодно. Впрочем, при моём максимальном числе 255 символов в ячейке всё равно влёт считает.

Почему-то в голове сидело, что в английском алфавите 27 букв. В результате составления таблицы исправил на 26, а результат умножения забыл обновить.
Название: Re:Задачка архитекторная.
Отправлено: vlad от Март 28, 2011, 08:17:57 pm
Удалил пустые строки, удалил namespace Test, в объявлении функций тип результата поставил на одну строку с именем функции, и осталось 383 строки. Практически совпадает с моим вариантом на XDS Oberon-2 (380 строк).

И в обероне и в C++ можно вообще все в одну строчку налепить :) Тогда уж надо сичтать байты, а не строки :) Тода все упрется еще и в длину иднтификаторов. Дурная характеристика, короче :)

Не совсем понятно, правда, почему exe-файл 388Кб. Это с отладочной информацией, наверное?

Да. 165к без отладочной инфы и без динамических библиотек. Спасибо дурным плюсовым стримам...
Название: Re:Задачка архитекторная.
Отправлено: AlexIljin от Март 28, 2011, 08:23:58 pm
Влад, в личные сообщения гляньте.
Название: Re:Задачка архитекторная.
Отправлено: vlad от Март 28, 2011, 08:30:26 pm
Влад, в личные сообщения гляньте.

Деление на ноль поправил.
Название: Re:Задачка архитекторная.
Отправлено: Илья Ермаков от Март 28, 2011, 08:44:44 pm
По поводу размера EXE.
У ББ такое бывает для больших статического размера массивов из указателей.
Тогда к дескриптору типов компилятор шьёт огромный список позиций указателей для сборщика.
Название: Re:Задачка архитекторная.
Отправлено: vlad от Март 28, 2011, 08:53:27 pm
По поводу размера EXE.
У ББ такое бывает для больших статического размера массивов из указателей.
Тогда к дескриптору типов компилятор шьёт огромный список позиций указателей для сборщика.

В данном случае - это просто неудачная (по моему мнению) стандартная библиотека стримов. Которая может делать все и поэтому большая, но при этом все крайне неудобно и непонятно :)
Название: Re:Задачка архитекторная.
Отправлено: Илья Ермаков от Март 28, 2011, 09:01:15 pm
Пардон, не понял, что это про размер С++-экземшника, потому что писал Ильин.
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 28, 2011, 11:15:14 pm
Произвёл разбиение на модули, получилось аж 6 модулей (против эталонных 4 у Гапертона).
Фактически, 4 из моих модулей содержат всего по нескольку строк кода и расчитаны на возможное развитие проекта в будущем. Два модуля составляют основной объём кода.

Метрика: 214 locs, zip: 2500 байт, распакованный вид:  8815 байт (коэф. сжатия 3.526)

Экзешник пухлый, так уж генерирует код компилятор GHC, сжатием упаковщиком типа NsPack можно уменьшить в несколько раз.

Модуляризация решения увеличила размер исходника (в строках) почти на 20%, за счёт оформления заголовков модулей, импорта и экспорта.
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 29, 2011, 06:39:15 am
Долгожданный С++ вариант :) 530 строк - самый жрный вариант, как я понимаю.

Удалил пустые строки, удалил namespace Test, в объявлении функций тип результата поставил на одну строку с именем функции, и осталось 383 строки. Практически совпадает с моим вариантом на XDS Oberon-2 (380 строк).
Если в программе vlad'а удалить функцию test (и её вызов), то вот ещё -38 строк...
Название: Re:Задачка архитекторная.
Отправлено: vlad от Март 29, 2011, 07:33:32 am
Я насчитал целых 4 решения - оберон-2, КП, хаскель, С++. Классно! :) Давайте с ними чего-нибудь сделаем :) Например:
- потестим скорость
- определим недостатки и пределы каждого решения (не кушает формулу больше такой-то длины и т.п.)
- углубим и расширим (как и предполагалось изначально), при этом оценим количество изменений (хотя бы тупой diff).
- еще чего-нибудь - тов. Веселовский должен взять инициативу ;)

P.S. Кстати, неплохо бы иметь exe для всех решений.
Название: Re:Задачка архитекторная.
Отправлено: Илья Ермаков от Март 29, 2011, 07:34:17 am
Какая-то метрия неинтересная началась, коллеги :) Как это бывает с производительностью. Признак нехорошего зуда в одном месте. Какая разница - + 100 строк, - 100 строк?
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 29, 2011, 07:43:37 am
Хорошо, Илья, предложите более годную объективную метрику.
Алексей предлагал считать лексемы, но это из той же оперы.
Как ещё можно "измерить алгеброй гармонию"?
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 29, 2011, 07:50:20 am
Я насчитал целых 4 решения - оберон-2, КП, хаскель, С++. Классно! :)

В джаббере я скидывал Алексею ссылки на кучу ещё решений, там были на яве, вроде, ещё на лиспе, на сях и с++ несколько, несколько вариантов на том же хаскелле, вариант на эрланге...

Давайте с ними чего-нибудь сделаем :) Например:
- потестим скорость

Вот с замером этой самой скорости на текущем размере таблицы 26*9 проблемы -- любая таблица будет расчитана за доли секунды.
Я хотел было попробовать какой-нить фибонначи разложить в таблицу, но понял, что там эти экспоненциальные вычисления будут мемоизированы (или по-русски -- табулированы, в таблице же), и опять же мгновенно рассчитаются...
Название: Re:Задачка архитекторная.
Отправлено: igor от Март 29, 2011, 08:07:27 am
Я насчитал целых 4 решения - оберон-2, КП, хаскель, С++. Классно! :) Давайте с ними чего-нибудь сделаем :) Например:
- потестим скорость
- определим недостатки и пределы каждого решения (не кушает формулу больше такой-то длины и т.п.)
- углубим и расширим (как и предполагалось изначально), при этом оценим количество изменений (хотя бы тупой diff).
- еще чего-нибудь - тов. Веселовский должен взять инициативу ;)

Предлагаю проверить все решения на таком тестовом наборе входных данных:
1           4
=A2+A3           =A1*A3           =A1/A2          'Surprise!
Последнюю ячейку можно исключить  :)

PS: Ещё не плохо было бы все решения продублировать в одном сообщении с указанием автора решения и языка реализации.
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 29, 2011, 08:17:36 am
Предлагаю проверить все решения на таком тестовом наборе входных данных:
1           4
=A2+A3           =A1*A3           =A1/A2          'Surprise!
Последнюю ячейку можно исключить  :)

Моё решение:
#Expr              

Решение Ильина:
#OutOfRange   #Reading    #Reading    #Reading

Решение vlad'а:
<parse error>          

Так выглядит таблица:
   A   B   C   D   ...
1  A1  B1  C1  D1
2   A2  B2  C2  D2
3   A3  B3  C3  D3
4   A4  B4  C4  D4
...
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 29, 2011, 08:30:20 am
Предлагаю проверить все решения на таком тестовом наборе входных данных:

Возможно, Вы имели в виду вот это?
1   4
=B1+C1   =A1*C1  =A1/B1  'Surprise!

Моё решение:
#Cycle    #Cycle  #Cycle  Surprise!  

Решение Ильина:
#Cycle    #Cycle  #Cycle  Surprise!

Решение vlad'а:
<cycle error> <cycle error> <cycle error> Surprise!
Название: Re:Задачка архитекторная.
Отправлено: Илья Ермаков от Март 29, 2011, 09:50:37 am
Хорошо, Илья, предложите более годную объективную метрику.
Алексей предлагал считать лексемы, но это из той же оперы.
Как ещё можно "измерить алгеброй гармонию"?

А что Вы вообще собрались мерять? Если решения чисто реализаторские (быстро реализуем как монолитный компонент), то задача достаточно проста, чтобы всё было примерно одинаково. Ну, зафиксировали количество строк, посравнивали, но удалять пробелы всякие, да ещё архиватором жать, как некоторые - маразм какой-то.

Если тренируемся в архитектуре, в декомпозиции на кубики, то критерии совсем не численные... Как это может развиваться дальше, какие схемы, ценные для решения задач данного класса, выявлены.
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 29, 2011, 10:02:38 am
Объективные критерии -- размер и скорость (разработки программы и её выполнения).
Все остальные критерии субъективны, а потому и с их оценкой постоянно будут проблемы.
Название: Re:Задачка архитекторная.
Отправлено: valexey от Март 29, 2011, 10:11:55 am
Хехе, господа, не торопитесь, а то, по сути, вы сейчас пытаетесь вычислить скорость зная только одну точку. :-)

PS. А сжатие это хороший метод измерения количества информации в решениях, и хороший критерий позволяющий оценить насколько близок исходник к содержимому /dev/random :-)
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 29, 2011, 10:24:35 am
Сравнивая разные решения обратил внимание, что моя программа выдаёт лишние табуляции в конце каждой строки и лишнюю пустую строку после самой таблицы.
Возможно, это недопустимо, поэтому поправил пару строк в программе.
locs увеличился на одну строку: 215
Название: Re:Задачка архитекторная.
Отправлено: igor от Март 29, 2011, 11:37:26 am
Возможно, Вы имели в виду вот это?
1   4
=B1+C1   =A1*C1  =A1/B1  'Surprise!

Да, конечно. Вы правы  :-[
Название: Re:Задачка архитекторная.
Отправлено: AlexIljin от Март 29, 2011, 11:45:49 am
Если в программе vlad'а удалить функцию test (и её вызов), то вот ещё -38 строк...
Это я уже сделал и учёл в подсчётах.
Название: Re:Задачка архитекторная.
Отправлено: igor от Март 29, 2011, 11:52:16 am
Предлагаю проверить все решения на таком тестовом наборе входных данных:
1  4
=B1+C1   =A1*C1  =A1/B1  'Surprise!

Моё решение:
#Cycle  #Cycle  #Cycle  Surprise!  

Решение Ильина:
#Cycle    #Cycle  #Cycle  Surprise!

Решение vlad'а:
<cycle error> <cycle error> <cycle error> Surprise!


Единодушное решение.  :)

Я хотел было "повякать" ( :)) на тему, что необходимость в решении системы из N уравнений с N неизвестными ещё не даёт оснований для того, чтобы объявлять об ошибке во входном наборе данных. Но что-то меня от этого удерживает. Наверное то, что суть задачи всё-таки была не в этом. Но формально я прав.  :)
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 29, 2011, 12:25:19 pm
Решение vlad'а:
<cycle error> <cycle error> <cycle error> Surprise!

Вообще-то тут видно, что vlad сделай как минимум один fail -- невнимательно прочёл условия задачи:

- В случае любой ошибки вычисления формулы, вычисляемая ячейка должна содержать
   слово-сообщение об ошибке, начинающееся с символа '#'. Используйте короткие,
   ясные сообщения. Не надо предоставлять подробности об ошибках в выводе.

Сообщения об ошибках нужно помечать решёткой, а не заключаться в треугольные скобки...
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 29, 2011, 12:30:15 pm
Я хотел было "повякать" ( :)) на тему, что необходимость в решении системы из N уравнений с N неизвестными ещё не даёт оснований для того, чтобы объявлять об ошибке во входном наборе данных. Но что-то меня от этого удерживает. Наверное то, что суть задачи всё-таки была не в этом. Но формально я прав.  :)

Справедливости ради должен заметить, что тот же самый Эксель тоже ругается на циклические ячейки в Вашем тесте.
Название: Re:Задачка архитекторная.
Отправлено: igor от Март 29, 2011, 12:54:04 pm
Справедливости ради должен заметить, что тот же самый Эксель тоже ругается на циклические ячейки в Вашем тесте.

Да. И причина этого ясна. В общем случае решение исключительно сложное, если вообще возможно. И это скорее всего не то, что хочет пользователь.

По хорошему, в условии задачи должна быть строчка, что-то типа: "Циклические ссылки считать ошибкой". То есть данное замечание у меня относится не столько к предоставленным решениям, сколько к самой задаче.
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 29, 2011, 12:59:07 pm
По хорошему, в условии задачи должна быть строчка, что-то типа: "Циклические ссылки считать ошибкой". То есть данное замечание у меня относится не столько к предоставленным решениям, сколько к самой задаче.

По идее задачи, испытуемый должен был догадаться об этом самостоятельно...
Название: Re:Задачка архитекторная.
Отправлено: igor от Март 29, 2011, 01:04:23 pm
По идее задачи, испытуемый должен был догадаться об этом самостоятельно...
Нет. У испытуемого просто не остаётся выбора. Иначе ему пришлось бы "убиться головой об стену".   ;D
Название: Re:Задачка архитекторная.
Отправлено: vlad от Март 29, 2011, 01:58:20 pm
Я насчитал целых 4 решения - оберон-2, КП, хаскель, С++. Классно! :)

В джаббере я скидывал Алексею ссылки на кучу ещё решений, там были на яве, вроде, ещё на лиспе, на сях и с++ несколько, несколько вариантов на том же хаскелле, вариант на эрланге...


Ну так это... сюда их! :)

Вот с замером этой самой скорости на текущем размере таблицы 26*9 проблемы -- любая таблица будет расчитана за доли секунды.

Ограничений на размер формулы нет ;) A1*A2...
Название: Re:Задачка архитекторная.
Отправлено: vlad от Март 29, 2011, 02:01:21 pm
Какая-то метрия неинтересная началась, коллеги :) Как это бывает с производительностью. Признак нехорошего зуда в одном месте. Какая разница - + 100 строк, - 100 строк?

Согласен. Строки - неинтересно, особенно с учетом произвольного форматирования. Но вот порядок (100 или 10) - таки может быть показателен. Ну, и конечно, какие-нибудь другие метрики.
Название: Re:Задачка архитекторная.
Отправлено: vlad от Март 29, 2011, 02:13:39 pm
Если тренируемся в архитектуре, в декомпозиции на кубики, то критерии совсем не численные... Как это может развиваться дальше, какие схемы, ценные для решения задач данного класса, выявлены.

Я пытался подытожить в комментариях к моему решению (http://oberon.talk4fun.net/index.php?topic=42.msg1438#msg1438 (http://oberon.talk4fun.net/index.php?topic=42.msg1438#msg1438)), но никто не поддержал и не откомментировал свои. Могу еще дополнить:
- ничего нового лично для себя не встретил, комментарии даже некуда втыкать :)
-- ну разве вот с циклическими ссылками пришлось подумать так, чтобы было минималистично и неинтрузивно
- парсер выражений сделан на коленке, без привлечения какой-то теории на эту тему
Название: Re:Задачка архитекторная.
Отправлено: vlad от Март 29, 2011, 02:26:31 pm
Сообщения об ошибках нужно помечать решёткой, а не заключаться в треугольные скобки...

Поправил. Причем только в одном месте (форматирование ошибки). Считаю, что это плюс с точки зрения архитектуры и правильной декомпозиции ;)
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Март 29, 2011, 08:09:43 pm
Я насчитал целых 4 решения - оберон-2, КП, хаскель, С++. Классно! :)

В джаббере я скидывал Алексею ссылки на кучу ещё решений, там были на яве, вроде, ещё на лиспе, на сях и с++ несколько, несколько вариантов на том же хаскелле, вариант на эрланге...

Ну так это... сюда их! :)


С++
_winnie:          http://www.everfall.com/paste/id.php?c9dn0t8ffx43
Alex Mizrahi:     http://thesz.livejournal.com/288662.html

Си
Ivan A. Kosarev:  http://unicals.com/download/excel.zip

Java
Anatoli Klassen:  http://www.26th.net/public/development/SpreadSheet.java

Хаскелл

thesz:            http://thesz.livejournal.com/281937.html
Булата Зиганьшин: http://www.haskell.org/haskellwiki/Ru/Problem_K
NotGonnaGetUs:    http://nggu.livejournal.com/663.html
пара старых моих: http://geniepro.livejournal.com/2722.html


Ерланг
Гапертон:         http://gaperton.livejournal.com/7229.html

Лисп
Alex Mizrahi:     http://thesz.livejournal.com/289017.html
13-49:            http://13-49-ru.blogspot.com/2011/03/blog-post_25.html

Nemerle
Kisloid:          http://rsdn.ru/forum/decl/2742713.all.aspx
Название: Re:Задачка архитекторная.
Отправлено: vlad от Март 30, 2011, 10:22:07 pm
Поскольку здесь и на коре периодически наезжают на питон, то на питоне тоже сделаю, как только - так сразу.
Название: Re:Задачка архитекторная.
Отправлено: vlad от Март 31, 2011, 07:14:45 pm
Питон:
- никаких ужасных проблем с динамичской типизацией не встретилось - заработало как только прошли все юнит тесты из решения на C++
- ничего лишнего в синтаксисе, сахарок, приятно :)
- функциональщина вместо интерфейсов на каждый чих - тоже приятно :)
- скажи нет бесполезным объявлениям типов :)
- все есть в языке - импортировать пришлось только "sys" для stdin/stdout

P.S. Учитесь готовить :)
Название: Re:Задачка архитекторная.
Отправлено: valexey от Март 31, 2011, 07:18:57 pm
Примерно 230 строк без тестов и без разбиения на модули. Ну и где тут лаконичность? :-)
Название: Re:Задачка архитекторная.
Отправлено: vlad от Март 31, 2011, 07:22:25 pm
Примерно 230 строк без тестов и без разбиения на модули. Ну и где тут лаконичность? :-)

Можно, конечно, и меньше - но в жертву архитектуре, будущему разбиению на модули и т.д.
Название: Re:Задачка архитекторная.
Отправлено: valexey от Март 31, 2011, 07:39:06 pm
Ну, то есть получилось жирнее чем на хаскеле разбитом на модули и переписанном в пром. стиле :-) При том, что в хаскеле строгая статическая типизация как бэ.
Название: Re:Задачка архитекторная.
Отправлено: vlad от Март 31, 2011, 07:42:46 pm
Ну, то есть получилось жирнее чем на хаскеле разбитом на модули и переписанном в пром. стиле :-) При том, что в хаскеле строгая статическая типизация как бэ.

Кто-то обещал, что будет короче, чем на хаскеле? :) Ну а статическая типизация вэтой задаче пока себя никак не показала. Судя по тому, что на питон переписалось без проблем.
Название: Re:Задачка архитекторная.
Отправлено: AlexIljin от Апрель 01, 2011, 06:40:19 am
Кто-то обещал, что будет короче, чем на хаскеле? :) Ну а статическая типизация вэтой задаче пока себя никак не показала. Судя по тому, что на питон переписалось без проблем.
Я думал, что статическая типизация показала бы себя при переписывании С Питона, а не НА него. Или я чего-то не догнал?

Кроме того, где решение Ильи Ермакова? Массы жаждут! (В моём лице.)
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Апрель 01, 2011, 07:02:15 am
Ну а статическая типизация вэтой задаче пока себя никак не показала. Судя по тому, что на питон переписалось без проблем.
Когда я рефаткорил свой вариант ( http://geniepro.livejournal.com/2722.html ), я там не просто на модули разбил, но ещё и переделки некоторые сделал:
во-первых, заставил компилятор молчать при опции -Wall, а то он ругался, что некоторые переменные не используются, а некоторые скрывают собой другие с такими же именами из предыдущей области видимости),
выделил в отдельную функцию кусок, проверяющий зацикливания в формулах,
удалил в принципе ненужный в этой задаче самопальный класс типов для расчётов таблицы и её элементов, заменив три её инстанса на три простые функции.

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

Так что статическая типизация даже на такой задачке вполне себе рулит!
Название: Re:Задачка архитекторная.
Отправлено: vlad от Апрель 01, 2011, 03:09:13 pm
Кто-то обещал, что будет короче, чем на хаскеле? :) Ну а статическая типизация вэтой задаче пока себя никак не показала. Судя по тому, что на питон переписалось без проблем.
Я думал, что статическая типизация показала бы себя при переписывании С Питона, а не НА него. Или я чего-то не догнал?

Не показала в том смысле, что решение легко "легло" на динамический язык, без долгого цикла отладки и без написания дополнительных тестов (которые и так были написаны для статической версии). Т.е., решение изначально могло быть сделано на динамическом языке и, скорее всего, быстрее (просто потому, что писанины меньше). Определенно, конечно, нельзя сказать, потому что это было переписывание, а не разработка с нуля.
Название: Re:Задачка архитекторная.
Отправлено: vlad от Апрель 01, 2011, 03:28:09 pm
При этом компилятор указывал, где я в этих переделках накосячил, и когда он, компилятор, окончательно всё скомпилировал без сообщений об ошибках, то программа чётко отработала тестовые примеры -- отлаживать не пришлось.

Так что статическая типизация даже на такой задачке вполне себе рулит!

Не, вы не догоняете :) Статика рулит, когда ошибки компиляции исправить быстрее, чем поднять тесты. И если вы думаете, что компилить всегда быстрее - то, возможно, вы просто не умеете писать тесты :)

Нелюбовь оберонщиков к динамическим языкам (и даже противопоставления, как у info21) мне вообще не понятна и объясняется только парадоксом Блаба. Оберон при статической типизации лишен какой либо арифметики типов. Выразить что-то с помощью типов или нельзя или черезчур многословно. Компилятор может проверить крайне мало. Даже при работе с каким-нибудь банальным обобщенным контейнером - сразу скатываешься до уровня динамического языка, ошибки ловятся только в рантайме. При этом куча ненужной писанины в виде приведения типов...
Название: Re:Задачка архитекторная.
Отправлено: valexey от Апрель 01, 2011, 03:33:22 pm
Кто-то обещал, что будет короче, чем на хаскеле? :) Ну а статическая типизация вэтой задаче пока себя никак не показала. Судя по тому, что на питон переписалось без проблем.
Я думал, что статическая типизация показала бы себя при переписывании С Питона, а не НА него. Или я чего-то не догнал?

Не показала в том смысле, что решение легко "легло" на динамический язык, без долгого цикла отладки и без написания дополнительных тестов (которые и так были написаны для статической версии). Т.е., решение изначально могло быть сделано на динамическом языке и, скорее всего, быстрее (просто потому, что писанины меньше). Определенно, конечно, нельзя сказать, потому что это было переписывание, а не разработка с нуля.
Реализация чисто алгоритмов (и, тем более, переписывания оных) одинаково просто на динамической и на статической типизации, пожалуй с первой еще проще, ибо никто не мешается под ногами. Статическая (а тем более строгая статическая) типизация же накладывает ограничения на реализацию алгоритма, а не снимает их.

Собственно даже на каком-нибудь языке с нестрогой динамической типизацией (у питона строгая динамическая, кстати) подобная задача была бы написана или переписана также легко. А вот если взять питоноверсию и попробовать её переписать на языке со строгой статической типизацией, тогда вот вылезут грабли. Желающие могут попробовать её переписать на хаскеле, ну, или, хотя бы на Аде.
Название: Re:Задачка архитекторная.
Отправлено: vlad от Апрель 01, 2011, 03:43:16 pm
Собственно даже на каком-нибудь языке с нестрогой динамической типизацией (у питона строгая динамическая, кстати) подобная задача была бы написана или переписана также легко. А вот если взять питоноверсию и попробовать её переписать на языке со строгой статической типизацией, тогда вот вылезут грабли. Желающие могут попробовать её переписать на хаскеле, ну, или, хотя бы на Аде.

Согласен. Переписать с динамики на статику будет скорее всего сложнее. И что это доказывает? :) Что статика круче? :) Тогда оберон, конечно, рулит - замахаешься на него переписывать с чего-то уровнем выше сей ;) Впрочем, с труЪ сей тоже замахаешься - сплошной SYSTEM будет.
Название: Re:Задачка архитекторная.
Отправлено: Илья Ермаков от Апрель 01, 2011, 05:08:19 pm
Нелюбовь оберонщиков к динамическим языкам (и даже противопоставления, как у info21) мне вообще не понятна и объясняется только парадоксом Блаба. Оберон при статической типизации лишен какой либо арифметики типов.

Вы можете программировать на Питоне, не составляя тестовые наборы? Т.е. можете получить приемлемое качество компонента, не составив на него тесты?
Я не говорю, что правильно программировать без тестов, неплохо ими подкреплять процесс, но я обычно не прибегаю к модульным тестам вообще (если бы делал вычислительно-алгоритмического характера задачи, то прибегал бы), я и так бываю уверен в качестве компонента. Только интеграционное тестирование. (Разумеется, если бы пришлось решать критичную по надёжности задачу, то нужно было бы перестраховываться любыми доступными способами).

Теперь представьте, перехожу я на динамический язык. (Мне не надо этого представлять, ряд вещей на PHP и JS я совсем недавно писал, но боролся с их закидонами осторожностью и многократными внимательными перепроверками кода, там надо было не очень объёмные, но важные компоненты написать для других разработчиков).
Так вот, перехожу я. Положим первый вариант программы я составлю, и даже забью особо на тесты. Но затем я натолкнусь на дамоклов меч этой динамики - при рефакторинге, при малейшем изменении сигнатур процедур или чего ещё я буду долго биться задницей об стену. А если учесть, что даже при разработке первого варианта я пару раз люблю порефакторить... То биться буду с самого начала.
Те, кто работает в стиле с тестами, те скажут, "а у нас вместо компилятора - тесты". Но у меня-то нет тестовых наборов специальных... Это значит, что я должен буду их завести и привыкнуть к такому стилю. Для меня это будет избыточной работой. Я привык тратить больше времени, чем другие, на написание (чтобы сразу получать правильную программу) и вычитку кода, и ещё буду тратить время на тесты...
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Апрель 01, 2011, 05:32:42 pm
А вот если взять питоноверсию и попробовать её переписать на языке со строгой статической типизацией, тогда вот вылезут грабли. Желающие могут попробовать её переписать на хаскеле, ну, или, хотя бы на Аде.
В хаскелле ООП-классов же нету, просто так переписать не получится. Код совершенно другим выйдет...
Название: Re:Задачка архитекторная.
Отправлено: vlad от Апрель 01, 2011, 05:53:53 pm
Нелюбовь оберонщиков к динамическим языкам (и даже противопоставления, как у info21) мне вообще не понятна и объясняется только парадоксом Блаба. Оберон при статической типизации лишен какой либо арифметики типов.

Вы можете программировать на Питоне, не составляя тестовые наборы? Т.е. можете получить приемлемое качество компонента, не составив на него тесты?

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

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

Я не говорю, что правильно программировать без тестов, неплохо ими подкреплять процесс,

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

Теперь представьте, перехожу я на динамический язык. (Мне не надо этого представлять, ряд вещей на PHP и JS я совсем недавно писал, но боролся с их закидонами осторожностью и многократными внимательными перепроверками кода, там надо было не очень объёмные, но важные компоненты написать для других разработчиков).
Так вот, перехожу я. Положим первый вариант программы я составлю, и даже забью особо на тесты.

Дальше можно не читать... понятно чем оно кончится ;)

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

Рефакторинг - это не только изменение сигнатур функций. Вот я работаю с базой кода, которой больше 10 лет. Статический язык. Невозможно ничего отрефакторить, пока досканально не разберешься, что делает компонента и зачем. На эти разбирательства уходят дни без единой строчки нового кода. И не надо мне пытаться рассказать, что если бы это был оберон, а не С++, то было бы быстрее (скорее наоборот). Да, если бы это был динамический язык - то были бы не дни, а недели, тут я согласен :) Но речь не об этом. А о том, что если бы оно было с вменяемыми тестами, то можно было бы просто брать и спокойно кромсать компоненту в свете нового понимания ее правильной работы, без риска, что потом у пользователя отвалится его самый важный юзкейс.

Те, кто работает в стиле с тестами, те скажут, "а у нас вместо компилятора - тесты". Но у меня-то нет тестовых наборов специальных... Это значит, что я должен буду их завести и привыкнуть к такому стилю. Для меня это будет избыточной работой. Я привык тратить больше времени, чем другие, на написание (чтобы сразу получать правильную программу) и вычитку кода, и ещё буду тратить время на тесты...

Ужос. Я вам это процитирую лет так через 5 :)
Название: Re:Задачка архитекторная.
Отправлено: Илья Ермаков от Апрель 01, 2011, 06:26:21 pm
Влад, ну я работаю больше 10 лет, знаешь...

Речь-то идёт об каждом отдельно взятом компоненте. Достаточно обособленно спроектированном и разработанном. Компонент - это 5-10 тыс. строк. Такой компонент можно и нужно разрабатывать надёжно даже в отсутствие тестовых наборов. Остаются небольшие ляпы, но для некритичной системы они сами вылезают и очень быстро (на ассертах тех же) при прогоне на интеграции.

Что изменится за 5, 10 лет? У меня будет 100, 200... компонентов, каждый всё тем же объёмом 5-10 тыс. строк, каждый всё также работает.

А реализовывается тестирование на каждую систему, каждый заказ, идущий в эксплуатацию, разумеется, там это необходимо (без этого можно обходиться только в экстренных случаях, но потом это и правда выходит боком). И такое тестирование - не задача для разработчика компонентов, и не для меня, как архитектора. Есть инженеры по качеству, это их работа. Я эту работу уважаю, но не сильно разбираюсь - не моё :) У меня вот ученик мой бывший и студент, сейчас в Калуге работает на этой должности, над системой для британской биржи какой-то по ценным металлам... Много чего интересного рассказывает :) Ещё одногруппник тоже, тот в Бишкеке по тестированию билинга Мегафона работал два года. Дотошные ребята, молодцы, затестируют вусмерть :)
Название: Re:Задачка архитекторная.
Отправлено: Илья Ермаков от Апрель 01, 2011, 06:31:11 pm
Кстати, вот в этом году много примеров разбираю разных со студентами, на проекторе пишем прямо. Размеры примеров 700-2000 строк, около того (1-4 модуля).
И часто бывает, что всё работает верно сразу после написания. Ну либо мгновенно обнаруживаемые ляпы, на ассертах или NIL (что-то не соединили). Не было случая, чтобы надо было возиться с отладкой, если программа хорошо структурирована (в смысле разбиения на процедурки).
И я стараюсь, чтобы ребята запоминали крепко процесс вот такой работы - когда ты запускаешь программу (= компонент системы), будучи уже уверен в том, что она верна.
Название: Re:Задачка архитекторная.
Отправлено: Илья Ермаков от Апрель 01, 2011, 06:35:31 pm
Возможно, многое решает привычки-настрой. Если человек настроен на отладку, он будет работать в режиме спринтера - составляем, составляем, не думаем об ошибках. Не перечитываем.

Если работать с противоположной привычкой, то больше 2/3 времени сидишь и листаешь свой же код, напишешь - перечитаешь сто раз. Может, у меня характер такой - я люблю неспешно строить, а не бежать за строчками.
Название: Re:Задачка архитекторная.
Отправлено: valexey от Апрель 01, 2011, 07:41:39 pm
Влад, ну я работаю больше 10 лет, знаешь...
Извиняюсь за возможно некорректное вмешательство, но, однако, получается что ты работаешь как минимум с 14ти лет программистом и около того.
Название: Re:Задачка архитекторная.
Отправлено: vlad от Апрель 01, 2011, 07:52:48 pm
Влад, ну я работаю больше 10 лет, знаешь...

Это не то. Приходилось ли вам рефакторить чужой код, которому 10+ лет? Еще и написанный не в вашем стиле (я не про форматирование)? Код, кторый вы не имеет права "сломать"? Код, у которого не два выхода "сработало/не сработало", а нечто о чем вы имеет общее представление. Код, который вмурован зависимостями в другой код? Не выкидывать и переписывать нафиг, а рефакторить? Еще раз замечу, что это был не плохой код (10 лет назад) и писан не идиотами. И с зависимостями у него 10 лет назад было все относительно хорошо. Просто за 10 лет он был столько раз "захэкан", что превратился в полное говно. А захэкан он был из самых добрых побуждений - чтобы с меньшей вероятностью что-то сломать. Потому что сделать "смелый" рефакторинг слишком дорого - тестов нет, фиг знает какие сценарии использования будут упущены.

Речь-то идёт об каждом отдельно взятом компоненте. Достаточно обособленно спроектированном и разработанном. Компонент - это 5-10 тыс. строк. Такой компонент можно и нужно разрабатывать надёжно даже в отсутствие тестовых наборов. Остаются небольшие ляпы, но для некритичной системы они сами вылезают и очень быстро (на ассертах тех же) при прогоне на интеграции.

Блин. Да не можете вы его взять и прогнать. Потому что там мильён сценариев. Потому что, например, вам среду окружения надо будет сетапить целый день (специфика работы с каким-нибудь файловым сервером под Mac OSX). Или потому что у вас просто нет железки, с которой он работает.
Название: Re:Задачка архитекторная.
Отправлено: vlad от Апрель 01, 2011, 07:58:57 pm
Кстати, вот в этом году много примеров разбираю разных со студентами, на проекторе пишем прямо. Размеры примеров 700-2000 строк, около того (1-4 модуля).
И часто бывает, что всё работает верно сразу после написания.

И чего? В момент написания - ну вообще не парит. Можно писать на питоне и без тестов. Быстро. Парит потом, когда уже поздно что-то делать, можно только плакать и грызть кактус.
Название: Re:Задачка архитекторная.
Отправлено: vlad от Апрель 01, 2011, 08:03:22 pm
Возможно, многое решает привычки-настрой. Если человек настроен на отладку, он будет работать в режиме спринтера - составляем, составляем, не думаем об ошибках. Не перечитываем.
ешно строить, а не бежать за строчками.

Да, да. Я вот пишу и не не знаю - заработает или нет и какие будут ошибки. Поэтому приходится писать тесты. А вам это не грозит, потому что вы думаете. Смешно...
Название: Re:Задачка архитекторная.
Отправлено: Илья Ермаков от Апрель 02, 2011, 07:05:07 am
Влад, ну ёханый бабай, если компонент ПРАВИЛЕН, если он вычитан перекрёстно несколькими людьми и не раз (потому что написан настолько структурированно, чтобы это можно было делать), то какие с этим компонентом будут проблемы? Рефакторить "хаками" реализацию отдельного модуля у нас тоже не принято, отдельная реализация какого-нибудь ABSTRACT-типа на пару тыщ строк просто переписывается с нуля, так, как нужно под новые требования...

Это не самоуверенность, это просто наблюдения из практики - если поставить целью выверять код аудитом до тестирования и заточить весь стиль работы группы разработчиков под это, то результаты удивляют. Даже нас самих.
Название: Re:Задачка архитекторная.
Отправлено: Илья Ермаков от Апрель 02, 2011, 07:11:23 am
Хотя, впрочем, я выше подчёркивал, что я не обобщаю подход на какие-то вычислительного характера задачи, и, кстати, на бизнес-логику (где идёт действительно взрыв сценариев). Я говорю о кубиках-компонентах (по стилю разработки это - системное программирование, в общем). А бизнес-логика как раз возникает поверх кубиков, на верхнем уровне, как интегрирующий слой. "Оркестровка", как принято это называть. Вот ей инженеры по качеству и должны заниматься, разрабатывать тесты, как положено.
Название: Re:Задачка архитекторная.
Отправлено: Илья Ермаков от Апрель 02, 2011, 07:16:52 am
На самом деле, характер кода неплохо характеризуется критерием разветвлённости (числом путей, за счёт IF-ов).
Кстати, эта мера чётко растёт от системного уровня к прикладному. И подходы, соответственно, тоже должны различаться.

С другой стороны, правильно организовывать систему надо так, чтобы все сценарии, вот это принятие решений уходило наверх, на интегрирующий уровень. Каждый компонент должен включать в себя как можно меньше принятий решений, вот этих сценариев работы. Вместо параметризации компонентное программирование предполагает вариативность реализации.
Возникает желание сделать компонент X с кучей конфигурационных параметров? Делаем одну абстракцию и несколько разных её реализаций. Вместо одной настраиваемой. (Правда, код в реализациях будет процентов на 30 повторяться, ну и что? Это же сокрытое внутреннее устройство, оно один раз написано (по аналогии или частично даже копипастом) и годами потом используется...)

Года два назад сформулировал для себя принцип: кубики тупые и делают конкретную работу, принимает решение надсистема.
Название: Re:Задачка архитекторная.
Отправлено: vlad от Апрель 02, 2011, 05:02:37 pm
На самом деле, характер кода неплохо характеризуется критерием разветвлённости (числом путей, за счёт IF-ов).
Кстати, эта мера чётко растёт от системного уровня к прикладному. И подходы, соответственно, тоже должны различаться.

С другой стороны, правильно организовывать систему надо так, чтобы все сценарии, вот это принятие решений уходило наверх, на интегрирующий уровень. Каждый компонент должен включать в себя как можно меньше принятий решений, вот этих сценариев работы. Вместо параметризации компонентное программирование предполагает вариативность реализации.
Возникает желание сделать компонент X с кучей конфигурационных параметров? Делаем одну абстракцию и несколько разных её реализаций. Вместо одной настраиваемой. (Правда, код в реализациях будет процентов на 30 повторяться, ну и что? Это же сокрытое внутреннее устройство, оно один раз написано (по аналогии или частично даже копипастом) и годами потом используется...)

Года два назад сформулировал для себя принцип: кубики тупые и делают конкретную работу, принимает решение надсистема.

Вы описываете в точности мое представление о правильной разработке. Как это не странно :) Тем не менее. Такой подход не исключает тестов. Тесты - его обеспечивают. Как соблюдать такой "кубиковый" подход без написания тестов - я не представляю. Одного желания мало, особенно для больших объемов и многих участников. Нужно конкретное техническое контролирующее средство. Пока кроме тестов на эту роль никого не видно.
Название: Re:Задачка архитекторная.
Отправлено: Илья Ермаков от Апрель 02, 2011, 08:47:07 pm
Я не против тестов, поймите меня правильно. Я за них. Добавить ещё и тесты. Особенно в большом коллективе, это наверняка будет просто необходимо.

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

Я говорю о том, что надо иметь процесс, который и без систематического тестирования компонентов даёт в небольшом коллективе их высокое качество, а если к нему добавить ещё и тесты, то это вообще будет экстра-класс :)
Название: Re:Задачка архитекторная.
Отправлено: valexey от Апрель 09, 2011, 06:45:49 pm
А увидим ли мы обещанное решение на КП/ББ в открытом доступе с описаловом?
Название: Re:Задачка архитекторная.
Отправлено: DIzer от Апрель 09, 2011, 10:16:59 pm
А увидим ли мы решение на 07 (можно без описалова)  :)
Название: Re:Задачка архитекторная.
Отправлено: valexey от Апрель 09, 2011, 10:21:25 pm
А увидим ли мы решение на 07 (можно без описалова)  :)
Решение на 07 осложняется отсутствием элементарной стандартной библиотеки. Вот сейчас пишу как раз неё :-)
Название: Re:Задачка архитекторная.
Отправлено: Илья Ермаков от Апрель 10, 2011, 08:34:57 am
Пока занят сделать описалово, 12-го пройдут у нас в институте Поликарповские чтения, тогда займусь. Помню, в плане стоит.
Название: Re:Задачка архитекторная.
Отправлено: AlexIljin от Апрель 10, 2011, 04:41:20 pm
Пока занят сделать описалово
Бог с ним, с описанием. Исходников было бы достаточно. Они уже опубликованы или нет?
Название: Re:Задачка архитекторная.
Отправлено: valexey от Апрель 10, 2011, 04:46:40 pm
Пока занят сделать описалово
Бог с ним, с описанием. Исходников было бы достаточно. Они уже опубликованы или нет?
Они у меня в загашнике в формате PDF :-)
Название: Re:Задачка архитекторная.
Отправлено: AlexIljin от Апрель 12, 2011, 06:46:19 pm
На этом форуме плохо видно пришедшие личные сообщения. valexey, я вам уже несколько дней как написал.
Название: Re:Задачка архитекторная.
Отправлено: valexey от Апрель 12, 2011, 08:09:06 pm
Ой, да, действительно.
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Май 23, 2011, 05:00:08 am
Ещё одно решение (на хаскелле) от ЖЖ-юзера Yan Tayga
http://yantayga.livejournal.com/28097.html

PS. Де обещанные решения на КП и О7??? :P
Название: Re:Задачка архитекторная.
Отправлено: Geniepro от Июль 01, 2011, 06:27:39 pm
<Истерично> НУ И ДЕ???? </Истерично>
Название: Re: Задачка архитекторная.
Отправлено: Geniepro от Сентябрь 27, 2011, 11:03:05 am
 
ну так и де?
  ;D ;D ;D
Название: Re: Задачка архитекторная.
Отправлено: vlad от Сентябрь 27, 2011, 01:37:52 pm
ну так и де?
  ;D ;D ;D

У кого надо (с) :)
Название: Re: Задачка архитекторная.
Отправлено: valexey от Апрель 06, 2012, 09:37:20 pm
Откопал решение Ильи Ермакова (оно вроде бы не законченое/не допиленное, но тем не менее пусть будет, для коллекции).
Название: Re: Задачка архитекторная.
Отправлено: ilovb от Ноябрь 16, 2013, 12:17:06 pm
Крошечный Excel на чистом JavaScript (30 строк кода) (http://habrahabr.ru/post/202304/)