<?xml version="1.0" encoding="UTF-8"?>
<TEI xml:space="preserve" xmlns="http://www.tei-c.org/ns/1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.tei-c.org/ns/1.0 https://raw.githubusercontent.com/kermitt2/grobid/master/grobid-home/schemas/xsd/Grobid.xsd"
 xmlns:xlink="http://www.w3.org/1999/xlink">
	<teiHeader xml:lang="en">
		<fileDesc>
			<titleStmt>
				<title level="a" type="main">Designing a DBMS Development Course with Automatic Assignment Evaluation</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author>
							<persName><forename type="first">Viacheslav</forename><surname>Galaktionov</surname></persName>
							<email>viacheslav.galaktionov@gmail.com</email>
							<affiliation key="aff0">
								<orgName type="institution">JetBrains Research</orgName>
							</affiliation>
							<affiliation key="aff1">
								<orgName type="institution">Saint-Petersburg State University Saint-Petersburg</orgName>
								<address>
									<country key="RU">Russia</country>
								</address>
							</affiliation>
							<affiliation key="aff2">
								<orgName type="institution">JetBrains Research</orgName>
							</affiliation>
							<affiliation key="aff3">
								<orgName type="department">School of Economics</orgName>
								<orgName type="institution">National Research University Higher</orgName>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">George</forename><surname>Chernishev</surname></persName>
							<email>g.chernyshev@spbu.ru</email>
							<affiliation key="aff0">
								<orgName type="institution">JetBrains Research</orgName>
							</affiliation>
							<affiliation key="aff1">
								<orgName type="institution">Saint-Petersburg State University Saint-Petersburg</orgName>
								<address>
									<country key="RU">Russia</country>
								</address>
							</affiliation>
							<affiliation key="aff2">
								<orgName type="institution">JetBrains Research</orgName>
							</affiliation>
							<affiliation key="aff3">
								<orgName type="department">School of Economics</orgName>
								<orgName type="institution">National Research University Higher</orgName>
							</affiliation>
							<affiliation key="aff4">
								<orgName type="institution">Saint-Petersburg State University</orgName>
								<address>
									<settlement>Saint-Petersburg</settlement>
									<country key="RU">Russia</country>
								</address>
							</affiliation>
						</author>
						<title level="a" type="main">Designing a DBMS Development Course with Automatic Assignment Evaluation</title>
					</analytic>
					<monogr>
						<imprint>
							<date/>
						</imprint>
					</monogr>
					<idno type="MD5">13F9E1FA6F05A1A6DA65D170C63D2E0B</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2023-03-24T17:23+0000">
					<desc>GROBID - A machine learning software for extracting information from scholarly documents</desc>
					<ref target="https://github.com/kermitt2/grobid"/>
				</application>
			</appInfo>
		</encodingDesc>
		<profileDesc>
			<textClass>
				<keywords>
					<term>education courses</term>
					<term>education</term>
					<term>databases</term>
					<term>query engine</term>
					<term>query processing</term>
					<term>database internals</term>
				</keywords>
			</textClass>
			<abstract>
