Saturday, September 05, 2009

Metrics

The last couple of weeks I've been spending a little effort on getting some code metrics up and running. I've blogged about measuring in software development before, and I think code is definitely one of the easiest and most important things to measure.

The most important thing about metrics is that you monitor them. I am of the firm belief that if you run a static code-analysis report manually, it will give you very little. Your team will say "wow, we have 3000 FindBugs warnings", fix a couple of them, and then forget about it. Then the next time you run the report, you'll find new bugs that have crept in, with no idea of when or who did it.

There are two ways to track these kind of metrics:

  1. IDE warnings
  2. Continuous integration reports

IDE warnings

Most of you have probably enabled the built-in warning system inside Eclipse (unused method, potential null-pointer, etc). Some of you strive to minimize these numbers of warnings, some of you have perhaps even turned on more than the default warnings in Eclipse. The key practice which I recommend you all adopt is the zero-warning-policy.

(I couldn't find a good place to quote, so I'll come up with my own definition:)

The zero-warning-policy is a programming practice which states that at any time, the number of warnings in a code base should be zero. With this in place, it is easy to discover and take care of any violations immediately, before commit. Gradually, new warning rules are introduced to the developer's team, and the existing violations are promptly removed, making sure the level is back to zero before every commit.

After some time, you may find that your team has exhausted the IDE's warning policies. At this point you have to introduce plugins to the IDE to facilitate more warnings. Now it gets a bit tricky, cause every team member needs to have the same IDE configuration.

Continuous integration reports

This approach works fine in coalition with the IDE warnings. The clue is to implement the warning policies into your CI-server. Some teams practice zero-warning-policies also here, the strictest variety would be that any violation will actually break the build. This is a good way to enforce zero warnings, but can be a bit too strict for most teams.

There are two strengths of CI reports: Firstly, they are centralized, so there's no need for the team members to set up any configuration or plugins. Secondly, they can track metrics historically, so you can see from day to day whether the number of violations are decreasing or increasing.

Historical data is a good substitute for the zero-warning policy. You may have 1000 violations in your code-base, but the key is to discover when new ones are introduced, and catch the violating developer in the act of producing bad code.

It is also interesting to track metrics over time to see whether coding practices have any effect on the quality of the code. Did introducing pair-programming/commit-mails/TDD lead to fewer violations? Now you have proof.


The landscape of metrics

Now that we have some motivation for putting code metrics into play, which tools should we use? There is a number of alternatives, both commercial and open source. Googling around will probably set you in the right direction, but here are my experiences:

Which reporting tools?

I like to divide into a families of metrics:
We played around with these tools, and found that the best combination for us now was JavaNCSS, FindBugs and PMD. We still haven't got enough test coverage to even bother measuring how low it is, unfortunately.

Which IDE?

Both Eclipse and IDEA have a good number of built-in warning policies, and most of the tools above come as plugins for both.

Ant or Maven?

Most of the tools above come as either Maven-reports or Ant tasks. Even though I'm a big Maven fan, I found it to be quite easy to set up all the tools with Ant. The Panopticode project, which aims to provide a number of metrics into one easy setup helped me a lot with finding the way to structure this into our existing Ant project. If you've got a Maven project, introducing a report should be as easy as five lines of XML in your pom.xml.

Which CI-server?

I've been using Hudson for so long now that I didn't bother with trying out anything else, but I'm guessing that none of the other products come close to Hudson in the number of tools supported by plugins. If I did have the money for Atlassian's Bamboo, I would definitely give the Bamboo + Clover mix a run.

Run it nightly

Finally, I found it best to not run these metrics after every commit. They take too long, and nobody inspects the changes in number of warnings from build to build. Instead, we run metrics nightly, so every morning we can see that there are X more/fewer violations in the code base. I'm really happy with how well it ended up working, and I hope this lends some inspiration for you to try the same.

Happy measuring!

Sunday, April 26, 2009

Reason 3: Don't build everything all the time

This post is a part of a tiny series I'm doing on why we use Maven, and you should too.

Previous posts:

