Section650

Writing

TopicLeadership
Reading7 min

Specialization Shouldn’t Stop at Understanding Your Own Code

Specialists matter. The trouble starts when engineers can’t follow a user’s problem across a system boundary, explain what they need from another team, or see how their decisions land on someone else.

By Ka Lun Chan · Engineering leadership · Leadership / Learning

Deep expertise and broad understanding do different jobs

Over more than 23 years in VoIP, publishing, SaaS and government applications, I’ve worked across React and Next.js, Python with Django and DRF, Rails, Node.js, APIs, AWS and CI/CD, from application code through architecture to production operations. I’ve led small teams and larger distributed ones. In my experience, the problems that drag on are often the ones that cross a boundary nobody is watching, more than the technically hardest ones.

Specialists matter. A frontend engineer who understands rendering, accessibility and state management builds things a generalist can’t. A backend engineer who knows query plans and transaction isolation prevents problems most people never see. Neither needs to master the other’s field.

Specialization becomes a problem when engineers can’t follow a user’s problem across system boundaries, explain what they need from another team, or see how their decisions affect someone else’s work. Depth in one area works best with enough understanding of the neighboring systems to investigate and collaborate.

“The API works” doesn’t solve the user’s problem

Here’s a hypothetical. An endpoint returns 200 OK and passes its tests. The frontend developer building on it finds that a field is missing whenever a record is incomplete, dates come back in two formats, and validation errors arrive as a single string the UI can’t attach to a form field. Each problem is small. Together they mean a week of defensive code in the interface.

From the backend side, the API works. From the user’s side, the form still doesn’t. Correctness for an API includes whether its consumer can build something reliable on it. I go deeper on that in what building and operating real systems has taught me about APIs.

Frontend engineers need enough backend knowledge to ask

Another hypothetical. A frontend developer needs a searchable table of applications. The list endpoint returns everything, so they download the whole dataset and filter it in the browser. With two hundred records, nobody notices. With fifty thousand, the page takes seconds to load, uses a lot of memory on older phones, and may expose records the user shouldn’t see if authorization only happens in the UI.

The developer did their best with what they had. What was missing was the knowledge to ask for something better. Someone who understands pagination, server-side filtering and sorting, where validation and authorization have to live, and when work should run asynchronously can make a specific request: “Can the list endpoint accept a status filter and a page size, and enforce the reviewer’s permissions on the server?” That’s a twenty-minute conversation instead of a workaround someone maintains for years.

Backend engineers need enough frontend knowledge to design and investigate

The first place that knowledge pays off is the response body. A backend engineer who knows how the screen will use the data can shape a payload the frontend developer can render without reworking it: the fields a list view needs without the extras only the detail page uses, stable field names, a clear rule for which fields can be null, dates in one standard format, status values with labels the UI can show, and validation errors keyed to the form fields they belong to. A quick look at the design or a short conversation with the frontend developer before writing the serializer usually settles most of it.

The second place is troubleshooting. Here’s the mirror image of the earlier example, also hypothetical. A user reports that saving a form fails. The backend developer checks the logs, sees the request return 200, and closes the ticket as “works on our side.” The browser, meanwhile, refuses to hand the response to the page because the API didn’t send the right cross-origin (CORS) headers for that origin.

The backend developer doesn’t need to own the frontend to catch that. They need to know enough to open the browser’s network panel, read the console error, check the preflight request and the response headers, and understand how cookies and client state affect what gets sent. Ten minutes in the network tab, together with the frontend developer, would have moved the issue to the right place: the server’s CORS configuration.

Better collaboration starts with evidence

“The backend is broken” starts an argument. A report with the request, the response, what was expected, the steps to reproduce it and who is affected starts a fix. The second version takes a few more minutes to write and saves hours on the other side.

The same goes the other way. “Just handle it in the frontend” closes a conversation. “Where should this responsibility live, and who else will need it?” opens one, and sometimes the answer really is the frontend.

Developer quality of life is an architecture concern

Consistent error shapes, predictable contracts, documentation generated from the schema, stable test data and a local setup that runs with one command don’t show up in product demos. They show up in how much friction every engineer hits every day.

One backend change, returning field-level validation errors in a consistent format, can remove the same parsing code from every form in the frontend. That trade, a small amount of work in one place to save repeated work in many, is architecture even when nobody draws it on a diagram.

Some complexity belongs on the client, some on the server

Not every frontend inconvenience should become a backend feature. Presentation state, like which panel is open, what’s sorted on screen or a draft the user hasn’t submitted, belongs in the client. Shared business rules, authoritative validation and access control belong on the server, because the browser can’t be trusted to enforce them and every client would otherwise reimplement them. The frontend can validate for a faster experience. The server has the final say.

Leaders can create the silos they complain about

Separate frontend and backend backlogs, ownership drawn tightly around layers, recognition based only on closing individual tickets, and handoffs without shared acceptance criteria all teach people to stop at their boundary. Telling developers to “be more full stack” doesn’t change any of that.

The costs land on the business: features delayed while two teams negotiate, rework when the pieces finally meet, fragile workarounds, more support tickets, and a growing dependence on the few engineers who understand the whole path. Those people become a single point of failure, which is what I try to remove in how I mentor engineers.

Shared understanding without universal expertise

A few habits do most of the work:

  • Pair across specialties on bugs that cross the boundary.
  • Trace one real request together, from the click to the database and back.
  • Review API contracts before anyone builds either side.
  • Run short walkthroughs of adjacent systems, led by the people who own them.
  • Write acceptance criteria that describe the user’s outcome, not each layer’s task.

This takes time, and it has to be protected time. If it only happens after the sprint work is done, it won’t happen.

How much breadth to expect depends on the team. On a team of three or four, most people need to cover several layers, because there’s nobody else. A larger organization can support deeper specialists, as long as the interfaces between them are clear and people still collaborate across them. In neither case should every developer be expected to handle every layer or every incident. Broader knowledge improves judgment. It shouldn’t become a reason to overload people, which is part of why team size should influence architecture too.

Short answers

Should frontend developers learn backend development?

Enough to ask useful questions. Understanding pagination, server-side filtering, validation, authorization and asynchronous processing lets a frontend developer request the right API change instead of building fragile workarounds in the UI. They don’t need to become backend specialists.

Should backend developers learn frontend development?

Enough to design payloads the UI can use and to investigate problems in the browser. Knowing how a screen renders data helps a backend developer choose the right fields, consistent names and formats, clear null rules and field-level errors. Knowing the network panel, CORS and cookies helps them narrow down issues without owning the frontend.

Why does an API return 200 but the browser shows an error?

Often because of cross-origin resource sharing (CORS). The server handled the request, but the browser won’t give the response to the page without the right headers for that origin. The browser’s network panel and console show the preflight request and the missing headers.

Should validation happen on the frontend or the backend?

Both, for different reasons. Frontend validation gives users faster feedback. The server’s validation is authoritative, because the browser can’t be trusted to enforce business rules or access control.

Strong in one area, curious about the next

I don’t need every engineer to know everything. I need them to be able to follow a problem past the edge of their own code.

Be strong in your specialty, and curious enough about neighboring systems to investigate problems, ask useful questions and help deliver a working product.

It’s the same argument I made in you don’t need to remember everything: understanding how systems connect matters more than memorizing all of them.

Talk about building a team that collaborates across layers