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 to make that required a tool that didn’t exist. It could require some kind of customized join, or a guided cut that was too intricate to do by hand. Sometimes there might be a tool that could do what he needed, but he couldn’t afford it. Some carpenters might give up on that idea, or do it in a way that was almost right, but came out sloppy. Not my dad, he was more resourceful than that. He would think about the problem for a bit and then invent his own tool to accomplish it. If there was an existing tool that that was too expensive, or came just short of doing what he needed, he would spend some time examining that tool 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 the job done. They can assemble walls and hang sheet-rock without knowing how their air hammer actually works. Someone 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 just 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 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, they would struggle with it for a long time and ultimately produce something that might work, but would be really shoddy code. Some of them would just give up and hand the task off to someone smarter than them.

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.