<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Designing a DBMS Development Course with Automatic Assignment Evaluation</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Viacheslav Galaktionov1, 2</string-name>
          <email>viacheslav.galaktionov@gmail.com</email>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>George Chernishev1, 2, 3</string-name>
          <email>g.chernyshev@spbu.ru</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>1 JetBrains Research, 2 National Research University Higher School of Economics, 3 Saint-Petersburg State University</institution>
          ,
          <addr-line>Saint-Petersburg</addr-line>
          ,
          <country country="RU">Russia</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>1 JetBrains Research, 2 Saint-Petersburg State University</institution>
          ,
          <addr-line>Saint-Petersburg</addr-line>
          ,
          <country country="RU">Russia</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>-Due to the constantly growing amount of data in the world, we need better ways to process it. Conducting research and development in this area requires skilled workforce. Different universities provide different courses to prepare people for this line of work. In this paper we present our approach to conducting practice sessions within a DBMS development course. We describe some of the approaches implemented by other universities, outlining their advantages and disadvantages. A popular approach is to provide students with a prototype of some DBMS and let them incrementally improve it by completing certain tasks. The two most important problems in these courses are 1) choosing a DBMS (an industrial or educational one), within which students should work; 2) deciding whether to employ an automated testing system, and, if so, which one. In both cases we take a look at several options and justify the necessity to create a new one, which we then describe. In total, we have developed the following: a base prototype of a row-store query executor, an automated testing system, a set of problems along with reference solutions and test cases. Finally, we present the results of a test run involving 17 undergraduate students. Index Terms-education courses, education, databases, query engine, query processing, database internals</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>
        1) Introductory courses, that explain a specific set of
basic terms. Usually such courses consider the classic Conducting advanced database courses is not a new
probrelational model and teach the students to apply it, lem, there are publications describing experience of many
unibut sometimes they can include information on various versities [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]–[
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]. The referenced papers provide two different
NoSQL systems. viewpoints on how such a course should be organised:
      </p>
    </sec>
    <sec id="sec-2">
      <title>I. INTRODUCTION</title>
      <p>
        It is well-known that the amount of data that needs to
be processed is increasing with an unprecedented speed [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ].
This is mostly related to the emergence of such areas as
Big Data, the Internet of Things and cloud computing. The
research of existing data storage and processing methods and
the development of new ones are thus becoming more and
more important.
      </p>
      <p>Naturally, conducting said research and development
requires a great amount of highly-qualified workforce. Preparing
such cadres is an important task that perhaps all universities
attempt to accomplish.</p>
      <p>There is a multitude of courses aimed at improving
qualifications in subjects related to databases. They can be divided
into two categories:
2) Advanced courses, whose main task is to teach students
to actually develop DBMSes. A lot of attention is paid
to the internals of one or several classes of systems, as
well as the most important algorithms. Student either
develop their own system from scratch or modify an
existing one.</p>
      <p>Evidently, these two categories serve different purposes and
as such have to be taught differently. Let us concentrate on
the advanced courses in this paper. A question arises: how
should one organize such courses? Clearly, just giving lectures
to the student will not be enough because of the practical
nature of the covered topics. The students need to be given an
opportunity to apply their new knowledge in order for them to
fully understand the material. This means that special attention
should be given to practice sessions. In this paper we present
our approach to conducting practice sessions within a DBMS
development course.</p>
      <p>The contribution of this paper is the following:
1) An overview of some of the approaches to conducting
practice sessions within advanced database courses used
in different universities.
2) The structure of our approach: the overall idea of the
course, the used DBMS prototype, the task set, approach
to testing students’ solutions.
3) The results of the test run of our course, a description
of our experience and the encountered issues.</p>
      <p>This paper is structured as follows. In Section II we describe
various DBMS development courses. Next, in Section III we
discuss overall architecture of our approach, and in Section IV
we enumerate various security measures that we undertook.
The syllabus of our course and the idea of proposed tasks is
described in Section V. The Section VI presents the outcome
of the first test run, justifies the benefits of our approach and
describes the encountered issues. The future work and
conclusion are presented in Sections VII and VIII, respectively.</p>
    </sec>
    <sec id="sec-3">
      <title>II. RELATED WORK</title>
      <p>
        1) Students of the course described in [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ] had to modify published by third parties, which makes it easy for students
