Agile w biznesie 2012 – podsumowanieAgile in business 2012 – a review

On Dec, 6-7 I attended the second edition of a new agile conference that took place in Warsaw, Poland. This conference, in contrary to every other I have seen so far, is (in theory) not targeted at software developers. It is called “Agile in business”…

Dostępne po

angielsku

On Dec, 6-7 I attended the second edition of a new agile conference that took place in Warsaw, Poland. This conference, in contrary to every other I have seen so far, is (in theory) not targeted at software developers. It is called “Agile in business” and aims at helping people working in various business departments to understand and benefit from the agile movement. This short post presents my review of the event.

Venue & organization

The conference took place in the Businessman Institute, a conference centre located on the outskirts of Warsaw. The place itself was ok. There is just one problem about it – it’s far… and I mean far. It took me almost an hour to get there. I think quite a few people had some issues with getting taxis to get out from there. And, as some folks stayed in hotels close to the venue and some others – closer to the city centre, it was quite hard to arrange any kind of an evening party. On the other hand, the second day of the conference started with some snowing which allowed me to have some drifting fun on the parking lot ;). Regarding the organization – I missed three things: a large screen with twitter stream around the venue, a conference party for networking and some kind of speakers dinner to get to know each other better. Besides that – all went smoothly.

The talks Frankly, I missed hell lot of talks during this event. Due to traffic and other morning stuff I didnt make it for opening talks on both days. Others I missed on purpose - there was quite a lot going on in the hall.</h1> <h2>Day one Day one started with</h2> <p><strong>John Styffe</strong> introducing the Stoos network, a pretty new initiative in the lean agile world that is aiming at agility at organizational level. This definitely is something I am interested in, but on the other hand I have no regrets about missing the talk as the general opinion was that John didn’t present anything revolutionary. <img class="alignleft" style="margin-right: 15px;margin-bottom: 15px;margin-top: 7px" title="Lightbulb" src="http://farm3.staticflickr.com/2215/2400098202_959e2ea6a2_m.jpg" alt="" width="283" height="211" />I arrived just as <strong>Jurgen Apello</strong> started his key note. Again - I didn’t hear anything revolutionary, but this time only because I have had an opportunity to see Jurgen before. He is a great speaker and I highly recommend googling his talks and spending one or two hours watching, for those who haven’t done it already. Jurgen mentioned quite a lot of interesting stuff, just to name a few: Beyond Budgeting, Design Thinking, Lean Startup (I really believe that people working for established enterprises that want to start a new product line should start with reading this book). An idea that the most powerful force preventing agile adoption is management resistance will be eye-opening for some (I hope). Later, Jurgen presented an idea of innovation that is particularly appealing to me - innovation is not inventing new things, it is (very often) inventing new ways of using old things. I extremely liked the idea of “management is too important to be left to managers”, again something very close to the way we try to run TouK. I could write about this talk on and on, but the conference continued and... The Oracle talks started... <strong>Tomasz Warchała</strong> started talking on some Ora product... Guys sitting next to me are witnesses - I really did my best not to comment and to actually listen. It must have been some kind of a black hole that sucked all my energy :). I left and I spent almost two hours (missing next session and almost missing lunch :D) around, having interesting discussions and talking to people... Thanks to Oracle guys, I was not alone... After lunch two separate tracks had started. I focused on track one with a primary topic of customer-vendor contracts - I was to be speaking at the end of the day here, so I wanted to know which ideas I will be referring to and which fallacies I will be refuting. The track started with <strong>Piotr Wąsikowski</strong> sharing his thoughts on agile contracts. Retrospecting on his talk I really struggled to find an idea I couldn’t agree with and I think that’s mainly because I struggled to understand what Piotr’s main message was. I think Piotr tried to convince us that when signing large contract it is necessary (for a customer) to introduce some kind of success fee that must be related to business goals of the project. And I think that if you can (as a customer) get this kind of contract - good for you. But as a software vendor I think that, first - it will not allow for or prevent project agility (success fee has nothing to do with agility) and second - this really reminded me of the first bidding for the second line of tube in Warsaw - at first the business goal defined was to make it operational before the start of Eurocup (June 2012). None of the bidders considered it realistic so all of them added around 1 bln PLN extra in their offers for penalties (and 1 bln PLN equaled more or less 15-20% of the whole contract price). This bidding eventually got cancelled. <img class="alignright" style="margin-left: 15px;margin-bottom: 15px;margin-top: 7px" title="Quarrel" src="http://farm4.staticflickr.com/3306/3610880025_fe860e9f5e_m.jpg" alt="" width="150" height="121" />Anyway, quite a few people in the audience started a heated discussion with Piotr, so the organizers had to interrupt to let <strong>Radosław Nożykowski</strong> start his part of the show. Radosław is an attorney and he presented his take on contracts. And again, I find it hard to come up with a particular point that I disagree with. The thing I remembered was that Radosław was suggesting to use frame contracts instead of project contracts to allow a series of small subproject orders. This is a good advice, we use frame contracts all the time, but I really believe this is neither a solution for problems the audience was expecting to be addressed, nor in any way related to agile or waterfall projects at all. After that, guys from a competing (with TouK) company came on stage. <strong>Krzysztof Gradek</strong> and <strong>Mariusz Wieteska</strong> gave four or five case studies of Pentacomp’s software projects in different industries. They covered one or two ideas from my own talk, what saved me some time. I believe that their main message was “It is possible!” and I liked it. Their cases showed the key benefits of doing agile projects - short delivery cycles with focus on working software over documentation and customer collaboration over contract negotiation. There was one thing those three presentations had in common. Lots of text on slides. And I really believe this is a basic mistake many (or almost all) presenters do, even some experienced ones. My own first rule of presenting (stolen from Martin Fowler) - don’t do a slide with more than five words on it. Five. And if you really, really need bullets (in any form) then please please please - animate them so that they don’t appear all at once. Eventually, the time has come for me to stand on stage. Thanks to a friend from TouK my talk was recorded - after editing and syncing with slides it will be available somewhere online. And I will write a separate blogpost on the ideas I tried to cover in my talk as well as some more discussion with ideas presented by other speakers that I cannot agree with. The day finished with a smalltalk at the venue restaurant, an additional chance for networking used extensively. The only real issue about day one was lack of a/c during second part of the day... this, along with heated dispute made staying there until the end a little burdening.</p> <h2>Day two Day two started with some snow... When I got to the venue someone caught me in the hall, discussion quickly involved more people and I didn’t notice when time came to get to the restaurant for lunch.</h2> <p><img class="alignleft" style="margin-right: 15px;margin-bottom: 15px;margin-top: 7px" title="RIP" src="http://farm5.staticflickr.com/4112/5154087532_b746ee8458_n.jpg" alt="" width="100" height="151" />After that I went to see <strong>Andy Brandt</strong>. I had wanted to get introduced to Andy for some time and I was not disappointed. Andy is an experienced speaker and, in terms of the art of presenting, his presentation was well prepared. I agree with most of his points, but the one I cannot agree fully (even though I understand Andy’s point of view) was his main one. I agree that from a personal perspective of many people letting corporations die would benefit their personal life a lot. But in the same time I, as a software vendor, need these corporations as my customers and I want to help them the best I can (to become better organizations). Andy’s presentation reminded me of what our mutual friend Wiktor was saying during our journey to Agile Eastern Europe in Kiev few months back: “if you cannot change your company, change your company”. Good memories from this trip... Right after Andy <strong>Sebastian Christow</strong> from the Ministry of Economy talked about practices you could call agile used on a daily (or weekly) basis in an environment as far from agility as you could get. Nice talk showing that “you can” even if the organization doesn’t let you. <img class="alignright" style="margin-left: 15px;margin-bottom: 15px;margin-top: 7px" title="Friends" src="http://farm9.staticflickr.com/8163/7323643076_21c0394060_n.jpg" alt="" width="320" height="213" />Almost at the end the Allegro team came in. <strong>Michał Rączka</strong> and <strong>Jakub Szczepanik</strong> talked about introducing Scrum in their organization, and those guys rocked. Really a good presentation, with visible amount of practice put into it. Michał, as a PMO manager, focused more on project management aspects of Scrum adoption and Jakub gave a few stories on the team level. Three points I did remember: first one was a story of a project sponsored by a member of the board who after not showing up for two sprint planning/reviews due to lack of time was faced by Michał with a choice of either closing a project (as clearly some other project was more important) or sticking to the rules. A brave decision of a PMO manager but it is courage that is one of the founding values of Scrum, isn it? And the board member finally truly commited. Another point was a general report of Allegro’s Scrum adoption based on valuing entrepreneurship. Any decision made by Product Owner should be rooted in entrepreneurship and they actually managed to get out of project scoring, artificial metrics, etc hell. Last but not least, I noticed that those guys are talking all the time about customer satisfaction, user satisfaction and market satisfaction. Those are the things that drive project decisions, be it starting a project, closing a project or defining goals. Not a moment they talked about shareholders, stock value, reports, etc. And, even though I strongly believe that shareholder satisfaction is important, I believe it is an effect, not a driver for running a company. Finally the conference was getting to its end. It finished with a panel discussion swiftly moderated by Bartosz Górczyński. He started by asking a profound (hence the name of the conference) question: “how about having a discussion on agility in business”. It was an interesting hour, even though some people started leaving trying to catch trains, planes, etc. The general summary was that the speakers represented widely understood e-business. How to use agile and lean in more traditional industries like energy, finance or insurance is not obvious. I have my own opinion on that, but I will leave it for another post.

