Введение
Многие пробовали решать задачки с ProjectEuler — пробовал и я, нарешал штук 40 наверное…
Но всё-таки уклон в математику не совсем по мне, оказывается. И задумал я состряпать альтернативный сайт.
Сначала хотел чтобы там было как на TopCoder или CodeForces — с системой компиляции и исполнения решений на сервере и т.п. Однако по ходу первых экспериментов понял — не потяну. Нужен ведь и отдельный сервер (или несколько), настраивать песочницу и т.п… А потом ещё задачи выдумывать (или красть) сложные.
Потихоньку появилась идея — надо действовать проще. Ведь ProjectEuler упомянутый выше — совсем простой (по исполнению) — а народом любим вполне.
То что есть на текущий момент можно видеть по ссылке:
Как это работает
Зарегистрировавшись пользователь открывает произвольные задачки из списка — они доступны и без регистрации — но теперь он ниже условия видит поле с входными данными и поле для ввода ответа.
Требуется всего лишь написать программу для решения задачи, скормить ей эти данные и ввести ответ в поле.
Сторонний сервис позволяет выполнить код на сайте — в этом случае данные поступают на стандартный ввод, а ответ берётся из стандартного вывода.
В случае правильного ответа пользователя поздравляют, защитывают ему некоторые очки рейтинга (зависят от того как много людей уже решило эту задачу) и разрешают посмотреть чужие решения по ней.
Под чужими решениями можно оставить комментарий — к сожалению после того как я эту возможность сделал, я понял что она вряд ли будет популярной.
В случае неправильного решения пользователь может посмотреть ожидавшийся ответ и подумать прежде чем попытаться снова.
В таблице рейтинга пользователи сортируются по очкам. Кроме этого им назначаются звания за количество решённых задач — с 5 задачами человек становится зелененьким аколитом, c 25 — циановым верующим и так далее — на текущий момент 3 человека (из 300 с чем-то решивших хоть что-нибудь) имеют ранг фиолетового епископа чтобы вырасти дальше нужно решить 85 задач, но пока это невозможно так как на сайте их всего 84.
Впрочем, надеюсь в ближайшие дни появится ещё одна задача — и, может, пользователь нового цвета.
Черты реализации
Просто — это значит PHP, решил я. Как опытный Java-программист, в PHP я не силён. Попробовал CakePHP — удобно, но куда сервисы писать не понял. Попробовал Symfony — ниасилил.
К счастью незадолго до того я делал на PHP простенький функционал лэйаутов. Немножко проапгрейдил его и получился маленький фреймворк PhpLayout (опытным PHP-программистам лучше не смотреть, чтобы не пострадать от перемежающихся приступов гнева и хохота).
Фреймворк позволил мне достаточно легко стряпать странички, контроллеры, сервисы — на Java я бы ощутимо дольше возился, особенно на нетбуке — наша Java прожорливая 🙂
Для хранения текстов задач и статей в «вики» я выбрал формат MarkDown — так мне достаточно легко их добавлять и править с админской страницы. Картинки в SVG добавляются прямо в текст при необходимости.
В отличие от ProjectEuler тестовые данные для задач генерируются случайно. Поэтому для каждой задачи хранится ещё и генератор — небольшой фрагмент кода создающий набор тестовых данных и ожидаемый ответ. Этот подход плох, например, для задач где возможно несколько правильных ответов (например дерево кратчайших путей в графе), тем не менее в большинстве случаев он себя оправдывает.
Отдельной задачей для меня стало автоопределение языка программирования, на котором прислано решение. На текущий момент реализация состоит из небольшого метода (строк 20) и порой путает Python с LISP или Ruby — тем не менее процентов 95 определяет правильно и пока заниматься модернизацией я не стал.
Мои открытия
Я был потрясён узнав базовые вещи из SEO — про google-webmasters и т.п. Просто диву даюсь в каких потёмках я ходил.
Я выяснил что миллионером мне за счёт рекламы в виде одинокого баннера в верхнем правом углу не стать — пока даже с окупаемостью дешевого хостинга дело не обстоит многообещающе.
Я узнал что существует какая-то прорва громоздких и сложных способов решить задачу выбора наименьшего из трех чисел — ужасно познавательно оказывается читать присылаемые решения 🙂
Благодаря бдительности некоторых пользователей я узнал что делаю много ошибок не только в английском, но и в примерах задач, и в генераторах данных. Даже когда думал что всё проверил!
Узнал что хотя многие задачи кажутся мне примитивными, некоторые пользователи просят «добавить задач ещё попроще».
Понял что мне здорово не хватает дизайнера, СЕО-специалиста и проблемсеттера. Но что надо учиться обходиться «пока так».
Понял что нужно много времени. Два дня пишу задачи, три дня вожусь с SEO и отвечаю на письма пользователей, правлю указанные ошибки и т.п. Изредка находится время чтоб добавить новый функционал.
Выяснил что мои представления о том каким должен быть сайт и какие нововведения ему нужны — они зачастую не соответствуют ожиданиям пользователей. Хорошо что многие из них вовремя помогли подсказками и советами.
… тут должно быть много чего ещё …
И главное я понял, что однажды вылезя из привычного уютного мирка web-приложений для энтерпрайза в неуютный и загадочный мир мирового web-а, уже нельзя так легко всё бросить, как сменить работу, например. Нужно продолжать, добавлять задачи, а то несколько юзеров их даже ждут — нужно выдумывать какие-то улучшения и т.п. Открытым остаётся лишь вопрос — зачем это мне самому? Видимо по старой пословице «Программист на работе пишет код и устаёт, а дома пишет код и отдыхает».
Заключение
Поскольку мне катастрофически не хватает идей и подсказок по модернизации, а также идей задач — с радостью к ним прислушаюсь.
Ну а если найдутся желающие просто порешать задачки — тоже буду рад!
ссылка на оригинал статьи http://habrahabr.ru/post/215677/
Добавить комментарий