PostgreSQL, a DBMS used in the industry. However, to cheat. The latter, MinSQL, has never been made public.
due to complexity of PostgreSQL’s architecture, only Therefore, we have decided to develop our own educational
two of the tasks required students to actually modify DBMS.
      </p>
      <p>
        its code. Another important problem is grading students’ work. In the
2) On the other hand, the course described in [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ] employed case of complex systems like DBMSes it becomes too difficult
a DBMS developed specifically for it, SimpleDB. It was to assess the code by just reading it. Some form of automated
made with code clarity in mind, sacrificing performance testing is required. Trusting the student to write their own tests
where necessary. This allowed students, who were new is not an option, and handing out tests to students could lead
to the subject, to find their bearings in the code and to them writing code that’s designed to pass the tests instead
start modifying it. Because of this, the number of of actually solving the problems.
programming-related tasks in this course was 9. A more correct and modern approach is to allow the
A similar approach is being used at Harvard [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ] right students to upload their code to some testing system, which
now. There, students implement their own main-memory runs various tests on it. Besides testing for correctness and
column-store. They cover such topics as indexing meth- performance, such a system can recognize different kinds of
ods optimized for main-memory and shared scan meth- cheating: copying others’ solutions, DoS attack, etc.
ods. During the class hours students discuss state of the This approach is very popular with programming contests
art research papers. and online courses. In both cases there is a stream of solutions
In Russia such courses also exist. In 2004 the South that is too large for a group of people to evaluate in a
Ural State University offered a course “Parallel database reasonable time period.
systems” [7], where students had to develop their own Of course, automated testing is used outside of these areas
prototype of a parallel database management system as well. Code quality is an important characteristic of any
using the MPI standard. In the Computer Science software, so it receives a lot of attention. There are industrial
Center [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] course “Software engineering for big data” systems for automated code testing.
students were offered to implement a distributed key- We have evaluated multiple systems from different areas.
value data store and an application. The assignment Let us summarize our findings:
encouraged team participation1 and there were 4 tasks 1) Programming contest platforms. We have considered
overall. Several years ago Innopolis Univeristy also Yandex.Contest [
        <xref ref-type="bibr" rid="ref11">12</xref>
        ] and Codeforces [
        <xref ref-type="bibr" rid="ref12">13</xref>
        ], which are the
offered [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ] a three-week assignment for building a sim- most popular platforms in Russia. These systems are
plified relational query engine in Python. This project capable of testing the code for correctness, performance,
was aimed for team participation also. To the best of and are also protected against DoS attacks. However,
our knowledge, both these courses involved manual they are expect the users to provide a single source
checking of the solutions. file. This becomes a problem with complex systems like
DBMSes. It is possible to put the entirety of source code
into one file, however, that is not something we want to
teach our students.
2) Online course platforms. This area was represented in
our research by Stepik [
        <xref ref-type="bibr" rid="ref13">14</xref>
        ] and Coursera [
        <xref ref-type="bibr" rid="ref14">15</xref>
        ]. They
exhibit the same problem as the programming contest
platforms. However, they have additional disadvantages.
      </p>
      <p>For example, to the best of our knowledge, it is
impossible to create a private Coursera course. Furthermore,
3) Industrial testing systems. We have looked at Travis</p>
      <p>
        CI [
        <xref ref-type="bibr" rid="ref15">16</xref>
        ] and Jenkins [
        <xref ref-type="bibr" rid="ref16">17</xref>
        ]. While they provide exceptional
testing capabilities, they are not well-suited to track
students’ progress.
      </p>
      <p>Due to the lack of a system that would meet all our
requirements, we have decided to implement our own.</p>
      <p>The second approach appears to be more desirable, as it is
both easier for the students and more saturated, i.e. instead of
simply reading about different algorithms and approaches, the
students will have to actually implement them.</p>
      <p>
        Another advantage of the second approach is that the
students are given an opportunity to improve their skills
related to systems programming as well as complex system
development [
        <xref ref-type="bibr" rid="ref7">8</xref>
        ], [
        <xref ref-type="bibr" rid="ref8">9</xref>
        ].
      </p>
      <p>Because of the aforementioned reasons we have decided to
take the second approach. However, that raises the question:
which DBMS should we use? SimpleDB itself is hardly an
option, since it puts a lot of attention on multi-user operation,
which is not very interesting for us but complicates the code
somewhat.</p>
      <p>
        We have considered other systems as well: Minibase [
        <xref ref-type="bibr" rid="ref9">10</xref>
        ]
