Stuff about software development, agile and testing

Thursday, December 13, 2007

scala book is out

Its now an open secret that Scala doesn't have good documentation/reference to help any developer to try their programming skills. But finally Scala book is out (pre-print edition) and I got my copy.

Thursday, November 29, 2007

jruby closure decompiled

Its quite interesting to look into the compiled class file generated by JRuby. Following is the sample java code generated for a closure (1.times { puts 'in closure' }) .

private static ByteList __18 = ByteList.create("in closure");
public IRubyObject closure0(ThreadContext threadcontext, IRubyObject irubyobject, IRubyObject airubyobject[])
Ruby ruby;
IRubyObject irubyobject1 = (ruby = threadcontext.getRuntime()).getNil();
DynamicScope dynamicscope = threadcontext.getCurrentScope();
IRubyObject _tmp = irubyobject1;
return, irubyobject, RuntimeHelpers.constructObjectArray(ruby.newStringShared(__18)));
catch(org.jruby.exceptions.JumpException.RedoJump _ex) { }
} while(true);

RedoJump exception is used to simulate ruby redo

Tuesday, November 27, 2007

inpsect gem file

Playing around with RubyGems source code. So first thing I wanted to know is the gemspec.

Here is a small script to inspect any gem file

require 'yaml'
require 'rubygems/source_info_cache'

spec ='#{gem}')
p spec.to_yaml

You could also use Gem::SourceIndex to spec out locally installed gems

Sunday, November 11, 2007

My new X

Finally I got Leopard installed in my Mac..... :)

Tuesday, October 23, 2007

hudson rules

Gone those days when we were promised that copying a war file to web server will bring your application. I thought that's a myth in Java world(what happened to webstart anayway?). But when I looked into Hudson today my eyes were wide open, its possible..all j2ee developers out there close your xml editors and take a pick.

We use Anthill Pro for our continuous integration build and it has all the bells and whistles you expect from big CI tool these days. But Hudson has only those basic things that you need to setup a continuous build environment. I was able to setup within 15 mins using my existing ant build file. Now when I compare with other tools they seemed to be over-engineered and difficult to setup and use(Let me know if I am wrong). Did I mention it has some cool plugins.

Wednesday, September 12, 2007

ejb 3

After ranting about Xml and j2ee development pain, I have to agree that ejb3 is really awesome. I was able to develop an entity and session bean without any deployment descriptor apart from persistence.xml file. Its really cool to see power of annotations in practice. Having a reflection of field experience really helps any framework to be more developer friendly.

Friday, September 7, 2007

xml bites again

Have you seen anybody who actually like doing j2ee/xml work?

I haven't and just because 90% of java work is j2ee stuff they are tied to it in spite of the dislike. If you have noko niko calendar of your team all you will see is :( . Apparently it took 1 day for me to integrate one external ejb with our module. I don't consider myself a j2ee expert but honestly how good are collection of xml configurations when every time you change something you have to redeploy. All I want is to compile and run my tests, is it too much to ask? . If you have a big project like us then you are screwed because every XML change requires jaring, redeploy and restart of your application. Its quite a big cycle when you have no compiler watching for your deployment descriptor errors. I am not sure whether Websphere application developer or Weblogic workshop have any sophisticated logic to validate your DD's before even deploying it.
Anyways do we really need all these descriptors to deploy some manage beans? Introspection and clever defaults could solve all the problem and it doesn't need a CS degree to figure that out, maybe some practical experience.
Honestly have anyone used any 3rd party ejb components or followed all the j2ee roles? If Java at all wants to make a component market a reality make it easy for developers.

Thursday, September 6, 2007

Fluent Interface

Like most other projects out there we are using fit/fitnesse to write our acceptance tests. But to be honest I am not very big fan of fitnesse. It doesn't scale very well with project size and having fixture tables through out fitnesse pages doesn't help readability and maintainability.

