We Haven’t Forgotten How to Program Enough
I remember, vividly, seeing the box for Mac OS X 10.0 on a computer store shelf. Embarrassingly, I’d been fairly dismissive of OS X up to that point. It felt like a bizarre candy-coated Mac/UNIX mashup. It didn’t feel like it was for an enlightened, long-time Mac user like myself. Command-line, are you serious? Despite that, I took a closer look at the box.
Developer tools included? Hmmmm.
The developer tools that came with OS X were a revelation for me. I could do so many more things, so much more easily than in the past. Interface Builder blew my mind, though learning Objective-C was pretty tough. I’d never done Object-Oriented programming. I didn’t even know the term before starting.
A few years later, I joined a startup. There I had to work on Windows. We worked on a fairly complex C# application, and at first, I was pretty turned off. ADO.NET, ASP.NET, and C# weren’t exactly things I was thrilled about. I felt like I already knew a better way, and this was a big step backwards. But I came to enjoy working in C# quite a bit. I learned a lot more about types and generics than I’d known before. I learned about relational databases. I was exposed to design patterns and unit testing, both of which I overused to comic extremes.
One day, while I was happily slinging C#, a co-worker who was focusing on ASP.NET began talking about Rails. I knew exactly zero about web programming, but I was pretty intrigued by his description. I picked up a few books.
Ruby turned my programming world upside down. It was like a magnification of all the fun parts of Objective-C. It introduced me to so many things I hadn’t know about before. Closures, regular expressions, the DRY principle. I couldn’t believe how much I could achieve with so few lines of code. I also began to truly appeciate open source software. I bought back some of these things to my ObjC and C# work.
This pattern, being introduced in a new language, new concepts, new communities happened to me over and over. I’ve been extremely fortunate to have had so many opportunities to learn. But, what I think is even more interesting was another pattern:
I always felt, at that instant, that I had nothing else to learn.
That’s a hard thing to admit. Because now, it feels immature and arrogant. I try to forgive myself for that, because I think this may just be a normal part of software development. I was still in the “coding is the hard part” phase of being a developer. Lately, I’ve come to believe that people, teams, and process are actually the hard parts. Coding always seems quite easy in comparison.
This morning, I read David Haney’s post on the recent NPM issue with pad-left. From the looks of it, a lot of others did. And I found my logical side agreeing parts of his message. But, another side of me had a very different reaction. I felt attacked.
I would like to take a moment to say that I’m certain that was not David’s intention. His points about dependencies being risky, in particular, align with my own personal experiences. I also see that he’s passionate about being in control of the software you deliver. This, too, resonates with me.
David’s tone was a little aggressive, and I’m sure he’d admit as much. But, I get it. A one-line package? It sounds crazy! And that is the core of my problem with the underlying sentiment. The reason I felt attacked is because I love what isArray and left-pad represent. I identify with them. It has absolutely nothing to do with knowing how to program. In fact, I reject the entire concept of developers “not knowing how to program”. Of course every single consumer of isArray could make their own. They are trying a new, wild approach. And it appears to be working — this kind of problem seems to be an aberration.
I love finding out about whole communities doing things I’d never thought to do. This kind of creativity is inspiring, humbling, and keeps me excited about programming. Ok, so something went a little sideways with left-pad. Good! I’m sure there are already some great ideas coming from the fallout. And it could very well be that the solution is less and/or larger dependencies. But maybe it is something completely different. Or, maybe no solution is needed at all, and this was just bad luck.
What I’m getting is that if everyone accepts today’s best practices as gospel, we’ll never get tomorrow’s. I think we need to keep trying new things. Keep experimenting. Open source the hell out of that wheel you’ve reinvented. Trying out a completely different model for dependencies is something the NPM community should be extremely proud of. They are pushing the craft forward.
Maybe, we haven’t forgotten how to program enough.