and MinSQL [
        <xref ref-type="bibr" rid="ref10">11</xref>
        ]. The former provides a great set of features
and comes in two version: Microbase, which is freely available
to everyone but has a heavily restricted feature set, and
Minibase, the full version, which is available only to teachers.
      </p>
      <p>However, the source code for the full version has already been</p>
    </sec>
    <sec id="sec-4">
      <title>III. TESTING SYSTEM ARCHITECTURE</title>
      <p>Our system is organized as a set of Docker containers.
The system provides a web interface, where the students can
submit their code for testing and the teacher can track their
progress. The main parts of the system are as follows:
1) Web server. The system has two kinds of user accounts:
for students and for teachers. The interface is structured
1https://github.com/alesavin/csc-bdse
differently depending on who the user is. The student
will see a list of tasks, some of which will be marked as
completed if they have submitted a solution that passed
all tests successfully. The teacher can add and remove
students from the course, make various changes to the
problem set, and track the students’ progress.
2) Database. We use PostgreSQL to store the information
on students, tasks, and submissions. We also use it to
organize the testing queue, which will be described later.
3) Testing queue. This module acts as a mediator between
the web server and the testing container. It is also
responsible for storing the uploaded solutions on disk.
The testing queue provides an HTTP API that is used
by the web server whenever a student uploads a new
solution or whenever someone wants to download a
previously submitted solution.
4) Testing container. Completely isolated from the rest
of the network, this module encapsulates building and
running the code. The entrypoint of that container is a
script that will unpack and compile the code and then
run our testing program. This program will run a set of
queries and check their results, meanwhile providing a
log that can help the students understand how and why
their code failed. However, this log is very concise and
does not provide the student with all information about
errors in order to keep the test data secret.</p>
      <p>The diagram of interaction between different parts of the
system is presented in Figure 1. Note that only the web server
has access to the Internet.</p>
      <p>The testing system was written in the Go programming
language. The net/http and html/template packages from its
standard library were used to implement the web interface
and the testing queue logic.</p>
      <p>Now that we’ve covered the structure of our system, let us
describe how it operates when a student submits a solution.
First of all, the web server will receive the code archive and
pass it to the testing queue via its API. Then, the testing queue
will save the archive on disk, and then add two records to the
database: one that describes the submission itself, and one that
describes the testing result.</p>
      <p>The testing queue process contains a set of coroutines, each
of which periodically queries the database for submissions
that need to be tested. If there is a solution that is ready to
be tested, the coroutine will get a lock on the corresponding
database record, and start a testing container. This container
will be limited in its resources such as the amount of RAM or
execution time. These limits are configurable via the teacher’s
web interface on a per-problem basis.</p>
      <p>Once the testing container stops working, the coroutine will
determine why it stopped and assign the submission one of
the following grades: accepted, invalid answer, runtime error,
timeout, compilation error. After that both the grade and the
log are saved in the database and the testing queue starts
waiting for a new task.</p>
      <p>This process is depicted in Figure 2. Solid arrows represent
the path that a student’s code archive follows within our
testing system when it is uploaded. Dash arrows represent the
behaviour of a coroutine that is responsible for checking this
solution.</p>
    </sec>
    <sec id="sec-5">
      <title>IV. SECURITY MEASURES</title>
      <p>Any user facing system should be sufficiently protected
from different kinds of attacks. Of course, our system is no
exception. A lot of attention has been given to protecting the
system from malicious behaviour that can be exhibited by
some students. Let us go over some of the precautions taken:
1) Our system works only over HTTPS. This helps us
prevent traffic-sniffing in order to steal passwords, for
example.
2) Testing containers are limited in their resources: RAM,
the number of PIDs, disk space. These limits help us
prevent fork-bombs and memory floods.
3) By leveraging access rights we prevent the student’s
code from being able to write into the log generated
by the testing program, thus preventing data leaks.
4) To prevent data loss, backup copies of all essential files
were made daily.</p>
      <p>V. SYLLABUS</p>
      <p>The course was designed with undergraduate students in
mind. Thus, it does not require any specific knowledge on
the students’ part: they should be experienced programmers
with a basic understanding of the C++ programming language
and be familiar with the UNIX environment. They should also
understand what a database management system, a relational
data model, and SQL are.</p>
      <p>At the beginning of the course, all students are provided a
