Some Shoulda Plugin Love

August 18th, 2008

I’ve been using Shoulda for some new projects and while it’s a learning experience I’m really pleased with the results. One thing I noticed right away is that I was testing for the presence and functionality of several Rails plugins I chose that are being used on many models.

I ended up writing custom Shoulda macros for three of the plugins: ActsAsTaggableOn, ActsAsCommentable and SaltySlugs. Below are the macros and an example of their usage in a test.

Shoulda Macros

Example Usage

$ ruby -Itest test/unit/album_test.rb 
Loaded suite test/unit/album_test
Started
…………………
Finished in 0.109251 seconds.

21 tests, 32 assertions, 0 failures, 0 errors

Jay Fields originally got me thinking and writing the first draft of this with his “Developers needed; Hackers need not apply” post. By his definition, I’m a long time hacker. I’m in recovery now and feel like I’m far more of a developer at this point.

Confession time…

For too long I worked in very small companies where I was the only developer. A few times I was the only one with any technical experience and yeah, that was in technology startups. This led to them leaning too much on me for the overall direction of the products which in turn led me to think I’m qualified to make those decisions on my own.

If you’re a developer, that’s a path destined for failure. You’ll likely make things more complicated than they need to be which will take longer to develop. Talk to everyone you can about the project and really listen. This sounds absolutely ridiculous and basic when typed out but, some people can’t even make that step, I know I couldn’t.

Recovery

Only through time and frustration did I realize there was something wrong with my thinking. I largely credit getting more involved with the development community as a whole with my real recovery. I think I was too isolated to come to the realization on my own.

Meeting other developers who I truly respected was the real turning point. Stephen Caudill, Chris Saylor, Bruno Miranda and Ryan Leavengood to name a few. These are all incredibly talented developers with varied experiences who’ve taught me the humility all true developers need to be successful.

The Ruby community as a whole deserves credit as well. These ideals are better expressed by this community than any other I’ve seen.

To be a good developer is to be humble. To realize you alone will not make a project successful. Sheer force of will doesn’t translate into a usable interface or a solid brand.

The part where I’m a bit of a contrarian

Shortly after the “Developers” post Jay followed up with “Civics not Cadillacs.” He’s absolutely on point with this post as well but, this one is more of a high-wire act.

Let me really abuse his car metaphor a bit.

What happens when you’re told the airbags and seat-belts should be considered a version 2 feature? How about when you’re asked to propose a stopping mechanism other than brakes with “I saw a promising solution on the Flintstones once” tossed in for good measure.

I know Jay wasn’t suggesting to abandon development best practices at the drop of the hat. I do think that it needs to be clear that some things a good developer just won’t sacrifice.

It’s our jobs as developers to balance the business needs and proper development. That balancing act needs to include extensive collaboration with the rest of the business.

They probably hate you already

Anyone that knows me in person knows that I’m very opinionated. I do tend to tone it down online though. I’ve written several blog posts and chose to scrap them because I worried I would offend someone. Many times it was someone I respected.

I did this because text and my questionable writing skills just don’t convey the tongue-in-cheek nature with which I want to deliver some of my thoughts.

Then I read “Losing Twitter Followers is a Good Thing” by Steve Bristol. Yet again, it’s another simple and obvious concept; just be yourself. I wish I knew why I need other people to blog about common sense for me to finally get it.

As a developer you’re paid for your opinions. Don’t be afraid to share them. Just have the common sense to temper them with the realities of the business while maintaining your integrity.

Simple enough.

Gitacular!

July 26th, 2008

The title here may be a bit misleading, I just really wanted to play with the word “git.” This post will largely be focused on my issues with git.

RTFM NOOB

Git seems to be a new sacred cow. Any complaints are generally responded to with the assumption that the complainer is is definitely the one at fault. This may be attributed to the user’s stupidity or, more creatively, the user’s cleverness.

Most recently I’ve seen PJ Hyett tweet the following:

when people get upset at git, it’s because they’re trying to do something clever and bad things happen. stop trying to be clever.

This may in fact be true in some cases but, claiming this is always the case is foolish at best.

A Tangent on GitHub

Since I just cited one of the minds behind GitHub I thought I should give some thoughts on GitHub.

GitHub is pure unadulterated awesome.

In a way, GitHub is the antithesis of the mess that is Git. The guys behind GitHub seem to pay attention to every little detail of the user interface. Git’s user interface in contrast appears to be put in place grudgingly by the Git developers who are outraged that users even need to interface with their masterpiece.

GitHub seems to be the developer’s social network and I love it.

On User Interface

The most obvious flaw is the lack of consistency in the commands:

git stash apply git rebase --continue git svn clone git commit -a -m

Can we kindly pick one style? Either sub-commands (like apply) or options to commands (like –continue), pick one and stick with it. This reminds me of the inconsistencies in the function naming of PHP. I don’t want to be reminded of PHP, I have enough nightmares as it is.

