Joel on Solid State Disks
joelonsoftware.com
joelonsoftware.com
But don't GCC, Java, and Visual Studio all support parallel builds pretty easily? I've never looked into it, but I know I've read articles about it.
What sort of language/env. does FogCreek use? I vaguely remember hearing that they had written their own compiler in Java that transformed ASP to PHP or some other such ludicrous thing.
Edit: Some googling showed that they decided their software had to run on Windows and Unix boxes, and that the best way to do that was to support ASP (pre .NET) on Windows and PHP on *nix. They already had a large ASP code base, so they wrote a compiler (named Thistle) that could translate a subset of ASP into PHP. Then, it seems like MS deprecated ASP (and they started to realize how much it sucked) so they wrote their own language (Wasabi) that is based on VBScript and can be compiled into ASP, PHP, or JS. My God. I would gouge my eyes out if I had to work there. From the fragments of code I've seen, it frankly seems horrible. See http://www.fogcreek.com/FogBugz/blog/category/Wasabi.aspx
Although, I guess I can't really judge. I recently just wrote some ridiculously convoluted Java code that could automatically and transparently trick the JVM into making certain recursive functions Tail Call Optimizing (i.e., use constant space on the stack, regardless of how deep the recursion is) by transforming the function into automatically issuing/catching Exceptions to manually unwind the stack when I want to. Ah, I miss Common Lisp - I never knew how good I had it.
Ive seen a lot of C/C++ programmers write their own build utilities/scripts and lose proper deps in the process.
I found cmake a reasonable alternative.. scons apparently is too, although I hesitate because it seems to encourage writing your own python build plugins, which can be too tempting for people who like to tinker.
agreed, make -j works a treat, and presumably will gain more as cores multiply.
Its kind of nice to work in a scripting environment and avoid some of these problems [via sensible defaults]
Does your language let you write one function and have it run on the browser or the server? When you want to change something about your language, can you?
People seem to be pretty quick to criticize the decisions we made without really having all the facts, based on a couple of bits and pieces of obsolete info they gathered from the internet.
I do respect that you had a huge (and effective) code base in ASP that you (for very valid business reasons) didn't want to rewrite from scratch. I understand that each of the decisions you have made have probably made you successful and profitable - and in your shoes I probably would have done something similar. From your point of view, I completely understand that your choices were to do a complete rewrite (which was obviously unacceptable), or to come up with these sort of hackish workarounds.
However, I think you have to understand that as a hypothetical programmer thinking about working at Fog Creek, my choice is to work on your large legacy code base in (what appears to me to be) a not very pleasant language - or work on fun little 3 month AI projects in whatever language I choose (which is roughly what I do now). The fact that your compiler infers type information from a variable's name is an ugly hack - and frankly scares me (not only itself, but also more than a little about other design decisions you made). The hoops you guys had to jump through with Wasabi to do metaprogramming would annoy me - I'd rather focus on the fun stuff.
I recognize that, as a business, you made good decisions. But do you understand why I, as a programmer, would not want to work with those sort of technologies?
Oh, and for what it's worth, my language has all the features you've mentioned. For example, we used Parenscript (http://common-lisp.net/project/parenscript/) at my last job - it's a subset of common lisp that can be compiled to Javascript and runs on either the client or server.
Also - sorry about the 'Gouge my eyes out' bit. I meant it to be a bit of funny hyperbole, but guess I failed to convey that properly (humor is hard on the internet). Fogcreek, in my mind, would definitely be above the average Java or .Net shop, but probably below a few fun research labs, prototyping contractors, or small startups.
Again, you're assuming a lot about Fog Creek without a lot of information. The dev team here is extremely happy to be working at Fog Creek. In 8 years only one developer ever left, because he had to move away. Your theory that Fog Creek is "not a very fun environment" seems utterly at odds with what everybody else tells us, which is that they would give their left ear to work here.
By "not a very fun environment" I was referring to the Wasabi programming environment, not the people/social/office environment. Sorry for the ambiguity. I've read most of your essays, and the FogCreek environment seems amazing - you've clearly done a wonderful job with that.
And you're right - I am inferring a lot from not very much information. But, imagine that I'm a hypothetical programmer that was considering working at Fog Creek (I'm probably not up to your standards, but bear with me ;-)). You publicly stated that your compiler infers type information from variable names. That, in conjunction with some other worrisome things I've read about Wasabi, might be enough to push me some other way.
Most of the other places I'd consider working have decent enough benefits (salary, offices, food, etc) that they really aren't a deciding factor. When I look for a job, my primary concern is how interesting/fun the problems/technologies are. As long as all the other stuff is decent, I kind of disregard it.
I'd wager that you're doing something more like what csc and javac do to give error messages, and which C# 3.0 uses to support the var keyword.
(Doesn't C# basically use HM to support the var keyword, anyway? That's what I'd do.)
Haskell style type inference is more tricky, since it also tries to infer the type of function signatures from the different contexts where the function is called. This can lead to circular type dependencies.
But the lesson here would be that some effort spent on the speed of compile could positively impact developer productivity or at least negatively affect swordfight time. And yes, I think that very short compile times, like you see in CL (sbcl as an example) or Smalltalk can have an avalanche effect on development. And yes I do believe that small incremental changes are th3e best way to do software development. And yes I would expect to recompile a function in a running image serving web pages as a routine part of development.
But maybe that is just me.
The developer may know how to solve the problem in code. But, Joel is the CEO. He has a better idea of how this affects the Balance Sheet and Income Statement. It's kinda, sorta his job.
Imagine if instead he'd said to the guy "okay, spend three hours profiling the build process and get me some suggestions with time estimates", and they'd found some likely prospects, and three days from now he gets to post about how they'll be shipping the next release a month earlier because of the improvements they made to the build process.
Listen to the podcast. The conversation starts at about 16:00 mark if that helps. I am seeing a ton of comments that don't understand the context of the article.
SSDs provide so many other performance benefits--even just launching apps--that they're going to make our developers a lot happier anyway. And my time is far less valuable than a developer who is in the critical path to shipping.
I can't count the number of times I used to make a tiny change that I didn't think was worth running the build for, only to have it be the first thing to pop up as wrong next time I compile (now I always run a build, because we made it super fast).
And iterating over a bug, that can involve a lot of little changes, it can involve writing a ton of unit tests trying to duplicate the problem, it can involve subtle interactions that all seem right until you figure out what the issue is. Yes, you have to think, but sometimes you just need to churn through it, too, and frankly it's ridiculous to suggest that having a faster build process wouldn't help this.
And I, personally, get distracted pretty easily. This comment courtesy the 5 minute test suite I'm plowing through in the background right now.
"Hmm... Love to get one of those new SSD drives. Just need to justify it somehow"
You also can often speed up I/O that way since you can saturate both your I/O and CPU bandwidth, rather than alternating between waiting on them.
I also take it that you're not compiling to individual object files since usually compilation since usual compile parallelization is based on farming out single object file compilations to multiple machines or processes.
I wrote some small portions of "icecream" which is used for compilation parallelization by the guys at SUSE and there it would actually transmit over the network a full chroot environment so that even different Linux installs working on compatible architectures (later cross-compiler support was added as well) could execute the compiler jobs of rather different OSes.
I didn't plan on writing an article so I don't have any official bench marks. I'm guessing they dropped from over a minute and a half for a full recompile to under 30 seconds. Incremental builds used to take about 20 seconds and now take between 2 and ten seconds.
I went from a athlon X64 at 2.2Ghz and 2GB Ram with a 74GB raptor and another 74GB raptor for code to a Core i7 Extreme at 4Ghz and 12GB Ram with 2x80GB intel SSDs in raid 0 and 1 80GB intel SSD for code.
A couple of important things to keep in mind. Intel is still the way to go. The other SSDs can actually be slower in write performance than a normal hard drive if the usage pattern is small files. That is pretty much what you get when you compile.
One other point is that crappy anti-virus software can affect IO performance anywhere from 12X trend micro, 24X Norton. Yes that is Norton will reduce your IO by 2400% in my tests. AVG Free is 19%. So he could have negated the performance gain from the SSD by running bad anti-virus software.
I can say my productivity feels like it nearly tripled.
The important measurement from a programming perspective is not necessarily just the second or two here or there. My work flow changed. I used to hit build and walk out and get drink from the fridge in the garage and it would still be compiling. Now I can't even do anything but glance at my email. These interruptions sometimes take you out of the zone and it can take a long time to get back in the zone. Getting up could easily cost me fifteen minutes or even a half an hour. Just because I lost my train of thought.
Update: I'm running windows 7 and visual studio 8 on this machine.
Plus these additional side benefits: The programmer who was complaining does not feel like he is being ignored. Joel is now going to upgrade most of their computers, making it better for the entire company. So lots of warm fuzzies to go around, leading to happier programmers, leading to a better product.
Then you go AHA! I'll spend money on CPUs or making my compiler/build parallel.
On top of that, you don't fucking parallelize compilers!
You use a goddamn build system to do that (make, et. al.). Of course, that requires that your compiler be decent enough to be able to compile modules independently, and not have to recompile unmodified source. What do you want to bet that their compiler is just ridiculously awful?
What about dd if=/dev/old-disk of=/dev/new-disk bs=16M ?
By default it pops up a somewhat annoying ncurses interface, but it's quite a solid tool.
Also, he could have saved $350 dollars and bought the 80 GB drive (unless he just HAS to store 40+ feature-length pirated movies on his boot/app drive?).
So, why does this get upvoted, again?
Every time I read this guy I fail to get what his allure to developers is.
I mean, seriously, what's with all the random ire in the HN comments on this story?
2. He is describing a stupid decision he made, which is framed around an unacknowledged stupid decision he made years ago (see 3).
3. His company uses a private language they wrote themselves, for totally ridiculous reasons, despite having written essays about how "you shouldn't let your programmers use any non-mainstream languages".
(Yes, he gets that 1% of the market that can't run whatever language they pick, but he has to maintain his own in-house programing language and toolchain, and train new developers to use a language that exists nowhere else in the world.)
Joel runs his successful business, bothers to blog about it since he founded it years ago, graciously comes on here and responds to people - nice of him, huh? So why so bitchy?
You clearly disagree with his company's engineering decisions that you can't possibly have been privy to the reasoning behind. What's your motivation?
Why so bitchy? What's my motivation? -- this whole thing is call and response, we're just filling roles. Spolsky's slipped into punditry, you're the sycophant, and I'm the prick popping your balloons. Joel certainly wrote his post knowing that he was teasing for a "WTF Wasabi" response -- why don't you see that as valid?
Any community where the only valid 'response' is fawning fanboy is not one I want to participate in, and I think spolsky would say the same. There's a reason he doesn't just post in his own forums.
I disagree with his company's engineering decision based on the reasoning he's publicly given for it (which happens to also run counter to his past advice). He hasn't said anything about it for a while, though he dropped a promising tidbit in this thread: http://news.ycombinator.com/item?id=536023
Love your generalisation about blogging and (alleged) punditry being a primary responsibility too - because clearly SO many CEOs take this responsibility in their stride.
He functions as the public face of his company. His companies' products are marketed towards developers, and I gather that most find out about them because of Spolsky's blogging -- he's a very effective salesman.
In FogBugz 7 the compiler output is .NET/CLR bytecodes.
It also emits compressed JavaScript which runs on the browser.
Either way is good in my mind. But, I too, would appreciate some technical details about Wasabi (just out of academic curiosity). I feel like a lot of things I know about it are now outdated.