Huge projects are hard to work with
Many projects that have grown over time will become too large to easily work with. The workspace gets too many classes, the IDE slows down and the build takes too long. If the developers focus on separating the concerns of the classes into packages of functionality, these packages can be organized into modules. As the contract and concern of a module becomes more defined, its rate of change will fall to a lower frequency than the rest of the project.

Once a module's activity has slowed down sufficiently, you can retire it into an external project, build a JAR-file from it and use this ready-built artifact as a classpath element for building and running the software instead. If changes occur later on, you can re-build the JAR-file.

Examples on where this might be appropriate:
  • Low level libraries and utilities, much like Java's own java.util package only changes every other year or so.
  • Contracts or adapters around external services, because integration with 3rd parties require stable data-formats.
What Maven does
Maven eases the work of maintaining such dependencies. As projects "subscribe" to their dependencies, they pull in the latest appropriate JAR-files automatically (snapshots) or by choice of versioned artifact. In an environment with a continuous integration server and a maven repository, the library developers need only commit their changes, and the artifact will be automatically built, deployed, and pulled into the depending project. A good term to describe this setup is Enterprise Maven Infrastructure (see this link for more information on how to actually implement this),

Again, understand that it is better to subscribe to your dependencies than to push them in.
  • Library developers do not have to deploy their artifacts to all clients
  • Clients keep the control of which libraries they use, in which version
  • Easier to maintain transitive dependencies (see my previous post)
  • Getting newer versions is easy
Just to clarify the last point: When you want a new version of a library, you change the version number in the pom.xml. If you want the latest/greatest build (handy for an adjacent project, or a library under heavy development), you make it a snapshot version number, and suck in the latest JAR file from your maven repository on every build.

I could go on on how bad it is to work on a project with a single huge build, but I imagine most developers out there are either struggling with it right now, or have done so some time in the past. There are many reasons why you want to break out modules of your project for architectural and code-design/quality reasons, but in this post I chose just to focus on the basic reasons. I came across one video from SonaType that illustrates this situation very well, so if you didn't get it from reading this post, please take a look at it (although the fancy staging functionality of Nexus is not that important, nor the point of this post).

Monday, April 13, 2009

Reason 2: Clean up your JAR-files

Update: Added a summary section at the end of this post.

This post is a part of a tiny series I'm doing on why we use Maven, and you should too.

Previous posts:

Some background

Back a couple of months, I got the rewarding task of cleaning up our project's lib folder. You know the one: Crammed with JAR-files of various versions of the various dependencies your project has..
fizz-project
\
fizz-core
fizz-web
fizz-libs
\
junit.jar
spring.jar
common.jar
lots and lots of others...
...

Yup, good old fizz-libs. It needs to be regularly cleaned up to reduce software rot. Over time, the developers try out new open source libraries and remove the use of old ones, but they seldom take care to clean out the libs-folder, because they don't know if there could be any hidden effects from removing JAR files.

Now, at our place we use Eclipse's .classpath file for specifying each module's dependencies. Each module is explicitly configured with which JAR-files (within fizz-libs) it depends on.

Unfortunately, Eclipse's .classpath file does not support any automatic reporting for analyzing and discovery of unused JAR-files. So I grabbed Jar Analyzer and set it loose on our libs folder (by the way, the author of the tool, Kirk, has a blog full of good thoughts on JAR-design, lately taking a humanly readable take on OSGi, recommended).

Jar Analyzer scans for compile dependencies, meaning that it can create a tree of which JAR-files are needed to compile which JAR-files that are needed to compile these JAR-files, and so on. You get a very nice report/graph which shows you all the JAR-files and why they are in there.

You can also see the JAR-files that don't have any connection to your code, remove them and their children. What I found in our libs folder was that about 20% of the 150 JAR files in our libs folder were unused at compile time, and these were potential JARs to be removed.

The big aber is that you don't get any hint on which JAR-files are used only at runtime by means of discovery and reflection. And this is where the real work begins.

The only way to find out whether a JAR file is used at runtime is basically to take it out, start up your application and test every functionality. If you have an application of moderate size, performing a 100% regression test takes many hours. So in practice, I ended up doing alot of guessing, quick and dirty testing, and asking around to find out which of the runtime dependencies were actually in use.

In the end, after two days of researching and testing, I ended up removing half of the compile-time-unused dependencies, crossing my fingers I didn't break anything in the process (which I did anyway).

