Ever tried Tribes, Squads, Chapters & Guilds in an existing culture?

I was reading this old article from by Henrik Kniberg and Anders Ivarsson. When you look around its still years ahead of what most organisations are doing. Spotify have moved on since too I suspect.

So I began to wonder if anyone has ever attempted this at an existing organisation? I.e. Not by setting up from new startup? Probably not many, less with 200+ employees and possibly never with serval thousand. I got close to being allowed once. Would love a second chance. I suspect it would require a committed business, perhaps a desperate one.

If a place had no choice perhaps. In such a difficult spot that the only choice was to attempt a huge cultural shift or go bust?

There was a good Java Posse Podcast the other day on this very subject. My main take away was its pretty rare to move away from a hierarchy.

So what are the conditions for attempting this at an organisation? Anyone ever been involved in such an attempt now or in the past? Do you know somewhere that wants to try it?

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)

MeanBean easy way to test domains

Stumbled across this easy way to test domains, its called MeanBean

Typically many projects don’t bother with testing domain classes. They hope that other tests in the suit will do that. Perhaps, but I have found many bugs with hashcode and equals over the years. It’s very dull testing these beans there has to be a better way!

Meanbean from Graham Williamson makes it possible to do it in one class.

Given these two simple domain classes

public class PersonId {
	private long id;

	public PersonId() {
	}

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	@Override
	public boolean equals(Object o) {
		if (this == o) return true;
		if (o == null || getClass() != o.getClass()) return false;

		PersonId personId = (PersonId) o;

		if (id != personId.id) return false;

		return true;
	}

	@Override
	public int hashCode() {
		return (int) (id ^ (id >>> 32));
	}

	@Override
	public String toString() {
		return Objects.toStringHelper(this).add("id", id).toString();
	}
}

public class Person {
	private PersonId personId;
	private String firstName;
	private String surName;
	private String middleName;

	public Person() {
	}

	public PersonId getPersonId() {
		return personId;
	}

	public void setPersonId(PersonId personId) {
		this.personId = personId;
	}

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getSurName() {
		return surName;
	}

	public void setSurName(String surName) {
		this.surName = surName;
	}

	public String getMiddleName() {
		return middleName;
	}

	public void setMiddleName(String middleName) {
		this.middleName = middleName;
	}

	@Override
	public boolean equals(Object o) {
		if (this == o) return true;
		if (o == null || getClass() != o.getClass()) return false;

		Person person = (Person) o;

		if (firstName != null ? !firstName.equals(person.firstName) : person.firstName != null) return false;
		if (personId != null ? !personId.equals(person.personId) : person.personId != null) return false;
		if (middleName != null ? !middleName.equals(person.middleName) : person.middleName != null) return false;
		if (surName != null ? !surName.equals(person.surName) : person.surName != null) return false;

		return true;
	}

	@Override
	public int hashCode() {
		int result = personId != null ? personId.hashCode() : 0;
		result = 31 * result + (firstName != null ? firstName.hashCode() : 0);
		result = 31 * result + (surName != null ? surName.hashCode() : 0);
		result = 31 * result + (middleName != null ? middleName.hashCode() : 0);
		return result;
	}

	@Override
	public String toString() {
		return Objects.toStringHelper(this)
				.add("personId", personId)
				.add("firstName", firstName)
				.add("surName", surName)
				.add("middleName", middleName)
				.toString();
	}
}

This is the meanbean domain test. This tests all set/get methods and the hashcode and equals

public class testDomain {

	@Test
	public void testDomain () {

		Configuration configuration = new ConfigurationBuilder()
				.iterations(10).build();

		final BeanTester beanTester = new BeanTester();
		EqualsMethodTester equalsTester = new EqualsMethodTester();
		HashCodeMethodTester hashTester = new HashCodeMethodTester();

		beanTester.testBean(PersonId.class);
		equalsTester.testEqualsMethod(PersonId.class);
		hashTester.testHashCodeMethod(PersonId.class);

		beanTester.testBean(Person.class);
		equalsTester.testEqualsMethod(Person.class);
		hashTester.testHashCodeMethod(Person.class);
	}

}

How easy is that? No excuse not too test that domain now!

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)

Loadstone – An interesting collaboration between Finance IT and Open Source

I wish this interesting new initiative much luck: http://lodestonefoundation.wordpress.com/

Banks already use a huge amount of open source. Linux has been used extensively for a long time, services are hosted with Apache and Tomcat. Server side software makes extensive use of a massive plethora of open source libraries. Finally developers are left to wire all this together and write a small amount of business code. UI/UX is possibly an exception to that rule in Single Dealer Platforms. The need for highly performant and glossy visuals helps make the case for using Microsoft or Adobe technologies.

There are plenty of attempts at open source projects in this space. Nothing that seems to have really taken off on the scale that Loadstone seems to be attempting though.

I strongly believe that its through genuine open collaboration like this that truly great things arise and you could argue that for all this use of Open Source its time the industry got more involved and payed back. What better way than to start something and contribute effort and funds. So good luck to this attempt to collaborate and produce something I hope it works out.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)

Its always about the Client Team

I went along to an Agile Testing in Finance session run by Gojoko Adzic. The session was entitled: Executable Documentation – The Remix. Always a good gig attended by intelligent folk who realised that there is much more to be done to mature the process of software development.

You can find some detail on Gojoko’s website and this post is not so much about the tools presented, but in a nutshell:

Chris Agmen-Smith talked about Pettswood, an attempt to make executable documentation accessible by business users.
Matt Wynne – Relish, an extension to the cucumber project to bring the specifications alive on a very presentable html report.
Cirilo Wortel – Xebium, Which I thought of as bringing FitNess up to date and giving it a modern UX.

So my take on all this? It seems to me that the most important thing is forming a good team around a key business user. That client team should have people from development a product owner, possibly a BA and at least one senior business user. Bring the requirements discussion, and priority right out into the open involving the business as much as possible.

Then tools like the ones discussed this week can be used to bring alive the tests in a format that the business can view and edit. Which just leaves the easy bit…. implementation. (I jest)

If you can’t form a Client team, there is little point exploring BDD or live documentation, as the important part is that conversation and interaction that the client team has over the specifications.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)