Software Engineer (Persistence)

Full time, onsite or remote, multiple positions


Shoreline provides real-time automation and control for cloud operations. Operators use Shoreline to orchestrate real-time debugging and automated repair across their fleets and services, reducing tickets and improving availability. As a Software Engineer at Shoreline, you’ll get to work on tools that give them leverage in their work.

We are a small, yet highly effective engineering team made up of team members who truly care about the product and each other.

As part of this team, you’ll have the opportunity to:

  • Build products that genuinely improve operational and SRE work, improve availability, and dramatically reduce MTTR

  • Use modern development practices

  • Have organizational visibility and get to influence the product and roadmap    


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. 


Who you are

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

  • ideep knowledge of SQL, schema design and relational databases

  • understands distributed systems

  • proficient in Go

  • working knowledge of Kubernetes ecosystem



Get to know us

At Shoreline, we believe work matters when it is useful – that the time we spend building is recovered a thousandfold in the time saved by our customers no longer doing unproductive manual tasks. We believe, to do our best work, we need to bring our whole selves to work – and be both accepted and respected for doing so. We believe doing something significant requires taking risks and accepting failures. We work at Shoreline because we want to participate in creating the environment in which we thrive.

We operationalize this by establishing core values by which we measure ourselves. In our performance reviews, we assign equal worth to how well employees exemplify our values as we do to the work they’ve produced. We are growing quickly. When interviewing candidates, we care as much about their fit to our culture as we do their ability to do the work. We strive to hire people better than ourselves, both on ability and on culture.

  • Empathy: We listen to our customers, our colleagues, and ourselves. We strive to understand what is important to others and to help them in meaningful ways. We focus outwards, not upon ourselves.

  • Curiosity, Creativity, and Courage: We use our curiosity to understand what is known. We use our creativity to  envision what could be. We use our courage to realize this future, even when uncomfortable.

  • Perseverance: We trust each other to do their work, and we believe in ourselves to do our own. We do what is necessary to succeed, carrying others along as required. We never give up, knowing we will find a way.

  • Humility: We don’t focus on our past accomplishments or failures. We treat each day as an opportunity to do better and become better. We seek out feedback and consider it a gift when provided.

  • Alacrity: We believe in making decisions quickly. Decisions are usually reversible while time cannot be recovered.

  • Delivery: We are builders. We are aggressive when setting goals, understanding that setting small goals leads to mediocrity. We commit fully to meeting the goals we set.


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