Don't Use That Library!

I had an interesting discussion with someone the other day. We were talking about a game jam he'd participated in and the tools they'd used and my own experience with different graphics/physics/gaming libraries. It made me realize a larger point that I see a lot of programmers and would-be programmers struggling with; probably as a result of the BUILD->RELEASE->ITERATE->MONEY cycle pounded into everyone's head by Silicon Valley news:

Stop using the library! If you want to know how to a website is made, or a webserver works, or physics simulations run, your first reaction should not be to search for and start using a library that does it. Certainly knowing a tested library -- hell, learning to use any library -- is an important skill, but it's one that cheats you out of the learning experience. Learning to use ThreeJS isn't terribly different from learning how to use Express or Angular, you're going to read an API and get it to do what you want.

But how does that help you learn the concept? Knowing that you need to use a directive that calls a function in a controller using a model stored in the factory isn't exactly helping you learn how HTML/CSS interact with Javascript. Plugging middleware into Express won't help you understand a client-server relationship, much less how a browser interacts with your server via HTTP. Don't be afraid to dive in over your head! You'll never grok how that tool works or what it's helping you with if you haven't experimented with what it's doing.

I'm going to pick on Javascript for a bit because that's where I see this most. Why is it that when I want to read how to use some npm module the introductory tutorials and examples require 3 other dependencies? I want to learn how to use your software, thanks, not read through 4 pages about configuring Express and your chosen platform. Show me using HTTP -- seriously. It's all I need to get started AND I get to understand what your library is doing. I can look at the network tab in a debugger and track what your library is adding. If I want to add your project into, say, my own configuration of a current idea I don't have to wonder if it'll work the same way because I know what it's doing.

Which is really the key part here: Learn about a new concept and play with it in a new application. Peel back the abstraction a bit. Programming doesn't have to feel like sticking black magic boxes together.