The experience left something to be desired in the way we define dependencies: Eclipse's .classpath file simply does not allow you to express how and why which dependencies are in your project. You need something else: A tool that can define scope, version and transitivity of dependencies.

Scope


The total classpath for our running application is expressed in a dependencies module, which is an Eclipse project that solely exists to be used by Ant to build up which JAR-files should be part of our deployable WAR-file.

This dependencies module is alot like our web module, but it excludes references to JAR-files which are already available in the runtime of our application server. You could say that these JAR-files belong to a certain scope: they are not needed at compile time, and they're not needed at testing-time. Their scope is limited to runtime.

Another scope we often talk about is testing. These JAR-files are only needed for running and compiling tests. JUnit and mocking toolkits are typical examples. A good reason for keeping JAR-files with this scope seperate is that you do not want these JAR-files deployed along with the rest of your application.

So, let's take another look at our libs folder:
   fizz-libs
\
junit.jar (test scope)
mock.jar (test scope)
spring.jar (compile scope)
common.jar (compile scope)
jboss.jar (runtime dependency)
So of these, only spring.jar and common.jar need to be brought along when we are deploying.

Instead of hacking together a special deploy-classpath configuration for Ant, Maven does exactly this when building WAR-files out of the box.

Transitive dependencies

Let us take a look at a couple of our modules (mea:
fizz-project
\
fizz-core
fizz-web
If fizz-web depends on fizz-core, and fizz-core depends on spring.jar for compilation, you can be pretty sure that fizz-web also depends on spring.jar indirectly. We say that fizz-web has a transitive dependence to spring.jar, or spring.jar is a transitive dependency of fizz-web.

In these terms, all dependencies in Eclipse are non-transitive until they are configured as being exported. This is the nearest thing Eclipse gets to having scoping on its dependencies.

Naturally, keeping track of transitive dependencies is imperative. Lack of control on this leads to missing class definitions at runtime, as well as unneeded JAR-files in your lib-folder that need to be cleaned up periodically (like I did).

Versions on dependencies

Now, add into this mix that spring.jar also depends on other JAR-files again, perhaps apache-commons or something else. And then you have to remember that you need to know which versions of these 3rd party library depends on which versions of their transitive deps, and
so on. This problem is expressed pretty well by Jason Van Zyl in his blog post Why Maven uses JAR names with versions, so I'm not going to write more on it right here. Basically, having an explicit notion of which version is an important part of controlling your dependencies.


Summary: Keeping order in your dependencies is easier with Maven

Since Maven makes us express the dependencies, their versions and their scope in the POM, an XML file dedicated to this purpose, we have a much easier task of maintaining our JAR-files. The easiest way to show this is to demonstrate the maven-dependency-plugin on a tiny example application I had lying around:

[INFO] [dependency:analyze]
[WARNING] Used undeclared dependencies found:
[WARNING] com.opensymphony:xwork:jar:2.0.4:compile
[WARNING] Unused declared dependencies found:
[WARNING] org.springframework:spring-mock:jar:2.0.5:test
[WARNING] org.springframework:spring-core:jar:2.0.5:test
[WARNING] javax.servlet:servlet-api:jar:2.4:provided
[WARNING] javax.servlet:jsp-api:jar:2.0:provided


The result of running mvn dependency:analyze is a report saying:

(a) which dependencies this project has that are unused (and can be removed),
(b) which dependencies this project has that are used at runtime, and
(c) which undeclared transitive dependencies are sucked in, but not declared in the pom.xml as it should be.

This is all the information I need to do the cleanup I spent two days on (given that all dependencies are correctly configured in our project).

I hope next time I'll be able to express why it's a good thing to publish/subscribe dependencies instead of pushing them into projects.

Reason 1: Get your libs-folder out of SVN

This post is a part of a tiny series I'm doing on why we use Maven, and you should too.

Previous posts:


The libs folder


We have a libs-module in Subversion. When you check out the source code for our main product, this is one of the modules you get. It contains a hundred-and-some JAR-files. These are the dependencies for the sum of our modules:

fizz-project
\
fizz-core
fizz-web
fizz-libs
\
junit.jar
spring.jar
common.jar
Downloading all these MB's of JAR files is something you'll have to do no matter which build system you use, so bandwith cost isn't an argument. Subversion also uses binary diffs, so copying or changing a JAR file doesn't increase repository size significantly.

The problem arises when you want more than one product. As soon as you want to split your product into two applications (or services), each project needs its own libs-folder:

fizz-project
\
fizz-core
fizz-web
fizz-libs
\
junit.jar
spring.jar
common.jar
woop-project
\
woop-core
woop-web
woop-libs
\
junit.jar
spring.jar
common.jar
By doing this, we almost efficiently duplicate our dependencies. While each project can manage its own dependencies without fearing for breaking functionality in the other project, efforts to maintain the libs is duplicated. All upgrading, figuring out bugs, transitive dependencies will have to be done in two places.

The alternative is to introduce a global libs folder:
fizz-project
\
fizz-core
fizz-web
woop-project
\
woop-core
woop-web
global-libs
\
junit.jar
spring.jar
common.jar
... but unfortunately this would over time become a giant heap of libs of different JAR files in different versions, and for even the tiniest project you would need to check out the entire global-libs folder. Because you have no hard linking to which project a lib belongs, you can not actively do cleanups and get rid of unused JARs. Over time, it would grow to be hundreds of MB, perhaps even GB, containing every JAR file of very version all the products of the company ever used.

So neither of these approaches are particularly tasty for an organization with a large codebase and number of projects. The first approach enforces all-source-code-in-one-build with one gigantic sluggish workspace in your Eclipse, while the second enforces one gigantic global-libs JAR folder that everyone hates to download and deal with.

Maven's solution to this: There is one global JAR-repository like in the second approach, but download is done lazily. Each project has meta-data for which JAR-files it needs, and only upon building a particular project are the needed JAR-files downloaded from the company JAR-repository. Also, JAR-files are cached and referenced in a local Maven repository on each machine, so if you are working on three projects that use junit3.jar, you only have one junit3.jar in your ~/.m2/repository directory.

Additionally, Maven support inheriting dependency management. You can define parent projects that define dependencies, and have different projects inherit these.

This post is already long enough for publishing, so I'll continue next week with Reason 2: Clean up your JAR-files.

Sunday, April 05, 2009

Why you should use Maven

Update: I'm doing some work to split this blog post into some more fine grained posts in a series. Please, bear with me if these changes are giving you lots of noise in your feed-reader.

I used to work as a consultant. My job was to improve our clients' ways of software development. Among the most important things I tried to teach them were:

o Good code style and object orientation
o Practical use of good open source tools (don't re-invent the wheel)
o Automating tests of their software, and continuous integration
o Splitting code into modules, dependency-relationships and versions

The last point is perhaps the trickiest. It's hard to understand why it's needed in an isolated project, it is hard to explain how it should be done, and most importantly, there is no de-facto way or standard for managing modules, their relationships, versions and scope.

This is why me and my consultant buddies embraced Maven many years ago. After years of pushing and evangelizing at our clients', presentations at javaBin and JavaZone, Maven has at least become the way for managing and building Norwegian Java projects. There are still old Ant projects around, but I haven't heard of any new ones being started without Maven, or any old projects where a Ant/Maven migration path hasn't been thought of.

Here at IP Labs we still have an Ant build for our main project, and it works. (We have also started using Maven for a bunch of ad-hoc projects). There is a small, co-located and tightly communicating Java team that all use Eclipse with identical setup. In order to build our product, you check it out of Subversion and run "ant build-all", and that runs pretty similar to your average "mvn install": compiling, running tests and building binaries.

So here's the million dollar question: When our build system works perfectly fine, why should we go to the trouble of converting to Maven?

And instead of answering with some fluffy modular design theory, let me get hands-on, and give some real practical reasons in these following blog-posts. The first one is Reason 1: Get your libs-folder out of SVN.

Sunday, March 15, 2009

Initializing Scrum

After I began working at my new workplace, I've been gently pushing Agile here and there. We've been brainstorming how we can get agile working for our people, and so far we've adopted a few patterns and practices, but putting those plans into action has taken some time. Originally I hoped that things would go very quickly, but agile is about people, and people are hard to change.

Getting better, always.


We have a product that works really well, and pretty much all of the developers are happy. (Generally speaking, this state can be dangerous for a business. There is a danger of falling asleep, one day waking up to see that your competitors have gotten a good hold of your customers, with a better product and better marketing.) Having an environment that strives for improvement is a critical part of persisting success. And striving for improvement, well, that's what agile is.

Luckily, our team of developers do a lot of activities in the hunt for technological improvement. There is a team of architects (and by that I mean hands-on hard-core, coding Java gurus) that work across the other developers, singling out targets for refactoring and other improvements. Another practice I really dig is the weekly Java-team meeting, where one of the developer present a subject either on good programming practice, new tool/feature, or explaining a certain part of our domain model.

As well as pushing for technical excellence, we also want to push for process excellence. We want to give accurate estimates, we want to deliver fast, and we want to deliver the stuff that is most important first. This is where I (and the people who hired me) figured that Scrum would be a good try, but before I explain how the first week of scrumming has gone, I need to explain a little more about our team.

Who does what?

We've got nearly twenty developers working on our product (there are other teams in the company, but we're an independent gang for the most part). In this product there are many families of functionality, and there is no clear designation of which developer does which functionality. There is a lot of tacit knowledge on who does what: "Bob did a lot of work on the fizzerburpilator", or "Bill wrote the shackalock-editor, and occasionally does some maintenance on it" (features are given fantasy names for non-disclosure reasons).

Understandably, it is a bit fustrating for our customer-contacts to ask for new features, because often (a) they don't know which developer can do it, (b) the chief architect is too busy to spend time managing the tasks of every single developer, and (c) the developer who knows how to make the new feature is busy doing other critical stuff.

The solution to this frustration seems pretty clear: Organize into sub-teams, preferably by feature. However, we can't just jump right in and do a full-blown re-organization, we have to be careful about it, and we have been waiting for a fitting opportunity to try this out.

Taking Scrum for a spin

So, recently we had a big customer come to us with a feature request, let's call it "fizzburp hickup". It is a bit too big for one developer to do by himself, and there are some architectural challenges which would probably require a weighed consensus of developer opinions rather than the brilliant idea of a single programmer. The scope and definition of "fizzburp hickup" are pretty well described, and we have an ample time-frame, so we figured that this would be the perfect opportunity to try out Scrum with a small team of developers, called Team Espresso. If the experiment goes well, Team Espresso can continue existing after their feature has been developed, keep on maintaining it and adopting some other features as well.

The first sprint got scheduled to start this Monday. I knew that boiling up the backlog for the team would eat up alot of time, so I started the week before by chipping the requirement spec into user stories, using the customer-contact for verifying that I had gotten a good understanding of the domain, and also tried out User Story Mapping for the first time. I ran through the story cards with our chief architect and got a first-impression of estimates. Getting him to put estimates on user-features instead of architectural components was really hard, but in the end we came through with a rough estimate of the backlog-effort. We used 'tricky points' as our unit of estimation.

We then had half-a-day "kick-off" with the customer-contact and architects. First we went through the requirement spec and had the customer-contact (who unfortunately went on vacation and was represented by the, erm, chief architect) communicate the motivation for the new features. Naturally, the focus went technical early on, but I've been assured that there has already been so much communication with the customer on the "fizzburp hickup" already, that we shouldn't need any more input from them for the time being. Hmmm!

Sprint planning

After the kick-off, we gathered the team around the story map to do estimation and commitment to the first sprint (one week!). Naturally, the team zoomed down into technical discussion on every other story card (which is a good thing!). We discovered a good few open technical and functional questions that we would have to take back to the architects and customer-contacts. I thought this process was very fruitful, because we were finding challenges early that we would have to face sooner or later.

However, in the rest of the team there was a feeling of "let's just go and get started it", while I was forcing them to put tricky points on the user stories, and again it proved difficult to get them estimating features instead of technical components. Their point (as I understood it) was that in the end, we would have to deliver the same functionality anyway, and thinking in user-stories instead of components would only disturb our estimation thinking and architecture plans. That actually was a good point. My reply was "do all the architectural consideration you want to, but leave the story cards", in other words: bear with me on this. Finally, we committed to our first sprint, choosing three stories summing up to 30 tricky points.

And off we go!

On the first day of the sprint, I tried to get the team breaking the three stories down into tasks with hourly estimates. This proved even more difficult. I was inflicting even more Scrum overhead on a team which wanted to get to work. The point of breaking backlog items into tasks is to get a picture of remaining hours for sprint burndown, as well as assigning tasks to point person. Does this need to be explicitly done in such a small team for such a small project? I think so, because for a practiced team this overhead is virtually nothing. For my team in this sprint, however, we let it go.

Halfway through the sprint, the team got a bit nervous about delivering/presenting the result to the customer. Showing off that little progress would only anger and confuse the customer, making them come up with a burdening set of detailed requirements to "speed us up". So we extended our sprint to last two weeks instead of one.

We also changed around the planned story items. The architects found the time to do some smart fixes that allowed us to grab and do some of the more important user stories off the backlog.

At the end of the sprint now on friday, we had completed only one of the three committed stories, plus one extra because of the architecture fix. We had made alot of progress on the other items, but not completed them.

Retrospective

So, in order to help us reflect on how we should continue in the next sprint, let us sum up what practices we have tried and given up:

* Daily standup - stopped this, because we are already doing daily standup with the rest of the developers (I might write a post about how it was to get people adopting daily standup later).
* Story planning, we will continue this, although we are aware that it doesn't give us that much value without an on-site customer.
* Task tracking - stop this, too much overhead for such a small scope.
* One week sprints - go over to two week sprints instead.

I hope that we will be able to resume some of these, the 1-week-sprint in particular. There is a big organizational challenge which is making it difficult for us, and that is a quite common one in organizations adopting Scrum: We are part of two teams: On the one hand, we are Team Espresso, an agile group dedicated to deliver the "fizzburp hickup" functionality. On the other hand, we are part of the larger developer team, supporting and maintaining all the bits and pieces of our software, getting ready for our coming release ("fizzburp" is scheduled to be released in the next one after this one). Juggling these two on an hourly basis is proving quite difficult for the team.

I'll try to post back with an update after the next sprint. It could be that my expectations for how smoothly this would go were a bit too high, but hopefully I will be able to post back with a bit more uplifting results by then.

Saturday, January 31, 2009

First month of work done!

So! As I blogged about previously, I've begun working at a new company right after New Year's. I figured I'd get some thoughts out on how the first month has been.

Usually, when someone begins in a new job they're excited, nervous and above all very humble towards the existing practices that exist in the new workplace. Of course, I had these feelings, but being an agile fanatic, I was pretty sure that I would be able to find some improvement points. Here are some of the specific steps I took during my first weeks.

Step 0: Start writing a diary

I don't think an honest worker was ever harmed by being transparent in his work. A practice I've been doing ever since I started working is The Diary. Basically, just a personal wiki-page where you note down a few lines each day on what you're working on. Apart from being a good way to keep focus throughout the day and being a nice place to paste notes and code, it sends out a message: that you're interested in letting others know what you are working on. I'm going to be asking people what they're doing a lot, so being transparent in my own activities is a good start.

Step 1: Get Continuous Integration set up

One of my first reactions when I went to work on the code was a certain sense of claustrophobia. Here there were about twenty developers working on the same code base, and I really didn't have any feeling of who was committing what when. I first tried to get commit-mails set up, but due to some issues with commit-hooks in their Subversion setup, we couldn't get that working right away. So I turned to set up continuous integration with Hudson. My hope was that the CI changeset pages could work as a temporary commit-mail replacement, and since there already was a ViewSVN installation running, this worked out quite nicely.

From Drop Box
Note that the screen shot is not from our place, but from Sonatype's CI farm (tip o' the hat to Alf!).

