I just spent a great, great weekend at the No Fluff, Just Stuff conference in Austin. I would more or less characterize the conference as Drinking Ruby Koolaid from a Firehose. Besides Ruby on Rails I sat in on talks about TDD, AJAX, SOA, building better teams, and coding in general. Scott Bellware has his own, accurately named, write-up about the conference here: A Long Weekend in Ruby Land. Scott was uncharacteristically tame and non-controversial, so I'll take up the slack. I walked away with a long laundry list of topics that struck a nerve with me during the weekend, most of which are going to be controversial and rightly so. If I don't get flamed for something here, you're not paying attention. Regardless, it's an interesting time to be a developer. I think we're in the middle of one of those "uproot everything" phases like a couple of years ago when .Net was all shiny and new.
Cool Quotes
I'm going to butcher some of these, but these were the best lines I remember from the weekend.
"When you pull a class off the shelf, what else is coming with it?" -- Stuart Holloway talking about using Dependency Injection. I'm stealing that metaphor for my StructureMap talk tonight.
"The Neck Bearded Unix Guy" -- The guy who completely dismisses any technique or technology you're enthusiastic about with the offhand dismissal "we already did that better in the 70's." Neck Bearded Unix Guy is very likely to be an old Smalltalker. Which is frankly fine with me, I can take that much better from a Smalltalker or LISP aficionado than I can from the COBOL troglodytes that dismiss any concept developed after the "IF/THEN" and "WHILE/LOOP" constructs.
"Architecture is pretty well a content-free word in software development"
"Architecture is the decisions that are hard to unmake" -- Attributed to Martin Fowler. I know I've read this article before, but I couldn't find it to put a link in. As I recall, Martin borrowed a definition of architecture from one of the GoF guys that goes something like - "Architecture is the technical decisions you consider to be the most important"
"AJAX makes the web suck less"
"[The Document Object Model] is an API designed by a committee to appeal to nobody" -- the speakers as a whole were not kind to the W3C and OASIS
"If you don't know if it runs, why bother compiling it?" -- one of many verbal digs at people being afraid of dynamic languages
"Code that's difficult to test is difficult to use" -- Pay attention to your API when you're testing. Use TDD as a tool to sand off the rough edges on your public API
"Rails makes it easy to do the right thing!" -- I'm going to talk about this more below, but it's one of the underlying principles of RoR (and I think they're largely succeeding)
"In five years, compiling will be considered to be just a weak form of testing"
"The peripherally technical management crowd grabbed SOA like a chew toy" -- I actually do believe there is some actual value in SOA, but I've always suspected, and observed, that some of the popularity is due to non-coding architects pushing SOA as a chance to feel important again
"SOA as an acronym no longer holds any value" -- Just complaining about the sloppy abuse of the term to mean anything the speaker or writer wants it to. I know, you could easily slip "Agile" in for "SOA" in that sentence (MSF for Agile?, agile my @!*)
"Low Truck Number" -- A statistic measuring the healthy duplication of knowledge and understanding within a project team. If your Truck Number == 1, a single person getting hit by a bus, or offered more money across the street, effectively ends your project. I've been the "what if you were hit by bus" guy in the past. It wasn't fun, and I learned to hate that phrase.
"I think the popularity of SOA can probably be traced to an article in an on-flight magazine"
"Writing a lot of noisy code just to make the compiler shut up" -- Again, moving to dynamic languages. The speakers were, almost to a man, in favor of dynamic languages. More on that below.
"Code is the most important artifact you create" -- Amen. This was from a talk on improving code in general.
"Am I going to choose a tool that protects me from myself, or pick the sharpest possible tool? Even if it means I might cut myself?" -- Austinite Bruce Tate launching into a talk about the Metaprogramming approach used by ActiveRecord (RoR's O/R mapping tool)
"Seaside is the coolest thing you'll never use"
It's the Community: .Net vs. Java vs. Ruby
In my opinion, one of the coolest things about Ruby in general and Ruby on Rails in specific is the energy and can-do spirit of the Ruby community. If Ruby/Rails succeeds in taking away market and mind share from J2EE or .Net it will be directly attributed to the strength of its community. I'm very impressed with the amount of energy and community-driven innovation that's going on in the Ruby world. What's cool to me is that the innovation is coming from a community of practitioners instead of being solely reserved for the one big company working in a relative vacuum. Check out Streamlined (new open source tool to accelerate building Rails screens), I was absolutely floored by the five minute demo. I'm unapologetically a believer and an enthusiast for open source tools and frameworks. We've got some good ones in .Net, but nothing like Rails is cooking up (I don't mean to discount MonoRail, I just think it's ramming a square peg through a round hole).
.Net doesn't have anything that remotely compares. Andres Heilsberg and co in Redmond are doing some truly innovative things, but where's the community driven innovation? When I read Ruby blogs I see a lot of "look at this new, cool plugin I made for Rails." In .Net blogs I see a much, much higher percentage of "look at the new thing from MS that'll be available someday." Make me feel better and tell me I'm wrong about .Net.
Some people in the .Net world have openly criticized Microsoft for working simultaneously on 3(?) different O/R-ish persistence frameworks based on LINQ (none of which may be any better than NHibernate). I say, bring it on and let the best tool win! We (.Net) don't have much in the way of diversity in terms of our tooling. Some of the J2EE guys were complaining about the variety of choices they have to make to do an enterprise system -- WebWork, Tapestry, Spring, Struts, and who knows what else for web development. All I've got is ASP.Net and some ports. I understand their pain, but I think we (.Net) would be better off if there was more choices. Look at Internet Explorer, it was essentially dead until Firefox came along to push it.
Collectively, our little cadre of .Net folks agreed that we like our .Net tooling for TDD (NUnit + TestDriven.Net) much better than the tools we saw the Java guys using. Just for an example, the poor Java guys don't have [ExpectedException(typeof(SomeCustomException))] yet. Ha, ha.
Of course it's not really fair to compare the two communities. Ruby is largely a collection of early adopters and .Net is a mainstream language. The community makup is obviously going to be very different.
Maybe You Should Have the Smart Guys Writing Code
Sitting in Neal Ford's session on improving the quality of code. It was just a nice session going over basic principles of good coding -- naming, Composed Method, etc. In other words, nothing revolutionary. What was striking was that this talk about low level coding was being given by an acclaimed Application Architect. A really smart guy was spending time talking about coding. For that matter, almost every single talk I attended talked about coding. In other words, coding is important. Coding requires skill and judgment. Coding isn't something you just throw over the wall to a bunch of monkeys with keyboards. It's possible that the best book about coding I've ever read is Refactoring by Martin Fowler. Martin Fowler apparently thinks that low level, hands on coding is important. So why do we still have so many shops trying to write software by surrounding one or two competent people with an army of poor coders, then disallow the competent fellows from coding? The non-coding architect/spec coder combination has to be one of the worst possible team models, yet it's so common. Removing your best people from hands on coding has never seemed very intelligent to me. I thank God every day that I jumped to an XP shop 3+ years ago when I was getting rammed into the powerpointing, non-coding architect peg. It makes me shudder in horror to think what would have happened to me if I hadn't gotten out of there. I bet I'd be blogging about SOA a lot more;)
It's Firefox for Me
I'm often slow to jump on some things just because I don't pay enough attention. I've largely ignored Firefox because I really don't have any major hangup with IE. After seeing the plethora of web development tools in Firefox that were used in some of the Ajax and Selenium talks, Firefox is now my browser of choice. There you go, I have to be nearly the last developer converted.
Selenium IDE
I'm going to do a short post later this week on integrating the Selenium web testing engine inside of FitNesse. I still like that approach for acceptance tests, but I think we'll supplement that with the Selenium IDE tool. Selenium IDE is a nifty Firefox plugin that allows you to record and/or edit Selenium tests inside the running browser. My initial thought is to get our tester to use this as the mechanism to communicate defect reproduction steps. It might be asking too much, but it would be nice if they would also use the tool to create a test for the correct fix, but let's not get too far in front of ourselves. One of the problems you face with defect reports is vagueness and ambiguity in the description of a defect and the expected results. Human-readable, automated tests are my favorite mechanism to eliminate that ambiguity.
What's Still Stopping me from using Ruby
Inertia. Legacy code. "Enterprisey" stuff like support for x509 certificates. The tooling needs to catch up. I'm not very wild about any of the Ruby tools I've tried so far (I can't even get RadRails up yet). I'm going to give Sapphire in Steel a try pretty soon. I really, really don't like programming without automatic refactoring. I'm not too keen on coding without being able to quickly go "SHIFT-F6" to rename anything. Ruby is going to have to have a strong refactoring tool at some point to win a lot of people over. As often as I've heard "Neck Bearded Unix Guy" gush on about the old Smalltalk Refactoring Browser it's a safe bet that it's technically feasible. I really want to hear JetBrains announce a Ruby IDE.
Oh yeah, there's that little "we're a .Net shop" political issue. In all seriousness, we have some internal facing administrative tool work coming up that might have skunkworks "Ruby on Rails" trial project written all over it.
More Later
There will be more. After I get a chance to digest a little bit, and let some of the Koolaid out of my system, I'm going to weigh in on the Static vs. Dynamic language debate. I'm definitely going to collect some thoughts about Rails. There's also a host of technical things about the way Rails works that I like much better than ASP.Net. If nothing else, I want to talk about how Rails blows ASP.Net out of the water in terms of testability, and maybe getting some of that goodness into .Net.
Posted
07-10-2006 12:11 PM
by
Jeremy D. Miller