1

Why JAVA is still one of the best web platforms out there!

Today I held a talk at a small web platforms conference at the Freie Universität Berlin. The Topic was: “IS24 – We aim for quality, scalability and high performance. We go the Java way.”

Here’s the presentation:

The pro Java arguments I mentioned are somehow killer arguments for any SW product to use JAVA. What do you think?

  • Static Typing
    Java is strict about static typing. Therefore it often takes much longer to develop features (because code is much more verbose) but on the other hand refactorings are much easier (because IDEs can give lots of feedback). Even big teams with hundreds of developers can easily work on and evolve the same code. We believe that Applications that are written in JAVA are built to last.
    Another business critical aspect of systems is Data Quality. Static Typing supports developers and system engineers in getting a fairly high Data Quality.
  • Documentation and Community
    The history of JAVA is pretty old  and  has a long history. The documentation and the community around JAVA was great from the beginning. You find answers to almost all problems you find. Learning JAVA is pretty straight forward. Working with JAVA is pretty easy – you don‘t have to spend your time with experimenting and searching for solutions for problems nobody solved before.
  • Out of the box functionality and JSR
    The core functionality of the JDK is pretty comprehensive (Collection Framework, Concurrency, Data Types, DB Access, Internationalization, RMI, Graphics, Reflection, IO, Networking,, Security, XML, Data Processing, Math, etc…. In other languages it‘s 3rd party providers that deliver specific functionality. The JSR Process defines standard interfaces  3rd party providers can implement – so in most cases developers can interchange technologies without massivley refactor the whole system. JAVA is very helpful to find  and orchaestrate specific  functionality. It makes it much easier for multiple teams to work on the same software because it is standardized.
  • The JVM supports multiple languages
    Initially the JVM was designed to run only Java-written Applications. But as time went by more and more languages were adapted or designed to run on the java platform: Clojure, Groovy, Scala, Kotlin, JavaFX, JRuby, Jython…. Years ago we decided to go the Java + Oracle way, and with the broad Support of different languages within the same platform (JVM) we‘re now able to also use other languages, database technologies etc.  for specific applications (e.g. Not Java but Grails for Austria Platform, Not Oracle but MySQL for Baufinanzierung) while still being able to use existing libraries, services etc.
    The JVM gives us the highest possible flexibility  without the risk of Vendor Lock-Ins or Rewriting stuff for any new product.
  • Concurrency
    In the last years a lot of new Web-Technologies conquered the market. Most of them aim especially for developer productivity (easy to write (dynamic typing), easy to run (script based), web-centric (request – response), UI-supportive (Ajax Support…). Java / the JVM is designed for enterprise and data driven applications, but can also be used to develop web-applications . An important feature of Java is it‘s Concurrency-Model (with JEE even distributed in the cloud). This helps us to meet the ever rising high performance requirements and the massive loads. Btw. Even Twitter changed from Ruby to Java to use this killer feature.
  • Tooling
    The Java Community and also the Market of commercial and enterprise provides around Java is pretty big and developed a wide range of tools for developer productivity, quality, monitoring and profiling, documentation, analysis etc. In most cases there are both OpenSource and Commercial alternatives. We use: Sonar (Quality), Eclipse and IDEA (Java IDEs), Maven, Jenkins / TeamCity, etc. Maybe the massive amount of professional and mature tools developers and application managers can use to implement, build, analyse and run JAVA Applocations is one of the most important arguments pro Java.
  • Security
    Underlying the Java SE Platform is a dynamic, extensible security architecture, standards-based and interoperable. Security features — cryptography, authentication and authorization, public key infrastructure, and more — are built in. The Java security model is based on a customizable “sandbox” in which Java software programs can run safely, without potential risk to systems or users. Btw. The strong static data typing is a great security feature! No program is absolutely secure but we believe that the security package JAVA and Spring provide – especially for Web based applications – has the highest standard.
1

Doing Agile? Don’t doom up-front-planning! It’s Fun!

Often Agile Software Development is seen as a revolution – a big victory against conventional waterfall project management and organization set ups. And as a revolution the first answer agile has is avoiding everything that is somehow related to its old waterfall enemy.  I think this is a big misconception, and a massive risk for projects using this approach. I would even say that companies can lose great opportunities, when agile is only a synonym for avoidance.

My opinion:

  • Agile is not against Management and Leadership – it’s just about empowerment, self-organization and a slight shift from management to leadership
  • Agile is not against Project Management – it’s just about doing it in shorter cycles to fail fast and react (adapt) where necessary.
  • Agile is not against Focus and Discipline – it’s just about more focus and discipline on smaller subjects / targets.
  • Agile is not against Performance and Growth - it’s just about managing it in a different, a team oriented way
  • Agile is not against Up-Front-Planning – it’s just about doing it in a collaborative and creative way; it’s about focussing on product design and not work item management.

Especially the lack of the last item (Up-Front-Planning) often enough leads to mediocre products, less motivation and low innovative ernergy. What do you do before starting the actual implementation of your software product? Let me guess! Your product owner comes around the corner with a couple of user stories describing some of the obvious features the product should have. Some may say: Before writing user stories the product owner comes with an idea (you might call it a vision) to discuss it in a 2 hour kick-off workshop. Sorry if I am a bit sarcastic but this is just bullshit. Don’t fool yourself with phrases like “Oh, we just want to build our MVP and then we’ll see what’s next!” or “To be to concrete about the product means to have less freedom in design and features later on – because we have to stick to it”.

Let me start with the wording. We’re talking about a product vision as the starting point. Vision means that there is something visual, a concrete or imagined picture of the end product of a project or an initaive. A visual “thing” anybody involved can refer to, dream of, talk about and theoratically evolve. A one liner formulating the idea is not enough in my eyes because it’s too arbitrary. But as the conceptional phase is part of the up-front-planning excercise in waterfall projects agile organizations often enough try to avoid the whole thing. The result? Nobody working on the product has a concrete picture about what the result is all about. This on the other hand leads to “workers” each just stapling building blocks and not working on that epic, monumental cathedral…..! How motivational is this? And how much energy could be set free when transforming those workers into men building that great cathedral. Got me?

Staple blocks or building a cathedral?

I think that we should first differenciate between software and product design. The software is the medium (or material) the product is made of. The product on the other hand is made of functionality, features, interactions, visual design, service, support etc. And to develop great software that works as an effective medium for a product we have to have a clear vision of how the product should look like. This is the frame in which the software is build. In agile we build software without knowing the product. This makes no sense at all.

Doing some up-front-planning (up front design) is not only important as described above. It’s also lots of fun, when done in an agile fashion. Puh… What does it mean?

Okay, back to the situation described above: The product owner comes around the corner with a great idea stated in one or two sentences. In most cases this idea is directly translated into a implementation backlog containing user stories descibing features of the end product. At this point there is an alternative. Add user stories to the backlog that describe “features” or parts of a proper product design. As a team, brainstorm about how your vision will look like and plan an iteration for creating that vision.

A product vision could be

  • a paper prototype visualizing the user interface, interaction paths, and use cases.
  • a story board describing the usage of the product
  • a set of Personas and related use case diagrams
  • a Product Box with main features, some UI scribbles, system specifications etc. (hand made or even as a high end photoshop box)
  • a morphological analysis
  • or a combination.

There are so many cool creativity techniques and innovation games / tools – the toolbox is full. Just use it, experiment with a few and create a rock star product! The first step: When doing the next agile project, decide “up front” that your first sprint or two will be about designing the product together (product people, devs, qa, ux, designers etc.). The result of these sprints will be your guiding stars through the whole implementation. It’s easy, just decide to be creative and to have the end in mind. Remember: Agile is not against Up-Front-Planning, it’s about doing it in a collaborative and creative way.

As a motivator for this, see the video about IDEO, the great product design company from Palo Alto. This is Fun, isn’t it? I believe that software projects can be the same.

Find the cathedral you want to build, and stop stapling blocks the whole day!

 

 

0

A library of useful tools for Scum Masters and other agilists….

Over the time I collected a lot of material about agile and leadership. Most isn’t very useful but some diamonds are great. Mith the aim of letting it grow I present the current list of agile diamonds to you here….

Tools for retrospektives

Tools for Team Surveys

Tools for moderating big groups

Tools / Insights for agile managers

Video Material

 

1

7 Quality Principles we can learn from the big Tech Companies – Google, Facebook, Microsoft

Recently I was working with an Code Quality expert group to think about how to improve the code and system quality and the underlying mindset in our company. Knowing that we are doing quite well in terms of quality, we challenged the way we are doing it anyway. One step was to gather informations about how leading tech companies (Google, Faceboo,k and Microsoft) approach quality. Out of these findings we collected from several blogs, articles and interviews with (former) employees of these companies we extracted 7 principles all of these companies seem to follow.

First I want to present some of the informations we collected:

  • Google
    • all developers work on the same source depot and use the same infrastructure
    • every developer can and is invited to fix bugs within the whole code base
    • company wide coding styleguides for almost every language; complying with the standard is mandatory
    • code reviews prior to each check in
    • highest possible test coverage, fast feedback on failures, direct communication on failures
    • developer productivity team that implements and provides tools for developers (such as guideline checks, analytic applications…)
    • developers often / regularly change between teams
  • Facebook
    • dev + ops make more then 50% of the whole staff
    • new developers have to pass a boot-camp-training: fixing bugs, workshops with senior stuff, etc. minimum of 10% fail!
    • every developer has access to live databases and other systems and is therefore responsible for those
    • every developer can check in code into the whole system without formally consulting a manager
    • monthly cross team meetings about progress, quality reports etc. Owned by teams, not managers.
    • every developer can build and suggest new features and field-test them
    • mandatory reviews before each check-in
    • push-block tests
    • SVN blaming, publicity shaming
  • Microsoft
    • “try lots of things to improve quality! Keep doing what works, stop doing what doesn’t.”
    • mandatory reviews before each check-in
    • standardized review check lists
    • highest possible test coverage
    • active usage of code analytic tools
    • active usage of work tags within code: TODO, REVIEW, BUG, UNDONE etc.
    • no features without technical specification challenged by senior stuff
    • Test first!
    • team owns coding styleguides
    • continual refactoring (make small from big)
    • periodic reviews of existing and legacy code with debbuging tools.

At the bottom line, thee following 7 principles are the common fundamentals of world class IT organizations:

  1. Company-wide coding guidelines

  2. Mandatory code reviews prior each check-in

  3. No check-in without complying with the coding guidelines: Automated checks

  4. Shared source depots and infrastructure: every employee can see and modify code of everybody else

  5. High responsibility of developers / strong developer centered culture

  6. Extreme high test coverage. Test always first!

  7. Active usage of quality metrics – transparency and feedback.

Which priniples do you follow in your organization? Do you agree with Google & Co.?

0

7 aspects to evaluate the performance of agile managers

Recently I participated in a training for scrum masters and product owners (yippeah … I am a Certified Scrum Master and Product Owner now). The trainer underlined that agile does not question the role of managers – it is still important. But nothing was said about the role, the responsibilities of agile managers and leaders. Far from it, by pushing the scrum masters role as a collateral leader, the trainer somehow eroded the importance of any other leadership role. The trainer claimed that we need Scrum Masters because the backbone of any other leadership role is Command And Control and agile needs a different style of management and leadership – the Scrum Master. Okay, it was a Scrum Master training – though it’s somehow okay to push the scrum masters role. My opinion regarding this is different!

I think that having a hierarchy is still important in agile organizations. But it’s meaning is different and so is the role of managers, team leads etc. In agile organizations leaders have to understand that their role is neither to be the best developer, architect or whetever in place, nor to be the conventional Command And Control style manager. What else? In my eyes there at least 7 different aspects managers and leaders in agile settings should be evaluated by:

  1. Since we (agilists) believe that systems (teams, organizations) should manage themselves, managers are not managers anymore but more like System Architects and Designers: Leaders should be evaluated by their ability to design, improve and maintain systems that are able to be selfmanaged (Setting the right goals, align forces, find and provide the right communication channels).
  2. To be an Agile Manager is more like  being a Mentor or Coach. Leaders should be evaluated by their ability to help every individual to become better, reach goals, grow strengths, and contribute to the whole.
  3. As leaders we want people to be passionate about their profession (Development, Quality, Systems etc.), to have opinions, learn from and teach others etc. The job of a leader  is often enough driven by gut feelings. I think in a leadership position one should also develop passion, opinions – expertise: Leaders should be evaluated by their expertise regarding leadership (psychology, team building, coaching skills, communication, vision building, strategy development etc.) and Management (Management Tools, Creativity Tools, System Thinking, Agile, Lean, Project Management, etc.) and theier efforts to grow in these areas.
  4. As leaders we are not only responsible for our single team or project but also for improving the overall organization. Leaders should be evaluated by working together as a leadership team to improve the overall organization.
  5. As leaders we are more visible then others in an organization. That on the other hand means that we should be role models for every other employees. Leaders should be evaluated by how they develop their own character and personality (request Feedback, reflection, health, knowledge, lifestyle, work life balance, values).
  6. As team leaders we are responsible for building and growing poweful, strong teams. Teams that are good value. Leaders should be evaluated by how they find and foster the strengths of their employees and teams, how they help to compensate  weaknesses and how they jettison.
  7. As leaders in an organization weare multipliers for any floating energy (decision, values etc.). Leaders should be evaluated how they ensure that any decision, strategy, value can seamlessly float either from top to down or the other way round.

 

5

Effective Steps to reduce technical debt: An agile approach

Technical debt as a topic didn’t change or got any better through agile development methods and principles. It gained visibility at best. I would even say that due to faulty setups and implementations of agile methodologies which only focus on opportunistic short term growth the situation became even worst. Though preventive measures such as TDD, pair programming and continuous refactoring are widely accepted (especially in the agile world), there are no systematic approaches for sustainable implementations of bigger software systems but generic appeals and striking calls. For example the craftsmen manifesto claims to build software that not only functions but is also well-crafted – but it doesn’t go any deeper and concrete approaches remain rare.  Software without a heavy amount of technical debt is unusual – maybe just utopian.

Working with agile teams over some years I noticed different factors influencing the way teams tackle technical debt:

  • Developers know about technical debt and are aware that it is important to face this problem.
  • It’s not clear who is responsible for the reduction of technical debt: the team, IT leads, product owner, or the scum master?
  • It’s difficult to plan the work and define a strategy to reduce technical debt because it is not not a part of the regular development process which mainly focuses on implementing features.
  • Product Owner often doesn’t understand the need and benefits of reducing technical debt and don’t consider or allow technical projects / stories in their backlog and release plan.
  • Problems and goals regarding technical debt are neither structured nor documented. At best the things to do are quite clear among team members and partly exist in fragmented documentations. But it could also be worst case that topic owners already left the team or company and took all their knowledge and expertise with them out of the door.

Without considering every of those points, my current team and I tried to find a pragmatic approach that allows us to understand and reduce the existing debt in an agile way (iterative, prioritized, focused). The approach should be integrated seamlessly in the development process (which is Kanban).

At the end of the day the team itself is doing tasks of a Product Owner – but for a technical backlog.

1st Step: Involve the Product Owner and “promote” him to be the sponsor of technical debt reduction.

The first important step in such a process is often to raise the technical awareness of the person who is responsible for the product. This guy should be the person who is talking about technical sustainability and quality on the front lines. Teams are lucky when already working with a product owner or manager who understands the life cycle of software systems – how software evolves – and thereby the impact of technical debt. In this situation it’s all about bringing the topics and to-do’s on the table and helping to prioritize them. For teams without this kind of a product owner this could really be a show stopper. Discussing the responsibility for the overall product including the quality and stability of underlying software systems like a mantra does not help much. The team should remember the product owner that he is part of the team: his pain is the pain of the team and other way round. He is not the customer, payer or employer of the team but more a SME (subject matter expert) and manager / analyst of product requirements from different stakeholders.

As a team give your product owner the guarantee that growth of the product will stay the most important part – but not just in a short team (Performance) but also in a long term (Health) manner. Depending on how active the product owner is integrated into the development process it can be helpful to present different options of how to reduce technical debt to him and involve him in discussion to find the best approaches.

For most product owners this situation will be quite common since they do the same all the time with their stakeholders: promote and inspire, explain and legitimate about agile, strengthen the WE… This shared challenge could be something like the carrier energy also for the establishment of technical debt reduction.

2nd Step: Inventory and structure known technical debt

Having convinced the product owner it is time to collect and inventory known technical problems and map them on a structure that visualizes the system and project landscape.

Attention: It is not about completely understanding all topics. It is about finding a proper structure, identifying the most important issues and mapping those onto the structure. It’s about extracting knowledge about the systems from the heads to develop a common picture of existing technical problems.

Therefore we wrote the names / identifiers of all applications and modules we own on cards. These cards we pinned on a whiteboard. In the next step we extracted to-do’s (to solve existing problems) from all documentation media we use (wiki, jira, confluence, code documentation, paper), wrote them on post-its and stuck them  next to the application name it belongs to.

This board was accessible to all team members over a period of some days. Every team member was responsible to complete, restructure, and correct the board during this period so that we could go on with a round portfolio of the existing debt in our systems.

3rd Step: Agile prioritization and estimation of the work

Having collected and understood the work to reduce the technical debt within our systems we now needed a baseline for defining a good strategy – a repayment plan. Therefore we need numbers: Costs and benefits. However, we know that it is almost impossible to come up with good numbers regarding these metrics in IT projects. Also quality metrics such as cycloramic complexity, code coverage or dependency depths are not really useful because those are used for preventive quality assurance regarding the code and not the whole system.

We moved one step back and asked ourselves what we actually want to achieve: It is not our goal to generate numbers for external use or to legitimate our work on technical debt but to find good hints for defining a strategy to reduce or even remove the existing debt in an effective way. All team members should understand what they are talking about, the reasons why A comes first and B second … Therefore it’s not important to find concrete numbers but a feeling about the relative sizes of all work items.

We established two abstract units that are somehow semantically based on concrete dimensions:

  • On Y axis: TechDollar for the size of repayment for each item, which is in sum the gross amount of debt we have (1, 5, 20, 50, 200). This number doesn’t relate to the real costs or benefits, it is just an abstract number that allows us to compare items with each other and to generate a feeling about how big the technical debt is.
  • On the X axis: Animal Sizes (later mapped to story points) for the size / effort of each item. (ant = 1, hamster = 3, dog = 8, donkey = 13, elefant = 20). Again this number does not relate to any real number but allows us to compare items with each other without handling all the complexity behind each item.

For not mixing up discussion about effort and benefit we first ordered the items based on the y axis using tech dollar. Therefore we compared items with each other and asked questions like “Compared to item X how much of your pain would be gone after finishing item Y? This was also good for clarifying questions to understand the context of each item.

In the second step we distributed the items of each row (benefit) among the animal sizes. “How big is item X compared to Y? How long does it take? How complex is it? How uncertain is the field?…”

At the end of this exercise we had a matrix with ToDos, i.e. technical stories, that are understood by each team member. The positioning in the matrix gives us good hints to develop a strategy for the reduction of technical debt in the next step.

 

4th Step: Analysis of the data and development of the right strategy.

First we created stories marked as “TechnicalDebtItems” in JIRA for each task we defined. For bringing those items into a prioritized order and for drawing the right conclusions, we created a chart to visualize how the efforts relate to the payment and vise versa. This is the result:

The Y-axis shows the gross debt. The red line visualizes the amount of repayment distributed over the effort. The distribution of efforts on the X-axis on the other hand results from the sum of effort / story points per point category. However, this is only one option for a valid and effective repayment plan. But it makes one thing quite clear: The major amount of the perceived debt can be terminated by only a small effort. This knowledge leads to more focus and also motivation because before, without any insights, the team only saw the big blockers and the high amount of different tasks without any order or prioritization. Now we found a way, to focus on each next step without losing the whole thing out of focus.

The visualization of the debt and the finding of a possible repayment plan – even if this was created based on abstract numbers describing just the gut feeling of the team – the team now can focus on the most important steps. An important side effect: This overview is also a great tool for working with the product owner and other stakeholders because it gives him a good transparency regarding technical debt.

5th Step: Integration into the existing development process.

The inventory and interpretation of the existing technical debt are only small steps within the whole process. The longest run the team must go is to actually work on the items, reduce the debt and transform a buggy system into a sustainable, solid platform. This requires a lot of discipline and the ability to achieve consensus among the team and the product owner.

In addition to the visualizations on the team boards regarding the feature development process we now have a debt burndown which show the payment over time (calendar weeks). The team and the product also agreed on including bigger technical stories (> 3 points) into the feature planning and development process.

Smaller stories (1-3 points) will be done spontaneously by the developers using their 20% tech and innovation time.

The defined portfolio of technical stories is not static. Developing new stuff always means new debt. Working with legacy code often results in finding code that is far from being structured well… The team agreed on collecting such things on a wiki page when it’s not a bug or critical blocker. Collected items will be reviewed in a quarterly review and if necessary added to the gross debt.  Finding and discussing improvements to the process will be part of regular retrospectives the team holds every other week. Latest in the quarterly review the process and results will be inspected in detail by the team.

Conclusion

Technical debt is normal and part of every software project – even if preventive measurements became quite common lately through agile. It’s worth to work on the debt in a structured way. Understand where the problems are, understand the benefits and costs and analyze the data you have. Like the product owner for features the team is responsible to make the debt transparent and legitimize the work to reduce this debt. Who if not the developers themselves can do this?

 

0

Effektive Schritte zur Reduktion technischer Schulden: Ein agiler Ansatz

Das Thema technische Schuld hat sich durch agile Prinzipien und Entwicklungsmethoden nicht positiv verändert – es ist allenfalls sichtbarer geworden. Ich würde sogar soweit gehen zu sagen, dass durch fehlerhafte Implementierungen agiler Methoden, die ausschließlich die opportune Entwicklung kurzfristig wirkender Features im Fokus haben, die Situation schlimmer geworden ist. Präventive Maßnahmen wie TDD , Pair Programming und kontinuierliches Refactoring sind zwar (zumindest in der agilen Landschaft) gut angenommen und gelebt, dennoch gibt es keine allgemein akzeptierten Ansätze zur nachhaltigen Entwicklung großer Softwaresysteme, die über plakative Aussagen und generische Appelle hinausgehen. So fordert beispielsweise das Craftsmenship-Manifesto nicht nur funktionierende sondern auch sehr gut entwickelte Software zu liefern; tiefer geht es dann aber nicht und auf Antworten oder gut adaptierbare Erfahrungen bleiben Mangelware . Und so ist  Software ohne einen größeren Berg technischer Schulden selten aufzufinden – vielleicht sogar utopisch.

In der Arbeit mit agilen Teams beobachte ich bezogen auf den Umgang mit eben dieser technischen Schuld einige Aspekte bzw. Einflussfaktoren:

  • Es gibt ein recht hohes Bewusstsein über die Existenz der Schulden und die Notwendigkeit diese zu reduzieren.
  • Wenigen  ist wirklich klar wer die eigentliche Verantwortung zur Reduktion der Schulden trägt – das Team, die IT Führungskräfte, der Produkt Owner, vielleicht sogar der Scrum Master?
  •  Es fällt schwer die Arbeit zur Reduktion der technischen Schulden zu planen und eine Strategie zu definieren. Hier sehe ich vor allem den Grund darin, dass technische Aufgaben nicht in den definierten und gelebten agilen Entwicklungsprozess einfließen und damit zum Randthema werden
  • Product Owner oder Produktmanager verstehen den Benefit und damit die Notwendigkeit zur Behebung und Reduktion der technischen Schulden nicht und wehren sich daher gegen eine Berücksichtigung dieses Aspekts in der Planung von Release- und Produktroadmaps.
  • Die Themen und konkreten Ziele sind nicht dokumentiert und ausgearbeitet, sondern liegen bestenfalls fragmentiert in individuellen Dokumentationen, eher aber in den Köpfen der Beteiligten vor. Im schlechtesten Fall, haben die Treiber bestimmter Themen das Team oder gar das Untenehmen bereits verlassen.

Ohne jedes einzelne der oben genannten Themen komplett berücksichtigen zu können, habe ich mit meinem derzeitgen Team versucht einen pragmatischen Ansatz zu finden, der eine agile (iterative, priorisierte, fokussierte) Reduktion der vorhandenen Schulden ermöglicht und sich nahtlos in den bestehenden Entwicklungsprozess (Kanban) integrieren lässt. Letztendlich übernimmt an dieser Stelle das Team die Aufgaben eines Product Owner für die eigene Sache. Der eigentliche Product Owner durchläuft  für die in seinem Fokus stehenden Produkt- Features ganz ähnliche Arbeitsprozesse.

1. Schritt: Product Owner involvieren und zum Supporter für die Sache machen

Der erste Schritt in einem solchen Prozess ist oft die Sensibilisierung des Produktverantwortlichen für das Thema „Technische Nachhaltigkeit“. Glück für alle Teams, die bereits einen technikaffinen und im agilen Sinne differenzierteren Product Owner haben – hier genügt es nämlich oft die Themen zu nennen und zu helfen die richtige Priorisierung zu finden. Für alle anderen kann sich hier ein echter Show-Stopper verbergen. Ein gebetsmühlenartiger Appell an die Gesamtproduktverantwortung und der damit einhergehenden Fokussierung auch auf das Thema Nachhaltigkeit und Stabilität ist hier sicher oft nicht die richtige Wahl. Das Team sollte hier versuchen an das „WIR“ zu erinnern, dafür also dass er nicht der Auftraggeber für das Team ist, sondern selbst Teil des Teams und in dieser Rolle eher als SME (Subject Matter Expert) und / oder Verwalter und Analyst der Produktanforderungen verschiedener Produkt-Stakeholder und Auftraggeber agiert. Es kann sicher auch hilfreich sein, ihm die Sicherheit zu geben, dass die Generierung von Nutzen und das stetige Wachstum des Produkts oberste Priorität bleiben – nur eben sowohl im kurzfristigen (Performance) als auch im langfristigen (Health) Sinne.

Je nachdem wie stark der Produkt Owner in den Entwicklungsprozess eingebunden ist, kann es durchaus sinnvoll sein, ihm verschiedenen Optionen zur Bearbeitung der technischen Schulden zu skizzieren und ihn in die Diskussion über die besten Ansätze einzubeziehen.

Den meisten Product Ownern wird diese Situation sehr bekannt vorkommen, da sie mit ihren Stakeholdern den ganzen Tag nichts anderes machen: Für Themen werben und begeistern, die agile Herangehensweise rechtfertigen und versuchen jeden Anforderer näher an das Umsetzungsteam zu holen und damit das WIR zu stärken (bzw. zu formen). Diese gemeinsame Herausforderung kann durchaus die geeignete Trägerenergie für das Vorhaben sein.

2. Schritt: Inventarisieren und strukturieren der bekannten Themen

Sobald ein (wenn auch verhaltenes) „OK“ vom Product Owner eingeholt werden konnte geht es darum die technischen Themen und Probleme zu inventarisieren und in eine die individuelle System- und Projektlandschaft abbildende Struktur zu überführen.

Wichtig: In diesem Schritt kommt es nicht so sehr auf die komplette Durchdringung aller Themen und auch nicht auf 100%ige Vollständigkeit an. Vielmehr geht es darum die richtige Struktur zu finden, die wichtigsten Themen zu identifizieren und in diese Struktur zu überführen. Vor allem geht es darum die Themen aus den Köpfen zu holen und ein gemeinsames Bild der vorhandenen technischen Probleme zu entwickeln.

Wir haben dafür die Namen sämtlicher Applikationen  (neue als auch zu betreuende) auf Moderationskarten geschrieben untereinander auf ein  Whiteboard gepappt. Im nächsten Schritt haben wir aus sämtlichen Dokumentationen (alte Spezifikationen, Wikis, JIRA, Code-Dokumentation) bekannte ToDos  zusammengetragen, auf Post-Its übertragen und neben die betroffenene Applikation angebracht.

Dieses Board stand gut sichtbar für mehrere Tage im Teambereich und jedes einzelne Teammitglied hatte die Aufgabe das Board selbständig zu vervollständigen (neue To-Dos, Ändern der Beschreibungen, Umstrukturieren etc.) so dass wir mit einem möglichst vollständigen Portfolio der existierenden technischen Schuld in den nächsten Schritt gehen konnten.

3. Schritt: Agiles priorisieren und schätzen der Arbeitspakete

Nachdem alle Themen aufgenommen, weitgehend verstanden und strukturiert vorliegen, ist es wichtig die einzelnen Tasks untereinander zu priorisieren. Dazu werden Zahlen benötigt: Ertrag und Kosten. Allerdings lassen sich diese Werte bekanntermaßen für IT Projekte bzw. Aufgaben nur sehr schwer oder gar nicht ermitteln. Auch Qualitätsmetriken wie die zyklomatische Komplexität, Testabdeckung oder Abhängigkeitstiefen sind nur bedingt nutzbar, da prinzipiell für die präventive Qualitätssicherung gedacht wir uns aber über bereits vorhandene Schulden unterhalten.

Wir sind einen Schritt zurückgegangen und haben uns gefragt, was wir eigentlich erreichen wollen: Es geht primär gar nicht darum nach außen bestimmte Aufwände und Kosten sichtbar zu machen oder die Umsetzungsdauer genau zu bestimmen. Da wir uns einig darüber waren, dass alle ermittelten und nun durch Post-It-Notes repräsentierte To-Dos wichtig und relevant waren, brauchten wir nur noch geeignete Maßzahlen, um die ToDos in eine sinnvolle Reihenfolge zu bringen. Es geht also um den Vergleich entlang zweier Dimensionen (Nutzen/Kosten), die alle Beteiligten verstehen und die die einzelnen Aufgaben / Themen untereiander vergleichbar machen.

Wir haben eigene Einheiten gebildet, die an die Semantik der realen Dimensionen angelegt waren und uns die Möglichkeiten agiler Schätzmethoden nutzbar machten.

Auf der X-Achse haben wir den Aufwand anhand von Tierbildern (Ameise, Hamster, Hund, Esel, Elefant) abgebildet. Wir haben uns im ersten Schritt gegen die Verwendung von Story-Points geeinigt. Diese nutzen wir, um Feature-Stories zu schätzen. Aufgaben zur Abarbeitung technischer Schuld sind aber oft nur bedingt mit reinen Feature-Stories vergleichbar. Story Points hätten hier vermutlich zu unnötigen Diskussionen und Verständniskonflikten geführt.

Auf der Y Achse zeichneten wir den Nutzen der Arbeitspakete ab. In diesem Fall haben wir uns für eine eigene Währung (Tech-Dollars) entschieden. Wir wollten eine imaginäre Größe haben, die ausdrückt welchen relativen Anteil der Gesamtschuld wir durch die Beseitigung eines Themas tilgen können. Um hier nicht über Kleinstunterschiede diskutieren zu müssen haben wir – angelehnt an die Fibonacci-Reihe, die auch für die Schätzung von Story Points verwendet wird – die Beträge 1, 5, 20, 50 und 200 verwendet.

Um nicht beide Dimensionen in der Diskussion zu vermischen haben wir Aufgabe für Aufgabe zunächst die Position auf der Y-Achse bestimmt und noch offene Fragen über Kontext und Scope der Items geklärt.

Im letzten Schritt haben wir dann für jede einzelne Zeile die Aufwände (in Größe) geschätzt – wobei der Fokus auf den relativen Unterschieden und nicht auf die konkreten Werte jedes einzelnen Items lag. Die Aufwände (vorliegend in Tier-Größen) haben wir – allein für die Berechenbarkeit letztendlich dann wieder auf Zahlen heruntergebrochen (1-3-8-13-20).

Am Ende hatten wir dann eine Matrix mit von jedem Teammitglied verstandenen ToDos zur Abarbeitung der technischen Schuld. Die Positionierung in der Matrix gibt uns im nächsten Schritt wertvolle Hinweise für eine effektive Strategie.

4. Schritt: Analyse der vorliegenden Daten und ableiten der richtigen Strategie

Zunächst haben wir jedes einzelne Item als Story in unser Trackingsystem JIRA überführt und als „Technical-Debt-Item“ markiert. Um eine sinnvolle Ordnung in die über 30 neuen Stories zu bringen und die  richtigen Schlüsse hinsichtlich einer Strategie zu ziehen, haben wir ein Diagramm erstellt, welches den Gesamtaufwand und die Tilgung der Schulden zueinander in Bezug setzt. Daraus ist folgende Übersicht entstanden:

Auf der Y-Achse ist die Gesamtschuld dargestellt. Die Rote Linie zeigt die Größer der Tilgung verteilt über den Aufwand. Die Verteilung der Aufwände auf der X-Achse ergibt sich wiederum aus der Summe der Aufwandspunkte pro Punkt-Kategorie. Dies ist zwar nur eine von vielen möglichen Tilgungsplänen, aber er macht auf jeden Fall eines deutlich: Die Masse der wahrgenommen Schuld lässt sich durch relativ wenig Aufwand beheben. Dieses Wissen führt im Team zu mehr Fokus, da ohne diese Einschätzung nur zwei Aspekte tatsächlich bedacht worden sind: 1. Die große und unklare Menge der ToDos und 2. die größe und Unbezwingbarkeit einzelner ToDos. Jetzt haben wir eine Möglichkeit geschaffen, dass jeder genau die nächsten Schritte im Fokus hat und dabei das Gesamtziel nicht aus den Augen verliert.

Die Visualisierung der Schulden und die Ableitung eines möglichen Tilgungsplans – auch wenn er nur anhand imaginärer, durch das Bauchgefühl bestimmten Wertgrößen erstellt wurde – gibt dem Team die Möglichkeit sich auf die wichtigen Aspekte zu konzentrieren und die Schuld Schritt für Schritt und vor allem zielgerichtet abzutragen. Ein wichtiger Nebeneffekt dabei ist: Die erstellte Übersicht ist auch ein Hilfsmittel zur Kommunikation mit dem Product Owner – ein Mittel, das ihn mit ins Boot holt indem er die Transparenz über Umfang und Relevanz der Themen erhält.

5. Schritt: Integration in den existierenden Entwicklungsprozess – die Schulden abbauen.

Die Inventarisierung und Interpretation der vorhandenen technischen Schulden ist letztendlich zwar ein wichtiger aber nur kleiner Schritt. Den längsten Weg muss das Team zurücklegen um die ermittelten Schulden dann auch tatsächlich abzubauen. Das erfordert Disziplin und oft (bezogen auf den ProductOwner) viel Konsensfähigkeit.

Neben den Visualisierungen für den eigentlichen Feature-Entwicklungsprozess (bei uns Kanban) haben wir eine weites Chart in unserem Team-Raum aufgehängt: Ein Burndown-Chart, welches die Abtragung der ermittelten Gesamtschulden über die Zeit (Einheit Kalenderwochen) darstellt. Mit dem Product Owner haben wir vereinbart, dass die größeren Technical-Debt-Stories ( > 3 Punkte) mit in den Featureplanungsprozess aufgenommen werden und damit den kompletten Workflow durchlaufen.

Die eher kleinen Stories (1-3 Punkte) werden durch die Entwickler spontan und ohne viel Planungs-Overhead weggeschafft. Für derartige Aufgaben steht jedem Entwicklerteam ein 20% Zeitpuffer zur Verfügung.

Da zu jeder Zeit neue Items entdeckt werden und zur ermittelten Gesamtschuld hinzukommen kommen können, verständigte das Team sich darauf diese Themen zunächst im Wiki zu sammeln, wenn sie nicht extrem wichtig sind – in solchen Fällen handelt es sich wohl eh wahrscheinlich um Bugs. Die gesammelten Items werden in einem Quartals-Review überprüft und wenn nötig auf die Restschuld addiert. Die dann entstandenen Tasks durchlaufen dann erneut die hier beschriebenen Schritte. Verbesserungen am Prozess werden wenn nötig in den 2-wöchigen Retrospektiven entschlossen. Mindestens aber zum genannten Quartals-Review werden wir den Prozess genau unter die Lupe nehmen und anpassen.

Fazit

Die Anhäufung technischer Schuld ist normal – auch wenn präventive Maßnahmen gerade durch agile Entwicklungsprozesse und –prinzipien dem Problem heute eine ganze Menge entgegenzusetzen haben. Dennoch lohnt es sich einen Schritt weiter zu gehen und nicht nur über die Schulden zu reden und sich der Unmöglichkeit der Abtragung machtlos gegenüber zu stellen. Genau wie der Product Owner für Features hat hier das Team eine Bring-Schuld. Aufgaben müssen strukturiert, analysiert und vor allem Transparent gemacht werden. Damit sinkt meiner Meinung nach auch die Hürde sich der Schuld dann tatsächlich auch anzunehmen.

Wie geht Ihr denn mit technischer Schuld um? Gibt es Erfahrungen mit anderen Ansätzen? Gern auch Feedback, falls jemand den hier beschriebenen Ansatz probiert hat.

13

9 Steps to integrate a remote HornetQ with Glassfish 3.1

I recently found myself browsing and searching the web for long hours just for finding an answer for an apparently simple configuration issue: How to configure Glassfish 3.1 to receive messages from and send messages to a standalone / remote instance of the HornetQ Messaging Platform. I didn’t find any tutorial, how-to, or any other useful resource that gave me the answers I needed. Everything was about how to embed an instance in Glassfish (running HornetQ within the Applicationserver) or how to configure JBoss + HornetQ. But nothing up to date about Glassfish as a client for a HornetQ standalone server…

At the end I scanned loads of different sources, modified what I found and tried all options since I found myself – some hours after midnight – sending and receiving simple Messages in Glassfish using a standalone HornetQ. Since there is no effective description about this simple task (at least nothing I found) – and I know that finding out by oneself is quite time consuming – I share the steps I went through to configure my situation.

Maybe you know better ways or have answers to my questions I will put at the end of this article. I really would appreciate any comments or hints….

Step 1: Adding libraries to your Glassfish installation.

After you installed Glassfish and HornetQ on your system(s), you need to copy a group of libraries to the lib folder of your Glassfish installation:

  • hornetq-core-client-2.2.7.Final.jar (Download)
  • hornetq-jms-client-2.2.7.Final.jar (Download)
  • hornetq-logging-2.2.7.Final.jar (Download)
  • netty-3.2.5.Final.jar (Download)

Don’t forget to restart your server afterwards.

Step 2: Deploy the HornetQ Resource Adapter as an application in Glassfish

First locate the file hornetq-ra.rar in the lib directory of your HornetQ installation. This file can be deployed in Glassfish directly using the Admin-Console (usually http://{glassfish-host}:4848). Open the Applications View and choose Deploy as the option. Now you can upload the file to deploy it as a connector application. The application should be listed in the Application View afterwards.

Step 3: Edit the Resource Adapter Configuration (ra.xml)

In order to communicate with a remote or standalone instance of HornetQ you need to modify the ra.xml in the directory of the delpoyed application:
{GLASSFISH_HOME}/domains/{domain_name}/applications/hornetq-ra/META-INF/ra.xml

You need to do several modifications:

First of all change the ConnectorClassName config property. By default this is is set to InVMConnectorFactory which just means that the client connects to an embedded HornetQ (running in the same virtual machine.


<config-property>
<description>
The transport type....
</description>
<config-property-name>ConnectorClassName</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>
org.hornetq.core.remoting.impl.netty.NettyConnectorFactory
</config-property-value>
</config-property>

The second modification regards the ConnectionParameter config property. Make sure to set the right host name or IP and the right port. Note that these parameters are set as a semicolon separated list of properties.


<config-property>
<description>The transport configuration.</description>
<config-property-name>ConnectionParameters</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<!-- Put your values here... -->
<config-property-value>host=127.0.0.1;port=5445</config-property-value>
</config-property>

If – and that should be the case – your Message Server is configured using a username and password for accessing a queue you also should set these credentials within the ra.xml file:


<config-property>
<description>The user name used to login to the JMS server</description>
<config-property-name>UserName</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>test</config-property-value>
</config-property>
<config-property>
<description>The password used to login to the JMS server</description>
<config-property-name>Password</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>test</config-property-value>
</config-property>

Now restart your Glassfish. The deployed resource adapter should use the modified settings now.

Step 4: Create a managed thread pool

The next steps are quite easy. Just open your shell and move to {GLASSFISH_HOME}/bin/. Note that you might be logged in as root or use sodu for the following commands.

To create a managed thread pool type into your shell:

user@computer:$ ./asadmin create-threadpool hrntq-ra-thread-pool

Choose the name (hrntq-ra-thread-pool) carefully because you will need it to connect several resources to each other.

Step 5: Create the managed resource adapter config

Next, create the managed resource adapter config. I am not sure how this differs from the ra.xml described earlier. But for me it doesn’t work to have just one of both configs…

user@computer:$ ./asadmin create-resource-adapter-config
--threadpoolid hrntq-ra-thread-pool --property "ConnectorClassName=org.hornetq.core.remoting.impl.
netty.NettyConnectorFactory:ConnectionParameters=host\\=127.0.0.1;
port\\=5445:UserName=test:Password=test" hornetq-ra

Whatsoever … You have to set the same properties as in ra.xml: The ConnectorClassName, the ConnectionParameters and the UserName and Password. With the threadpoolid option set to the name you used in Step 4 you tell this config that it should use your custom thread pool. Again, this Resource also needs to get a proper name.

Step 6: Create the Connector Pool

Now we create a ConnectorPool configured to use the HornetQ Resource Adapter. This provides the basis for creating multiple connection resources that can be injected into your managed JEE application.

user@computer:$ ./asadmin create-connector-connection-pool --raname hornetq-ra --connectiondefinition org.hornetq.ra.HornetQRAConnectionFactory --property UseTryLock=0:SessionDefaultType=
javax.jms.Queue:UserName=test:Password=test --transactionsupport XATransaction hornetq-ra-connection-pool

Step 7: Create the Connector Resource

user@computer:$ ./asadmin create-connector-resource --poolname hornetq-ra-connection-pool --description "HornetQ Connection Resource" hornetq-ra

This one can be injected into your application using the @Resource annotation – see Step 8 for an example.

Step 8: Create an EJB that sends Messages to the Queue

Finally I will give you an really simple example of how to use the configured Connection Resource within your managed JEE item. As mentioned before you just have to use the @Resource annotation and the name to link to the resource you configured in Step 6. I did not find out how to wrap a HornetQQueue into a configured and managed module. That’s why I instantiate it directly in the code below. But I’m sure that there must be ways to give the responsibility for this to the Appserver. However – the way showed here works!


/**
* Example EJB that connects to a HornetQQue named "testqueue"
* to send a TextMessage with a given String value.
*/
@Stateless
class SimpleMsgSender {
@Resource(mappedName="hornetq-ra")
private QueueConnectionFactory qcf;

public void send(String message) {
QueueConnection queueCon = null;
try {
queueCon = this.qcf.createQueueConnection("test","test");
QueueSession queueSession = queueCon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = new HornetQQueue("Requests");
QueueSender sender = queueSession.createSender(queue);
Message msg = queueSession.createTextMessage(message);
sender.send(msg);
} finally {
if (queueCon != null) {
queueCon.close();
}
}
}
}

Step 9: Create a MDB (MessageDrivenBean) to Receive Messages from the Queue

Sending messages is just one side of the medal. Receiving messages could be also done using managed resource as in Step 8. But then it’s the responsibility of the application to poll the queue. In JEE we have a way to describe a receiving component as a listener to a specific JMS queue. This is called a MessageDrivenBean. The problem here: You cannot use the configured resources described above. I didn’t find any way to connect these resources to a MessageDrivenBean. However, you can use the sun-ejb.xml in the applications META-INF direcotry to configure the MDB to connect to the remote HornetQ server…


<enterprise-beans>
<ejb>
<ejb-name>simpleReceiver</ejb-name>
<jndi-name>simpleReceiver</jndi-name>
<mdb-resource-adapter>
<resource-adapter-mid>hornetq-ra</resource-adapter-mid>
<activation-config>
<activation-config-property>
<activation-config-property-name>
destinationType
</activation-config-property-name>
<activation-config-property-value>
javax.jms.Queue
</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>
destination
</activation-config-property-name>
<activation-config-property-value>
/queue/Requests
</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>
ConnectorClassName
</activation-config-property-name>
<activation-config-property-value>
org.hornetq.core.remoting.impl.netty.NettyConnectorFactory
</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>
ConnectionParameters
</activation-config-property-name>
<activation-config-property-value>
host=127.0.0.1;port=5445
</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>
User
</activation-config-property-name>
<activation-config-property-value>
test
</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>
Password
</activation-config-property-name>
<activation-config-property-value>
test
</activation-config-property-value>
</activation-config-property>
</activation-config>
</mdb-resource-adapter>
</ejb>
...
</enterprise-beans>

With this configuration you can implement a lightweight MessageListener which will connect to the HornetQ just by using the @MessageDriven annotation and the mappedName attribute to link it to the XML configuration.


/**
* Example MessageDrivenBean that receives TextMessages
* and logs them.
*/
@MessageDriven(mappedName="simpleReceiver")
public class SimpleMessageReceiver implements MessageListener {

private static Logger logger = Logger.getLogger(SimpleMessageReceiver.class);

public void onMessage(Message message) {
TextMessage m = (TextMessage) message;
try {
String body = m.getText();
logger.info(body);
} catch (JMSException exc) {
logger.warning("Some Error in receiving JMS Message: " exc.getMessage());
}
}
}

As you see, it’s quite simple to configure a Glassfish to make your application a HornetQ client. But still, there are still open questions and some need for optimization. I am sure that I am not the only one out there who would appreciate any help from you, if you have any experience with this topic :) As said in my introduction, I will start the discussion by giving my questions:

  • How can I configure a managed queue resource to be linked to a HornetQQueue using the Resource Adapter?
  • How can I use the config resource in a MessageDrivenBean?
  • Are there any other pitfalls to consider when using HornetQ within a Glassfish App?

Cheers!

3

3 books every (not just junior) development manager should read before diving into practice

Often, especially when small companies grow, good developers get promoted into leadership or management positions: Scrum Master, Development Team Lead, Development Director, or even CTO. Back in 2007 I was in the same situation – barely graduated from university and all of a sudden assigned to manage and organize a development team of 8. Yes, and I must admit that I didn’t have any clue about what it really means to manage and lead a growing development team in a permanently changing organisation… I was a software developer with interests in agile methodologies and fairly high standards for myself and others, but I still was a software developer and had never learned about the responsibilities, pitfalls and mindset you need to know to succeed in a leadership position.

I learned a lot since that time and thankfully I had a great boss who was and still is a patient coach and mentor for me. I read loads of different books, joined leadership seminars and talked to dozens of other development managers, consultants and senior developers. All this learning effort and the chance of gaining management experience within a growing and healthy company combined with the strong support from top management formed a quite effective stage for my leadership take off.

However, in the beginning I surely made lots of failures and the company had to invest in myself by accepting imperfections an experienced and highly skilled manager probably wouldn’t have had. I lately read three different books: Peopleware, Management 3.0, and Growing Software. These books are great material to study for becoming an effective development manager in an agile and more and more chaotic world. I strongly would recommend these books to every management aspirant – not just in the area of software development. Back in 2007 I would have been really happy to know about these books…

I want to share this great and powerful introductions to development management with you:

1. Peopleware: Productive Projects and Teams


A real classic! In Peopleware, first published in 1987, Tom DeMarco describes what most post-conventional leadership theories and the whole agile community put onto company agendas today: Projects are all about people and the intrinsic motivational energy amplified in great team work! Projects succeed when you have yelled teams and they will fail with poor performers and lone warriors.

It’s an easy and short read but contains much more value then lots of todays books double the size of Peopleware. It’s structured into 5 parts all of which consist of several essay like texts with lots of practical hands-on suggestions described in a very funny way:

Managing the Human Resource

Almost all project failures are due to problems based on the working people, yet managers spend most of their time on technological issues because those are the issues they were trained to handle. But especially in the area of software development managers have to understand the nature of the human beeings, their working habits, motivation, and the factor of creativity. DeMarco suggests to give more room for errors, to respect and value both individual und team contributions without only focussing on technological yardsticks but also on sociological ones. One important aspect which is underlined is the use of the brain in the office. Lots of companies today and at that time focus too much on producing code. They forget about the creative thinking process before the implementation which is maybe even worth much more. Another important fact that has to be considered in development projects is that quality should equal productivity. And this is mostly about the people building the software. Nothing is more demotivating for software engineers then a management which prioritizes code / feature quantity over quality. A last finding of DeMarco regarding the Human Ressource factor is that project estimations should be done by the engineers themselfs and not the manager or some third party stakeholder. This is quite common today in agile companies that adopted planning or estimation poker.

The office environment

Investing in customized workplaces that enhance the productivity of intellectual and creative workers is one of the most important but least understood nuances of engineering management. Effective workplaces should allow privacy and calm focussed work as well as creative group sessions and discussions. It must be possible to support an enironment where it’s possible to concentrate and think while working (aka flow). In open office spaces with noisy telephones and moving colleagues this is definately not possible. When it comes to the measurement of productivity DeMarco points out that the gut feeling backed by some raw data is enough. There is no such thing as real productivity measurement in software development.

The Right people

Don’t let yourself influence by appearences to bring in talented people. It is important to support people in beeing themselves without playing any role: Thats the way you get the most out of your people. You should put as much effort in the hiring process as possible… The same counts for the process of developing people and their talents and create a sense of performance with a carreer path.

Growing productive teams

Real work gets done so much faster and better in great teams that effort should be put into setting an effective stage for them and help them grow together. Don’t try to standardize the behaviour and manner in which a team operates. Strinving for professional behaviour is just a sign of a insecure and immature management: The effectivity of teams is much more important. People have a natural tendency to learn to work well with each other if they have the same goals. We must try not to impede this phenomenon and instead make full use of jelled teams. “Teamicide” is supported by defensive management, bureaucracy, physical separation, fragmentation of peoples time, quality reductions, phony deadlines and clique control. It is not enough to avoid or reduce these habits… You as the manager have to support your team to find as much situations to succeed together as possible. Trust your team and every single team member! That’s the only way to succeed. The best bosses do what they are best at and leave what their workers are better at to them. Build an environment with these feautures: Cult of quality, lots of satisfying closure, sense of eliteness, support for heterogenity, preserve successful teams, provide strategical but no tactical direction. The elements that facilitate team formation and jelling may be counter intuitive, but if a manager is brave enough to provide the above mentioned environment, the team will reward him with success as they try to protect the enjoyable environment.

It’s supposed to be fun to work here

There is a need to constantly breathe life back into our work. We spend way too much of our lives working to find it a drag. Good managers try their best to sense who needs direction and who doesn’t, and provides direction for the former while only removing barriers for the latter. Don’t be discouraged that you are the only one trying to change something silly in your work environment. If it is obvious enough, you may be able to easily get your co-workers to join in your efforts.

2. Management 3.0


This master piece book from Jurgen Appelo just was released in the spring of 2011. I really enjoyed the read and I was quite glad that I finally found a book that takes management and leadership in an agile world into account. There are is way too much material about agile methodologies out there that don’t even mention the role of leadership in SCRUM, XP, KANBAN etc. Somehow you could get the impression that leadership and management isn’t needed anymore: The Scrum Master and the self-directed (sorry: self organized) team will handle it themselves. Wrong!!! And Jurgen Appelos book descibes the new role of management in a comprehensive and both theoretical and practical way. The book is organized in 6 themes and a introductorial part about chaos and systems theory and the description of the body of knowledge of software development.

Energize people

People are the most important parts of an organization and managers must do all they can to keep people active, motivated, and creative. Beware of the difference between making and keeping people active, motivated and creative! It’s the managers responsibility to support the information-innovation system: Spread information, support people to think and collaborate with each other to make innovation happen. Therefore managers have to understand the basic intrinsic desires of people by setting up regular one-on-ones, asking questions about the health of the organization, and supporting an open feedback culture.

Empower Teams

Teams can self-organize and this requires the right touch of empowerment, authorization, and trust. Managers have to understand that they should have a gardener mindset: Growing a team instead of building it! The right amount of clarity (about responsibilities and key decision areas) is critical for letting a group of grow into a self organized team.

Align Constraints

Self-Organization can lead to anything! It’s the manager who should protect the boundaries of a team by supporting people and resources and give people a clear purpose and defined goals. The manager should manage higher goals without using targets and extrinsic motivation. Instead he or she should build trust to accept common rules, increase the understanding of current situations, increase the social belonging accross the team, and address the need to improve oneself.

Develop Competence

It’s essential to understand that teams cannot achieve their goals if team members are not capable enough. It’s a critcial management task to develop the competence of each team member.

Grow Structure

Since most teams operate in the context of complex organizations it is important to consider structures that enhance communication and collaboration. This should be done by making peoples jobs dynamic and change work structures into a network like organization.

Improve Everything

To avoid failure and minimize team erosion as long as possible it’s important continously improve everything: people, teams and organizations by setting up regular learning and correction possibilities (e.g. retrospectives, kaizen, kaikaku). This should become the cultural baseline of the whole organization.

3. Growing Software


This 2009 publication of Louis Testa is unlike Peopleware and Management 3.0 not just about the management of humans and teams but also about the system and software development process. It is packed with useful hands on practices and strategies for almost everything that a typical manager encounters-from personnel decisions and relations with other departments to project estimates and software release strategies. This one is structured in 5 different parts from team management to the planning of the technological future.

Development Team

The book starts with a brief description of how to start your job. It doesn’t matter if you got promoted or changed to a new company – the introduced strategies of how to get on touch with the team, its issues and working habits are quite useful for both cases. The rest of this first part reads like a short summary about communication, team forming, hiring and development processes and effective working environments.

Product And Technology

This one starts with a description of how engineering and marketing teams should collaborate to define and conceptualize the product. It’s about different types of pre-releases, real world tests of products, the process of driving releases and how to kill projects. Testa continous by describing how to decide and use tools and methods for the engineering process. The assessement, documentation and orchestration of technologies forms the end of this section.

Outside Of Engineering

In this section Testa gives you guidelines for working with other parts of the company, the CEO and the customer. This is about the representation of your team in an outside world and the effective first hand understanding of the needs and requirements for the products you gonna build.

Making Work Flow: Projects, Process, And Quality

The project management section with hands-on strategies for how to plan, drive, track and exectute projects and processes. It’s completed by a brief description of the responsibilities and processes of a QA team within your oganization.

Planning The Future

The last section of Growing Software deals with the process of creating visions and making roadmap strategies to reach these visions.

2

A Scrum Masters Check List in German

Ich habe die Check-List von Michal James frei ins Deutsche übersetzt:

scrum_master_cheklist_deutsch

Pages ... 1 2