prototype of a relational DBMS with minimal functionality:
parsing queries written in a subset of SQL;
a small set of physical operators: data source, filtering,
and nested-loop join;
building a simple query plan that can have at most one
join operation;
reading table data and printing query results in the CSV
format.</p>
      <p>
        The prototype is written in the C++ programming language.
Architecture-wise it is a row-store that follows the Volcano
query processing model. It was provided to the students
through a GitHub repository [
        <xref ref-type="bibr" rid="ref17">18</xref>
        ].
      </p>
      <p>A total of 8 tasks have been prepared, each of them aimed at
expanding the prototype’s functionality. The main topics were
query optimization and execution with read-only workloads.</p>
      <p>Along with the tasks we have written a reference solution
to each task, using the simplest approaches. This reference
solution was used during test generation to keep track of the
expected execution time.</p>
      <p>At the end of the course students who have completed
all tasks will have developed a DBMS with the following
features:
block-oriented data processing;
a larger set of physical operators: cross product, merge
join and hash join, projection, multiple implementations
of duplicate removal;
an optimizer that can optimally select physical operators
and the order of joins given the available RAM amount;
a rewriter able to simplify the predicates and recognize
the inconsistent ones.</p>
      <p>The students were supposed to work on their own. Weekly
seminars were held so that they could consult the instructor
regarding task formulations and any technical problems they
encountered. In order to check that there was no cheating, we
froze the submission three days before the final exam to look
through the code.</p>
    </sec>
    <sec id="sec-6">
      <title>VI. COURSE TEST RUN</title>
      <p>This course has been conducted at the Higher School of
Economics in Saint Petersburg for a group of 17 students.
All of them were taught this course in the same manner,
there was no division into experimental and control groups.
The test run was approved by the administration of the St.
Petersburg School of Mathematics, Physics and Computer
Science. No personal information was ever retrieved, and
students’ behavior within the course was not matched to
students’ university record or any other personal data. The
testing system was deployed on the server provided to us by
the institution.</p>
      <sec id="sec-6-1">
        <title>A. Quantitative analysis</title>
        <p>First of all, let us estimate various metrics related to all
components of our system. They are presented in Table I.
Here, we try to show the effort it took to develop each of
the components in lines of code (all involved programming
languages combined) and man-hours. The first line describes
testing system itself, which was the largest in terms of lines
of code. However, in terms of man-hours, the development of
test cases and more importantly calculating their time limits
were significantly more demanding.</p>
        <p>The next three rows describe the properties of the prototype
that was handed out to students, our reference implementation,
and an averaged solution. Please note that the reference
solution was built on top of the base prototype. The last line
describes our effort to conduct a source code post-review to
check for cheating and other possible problems.</p>
        <p>Our estimates (from previous years, where manual
checking was performed) show that each task requires at least
two attempts, where each attempt lasts about 10 minutes.
Therefore, the overall time required to check all problems
that are offered in our new course would be approximately
10 minutes 2 8 17 = 45 hour s. Each practice class session
lasts 90 minutes (once a week) and there are 14 such
sessions in a semester, which gives us 21 hours in total.
Therefore, it would be impossible to check all these solutions
without involving additional reviewers.</p>
        <p>Moreover, this number of additional man-hours required to
prepare this course has been compensated by the following:
1) Flexibility. Students can check their solutions at any
arbitrary time and can work at their own pace.
Furthermore, they can attend class sessions only if they have
questions.
2) Quality. We have improved the quality of the course
by introducing precooked test queries and answers. This
removes the possibility of instructors forgetting to check
some particular test cases.
3) Reusability. The testing framework we have developed
can be reused during the next iterations of the course.
4) Scalability. Using an automated testing systems makes
it significantly easier to increase the number of students
in the future runs.</p>
      </sec>
      <sec id="sec-6-2">
        <title>B. Qualitative analysis</title>
        <p>The course has received good feedback from the students.
However, we have found some problems in the way our course
was organized:</p>
        <p>We have simplified the code for tuples too much, so in
order to make block-oriented processing beneficial, the
students would have to rework a significant part of the
system, especially since this task was given late in the
course.</p>
        <p>Easy access to automated testing prevented students from
writing their own tests. This has reflected on the
total number of submissions, which has exceeded 1000.
Perhaps we should have provided students with a data
generator instead of relying on them to find or develop
one.</p>
        <p>Testing correctness by running a query and checking its