Not long after that we were able to also get a nightly deployment of the build to the testing server, so now testers and designers can always experience the latest running on some local servers.

Note that getting this far in a couple of weeks would never had been possible in a traditional company (in my experience). The credit of this smooth setup belongs to some of their developers and admins, who put together the necessary scripts and server setup in record time. They actually had a continuous integration already, running the build each night as a cron-job. All I did was drop in the idea of using Hudson, and running the build on every commit.

Step 2: Do some agile preaching

I wanted to give the other developers some agile 101 very early, and luckily a slot opened up in our second weekly team meeting. I did this somewhat critical presentation on Scrum, so now when I accidentally throw terms like velocity and backlog around, they will have an idea of what I'm talking about.

Step 3: Whiteboards, whiteboards, whiteboards!

One of the things I did the first week was to get some large whiteboards ordered. I am of the opinion that you can never get enough whiteboards, and management agreed to spend a small fortune on this (again, something that wouldn't be easy in a traditional company). They finally arrived last week, and on Friday we finally got our team-lounge set up:

From Blogger-bilder
It's quite neat, I think. My plan so far is to use the far-left one for backlog stuff, the two horizontals for Sprint-charts, and the one on the right for anything else people would like to draw, be it architecture or obscenities ;)

It will be quite interesting to see how this works out. Some of the developers were speculating that the setup will be working for the first few weeks, and then fade away and people won't bother any more. Well, if people don't need this amount of communication in order to work efficiently, we will of course not force people to participate. I think everyone is better off if they spend 10 minutes of their day with the rest of their team on a daily standup in front of these whiteboards, but if people still don't like it after giving it an honest try, we'll remove the practice. After all, that's what being agile is all about.

Sunday, January 04, 2009

Not consulting any more. Or am I?

As I've hinted in some earlier blog-posts, I have now moved to Bonn, Germany, and as of last Monday, I'm working as a developer for IP Labs.

This means I won't be a consultant anymore, as I have been for the last 2,5 years. I am now a "fast ansatt", or steady employee. It's a bit interesting to ask myself:

  • Does this mean my rocketeer knowledge increasing career has come to an end?
  • Will I go to work with a much more relaxed attitude, getting used to stable work environments and fewer changes?
  • Will I spend less time overall doing stuff related to my profession?

I hope the answer is to all three question a ringing 'no!'. I really enjoyed being a consultant because it allowed me to do stuff I'm really good at. I'm not a super-programmer, in fact I know lots of programmers who are better than me (well, even more that are worse than me), but I hope I still will be able to contribute lots to the company by doing what I always do: pushing for more agility and sound practices.

So far in my career, I've worked closely with about 5 different teams, from 1 to 10 in size. My role in these projects have either been enforcing soft values (typical agile stuff, like planning, estimation and practices), enforcing hard values (code style, tool-use), or both. This effort has been spent mostly on the individual level, some on the organizational level, and then some on the community level (although not as much as I would've liked).

