I'm in the process of ripping the last bit of coffeescript out of our code. The marginal benefits of the language don't exceed the costs of having another build dependency, and another syntax to understand. For daily work, I already have to switch contexts between Javascript, CSS, SCSS, HTML, rHTML, HAML and Ruby (not to mention other tools like Bash, Rake, etc., along with API knowledge like the Rails API, jQuery, and all of the various un- or poorly-documented gems). Ultimately, it's a huge mental burden. Every new thing is a new thing that someone has to understand to be productive.
To justify the extra mental cost of another piece of technology, it has to do something pretty amazing. A minor syntactical transformation of javascript just doesn't cut it.
It's more expressive. It's like going from having a 19" monitor with 1440x900 to a 24" monitor with 1920x1080. Sure, you can do all the things you can normally do with the 24" monitor that you could do with the 19" monitor, but it isn't as pleasant or efficient.
The place it best fits in right now is for in-house software development at a place with a low turnover of developers. 37signals has a very low turnover, so it shouldn't be surprising that it fits them well. That mental burden is low, compared with the time saved using it.
"It's like going from having a 19" monitor with 1440x900 to a 24" monitor with 1920x1080."
Ehh....I think you're overstating it, but to each their own. To make the comparison fair, you'd have to turn it into something more obtrusive: it's like going from a 19" monitor to a 20" monitor that's driven by one of those $300 USB video cards that gets really hot and eats up desk space and might occasionally cause RFI problems with my wireless mouse.
Or more directly, it's like going from Ruby to Python, or vice-versa, by using a tool that converts one to the other. They're different, and they have different syntactical features, but the annoyances of either language balance the benefits to the extent that I can't confidently exclaim that one is better. And the auto-generation step would just cause pain.
The critical difference here is that to use coffeescript, I have to add another (IMNSHO) annoying step to my build process. Another layer of indirection to obfuscate bugs. Another sprocket that can come unglued and bork my app at any time. No thanks. I'll stick with my current complexity level, and write my list comprehensions as loops.
My build process is automated, so it's not a huge darn to me if my computer has to run one additional program once in a while. It's running dozens of them all the time. And if you find CoffeeScript creates a lot of JavaScript bugs that aren't in your CoffeeScript source (adding "another layer of indirection to obfuscate bugs"), I think your experience is atypical.
And as for "obtrusive," I guess that's just subjective.
Apart from the fact that Python can be infinitely faster than rails, I'd just say that any more javascript is bad news, bee it coffee based or node based or whatever. Someone forgot to go back in time and shoot John "javascript" Connor.
On topic, your main problem is that you're playing the one man army with too many tools, that is obviously unrelated to CS or any language.
It's likely you wouldn't mind the additional complexity if you were only working on front-end.
> A minor syntactical transformation of javascript just doesn't cut it.
If every CoffeScript program shared the same AST as its generated JavaScript program, i.e. if only the parse tree representing the concrete syntax differed, then your statement would be true.
However, that is not the case. The abstract syntax of CoffeeScript differs significantly from JavaScript, for example in CoffeeScript almost every statement is also an expression, which is not the case in JavaScript.
I'm in the process of ripping the last bit of coffeescript out of our code. The marginal benefits of the language don't exceed the costs of having another build dependency, and another syntax to understand. For daily work, I already have to switch contexts between Javascript, CSS, SCSS, HTML, rHTML, HAML and Ruby (not to mention other tools like Bash, Rake, etc., along with API knowledge like the Rails API, jQuery, and all of the various un- or poorly-documented gems). Ultimately, it's a huge mental burden. Every new thing is a new thing that someone has to understand to be productive.
To justify the extra mental cost of another piece of technology, it has to do something pretty amazing. A minor syntactical transformation of javascript just doesn't cut it.