Has Joel Spolsky Jumped the Shark?

Okay, I’m going to make one small comment about this whole idea of “writing your own programming language”.

See, I just came across a copy of a 1976 book by a couple of fellows, Kernighan and Plauger, entitled “Software Tools” – maybe you’ve heard of them? The book is a discussion of a set of programs that they describe as being “real-world” programs rather than academic exercises, and it includes all the source code. They’re mostly basic utilities – a source-code preprocessor, a file sorter, a line editor, etc.

So, what language are these programs written in? Ratfor. Ratfor is a preprocessor to Fortran 66, which they wrote because they wanted to write things in ways that weren’t convenient in the versions of Fortran available at the time. The source code to the preprocessor is the final chapter of the book, so it’s nice as an exercise, but this is what they wrote serious production code in – this homegrown language that nobody else (at the time) had ever heard of.

Sounds remarkably like Wasabi, if you ask me.

Wasabi is an excellent example of ego getting in the way of technical decisions. Joel Spolsky was the man behind VBA. Of course he is going to love any solution that compiles down to his brainchild. Joel also has a big addiction to Not Invented Here Syndrome. He writes a lengthy defense of it here: http://www.joelonsoftware.com/articles/fog0000000007.html

Remember Joel, the first step is admitting you are an addict.

I don’t see anything wrong with the choice Joel made…
In web development quite frequently you do have to test some constraints for form fields and only then submit the form (thinking about usability here, not the usual enterprise logic) and then test the constraints again yet now in a server-side language. This is two languages doing the same thing (unless of course you do use javascript on the server too). That’s where code translator comes into play (if you have one of course). And that’s in addition to no pain deployment on the customers server.

I do not always agree with Joel, but mostly he’s got a good point somewhere and I do respect that.

By the way did you try Google’s GWT? They DO COMPILE JAVA INTO JAVASCRIPT! Wow Googlers lost their mind too and most probably Google will die now… Or will they? :slight_smile:

The people condemning Joel for making a DSL remind me a lot of graduates I have met who took courses such as “Advanced Java” rather than “Compiler Design”. The latter was perceived, correctly, as far more challenging, and the threat to their GPA too much to risk,

Thankfully I work almost exclusively with the kinds of graduate who would have taken the latter, more interesting, course. We have dozens of DSLs, and some of them are truly fantastic. Best of all, I don’t have to put up with people making nonsensical assertions based on ignorance and an overdose of kool-aid.

a tad late in reading the post and the comments :slight_smile: but thanks guys!!

have been reading jeff and joel for some time now…

In Ned Batchelder’s pro-exception article you cited, he says:

“Status returns can’t even be used with some functions. For example…Destructors may not even be explicitly called, never mind that they don’t have a return value.”

But destructors should never throw exceptions since destructors can be called as the stack unwinds after an exception is thrown, and thus can result in multiple outstanding thrown exceptions, which (I think) is undefined.

Doesn’t that underline that even experts have trouble using exceptions correctly, and thus reinforce Joel’s point?

As a guy who makes good money writing preparsers in PHP to create custom domain specific languages, all I can say is: Hah! Anyone who doesn’t understand that lisp is a mindset rather than a language deserves to rot in the programming wasteland. Dot Net is just as much of a trap as scheme… you don’t have to color within the lines if you’re sufficiently perverse.

Exactly. And Joel is such a brilliant, persuasive writer he can actually convince you writing their own installer/language was a good idea. It’s scary, actually.

Just repeating what other, more clever, people have said so far, but I think you’re kind of missing the point here.

Writing their own installer and own language is indeed a great idea in this case, just based on what I’ve read in your article (haven’t really read Joel much ever).

From what you’ve written, Joel apparently has a web-based app which runs native on php on a lamp stack, and runs native in ASP/VBScript on a windows/IIS stack. This may just be because the non-standards compliant windows world scares me, but I don’t know of many web apps which run identically on both of those stacks, do you?
(I certainly don’t think running PHP on a Windows/IIS stack would be a walk in the park, even though I’m a lamp geek. Didn’t Zend recently have to make all kinds of modifications to php or fastcgi or something to get it to run php properly on windows?)

If it is the case that Joel can run the same app in the language which best supports the platform on several different types of platforms, then I think you’ve really missed the point. From what you’ve written, Jeff, the point of Wasabi appears to be that by abstracting away the underlying idiosyncrasies of a platform you can concentrate on developing the part that really matters of your app and think about that rather than having to keep 7 different versions in sync all the time.

This is the same thing that prototype and jquery do with javascript, abstracting each browser’s idiosyncrasies away from the developer and letting them write a simple command like animate() or scrollLeft() without having to worry about the ten different ways to do it in each browser. If everything you say is true, Jeff, then FogBugz seems like a pretty wickedly cool place to work to me. Not only have they abstracted away their javascript, but they’ve abstracted away the language underneath so that when you’re writing your code you don’t have to think: “Does Windows support this socket call?” or “How can I get this to work within Unix’s file permissions system?” Wasabi takes care of all of that for you, and you just write your app.

That’s sweet, if you ask me.

You keep using the term VBScript. I don’t think you know what it means.

Regardless, I find your ideas intriguing and would like to subscribe to your newsletter.

Have a nice day.

Just read his “java flame” article.

Sure there are no pointers but heck, why does he keep on saying that you can’t teach recursion in Java? Using recursion is perfectly possible in Java, even in 2005.

Update: The lastest version of FogBugz is terribly slow. It wouldn’t work with Firefox without some fiddling either.

Folks,

A source-to-source translator can work very well for web apps. My employer at the time even filed a patent on it.

http://www.freshpatents.com/Source-code-translator-dt20060511ptan20060101429.php

We generated C# form java. These days, I would agree with stevey and just use Rhino to run on Linux/Java and avoid PHP. Just think of Java as an OS that runs JavaScript. My $0.02

everyone is entitled to his own opinion

Read this post of him about reinventing the wheel:

http://www.joelonsoftware.com/articles/fog0000000007.html

it’s easy for him to create a new language. hey! he’s part of early incarnations of Excel, Macros and possibly VBA. he knows what he’s doing. who can tell, Wasabi might become a mainstream programming language someday

Another nice “feature” is they store the DB connection string in the registry at HKLM\Software\FogBugz.
Hey wait a minute, this is a web app!
You need to give IIS permission to read HKLM\Software\FogBugz. Depending on who you are allowing to use FogBugz and how you have IIS configured you may need to have generous permissions on the registry key. What fun!

storing the connection string in the registry is SO early nineties.

Joel Spolsky is an idiot. He always has been.

No I’m not. I’m smart.

I found this code in a third party library recently:

inline std::string toString(const xmlChar* str) {
// This would make Joel Spolsky cry (that’s why I’m doing it)
return (const char*)str;
}