Other notable issues are displaying files in conflict as “unmerged” instead of say “conflict” as well as using “git add” to resolve conflicts instead of something like “git resolve.”

Another Tangent on user Interface

It seems odd to me that a community obsessed with perfection and beauty the way the Rails community is would accept and in some cases, defend a tool like this.

As Ruby and Rails developers we all know interface, at all levels, matters. I’m also sure we’ve all re-factored working code because it was not idiomatic Ruby, in other words it offended our sense of style and beauty (yes, I’m simplifying the reasons for re-factoring ugly code, I know). So, I’m genuinely curious, when other equally powerful tools exist, what drove the early adoption of Git in the Ruby community?

Oh, There Are Bugs

Please, follow this and tell me what I’m doing wrong:

So, everything goes as expected until the conflict that happens during the rebase-ing of the branch to the latest changes made in master.

At line 50 you see me fix the conflict. I then verify the contents of the conflicted file on line 51. I add the file on line 53. Then I try to continue and the fun begins.

At this point I’ve fixed the conflict and added the file yet, git is swearing no changes have been made. When I first ran across this, it resulted in lots of research trying to figure out what I was doing wrong. Only after far too much time wasted on this did I get desperate and add some random whitespace and add the file again. Turns out this pretty reliably corrects this issue.

Another confidence inspiring issue is also rebase conflict related. Unfortunately, I can’t easily duplicate this issue so you’ll have to take my word for it.

Same circumstances, I fix a conflict and add the file. When I try to continue I get a different error message from above but still suggesting I forgot to use “git add.” Again, after much research and random attempts to move forward, I found “git status” fixes this and allows me to continue.

Yes, you read that right, a command meant to simply report the status of the repo is fixing my repo. It’s obviously updating something, somewhere deep in the .git directory that tells “git rebase –continue” that I have in-fact added the file. This is difficult to duplicate but, I have seen it several times.

“Rich, why do you hate Git?”

I don’t hate Git. I happen to think it’s a great tool and an unbelievable improvement over the tools we used to be saddled with. I just happen to think that there are tools out there that are just that much better than Git.

I’m also posting this because I got a few responses (both public and private) to my complaints on twitter acting like I’m an imbecile with no clue what I’m doing. I’m definitely not a Git power user, I’ll give you that but, I always make an effort to be familiar with my tools and the best practices involved. With my relatively simple usage, I shouldn’t be running into these problems.

The only thing tying me to Git is for compatibility with the broader Ruby community. I obviously don’t expect that to change but, we need to acknowledge issues with our tools and address them, not ignorantly ridicule the people pointing them out.

There’s a joke that I’ve heard several times over the years. I don’t think I’ve ever told it for a laugh, really just as part of a larger discussion. It seems to apply here.

What do you call someone who speaks three languages?
Tri-lingual.

What do you call someone who speaks two languages?
Bi-lingual.

What do you call someone who speaks one language?
American.

Now, as an American who speaks only one language, I feel kind of offended but, I do get the bigger concept of the joke. That concept appeals to me as a developer. I’ve always found value in being familiar with multiple languages and tools; it’s always made it easier to chose the right tool for the job.

While the ideas here apply to developers in general, being part of the Ruby/Rails community I’m going to focus on that community.

Observing the Herd

I’ve always been bothered by the disdain shown for “foreign” technologies by the Rails community. The two biggest being the database and JavaScript.

The cheers I heard at the RailsConf MagLev presentation to someone shouting “screw relational databases” represent this problem well. There were many interesting aspects to MagLev but, what I heard the most about was the potential to do away with relational databases and do everything in Ruby. This is only the tip of the ice-burg as far as hating relational databases in the community.

The impetus for writing this post itself was a friend and fellow Ruby developer tweeting “wishing i could write iPhone apps in ruby.” Hearing something along those lines is all too common.

There are obviously exceptions and I applaud those exceptions but, I’m not talking about them in this post.

A Crippling Love For Ruby

The Rails JavaScript helpers have always been a sensitive topic for me. I’ve honestly never used them beyond the prototype phase in a project. I’ve always tried to go the unobtrusive route and hand-code my JavaScript. I do use jQuery though, I’m a bit insane but I’m not a masochist. Put simply, I’m a web developer and JavaScript is the language for programming in a web browser.

Another sore spot is the database. The common Rails idiom seems to be to do everything in Ruby and to avoid things that can’t be expressed in Ruby. This can lead to incredibly naive implementations that would run exponentially better in the database.

Before I hear the bellows of “premature optimization.” Knowing your tools and using them appropriately is not premature optimization. Things such as triggers and stored procedures can be incredibly powerful and should seriously considered.

