После выхода второго номера журнала "Практика функционального программирования" у меня состоялась интересная переписка с неким программистом, который очень любит писать на C.
Кульминацией этой переписки стало то, что он предложил мне следующее пари: я формулирую простенькую задачу, после чего мы оба реализуем ее - он на С, я - на Haskell. После этого в условие вносятся небольшие коррективы (моделируем поведение требований в реальном мире), а мы вносим коррективы в наши программы. Результаты сравниваются по скорости исполнения, объему потребляемой памяти, количеству строк кода.
Мой оппонент изначально был поставлен в неравные условия, т.к. я мог подобрать задачу так, чтобы ее было удобно реализовывать мне, и неудобно реализовывать ему. Впрочем, я постарался выбрать задачу так, чтобы ее решение не требовало каких-то узкоспециальных знаний. Фактически, мы занимались тем, что читали из файла и обрабатывали некую сложную структуру данных. (Детальное условие я тут не привожу, чтобы не "сбивать прицел" второй половине поста).
Моя первая версия активно использовала Data.Generics и библиотечные парсеры на их основе, поэтому выиграла в размере и читаемости кода, но пролетела по объему потребляемой памяти. Впрочем, мой оппонент настолько понадеялся на мощь C, что решил не использовать библиотечный qsort, а реализовать insertion sort самостоятельно. Это самым пагубным образом сказалось на производительности (LOCs - строки кода, память - в мегабайтах, время - в секундах):
Кроме того, выяснилось, что мой оппонент всячески "срезает углы" в погоне за производительностью. Например, функция сохранения обработанных данных в файл принимала, в числе прочих, числовой параметр, на который умножались определенные поля структуры перед сохранением - таким образом экономился один рекурсивный обход всей структуры данных.
В результате я тоже решил "срезать углы", и принести красоту кода в жертву скорости. Мой же оппонент взялся за qsort, и к вторые (финальная) версии нашего кода "финишировали" с такими результатами:
Я предполагал, что соотношение цифр будет гораздо сильнее не в пользу Haskell. Впрочем, меня по-прежнему можно было бы обвинить в предвзятом подходе к формулированию условий.
К чему я все это веду?
Существует классическая статья "Haskell vs. Ada vs. C++ vs. Awk vs. ... An Experiment in Software Prototyping Productivity", написанная в 1994-м году. За 15 лет многое изменилось, и, думается, многим было бы интересно прочитать подобную статью про положение дел сегодня.
В связи с этим ищутся:
1)Условия подходящей задачи (критерии см. ниже)
2)Желающие реализовать ее на Haskell/C+/Ocaml/Java/Scala/C#/... с тем, чтобы ваш код был нещадно сравнен с другими и опубликован для всеобщего обозрения.
Q:Зачем все это делается?
A:На других посмотреть, себя показать. В частности, чтобы люди имели возможность посмотреть на решения на других языках, и составить о них какие-то мнение.
Q:Чем не устраивает The Great Language Shootout?
A:Тем, что там отдается предпочтение "быстрым и грязным" решениям, которые всячески "срезают углы". Во-первых, в таком стиле пишется дай бог чтобы 5% от всех программ, во-вторых, людям, не знающим язык X, строго противопоказано смотреть на решения на языке X в Language Shootout - останется превратное впечатление.
Q:Как будут сравниваться решения, чтобы определить победителя?
A:Никак, т.к. победителей не будет. Будут приведена определенная статистика по всем решениям, без выводов.
Q:Какой тогда стимул участвовать?
A:На других посмотреть, себя показать :)
Какой должна быть задача?
1)Не заточенной под конкретную ОС (т.е. "Реализовать компонент, встраеваемый в Word" или "плагин для libpam" - не катит)
2)Не заточенной под конкретный язык/фреймворк/... (т.е. "получить список сигнатур методов всех объектов указанной сборки .Net" - не катит)
3)Если глубокие знания в предметной области дают решающее преимущество - это fail (т.е. "реализовать DES-CBC" - не катит)
4)Чтобы она не была из категории "мне не нужно, чтобы плац был чистый, а нужно, чтобы вы задолбались" (т.е. "распарсить XLS-файл, не пользуясь библиотеками" - не катит)
5)Задача не должна требовать много времени на реализацию (если это будут человеко-недели - никто за нее не возьмется)
Какой должна быть реализация?
1)Чтобы ее было не стыдно показать другим. В частности, чтобы решение на языке X не заплевали бы как кривое и неидиоматичное другие программисты, знающие язык X.
2)Идеально было бы давать две реализации: первую с ориентиром на "красоту", "образцово-показательность" и легкость поддержки/развития кода (т.е. пишем как пример кода, который будет прилагаться к резюме :), а вторую - "грязную и быструю".
3)Т.к. библиотеки - это неотъемлимая часть силы и популярности языка, библиотеками "общего назначения" (контейнеры, парсинг, ...) пользоваться можно и нужно
4)Но! Решение, которое свелось к исключительно к нахождению и использованию какой-то (узкоспециальной) библиотеки никому не интересно и рассматриваться не будет.
Выбирать подходящее условие будет жюри, представляющее апологетов всех течений и направлений, в том числе - включающее тех, кто критически отзывался о материалах, уже вышедших в fprog.ru.
Если у вас есть идея подходящией задачи и вы хотите ей поделится - напишите комментарий, а?
Кульминацией этой переписки стало то, что он предложил мне следующее пари: я формулирую простенькую задачу, после чего мы оба реализуем ее - он на С, я - на Haskell. После этого в условие вносятся небольшие коррективы (моделируем поведение требований в реальном мире), а мы вносим коррективы в наши программы. Результаты сравниваются по скорости исполнения, объему потребляемой памяти, количеству строк кода.
Мой оппонент изначально был поставлен в неравные условия, т.к. я мог подобрать задачу так, чтобы ее было удобно реализовывать мне, и неудобно реализовывать ему. Впрочем, я постарался выбрать задачу так, чтобы ее решение не требовало каких-то узкоспециальных знаний. Фактически, мы занимались тем, что читали из файла и обрабатывали некую сложную структуру данных. (Детальное условие я тут не привожу, чтобы не "сбивать прицел" второй половине поста).
Моя первая версия активно использовала Data.Generics и библиотечные парсеры на их основе, поэтому выиграла в размере и читаемости кода, но пролетела по объему потребляемой памяти. Впрочем, мой оппонент настолько понадеялся на мощь C, что решил не использовать библиотечный qsort, а реализовать insertion sort самостоятельно. Это самым пагубным образом сказалось на производительности (LOCs - строки кода, память - в мегабайтах, время - в секундах):
| LOCs | MEM max | Runtime, sec | |
| Haskell, v1 | 72 | 580 | 88 |
| C++, v1 | 861 | 55 | 383 |
Кроме того, выяснилось, что мой оппонент всячески "срезает углы" в погоне за производительностью. Например, функция сохранения обработанных данных в файл принимала, в числе прочих, числовой параметр, на который умножались определенные поля структуры перед сохранением - таким образом экономился один рекурсивный обход всей структуры данных.
В результате я тоже решил "срезать углы", и принести красоту кода в жертву скорости. Мой же оппонент взялся за qsort, и к вторые (финальная) версии нашего кода "финишировали" с такими результатами:
| LOCs | MEM max | Runtime, sec | |
| Haskell, v2 | 169 | 130 | 8 |
| C++, v2 | 950 | 54 | 5 |
Я предполагал, что соотношение цифр будет гораздо сильнее не в пользу Haskell. Впрочем, меня по-прежнему можно было бы обвинить в предвзятом подходе к формулированию условий.
К чему я все это веду?
Существует классическая статья "Haskell vs. Ada vs. C++ vs. Awk vs. ... An Experiment in Software Prototyping Productivity", написанная в 1994-м году. За 15 лет многое изменилось, и, думается, многим было бы интересно прочитать подобную статью про положение дел сегодня.
В связи с этим ищутся:
1)Условия подходящей задачи (критерии см. ниже)
2)Желающие реализовать ее на Haskell/C+/Ocaml/Java/Scala/C#/... с тем, чтобы ваш код был нещадно сравнен с другими и опубликован для всеобщего обозрения.
Q:Зачем все это делается?
A:На других посмотреть, себя показать. В частности, чтобы люди имели возможность посмотреть на решения на других языках, и составить о них какие-то мнение.
Q:Чем не устраивает The Great Language Shootout?
A:Тем, что там отдается предпочтение "быстрым и грязным" решениям, которые всячески "срезают углы". Во-первых, в таком стиле пишется дай бог чтобы 5% от всех программ, во-вторых, людям, не знающим язык X, строго противопоказано смотреть на решения на языке X в Language Shootout - останется превратное впечатление.
Q:Как будут сравниваться решения, чтобы определить победителя?
A:Никак, т.к. победителей не будет. Будут приведена определенная статистика по всем решениям, без выводов.
Q:Какой тогда стимул участвовать?
A:На других посмотреть, себя показать :)
Какой должна быть задача?
1)Не заточенной под конкретную ОС (т.е. "Реализовать компонент, встраеваемый в Word" или "плагин для libpam" - не катит)
2)Не заточенной под конкретный язык/фреймворк/... (т.е. "получить список сигнатур методов всех объектов указанной сборки .Net" - не катит)
3)Если глубокие знания в предметной области дают решающее преимущество - это fail (т.е. "реализовать DES-CBC" - не катит)
4)Чтобы она не была из категории "мне не нужно, чтобы плац был чистый, а нужно, чтобы вы задолбались" (т.е. "распарсить XLS-файл, не пользуясь библиотеками" - не катит)
5)Задача не должна требовать много времени на реализацию (если это будут человеко-недели - никто за нее не возьмется)
Какой должна быть реализация?
1)Чтобы ее было не стыдно показать другим. В частности, чтобы решение на языке X не заплевали бы как кривое и неидиоматичное другие программисты, знающие язык X.
2)Идеально было бы давать две реализации: первую с ориентиром на "красоту", "образцово-показательность" и легкость поддержки/развития кода (т.е. пишем как пример кода, который будет прилагаться к резюме :), а вторую - "грязную и быструю".
3)Т.к. библиотеки - это неотъемлимая часть силы и популярности языка, библиотеками "общего назначения" (контейнеры, парсинг, ...) пользоваться можно и нужно
4)Но! Решение, которое свелось к исключительно к нахождению и использованию какой-то (узкоспециальной) библиотеки никому не интересно и рассматриваться не будет.
Выбирать подходящее условие будет жюри, представляющее апологетов всех течений и направлений, в том числе - включающее тех, кто критически отзывался о материалах, уже вышедших в fprog.ru.
Если у вас есть идея подходящией задачи и вы хотите ей поделится - напишите комментарий, а?
(no subject)
Date: 2009-11-03 10:38 pm (UTC)(no subject)
Date: 2009-11-03 10:42 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
Date: 2009-11-03 10:48 pm (UTC)Шутка. ;)
Рейтресеры.
Поиск пути в области со статическими и движущимися объектами, малой плотностью оных.
Двумерная игровая физика.
(no subject)
Date: 2009-11-03 10:48 pm (UTC)(no subject)
Date: 2009-11-03 10:53 pm (UTC)А если чуть более серьёзно, то эта штука меряет только перформанс. А то что на хаскеле это будет одна строка, а на си — стопятьсот, это как-бы тоже должно быть измеряемым фактором в финальном решении. То есть, задаче желательно не состоять в том, что она замеряет перформанс и/или лаконичность сама собой. На это постмортем анализ есть: что короче, и насколько при этом быстрее (медленнее).
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:Re: ...continue (2/2)
From:Re: ...continue (2/2)
From:Re: ...continue (2/2)
From:Re: ...continue (2/2)
From:Re: ...continue (2/2)
From: (Anonymous) - Date: 2011-08-18 12:10 pm (UTC) - Expand(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
Date: 2009-11-03 10:51 pm (UTC)(no subject)
Date: 2009-11-03 11:23 pm (UTC)(no subject)
Date: 2009-11-04 12:28 am (UTC)(no subject)
Date: 2009-11-04 01:17 am (UTC)Вывод типов для SQL или иного простого языка
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
Date: 2009-11-04 01:01 am (UTC)поиск пути на сетке, поиск пути среди convex hull'ов. (disclaimer: я их решал эмпирически, поэтому предполагаю что особой мат. подготовки, если там не extreme cases, не требуется)
(no subject)
Date: 2009-11-04 02:09 am (UTC)(no subject)
Date: 2009-11-04 05:37 am (UTC)Ха!
Date: 2009-11-04 05:44 am (UTC)(no subject)
Date: 2009-11-04 07:45 am (UTC)(no subject)
Date: 2009-11-04 09:23 am (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
Date: 2009-11-04 09:00 am (UTC)http://www.kodges.ru/58262-yetyudy-dlya-programmistov.html
(no subject)
Date: 2009-11-04 09:03 am (UTC)(no subject)
Date: 2009-11-04 09:23 am (UTC)Если такая разница в LOC, то это чистая победа Хаскелля. Потому что тройной расход по памяти и полуторный CPU - дело временное, а стоимость саппорта вечна.
О задачах.
Есть PLEAC, и там ещё ссылки.
Об участии.
Запишите меня. Возьму Java или Groovy.
(no subject)
Date: 2009-11-04 09:24 am (UTC)(no subject)
Date: 2009-11-04 09:38 am (UTC)так что как-бы внимательно за Вами наблюдаю.
(no subject)
Date: 2009-11-04 10:55 am (UTC)(no subject)
Date: 2009-11-04 06:23 pm (UTC)(no subject)
Date: 2009-11-04 11:12 am (UTC)простая - нейронная сеть с обратным распространением ошибки.
сложная - когнитрон/неокогнитрон
(no subject)
Date: 2009-11-04 01:19 pm (UTC)отличная идея!
Date: 2009-11-04 11:41 am (UTC)Задача такая: используя простой интерфейс (скорее всего, http), узнать, на каком расстоянии в социальном графе находятся 2 пользователя (по их username). Т.е., условно говоря, мы даем запрос http://test/distance/vasya/masha, а получаем в ответ текст "3 vasya - sasha - olya - masha" или "? vasya - unknown - masha" или "0 vasya - not connected - masha"
Интерес задачи в том, что точного графа у нас никогда не будет, а будет только какая-то малая часть плюс возможность получить некторое количество нужной информации из twitter. Естественно, что на первые запросы будет выдаваться в основном unknown, но со временем, если мы будем накапливать данные (т.е. хранить у себя социальный граф), то будет все больше реальных ответов. Еще плюс этой задачи -- что это довольно реальная штука, и что-то подобное может встречаться часто. Кроме того, она не тривиальна и не предполагает единственный путь рещения -- наоборот. Можно еще подумать о том, чтобы предусмотреть persistence тех данных, которые у нас есть. Например, ввести условие, что посредине работы программа 1 раз перезапускается.
Конечно, тестирование такой системки немного проблематично (как и с любыми реальными системами, так ведь), но я вижу такой подход:
1. создать список запросов (порядка 1000 - 10000). Это можно более-менее автоматизировать: собрать пару тысяч имен пользователей -- не проблема. Желательно, конечно, чтоб они были и не слишком далеко друг от друга, и не слишком близко (т.е. японцев, наверно, не брать. Скажем, ограничится европой и штатами).
2. создать какое-то случайное (нормально распределенное) расписание этих запросов на день-два-неделю (за день можно сделать, кажется, до 4800 запросов к твиттер-API).
3. развернуть программку на каком-то тестовом сервере и запускать эти запросы по графику, а результаты скидывать в лог
Соответственно, можно будет получить даже какие-то данные для сравнения разных подходов: у кого результаты точнее выйдут.
Естественно, можно сделать еще какую-то небольшую тестовую выборку, чтобы люди могли на ней тестировать программу в процессе разработки
такие мысли. Возможно, нужно дорихтовать...
(no subject)
Date: 2009-11-04 01:35 pm (UTC)Хранит всю свою инфу в специальном файле или папке.
Позволяет присваивать теги файлам или папкам. Позволяет делать запросы по тегам и подстрокам названий. Умеет прозрачно отслеживать переименованные и перемещенные файлы. Умеет рекомендовать и вообще автопроставлять теги.
Типа tds - tagged document storage
> tds tag temp/pfds.pdf algorithms functional programming book
> mv temp/pfds.pdf 'books/fp/Okasaki - Purely functional data structures.pdf'
> tds get functional algorithms
...
books/fp/Okasaki - purely functional data structures.pdf
...
Хочу сам себе такую написать когда-нибудь, но не сейчас.
(no subject)
Date: 2009-11-04 03:13 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
Date: 2009-11-04 02:04 pm (UTC)Также возможно расширение задачи (для проверки продуктивности рефакторинга): после того, как участники выкатили свои реализации, изменить правила игры и предложить им модифицировать свои программы.
(no subject)
Date: 2009-11-04 02:18 pm (UTC)Критерии:
1) Подходит полностью.
2) Подходит полностью.
3) Не совсем, потому как нужны какие-никакие познания в области анализа и синтеза ЕЯ-текста.
4) Вроде бы, подходит. С алгоритмической точки зрения более-менее нормальная задача, принимая во внимание ограниченность словаря.
5) Оцениваю в пару десятков человеко-часов.
(no subject)
Date: 2009-11-04 02:23 pm (UTC)Необходимо написать банальный калькулятор, работающий в диалоге с пользователем с консоли. Пользователь может определять переменные, которые калькулятор запоминает и которые впоследствии могут участвовать в вычислениях. Ну примерно вот так:
> pi = 3.14pi = 3.14> r = 10r = 10> s = pi * r^2s = 314Для четырёх арифметических операций задача выглядит простой. Для усложнения можно попросить использовать вшитые функции (типа «научного» калькулятора).
Чем хороша задача? Здесь и синтаксический анализ входного текста какой-никакой, и построение дерева вычислений, и сами вычисления, и вывод, и хранение состояния (таблица переменных). Многие идиомы можно показать.
К тому же подходит под все пять заявленных критериев хорошей задачи.
(no subject)
Date: 2009-11-04 03:08 pm (UTC)(no subject)
Date: 2009-11-04 03:00 pm (UTC)(no subject)
Date: 2009-11-04 03:04 pm (UTC)(no subject)
From:(no subject)
From: