Front-end engineers should be experts in both JavaScript and CSS
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 encompasses HTML, CSS, JavaScript, DOM APIs, build tooling, and more — has been valuable toward solving business problems and improving the experiences I can provide for users. There are data transformation problems I once found challenging that I now see as straightforward, and there are layout scenarios 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 order to solve a problem – rather, it is always 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 this 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.
There are many people in front-end practices who think they can get away with being either a JavaScript or CSS specialist. In reality, this isn’t a coherent specialization. Rather, it’s the specializations of application engineering and UI engineering that are two complex, challenging areas within the front-end sphere.
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 operational 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 assessing a candidate, I wouldn’t stress too much about small gaps in one area or another. But the truth is that 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.
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, using the most appropriate solution for whatever problem is at hand.