In the meantime Besides presentations there have been quite a lot of talking around the venue. And honestly, that was the better part of this conference. As a general advice to anyone participating in a similar event, having participated in quite a few conferences this year, I really recommend using this time well to meet new people, listen, share ideas, listen, get linked in and listen. I slightly regret that the organizers didn’t think about any kind of a party in the evening, but even without that I have more new people in my address book that I would like to get back to than I will ever have time to get back to.

Recap Line up wise, it wasn’t the best conference I have attended this year, but it wasn’t the worst either. The talk of Allegro guys, Michał and Jakub, filled me up with a lot of positive energy, they easily won my personal best talk award, with Jurgen and Andy following close by. All three represented a strong, european level. In terms of networking it was probably my best event this year. Met loads of people, got loads of ideas. I have two blogposts to write, at least a dozen of followup calls to make. Finally, I think this is a kind of conference the community really needs. There’s lot of agile events around that mostly focus either on the level of a team or the technical issues of creating software. This one is an attempt to address a different group of people, in my personal opinion, a group of people that could have more impact on the industry than the development community so far. And this is something I am really looking forward to…

Photos used:
Audi S5 - http://i.ytimg.com/vi/3MiBj6ETZq4/0.jpg
Strange Filament - http://www.flickr.com/photos/jdn/2400098202/
Washington State Cage Fighting Championships - http://www.flickr.com/photos/kellbailey/3610880025/
Rest in Peace - http://www.flickr.com/photos/mooglet/5154087532/
With a little help from your friend ... - http://www.flickr.com/photos/jinterwas/7323643076/