Especially if you are building web application you leave the UI part out of the test unless you integrate your UI test tool like selenium with fitnesse but you still miss the readability for tabular test structures. When we get story in BDD(Behaviour driven development) format and acceptance criteria in Given-Then-When style I expect to see my test in following pattern.

"Given products exists when I search product by name then user expect to see all matching products" do

test "goto product page and search for product code '100'
now number of matching products found is '10' "


Doing something like this Ruby is possible and in fact Dust is doing something very similar. But achieving something like this in Java is a challenge. Fluent Interface is one of the easiest way to do achieve DSL like look in Java and its quite easy to implement too. Lets consider the following selenium unit test

public void testGivenProductsExistsWhenISearchProductByNameThenUserExpectToSeeAllMatchingProducts() {


Its not cool as ruby DSL's but its close and quite readable. Some of our test now looks like this and rest of the team loves it.

Sunday, August 26, 2007

Five different ways to test equality

It's bit confusing when it comes to test equality of objects in Ruby. It has five different ways to do it and each one has a different purpose and context in which it should be used.

equal? returns true if receiver and the parameter object have same object_id. Object ids are unique and its not shared among the objects. This method should not be overridden

== returns true if the receiver and parameter object has same values. This is most intuitive and should be overridden in your sub-classes

eq? Like == it compares objects but is more strict about type. Only reason this exists is to compare Hash keys

=== This is used for Switch Case statement. It compares target in case statement with each selectors. You can override it to control the way case statements are matched inside the switch block

=~ Pattern matching (Side note: In Erlang = does the pattern matching)

== and =~ does have a negated version and since ruby is a great language if you implement == you != for free, isn't that great.

Next time when you have to equate objects you know which one to use

Tuesday, August 21, 2007

Ruby open classes

This issue have been flamed in many blogs and Java programmers are not very comfortable with open classes that includes me. But its really powerful there is not doubt about it, like Neal ford said how many times did we created StringUtils class in our java project. But I guess re-opened classes should be organized in some way where everyone knows where to find it. When I say "1.hour.from_now" example in the rails book for the first time. I was really shocked, does it makes sense to have hour method in Fixnum and to add more confusion if you open irb and look at fixnum methods you will not see it at all.

One of the thing that Java programmers should get over is you cannot know a class in Ruby completely. In Java we could say that I know the String class, I know how many methods are there and what are those methods etc but in the world of open classes you never know. There is no replacement of communications, in ruby world its more important talk about your work with other teammates and unit testing of course.

Tuesday, August 14, 2007

netbeans ruby support

If you are used to eclipse or intellij, you know how hard is to live without auto-completion, debugging and refactoring. Textmate is cool and simple but netbeans ruby support is probably best right now. It actually uses string pattern matching to list out all the options and its pretty fast. To download ruby only version go to link

Friday, July 20, 2007

eval vs define_method

There are many ways you could dynamically define methods and eval should be your last option. I really don't care how many variations of eval ruby provides but don't use it. Writing code inside string cannot help anyone not even you.
Please remember "with more power comes more responsibility".
define_method is much cleaner way of defining methods in meta world and gives much more readability.

Tuesday, July 17, 2007

Starbucks does not use two-phase commit

As a consultant I do fly a lot. Its sucks to do that but at the same time I do get time to read through some of my pending list of books. Right now I am reading "Best of software writing 1" by Joel Spolsky . Anyways, the "Starbucks does not use two-phase commit" is an awesome article. In the synchronous world where most of us leave in, its fascinating how effective asynchronous solutions could be.

Based on my previous experience I could say that messaging solutions is not straightforward to implement especially if you haven't done it before. Its a exotic world of xml messages, its has its own patterns and challenges.

Friday, July 13, 2007

Software rewrite and big bang theory

Managing multiple version of any product is tough and intricate and if the product is poorly written, you have a mess in your hand. Refactor or rewrite is a debate we participate in all the time. Let’s not go into that again right now. Let’s pretend that we have decided to rewrite our product….hoooray. But rewriting the whole product in a one bang is not only ill-advised but a project doomed to be failure.

So what should we do then? Take small steps. If you have a big, unmanageable product in your hand, figure out the core/important services/components that need to be rewritten (maybe in different technology). Integrate those components with your existing product as soon as possible and release it. If you have many existing clients, releasing quite often could be an issue. Maybe hosting your new solution as a service (SaaS) with data centers might solve that problem. This could also be very lucrative to customers because they don’t have worry about any infrastructure/administration issues any more. This might cost you more money but you know what! you will always have a working software.

Sometimes you cannot avoid having multiple version of same product, especially when you are transitioning from old messing mud ball architecture to something more manageable. But rewriting in one big bang is an illusion which results in a 200 member team project with no end date (I am serious).

Tuesday, July 10, 2007

Duck Typing

I was reading a blog by Bill Venners about duck typing and kind of liked the following extract

...Don't check whether it IS-a duck: check whether it QUACKS-like-a duck, WALKS-like-a duck, etc, etc, depending on exactly what subset of duck-like behaviour you need...

Its funny how we advocate the same thing in Java in spite of being statically typed , when we talk about programming to interface not to implementation. As long as it QUACKS, WALKS like a duck, we shouldn't care about its type.

Sunday, July 8, 2007

To do list

I find it really hard to keep my focus on one thing for very long. There are so many stuff to do. I guess its a trademark problem with any software developer. Anyways I have decided to give another shot to organize myself, create my own personal project plan. I found voo2do to be good place to start. This site allows you to create project, tasks with time line and organize them. One of the cool feature of voo2do is , you can add new tasks just by sending a email.

Now I need to out-source all my tasks :)