At IP Labs, I've found that the individual/hard values are already at quite a high level. They (or we, as I should say) are already well-endowed with pride, professionalism and quality, as well as excellent Java coding skills. There are some practices that can easily be introduced to make things a little better, but things are working, and the developers are delivering lots of functionality with steady velocity.

Also on the organizational level, they are focused on developer-satisfaction as well as customer-satisfaction. Already from day one, you feel that your developer needs are being taken care of, getting free choice of laptop and equipment (I'm now the proud owner of a MacBook, which I so far utterly despise, but hope I will learn to love in time). The infrastructure is very developer oriented, and Windows is frowned upon.

There is no crappy Exchange mail server here that forces everyone to use Outlook: It's simply IMAP - use the client you prefer. They don't use Messenger or SameTime with proprietary protocols, they use Jabber instead. Again - use the client you prefer. All in all, one kick-ass place to work :)

Well, back to the ranting. ..

The luxury of not being a consultant is that my voice can be a little louder. No more tip-toeing around, packaging plans into sweet little convincing ideas and planting them in other people, being sure not to make it sound like you're not selling anything, even if you're not selling anything but common sense.The idea is that if you're a steady employee, you can criticize, argue and be taken seriously without too much beating around the bush, subterfuge and convincing.

Or maybe it really isn't that different. As a consultant, you have to be careful not to be to rash, try not to insult anyone, be fair, objective, honest and overall being very very patient. Shouldn't the same rules apply to all software workers? Just a thought...

I think after all my job won't be that different. Maybe I'll get some more elbow-room, but all in all, consulting is perhaps nothing else than being an understanding, careful and humble colleague.