result can be excessive, especially when testing such
features as query rewriting. Furthermore, writing tests
becomes unnecessarily hard in such cases, since the
only criterion for success is whether the queries can be
executed within a given time limit. A better approach
would be to check the query plan directly.</p>
        <p>At the earlier stages of the course (before
implementing a full-blown query optimizer) query execution time
depended heavily on the order of joins. This made it
impossible for one of the students to pass the tests despite
having a perfectly working solution.</p>
        <p>Due to the fact that each run of the students’ programs
corresponded to running a single query, some students
made questionable design choices. For example, two
students updated catalog information during query rewriting
instead of relying on temporary data structures.</p>
        <p>There are some things that cannot be tested in an
automated manner. The greatest example of that is student’s
understanding of the code they have written. There was
an exam at the end of the course, however, it was
theoretical in nature and therefore there was no place for
code-related questions. Conducting code-review sessions
during practice lessons would be greatly beneficial.</p>
        <p>VII. FUTURE WORK</p>
        <p>This was just the first iteration of the course. We hope
to improve our testing system and additional materials. In
addition to fixing the problems mentioned in Section VI, we
plan to do the following:</p>
        <p>Improve the user interface of our testing system, both in
terms of functionality and visual design. As an example
of missing functionality, the system might benefit from
having an option to let the students ask questions so that
the teaching assistants could answer them.</p>
        <p>Transfer the code submission process from an
archivebased one to a git-based one. We expect that to bring
multiple improvements. First of all, the process should
become easier for students. Secondly, experience shows
that many students will use git anyway. We have noticed
that almost a half of our students have made their own
publicly available forks of our GitHub repository. These
forks included their solutions to the problems, which is
undesirable, as it makes it easy for future students to
cheat.</p>
        <p>Add means to check if a solution was copied from
some other student. This time we had to dedicate three
days before the exam in order to manually check all
submissions that were accepted by the testing system.
Make building and running the code separate isolated
stages. This would allow us to keep full compilation logs
and show them to students in case their code fails to build,
as well as measure the actual query processing time.
The latter would in turn allow us to range the students
based on their code’s performance, thus giving them an
incentive to find better solutions.</p>
        <p>Provide students with tools to test their code locally:
a data generator; some simple logging facility; and a
verbose version of our testing program, which would give
the user detailed error messages without being afraid to
leak test data.</p>
      </sec>
    </sec>
    <sec id="sec-7">
      <title>VIII. CONCLUSION</title>
      <p>In this paper we have described our experience of
organizing practice lessons for a DBMS development course. We have
outlined some of the approaches that have been taken by others
before us and outlined their advantages and disadvantages.</p>
      <p>In order to conduct the course we have developed a
prototype of a simple DBMS and put together a set of problems for
the students, along with a reference solution. To simplify the
testing process for all parties involved, we have developed a
system for automated testing.</p>
      <p>We also describe the problems we have encountered during
this course. Most of them have to do with the fact that this
was the first iteration of this course and we lacked the time
to plan and implement every desirable feature.</p>
      <p>However, we believe our approach is viable and therefore
