Memories of Scholasic Reading Counts!

July 1, 2020

Roger Ngo

Introduction

As early as kindergarten, I was reading a lot of books. There is a memory which sticks out.

The strongest memory I have with reading was in the 5th grade. I think I am very fond of this entire year since I had read many books. All this reading was motivated by being tested after reading each book on this platform called Scholastic Reading Counts! Every computer in our classroom had this piece of software installed.

CD

I think I remember this pretty clearly because I had internally game-ified the whole process in reading, writing my required book report, and taking the test in the Reading Counts! program. My goal was to accumulate as many points, and words read as much as possible!

I vaguely recall the platform recording the scores, and word count of the book after every test taken. What was also pretty cool at the time was that each book had the Lexile level tied to it, allowing my teacher to help me recognize what grade level I should have been reading at. This allowed my teacher to suggest books that would "stretch" my current reading abilities to read at a more advanced level.

Being into video games, and anime as a 10 year old at the time, I thought of my Lexile score as being my "power level".

Well, that thought didn't turn out so bad at all since it ultimately resulted in me enjoy reading as a kid.

Anyway, I became curious one day, and decided to search the internet to see if Scholastic Reading Counts! was still a thing. Apparently, it was initially made by Scholastic, but somehow got sold off to Harcourt Houghton Mifflin at some point int time. The platform since then, has seem to have gotten pretty complex as detailed by the installation, and usage guides. The server application itself seems to need a pretty beefy computer.

IIRC, Reading Counts! used to be a pretty simple application installed on a desktop PC. Now, it seems to be this huge client-server application! I guess I miss the good old days here.

My daughter's birth made me reminisce about how I learned in the classroom using computers. Because of this, I have had this weird nostalgia kick for edutainment things.

I'm sure you know where this is heading towards! Yep. You guessed it. I want to create a platform similar to the old Scholastic Reading Counts! I'll try to give the same functionality as the application I remember.

I want to create an easy-to-use, and easy-to-manage reading comprehension quiz platform for the classroom. I want it to be accessible, and not some several thousand dollar thing a teacher has to fight for in order to obtain so her students can have the opportunity to learn in this digital age.

Yeah, all this is pie in the sky thinking, but we need some motivation here!

Analyzing a "newer" Version

The version I will be looking at is from 2005. Version 1.8.1. Most of the screenshots will be pulled from the user manual since I have no access to 1.8.1.

Login Screen

The client presents a login screen. Unknown whether or not it is for a student login only, or both teacher, and student login.

Portal

Upon logging in, students are presented with a landing page allowing them to perform any of the 4 functions:

When the student has advanced to the Take a Quiz screen, they will be presented with a searchable list of books in which a chosen entry will advance to taking the quiz.

Quiz Search

The student can either search for a book by its Title, or Author.

Quizzes of a book are composed from a set of 30 multiple choice questions. Although a quiz can be just 1 question, or up to 30. If a quiz has less than 30 questions, the questions are randomized so that no two quizzes are exactly the same. The default number of questions for a quiz is 10.

Quiz Question

When a student has completed a quiz, they will be presented with either a confirmation screen with indication in passing the test, or failure. Their results along with a message with their name is also shown.

I personally think the pictures here are cute, and encouraging.

Quiz Passing

As stated in the manual, if the student has passed the quiz, then they will be presented with an additional question which asks whether or not the book was personally enjoyable.

Quiz Survey

Once the student has hit Done, the landing page will display again, but this time with a chance to review the previous quiz they have just taken.

Portal 2

Now, the interesting thing about this is that when students review the quiz they have just taken, the incorrect answer which had been chosen is selected, but they do not see the correct answer. This is because there may be an expectation for the student to re-take the quiz.

Review

Students may also have a chance to customize their reading preferences.

Reading preferences

Or, review their history through a report.

Report

Requirements

Here are the MVP requirements:

Out of Scope

Student Login Screen

Student navigates to a page. Ex: classid.read24.org. They are presented with the login screen.

Student Portal

When the student has successfully logged in, they are on the landing page.

Take a Quiz

‌A page with a search field with two options are displayed to allow the student to search for a quiz corresponding to a book.‌

Quiz Question

Each question will be a full page presenting the question, and selectable choices.‌

Quiz Result Screen‌

When a student passes a quiz, a screen to display a fun graphic, name of the student, and results of their quiz is shown. ‌

When the student fails, the results are shown.

Rate the Book‌

Presents options to rate the book from a scale of 1 to 5.

Check Your Progress

This will immediately generate a report for the student. The report should be displayed as a downloadable/printable PDF, or at least be able to be formatted in such a way that it will look good when printed.

Student Portal (2)

