With the rise in deployment frequency, shift to microservices, and increasing business expectations, operations teams are struggling to handle ticket volumes and meet service level objectives. Despite the current observability and automation tools on the market today, the diagnosis and remediation of issues continues to be slow and mostly manual.  This is unsustainable.

Shoreline Software is a stealth-mode DevOps startup focused on reducing operational pain.  Founded in 2019 by people who built and operated mission critical databases and cloud services that ran on millions of hosts using self-tuning feedback control systems, Shoreline’s mission is to help operators reduce tickets and improve service availability by an order of magnitude through automation.

Headquartered in the Bay Area with employees around the world, Shoreline raised a significant Series A round from notable investors including NTTVC and Canvas Ventures. We are well-funded with several years of runway. 


What you'll be doing

This is an opportunity to shape the early stages of a product’s core features and its backend architecture, on a team that is redefining the way people manage their cloud ecosystems. 

Do you seek to be in environments where your work will have a powerful impact on all parts of the system? As part of the persistence and execution team at Shoreline, you will design and develop algorithms to manage data-at-scale effectively and reliably. In addition to building clean, performant, and highly reliable solutions, you will write high quality design documents, participate in code reviews and develop features for the subsystem. 


What you should have

We are looking for a team player who

  • is a proficient programmer

  • is good at algorithms and data structures

  • has a user-level understanding of SQL

  • is very detail-oriented

  • is eager to learn and can thrive in a dynamic, fast paced environment



Bonus Points


  • deep knowledge of SQL, schema design and relational databases

  • understands distributed systems

  • proficient in Go

  • working knowledge of Kubernetes ecosystem


How to apply

If interested, please design and implement a solution to the following problem.  Please use source control for your solution and include a link to the repository.  If you do not want to apply using this web system, please email the solution (attach or include link to repo/gist) and a resume to cristina@shoreline.io. Please include "Software Engineer - Persistence" in the subject of your email.

Problem

Your mission if you choose to accept it, is to design and implement a simplified system that models a university student enrollment system.

Requirements:

  • Students with the following information:

    • ID - an integer that uniquely identifies a student

    • Name - Students full name (first name followed by last name)

    • Mobile phone number 

  • Courses with the following information:

    • CourseCode - a string that uniquely identifies a course

    • Name - name of the course

  • Enrollment that indicates which courses a student is enrolled in

    • StudentID

    • CourseCode

    • Date Enrolled

    • Final Grade

  • Due to memory and disk constraints, this data is stored in two separate databases partitioned such that: All data pertaining to students whose first name with A through M is recorded in database_1 and data for those students whose first name starts with N through Z is in database_2. For example, a student with the name “Justin Smith” who is taking course IDs “DB101”, “ALGO201” would have two rows in the enrollment table of database_1, one for each course he’s taking. Another student with name “Sanjit Patel” who is taking course IDs “DB101”, “ALGO201” would have two rows in the enrollment table of database_2.

Coding guidelines:

  • You can use any language of your choice to implement the application level code.

  • For each task involving a SQL query, we have provided method stubs for helper functions that take in two arguments: database name and string for the sql query. These functions make a single call into the SQL server, execute the query against the database, and decode the results into the structures outlined in the stub. These stubs are written in golang, however you can assume these helper functions are implemented for you.

  • For the database schema design and types, you can use the spec from any database engine of your choice. For example: sqlite3 types are defined here.

  • You can assume that the dbs exist on the same server. The helper functions provided can make calls to either database.

  • Code snippets should be isolated pieces of working code that perform the requested task and follow the outlined spec. Snippets may include helper functions along with the main function. If having in-memory global data structures help, please feel free to use them and include them in your code. 

Tasks:

  • Design a schema for entities: Students, Courses and Enrollment. Skim through the list of tasks below - this may help influence some schema design choices.

  • Are there any indexes that would help with the below tasks?

  • What tables do each database_1 and database_2 have? Explain your reasoning.

  • Create type structures in your language of choice for each object of interest.

  • Write a code snippet that queries the SQL server to list all the courses that a student is taking. The second function is already implemented for you.

    • Function to implement: 

      • func getCourses(studentName string) ([]Course, error)

    • Provided helper function: 

      • func executeGetCoursesSql(dbName string, query string) ([]Course)

  • Write a code snippet that queries the SQL server to list all the students taking a certain course. Briefly explain the choices you make. For example, course with CourseCode “ALGORITHMS1”

    • Function to implement: 

      • func getStudentsInCourse(courseCode string) ([]Student, error)

    • Provided helper function: 

      • func executeGetStudentsInCourseSql(dbName string, query string) ([]Student)

  • Write a code snippet that upon student registration records the information into the right database.

    • Function to implement: 

      • func enrollStudent(name string, number uint64, []Course) error 

    • Provided helper function: 

      • func executeEnrollStudentSql(dbName string, query string) error

  • Write a code snippet that efficiently queries the information in the relevant databases and lists all the courses that are enrolled in by a given set of students. This code should query only the databases required.

    • Function to implement: 

      • func getCoursesForStu dents([]Student) (map[Student][]Course) 

    • Define the helper function that makes the API call to the sql server, following the same format as the helper functions provided previously.

If you have any clarifying questions, please email: cristina@shoreline.io