You May Also Like

Super Confitura Man

How Super Confitura Man came to be :)

Recently at TouK we had a one-day hackathon. There was no main theme for it, you just could post a project idea, gather people around it and hack on that idea for a whole day - drinks and pizza included.

My main idea was to create something that could be fun to build and be useful somehow to others. I’d figured out that since Confitura was just around a corner I could make a game, that would be playable at TouK’s booth at the conference venue. This idea seemed good enough to attract Rafał Nowak @RNowak3 and Marcin Jasion @marcinjasion - two TouK employees, that with me formed a team for the hackathon.

Confitura 01

The initial plan was to develop a simple mario-style game, with preceduraly generated levels, random collectible items and enemies. One of the ideas was to introduce Confitura Man as the main character, but due to time constraints, this fall through. We’ve decided to just choose a random available sprite for a character - hence the onion man :)

Confitura 02

How the game is played?

Since we wanted to have a scoreboard and have unique users, we’ve printed out QR codes. A person that would like to play the game could pick up a QR code, show it against a camera attached to the play booth. The start page scanned the QR code and launched the game with username read from paper code.

The rest of the game was playable with gamepad or keyboard.

Confitura game screen

Technicalities

Writing a game takes a lot of time and effort. We wanted to deliver, so we’ve decided to spend some time in the days before the hackathon just to bootstrap the technology stack of our enterprise.

