cioc

cioc

Elixir Engineer building distributed systems and ml @ Shoreline Software (full-time, remote or onsite)

Have you designed, built, and operated distributed systems? Have you monitored and administered JVMs, databases, and other infrastructure? Are your Elixir and functional programming skills second to none? If so, then you should consider joining us at Shoreline Software.

At Shoreline, we believe operators shouldn’t wake up when servers go down, systems should be fault tolerant & self healing, and stability comes from automatic adjustments rather than operator alarms. A control plane built on adaptive feedback control will enable this. Operators can then focus on automating issue resolution instead of watching dashboards and manually grinding ticket queues.

We are building a distributed control plane designed for scalability, fault tolerance, and portability. We are creating an ops language that is concise, fluent, and distributed. We are a small, but well funded, team looking for Elixir engineers from all over the world to deliver this system. We pay competitively. While this position can be remote, you may be asked from time to time to travel to and work from the main office located in Redwood City, CA.

Learn more: https://shorelinesoftware.com

About Us

My name: Charles Cary
My position: Founding Engineer
Company name: Shoreline Software, Inc.
Website: shorelinesoftware.com
Country: USA
Company info and history (how you’re using Elixir etc) :

About the job

Job title: Elixir Engineer
Job description: See above.
Salary range: Competitive
Position on remote work:

While this position can be remote, you may be asked from time to time to travel to and work from the main office located in Redwood City, CA.

Qualifications or experience required:

We need people with strong Elixir skills and experience with at least one of the following: distributed systems, DevOps (AWS, GCP, Azure or on-prem), machine learning, or language design & implementation. Written English competency, confidence & ability to work in a remote team, git skills, and competency writing tests are required. Open source contributions, experience operating systems at scale, and commercial experience with Erlang/Elixir are all pluses.

What the successful job applicant will be working on: See above.

About the interview process

If interested, please design and implement a solution to the following problem. Email the solution (attach or include link to repo/gist) and a resume to jobs@shorelinesoftware.com.

Problem

Imagine you are building a system to assign unique numbers to each host that you manage. You want the ids to be guaranteed unique i.e. no UUIDs. Since these ids are globally unique, each id can only be given out at most once. The ids are 64 bits long.

Your service is composed of a set of nodes, each running one process serving ids. A caller will connect to one of the nodes and ask it for a globally unique id. There are a fixed number of nodes in the system, up to 1024. Each node has a numeric id, 0 <= id <= 1023. Each node knows its id at startup and that id never changes for the node.

When a caller requests a new id, the node it connects to calls its internal get_id function to get a new, globally unique id. The last_id that the node gave out is passed as a parameter to get_id.

Your task is to implement get_id (interface below). You are given helper functions for getting the node id and the current timestamp. There is no need to implement these functions.

 defmodule GlobalId do
  @moduledoc """
  GlobalId module contains an implementation of a guaranteed globally unique id system.     
  """

  @doc """
  Please implement the following function.
  64 bit non negative integer output   
  """
  @spec get_id(non_neg_integer) :: non_neg_integer
  def get_id(last_id) do
      
  end

  #
  # You are given the following helper functions
  # Presume they are implemented - there is no need to implement them. 
  #

  @doc """
  Returns your node id as an integer.
  It will be greater than or equal to 0 and less than or equal to 1024.
  It is guaranteed to be globally unique. 
  """
  @spec node_id() :: non_neg_integer
  def node_id 

  @doc """
  Returns timestamp since the epoch in milliseconds. 
  """
  @spec timestamp() :: non_neg_integer
  def timestamp
end

You may add other functions to the implementation in order to complete your solution. If you must modify the interface to get_id to complete your solution, please provide an explanation as to why this change is necessary.

Assume that any node will not receive more than 100,000 requests per second.

Please choose a structure for your global id and describe it. For each part of your structure, please explain why it is necessary and include any defining information such as size (in bits). If applicable, explain how the size of the section is related to the maximal request rate per node.

We will evaluate your solution for correctness, simplicity, clarity, and robustness. Providing tests is a huge plus.

If you have any clarifying questions, please email: charles@shorelinesoftware.com

Interview Process

  1. Submit your solution and resume to jobs@shorelinesoftware.com
  2. Informational phone screen where we can get to know each other, ask/answer any questions, and evaluate fit (1hr).
  3. Technical phone screen with live coding (1hr).
  4. Final round of technical interviews with the team, live coding and other questions (~4hrs).

We will get back to you quickly after each step in the process.

Most Liked

cioc

cioc

We still have many open positions, so please don’t hesitate to reach out! Thanks!

cioc

cioc

Hi all! We have updated the interview question. It is now focused on the implementation of the get_id function, rather than whole system design. This means it should take roughly one hour to complete. Please let me know if you have any questions: charles@shorelinesoftware.com Thanks!

Where Next?

Popular in Jobs Top

bbenligiray
ChainAPI is an integration platform for setting up API gateways to smart contracts running on blockchains. ChainAPI is a founding member ...
New
alanvardy
Introductory paragraph Hello, my name is Alan Vardy, and I am the Tech Lead on Blitz’s Backend team. We are seeking a senior and mid-lev...
New
LucaMausberg
Introductory paragraph We at Marko strive to make second-hand the first choice. We will make buying and selling second hand online easy,...
New
jeffdeville
UPDATE1 - See end of post The Project I need to scrape the content from several sites all into a common format, so that I can create a ...
New
andre1sk
https://adobe.wd5.myworkdayjobs.com/en-US/external_experienced/job/Seattle/Functional-Programming-Generalist_46723-1
New
bengerson
Introductory paragraph Hello Elixir enthusiasts! We’re excited to announce a great opportunity at Candidately. We’re currently seeking a...
New
distru
Senior Full Stack Software Engineer - Distru, Remote Worldwide Introductory paragraph Powering Trade For The Emerging Cannabis Industry...
New
sebz
Introductory paragraph TL;DR: Elixir, Monitoring, Zero downtime, DB migration, K8S We’re looking for a versatile profile to join our Sof...
New
glennr
About us Bramble is a platform for banking/insurance/BPOs to improve how they manage their operations. We have traction and are growing...
New
pepsico
About us My name: Henry Mori My position: Lead Engineer, B2B &amp; D2C eCommerce Company name: PepsiCo, Inc. Website: Job Description...
New

Other popular topics Top

sergio
In Ruby, I can go: User.find_by(email: "foobar@email.com").update(email: "hello@email.com") How can I do something similar in Elixir? ...
New
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
New
yawaramin
In the Dialyzer docs ( http://erlang.org/doc/man/dialyzer.html#requesting-or-suppressing-warnings-in-source-files ), there is a way to tu...
New
joaquinalcerro
Hi there, I am working with Ecto-Postgresql and I need to call all of the records from a specific table but the table has 40,000 record...
New
AstonJ
You’re a programmer, so you don’t need spoon feeding with the conventional drivel about “this is an integer.” No. You need to know what’s...
New
fireproofsocks
I’m working on defining a simple Ecto schema for a table (in PostGres), but I don’t see where I can define a column as NOT NULL. Conside...
New
vac
Hi, I'm quite new in Elixir and I'm trying to format a string to a PEM format. I have the certificate value like MIIDBTCCAe2...... and ...
New
fayddelight
I tried installing elixir 1.11.2 erlang 23.3.4 via asdf in my zsh shell. Enabled the versions locally and globally. When I list them ...
New
electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New

We're in Beta

About us Mission Statement