Software: SQL (Datagrip, Docker, Flask, Appsmith)
The goal of this project is to conceptualize, design, and implement a database-driven application. To do this, our team worked to:
identify a general software product idea for your application
outline 4-5 major features of four different user personas of the product
develop a localized conceptual data model (as ER Diagram) for each user persona
incorporate the four localized data models into a global data model in the from of a global ER diagram
convert the global ER diagram into a relational model
implement the relational model in MySQL with appropriate constraints
bootstrap the database with realistic auto-generated data
develop robust queries to support each feature of each user persona
design and implement a REST API as a data access layer using Python + the Flask framework containing at least 15 endpoints (at least some of which must modify the underlying DB)
implement a proof-of-concept user interface for your application composed of a set of at least 6 cohesively designed and organized pages/screens providing a positive user experience
High level project architecture
General project architecture
Brief synopsis of project/product
Teacher’s Assistant (TA) is an all-in-one class management system for college courses combined into one service, integrating capabilities like assignment posting/submission, discussion boards, TA management, course registration, office hours, and course feedback into one platform. Currently, professors, TAs, students, and administrators find themselves navigating too many platforms for essential course operations, wasting time and diverting both time and energy away from important course content. This can result in many challenges, such as professors being unable to cover their entire curriculum within the span of a semester, students missing out on potential learning opportunities, TAs feeling overworked as students come with questions about content that had to be taught quickly in class, and administrators feeling troubled by constant requests to fix backend issues on numerous platforms.
By consolidating these functionalities into one place, users will only need to become familiar with one interface, and universities can be better prepared to troubleshoot issues on one technology system. While pre-existing education platforms like Canvas and Gradescope include some of the functionalities listed above, Teacher’s Assistant offers a new way to streamline all necessary course management tools in one location, alleviating stress and anxiety for professors, students, TAs, and administrators all semester long.
User personas
Persona 1: Harry Morrison (Professor)
Biography: Harry Morrison is a professor of Computer Science at Stanford University. He has a passion for front-end coding and has taught for over 20 years. He tries to encourage all his students to embrace technology as it is growing rapidly in our society.
Age: 49 Gender: Male Occupation: Professor of Computer Science
Hobbies: Harry is fascinated by machine AI tools and front-end development, although he truly loves his coffee.
Likes:
Front-end development
Machine AI tools
Open-source software
Dislikes:
Inefficient communication channels
Wasting time
User Stories for Persona 1:
As a professor, I would like a single page where I can easily reach out to the TAs so I can avoid wasting time with scheduling duties.
As a professor, I would like a platform where I can see everyone’s schedule for the week and make changes if needed so I don’t need to check multiple platforms.
As a professor, I would like to see the hours that my TAs and I have put into the program so I can keep track of our progress and monitor our investment in students.
As a professor, I would like a platform where students can automatically reach out to TAs with specific office hour-related questions so I can be more available for overall course questions and concerns from students.
Persona 2: Alex Fernandez (Teaching Assistant)
Biography: Alex Fernandez is a 20-year-old undergraduate majoring in Computer Science, currently working part-time as a Teaching Assistant (TA) for the foundational Computer Science course (Fundies) while pursuing his degree full-time. With two years of experience in the TA role, Alex adeptly balances his teaching responsibilities alongside academic research and coursework. His commitment to education and personal growth is evident in his active search for ways to manage his time more efficiently, streamline communication, and ensure a balanced workload both for himself and his fellow TAs.
Age: 20 Gender: Male
Occupation: Teaching Assistant (Part-time), Undergraduate Student in Computer Science at Stanford (Full-time)
Hobbies: Soccer, spending time in nature, traveling, cooking
Likes:
Utilizing productivity tools for efficient task management, so I can be effective and still have time for my other responsibilities and hobbies
Having real-time access to earnings as a student is helpful for financial planning
Gaining insights into personal performance and contributions to the team
Flexible scheduling that aligns with his student commitments, preferring a consistent number of hours worked each week but with the flexibility to vary the specific times
Dislikes:
Inefficiency and time wasted due to disorganized communication and scheduling
The need for a job that dynamically fits his busy student lifestyle without making office hours/labs the focal point, emphasizing the importance of flexibility in scheduling
Juggling TA responsibilities across multiple platforms
User Stories for Persona 2:
As a TA, I want to see all submissions for the course that haven’t been reviewed yet, so I can grade them.
As a TA, I would like to see the office hours schedule, so I can plan for the week.
As a TA, I want the count of regrade requests for each assignment, so I can split them evenly among my co-workers.
As a TA, I want to see all messages I haven’t responded to yet, so I can stay updated with communication between my co-workers/students.
Persona 3: Emily Johnson (Student)
Biography: Emily Johnson is a freshman at Stanford University majoring in Computer Science. She discovered her love for coding during high school, which prompted her to pursue it as a major. She was fascinated by the way software could solve real world problems so she dedicated herself to mastering programming languages like Python and JavaScript. Emily is very involved in the community. She is part of multiple clubs such as the coding club and has participated in her fair share of hackathons.
Age: 18 Gender: Female
Occupation: Undergraduate Student in Computer Science at Stanford (Full-time)
Hobbies: Photography, Theatre, Cooking, Reading, Writing Novels
Likes:
Solving complex problems whether they're related to coding challenges, puzzles, or real-life situations
Exploring new and emerging technologies, programming languages, and frameworks
Expanding her coding knowledge, believes that there is always more for her to learn
Dislikes:
Spending hours tracking down elusive bugs or dealing with cryptic error messages
Repetitive or monotonous tasks
Encountering stereotypes or biases in the tech industry
Feeling overwhelmed by school work
Encountering poorly optimized or inefficient code
Technical issues or system failures that disrupt workflow or cause data loss
User Stories for Persona 3:
As a student, I would like to see when office hours are so I can plan my schedule around going if I need help on an assignment or just have a general question.
As a student, I would like to look at feedback given by other students about classes so I can see what classes I would like to take based on the reviews.
As a student, I would like to see other students' questions so I don’t ask repeat questions and so I can understand the content better as sometimes other students have questions I didn’t think of on my own.
As a student, I would like to see all of my assignments and their grades so I can see if I am doing well in the class or if I need to go talk to office hours.
Persona 4: Mary Bishop (Academic Coordinator)
Biography: Mary Bishop has been an Academic Coordinator at Stanford for seven years. She has a true passion for organization, collaboration, and education, and she loves playing a large role in helping the Computer Science department provide a positive experience for its students. Prior to being an Academic Coordinator, Mary worked as an assistant professor in data science where she taught courses on introductory programming and machine learning. She is also an advisor for the Women in Technology student organization at Stanford, and is a strong advocate for more diverse representation in the tech industry.
Age: 39 Gender: Female
Occupation: Academic Coordinator (College of Information and Computer Sciences)
Hobbies: Running, cooking, learning new languages, spending time with her husband and two kids
Likes:
Cross-collaboration between departments in her role at Stanford
Backend, operational nature of her position
Interacting with students and answering their questions
Keeping up with new developments in the tech industry and seeking ways to implement them into current curriculum to stay relevant
Advocating for DEI in tech
Dislikes:
Excessive amounts of administrative work with no tangible student impact
Planning the scheduling of course sections each semester
Dealing with technical difficulties in course platforms and registration she is assigned to fix
Limited opportunities to interact directly with students in her current position
Conducting performance evaluations for professors every semester based on student feedback
Combing through lots of excess information to gather data that supports her ideas for the future of the department
User Stories for Persona 4:
As an Academic Coordinator, I would like to be able to access student enrollment data on one platform so that I can easily find which students are registered in each course and avoid wasting time having to copy data across platforms.
As an Academic Coordinator, I would like to be able to easily review student feedback for individual courses at the end of each semester so that I can make better informed decisions about which classes should or shouldn’t be offered the following semester.
As an Academic Coordinator, I would like to be able to compute average final grades for all courses offered within a semester so that I can effortlessly report course grade breakdowns to my supervisor for department approval.
As an Academic Coordinator, I would like to be able to gather a list of all emails of students registered for courses by department so that I can reach out to them with timely course registration updates specific to their home college.
Localized ER diagrams
User Persona 1: Professor - Harry Morrison
User Persona 2: TA - Alex Fernandez
User Persona 3: Student - Emily Johnson
User Persona 4: Academic Coordinator - Mary Bishop
Global ER diagram
Relational diagram
Datagrip database diagram
User story queries
1.1
SELECT TAs.Name, TAs.OfficeHours
FROM TAs
JOIN Courses ON Courses.TAID = TAs.TAID
WHERE Courses.ProfessorID = 1;
1.2
SELECT Schedules.Date, Schedules.TimeSlot, Courses.CourseName, TAs.Name AS TAName
FROM Schedules
JOIN Courses ON Schedules.CourseID = Courses.CourseID
LEFT JOIN TAs ON Courses.TAID = TAs.TAID
WHERE Schedules.ProfessorID = 1 AND Schedules.Date BETWEEN '04/2/2024' AND '04/9/2024';
1.3
SELECT Professors.Name AS ProfessorName, Professors.OfficeHours AS ProfessorOfficeHours, TAs.Name AS TAName, TAs.OfficeHours AS TAOfficeHours
FROM Professors
LEFT JOIN Courses ON Professors.ProfessorID = Courses.ProfessorID
LEFT JOIN TAs ON Courses.TAID = TAs.TAID
WHERE Professors.ProfessorID = 1;
1.4
INSERT INTO Communications (SenderID, ReceiverID, Timestamp, Content)
VALUES (10, 7, CURRENT_TIMESTAMP, 'Can I schedule an appointment during your office hours?');
2.1
SELECT s.AssignmentID as AssignmentID, s.SubmissionID as SubmissionID
FROM Submissions s
JOIN Assignments a ON s.AssignmentID = a.AssignmentID
WHERE s.Grade IS NULL;
2.2
SELECT *
FROM Schedule s
JOIN Employees e ON s.EmployeeID = e.EmployeeID
WHERE e.fname = 'Alex' AND e.lname = 'Fernandez';
2.3
SELECT a.AssignmentID, COUNT(*) AS total_regrade_requests
FROM Submissions s
JOIN Assignments a ON s.AssignmentID = a.AssignmentID
WHERE s.RegradeRequestStatus = 1
GROUP BY a.AssignmentID;
2.4
SELECT c.Message as message_content, c.SenderID as SenderID, c.TimeSent as time_sent
FROM Employees e
JOIN Chats c ON e.EmployeeID = c.RecipientID
LEFT JOIN ChatReplies cr ON c.ChatID = cr.ChatID
WHERE e.fname = 'Alex' AND e.lname = 'Fernandez' AND cr.ChatID IS NULL;
3.1
SELECT dtw.Day AND dtw.Timeslot AS OfficeHours, e.EmployeeFirstName AND e.EmployeeLastName as Name
FROM DayTimeWorked dtw
JOIN Schedule s ON dtw.ScheduleID = s.ScheduleID
JOIN Employees e ON s.EmployeeID = e.EmployeeID
ORDER BY OfficeHours ASC;
3.2
SELECT *
FROM FeedbackSurveys
ORDER BY CRN;
3.3
SELECT dp.PostTitle AND dp.PostContent as posts, e.FirstName AND e.LastName as sender, dpa.DiscussionPostAnswer as answer
FROM DiscussionPost dp
JOIN DiscussionPostAnswers dpa ON dp.PostID = dpa.PostID
JOIN Employees e ON dpa.EmployeeID = e.EmployeeID
WHERE answer IS NOT NULL;
3.4
SELECT *
FROM Assignments a
JOIN Submissions s ON a.AssignmentID = s.AssignmentID
ORDER BY a.CourseCRN;
4.1
SELECT *
FROM Enrollments
ORDER BY CRN ASC;
4.2
SELECT Feedback, CRN
FROM FeedbackSurveys
ORDER BY CRN ASC;
4.3
SELECT CRN, AVG(FinalGrade) as Average_Grade
FROM Enrollments
GROUP BY CRN;
4.4
SELECT se.Email as EmailAddress, c.Department as Department
FROM StudentEmails se
JOIN Enrollments e ON se.StudentID = e.StudentID
JOIN CourseSelections cs ON e.CRN = cs.CRN
JOIN Courses c ON cs.CourseID = c.CourseID
ORDER BY Department ASC;
Updated Datagrip database diagram
Updated user story queries
1.1
SELECT TAs.Name, TAs.OfficeHours
FROM TAs
JOIN Courses ON Courses.TAID = TAs.TAID
WHERE Courses.ProfessorID = 1;
1.2
SELECT Schedules.Date, Schedules.TimeSlot, Courses.CourseName, TAs.Name AS TAName
FROM Schedules
JOIN Courses ON Schedules.CourseID = Courses.CourseID
LEFT JOIN TAs ON Courses.TAID = TAs.TAID
WHERE Schedules.ProfessorID = 1 AND Schedules.Date BETWEEN '04/2/2024' AND '04/9/2024';
1.3
SELECT Professors.Name AS ProfessorName, Professors.OfficeHours AS ProfessorOfficeHours, TAs.Name AS TAName, TAs.OfficeHours AS TAOfficeHours
FROM Professors
LEFT JOIN Courses ON Professors.ProfessorID = Courses.ProfessorID
LEFT JOIN TAs ON Courses.TAID = TAs.TAID
WHERE Professors.ProfessorID = 1;
1.4
INSERT INTO Communications (SenderID, ReceiverID, Timestamp, Content)
VALUES (10, 7, CURRENT_TIMESTAMP, 'Can I schedule an appointment during your office hours?');
2.1
For seeing all ungraded submissions:
SELECT *
FROM Submissions s
JOIN Assignments a ON s.AssignmentID = a.AssignmentID
WHERE s.Grade IS NULL;
For putting in a grades for an ungraded submissions:
UPDATE Submissions SET GRADE = %s
WHERE SubmissionID = %s AND AssignnmentID = %s
2.2
SELECT *
FROM Schedule s JOIN DayTimeWorked dtw ON dtw.ScheduleID = s.ScheduleID
JOIN Employees e ON e.EmployeeID = s.EmployeeID;
2.3
For getting all submissions:
SELECT *
FROM Submissions;
For changing grade on any submission:
UPDATE Submissions SET Grade=%s, GradedBy=%s, GradedOn=%s WHERE SubmissionID=%s;
2.4
SELECT dp.PostContent AS Content, DiscussionPostAnswers AS Reply
FROM DiscussionPosts dp
JOIN DiscussionPostAnswers da ON dp.PostID=da.PostID;
For seeing all discussion posts:
SELECT *
FROM DiscussionPosts;
For seeing post replies to discussion posts:
SELECT *
FROM DiscussionPostAnswers;
Finally, to actually post the reply:
INSERT INTO DiscussionPostAnswers (PostID, EmployeeID, DiscussionPostAnswer, TimePosted)
VALUES (%s, %s, %s, %s);
3.1
SELECT dtw.Day AND dtw.Timeslot AS OfficeHours, e.EmployeeFirstName AND e.EmployeeLastName as Name
FROM DayTimeWorked dtw
JOIN Schedule s ON dtw.ScheduleID = s.ScheduleID
JOIN Employees e ON s.EmployeeID = e.EmployeeID
ORDER BY OfficeHours ASC;
3.2
SELECT *
FROM FeedbackSurveys
ORDER BY CRN;
3.3
SELECT dp.PostTitle AND dp.PostContent as posts, e.FirstName AND e.LastName as sender, dpa.DiscussionPostAnswer as answer
FROM DiscussionPost dp
JOIN DiscussionPostAnswers dpa ON dp.PostID = dpa.PostID
JOIN Employees e ON dpa.EmployeeID = e.EmployeeID
WHERE answer IS NOT NULL;
3.4
SELECT *
FROM Assignments a
JOIN Submissions s ON a.AssignmentID = s.AssignmentID
ORDER BY a.CourseCRN;
4.1
SELECT *
FROM Enrollments
ORDER BY CRN ASC;
4.2
SELECT Feedback, CRN
FROM FeedbackSurveys
ORDER BY CRN ASC;
4.3
SELECT CRN, AVG(FinalGrade) as Average_Grade
FROM Enrollments
GROUP BY CRN;
4.4
SELECT se.Email as EmailAddress, c.Department as Department
FROM StudentEmails se
JOIN Enrollments e ON se.StudentID = e.StudentID
JOIN CourseSelections cs ON e.CRN = cs.CRN
JOIN Courses c ON cs.CourseID = c.CourseID
ORDER BY Department ASC;
REST API matrix
Reflection
This project was undoubtedly the hardest project I’ve ever completed in my college career. Not only was our group tasked with defining a new product and corresponding personas with statements about how they would use that product, we then had to create thousands of entries of sample data embodying these personas, import them into a UI system, and create front-end screens that allowed real-time functionality of the product sourced from the database we had created from scratch (as well as modeled through global and local entity-relation diagrams). Aside from the challenge of the project deliverables themselves, this project had a somewhat crunched timeline near the end of the semester, making it difficult for our group to coordinate meeting times and ensure deliverables were ready by the deadline.
At the same time, I can wholeheartedly say that I am a better programmer and designer because of my experience in this course and with this project specifically. Having to create our own database with our own entries and then figure out how to source and project that information in real-time is a skill that is highly valuable in the real world, and this project enabled me to see how what we were learning in the classroom could translate to a real-life data science problem. As mentioned, although design wasn’t a specific aim of the course/project, I also feel like my design skills improved by working on a front-end system using a new software. Finally, working on this team was a bit challenging at times as we struggled to divide the project work evenly, but I learned how to manage conflict, compromise, collaborate remotely, and problem-solve when issues came up, especially when the solution wasn’t always clear.