-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdiploma.tex
847 lines (732 loc) · 67 KB
/
diploma.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
\documentclass{matmex-diploma-custom}
\begin{document}
\filltitle{ru}{
chair = {Кафедра Системного Программирования},
title = {Разработка системы проверки упражнений для образовательной платформы},
type = {diploma},
position = {студента},
group = 545,
author = {Кладов Алексей Александрович},
supervisorPosition = {},
supervisor = {Луцив Д.\,В.},
reviewerPosition = {},
reviewer = {Вяххи Н.\,И.},
chairHeadPosition = {д.\,ф.-м.\,н., профессор},
chairHead = {Терехов А.\,Н.},
university = {Санкт-Петербургский Государственный Университет},
faculty = {Математико-механический факультет},
city = {Санкт-Петербург},
year = {2014}
}
\filltitle{en}{
university = {Saint Petersburg State University},
chair = {Department of Software Engineering},
title = {Quiz checking system for educational engine},
author = {Aleksei Kladov},
supervisorPosition = {senior lecturer},
supervisor = {Dmitry Luciv},
reviewerPosition = {},
reviewer = {Nikolay Vyahhi},
chairHeadPosition = {professor},
chairHead = {Andrey Terekhov},
}
\maketitle
\tableofcontents
% У введения нет номера главы
\section*{Введение}
Трудно представить современными мир без Интернета. Он используется в
разных сферах жизни с целью повышения удобства социальных
взаимодействий между людьми, улучшения качества услуг и расширения
возможностей каждого отдельно взятого человека. Не стала исключением
и сфера образования, электронная версия которой даёт пользователям
возможность слушать лекции, выполнять упражнения, читать конспекты, не
присутствуя физически в лекционной аудитории. Электронные
образовательные ресурсы получили такое большое распространение, так
как они позволяют получать качественное образование в удобном месте и
в удобное для себя время, причём с максимально комфортной
скоростью. Данный формат обучения получил название MOOC (Massive open
online course) --- массовый открытый online-курс.
Стоит обратить внимание на отличия электронного обучения от
традиционного. Во-первых, из-за большей доступности и удобства
учебного процесса количество слушателей курса может достигать
нескольких десятков тысяч человек, что существенно больше, чем в
обычном академическом потоке в университете, поэтому часто уделить
индивидуальное внимание каждому студенту не предоставляется возможным
\cite{breslow2013studying}.
Во-вторых, различие проявляется в подготовке и изменении учебного
материала. В университете преподаватель может изменять курс в
зависимости от успеваемости, предпочтений и количества студентов после
начала курса. В электронной версии изменять лекции заметно сложнее,
так как это потребует записи новых видеоуроков, подготовки новых
упражнений и, вероятно, изменения формата лекций. В связи с этим, чаще
всего курсы сразу готовятся высокого качества и уникальными для
каждого преподавателя и предмета. Большое внимание уделяется улучшению
восприятия информации: визуализации, анимации, хорошей дикции
преподавателя, электронным конспектам, дополнительным статьям,
субтитрам, видеопрезентациям. Все курсы тщательно прорабатываются,
поэтому потенциально электронное образование сможет стать хорошим
дополнением к традиционному, так как в сети уже сейчас находится
огромное количество качественного учебного материала.
В-третьих, студенты электронного курса склонны переоценивать свои
силы. Кроме того, пропадает мотивация из-за отсутствия понятия
<<академическая неуспеваемость>> как такового. Также на online-курс
проще записаться, чем поступить в университет, что порождает больший
спрос. Из-за отсутствия последствий непрохождения курса до конца и
личного общения с преподавателем пропадает и мотивация студентов курса
\cite{Clow}.
В-четвёртых, свободный формат позволяет студенту заниматься в удобное
для него время. Студент может скачивать лекции на мобильный телефон и
смотреть их в любом месте, выполнять и проверять результаты выполнения
домашних заданий вне урока, общаться со своими одногруппниками на
учебных форумах \cite{mak2010blogs} и т.п.
Если углубиться в историю, то можно проследить, что online-образование
начало развиваться параллельно с распространением персональных
компьютеров. Возможность получать знания удалённо и в новом формате
стала главным фактором в популяризации MOOC. Одним из первых примеров
дистанционных лекций стали уроки Уолтера Левина, профессора физики из
Массачусетского Технологического Университета (MIT), в 1982 году. Эти
лекции транслировались по кабельному телевидению и имели большой
успех. Он же в потом использовал для дистанционного чтения лекций
программу Skype. Затем MIT опубликовал большую часть своих учебных
материалов и запустил проект OpenCourseWare (OCW). С помощью OCW стали
распространяться многие материалы. Но OCW не является MOOC в
современном понимании этого слова. MOOC --- полноценный курс,
состоящий не только из лекций, но и из системы сдачи и проверки
упражнений и прочих необходимых инструментов. Первым
Интернет-ресурсом, предоставляющим MOOC в полной мере, стал
стартап-проект Udacity, запущенный, в свою очередь, с целью расширения
программы демократизации образования Стенфордского Университета. В
начале студентам предлагалось всего два курса: по написанию поисковых
машин и программированию беспилотных автомобилей. С тех пор формат
курса мало изменился: студент может записаться на любое количество
курсов до истечение сроков первого домашнего задания, по окончании
курса и при условии выполнения необходимого для зачёта минимума
упражнений студент получает электронный сертификат с подписью
преподавателя. С 2012 года в Udacity появилась возможность сдачи
очного экзамена за определённую плату.
В настоящее время самым успешным и популярным ресурсом,
предоставляющим MOOC-курсы является Coursera \cite{coursera}. Этот
ресурс позволяет проходить курсы почти по всем направлениям,
допускающим online-формат обучения: от фундаментальной математики до
истории изобразительного искусства. Формат курсов примерно совпадает с
форматом курса на платформе Udacity. Студент может записываться на
курс, после чего ему становятся доступны учебные материалы. Учебные
материалы представляют собой тематические наборы видеоуроков небольшой
продолжительности (около 10 минут). Блок может состоять из нескольких
уроков. Так же часто в дополнение к видеоурокам выкладывается
использованная в них презентация и текстовый конспект. По каждой теме
есть ряд домашних заданий с жёсткими сроками их выполнения. Курс может
быть последовательным (по 1-2 темы в неделю, на выполнение домашних
заданий даётся по 1-3 недели) и общим (все материалы доступны сразу,
домашние задания следует выполнить до окончания курса).
Стоит также заметить, что, несмотря на все плюсы, online-образованию
присущ ряд специфичных проблем:
\begin{itemize}
\item ограниченные возможности проверки знаний,
\item большая стоимость создания курса,
\item отношение количества студентов, закончивших курс, к количеству
студентов, записавшихся на него, как правило, очень маленькое.
\end{itemize}
\subsection*{Специфика online-обучения}
Как было сказано выше, у электронного обучения есть ряд проблем,
влияющих на его реализацию.
Из-за того, что упражнения должны проверяться автоматически, так как в
случае десятков тысяч студентов вручную проверять работы не
представляется возможным, теряется многообразие видов используемых
упражнений. Например, вопросы со свободным ответом проверять
затруднительно из-за индивидуальных особенностей формулирования и
выражения мыслей, пусть даже и формальных (в случае математических
доказательств). Не малой проблемой так же является большая стоимость
создания курса: запись видеолекций требует специального оборудования,
большого количества времени на съёмку и обработку: подготовка
электронного конспекта, инструкций для прохождения курса, написание
субтитров, презентаций и т.п. Всё это требует большого времени и
вложений. Немаловажной частью подготовки является разработка системы
упражнений.
Как было замечено выше, большая часть студентов, записавшихся на курс
его не заканчивает \cite{Clow}, что можно считать проблемой, так как
становится не до конца понятно, как с этой проблемой бороться, и стоит
ли. Так же нужно готовиться к большей нагрузке на сервер приложения,
так как до сдачи первого домашнего задания она сильно больше, чем
будет в среднем в курсе после истечения срока сдачи первых задач.
Стоит заметить, что в электронном образовании лекционный материал
может быть представлен очень хорошо, зачастую лучше, чем в аналогичном
по содержанию классическом курсе. Так как студент сам активно
взаимодействует с лекционным материалом, он может изучать его с
удобной для себя скоростью. Можно сказать, что лекции хорошо
<<масштабируются>> по количеству студентов. При этом практическая
часть обучения --- решение задач и выполнение упражнений --- в
электронном обучении реализуется значительно хуже. Дело в том, что, в
связи с большим количеством студентов, упражнения необходимо проверять
без участия преподавателя. Но не для каждого типа упражнения придуман
способ подобной автоматизации. Кроме того, проверять домашние задания
приходится чаще, чем в очном обучении, поэтому данная автоматизация
должна быть достаточно быстра.
\subsection*{Существующие платформы}
На данный момент существует большое количество платформ для размещения
MOOC. В таблице \ref{table:platforms} приведена информация о наиболее
интересных из них.
\begin{table}[t]
\centering
% BEGIN RECEIVE ORGTBL plat
\begin{tabular}{|l|c|c|}
\hline
& Год основания & Количество студентов \\
\hline
Udacity & 2011 & 1.6 млн. \\
Coursera & 2012 & 7.1 млн. \\
edX & 2012 & 2.1 млн. \\
\hline
\end{tabular}
% END RECEIVE ORGTBL plat
\caption{Год основания и число пользователей MOOC платформ на Май
2014 года}
\label{table:platforms}
\end{table}
\iffalse
#+ORGTBL: SEND plat orgtbl-to-latex :splice nil :skip 0
|----------+---------------+----------------------------------|
| | Год основания | Количество студентов |
|----------+---------------+----------------------------------|
| Udacity | 2011 | 1.6 млн. |
| Coursera | 2012 | 7.1 млн. |
| edX | 2012 | 2.1 млн. |
|----------+---------------+----------------------------------|
\fi
\begin{description}
\item[Udacity:] Первая платформа для MOOC \cite{udacity}. Формат
обучения практически совпадает с форматом в других
платформах. Предоставляет большой выбор тем курсов. На этой
платформе есть ряд сертифицированных Стенфордским Университетом
курсов, прохождение которых может быть зачтено в качестве сдачи
очного курса в Стенфордском университете. Многие студенты этим
пользуются, так как параллельно с очным курсом может идти другой
интересующий студента курс.
\item[Coursera:] Крупнейшая на настоящий момент платформа. Так же как и
на Udacity некоторые курсы в Coursera могут быть зачтены в некоторых
американских университетах в качестве зачёта по очному курсу
\cite{coursera}. Упражнения --- вариации Choice (выбрать ответ из
предложенных вариантов) и String (написать верную строку, будь то
отсортированный массив чисел или ответ на конкретный вопрос). Так же
в качестве ответа может быть использована математическая формула
(Math). Нет возможности давать домашние задания, ответами на которые
будут являться исходный код, текстовый файл и т.п. (Code, Dataset и
Sorting). Нет API для создания новых типов упражнений, поэтому
использовать в рамках курса можно только реализованный на платформе
типы упражнений. Зато можно подключать сторонние сервисы для
проверки упражнений через API. Например, таким сторонним сервисом
для проверки домашних заданий может являться платформа Stepic.
\item[edX:] Основан на Open edX --- платформе с открытым исходным кодом
\cite{edx}. Имеет API для расширения, в том числе и расширения
различными видами упражнений. Но он ограничен --- нет заранее
приготовляемых наборов входных данных, нельзя исполнять программный
код, введённый студентом в качестве ответа к задаче из домашней
работы.
\end{description}
Рассмотренные выше системы имеют очень широкое использование и,
казалось бы, удовлетворяют всем нуждам современного
online-образования. Но ограниченный набор возможностей давать
интересные и необычные домашние задания приводит к необходимости
искать новые решения. Этим решением является платформа Stepic.
\section{Платформа Stepic}
Платформа Stepic \cite{stepic} это молодой проект, развивающийся в
рамках сторонних проектов компании JetBrains. Разработка платформы
стартовала в 2013 году. На текущий момент работу над проектом ведут
семь человек. Сейчас её пользуются 23 тысячи студентов, несколько
курсов. На платформе создано более 400 уроков, многие из которых
объединены в курсы. Из завершившихся курсов стоит отметить следующие:
\begin{description}
\item[Алгоритмы в биоинформатике:] англоязычный курс, проходивший
единовременно с соответствующим курсом в проекте Coursera. В данном
случае платформа Stepic использовалась как дополнение к Coursera в
качестве подсистемы для упражнений. Курс состоял из большого
количества текстовых материалов и задач на программирование в
области алгоритмической биологии. В курсе приняли участие более 10
тысяч человек со всего мира.
\item[Алгоритмы и структуры данных:] русскоязычный курс, не доступный
без приглашения в настоящий момент, использовавшийся для
предварительной оценки знаний абитуриентов Computer Science Center в
Санкт-Петербурге. В нём приняли участие 500 человек из России. Курс
состоит из видео лекций и различных типов упражнений. Наиболее часто
использовались упражнения на программирование и упражнения со
свободным ответом.
\end{description}
\subsection{Возможности платформы}
Единицей учебного материала в платформе Stepic является урок. Урок ---
это набор упражнений и/или теории, представленный в виде
слайдов. Максимальное количество слайдов, которое можно использовать в
одном уроке --- 16 штук. Цель каждого урока --- изучить одну тему.
Уроки можно группировать в тематические курсы. Основными задачами
курса являются:
\begin{itemize}
\item Организация и упорядочивание уроков.
Как правило курс состоит из блоков уроков. Блоки могут формироваться
по определённой теме. Так в курсе по алгоритмам и структурам данных
удобно группировать уроки, посвящённые алгоритмам решающие схожие
задачи: алгоритмы сортировок, алгоритмы поиска подстрок в строке и
т.п. Кроме того уроки можно разбить на блоки, среднее выполнение
заданий из которых примерно равно. Так можно создать блок с уроками
на неделю, месяц и т.д.
\item Организация групп пользователей
Неотделимо от курса нужно рассматривать множество проходящих его
студентов. Курс можно запускать несколько раз, и платформа должна
уметь различать студентов, проходивших его в первый раз и во
второй. Кроме того, различными должны быть и рейтинговые таблицы
студентов, проходящих курс. Помимо хранения информации о студентах
надо устанавливать временные сроки, дающиеся на выполнение заданий.
\end{itemize}
Платформа Stepic ориентирована на интеграцию и сотрудничество с
другими инструментами online образования \cite{dagger2007service}, как
было в случае курса по биоинформатике. Для этого платформа реализует
ряд API, такие как:
\begin{itemize}
\item oEmbed: необходимо для встраивания почти на любую веб-страницу.
\item LTI: с помощью него есть возможность быть встроенным в Coursera.
Так было в курсе по биоинформатике, когда наша платформа
использовалась в качестве подсистемы проверки упражнений.
\end{itemize}
Отличительной особенностью платформы Stepic является разнообразие
предоставляемых типов упражнений (на данный момент более 8. Для
сравнения, на Coursera их около 4). В связи с этим очень важна
возможность и лёгкость расширения набора доступных разновидностей
упражнений, чтобы давать авторам курса наибольшую свободу в выборе
способа закрепления учебного материала путём выполнения домашних
заданий.
\subsection{Технологи и инструменты}
Платформа Stepic является клиент-серверным приложением. Взаимодействие
с пользователем, обработка вводов, реализация отображения страниц с
заданиями выполняется клиентской стороной. На сервере же происходит
проверка правильности решений студентов и генерация попыток.
\begin{itemize}
\item \textbf{Server side}:
Серверная часть разрабатывается на языке Python3. Основу составляет
веб-фреймворк Django. При этом Stepic как приложение представляет
собой rich web application (RWA), поэтому сервер только
предоставляет REST API \cite{rest}, при помощи Django REST
framework, а вся логика представления страниц и материала описана в
клиентской части.
Для обеспечения масштабируемости была использована библиотека
Celery, которая позволяет распределять выполнение заданий по многим
процессам, не обязательно в рамках одной машины.
Для нужд подсистемы упражнений также были использованы библиотека
SymPy для символьных вычислений и инструмент AppArmor для
обеспечения изоляции исполнения кода.
\item \textbf{Client side}:
Клиентская часть разрабатывается на языке CoffeeScript. Как уже
упоминалось, именно на клиентскую часть ложится вся забота о
взаимодействии с пользователем --- генерация html страниц, обработка
ввода, отправка запросов к серверу. Поэтому для неё был выбран
client side фреймвок Ember.js.
\end{itemize}
Платформа располагается на сервере облачных вычислений Amazon AWS.
\section{Постановка задачи}
Целью данной работы является реализация системы для создания и
проверки упражнений в образовательной платформе Stepic, с возможностью
лёгкого добавления новых типов упражнений, в том числе и сторонним
разработчикам.
Для достижения этой цели были сформулированы следующие задачи:
\begin{itemize}
\item Обеспечить возможность лёгкого расширения набора типов
упражнений сторонними разработчиками (реализовать соответствующий
API к платформе Stepic и фреймворк для разработки).
\item Реализовать с помощью разработанного фреймворка в платформе
Stepic типы упражнений, часто встречающиеся в других образовательных
платформах и проверить их работу на практике.
\item Реализовать возможность масштабирования и изолированного
исполнения потенциально не безопасного кода упражнений.
\end{itemize}
\section{Фреймворк для создания новых типов упражнений}
\subsection{Общий вид упражнения}
Разработка фреймворка была начата с анализа упражнений в различных
платформах, таких как Rosalind \cite{rosalind}, Coursera
\cite{coursera}, edX \cite{edx} и Udacity \cite{udacity}. В результате
изучения существующих типов упражнений в этих платформах было
выявлено, что взаимодействие пользователя с упражнением можно описать
набором следующий общих шагов:
\begin{description}
\item[Шаг 1.] Пользователь читает условие упражнения. Условие
представляет собой текст определённого формата. При этом в условие
можно внедрять параметры упражнения, например ограничения или
примеры решений для маленьких наборов данных.
\item[Шаг 2.] Пользователь нажимает на кнопку <<начать решать>>.
После этого ему представлен один из вариантов входных данных. Формы
представления входных данных могут сильно отличаться. Например, это
может быть ссылка на файл, или набор возможных вариантов
ответов. Часто бывает так, что входных данных вообще нет, то есть,
при каждой попытке верным будет один и тот же ответ.
\item[Шаг 3.] Пользователь вводит свой ответ. Вид ответа также зависит
от упражнения. Например это может быть слово или словосочетание на
естественном языке, математическая формула, фрагмент кода на
каком-нибудь языке программирования или список вариантов.
\item[Шаг 4.] Пользователь нажимает на кнопку <<отправить>>. В этом
случае, сначала происходит первичная проверка ответа на
корректность. Если ответ очевидно не корректный (например, ответ
просто пустой) то, скорее всего, кнопка была нажата случайно. В этом
случае пользователю предлагается ввести ответ. Если же первичная
проверка ответа прошла успешно, то он отправляется на сервер, где
происходит проверка.
\item[Шаг 5.] В результате этой проверки оценивается правильность
ответа. Её можно оценивать по шкале от 0 до 1 и в случае
необходимости переводить этот первичный балл в любую шкалу. Также
иногда необходимо дать комментарий к ответу пользователя. Например,
если пользователь совершил часто встречающуюся ошибку, то можно
объяснить, почему этот вариант ответа является неверным.
\item[Шаг 6.] Пользователь видит оценку и подсказку, если она есть.
\end{description}
Не трудно заметить, что совершаемые шаги достаточно однообразны для
каждого упражнения, а так же в ряде случаев могут быт оптимизированы
по скорости проверки ответа или по скорости генерации новых входных
данных.
Пользователь может совершить несколько попыток сдачи задания за
достаточно короткий промежуток времени. Входные данные упражнения
отличаются от попытки к попытке и генерируется случайным образом на
сервере. При этом для некоторых типов упражнений создания входных
данных может занимать существенное время. Поэтому целесообразно
создавать набор входных данных заранее, и в момент начала решения
мгновенно выдавать пользователю заранее заготовленный экземпляр
входных данных.
В принципе, для проверки решения пользователя должно быть достаточно
входных данных, ведь из них можно получить правильный ответ, решив
задачу на сервере предложенным автором упражнения способом. Однако
стоит обратить внимание на то, что проверка ответа в таком случае
может быть долгой, ведь будет необходимо заново решить
упражнение. Вместе с тем, проверку надо выполнять быстро, чтобы как
можно быстрее обеспечить пользователю обратную связь. Таким образом,
оказывается эффективным и удобным вместе с входными данными создавать
ключ к ним, который позволяет быстро проверить правильность решение
пользователя.
\subsection{API для создания упражнения}
Из описанных выше шагов можно выделить следующий общий набор операций,
необходимых для работы любого упражнения:
\begin{description}
\item[Создание экземпляра упражнения из исходных данных.]
У упражнения есть исходный код. Нужно проверить, что этот код
корректен. В случае реализации Dataset-упражнения, нужно проверить,
что правильно прегенерируются входные данные. На этом этапе
проверяется, способен ли код автора упражнения создавать экземпляры
упражнения.
\item[Создание пары (входные данные, ключ)]
Дальше с помощью созданного экземпляра упражнения мы создаём пары
(входные данные, ключ) и сохраняем их в базу данных для последующего
использования.
\item[Отображение входных данных для пользователя.]
Помимо текста задачи мы должны отобразить входные данные в
интерфейсе упражнения. Для упражнений типа Sorting это некоторая
перестановка данных. В случае упражнения типа Dataset - кнопка,
нажав на которую начнётся загрузка входных данных на компьютер
студента.
\item[Получение ответа пользователя.]
Помимо выведения входных данных, мы должны уметь получать ответ
пользователя. В случае упражнений типа Math, String, Dataset (так же
доступна опция загрузки на сайт текстового файла), Code ответом
пользователя будет являться строка, написанная в поле ввода. В
случае Choice --- состояние флагов предложенной выборки.
\item[Первичная проверка ответа.]
Часть ответов можно даже не проверять, заведомо зная, что они
неверны. Например, ответом на задачу типа Number не может быть
пуская строка, в случае Choice, где нужно выбрать хотя бы один
вариант --- выбран ровно один вариант и т.п.
\item[Проверка ответа пользователя при помощи ключа.]
Происходит проверка правильности результата. Так же в этот метод
входит оценка правильности вещественным числом из интервала $[0, 1]$
и генерация текстовой подсказки.
\end{description}
Данным API будут пользоваться не только разработчики платформы Stepic,
но и авторы курсов, которые могут прекрасно разбираться в своей
предметной области, но не быть знакомыми с особенностями реализации и
устройства Stepic. Поэтому для подсистемы упражнений крайне важна
простота и модульность. В связи с этим каждый тип упражнения --- это
модуль, никак не зависящий от остальной платформы и других
упражнений. Более того, эти модули можно использовать и без платформы
Stepic.
Коллекция реализаций существующих модулей доступна на сайте GitHub в
публичном репозитории \cite{plugins:repo}. Репозиторий открыт для
добавления новых модулей любыми разработчиками.
\subsection{Архитектура решения}
Привлекательной кажется идея реализовывать упражнения целиком на
стороне клиента, и сообщать на сервер только результаты проверки. Это
позволило бы реализовывать упражнения целиком на одном языке, и
обеспечило бы хороший опыт взаимодействия, так как не было бы задержек
из-за коммуникации между клиентом и сервером. Однако у такого решения
есть существенные недостатки. Во-первых, можно легко симулировать
решение упражнения, не решая его. Во-вторых, для решения некоторых
упражнений может понадобиться существенные вычислительные
затраты. В-третьих, не все задачи можно решить в браузере. Исходя из
этих причин для реализации упражнений была выбрана клиент-серверная
архитектура, в которой клиентская часть отвечает только за
взаимодействие с пользователем, а сервер за создание входных данных и
проверку ответов. При этом клиент общается с сервером при помощи
ajax-запросов, и поэтому для работы упражнения не требуется
перезагрузка страницы.
Для ускорения упражнений используется банк попыток --- набор заранее
созданных пар (входные данные, ключ). Исполнение потенциально не
безопасного кода упражнений осуществляется в изолированных песочницах.
На Рис. \ref{fig:fig1} изображена схема архитектуры решения.
\begin{figure}[h]
\centering
\includegraphics[width=0.7\textwidth]{../res/arch.pdf}
\caption{Архитектура решения}
\label{fig:fig1}
\end{figure}
\subsection{Детали реализации модуля упражнения}
Для сохранения данных упражнений был выбран формат JSON. Он удобен по
двум причинам. Во-первых, для добавления нового типа упражнений нет
необходимости менять схему базы данных, что позволяет отделить
упражнения от остальной платформы. Во-вторых JSON можно использовать в
качестве формата сообщений, которыми общаются клиент и сервер.
Для реализации серверной части модуля выбран язык Python 3. Это
простой и удобный язык высокого уровня, главное преимущество которого
заключается в уменьшении затрат на разработку модулей \cite{pyprod}.
Для того, чтобы создать cерверную часть модуля разработчику упражнения
необходимо определить на языке Python наследника класса BaseQuiz.
Также при помощи eDSL необходимо описать JSON формат для исходных
данных упражнения, входных данных и ответа.
Клиентская часть реализуется на JavaScript или на CoffeeScript. Для
реализации клиентской части упражнения необходимо определить функции
отрисовки начальных данных для интерфейса редактирования и функции
отрисовки входных данных и ответа для интерфейса решения. Также есть
возможность создавать клиентскую часть упражнения в виде компоненты
Ember.js.
\subsection{Инструменты для разработки}
Для упрощения разработки модулей упражнений был создан ряд
инструментов:
Сервер для разработки, который позволяет запускать упражнения без
Stepic. Сервер автоматически перезагружается при изменении исходного
кода. С его помощью можно проверить как серверную, так и клиентскую
части модуля упражнения.
Шаблоны упражнения, на основе которого можно быстро начать
разрабатывать свой модуль, поэтапно изменяя методы отрисовки и
генерации входных данных.
Документация для разработчиков \cite{plugins:doc}.
\section{Реализованные типы упражнений}
С помощью фреймворка в платформе Stepic были разработаны следующие
типы упражнений, использующиеся для курсов, проходящих в данный
момент:
\begin{description}
\item[Choice] --- выбор ответа из списка предложенных вариантов.
\item[Code] --- написание программы для эффективного решения задачи.
\item[Dataset] --- машинная обработка входных данных.
\item[Free Answer] --- свободный ответ.
\item[Math] --- проверка символьной формулы.
\item[Number] --- числовой ответ.
\item[Sorting] --- упорядочивание предложенного набора.
\item[String] --- проверка ответа при помощи регулярного выражения.
\end{description}
На Рис. \ref{fig:fig2} показан экран с упражнением типа Code, где
указаны ограничения по ресурсам, пример сходных и выходных данных и
показана четкая формулировка задачи. Так же галочка свидетельствует об
успешности попытки сдачи упражнения. В противном случае, на её месте
бы находился красный крестик, а внизу, если это необходимо, подсказка.
\subsection{Примеры конкретных упражнений и их использование}
\begin{figure}[h]
\includegraphics{../res/quiz.png}
\caption{Пример упражнения типа Code}
\label{fig:fig2}
\end{figure}
Рассмотрим возможности фреймворка на примере некоторых упражнений,
представляющих наибольший интерес с точки зрения разработки, а так же
часто встречающихся в других образовательных платформах.
\begin{description}
\item[Choice] При выполнении упражнения студент должен выбрать среди
предложенных вариантов ответа правильные. Этот тип упражнений имеет
много опций: размер выборки из возможных вариантов ответов (как
правильных, так и не правильных), её случайность, количество
правильных ответов в выборке. Это наиболее часто встречающийся в
различных платформах тип упражнения из-за простоты реализации со
стороны платформы и со стороны авторов курсов. Однако у него есть
свои недостатки, а именно: студент может просто угадывать правильные
ответы и студент не может придумать своё, по настоящему
оригинальное, решение.
\item[Dataset:] При выполнении данного упражнения предлагается, что
студент, скачав текстовые входные данные, даст ответ в качестве
текста. Этот тип упражнений подходит для некоторых упражнений на
программирование в случаях, когда студенту необходимо использовать
определённые инструменты или когда нет нужды проверять эффективность
решения. Этот тип упражнения предполагает использование любых
средств для решения задачи, но несмотря на это размер входных данных
у упражнений такого типа не может быть сильно большим, чтобы их
удобно было скачивать через Интернет, а затем проверять. Кроме того,
давая такие упражнения студентам, становится сложно
проконтролировать эффективность пользовательского решения. И помимо
это студенту необходимо иметь весь необходимый инструментарий для
разработки у себя на компьютере.
\item[Code:] Является дополнением Dataset-упражнений. Выполняя это
упражнение, студент должен предоставить в качестве решения
работающий код на каком-то конкретном языке программирования. Код
затем будет исполнен на сервере, с замерами времени и памяти. Это
удобно для проверки эффективности решения, однако необходимо решать
задачу на одном из поддерживаемых языков программирования (Java,
Python, C++, Octave, Haskell).
\end{description}
Созданные с помощью реализованного фреймворка упражнения были успешно
использованы на практике, причём для разных курсов как правило
используются разные наборы упражнений. Например, в курсе <<Алгоритмы в
биоинформатике>> большую часть упражнений составляли упражнения типа
Dataset. Этот тип упражнений оказался наиболее удобным, так как
позволяет создавать в качестве заданий задачи на обработку больших
объёмов данных, что характерно для биоинформатики. В тоже время для
решения можно было использовать любой язык программирования. В свою
очередь в курсе <<Алгоритмы и структуры данных>> большую часть
упражнений составляли упражнения типа Code и Free Answer. Упражнения
типа Code оказались удобны, так как позволяют строго ограничить
решения по времени и памяти, что необходимо для проверки эффективности
реализации алгоритмов. Упражнения типа Free Answer использовались для
теоретических задач, где свободный ответ содержал доказательства или
идею алгоритма.
\subsection{Пример использования фреймворка сторонним разработчиком}
Стоит так же упомянуть, что данный фреймворк используется не только
для реализаций упражнений в платформе Stepic. В мае 2014 компанией
JetBrains было организовано мероприятие, посвящённое информационным
технологиям в образовании. В рамках этого мероприятия участникам нужно
было представить прототип проекта, который бы помогал использовать
IT-технологии для улучшения процесса и качества образований.
Одним из участников мероприятия для реализации проекта было
использовано реализованное в рамках данной работы API, и был создан
новый тип упражнения Admin для курса по системному администрированию
ОС Linux. Данное упражнение использует сторонний сервис на базе Open
Stack, позволяющий конфигурировать учебный Linux-сервер с помощью
командной строки. Задача упражнения --- выполнить настройку
определённого ПО на сервере. Для проверки правильности выполненного
задания надо определить набор тестов, который должен пройти
Linux-сервер после конфигурации.
Модуль упражнения Admin взаимодействует со сторонним сервером по
протоколу HTTP. Стоит заметить, что при разработке API модулей
упражнений возможность коммуникации со сторонними сервисами не
рассматривалась, тем не менее, API оказалось достаточно удобным и для
этого случая.
Таким образом с помощью фреймворка можно создавать самые разнообразные
типы упражнений, расширять их функциональность и задействовать для
этого сторонние инструменты.
\section{Изолированное исполнение кода упражнений}
Для работы многих важных типов упражнений необходимо исполнять
потенциально не безопасный код. Из упражнений, реализованных в на
данный момент Stepic, такими типами являются следующие:
\begin{description}
\item[Dataset] Генерация входных данных и проверка ответа происходит
при помощи кода, написанного на языке Python, автором которого
является автор упражнения, что в случае открытого API для создания
упражнений может привести к исполнению некорректного кода.
\item[Code] Также как и в предыдущем случае необходимо выполнять
Python-код автора упражнения. Но для проверки ответа также
необходимо запустить код студента, который был отправлен в качестве
ответа на вопрос задачи. Код студента может быть не только на языке
Python, но и на другом языке программирования, поддерживаемом в
платформе Stepic (например на Java или на Haskell).
\item[Math] В упражнении этого типа производится сравнение
математических формул при помощи библиотеки SymPy. Библиотека SymPy
может быть не безопасна, так как она использует функцию eval
(Python), которая позволяет исполнить любой код, в том числе
некорректный.
\item[String] В упражнении этого типа для проверки можно задавать
регулярное выражение. Во многих современных языках программирования
проверка строки на соответствие регулярному выражению имеет
экспоненциальную сложность, что может привести к DOS атаке.
\end{description}
Таким образом возникает необходимость обеспечивать изолированное и
ограниченное по ресурсам исполнение кода упражнения. Код, безопасное
исполнение которого мы должны гарантировать, может быть написан на
языке Python или на другом компилируемом или интерпретируемом языке
программирования, допустимым для решения того или иного задания или
поддерживаемого в платформе Stepic.
\subsection{Изоляция исполнения кода}
За основу при реализации подсистемы безопасного исполнения года была
взята библиотека CodeJail. CodeJail основывается на инструменте
AppArmor --- безопасном \cite{Bauer} и удобном для использования
\cite{Schreuders} средстве мандатного управления доступом. Также
CodeJail предоставляет интерфейс для использования в Python, на
котором ведется разработка в Stepic.
Использовать библиотеку CodeJail как есть не удалось, так как она не
удовлетворяет следующим требованиям:
\begin{itemize}
\item Совместимость с Python3.
Библиотека CodeJail написана на языке Python2 и не работает с
версией языка, которая используется при разработке Stepic.
\item Поддержка компилируемых языков программирования.
Библиотека CodeJail позволяет запустить исходный код пользователя
при помощи любого интерпретатора, однако не позволяет его перед этим
скомпилировать.
\item Наличие сообщений о превышении допустимых ограничений на
ресурсы.
Если программа завершается из-за превышения ресурса времени или
памяти, то об этом не сообщается. С точки зрения пользователя она
просто завершена.
\end{itemize}
Для решения вышеперечисленных проблем библиотека CodeJail была
существенно расширена, а именно: портирована на Python3, с добавленной
поддержкой компилируемых языков программирования и улучшенными
сообщениями об ошибках.
Также были созданы профили AppArmor для Java, Python, Octave и
компилируемых языков программирования, таких как С++ и Haskell.
\subsection{Масштабирование}
Важным требованием к системе проверки упражнений является её
масштабируемость. В каждом курсе участвует большое количество
студентов, многие из которых сдают упражнения. Быстрое получение
результата попытки сдать упражнение приводит к тому, что для сдачи
упражнения совершается большее количество попыток в менее короткий
срок. Более того, нагрузка сильно не равномерная --- в последний
возможный день сдачи упражнения можно наблюдать большой пик попыток
\cite{breslow2013studying}.
В качестве инструмента для масштабирования была выбрана реализация
распределённой очереди задач Celery, так как она позволяет
масштабироваться эффективно \cite{celery}.
Эффективность решения была проверенна экспериментально. В эксперименте
измерялось время создания 60 попыток для упражнения типа Code в
зависимости от количества потоков-обработчиков. Результаты измерений
приведены в таблице \ref{table:scal}.
\begin{table}[h]
\centering
% BEGIN RECEIVE ORGTBL scal
\begin{tabular}{|c|c|}
\hline
количество процессов & время выполнения \\
\hline
1 & 37 с \\
2 & 20 с \\
4 & 8 с \\
\hline
\end{tabular}
% END RECEIVE ORGTBL scal
\caption{Эффективность масштабирования}
\label{table:scal}
\end{table}
\iffalse
#+ORGTBL: SEND scal orgtbl-to-latex :splice nil :skip 0
|----------------------+------------------|
| количество процессов | время выполнения |
|----------------------+------------------|
| 1 | 37 с |
| 2 | 20 с |
| 4 | 8 с |
|----------------------+------------------|
\fi
% У заключения нет номера главы
\section*{Заключение}
В результате проделанной работы все поставленные цели были достигнуты.
Был разработан фреймворк для создания новых типов упражнений в виде
подключаемых модулей. В состав фреймворка также входят шаблон для
начала разработки упражнения, набор примеров для демонстрации
возможности API и сервер для локального запуска и тестирования
упражнений. С подробной документацией фреймворка можно ознакомится в
\cite{plugins:doc}.
С использованием данного фреймвока были разработаны следующие типы
упражнений: Choice, Code, Dataset, Free Answer, Math, Number, Sorting,
String. Эти типы упражнений были успешно использованы в курсах
<<Алгоритмы в биоинформатике>>, <<Алгоритмы и структуры данных>> и
других. Специальный тип упражнения Admin для курса по системному
администрированию Linux был создан сторонним разработчиком, в рамках
мероприятия Хакатон \cite{hackathon}. Был опубликован репозиторий со
всеми существующими модулями \cite{plugins:repo} и их реализацией.
На основе библиотеки CodeJail и инструмента AppArmor была создана
система безопасного исполнения кода с возможностью ограничения и
измерения затраченных ресурсов. Эта система была использована при
создании упражнений типа Code, Dataset, Math и String. При помощи
библиотеки Celery было достигнуто масшабируемое и распределённое
исполнение кода упражнений.
\clearpage \addcontentsline{toc}{section}{Список литературы}
\bibliographystyle{ugost2008ls} \bibliography{diploma.bib}
\end{document}
%%% Local Variables:
%%% coding: utf-8
%%% mode: latex
%%% TeX-engine: xetex
%%% End: