Interview Prep Hub

Emerger Tech: Golang Developer

Client: Emerger Tech  ·  Payroll: TalentCafe Solutions  ·  Mode: Hybrid, Chennai
Stated experience: 6+ years overall, 4+ years hands-on Go preferred
Core stack: Go, REST microservices, goroutines/channels, PostgreSQL/MySQL, Git, Linux, unit testing
Good-to-have: gRPC, Kafka/RabbitMQ/NATS, Docker, Kubernetes, AWS/Azure/GCP, CI/CD, MongoDB/Redis, observability, Agile

Read this first — where you actually stand

This is a mainstream Go backend seat, and unlike the Virtusa JD it is mostly inside your lane. Total experience clears the bar (~6 years). Go experience does not: ~3.5 years (Jan 2023 → now) against "4+ preferred". "Preferred" is negotiable; a stretched number is not. Say 3.5. If you say four and they ask what you were writing in Go in 2022, the answer is WooCommerce, and the interview is over.

The blunt risks, in order of how likely they are to sink you:

  1. DSA round. It is a must-have, and you have no evidence of formal practice. A WordPress → Go path is exactly the profile interviewers expect to be weak here. This is your single biggest exposure.
  2. Concurrency depth. You have one real story (async WhatsApp notifications). Good, but one story gets exhausted in two follow-ups. They will push into worker pools, cancellation, leaks, races, sync primitives.
  3. Stdlib Go vs Fiber Go. Fiber sits on fasthttp, not net/http. If they ask about http.Handler, middleware chaining, context propagation or server timeouts in the standard library, Fiber muscle memory won't carry you.
  4. The 40% latency claim. It is your best number. It is also the first thing a good interviewer will dig into. If you can't name the query, the plan change, the cache key and the TTL, it reads as resume inflation even though it's true.

Kubernetes, gRPC, MongoDB and GCP are good-to-have only. Not having them is not disqualifying. Bluffing them is.

Your opening for this JD

"I have about six years in software, the last three and a half as a Go backend engineer at 1Finance, a fintech platform. Before that I did PHP and WooCommerce work, which is where I learned to ship for real users. In Go I've built REST services on Fiber — I designed 28 production endpoints with JWT auth — and I've done the performance side: I cut API latency by around 40% by rewriting PostgreSQL queries and adding a Redis cache layer. I've used goroutines and channels in production for an asynchronous WhatsApp Business notification pipeline so the request path never blocked on a third-party API. I write unit tests for my Go code and deploy on Linux with Docker. Kubernetes and gRPC I understand conceptually but haven't run in production — happy to talk about how I'd ramp on them."

Note what this does: states 3.5 years before they compute it, and names the gaps before they find them. Everything you say afterwards gets believed.

1. Skill checklist — blunt ratings

Strong = you can go three follow-ups deep with real production detail. Adequate = real experience, but thin or narrow; expect to be pushed. Needs Review = you will be exposed if asked today.

Must-have

SkillRatingWhy
Strong hands-on GoAdequateReal, production, ~3.5 yrs. Below the 4+ preference, and Fiber-centric — not yet broad across the ecosystem.
Go fundamentals (interfaces, errors, packages, stdlib)Needs ReviewFiber hides net/http. Expect errors.Is/As/%w, small-interface design, embedding, nil-interface gotcha, package layout, context.
Goroutines / channels / concurrencyNeeds ReviewOne real use case. Patterns (worker pool, fan-out/in, errgroup, cancellation, leaks, mutex vs channel, -race) are what gets probed.
REST APIs & microservicesStrong28 production endpoints, JWT auth, gateway + services topology. Your home turf.
Data Structures & AlgorithmsNeeds ReviewNo evidence of formal practice. Highest risk item on this JD.
PostgreSQL / MySQLStrongPostgres query rewrites + 40% latency win. MySQL: you know it from WordPress days — say so, don't overstate InnoDB depth.
GitStrongDaily use, branching, PR workflow. Know rebase vs merge, cherry-pick, bisect.
Unit testing & debuggingAdequateYou write tests. Review table-driven tests, httptest, interface mocks, -race, -cover, pprof, delve.
Linux / UnixAdequateDeploys on Linux. Be fluent with ps/top, ss/netstat, lsof, journalctl, grep/awk, file permissions, signals.
Problem-solvingAdequateStrong in production debugging stories; unproven under a live coding timer.

Good-to-have

SkillRatingWhy
gRPCNeeds ReviewConfirmed gap. Conceptual fluency only — do not claim use.
Kafka / RabbitMQ / NATSNeeds ReviewDepth unclear. Your goroutine pipeline is in-process, not a broker — don't conflate them.
DockerAdequateContainerized Node services. Go-specific multi-stage / distroless builds need a quick refresh.
KubernetesNeeds ReviewConfirmed gap. Conceptual fluency only.
AWS / Azure / GCPNeeds ReviewBasic S3/EC2 only. No GCP. Azure DevOps as a user, not cloud infra.
CI/CD / DevOpsNeeds ReviewUses pipelines; unclear whether you've authored them. Know what a Go pipeline should contain.
RedisAdequateUsed as cache for the latency win. Review invalidation, TTLs, stampede, eviction.
MongoDBNeeds ReviewConfirmed gap.
Distributed systems / cloud-nativeNeeds ReviewMicroservices yes; idempotency, retries, circuit breakers, consistency trade-offs need articulating.
Monitoring / observabilityNeeds ReviewNo stated metrics/tracing work. Expect 'how do you know it's slow in prod?'
Agile / ScrumAdequateAzure DevOps user stories. Fine — just don't claim Scrum Master-level process ownership.

Scorecard: 3 Strong, 6 Adequate, 12 Needs Review. Of the Needs Review items, only three are must-haves — DSA, concurrency patterns, Go fundamentals. Those are where your next few days go. Everything else is a 30-minute conceptual brief.

2. What to study — Needs Review items

Must-have gaps (spend ~75% of your time here)

DSA Highest risk

  1. Drill these six patterns, ~4 problems each, in Go, timed at 25 min: hash map (two-sum, group anagrams, top-K frequent), two pointers / sliding window (longest substring without repeat, min window substring), BFS/DFS on grids and graphs (number of islands, course schedule), heap (k-th largest, merge k sorted lists), binary search on answer (search rotated array, koko eating bananas), and intervals (merge, insert, meeting rooms). These cover the bulk of service-company Go screens.
  2. Learn Go's DSA toolbox cold — the language punishes you here: container/heap (implement the 5-method interface from memory), sort.Slice, slices / maps packages, using map[T]struct{} as a set, a slice as a stack/queue, and the append-aliasing trap when you slice a slice.
  3. Practise saying complexity out loud before coding. "Brute force is O(n²); with a map it's O(n) time, O(n) space." Interviewers grade the narration as much as the code. Skip DP beyond climbing stairs / house robber — low ROI for this JD.

Concurrency patterns

  1. Write these from scratch, no reference, until each takes <10 min: a bounded worker pool with results channel; fan-out/fan-in; a pipeline with context cancellation; errgroup.WithContext calling three APIs in parallel and failing fast; a rate limiter with time.Ticker or golang.org/x/time/rate.
  2. Know the failure modes: goroutine leak (blocked send with no receiver — fix with buffered channel or select on ctx.Done()), closing a channel twice / sending on closed (panic), who closes (the sender), nil channel blocks forever (useful in select), data race vs deadlock, and running go test -race.
  3. Deepen your WhatsApp story. Answer now: Was the channel buffered, what size? What happened when it was full? How many workers? What happened to queued messages on deploy/restart (lost — in-process)? How did you retry failed sends? If the honest answer is "we lost them on restart", say so and say you'd move it to a durable queue. That's a senior answer.

Go fundamentals / stdlib

  1. Build one tiny service on net/http only (Go 1.22+ routing: mux.HandleFunc("GET /users/{id}", ...)), with a logging middleware as func(http.Handler) http.Handler, server timeouts, and graceful shutdown via signal.NotifyContext + srv.Shutdown. Then be able to say how Fiber/fasthttp differs (pooled contexts — don't retain *fiber.Ctx past the handler).
  2. Errors: fmt.Errorf("...: %w", err), errors.Is vs errors.As, sentinel vs typed errors, errors.Join, and why panics don't belong in request paths.
  3. Interfaces: implicit satisfaction, "accept interfaces, return structs", defining interfaces at the consumer for mocking, the typed-nil-in-interface trap, value vs pointer receivers and method sets, embedding. Also: slices vs arrays (len/cap/backing array), maps aren't safe for concurrent writes, defer evaluation order.

Good-to-have gaps (conceptual fluency, ~25% of time)

Kubernetes — minimum to talk intelligently

  1. Know the objects and what each solves: Pod (unit), Deployment (replicas + rolling updates), Service (stable DNS/VIP), Ingress (HTTP routing), ConfigMap/Secret, HPA (scale on CPU/custom metrics).
  2. Know what your Go service must do to be a good K8s citizen — this is where you can sound credible: liveness vs readiness endpoints, handle SIGTERM with graceful shutdown, read config from env, log to stdout, set resource requests/limits (and GOMAXPROCS/GOMEMLIMIT under cgroup limits).
  3. Spend one evening with kind or minikube: deploy a Go container, expose it, scale it, break the readiness probe and watch traffic stop. Then you can honestly say "I've labbed it, not run it in production."

gRPC

  1. Why: HTTP/2, Protobuf binary encoding, generated typed clients, streaming (unary, server, client, bidi). Typically internal service-to-service; REST stays at the edge.
  2. Write one .proto, generate with protoc-gen-go / protoc-gen-go-grpc, run a unary server + client. ~2 hours.
  3. Know: deadlines via context, status codes (codes.NotFound etc.) vs HTTP codes, interceptors as the gRPC equivalent of middleware, backward- compatible proto changes (never reuse field numbers).

Messaging (Kafka / RabbitMQ / NATS)

  1. The distinction: Kafka = durable partitioned log, consumer groups, replay; RabbitMQ = broker with queues/exchanges, per-message ack; NATS = lightweight pub/sub (JetStream adds persistence).
  2. Delivery semantics: at-least-once is the default reality → consumers must be idempotent (dedupe key, upsert). Ordering is per-partition only.
  3. Bridge to your story: "My notification pipeline was in-process goroutines. Its weakness is durability across restarts — that's exactly what a broker solves. I'd put RabbitMQ or Kafka in front with idempotent consumers."

Cloud (AWS / GCP), CI/CD, observability, MongoDB, distributed systems

  • Cloud: map the concepts once — compute (EC2 / GCE, Lambda / Cloud Run), managed Postgres (RDS / Cloud SQL), object storage (S3 / GCS), managed K8s (EKS / GKE). Don't go deeper than that for this JD.
  • CI/CD: be able to describe a Go pipeline: go vet → golangci-lint → go test -race -cover → multi-stage Docker build → push → deploy. Know what you have actually configured vs only used.
  • Observability: RED metrics (rate, errors, duration) via Prometheus, p95/p99 not averages, structured logs with request IDs (log/slog), traces via OpenTelemetry, net/http/pprof for CPU/heap/goroutine profiles.
  • MongoDB: document model, when it beats Postgres (flexible schema, nested reads) and when it doesn't (relational integrity, multi-row transactions — your fintech context is a natural "why we chose Postgres").
  • Distributed systems: timeouts on every outbound call, retries with exponential backoff + jitter, idempotency keys on POSTs, circuit breakers, outbox pattern.

3. Likely technical questions

Weighted to the must-haves. Click to expand what a strong answer hits.

1. Design a worker pool that processes jobs concurrently with a max of N workers, and stops cleanly on shutdown.
  • Jobs channel, N goroutines ranging over it, sync.WaitGroup, results/errors channel.
  • Sender closes the jobs channel; workers exit on range end; a separate goroutine closes results after wg.Wait().
  • select on ctx.Done() so cancellation stops in-flight work.
  • Mentions backpressure (buffered vs unbuffered), how to pick N (I/O vs CPU bound), and testing with -race.
func run(ctx context.Context, jobs <-chan Job, n int) <-chan Result {
    out := make(chan Result)
    var wg sync.WaitGroup
    for i := 0; i < n; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            for j := range jobs {
                select {
                case out <- process(j):
                case <-ctx.Done():
                    return
                }
            }
        }()
    }
    go func() { wg.Wait(); close(out) }()
    return out
}
2. What causes a goroutine leak? How would you find one in production?
  • Blocked on send/receive with no counterpart; missing ctx cancellation; HTTP calls without timeouts.
  • Detect: rising runtime.NumGoroutine() metric, /debug/pprof/goroutine?debug=2 to see stacks; goleak in tests.
  • Fix: every goroutine needs a defined exit path — usually ctx.Done().
3. Channels vs mutex — when do you use which?
  • Channels for transferring ownership / coordinating work between goroutines; mutex for protecting shared state (a cache map, a counter).
  • sync.RWMutex for read-heavy; sync/atomic for simple counters; sync.Once for lazy init.
  • Strong answers avoid dogma: "share memory by communicating" is a guideline, a mutex around a map is often clearer.
4. Walk me through how you cut API latency by 40%.
  • How it was measured (p95 before/after, which endpoint, what tool).
  • The query problem: N+1? missing index? seq scan? Show you used EXPLAIN ANALYZE and what changed in the plan.
  • Redis: what was cached, key design, TTL, invalidation on write, what happens on cache miss storm.
  • The trade-off you accepted (staleness window). Prepare this with real numbers before the interview.
5. A query is slow in production. How do you diagnose and fix it?
  • pg_stat_statements to find it; EXPLAIN (ANALYZE, BUFFERS) to read it.
  • Seq scan vs index scan, composite index column order, covering indexes (INCLUDE), partial indexes.
  • Avoid SELECT *, functions on indexed columns, OFFSET pagination on big tables (use keyset).
  • Go side: connection pool sizing (SetMaxOpenConns), N+1 from ORM loops, context timeouts on queries.
6. Design a REST API for orders with idempotent creation and pagination.
  • Resource naming, correct verbs and status codes (201 + Location, 400, 404, 409, 422).
  • Idempotency-Key header stored with the response so retries don't double-create.
  • Cursor/keyset pagination, filtering, versioning (/v1), consistent error envelope.
  • Auth (JWT — you've done this: validation, expiry, refresh), rate limiting, input validation at the edge.
7. How do you structure error handling in a Go service?
  • Wrap with context using %w; inspect with errors.Is/As; sentinel errors for domain cases (ErrNotFound).
  • Map domain errors to HTTP status in one place (handler/middleware), not throughout services.
  • Never leak internal error text to clients; log with request ID. No panics in request paths.
8. How do you unit test a handler that depends on a database and a third-party API?
  • Depend on small interfaces defined by the consumer; inject fakes/mocks (gomock or hand-written).
  • Table-driven tests with t.Run; httptest.NewRecorder / httptest.NewServer for the third-party.
  • For DB: real Postgres in a container (testcontainers) for integration tests rather than mocking SQL.
  • -race, -cover, and testing error paths, not just happy paths.
9. Your service calls an internal API that sometimes hangs. What do you do?
  • Never use the default http.Client (no timeout). Set client timeout + per-request context.WithTimeout.
  • Retries with exponential backoff + jitter, only on idempotent operations; circuit breaker to fail fast.
  • Always defer resp.Body.Close() and drain it so connections are reused.
  • Metrics on latency/error rate of the dependency so you can prove it's them, not you.
10. Live coding: given a list of transactions, return the top K merchants by total spend.
  • Aggregate in map[string]int64, then either sort (O(n log n)) or a min-heap of size K (O(n log K)).
  • Implement container/heap correctly; handle ties and K > distinct merchants.
  • Narrate complexity; mention money as integer minor units, not float64. (Your fintech background — use it.)

4. Follow-ups probing your gaps — honest framings

1. The JD says 4+ years of Go. You have about three and a half. Why should we consider you?

"That's right — three and a half years of Go, all in production at a fintech company, on top of about six years total. What I'd point to is the density: I've owned API design end to end, done the performance work on Postgres and Redis, and used Go's concurrency for a real async workflow. I'd rather you test me on depth than count months — happy to go deep on any of it."

Don't apologise, don't pad with PHP years. Then make sure your concurrency and SQL answers earn it.

2. Have you deployed to Kubernetes? How would you get our service running on it?

"Not in production — I've deployed containerised services with Docker on Linux. I've labbed Kubernetes locally. For a Go service I'd make sure it has separate liveness and readiness endpoints, shuts down gracefully on SIGTERM, reads config from env, and has sensible resource limits; then a Deployment, a Service, and an HPA. The cluster-level operations I'd expect to learn from your DevOps team in the first few weeks."

3. We use gRPC between services. Have you worked with it?

"Not in production — our services talk REST through a gateway. I understand the model: Protobuf contracts, generated clients, HTTP/2, deadlines via context, interceptors for auth and logging. I've built a small server and client to get hands-on. Since the contract-first approach is close to how I already think about API design, I'd expect to be productive quickly."

4. What about MongoDB, or GCP?

"Neither in production. My database depth is PostgreSQL plus Redis — and in fintech we deliberately leaned on relational integrity and transactions. I understand when a document store fits better. On cloud, I've used basic AWS S3 and EC2; GCP I'd map across — Cloud SQL, GKE, Cloud Run — and learn on the job. If either is core to this team, I'd want to know so I can prioritise it before joining."

5. Questions to ask them

  1. "Is Kubernetes and gRPC already core to the stack, or something you're moving toward?" — tells you whether your gaps are day-one blockers or growth areas.
  2. "What does the service landscape look like — how many Go services, and what do they talk to (Postgres, MySQL, Mongo, a message broker)?"
  3. "Who owns deployments and on-call — developers or a separate DevOps team?" — the JD says "support" Docker/K8s; find out what that means in practice.
  4. "What's the testing culture — coverage expectations, integration tests in CI, code review process?"
  5. "What would a strong first 90 days look like for this role?"
  6. For TalentCafe, separately: contract vs permanent, conversion path to Emerger, hybrid days per week in Chennai, and who handles appraisals. Payroll-through-vendor setups vary a lot — ask before the offer stage, not after.

If you only have three days

  • Day 1: DSA — hash map, sliding window, heap (8–10 problems in Go). Evening: write the worker pool + errgroup from memory.
  • Day 2: DSA — BFS/DFS, binary search, intervals. Evening: net/http mini-service with middleware + graceful shutdown; errors and interface review.
  • Day 3: Write out the 40% latency story and WhatsApp story with real numbers. One hour each on K8s (kind) and gRPC (hello-world). Rehearse section 4 out loud.