Uh oh. Another reactive rant. Am I turning into a grumpy old man? This time it’s about layers of abstraction. And Javascript. And the meaning of life. No? Maybe not the meaning of life.
Nikhil posted about his new pet project, Script#. Although I had fun reading the article and admiring the work, I am not enthusiastic about the approach. Google had posted their GWT a bit earlier and it evokes a similar reaction from me. Here it is:
Hiding Javascript behind another language’s layer of abstraction is like killing puppies.
It’s one thing to build a compiler to a language that’s more appropriate for machines. CLR or Assembly ain’t easy to code with for any human being.
But Javascript is a fully-featured, widely used, and beautiful language. Sure, it’s different from C# of Java, but it holds its own rather well. Sure, it lacks strong typing and traditional C++ form of object orientation, but that doesn’t make it less versatile.
Why do I think it’s a bad idea? Well, primarily because I get to experience firsthand what layers of abstraction do to code. In ASP.NET, the developers were shielded from needing to learn how Web works — a lot of effort was put in to emulate WinForms. You click a button, and here’s your OnClick handler, voila! Unfortunately, shielding developers from learning the inner workings results in some of the crappiest and undebuggable code you can imagine. Don’t believe me? Check out thedailywtf.com. Or go look into the vast repositories of code, written for ASP.NET. I know, I am making a non-verifiable statement here, but hey, it’s my frikin blog.
In the comments to Nikhil’s article, there are sentiments to keep the Morts in the loop. One of the users is worried poor slobs won’t be able to keep up with yet another language that they need to learn.
I have a very simple answer to this: if you can’t handle Javascript, you shouldn’t be writing code for Web applications. HTML, CSS and Javascript are the three prerequisites for this ride.
And to those of you who do know all three, please, let’s stop proliferation of poorly-drawn boundaries in layers of abstraction. If you need futher motivation, just realize that you will be debugging that insanity, written without understanding how things really work.
So, where do we draw the boundaries? Well, for starters, not across the languages. I totally don’t mind a Javascript 2.0 compiler that produces common Javascript 1.4. I don’t mind seeing a CLR implementation of Javascript (not the JScript.NET, of course). I don’t mind a powerful JS toolkit. Anything that flows along the lines of the Web style is great.
But please, pretty please, don’t repeat the disasterous attempts to “simplify” the Web by allowing only one form element per page (which has to post to itself!) or requiring Javascript for the framework to react to a link click. Please? For the puppies?