Skip to content
  1. Home
  2. Hire
  3. Back-End
  4. Go
Hire developers

Senior Go developers: 3 vetted profiles in 48 hours

Senior Go engineers for services that have to stay up: a reason, an owner and a way to stop for every goroutine, and a binary that ships without a runtime under it.

What we test for

Go 1.22net/http, chi or ginGoroutines, channels and contextgRPC and protobufPostgreSQL with pgx or sqlctesting and testify, with the race detector on in CIDocker and Kubernetes

Typical work

  • APIs and internal services where latency is a requirement rather than a hope
  • Workers and pipelines that process a queue without losing a message
  • Replacing a service that spends more on its runtime than on its work
  • CLI tools and operators the rest of the engineering team actually uses

The coding test

A worker leaks goroutines when its context is cancelled and the leak only shows under load. Find it with the race detector and pprof, then fix the lifecycle so every goroutine has an owner and a way to stop. Then add a rate limit that is still correct with twenty callers. Scored on whether context reaches the bottom of the call stack.

For your interview loop

Five interview questions you can reuse

We use questions like these in our soft-skills and technical rounds. Steal them for your own interviews.

  1. When do you reach for a mutex instead of a channel?

    A strong answer covers: When the thing being shared is state rather than a message. A channel moves ownership; a mutex guards a value several goroutines genuinely need to read. Modelling cached state as a channel produces a goroutine that exists only to answer questions, which is a lock with extra steps and a worse stack trace.

  2. A goroutine leak only appears in production. How do you find it?

    A strong answer covers: pprof on the goroutine profile, taken twice a few minutes apart, and compare. The stacks tell you where they are parked, and the answer is nearly always a send or receive on a channel nobody is reading, or a missing context cancellation. The fix is structural: whoever starts a goroutine is responsible for ending it.

  3. Why does a nil interface not equal nil?

    A strong answer covers: Because an interface carries a type and a value, and a nil pointer of a concrete type gives you a non-nil interface with a nil value inside it. It bites hardest when a function returns a typed error pointer as an error; the caller checks err != nil and it is true even though nothing went wrong. Return the error interface, not the concrete type.

  4. How do you decide what an error should carry?

    A strong answer covers: Enough for the caller to act, and enough for a reader to locate it. Wrap with %w so errors.Is and errors.As still work, add what the operation was rather than restating the function name, and stop wrapping at the boundary where you log it. Sentinel errors for the cases a caller will branch on, nothing for the ones it will not.

  5. Where should an interface be defined?

    A strong answer covers: Where it is used, not where it is implemented. A consumer declares the two methods it needs; the producer returns a concrete type. The opposite habit, one big interface next to the implementation, is how a package ends up with a mock of itself and an interface nobody can change.

How we work

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
Get 3 profiles in 48 hours

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

The full terms, contract by contract

Questions tech leads ask us

How senior are your Go developers?

6+ years of professional backend work, with recent production Go. Many came from Java or Node, which is normal in this language; we test the concurrency model rather than how long their go.mod has existed.

Can they work on our Kubernetes tooling too?

Often yes, and we will say so on the profile. The same people write the operators and the admission controllers, but we test for it separately rather than assuming it.

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.