We’ve decided that the game would be written in some Javascript based engine, with Google Chrome as a web platform. There are a lot of HTML5 game engines - list of html5 game engines and you could easily create a game with each and every of them. We’ve decided to use Phaser IO which handles a lot of difficult, game-related stuff on its own. So, we didn’t have to worry about physics, loading and storing assets, animations, object collisions, controls input/output. Go see for yourself, it is really nice and easy to use.

Scoreboard would be a rip-off from JIRA Survivor with stats being served from some web server app. To make things harder, the backend server was written in Clojure. With no experience in that language in the team, it was a bit risky, but the tasks of the server were trivial, so if all that clojure effort failed, it could be rewritten in something we know.

Statistics

During the whole Confitura day there were 69 unique players (69 QR codes were used), and 1237 games were played. The final score looked like this:

  1. Barister Lingerie 158 - 1450 points
  2. Boilerdang Custardbath 386 - 1060 points
  3. Benadryl Clarytin 306 - 870 points

And the obligatory scoreboard screenshot:

Confitura 03

Obstacles

The game, being created in just one day, had to have problems :) It wasn’t play tested enough, there were some rough edges. During the day we had to make a few fixes:

  • the server did not respect the highest score by specific user, it was just overwritting a user’s score with it’s latest one,
  • there was one feature not supported on keyboard, that was available on gamepad - turbo button
  • server was opening a database connection each time it got a request, so after around 5 minutes it would exhaust open file limit for MongoDB (backend database), this was easily fixed - thou the fix is a bit hackish :)

These were easily identified and fixed. Unfortunately there were issues that we were unable to fix while the event was on:

  • google chrome kept asking for the permission to use webcam - this was very annoying, and all the info found on the web did not work - StackOverflow thread
  • it was hard to start the game with QR code - either the codes were too small, or the lighting around that area was inappropriate - I think this issue could be fixed by printing larger codes,

Technology evaluation

All in all we were pretty happy with the chosen stack. Phaser was easy to use and left us with just the fun parts of the game creation process. Finding the right graphics with appropriate licensing was rather hard. We didn’t have enough time to polish all the visual aspects of the game before Confitura.

Writing a server in clojure was the most challenging part, with all the new syntax and new libraries. There were tasks, trivial in java/scala, but hard in Clojure - at least for a whimpy beginners :) Nevertheless Clojure seems like a really handy tool and I’d like to dive deeper into its ecosystem.

Source code

All of the sources for the game can be found here TouK/confitura-man.

The repository is split into two parts:

  • game - HTML5 game
  • server - clojure based backend server

To run the server you need to have a local MongoDB installation. Than in server’s directory run: $ lein ring server-headless This will start a server on http://localhost:3000

To run the game you need to install dependencies with bower and than run $ grunt from game’s directory.

To launch the QR reading part of the game, you enter http://localhost:9000/start.html. After scanning the code you’ll be redirected to http://localhost:9000/index.html - and the game starts.

Conclusion

Summing up, it was a great experience creating the game. It was fun to watch people playing the game. And even with all those glitches and stupid graphics, there were people vigorously playing it, which was awesome.

Thanks to Rafał and Michał for great coding experience, and thanks to all the players of our stupid little game. If you’d like to ask me about anything - feel free to contact me by mail or twitter @zygm0nt

Recently at TouK we had a one-day hackathon. There was no main theme for it, you just could post a project idea, gather people around it and hack on that idea for a whole day - drinks and pizza included.

My main idea was to create something that could be fun to build and be useful somehow to others. I’d figured out that since Confitura was just around a corner I could make a game, that would be playable at TouK’s booth at the conference venue. This idea seemed good enough to attract >Conclusion

JBoss Envers and Spring transaction managers

I've stumbled upon a bug with my configuration for JBoss Envers today, despite having integration tests all over the application. I have to admit, it casted a dark shadow of doubt about the value of all the tests for a moment. I've been practicing TDD since 2005, and frankly speaking, I should have been smarter than that.

