О проекте
Ко всем более-менее крупным проектам прилагается история. Вот я и решил написать историю этой системы. Но начну, пожалуй, с небольшой предыстории.
Холодной зимой 2005-2006 года мы сидели и пили кофе в лаборантской. За этим занятием одному из моих коллег Антону Шульгину пришла в голову очередная, как тогда казалось, бредовая идея по доработке имеющегося тогда клиентской части (Web-интерфейса) тестирующей системы WebTester. Конкретно требовалось добавить возможность сортировки задач, объеденения их в группы (для упрощения поиска), и т.д. После недели споров я решил-таки сделать сию фичу и реализовал ее на файловой системе, основанной на сервере баз данных MySQL. Потом на ее основе написал сохранение мотниторов (состояний участников на определенном контесте, т.е. соревновании или олимпиаде). Подумалось - вкусная вещь, надо поглобальней ее заинтегрировать. Сказано - сделано. Не сразу конечно, но уже тогда зарождалась идея о динамическом ядре системы. Много ночей было просижено и в один прекрасный момент я сел за реализацию нового проекта из подготовленного комплекта скриптов.
Сначала я изучил внутреннюю структуру тогдашней тестирующей системы (автор - Василенко С.А.). Все, что мне в ней понравилось в ней: - простой и быстрый в реализации принцип хранения ассоциативных массивов в базе и реализация ДБФС - файловая система базы данных , которая, собственно, и взята оттуда. Этот прицип сериализации был хорош тем, что легко реализовывался как на PHP, так и на C, который изначально плохо предназначен для таких целей. Далее поразгребал основной сайт. Интересовала, в основном, библиотека виджетов - clib. Немного порылся и в форуме, но в итоге, большая часть кода писалась с нуля. Изначально статическим было только ядро vcl'a (аналога clib'а, в отличие от последнего являющимся набором макросов (для ускорения работы)). Все остальное было в базе. Сначала казалось, что это зорово, что это так и останется. Но... Наши надежды не оправдались - во время промежуточного тестирования выяснилось, что каждый раз прокручивается примерно 40 килобайт кода, который был раскидан по различным файлам, хранящимся в БД. Да - до страуса далековато... Добавление кэша к файловой системе не помогло - привязывать его к сессии нельзя (мало ли что бывает при параллельном редактировании - без обращения к базе все-равно не узнать), а обращений к одному файлу было очень мало (странно?). Но на самом-то деле это немного помогло, так как кэшировались идентификаторы каталогов, что ускоряло работу при обращении к потомкам этого каталога. Но все равно есть к чему стремиться. Тут в голову пришла мудрая мысль (наверное, первая за все время работы): перенести на статическую файловую систему и ядро, попутно развернув ftp-сервер или обычный windows-обменник для доступа из внешней части интернета. Переходим и... Скорость поднялась раз в 5. Как минимум. Жить, наконец-то, стало можно. Потом начались экзамены, поступления. Проект немножко приостановился.
Продолжил работу над системой с переписования основного файла стилей - и красивее стало, и стандартезированнее, и весить (занимать место на диске) стало меньше. Лепота... Но интерфейс мне, да и не только мне, честно сказать, не очень понравился. Конкретно смущала серая цветовая гамма и куча свободного места на страницах. Так как параллельно с этой системой создавался Сергеем Василенко новый школьный сайт, то мы решили сделать интерфейс тестирующей системы похожим на него (на Сегу ;)). Особенно порадовал новый логотип - стилизованная собачка (@). Во-первых, намек на принадлежность к интернету. Во-вторых, это что-то типа девятки в девятке (hyvä huomenta родная школа). Не считайте нас заядлыми символистами, но, согласитесь, в этом что-то есть... Переделали интерфейс, перерисовали иконки.. Получили вполне завершенную версию клиентской части тестирующей системы.
Но запустить его для всеобщего пользования так и не получилось. Во-первых, не была готова серверная часть тестирующей системы. Во-вторых, время идет, все развивается, потребности меняются, код постоянно улучшается.. Не то, чтобы получившийся Web-интерфейс был плохим, но можно было сделать много лучше.
Прошли очередные экзамены, и я вплотную взялся за написание серверной части системы. Основная часть кода ядра была взята из уже готовых проектов и черновиков, в том числе той Develop-версии сервера, который создавался параллельно с Web-интерфейсом. Но самая сложная в реализации часть - профилирование процессов (грубо говоря, слежение за использованием различных ресурсов) написана не была. Все осложнялось еще и тем, что никто из моих знакомых не знал, как это реализовывать, и на чем вообще базироваться. Остальной код был написан и даже отдебаган, но решение проблемы с профилированием так и не приходило. Появилось какое-то количество свободного времени, которое я занял переписыванием скриптов Web-интерфейса. Через некоторое время появился движок наподобие википедии. То есть велась полная история изменений страницы, настраиваемые права доступа к разделу, возможность вносить изменения в статью любым пользователям (которым такая возможность разрешена), ну и прочие вкусные вещи. Потом подумал: а почему бы и клиента тестирующей системы не перетянуть на этот движок? Ничего говорящего против этого я не нашел и работа закипела.. Ровно как закипела и работа над сервером. Как раз в это время появился следующий релиз ядра линукса, и при его конфигурировании была найдена такая вещь, как пересылка информации о процессе из окружения ядра в окружение пользователя. Эта опция имела по мимо статуса [NEW], статус [EXPERIMENTAL], но ждать, пока выйдет стабильная версия сией опции было неохота. На прочитывание пошло очередные n+t килобайт документаций, перепробовано куча вариантов, как лучше эту фичу использовать.. Но это уже было лишь вопросом времени.
Но вот сервер кое-как задышал, я немного напрягся и подвел клиента к стадии `можно тестировать. но только тестировать`. После этого потребовалось некоторое время на стабилизацию кода, устранение утечек памяти, и т.п. Работать в одном потоке тестирования он начал практически стабильно и, вроде как, без утечек памяти. Потом я уехал в лагерь, и тестировать там эту систему не представлялось возможным. Но свободного времени было довольно много, делать особо нечего, вот я и сидел и прочитывал исходные тексты сервера, исправлял опечатки, отлаживал сомнительные места, повышал читаемость кода. По возвращении домой откомпилил, немного додебагал, потом подшлифовал клиента, после чего стало можно во внутреннем круге показать это детище. Особо никто не ругался, кое-что кому-то даже понравилось, ну и решено было запускать эту систему. С серверной частью проблем особых не возникло, а вот клиент был внешне немного пустым, и эти пустоты надо чем-то закрывать. Собственно, чем я сейчас и занимаюсь. Благо движок системы позволяет делать это без особых усилий.
Автор системы, С. И. Шарыбин.