<div xmlns="http://www.tei-c.org/ns/1.0"><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.</p><p>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.</p></div>
			</abstract>
		</profileDesc>
	</teiHeader>
	<text xml:lang="en">
		<body>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>I. INTRODUCTION</head><p>It is well-known that the amount of data that needs to be processed is increasing with an unprecedented speed <ref type="bibr" target="#b0">[1]</ref>. 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: 1) Introductory courses, that explain a specific set of basic terms. Usually such courses consider the classic relational model and teach the students to apply it, but sometimes they can include information on various NoSQL systems.</p><p>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. 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.</p><p>2) The structure of our approach: the overall idea of the course, the used DBMS prototype, the task set, approach to testing students' solutions.</p><p>3) The results of the test run of our course, a description of our experience and the encountered issues. 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></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>II. RELATED WORK</head><p>Conducting advanced database courses is not a new problem, there are publications describing experience of many universities <ref type="bibr" target="#b1">[2]</ref>- <ref type="bibr" target="#b5">[6]</ref>. The referenced papers provide two different viewpoints on how such a course should be organised:</p><p>1) Students of the course described in <ref type="bibr" target="#b1">[2]</ref> had to modify PostgreSQL, a DBMS used in the industry. However, due to complexity of PostgreSQL's architecture, only two of the tasks required students to actually modify its code. 2) On the other hand, the course described in <ref type="bibr" target="#b2">[3]</ref> employed a DBMS developed specifically for it, SimpleDB. It was made with code clarity in mind, sacrificing performance where necessary. This allowed students, who were new to the subject, to find their bearings in the code and start modifying it. Because of this, the number of programming-related tasks in this course was 9.</p><p>A similar approach is being used at Harvard <ref type="bibr" target="#b3">[4]</ref> right now. There, students implement their own main-memory column-store. They cover such topics as indexing methods optimized for main-memory and shared scan methods. During the class hours students discuss state of the art research papers.</p><p>In Russia such courses also exist. In 2004 the South Ural State University offered a course "Parallel database systems" <ref type="bibr" target="#b6">[7]</ref>, where students had to develop their own prototype of a parallel database management system using the MPI standard. In the Computer Science Center <ref type="bibr" target="#b4">[5]</ref> course "Software engineering for big data" students were offered to implement a distributed keyvalue data store and an application. The assignment encouraged team participation 1 and there were 4 tasks overall. Several years ago Innopolis Univeristy also offered <ref type="bibr" target="#b5">[6]</ref> a three-week assignment for building a simplified relational query engine in Python. This project was aimed for team participation also. To the best of our knowledge, both these courses involved manual checking of the solutions.</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 <ref type="bibr" target="#b7">[8]</ref>, <ref type="bibr" target="#b8">[9]</ref>.</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 [10] and MinSQL <ref type="bibr" target="#b10">[11]</ref>. 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. However, the source code for the full version has already been 1 https://github.com/alesavin/csc-bdse published by third parties, which makes it easy for students to cheat. The latter, MinSQL, has never been made public.</p><p>Therefore, we have decided to develop our own educational DBMS.</p><p>Another important problem is grading students' work. In the case of complex systems like DBMSes it becomes too difficult to assess the code by just reading it. Some form of automated testing is required. Trusting the student to write their own tests is not an option, and handing out tests to students could lead to them writing code that's designed to pass the tests instead of actually solving the problems.</p><p>A more correct and modern approach is to allow the students to upload their code to some testing system, which runs various tests on it. Besides testing for correctness and performance, such a system can recognize different kinds of cheating: copying others' solutions, DoS attack, etc.</p><p>This approach is very popular with programming contests and online courses. In both cases there is a stream of solutions that is too large for a group of people to evaluate in a reasonable time period.</p><p>Of course, automated testing is used outside of these areas as well. Code quality is an important characteristic of any software, so it receives a lot of attention. There are industrial systems for automated code testing.</p><p>We have evaluated multiple systems from different areas. Let us summarize our findings:</p><p>1) Programming contest platforms. We have considered Yandex.Contest <ref type="bibr" target="#b11">[12]</ref> and Codeforces <ref type="bibr" target="#b12">[13]</ref>, which are the most popular platforms in Russia. These systems are capable of testing the code for correctness, performance, and are also protected against DoS attacks. However, they are expect the users to provide a single source 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 <ref type="bibr" target="#b13">[14]</ref> and Coursera <ref type="bibr" target="#b14">[15]</ref>. They exhibit the same problem as the programming contest platforms. However, they have additional disadvantages. 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 CI <ref type="bibr" target="#b15">[16]</ref> and Jenkins <ref type="bibr" target="#b16">[17]</ref>. While they provide exceptional testing capabilities, they are not well-suited to track students' progress. Due to the lack of a system that would meet all our requirements, we have decided to implement our own. III. TESTING SYSTEM ARCHITECTURE Our system is organized as a set of Docker containers.</p><p>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:</p><p>1) Web server. The system has two kinds of user accounts: for students and for teachers. The interface is structured 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.</p><p>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. The diagram of interaction between different parts of the system is presented in Figure <ref type="figure" target="#fig_0">1</ref>. 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. Now that we've covered the structure of our system, let us 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 <ref type="figure" target="#fig_1">2</ref>. 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><p>IV. SECURITY MEASURES 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></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>V. SYLLABUS</head><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:</p><p>• parsing queries written in a subset of SQL;</p><p>• 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. 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 <ref type="bibr" target="#b17">[18]</ref>.</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:</p><p>• block-oriented data processing;</p><p>• 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. 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></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>VI. COURSE TEST RUN</head><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></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>A. Quantitative analysis</head><p>First of all, let us estimate various metrics related to all components of our system. They are presented in Table <ref type="table">I</ref>. 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:</p><p>1) Flexibility. Students can check their solutions at any arbitrary time and can work at their own pace. Further-more, 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></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>B. Qualitative analysis</head><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. • 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. • 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. • 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. • 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></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>VII. FUTURE WORK</head><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. • 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. • 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><p>VIII. CONCLUSION 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></div><figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_0"><head>Figure 1 .</head><label>1</label><figDesc>Figure 1. Interaction between different parts of the system</figDesc><graphic coords="3,48.96,50.64,257.04,218.74" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_1"><head>Figure 2 .</head><label>2</label><figDesc>Figure 2. The solution checking process</figDesc><graphic coords="3,311.98,50.64,257.04,218.74" type="bitmap" /></figure>
		</body>
		<back>
			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<analytic>
		<title level="a" type="main">Big data technologies: A survey</title>
		<author>
			<persName><forename type="first">A</forename><surname>Oussous</surname></persName>
		</author>
		<author>
			<persName><forename type="first">F.-Z</forename><surname>Benjelloun</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><forename type="middle">A</forename><surname>Lahcen</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Belfkih</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Journal of King Saud University -Computer and Information Sciences</title>
		<imprint>
			<biblScope unit="volume">30</biblScope>
			<biblScope unit="issue">4</biblScope>
			<biblScope unit="page" from="431" to="448" />
			<date type="published" when="2018">2018</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b1">
	<analytic>
		<title level="a" type="main">Exposing undergraduate students to database system internals</title>
		<author>
			<persName><forename type="first">A</forename><surname>Ailamaki</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><forename type="middle">M</forename><surname>Hellerstein</surname></persName>
		</author>
		<idno type="DOI">10.1145/945721.945725</idno>
		<ptr target="http://doi.acm.org/10.1145/945721.945725" />
	</analytic>
	<monogr>
		<title level="j">SIGMOD Rec</title>
		<imprint>
			<biblScope unit="volume">32</biblScope>
			<biblScope unit="issue">3</biblScope>
			<biblScope unit="page" from="18" to="20" />
			<date type="published" when="2003-09">Sep. 2003</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b2">
	<monogr>
		<title level="m" type="main">Simpledb: A simple java-based multiuser system for teaching database internals</title>
		<author>
			<persName><forename type="first">E</forename><surname>Sciore</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2007">2007</date>
			<biblScope unit="volume">01</biblScope>
			<biblScope unit="page" from="561" to="565" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b3">
	<monogr>
		<ptr target="http://daslab.seas.harvard.edu/classes/cs165/" />
		<title level="m">Harvard CS165: Data Systems</title>
				<imprint>
			<date type="published" when="2019-02-06">06-February-2019</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b4">
	<monogr>
		<ptr target="https://compscicenter.ru/courses/big-data-software-engineering/2018-spring/" />
		<title level="m">Программная инженерия больших данных</title>
				<imprint>
			<date type="published" when="2019-02-06">06-February-2019</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b5">
	<monogr>
		<ptr target="https://habr.com/ru/post/347274/" />
		<title level="m">Своя СУБД за 3 недели. Нужно всего лишь каждый день немного времени</title>
				<imprint>
			<date type="published" when="2019-02-06">06-February-2019</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b6">
	<analytic>
		<title level="a" type="main">Прототипирование параллельной СУБД как основа учебного курса по параллельным системам баз данных</title>
		<author>
			<persName><forename type="first">М</forename><surname>Цымблер</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Л</forename><surname>Соколинский</surname></persName>
		</author>
		<author>
			<persName><forename type="first">А</forename><surname>Лепихов</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Суперкомпьютерные системы и их применение</title>
				<imprint>
			<date type="published" when="2004">2004</date>
			<biblScope unit="page" from="212" to="217" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b7">
	<analytic>
		<author>
			<persName><forename type="first">K</forename><surname>Smirnov</surname></persName>
		</author>
		<author>
			<persName><forename type="first">G</forename><surname>Chernishev</surname></persName>
		</author>
		<ptr target="http://cte.eltech.ru/ojs/index.php/kio/article/view/1320" />
	</analytic>
	<monogr>
		<title level="m">ACM SIGMOD Programming Contest: an opportunity to study distinguished aspects of database systems and software engineering</title>
		<title level="s">Computer Tools in Education</title>
		<imprint>
			<date type="published" when="2014">2014</date>
		</imprint>
	</monogr>
	<note>Online</note>