Even indices seem to commonly trip up seasoned Rails developers. I’ve heard of at least a dozen instances of an application being sped up simply by properly indexing the tables. It’s just plain sad that something as simple as an index turns into a real stumbling block. This happens because the database is seen simply as a necessary evil that can be ignored until performance demands giving it a little attention.

To be continued…

I have a lot more I could cover here but, I see this post as simply the start of a much larger discussion. So, what do you think?

This was my second RailsConf and the change in the community are stunning. Last year was all about “fuck everyone else, we know the way.” As a rule, I like this attitude. The problem was that it was applied to things such as “sound engineering” and “good ideas.”

Last year there was very little interest in alternatives. Alternatives to ruby, rails and rails’ ideology were all soundly shat on by everyone I spoke to. This year things like JRuby, Rubinius, MagLev, Merb and DataMapper all had solid showings, large crowds and lots of excitement.

Things have changed

The general tone was more accepting of new ideas. The Rails Core panel showed the trademark cockiness [well-deserved in my opinion] but, expressed finally openness to real valuable changes to things like ActiveRecord.

Not much in this world could excite me more than discussion of an identity map in ActiveRecord.

I also saw real excitement over the alternative Ruby implementations. I’m sure this has something to do with their massive progress but, it really seemed people were finally ready to hear new ideas. I didn’t hear a single person expressing anything but excitement about these project.

Everyone loves the enterprise…

…not just enterprise software, although there was actual praise for the concept of the enterprise (a big change in this community) but, more traditional software engineering ideas as well.

The keynotes by Joel Spolsky and Kent Beck were great. More surprisingly, I’m in the solid majority with that opinion.

I have arrived… kinda

I did a lightning talk on a JamLab project and it was very well received. There’s actual interest and there was almost no laughing. To be honest, I was shaking while giving my stupid little five minute talk. I’ve never talked in front of a crowd that big before. I definitely have a new found respect for the people that get up and talk for an hour.

In the talk “The Worst Rails Code You’ve Ever Seen (and How Not To Write It Yourself)” by Obie Fernandez he talked about my plugin for almost a whole 3 seconds and I felt like a 90s schoolgirl at a NKOTB concert.

I also worked much harder at meeting people and talking to people. I’m not a social person so, it’s not easy but, the awesome Oregon beers and meeting great people like Steven Bristol, Grame Mathieson and Jim Weirich made things a bit easier on me.

That reminds me

Jim Weirich, Joe O’Brien and Chris Nelson gave, what is in my opinion, the best “better your craft” talk I’ve ever seen. It was called “Dialogue Concerning the Two Chief Modeling Systems.” Words don’t do it justice, especially not mine. There’s a decent summary here but, it’s not just the content that made this talk a thing of legends.

More to come

I just wanted to get some of my initial thoughts posted. I have some more specific technical issues I want to mull over before posting about. I can’t say my level of excitement after RailsConf this year matches last year but, my hope for and interest in the community as a whole has grown tremendously. I need to try a pull my weight by contributing more.

Epiphanies and Weird Ideas

April 30th, 2008

A lot has changed since I started this blog so I think I need to give this a renewed effort. I’m going to try and temper my obsession with getting everything perfect. My previous approach to blogging has resulted in 4 published posts in 9 months and about 40 drafts. What a fucking waste.

So from now on the content will be significantly shittier than it was and far more frequent, like a stomach flu. Here’s to fresh starts.

An unoriginal weird idea

I needed to do something weird in a plugin I wrote. I needed two models to represent the same table. I needed models that act like views. I’ve seen plugins that try to accomplish that goal but they have one of two problems:

  • Muck around with ActiveRecord internal data structures
  • Are pretty much all or nothing (no way of getting at the whole table through a scoped model)

The second issue I could have hacked around.

The first is a show stopper for me. Ruby gives you a ton of power to monkey-patch but, I think those changes should be kept as close to the public API as possible and never ever directly manipulate internal (to what you’re patching) data structures.

One day this may be promoted to “bad idea”

So I wrote my own. I’m not even convinced this is of general interest. So much so that it’s actually part of a larger plugin I wrote, just an implementation detail of that plugin really. That said, if there is a positive response, I’ll wrap it up and spec it out properly. For now, I’m going to go the worst possible route for software distribution, uploading it as an asset for my blog. Classy, huh?

scoped_model.rb

Just a simple ActiveRecord::Base.send(:include, JamLab::ActsAsScopedModel) and you’re off and running.

Usage is exactly like #with_scope

class DumbUsers < ActiveRecord::Base
  acts_as_scoped_model :find => {:conditions => {:is_dumb => true}}
end

Now use the model as usual and the proper scope is used everywhere. It makes absolutely zero attempt to control the creation of records in any way. You can create a record using a scoped model that does contradict the assigned scope.

An important note, I’m not using this in production yet so, this may be riddled with bugs. If you do find any, drop me a line.