intend to continue conducting courses in this manner. There
is much to improve in our course besides dealing with the
aforementioned problems. Our plans for future work are also
described in the paper.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>A.</given-names>
            <surname>Oussous</surname>
          </string-name>
          , F.-
          <string-name>
            <given-names>Z.</given-names>
            <surname>Benjelloun</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A. A.</given-names>
            <surname>Lahcen</surname>
          </string-name>
          , and
          <string-name>
            <given-names>S.</given-names>
            <surname>Belfkih</surname>
          </string-name>
          , “
          <article-title>Big data technologies: A survey</article-title>
          ,
          <source>” Journal of King</source>
          Saud University - Computer and Information Sciences, vol.
          <volume>30</volume>
          , no.
          <issue>4</issue>
          , pp.
          <fpage>431</fpage>
          -
          <lpage>448</lpage>
          ,
          <year>2018</year>
          . [Online]. Available: http://www.sciencedirect.com/science/article/pii/ S1319157817300034
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>A.</given-names>
            <surname>Ailamaki</surname>
          </string-name>
          and
          <string-name>
            <given-names>J. M.</given-names>
            <surname>Hellerstein</surname>
          </string-name>
          , “
          <article-title>Exposing undergraduate students to database system internals,” SIGMOD Rec.</article-title>
          , vol.
          <volume>32</volume>
          , no.
          <issue>3</issue>
          , pp.
          <fpage>18</fpage>
          -
          <lpage>20</lpage>
          , Sep.
          <year>2003</year>
          . [Online]. Available: http://doi.acm.
          <source>org/10</source>
          .1145/945721.945725
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>E.</given-names>
            <surname>Sciore</surname>
          </string-name>
          , “
          <article-title>Simpledb: A simple java-based multiuser system for teaching database internals</article-title>
          ,”
          <volume>01</volume>
          2007, pp.
          <fpage>561</fpage>
          -
          <lpage>565</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>“</given-names>
            <surname>Harvard CS165: Data</surname>
          </string-name>
          <string-name>
            <surname>Systems</surname>
          </string-name>
          ,” http://daslab.seas.harvard.edu/classes/ cs165/, [Online; accessed 06-February-2019].
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5] “Программная инженерия больших данных,” https://compscicenter.ru/courses/big-data
          <string-name>
            <surname>-</surname>
          </string-name>
          software-engineering/2018- spring/, [Online; accessed 06-February-2019].
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          <article-title>[6] “Своя СУБД за 3 недели. Нужно всего лишь каждый день немного времени</article-title>
          ...” https://habr.com/ru/post/347274/, [Online; accessed 06- February-2019].
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>K.</given-names>
            <surname>Smirnov</surname>
          </string-name>
          and G. Chernishev, “
          <article-title>ACM SIGMOD Programming Contest: an opportunity to study distinguished aspects of database systems</article-title>
          and software engineering,” Computer Tools in Education, no.
          <issue>5</issue>
          ,
          <year>2014</year>
          . [Online]. Available: http://cte.eltech.ru/ojs/index.php/kio/article/view/1320
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>C.</given-names>
            <surname>Genzmer</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V.</given-names>
            <surname>Hudlet</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Park</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Schall</surname>
          </string-name>
          , and
          <string-name>
            <given-names>P.</given-names>
            <surname>Senellart</surname>
          </string-name>
          , “
          <article-title>The SIGMOD 2010 programming contest a distributed query engine</article-title>
          ,
          <source>” SIGMOD Record</source>
          , vol.
          <volume>39</volume>
          , no.
          <issue>2</issue>
          , pp.
          <fpage>61</fpage>
          -
          <lpage>64</lpage>
          ,
          <year>2010</year>
          . [Online]. Available: https://doi.org/10.1145/1893173.1893185
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>R.</given-names>
            <surname>Ramakrishnan</surname>
          </string-name>
          and
          <string-name>
            <given-names>J.</given-names>
            <surname>Gehrke</surname>
          </string-name>
          ,
          <source>Database Management Systems</source>
          , 3rd ed. New York, NY, USA:
          <string-name>
            <surname>McGraw-Hill</surname>
          </string-name>
          , Inc.,
          <year>2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>G.</given-names>
            <surname>Swart</surname>
          </string-name>
          , “
          <article-title>MinSQL: A simple componentized database for the classroom</article-title>
          ,”
          <source>in Proceedings of the 2nd International Conference on Principles and Practice of Programming in Java, ser. PPPJ '03</source>
          . New York, NY, USA: Computer Science Press, Inc.,
          <year>2003</year>
          , pp.
          <fpage>129</fpage>
          -
          <lpage>132</lpage>
          . [Online]. Available: http://dl.acm.org/citation.cfm?id=
          <volume>957289</volume>
          .
          <fpage>957328</fpage>
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>[12] “Yandex.Contest,” https://contest.yandex.ru/, [Online; accessed 06- February-2019].</mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [13] “Codeforces,” https://codeforces.com/, [Online; accessed 06-
          <fpage>February2019</fpage>
          ].
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>[14] “Stepik,” https://stepik.org/, [Online; accessed 06-February-2019].</mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [15] “Coursera,” https://www.coursera.org/, [Online; accessed 06-
          <fpage>February2019</fpage>
          ].
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [16]
          <string-name>
            <surname>“Travis</surname>
            <given-names>CI</given-names>
          </string-name>
          ,” https://travis-ci.org/, [Online; accessed 06-February-2019].
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>[17] “Jenkins,” https://jenkins.io/, [Online; accessed 06-February-2019].</mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [18]
          <article-title>“ToyDBMS GitHub repository</article-title>
          ,” https://github.com/ chernishev/ToyDBMS, [Online; accessed 06-February-2019].
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>