</biblStruct>

<biblStruct xml:id="b8">
	<analytic>
		<title level="a" type="main">The SIGMOD 2010 programming contest a distributed query engine</title>
		<author>
			<persName><forename type="first">C</forename><surname>Genzmer</surname></persName>
		</author>
		<author>
			<persName><forename type="first">V</forename><surname>Hudlet</surname></persName>
		</author>
		<author>
			<persName><forename type="first">H</forename><surname>Park</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Schall</surname></persName>
		</author>
		<author>
			<persName><forename type="first">P</forename><surname>Senellart</surname></persName>
		</author>
		<idno type="DOI">10.1145/1893173.1893185</idno>
		<ptr target="https://doi.org/10.1145/1893173.1893185" />
	</analytic>
	<monogr>
		<title level="j">SIGMOD Record</title>
		<imprint>
			<biblScope unit="volume">39</biblScope>
			<biblScope unit="issue">2</biblScope>
			<biblScope unit="page" from="61" to="64" />
			<date type="published" when="2010">2010</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b9">
	<monogr>
		<title level="m" type="main">Database Management Systems</title>
		<author>
			<persName><forename type="first">R</forename><surname>Ramakrishnan</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Gehrke</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2003">2003</date>
			<publisher>McGraw-Hill, Inc</publisher>
			<pubPlace>New York, NY, USA</pubPlace>
		</imprint>
	</monogr>
	<note>3rd ed</note>
