What we test for
Typical work
- Real-time features: presence, channels and anything with a socket per user
- Ingestion pipelines with back-pressure instead of a queue that grows
- LiveView screens that replace a single-page application nobody wanted to maintain
- Taking over a codebase where every process is a GenServer and nothing is supervised
The coding test
A GenServer has become the bottleneck: every request in the system goes through one process and its mailbox grows under load. Move the state so the work parallelises, and keep the guarantee the original design was there to provide. Then make a supervisor restart it without losing in-flight work. Scored on the guarantee, not on the throughput number.
Five interview questions you can reuse
We use questions like these in our soft-skills and technical rounds. Steal them for your own interviews.
What does "let it crash" actually mean in a system that has users?
A strong answer covers: That you do not write defensive code for states you cannot reason about; you let the process die and let a supervisor restart it in a known good state. It does not mean ignoring errors a caller can handle, and it does not survive bad supervision: a restart strategy that keeps restarting a process that fails on the same poisoned message is a loop, not resilience.
When is a GenServer the wrong tool?
A strong answer covers: When it only holds state that could live in ETS or be derived, or when every request has to pass through it. One process is one queue, so it serialises everything it touches. GenServers are for state that genuinely needs an owner and a lifecycle, not as the default way to write a module.
How do you handle back-pressure on an ingestion pipeline?
A strong answer covers: With a demand-driven stage, GenStage or Broadway, so the consumer asks for work instead of the producer pushing it. The alternative is a mailbox that grows until the node dies, which looks like a memory leak and is actually an architecture choice. The number worth agreeing up front is what happens when the source is faster than the sink for an hour.
What goes wrong with LiveView state?
A strong answer covers: Putting everything in assigns and shipping it to the client on every diff, or storing something per connection that should be shared. Temporary assigns and streams exist for exactly that. The second problem is treating a LiveView like a controller: the process lives as long as the tab, so anything it holds, it holds for hours.
Where do Ecto changesets belong?
A strong answer covers: As close to the boundary as possible, one per use case rather than one per schema. A single changeset shared by registration, an admin edit and an import ends up with every field optional and validation that means nothing. The schema describes the table; the changeset describes what a particular operation is allowed to change.
One invoice a month.
The shortlist is free. Pick the contract that suits you: monthly, six months or twelve.
What every seat includes
- Contracts, payroll and compliance handled
- Vetting: coding test, soft skills, English and a level check
- Free replacements: unlimited on 12+ months, 2 on 6 months, 1 on monthly
- A direct line to our CEO
Terms in plain words
- Monthly, six months or twelve, your choice
- Your rate is locked for the whole contract on 6 and 12+ months
- Monthly ends with 30 days’ notice
- Want to hire the developer full-time? The buyout is set in the contract from day one
Questions tech leads ask us
How senior are your Elixir developers?
6+ years of professional backend work, with production Elixir. Brazil and Argentina have a real community; we ask what they run, how many connections it holds, and what woke them up.
Is LiveView a good idea for our product?
A senior will tell you when it is not: offline behaviour, heavy client-side state, or a mobile app that needs an API anyway. We ask the question in the interview rather than assuming the answer.
Skip the sales rep. Talk to the CEO.
Tell us what you're building, your stack and when you need people. Three vetted profiles per role within 48 hours of the call, and a straight answer on whether we're the right fit.