My fault was simple. I've started using Envers the right way, with exploratory tests and a prototype. Then I've deleted the prototype and created some integration tests using in-memory H2 that looked more or less like this example:

@Test
public void savingAndUpdatingPersonShouldCreateTwoHistoricalVersions() {
    //given
    Person person = createAndSavePerson();
    String oldFirstName = person.getFirstName();
    String newFirstName = oldFirstName + "NEW";

    //when
    updatePersonWithNewName(person, newFirstName);

    //then
    verifyTwoHistoricalVersionsWereSaved(oldFirstName, newFirstName);
}

private Person createAndSavePerson() {
    Transaction transaction = session.beginTransaction();
    Person person = PersonFactory.createPerson();
    session.save(person);
    transaction.commit();
    return person;
}    

private void updatePersonWithNewName(Person person, String newName) {
    Transaction transaction = session.beginTransaction();
    person.setFirstName(newName);
    session.update(person);
    transaction.commit();
}

private void verifyTwoHistoricalVersionsWereSaved(String oldFirstName, String newFirstName) {
    List<Object[]> personRevisions = getPersonRevisions();
    assertEquals(2, personRevisions.size());
    assertEquals(oldFirstName, ((Person)personRevisions.get(0)[0]).getFirstName());
    assertEquals(newFirstName, ((Person)personRevisions.get(1)[0]).getFirstName());
}

private List<Object[]> getPersonRevisions() {
    Transaction transaction = session.beginTransaction();
    AuditReader auditReader = AuditReaderFactory.get(session);
    List<Object[]> personRevisions = auditReader.createQuery()
            .forRevisionsOfEntity(Person.class, false, true)
            .getResultList();
    transaction.commit();
    return personRevisions;
}

Because Envers inserts audit data when the transaction is commited (in a new temporary session), I thought I have to create and commit the transaction manually. And that is true to some point.

My fault was that I didn't have an end-to-end integration/acceptance test, that would call to entry point of the application (in this case a service which is called by GWT via RPC), because then I'd notice, that the Spring @Transactional annotation, and calling transaction.commit() are two, very different things.

Spring @Transactional annotation will use a transaction manager configured for the application. Envers on the other hand is used by subscribing a listener to hibernate's SessionFactory like this:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" >        
...
 <property name="eventListeners">
     <map key-type="java.lang.String" value-type="org.hibernate.event.EventListeners">
         <entry key="post-insert" value-ref="auditEventListener"/>
         <entry key="post-update" value-ref="auditEventListener"/>
         <entry key="post-delete" value-ref="auditEventListener"/>
         <entry key="pre-collection-update" value-ref="auditEventListener"/>
         <entry key="pre-collection-remove" value-ref="auditEventListener"/>
         <entry key="post-collection-recreate" value-ref="auditEventListener"/>
     </map>
 </property>
</bean>

<bean id="auditEventListener" class="org.hibernate.envers.event.AuditEventListener" />

Envers creates and collects something called AuditWorkUnits whenever you update/delete/insert audited entities, but audit tables are not populated until something calls AuditProcess.beforeCompletion, which makes sense. If you are using org.hibernate.transaction.JDBCTransaction manually, this is called on commit() when notifying all subscribed javax.transaction.Synchronization objects (and enver's AuditProcess is one of them).

The problem was, that I used a wrong transaction manager.

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
    <property name="dataSource" ref="dataSource"/>
</bean>

This transaction manager doesn't know anything about hibernate and doesn't use org.hibernate.transaction.JDBCTransaction. While Synchronization is an interface from javax.transaction package, DataSourceTransactionManager doesn't use it (maybe because of simplicity, I didn't dig deep enough in org.springframework.jdbc.datasource), and thus Envers works fine except not pushing the data to the database.

Which is the whole point of using Envers.

Use right tools for the task, they say. The whole problem is solved by using a transaction manager that is well aware of hibernate underneath.

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" >
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

Lesson learned: always make sure your acceptance tests are testing the right thing. If there is a doubt about the value of your tests, you just don't have enough of them,