Thursday, June 28, 2007

Web UI prototyping

I guess we all agree to the fact that developers are not very good UI designers, atleast I am not. 5 pixel here, 10 pixel there is not my cup of tea. So we have UI analysts, designers, usability experts to bother about them. But how helpful is your UI prototype if developers can't even use it. I hear some people use photoshop for prototyping. Now whats wrong with this picture.

Let me guess,
  • we don't know what color code you are using?
  • no html code to start with?
  • fonts, borders other style sheet properties are up for interpretations
  • and any more...
if you as a designer don't get the feeling of how it works in html or how long it going to take, how good that could be for the project?

I think its very important to see that developers get a cleanly built static html page to start with. So that they can plug-in their dynamic parts to it.

Wednesday, June 27, 2007

Ever wondered how virtualization works

I am planning to run windows on my mac book pro, so I recently brought parallels which I heard is really amazing and resource hog. Anyways and the end of the installation I realized that I need to have Windows XP or Vista installer to install on top of parallels. Urrrrg... what I was thinking?

Check out this video. Its really cool

Ritual vs Standups

As an agile team we are terribly affectionate about lots of things and Standups is one amongst them. We do it everyday religiously and discuss our last day’s activity, plan for today and hurdles one needs to over come.

I feel like ritual when I attend the meeting every morning. I could feel very subtle differences between this type Standups and Status meeting. The bigger and better benefit of it is to have a shared commitment across the team and to get a positive feeling. If some pair is having a problem it becomes teams problem and the whole team should try to solve it.
Unfortunately umpteen times it remains as status meeting. I believe we should be proactive enough to say NO to such meetings because if it is just about status we have card wall.

I am working on how to make my team more insightful and proactive about standups rather than just one morning ritual.

Tuesday, June 26, 2007

Conway's Law

Have you ever wondered why big organizations end up developing software having multiple sub-modules/layers which doesn't interact very well with each other. Hummmm... sounds like a project you are working on! according to Conway's law
Any piece of software reflects the organizational structure that produced it.
The reality is, it doesn't matter what methodology you are using to develop your software, without communication and organizational overhead, its a ship sailing nowhere.