Enter frameworks, who promised to smooth all of those cross browser gaps for you and give you some nice helpers, too. At the time, I found myself choosing between jQuery and Prototype.js.
It was in this climate that node.js came about. At the time, I remember trying to get my head around Twisted and Tornado, two Python libraries for high performance network programming. I didn't have a good reason for this. It was hard. Twisted is very confusing and Tornado, at the time, was barely maintained experimental software.
node.js has one strength: it can teach you network programming in a really easy and fun way. I learned the hard way in the coming years that just about everything else was really hard.
Meanwhile, at home, I was realizing the limits of node.js. I found that every program of a sufficient length became unreadable and increasingly hard to debug. I found myself completely stuck when I found myself CPU bound. I had no idea how to tickle node.js in such a way that it would use as little RAM as possible. Testing was difficult and the ecosystem was becoming increasingly fragile (the seeds of left pad were planted long ago).
As a combination aside and horror story I'll mention that I was (re)learning Haskell around when I started using Coffeescript heavily, producing this mutant atrocity.
idea -> sketch some docs -> stub out with JS -> get really angry at js -> obsess over how to fix js -> give up on project
world had to offer. I reverse-engineered ads delivered via
document.write that in turn delivered payloads of flash.
I refactored countless lines of code cobbled together from Hot Scripts
snippets. I sat, working the weekend, on an old iPad figuring out
exactly why ads were loading 2 seconds too slow there using an
emergency hand-written debugger. I sweated in front of old, virus
choked communal office windows machines to figure out mystery
exceptions in IE7.
Programming is ultimately a creative discipline. Unlike other creative disciplines, it is recursive: the media we use (programming languages, compilers, interpreters) are themselves programs. There is always the risk that we slip into circular abysses of our own making and obsess over improving the very tools we use to create our art.
I'm not saying that we should stop working on innovative new compilers. Instead, I'm saying that we don't all need to be thinking about compilers. My dream is that programmers can follow their heart into whatever creative endeavor they believe in without being undone by their own tools.