</biblStruct>

<biblStruct xml:id="b10">
	<analytic>
		<title level="a" type="main">MinSQL: A simple componentized database for the classroom</title>
		<author>
			<persName><forename type="first">G</forename><surname>Swart</surname></persName>
		</author>
		<ptr target="http://dl.acm.org/citation.cfm?id=957289.957328" />
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 2nd International Conference on Principles and Practice of Programming in Java, ser. PPPJ &apos;03</title>
				<meeting>the 2nd International Conference on Principles and Practice of Programming in Java, ser. PPPJ &apos;03<address><addrLine>New York, NY, USA</addrLine></address></meeting>
		<imprint>
			<publisher>Computer Science Press, Inc</publisher>
			<date type="published" when="2003">2003</date>
			<biblScope unit="page" from="129" to="132" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b11">
	<monogr>
		<ptr target="https://contest.yandex.ru/" />
		<title level="m">Yandex.Contest</title>
				<imprint>
			<date type="published" when="2019-02-06">06-February-2019</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b12">
	<monogr>
		<ptr target="https://codeforces.com/" />
		<title level="m">Codeforces</title>
				<imprint>
			<date type="published" when="2019-02-06">06-February-2019</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b13">
	<monogr>
		<ptr target="https://stepik.org/" />
		<title level="m">Stepik</title>
				<imprint>
			<date type="published" when="2019-02-06">06-February-2019</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b14">
	<monogr>
		<ptr target="https://www.coursera.org/" />
		<title level="m">Coursera</title>
				<imprint>
			<date type="published" when="2019-02-06">06-February-2019</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b15">
	<monogr>
		<ptr target="https://travis-ci.org/" />
		<title level="m">Travis CI</title>
				<imprint>
			<date type="published" when="2019-02-06">06-February-2019</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b16">
	<monogr>
		<title/>
		<author>
			<persName><surname>Jenkins</surname></persName>
		</author>
		<ptr target="https://jenkins.io/" />
		<imprint>
			<date type="published" when="2019-02-06">06-February-2019</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b17">
	<monogr>
		<title level="m" type="main">ToyDBMS GitHub repository</title>
		<ptr target="https://github.com/chernishev/ToyDBMS" />
		<imprint>
			<date type="published" when="2019-02-06">06-February-2019</date>
		</imprint>
	</monogr>
</biblStruct>

				</listBibl>
			</div>
		</back>
	</text>
</TEI>
