It’s not JavaScript developer or CSS developer

Do you need to learn JavaScript when you have team members who are experts in it? Do you need to learn CSS when most of your work is talking to APIs and wrangling asynchronous state? I’m convinced these are the wrong questions.

JavaScript and CSS are technologies, not practices. These technologies provide approaches to solutions, but they are not goals in themselves.

When I look across my work as a software engineer focused on front-end applications over the past several years, a few things stand out. Most notably, every bit of competency I’ve developed across front-end technologies — which I’ll define as HTML, CSS, JavaScript, DOM APIs, and build tooling — has been valuable toward solving business problems and improving the experiences I can provide for users. There are algorithmic problems I once found challenging that I see as trivial, and there are layout needs I once saw as one-off that I’m now able to express as systems.

My goal has never been to write JavaScript or to write CSS in solving a problem, but to solve the problem, deliver value, and make something maintainable and appropriate for the use cases it needs to handle.

When you look at things that way, there are problems that are extremely challenging to address with JavaScript that are trivial with CSS. There are problems that cannot be expressed or encapsulated with CSS that are easily handled with JavaScript. There are usability concerns that require active focus management and keyboard shortcuts, and there are presentation solutions that can meaningfully cut down on application logic by handling arbitrary content without counters and edge cases.

This discussion of JavaScript vs CSS development as silos that engineers can practice in isolation is a red herring that distracts from a more meaningful separation of roles: application and library engineering vs UI engineering.

Application development and UI engineering are two complex, challenging areas within front-end development.

Building application logic is the conventional JavaScript domain, and creating user interfaces is the conventional CSS domain. However, the problems within either space are frequently solved through one technology or the other without regard for any arbitrary division. And practicioners in either area might focus on that area for a project or for a decade, but I don’t believe an effective developer in one space couldn’t easily practice the other.

Of course, people will have strengths and weaknesses, and a good team will have practicioners responsible for guiding areas of development. We can’t measure everyone against the same bar, and that’s historically been a mistake of many organizations — exclusively hiring computer science graduates, and wondering why the product is impenetrable to users, or seeking out excellent design talent, and wondering why there’s a lack of automated testing and metrics.

I have the benefit of incredible past mentorship and experiences in both of these areas, and I hold myself and others to a high standard; still, when looking at candidates I wouldn’t stress too much about small gaps in one area or another. But the truth is, over the course of a career, it’s necessary to fill out those gaps and establish a baseline of competency across all areas your core practice interacts with.

Regardless of whether you develop applications or websites, it’s necessary to know the tools available to most effectively solve your problems and create good software. That tool might be a web technology, or it might be streamlining the UX to eliminate a complex and expensive technical problem.

Regardless of specialized roles, experience with all tools available is a must.

Especially in a large-scale web application, even though there are more team members and more specialized roles, a self-described JavaScript developer should be able to write scaleable, maintainable CSS. A CSS developer should be able to write JavaScript in their project’s framework and contribute to application features. There’s no escape hatch from the responsibility of actively designing and maintaining large systems in front-end applications.