Teacher Page

When a teacher logs in, they can run reports on all students whom they have access to in their classrooms

Technical Design

Security

Passwords will be hashed using bcrypt.

Quiz data will be returned by the server in encrypted format. node-rsa

Deployed client should communicate over HTTPS.

Data Model

The following section outlines the possible database tables. Each of these data tables can be deserialized into a JS object for the application to consume.

Classroom

Column Type
Id Number
Name String
Slug String

Every school has a Classroom. Students and teachers will reference a Classroom entity for logical grouping.

User

Column Type
Id Number
Username String
Password String
Salt String

Since both Student and Teacher entities may have a login, it makes sense to have a general User entity for logging into the application.

Student

Column Type
Id Number
ClassroomId Number
FirstName String
MiddleName String
LastName String
Grade Number
UserId Number

Student entities are straightforward here. They are the users in the system. Each quiz taken will have a Student associated with it.

Teacher

Column Type
Id Number
FirstName String
MiddleName String
LastName String
UserId Number

A Teacher isn't that much different than a Student, they can be seen as a user with higher level privileges, but for the sake of future-proofing we keep Teacher as a separate type. (Teachers may have more attributes than a student.)

TeacherClassroom‌

Unique Constraint: (TeacherId, ClassroomId)

Column Type
TeacherId Number
ClassroomId Number

A Teacher is associated with a Classroom. So, every classroom is ensured to have a teacher!

Book

Column Type
Id Number
Title String
Fiction Boolean
Author String
Year String
Publisher String
Genre Number
ISBN String
Lexile Number
WordCount Number‌

Generic Book type. There are several necessary properties which make a book, a "book". Most notably ISBN.

Genre

Column Type
Id Number
Name String

Genre is a lookup table to allow a Book to look up an ID back to the Genre name.

Question

Column Type
Id Number
BookId Number
Content String

A Question is a string.

Choice

Column Type
Id Number
QuestionId Number
Content String
Answer Boolean

A Choice is a string, and tied back to a Question. Therefore, multiple Choice entities can belong to a Question. Answer is a flag to indicate that the Choice is the answer to the question.

QuizTokens

Unique Constraint: (Token)

Key: Token

Column Type
Id Number
StudentId Number
BookId Number
Token String
Status 0 - Incomplete
1 - Abandoned
2 - Completed

When a student begins taking a quiz, a QuizToken is generated to associate a student, book, and current session. Status is tracked against the session to indicate whether or not the student eventually completes the quiz.

QuizQuestions

Column Type
Id Number
QuizToken String
QuestionId Number

Since questions are randomly assigned to a quiz session, the QuizQuestions table maintains a record of the questions which were assigned for that particular session.

Ratings

Column Type
Id Number
QuizToken String
Rating Number

Based on the current quiz taken, the student can give feedback regarding how they feel about their interest in the book.

StudentAnswers

Unique Constraint: (StudentId, QuestionId)

Column Type
Id Number
StudentId Number
QuestionId Number
ChoiceId Number

This table stores the answers to the quiz which the student have chose. Whether correct, or incorrect, they are stored here.

API

The backend will have a REST API with the following endpoints:

External Data

Other than manually creating quizzes for this particular iteration of the project, there are some outstanding questions:

How do we find the word count of a book?

How do we find the Lexile level of a book?

Any APIs?

Sample Payload

The following shows some prototypes on what a payload looks like by the application. Note that it isn't super accurate, but is just here for illustration.

Student data for reporting:

{
    "FirstName": "",
    "LastName": "",
    "Grade": 0,
    "Id" 1234,
    "Classroom": {
        "Id": 0,
        "Name": "",
        "Slug": ""
    },
    "Teacher": {
        "Id": 0,
        "FirstName": "",
        "LastName": ""
    },
    "Results": [
        {
            "Score": 0,
            "Book": {
                "Id": 0,
                "Title": "",
                "Author": "",
                "Lexile" 0,
                "WordCount": 0
            },
            "Selections": [
                {
                    "QuestionId" : 123456,
                    "ChoiceId": 123456,
                    "Correct": true 
                }
            ]
        }
    ]
}

A quiz looks something like this when being loaded

{
    "Token": "",
    "Book": {
        "Id": "",
        "Title": "",
        "Fiction": false,
        "Author": "",
        "Year": "",
        "Publisher": "",
        "Genre": "",
        "ISBN": ""
        "Lexile": 0,
        "WordCount"
    },
    "Quiz": [
        {
            "Id": 123456,
            "Question": "",
            "Choices": [
                {
                    "Id": 0,
                    "Content": ""
                }
            ],
            "Answer": 0
        }
    ]
}