Today I got an email from a recruiter. I get a lot of emails from recruiters, but unlike most this guy recognized I wouldn’t be able to take his job opening. Instead, he asked me a question:

I thought that you might be the right person to ask. Is raw js still a must for any talented, cutting-edge front-end engineer? I only ask because I’ve basically been told to nix anyone that relies on libraries.

Thats a good question to ask, but it’s a very complicated question as well. I think I’ll give my answer in the form of an analogy.

My dad is a carpenter, by trade. He has a workshop shed in his back yard that is full of all sorts of tools. I can remember that when I was a kid, at least once a month, he’d buy some new tool from the hardware store that would enable him to do something significantly easier than he could before. Different kinds of clamps for different types of glue joining. New bits for his router that would let would let him create some new intricate shape to the edge of a frame. Saws of all shapes and sizes for the various kinds of cuts needed to be made on all the different kinds of wood (table saws for long cuts, circular saws for cutting large sheets, a band saw for intricate small cuts). He knew how to use every tool in his shop, and put them to amazing use.

Every so often, however, he would get an idea for something he wanted to make that required a tool that didn’t exist. It could be it required some kind of customized join, or a guided cut that was too intricate to do by hand. Some carpenters might give up on that idea, or do it in a way that was almost right, but came out sloppy, but not him, he was more resourceful than that. He would think about the problem for a while and then invent his own tool to accomplish it. Sometimes there might be an existing tool that could accomplish what he needed, but that he couldn’t afford the buy. He would spend some time examining the tool at the hardware store and then reverse-engineer his own solution.

Not every carpenter needs to be that resourceful to do their job. A construction worker building an apartment doesn’t need to know how their tools work to get things built. They can assemble walls and hang sheet-rock without knowing how their air hammer actually works. An assembly line worker building cabinets in a furniture factory doesn’t need to know the engineering that went into the presses and jigs that help them do their job.

Software development is digital carpentry; software libraries are the tools that help us build things easier. Sometimes all you need is someone who knows how to use those tools to build what you want, but sometimes you need a person like my dad who can make their own. The term “artisan” gets misused a lot these days, but that’s really the difference.

I’ve worked with engineers who were perfectly capable of building entire websites without knowing how jQuery actually worked, or even how to work with the DOM directly. They were fine at doing their jobs, as long as their jobs didn’t require going beyond the limitations of their tools. If they were given tasks that required writing complicated logic in JavaScript, something that couldn’t be accomplished with existing libraries, they would often struggle with it for a long time. Ultimately they’ll produce something that might work, but lacks elegance. Some of them would just give up and hand the task off to someone smarter than themselves.

The thing is, there’s nothing wrong with that. A lot of companies think they need all artisans to get their project built, but really they could be perfectly fine with just a few smart guys who can take the difficult tasks, make the critical decisions and build the domain specific libraries needed for the project, so that the tool wielding workmen can build the rest. You need to know which of those two types the team actually needs.

Everyone relies on libraries. The important question is if they can learn and/or build new ones.