Skip to content

Feed aggregator

Why Slack Needs Sound Effects

Not to be left behind in hipster group chats, we migrated from Campfire to Slack a few months ago. It’s a slick, simple group chat system with a few elements of fun including custom emojis. We added Carl and Paul from Llamas with Hats to our custom set. We’ve also livened up things with a custom Hubot. Still there is one very sad missing feature Sound Effects.

A bit of research shows the team at slack has had sound effects on its backlog for a long time:

Slack custom emoji but for sound effects. Make it happen, guys. +@SlackHQ

— Nathan Peretic (@nathanperetic) April 5, 2014

@SlackHQ Can Slack do sounds like Campfire ("/play soundname")? Silly as they may be, it's an essential feature for team camaraderie.

— John Pray (@LouieGeetoo) February 27, 2014

We’re more than a year later and still no sign of adding sound effects. We really relied on getting audio notifications of broken builds. Now things slip by for a while as the email or text notifications get lost amid the clutter. And sometimes you just need to play PushIt while deploying. Please Slack get this done.

Categories: Blogs

Your feedback and a change to how we support you

Pivotal Tracker Blog - Mon, 06/01/2015 - 20:53

ProvideFeedbackYou may have noticed a Provide Feedback link in the Help & Updates menu, when you’re in a Tracker Project or Workspace.

We have big plans for that little widget. Though it’s currently intended only for feature requests and comments you don’t necessarily need an answer to, we’ll be improving it so you can find it anywhere, and use it for any reason you want to talk to us.

You will always be able to email tracker@pivotal.io with any questions or problems you might have, just as you can right now, to get the fastest possible reply from a Tracker team member.

Also, as part of us wanting to provide more timely and personal responses, we will be moving away from Community Support. We plan on closing the community within the next month or two—and after that it will redirect to our Help Center. We’ve really appreciated all your feedback and feature requests there over the years, and we will continue to use all that forum content as a reference for our road map, along with all the new feedback we’re getting in-app.

Some things aren’t changing: PRO plan customers will continue to receive priority support. For those on Startup or Free plans, feel free to use Provide Feedback with feature requests and comments and email us if you need help. We’ll get back to you as soon as we can—we just respond to PRO plan customers first.

We do our best to reply to urgent inquiries immediately or at least within a few business hours, and all other questions to tracker@pivotal.io within 1–2 business days. And though we try to check in more often, we’re here 8am–6pm PST (16:00–02:00 GMT) Monday through Friday (except U.S. holidays).

You can always find answers on our FAQ page, where your browser’s Find feature (CMD+F or CTRL+F in most) can take you right to the topic of interest. However, we have plans for that, too. We are busily working on a brand-new, fully searchable Knowledge Base that will be chock full of topics, tips, and articles to help you get started, or to dive deep with Tracker.

We hope all this provides you with a better Tracker experience and as always, however you’d like to get in touch, we’d love to hear from you.

The post Your feedback and a change to how we support you appeared first on Pivotal Tracker.

Categories: Companies

Purposeful Agile

Agile Thinks and Things - Oana Juncu - Mon, 06/01/2015 - 20:01
Amsterdam, Netherlands - Aerial ViewThrow a purpose in a middle of a crowd, it will start to self-organise.
Many self-organised entities like ... villages or cities have an "embedded purpose", not voluntarily shared out-loud or displayed in common places. Acting in a purpose driven way is less obvious for organisations. More a company grows, more dissolved into the Process  the original business purpose becomes.The enterprise gets diluted into the HOW-TO control complexity. Forget about the purpose. What products we build as a company and who are the services we provide for turns from core meaning to marketing fancies. That's business as usual. Until it's not anymore. Until crisis comes. Until customers change behaviour from consumers to service users. Until adapt to reality brings more value than creating processes to change reality. At this point in time, Agile becomes the new big thing everyone wants to have, do or be. Agile Transformations are ordered and Agile History is written. Here are the 3 levels of Agile Experience Awareness I've seen unfolded ."How-To Agile"1st Level of Agile AwarenessCompanies keep employees occupied on "How To" process compliance since modern industry was stated as such. Bigger the company more compliance with Some BIG Silver Bullet Method is required as unique meaning of business life. Naturally enough , we are doing what we know to do. Which means we apply the cognitive biases we live by to all new initiatives. So the first chapter of Agile experience in business was the "Agile Methodology implementation". Brought in by centralised processes  guru teams ( actually these people are very smart people, that are longing to really serve the enterprise by making use of their capacity of managing concepts ) ,  this Agile Implementation is :

  • focused exclusively of Software Development teams ,because Agile Manifesto talks about Software)
  • regulated by new practices to follow , new roles to define in HR catalogues, new processes to be compliant with, new checklists ( like Definition of Done, ain't it ?) , new matrix to build ( what project are eligible for Agile, what can we lead in the good old comfy way ?
  • a source of new bureaucracy overhead !!??


"Oh, my God , all this Agile stuff was ment to develop software leaner , faster , smarter", some of Agile initiators and sponsors said.  "What did we miss?" . The answer given to this question made organisations jump to the next level of awareness , the Agile Attitude.

Agile Attitude2nd level of Agile AwarenessAt the former level , organisations are busying to do Agile.  First insight at the 2nd level is "Making Agile is not the point, the point is to BE Agile".  A lot of activities become now focused on identifying on ... "how to be Agile". Hmmm...the focus is now of course more on "Values and Principles", and are still stuck in the "How To Focus Un Values". At this stage, of course valuable things happen: teams value more collaboration, communication, support and new ways of management have increased chances to be accepted and experimented. Managers eventually understand that teams' intellectual comfort is important. They may be ready to listen and adapt. Unfortunately , the "Agile Attitude" stage turns often into a huge source of misunderstanding and unhappiness. The "How To Agile" stage had the benefit rise curiosity and show that things can improve based on good practices, but bringing the Agile Transformation to the next level does not point how to organise to insure emergent practices. If management is willing to give teams "more space to express", which means workshops, improvement ideas, improved working space , improved quality time to produce better software, things are better , though not great.  Agile transformes in a huge "group therapy" to express everyone's  on-going issues. No matter how many retrospectives, baby-foots and playful inspirational activities are conducted, insatisfaction sticks in the air.  Actually, at this stage,  more creative activities are in place, more self-focused teams are : "We are not part of an enough Agile organisation  and we need to focus on ourselves to become an Agile organisation". More, other organisations and teams consider often  Stage 2 Agile organisations , as "strange hippies". Agile teams have no real quest and are not really understood . It's not a good place to be , but there is an answer. Therapist - we are at the therapy stage, aren't we?- say that having a purpose is the best anti depressor. Without a clear outcome as a token for collaboration, together with tolerance to error , massages, games and team building sessions won't make it. Time is high to reset Agile achievements around the very purpose of the organisation in place . As an organisation, what outcome we dream to achieve? 
Purposeful Agile3rd level of Agile AwarenessAt this stage , Agile is recognised as an enabler that facilitate answers to key questions like : "Who is this for?""What is this about?""What we are trying to achieve? How visible is it?" 
New management type voices agree that motivation is never an external factor. Managers are designer of systems that enable people to self motivate. And there is no better motivation factor that contributing to something concrete that will serve to someone that will recognise the utility of that service. That's why the ultimate key of successful Agile is not observing religiously the principles, though it's important, as applied "purposelessly"  may turn teams in strange aliens. The ultimate key of successful Agile  it's creating something aligned with a purpose by using the power of Agile Principles and practices. Everything can be adapted if there is a "What for" together for "Who is it for" To become a 3rd stage Agile organisation grasp the  answer to "What For" and use the Agile container to hold it .  Stating the purpose is not an obvious exercise, because usually ranch organisation sown bout feel authorised to express it. Some other organisation is in charge of. Eventually Senior Executives Committees might be in charge of  purpose definition, rules and regulations. Asking this question at all levels , all the time may be perceived as a waste of time.  Nevertheless, defining and detecting and saying aligned with a shared purpose is the best way to have highly engaged responsible teams. Therefore the fist activities of every Agile Happy Enterprise Transformation need to highlight the purpose : everybody is on boarded to explore Customer Behavior, best service to offer, what should be done next.  To do so,  practices from various horizons as  Product Management, Lean Startup, Storytelling, Kanban, Design Thinking, User Experience , Innovation Management and Palo Alto School, can be experienced to achieve the best results, company, teams and each individual will be proud of. 
Conclusion of Nothing and Thanks for  Everything 

Some time ago I had a chat with Sophie Freiermuth. She has met Diana Larsen and Vasco Duarte at a conference somewhere in the Frontierless Land of Agile and they were kind enough to mention me. "Oana has to write a book" , they said. If that will happen , it will tell the story of of turning the "Inside Out" in an "Outside In" company through Agile.  I'm already dedicating it to them. Here goes my purpose  :).

Related Posts 3 Steps To Design Systems of Tomorrow : From Resilient To AntiFragile
Agility Adoption Rather Than Agile At Scale


Categories: Blogs

I’ll Let My Code Fail, and Still Succeed With Message Queues

Derick Bailey - new ThoughtStream - Mon, 06/01/2015 - 19:51

In my upcoming book on RabbitMQ Layout (part of the RabbitMQ For Developers bundle, to be released on June 15th), I tell a story about a system that uses an analytics service. In this system, the analytics service isn’t reliable so the developers make a backup of all the events in a local database.

How to decide

 

As the story unfolds, the developers in the story make some significant changes to the way the application uses RabbitMQ. The results are significant, but the story only focuses on the RabbitMQ side of things and leaves a lot of potential questions open for the database side of the system, where events are stored as a backup. 

I chose not to elaborate on that side of the system in the book, because it didn’t fit. It wasn’t the right context, it would have added too much length to the chapter, and frankly, I didn’t have a complete answer for the problem when I wrote the story. But I think I have an answer, now, and I want to share my thoughts on the potential solution.

Names Have Been Changed To Protect … Me

The story that I tell in the book is based in part on my own experiences in building SignalLeaf and using RabbitMQ to send event data over to Keen.io. While Keen has never been unstable like the analytics service in my story, code has been broken and other services have been down.

Rmq layout small

 A few weeks ago, for example, my RabbitMQ instance became unresponsive. I use shared RabbitMQ hosting with CloudAMQP, and another application on the same physical servers ate all available disk space. I created a new instance on a new cluster and everything started working again. But if I didn’t have that backup database of event entries, as mentioned in the story in my book, I would have lost all the data during the downtime.

Then, this last weekend I updated some SignalLeaf code and mis-configured my exchange and queue bindings in RabbitMQ. After deploying, my code was sending messages to RabbitMQ with a routing key that was not handled. The messages were being lost, and nothing was being published to Keen.io, because of this. I fixed the configuration, but not before 24 hours of analytics data had been missed. Again, the database of event data means I haven’t completely lost all the data. 

Having the database backup for the events was incredibly important in these cases. But even with the database, I have a problem with the way my code is setup and the data is stored. 

The Database Event Design Problem

In the book, I talk about having the database backup for the same kinds of reasons that I point out above. I also talk about having a nightly process that checks for events that haven’t been published.

Long timeline small

In the real world, I have my code for SignalLeaf set up to create a single database record for each event. Along with the event data, I include a “status” field: processed or unprocessed. When a request is made for a podcast episode, a new database entry is made with a status of “unprocessed”. Then a message is sent across RabbitMQ. The code on the other side publishes the event to Keen.io and updates the database entry to be “processed”.

There are several problems with this design.

  • Too many network calls from web server
  • Errors unrelated to file download, prevent file download
  • Duplicate messages may occur

To start, there are too many network calls made from the web server – one for the database and one for RabbitMQ. A podcast listener wanted an episode, and I’m slowing them down with more network calls than I should be using. The extra latency makes it take longer to get the episode to them.

An error writing to the database or RabbitMQ, from the web server, means the process stops and the file is not sent to the user. Why should a database or RabbitMQ failure prevent the file from downloading? These things shouldn’t be tied together so tightly.

If the code behind RabbitMQ works, the event is published to keen. But if the database update fails after that, I won’t know that the keen.io call worked. Any code that looks for “unprocessed” entries could re-process an event, duplicating an entry in keen.io. Multiply this by a few thousand, and suddenly the stats in keen are very wrong.

So.. how do we fix this?

In the book, the developers alleviate these problems by separating the database and analytics service calls. In the real world, I wasn’t sure how I could make this work. But, thanks to the interviews for the RabbitMQ For Developers bundle, I have a better understanding of the situation and solution.

Allow The Code To Fail

The first thing I’m going to do, is not have a database call in the web server code for the event entry. Rather, I will send a single message through RabbitMQ and have multiple routes and queues: one for the database, one for publishing to keen.io. Each queue will have purpose-specific code that does tie the database to keen.io. 

Eliminating the database call from the web server will speed up the response to the HTTP request for the file. It will also allow the database and keen.io calls to fail or succeed independently of each other. This is the “let it fail” mentality that Aria Stewart talks about in the “Design For Failure” interview, in the RMQ for Devs bundle.

Aria stewart

I can have the database call fail, and I don’t care. I can have the keen.io call fail, and I don’t care. I’ll ‘nack’ the messages and put them back on the queue. They’ll be picked up and processed later, when the network hiccup or bad code or whatever, is resolved.

Now for the other end of code, after the event is published to keen.io.

Don’t Update Database Records

Once the code has published the event to keen, I’ll send a “success!” message through RabbitMQ. That message will get routed to the code that writes to the database again. But, there’s a potential problem here. If the record for the original “unprocessed” status has not been added to the database yet, the message to update that record to “processed” will fail.

If there’s no record, there isn’t anything to update. So… how do I fix that? Don’t try to update any records. Just write new records. This is something I picked up in my interview with Anders Ljusberg, where we talked about Event Sourcing in relation to CQRS. 

Anders ljusberg

Event Sourcing is facilitated by a write only data model that is a collection of state changes for a given entity or data object. There’s more to it than this, but that is the part I care about right now. Instead of trying to update a record that might not exist, then, I’m going to write a new record with the “processed” status. If the “unprocessed” record doesn’t exist yet, I don’t care. It will show up eventually, when that message is handled by my queue handling code.

With that done, I can have a process check for events that have an “unprocessed” record, but no “processed” record associated. If these records are older than some time frame (1 day maybe?) I’ll re-process them, knowing they won’t be duplicates.

Tighten Up That Workflow

The solution I just outlined seems pretty solid off-hand. It combines a few things that I learned from the interviews I’ve done for the RabbitMQ For Developers bundle, and puts them to good use. I expect there to be some edge cases and potential issues in implementing this, though. I haven’t yet worked through the real code to make this happen, so there’s bound to be some bumps along the way.

One of the potential bumps I see already, is having a larger workflow coded in to the details. This is something that I fight against in my code architecture already and I can see it happening in this situation. Fortunately, I have yet another interview from which I can draw a solution. In my interview with Jimmy Bogard, we talk about “Sagas” and workflow. 

Jimmy bogard

The idea here, is to code a higher level workflow management object – one that knows when the final state of things has been reached. I think it’s possible to overwhelm my current system with this, since I deal with thousands of requests per minute… but it will be interesting to try this and see what happens.

 

Want To Learn More From These Interviews?

I’ve learned far more from the interviews that I’ve done for this RabbitMQ For Developers bundle, than I ever expected. There’s a wealth of knowledge in these discussions, just waiting to be unleashed upon the world and I’m already taking advantage of it in my daily development!

Pick up your copy of The RabbitMQ For Developers bundle, and get all of these interviews, 12 screencasts, an eBook and so much more!

 

 

Categories: Blogs

Demystifying Portfolio Management

Rally Agile Blog - Mon, 06/01/2015 - 17:23

The Gartner PPM & IT Governance Summit is taking place this week. It will be my fourth year attending the summit and each year I’m reminded of how confusing portfolio management can be — especially to agilists. Sadly, this confusion undermines the ability to deliver greater value faster.

PPM

PPM most often refers to “Project Portfolio Management.” The Scaled Agile Framework® (SAFe®) calls it “Program Portfolio Management.” It can also refer to “Product Portfolio Management.”

Regardless of what the acronym means, to most agilists, PPM has a connotation of heavy and expensive portfolio management tools, command and control leadership, tight financial controls, “on time and on budget” focus, etc… basically everything an agilist despises. Even the word “portfolio” has a negative connotation at times, which can lead customers on an Agile journey to turn away from improving their portfolio practices.

It’s time to demystify portfolio management to better deliver on strategy.

"If you don’t have a formal portfolio management practice, think of where your organization spends its IT budget: there’s no better expression of your strategy. Implicitly or explicitly, every software organization is doing some form of portfolio management or they’d be going out of business. If you don’t think you’re doing it, chances are you’re not doing it right.”

Portfolio Management

Portfolio management is where strategy meets execution. It’s the glue that takes organizations from an aspirational strategy to realistic delivery plans that deliver on the strategy, and investment funding and work planning are two key steps in this transition.

In layman’s terms, a portfolio is simply a collection of “stuff.” A financial portfolio may be a “collection of stocks,” for example. In software development, investments and work are the two categories of “stuff” that matter:

  • The “collection of investments” with a goal of translating strategy into a set of funded business initiatives
  • The “collection of work” with a goal of translating those funded business initiatives into high-level execution plans, to provide returns on those investments.

Up until this year, Forrester used the terms “above the line” and “below the line” to describe the two. This year, they changed their nomenclature to “Portfolio Management for the BT (Business Technology) Agenda” and “Portfolio Management for Tech Management.”  

Whether you call what you work on projects, programs, or products, you want that work to generate greater value to your customers, so that the investments generate good returns to your stakeholders and shareholders.

Agile Portfolio Management

Agile portfolio management was first coined by Jochen Krebs in his 2008 book by the same name. The idea behind Agile portfolio management is to bring an Agile mindset to managing the “collection of investments” and the “collection of work” aligned with the funded investments, so the work can keep up with fast-changing business needs. To this date, Agile portfolio management has been focused primarily on planning and tracking work; Rally was the first vendor to deliver an Agile portfolio management solution, in 2011, with the launch of Rally Portfolio Manager.

Agile portfolio management is recognized by Forrester in its recent “Portfolio Management for Tech Management” wave, which calls out Rally’s Scaled Agile Framework® support.  Where the SAFe® portfolio level fits in the Forrester’s “Tech Management” portfolio management classification

Can PPM and Agile Portfolio Management Get Along?

Yes, and they must! I started covering this topic with “No Matter What Your Strategy, You’d Better Deliver Fast.” Adopting an Agile mindset to manage the “collection of work” in Rally while managing the “collection of investments” in a PPM product opens the door for large enterprises to leverage the best of what portfolio management has to offer in their business agility journey.

The Portfolio Management Opportunity

One of the top struggles enterprises leaders currently face is accelerating their time to market. They may have great strategies, but then find that their delivery pipe is too clogged to get things out to the market. While the “collection of investments” is definitely important to manage, managing the “collection of work” to get to market faster is currently the Achilles heel of many enterprises.

“If you can’t deliver on your strategy, it doesn’t matter how good your strategy is.”

As organizations scale Agile practices and move beyond individual teams to coordinated teams (the key to produce meaningful business outcomes,) Agile portfolio management becomes a critical skill to deliver faster on your strategy.

  • Without Agile portfolio management you will continue to clog your delivery pipe. Your PMO will continue to expect teams to deliver more than they have capacity to do, expect individual members to work on multiple projects at a time, and obsess about cost instead of assessing value to deliver.
  • With Agile portfolio management you will accelerate your time to market and your investment returns. Your PMO will respect persistent teams, say no to unplanned work, schedule fewer projects to finish them faster, defer detailed estimation and scope definition to knowledge workers closer to the action, and have a keen focus on value to deliver.

To learn more about Agile portfolio management, read our recently published portfolio agility papers, Delivering On Strategy and Rethinking Portfolio Management for the Fast-paced World.

Let’s continue the conversation live at RallyON! June 15-17, where, for the first time, the conference will have a dedicated Portfolio Agility track, with guest speakers from large enterprises such as CA Technologies, PayPal, and Ford. Ready to dive in? Sign up for our two-day Agile Portfolio Management training, June 18-19 in Phoenix.

Catherine Connor
Categories: Companies

A Business Perspective to Manage Technical Debt

Scrum Expert - Mon, 06/01/2015 - 17:20
Technical Debt is defined as the consequences of poor software architecture and software development within a codebase. Carrying too much technical debt reduce the ability of software to change and evolve. In this article, Jurgen De Smet explains how to manage technical debt from a business perspective. In this article, Jurgen De Smet discusses technical debt from his perspective of having worked with a large organization maintaining a very large software system. The article presents the different steps that were used to reduce technical debt. The strategy that was created aimed ...
Categories: Communities

Daily Scrum is a Waste of Time

Notes from a Tool User - Mark Levison - Mon, 06/01/2015 - 17:01

original graphic design by FreepikDaily Scrum? It’s a waste of time and interrupts my work.

Daily Scrum is just a chance for the ScrumMaster to show up and micromanage.

Daily Scrum is for reporting status, but I could do that in an email.

Have you heard these complaints before? I have. But I got a new version of it last week that disappointed me to the point that I have to respond:

Daily Scrum comment

I’m all for automating things that need automation, but let’s consider what this tool implies – that Daily Scrum is wasteful. The tool’s authors want to save team members the time that is spent talking to each other, and they imply that will be an “improvement”.

Sadly, that completely misses the point of Daily Scrum.

The Scrum Guide says:

The Daily Scrum is a 15-minute time-boxed event for the Development Team to synchronize activities and create a plan for the next 24 hours. This is done by inspecting the work since the last Daily Scrum and forecasting the work that could be done before the next one. The Daily Scrum is held at the same time and place each day to reduce complexity. During the meeting, the Development Team members explain:

·  What did I do yesterday that helped the Development Team meet the Sprint Goal?

·  What will I do today to help the Development Team meet the Sprint Goal?

·  Do I see any impediment that prevents me or the Development Team from meeting the Sprint Goal?

In my courses I tell people that Daily Scrum is intended to:

  • Prepare the team for the day’s collaboration
  • Help the team sense whether they will meet the Sprint Goal
  • Find anything that is slowing the team down
None of these needs can be satisfied by an automated tool.

This activity can’t be properly completed over email or twitter – it needs to be held face to face because the purpose is only achieved effectively when your team is involved in a dialogue. (If your team is distributed, then real video conference makes an adequate and necessary alternative.)

If a team member complains that Daily Scrum is a waste of time (or a status meeting, or an opportunity for micro-management) remind the team of the meeting’s purpose, and then ask the whole team how they would like to re-organize the activity to achieve that. Perhaps the questions being asked don’t provide the focus? Then change the questions. Perhaps they feel that the standup has turned into a status reporting meeting? Then ask them how to make it about them instead.

As usual in Scrum, asking the team to find a way of solving the problem is far more valuable than just sweeping the problem under the rug – or, in this case, by switching to a tool.

Categories: Blogs

Where Does an Agile Transformation Start? Everywhere.

Leading Agile - Mike Cottmeyer - Mon, 06/01/2015 - 15:20

Okay, so your enterprise wants to start an agile transformation. Good for you! We’ll assume you know why you are doing it, what the values are and that it’s not an overnight process.

That still leaves a question of where in the organization do you start? Do you start with a small scale team level approach? Do you get executive sponsorship for a top down push? Do you work through the PMO? And what about middle management?

Org Structure Question

 

The answer is, yes.

Let’s look at the various entrance vectors for an agile transformation, and why they can fail.

From the Team Up

Up Arrow
When I first gained a formal understanding of agile (like many I’d been doing it for years without realizing it), my basic Shu understanding of agile was very team and individual focused. I think my background in customer service made this a very natural place to go to. As a natural extension of this I believed that “agile must grow from the teams”. If you believe you are agile, you will be.

It was at this time I first came up with my “Better people lead to better teams, better teams to better projects, better projects to better products, better products leads to better companies and better companies will make a better world.” philosophy.

Unfortunately, this is not unlike the kid with a blanket tied around his neck that jumps off his parent’s roof, in the belief he can fly. Belief will only carry you so far in the face of the law of gravity. A team level agile transformation can only go so far in the enterprise before it runs into the impediments of large organizations.

From the Top Down

DownArrowAt the other end of the spectrum you have agilists that firmly believe an agile transformation must come from the executive level. Without their support, you can never conquer the agile anti-bodies and organizational impediments. The most common problem with this method, is a failure to commit. The executive says “we’re going agile” and may even hire some consultants to come in and help.

Only like the product manager who doesn’t get the shift to being a product owner, the executive does not take part in the transformation. Mandates and visions from the C-Suite rarely succeed unless the executives are willing to invest their time directly into the effort. Even if they do, they can run into strong resistance from the middle without constant support from the top.

Meet in the Middle

Candle_Both_Ends_frankieleon_3528950399_362521a615_zFor a time I believed that this was the secret to success. Find a team that wanted to do an agile pilot and get the executive to support this from the top down. This too is fraught with risk. I learned this was not unlike burning the candle at both ends. Pretty soon the middle is melting. Even if the agile pilot was successful, two things would rise up to crush it. The first being most agile pilots are small scale, high performing projects that won’t scale across the organizational impediments. The other problem was that the managers in the middle had a tendency to become detractors out of sheer fear of how this would change their role.

Which led me to to the realization that without middle management bought in and supporting, you could not be successful. This launched me on a quest to help educate managers on what it meant to be a manager in an agile organization. While teaching managers to move from managing tasks, to enabling their teams was certainly valuable, it was not the magic entry point to start a transformation. It did build on my “better people” belief in that I was helping managers to support their directs better, even if they were not doing agile development. That didn’t help me with finding the vector to start an agile transformation.

The PMO

PMO

My focus on better managers, combined with my PMI background, led me to explore driving an agile transformation from the program management office. I really thought I was on to something here. The PMO typically owns process or has a lot of influence on it. And as peers to the middle management can exert some strong influence with them. The problems though came from all directions. Teams have a somewhat understanding wariness for the “process of the month” from project managers. “These non-engineers want to tell us how to write software?” Next, while the PMO might be able to get an executive sponsor, more often than not that sponsorship extends only as far as the kick-off meeting. And while the PMO does own process, because agile calls for a fundamental change in how people managers interact with their directs, those managers are usually highly resistant.

So the bottom, the top and the middle all have their challenges for originating an agile transformation. So what do we do?

A Total ApproachStructure-Governance-Metrics-Predictability

While I was exploring coaching better managers, LeadingAgile ‘s founders, Mike and Dennis began to realize that only a systematic approach would work to successfully transform an enterprise scale organization to agile. By establishing an agile structure, governance and metrics, a company could bring clarity to their requirements, accountability (and ability) to the teams and be able to measurably track progress through working, tested software.

This approach doesn’t focus on just one approach vector. Instead it sets up an agile transformation plan from portfolio, through the program level (product owner teams) to the delivery level. When the agile pilot is done, it’s not a cutting edge XP practice or Lean Startup. Instead the pilot is testing the very first step the rest of the organization will also take. The executive sponsor is directly involved, much like a product owner should be. The managers not only know what is happening, they are directly a part of it and get the support they need to be able to support their teams, not drive them to a death march release. And of course the teams get the hands-on help to make a transition to a Shu level agile framework, the first step in a multi-legged journey of an agile transformation.

Team SliceNot unlike Agile itself

When we talk about creating a stable agile team, we often use the slice of cake analogy. The Scrum team (to pick an agile framework) should have all the skills needed to release an increment of potentially shippable product. An agile transformation needs to be a slice of cake through the organization, with everyone an equal player in the transformation.

When we talk about enterprise agile release ceremonies we have release planning, sprint planning and the standup. With an agile transformation, the portfolio is the release planning, the program is the sprint planning and the teams the daily standup.

ConclusionOrg Structure All

If you want a successful enterprise-scale agile transformation, you can’t start at the top, the bottom, or the middle. You have to start all along the continuum, at the same time.

And for me, it’s been a realization that my “better people, better teams” philosophy isn’t a “one leads to the next” progression scale. Instead you have to work with the company as a whole, to make all levels better, together. I still believe better companies will save the world and that’s what I’m doing when I help a company do an enterprise-scale agile transformation.

The post Where Does an Agile Transformation Start? Everywhere. appeared first on LeadingAgile.

Categories: Blogs

Microservices principles #5: Best technology for the job over one technology for all

Xebia Blog - Mon, 06/01/2015 - 12:39

Microservices are a hot topic. Because of that a lot of people are saying a lot of things. To help organizations make the best of this new architectural style Xebia has defined a set of principles that we feel should be applied when implementing a Microservice Architecture. Over the next couple of days we will cover each of these principles in more detail in a series of blog posts.
In this blog we cover: “Best technology for the job over one technology for all”

A common benefit of service based (and loosely coupled) architectures is the possibility to choose a different technology for each service. Even though this concept isn’t new, it’s rarely applied. Often the reason for this seems to be that even though the services should operate independently they do share (parts of) the same stack. This is further fueled by an urge to consolidate all development under a single technology. Reasoning here usually being that developers become more interchangeable and therefore more valuable if everything runs on the same technology, which should be a good thing.

So, if this isn’t new territory why drag it up again? Why would a Microservices architecture merit changing an existing approach? The short answer is autonomy. The long(er) answer is that a Microservices Architecture does not try to centralize common (technological) functions in singleton-esque services. No, the focus of a Microsservices architecture is on service autonomy, centered around business capability and a Microservice can therefore implement its own stack.  This to make a Microservice easier to deploy on their own and removes dependencies on other services as much as possible.

But autonomous deployment isn’t the most important reason to consider technology on a per-service basis. The most important reason is the simple “use the best tool for the job”. Not all technology is created equal. This isn’t limited to the choice of programming language or even the framework. It applies to the whole stack including the data layer.

Instead of spending a significant sum to buy large, bloated, multipurpose middleware, consider lightweight, single purpose containers. Pick containers that run the tech you need. You don't need Java applications with a relational database for everything. Other languages, frameworks and even datastores exist that cater to specific needs. Think of other languages like Scala or Go, frameworks like Akka or Play and database alternatives that focus on specific needs like storing (and retrieving) geographical data.

The choice of stack also relates to the choices you can make for your application landscape. If you have existing components that work for you or if you have components you want to buy off the shelve, it’s a real benefit to not be limited by an existing stack. For example, if you have opted for a Windows-only environment you are limiting your options.

Concerns about maintaining such a diverse landscape should consider that a lot of complexity comes from trying to maintain a single stack for everything. Smaller and simpler stacks should be easier to maintain. And having a single operations team for all those different technologies doesn't sound like a good idea? You're right! If you still have separate development and operations teams it may also be time to revisit that strategy. The devops approach makes running the services a shared responsibility. This doesn’t happen overnight but it is also a reason why Microservices can be such a good fit for organizations that have adopted an Agile way of working and/or apply Continuous Delivery.

Finally giving your developers a broader toolset to play with should keep them engaged. The opportunity to work with more than one technology can be a factor in retaining and attracting talent.

Categories: Companies

Everyone can be a leader

thekua.com@work - Mon, 06/01/2015 - 10:33

There are so many definitions of what leadership is so I’m not about to add another one. A nice simple one that I like from the Oxford dictionary is:

The action of leading a group of people or an organisation, or the ability to do this.

Many people assume that playing a role with a title that has “Leader” in it automatically makes them a leader – although this is not always the case. In fact, I have found that sometimes people who pursue roles simply because they have a more senior association with them are not really prepared to lead a group of people.

In my consulting life, I have worked in many teams in many different roles and I have seen many acts of leadership demonstrated by people who don’t have this role.

Examples help.

Example 1: On one of my first projects in the UK that I lead, a developer on the team was passionate about user experience design. He decided to do some ad-hoc user testing on the User Interface (UI) we had written, found someone willing to act as a test subject. He observed what they were doing and reported back to the team his findings. His initiative convinced us that setting aside more time to focus on usability would be a good thing to do. He demonstrated (at least to me) an act of leadership.

Example 2: During one of the Tech Lead courses I gave, I split the class into smaller groups for a number of exercises. I remember one particular group that had a large number of opinionated developers, all trying to get their view across. There was a female developer, who I noticed, listened quietly to all the opinions, waited for a pause before summarising what she heard and asking the group if that was correct. When she reflected back what she heard, she had summarised the different approached, integrated all the opinions and provided a cohesive story that everyone agreed with. She established a clear path that allowed the team to move forward. She demonstrated an act of leadership.

Example 3: On a particular client, there was the traditional divide between the development organisation and the operations organisation (sitting on a different floor). I remember during one of our planning sessions, a developer on the team who had met someone from operations decided to, unexpectedly, invite the operations person to the planning meeting. Although it was a surprise to us, we saw the appreciation from the operations person being involved earlier and probably changed the outcome of what we would have planned without them. He was passionate about the DevOps culture and demonstrated an act of leadership.

I do a lot of speaking and writing on leadership in our industry and what I like about these examples are acts of leadership that come without the authority of a title. Taking initiative, driving people towards a common goal, even in small incremental steps are acts of leadership that mean that everyone can be a leader.

Categories: Blogs

R: Think Bayes Euro Problem

Mark Needham - Mon, 06/01/2015 - 01:11

I’ve got back to working my way through Think Bayes after a month’s break and started out with the one euro coin problem in Chapter 4:

A statistical statement appeared in “The Guardian” on Friday January 4, 2002:

When spun on edge 250 times, a Belgian one-euro coin came up heads 140 times and tails 110. ‘It looks very suspicious to me,’ said Barry Blight, a statistics lecturer at the London School of Economics. ‘If the coin were unbiased, the chance of getting a result as extreme as that would be less than 7%.’

But do these data give evidence that the coin is biased rather than fair?

We’re going to create a data frame with each row representing the probability that heads shows up that often. We need one row for each value between 0 (no heads) and 100 (all heads) and we’ll start with the assumption that each value can be chosen equally (a uniform prior):

library(dplyr)
 
values = seq(0, 100)
scores = rep(1.0 / length(values), length(values))  
df = data.frame(score = scores, value = values)
 
> df %>% sample_n(10)
         score value
60  0.00990099    59
101 0.00990099   100
10  0.00990099     9
41  0.00990099    40
2   0.00990099     1
83  0.00990099    82
44  0.00990099    43
97  0.00990099    96
100 0.00990099    99
12  0.00990099    11

Now we need to feed in our observations. We need to create a vector containing 140 heads and 110 tails. The ‘rep’ function comes in handy here:

observations = c(rep("T", times = 110), rep("H", times = 140))
> observations
  [1] "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T"
 [29] "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T"
 [57] "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T"
 [85] "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "H" "H"
[113] "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H"
[141] "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H"
[169] "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H"
[197] "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H"
[225] "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H"

Now we need to iterate over each of the observations and update our data frame appropriately.

for(observation in observations) {
  if(observation == "H") {
    df = df %>% mutate(score = score * (value / 100.0))
  } else {
    df = df %>% mutate(score = score * (1.0 - (value / 100.0)))
  }    
}
 
df = df %>% mutate(weighted = score / sum(score))

Now that we’ve done that we can calculate the maximum likelihood, mean, median and credible interval. We’ll create a ‘percentile’ function to help us out:

percentile = function(df, p) {
    df %>% filter(cumsum(weighted) > p) %>% head(1) %>% select(value) %>% as.numeric
}

And now let’s calculate the values:

# Maximum likelihood
> df %>% filter(weighted == max(weighted)) %>% select(value) %>% as.numeric
[1] 56
 
# Mean
> df %>% mutate(mean = value * weighted) %>% select(mean) %>% sum
[1] 55.95238
 
# Median
> percentile(df, 0.5)
[1] 56
 
# Credible Interval
percentage = 90
prob = (1 - percentage / 100.0) / 2
 
# lower
> percentile(df, prob)
[1] 51
 
# upper
> percentile(df, 1 - prob)
[1] 61

This all wraps up nicely into a function:

euro = function(values, priors, observations) {
  df = data.frame(score = priors, value = values)
 
  for(observation in observations) {
    if(observation == "H") {
      df = df %>% mutate(score = score * (value / 100.0))
    } else {
      df = df %>% mutate(score = score * (1.0 - (value / 100.0)))
    }    
  }
 
  return(df %>% mutate(weighted = score / sum(score)))
}

which we can call like so:

values = seq(0,100)
priors = rep(1.0 / length(values), length(values))
observations = c(rep("T", times = 110), rep("H", times = 140))
df = euro(values, priors, observations)

The next part of the problem requires us to change the prior distribution to be more weighted to values close to 50%. We can tweak the parameters we pass into the function accordingly:

values = seq(0,100)
priors = sapply(values, function(x) ifelse(x < 50, x, 100 - x))
priors = priors / sum(priors)
observations = c(rep("T", times = 110), rep("H", times = 140))
df = euro(values, priors, observations)

In fact even with the adjusted priors we still end up with the same posterior distribution:

> df %>% filter(weighted == max(weighted)) %>% select(value) %>% as.numeric
[1] 56
 
> df %>% mutate(mean = value * weighted) %>% select(mean) %>% sum
[1] 55.7435
 
> percentile(df, 0.5)
[1] 56
 
> percentile(df, 0.05)
[1] 51
 
> percentile(df, 0.95)
[1] 61

The book describes this phenemenom as follows:

This is an example of swamping the priors: with enough data, people who start with different priors will tend to converge on the same posterior.

Categories: Blogs

Python: CSV writing – TypeError: ‘builtin_function_or_method’ object has no attribute ‘__getitem__’

Mark Needham - Mon, 06/01/2015 - 00:33

When I’m working in Python I often find myself writing to CSV files using the in built library and every now and then make a mistake when calling writerow:

import csv
writer = csv.writer(file, delimiter=",")
writer.writerow["player", "team"]

This results in the following error message:

TypeError: 'builtin_function_or_method' object has no attribute '__getitem__'

The error message is a bit weird at first but it’s basically saying that I’ve tried to do an associative lookup on an object which doesn’t support that operation.

The resolution is simply to include the appropriate parentheses instead of leaving them out!

writer.writerow(["player", "team"])

This one’s for future Mark.

Categories: Blogs

Goofy Innovation Techniques

J.D. Meier's Blog - Sun, 05/31/2015 - 20:37

If your team or company isn’t thriving with innovation, it’s not a big surprise.

In the book, Ten Types of Innovation: The Discipline of building Breakthroughs, Larry Keeley, Helen Walters, Ryan Pikkel, and Brian Quinn explain what holds innovation back.

Goofy innovation techniques are at least one part of the puzzle.

What holds innovation back is that many people still use goofy innovation techniques that either don’t work in practice, or aren’t very pragmatic.  For example “brainstorming” often leads to collaboration fixation.

Via Ten Types of Innovation: The Discipline of building Breakthroughs:

“Part of the Innovation Revolution is rooted in superior tradecraft: better ways to innovate that are suited for tougher problems.  Yet most teams are stuck using goofy techniques that have been discredited long ago.  This book is part of a new vanguard, a small group of leading thinkers who see innovation as urgent and essential, who know it needs to be cracked as a deep discipline and subjected to the same rigors as any other management science.”

The good news is that there are many innovation techniques that do work.

If you’re stuck in a rut, and wondering how to get innovation going, then abandon the goofy innovation techniques, and cast a wider net to find some of the approaches that actually do.   For example, Dr. Tony McCaffrey suggests “brainswarming.”  (Here is a video of brainswarming.)  Or check out the book, Blue Ocean Strategy, for a pragmatic approach to strategic market disruption.

Innovate in your approach to innovation.

You Might Also Like

How To Get Innovation to Succeed Instead of Fail

Management Innovation is at the Top of the Innovation Stack

No Slack = No Innovation

The Innovation Revolution

The Myths of Business Model Innovation

Categories: Blogs

Agile for Humans podcast

George Dinwiddie’s blog - Sun, 05/31/2015 - 18:09

Ryan Ripley has posted the second Agile for Humans podcast where he, Amitai Schlair, and I discuss the life of a consultant, how to make retrospectives valuable, and the place of managers in an Agile organization.

Categories: Blogs

Scrum Gathering South Africa Johannesburg

Scrum User Group of South Africa - Sun, 05/31/2015 - 18:05
This year the Scrum Gathering will be held in Johannesburg on the 19th and 20th of October at the Hyatt Regency Hotel in Rosebank. For more information regarding the gathering, please check out our Scrum Gathering 2015 home page Interested in Speaking at the 2015 South African Scrum Gathering? Click here to submit your talk.
Categories: Communities

How to build resilient Scrum teams ?

Agile World - Venkatesh Krishnamurthy - Sun, 05/31/2015 - 15:28

Some time back I attended a session on raising resilient kids. I learnt that building resilience is all about building the ability to bounce back and learn from all kinds of adversity—including setbacks, threats, stress and trauma.   




Here are some notes from the session.

How to build resiliency in kids?

1. Providing unconditional love and acceptance
2. Trust them
3. Provide safe environment for them to fail
4. Trust their problem-solving skills
5. Encourage independence and let the child solve its problems
6. When they are hurt, listen to them calmly and provide them comforting feeling
7. Let the child know the consequences of bad behavior
8.Set the expectations and rules of the game
9. Provide enough freedom to be creative
10. Accepting your kid as he/she is the key to making them resilient

In fact as part of coaching engagements, this is exactly what we encourage Scrum teams to be.  A Scrum Master should work towards building resilient Scrum teams. 

How do you build resilient Scrum teams ?
Just replace “kids” with “scrum teams” :-)  in the above section and you have the answers.
Bottom-line is, a Scrum team should be trusted and encouraged to solve their problems.  

There is a huge misconception in the Scrum world that “Scrum Master”(SM) is there to remove the blockers/impediments, and I would strongly discourage this characteristic. 

As long as Scrum Master is solving all the challenges, the team stays crippled and dependent on SM. Sometimes the SM must consciously step back and allow the team to struggle to solve their problems.

With the right environment and boundary conditions in place, the team should be allowed to work on the goal. The team should be trusted and encouraged to figure out the solution. When they fail, instead of punishing them, they should be comforted, and support should be given.

Before I conclude this short post, What other characteristics have you observed in resilient teams?

Photo courtsey: https://flic.kr/p/qwbDN
Categories: Blogs

Neo4j: The BBC Champions League graph

Mark Needham - Sat, 05/30/2015 - 23:45

A couple of weekends ago I started scraping the BBC live text feed of the Bayern Munich/Barcelona match, initially starting out with just the fouls and building the foul graph.

I’ve spent a bit more time on it since then and have managed to model several other events as well including attempts, goals, cards and free kicks.

I started doing this just for the Bayern Munich/Barcelona match but realised it wasn’t particularly difficult to extend this out and graph the events for every match in the Champions League 2014/2015.

To do this we first need to download the pages for each of the matches. I downloaded this page and wrote a simple Python script to get the appropriate URIs:

from bs4 import BeautifulSoup
from soupselect import select
import bs4
 
soup = BeautifulSoup(open("data/results", "r"))
 
matches = select(soup, "a.report")
 
for match in matches:
    print "http://www.bbc.co.uk/%s" %(match.get("href"))

I then piped the output of running this script into wget:

find_all_matches.py | xargs wget -O data/raw

It was relatively simple to update the scraping and import code to handle multiple matches. The whole process from end to end looks like this:

2015 05 29 23 27 56

Most of the code is in the ‘scraping magic’ phase where I go through all the events and pull out the appropriate elements that we can link together in the graph.

e.g. a freekick and foul event are typically adjacent so we’d look to pull out the two players involved, the type of card issues, the time of the incident and the match the event occurred in.

I used Python’s Beautiful Soup library for this task but there’s no reason you couldn’t use another set of tools.

The README page shows how to create your own version of the graph but here’s an overview of what the graph looks like using Rik’s meta graph query:

Graph  21

Here’s a few of my favourite queries so far:

Which player with more than 10 shots has the best conversion rate?
match (a:Attempt)<-[:HAD_ATTEMPT]-(app)<-[:MADE_APPEARANCE]-(player),
      (app)-[:FOR_TEAM]-(team)
WITH player, COUNT(*) as times, COLLECT(a) AS attempts, team
WITH player, times, LENGTH([a in attempts WHERE a:Goal]) AS goals, team
WHERE times > 10
RETURN player.name, team.name, goals, times, (goals * 1.0 / times) AS conversionRate
ORDER BY conversionRate DESC
LIMIT 10
 
==> +------------------------------------------------------------------------------------+
==> | player.name           | team.name            | goals | times | conversionRate      |
==> +------------------------------------------------------------------------------------+
==> | "Luiz Adriano"        | "Shakhtar Donetsk"   | 9     | 14    | 0.6428571428571429  |
==> | "Yacine Brahimi"      | "FC Porto"           | 5     | 13    | 0.38461538461538464 |
==> | "Mario Mandzukic"     | "Atlético de Madrid" | 5     | 14    | 0.35714285714285715 |
==> | "Sergio Agüero"       | "Manchester City"    | 6     | 18    | 0.3333333333333333  |
==> | "Karim Benzema"       | "Real Madrid"        | 6     | 19    | 0.3157894736842105  |
==> | "Klaas-Jan Huntelaar" | "FC Schalke 04"      | 5     | 16    | 0.3125              |
==> | "Neymar"              | "Barcelona"          | 9     | 29    | 0.3103448275862069  |
==> | "Thomas Müller"       | "FC Bayern München"  | 7     | 24    | 0.2916666666666667  |
==> | "Jackson Martínez"    | "FC Porto"           | 7     | 24    | 0.2916666666666667  |
==> | "Callum McGregor"     | "Celtic"             | 3     | 11    | 0.2727272727272727  |
==> +------------------------------------------------------------------------------------+
Which players gained immediate revenge for a foul?
match (firstFoul:Foul)-[:COMMITTED_AGAINST]->(app1)<-[:MADE_APPEARANCE]-(revengeFouler),
      (app1)-[:IN_MATCH]->(match), (firstFoulerApp)-[:COMMITTED_FOUL]->(firstFoul),
      (app1)-[:COMMITTED_FOUL]->(revengeFoul)-[:COMMITTED_AGAINST]->(firstFoulerApp),
       (firstFouler)-[:MADE_APPEARANCE]->(firstFoulerApp)
WHERE (firstFoul)-[:NEXT]->(revengeFoul)
RETURN firstFouler.name AS firstFouler, revengeFouler.name AS revengeFouler, firstFoul.time, revengeFoul.time, match.home + " vs " + match.away
 
==> +---------------------------------------------------------------------------------------------------------------------------------+
==> | firstFouler         | revengeFouler               | firstFoul.time | revengeFoul.time | match.home + " vs " + match.away        |
==> +---------------------------------------------------------------------------------------------------------------------------------+
==> | "Derk Boerrigter"   | "Jean Philippe Mendy"       | "88:48"        | "89:42"          | "Celtic vs NK Maribor"                  |
==> | "Mario Suárez"      | "Pajtim Kasami"             | "27:17"        | "32:38"          | "Olympiakos vs Atlético de Madrid"      |
==> | "Aleksandr Volodko" | "Casemiro"                  | "39:27"        | "44:32"          | "FC Porto vs BATE Borisov"              |
==> | "Thomas Müller"     | "Mario Fernandes"           | "87:22"        | "88:31"          | "CSKA Moscow vs FC Bayern München"      |
==> | "Vinicius"          | "Marco Verratti"            | "56:36"        | "58:00"          | "APOEL Nicosia vs Paris Saint Germain"  |
==> | "Lasse Schöne"      | "Dani Alves"                | "84:08"        | "86:18"          | "Barcelona vs Ajax"                     |
==> | "Nick Viergever"    | "Dani Alves"                | "57:22"        | "60:37"          | "Barcelona vs Ajax"                     |
==> | "Nani"              | "Atsuto Uchida"             | "6:10"         | "8:40"           | "FC Schalke 04 vs Sporting Lisbon"      |
==> | "Andreas Samaris"   | "Yannick Ferreira-Carrasco" | "89:21"        | "90:00 +4:21"    | "Monaco vs Benfica"                     |
==> | "Simon Kroon"       | "Guillherme Siqueira"       | "84:05"        | "90:00 +0:29"    | "Atlético de Madrid vs Malmö FF"        |
==> | "Mario Suárez"      | "Isaac Thelin"              | "32:02"        | "38:47"          | "Atlético de Madrid vs Malmö FF"        |
==> | "Hakan Balta"       | "Henrikh Mkhitaryan"        | "62:09"        | "64:14"          | "Borussia Dortmund vs Galatasaray"      |
==> | "Marco Reus"        | "Selcuk Inan"               | "36:17"        | "44:03"          | "Borussia Dortmund vs Galatasaray"      |
==> | "Hakan Balta"       | "Sven Bender"               | "10:57"        | "12:51"          | "Borussia Dortmund vs Galatasaray"      |
==> | "Vinicius"          | "Edinson Cavani"            | "87:56"        | "90:00 +1:25"    | "Paris Saint Germain vs APOEL Nicosia"  |
==> | "Jackson Martínez"  | "Carlos Gurpegi"            | "64:55"        | "66:17"          | "Athletic Club vs FC Porto"             |
==> | "Nani"              | "Chinedu Obasi"             | "1:30"         | "4:47"           | "Sporting Lisbon vs FC Schalke 04"      |
==> | "Vitali Rodionov"   | "Bruno Martins Indi"        | "52:16"        | "60:08"          | "BATE Borisov vs FC Porto"              |
==> | "Raheem Sterling"   | "Behrang Safari"            | "29:00"        | "33:27"          | "Liverpool vs FC Basel"                 |
==> | "Derlis González"   | "Fábio Coentrão"            | "52:55"        | "57:59"          | "FC Basel vs Real Madrid"               |
==> | "Josip Drmic"       | "Lisandro López"            | "15:04"        | "17:35"          | "Benfica vs Bayer 04 Leverkusen"        |
==> | "Fred"              | "Bastian Schweinsteiger"    | "6:04"         | "9:28"           | "Shakhtar Donetsk vs FC Bayern München" |
==> | "Alex Sandro"       | "Derlis González"           | "4:07"         | "7:28"           | "FC Basel vs FC Porto"                  |
==> | "Luca Zuffi"        | "Ruben Neves"               | "73:49"        | "84:44"          | "FC Porto vs FC Basel"                  |
==> | "Marco Verratti"    | "Oscar"                     | "28:49"        | "34:04"          | "Chelsea vs Paris Saint Germain"        |
==> | "Cristiano Ronaldo" | "Jesús Gámez"               | "20:59"        | "25:37"          | "Real Madrid vs Atlético de Madrid"     |
==> | "Bernardo Silva"    | "Álvaro Morata"             | "49:20"        | "62:31"          | "Monaco vs Juventus"                    |
==> | "Arturo Vidal"      | "Fabinho"                   | "38:19"        | "45:00"          | "Monaco vs Juventus"                    |
==> +---------------------------------------------------------------------------------------------------------------------------------+
Which players took the longest to gain revenge for a foul?
match (foul1:Foul)-[:COMMITTED_AGAINST]->(app1)-[:COMMITTED_FOUL]->(foul2)-[:COMMITTED_AGAINST]->(app2)-[:COMMITTED_FOUL]->(foul1),
      (player1)-[:MADE_APPEARANCE]->(app1), (player2)-[:MADE_APPEARANCE]->(app2),
      (foul1)-[:COMMITTED_IN_MATCH]->(match:Match)<-[:COMMITTED_IN_MATCH]-(foul2)
WHERE (foul1)-[:NEXT*]->(foul2)
WITH match, foul1, player1, player2, foul2 ORDER BY foul1.sortableTime, foul2.sortableTime
WITH match, foul1, player1, player2, COLLECT(foul2) AS revenge
WITH match, foul1,  player1,player2,  revenge[0] AS revengeFoul
RETURN player1.name, player2.name, foul1.time, revengeFoul.time, revengeFoul.sortableTime - foul1.sortableTime AS secondsWaited, match.home + " vs " + match.away AS match
ORDER BY secondsWaited DESC
LIMIT 5
 
==> +---------------------------------------------------------------------------------------------------------------------------+
==> | player1.name      | player2.name        | foul1.time | revengeFoul.time | secondsWaited | match                           |
==> +---------------------------------------------------------------------------------------------------------------------------+
==> | "Stefan Johansen" | "Ondrej Duda"       | "1:30"     | "82:11"          | 4841          | "Legia Warsaw vs Celtic"        |
==> | "Neymar"          | "Vinicius"          | "2:35"     | "80:08"          | 4653          | "Barcelona vs APOEL Nicosia"    |
==> | "Jérémy Toulalan" | "Stefan Kießling"   | "9:19"     | "86:37"          | 4638          | "Monaco vs Bayer 04 Leverkusen" |
==> | "Nabil Dirar"     | "Domenico Criscito" | "6:32"     | "82:39"          | 4567          | "Zenit St Petersburg vs Monaco" |
==> | "Nabil Dirar"     | "Eliseu"            | "7:20"     | "81:30"          | 4450          | "Monaco vs Benfica"             |
==> +---------------------------------------------------------------------------------------------------------------------------+
Who’s had the most shots?
match (team)<-[:FOR_TEAM]-(app)<-[appRel:MADE_APPEARANCE]-(player:Player)
optional match (a:Attempt)<-[att:HAD_ATTEMPT]-(app)
WITH player, COUNT( DISTINCT appRel) AS apps, COUNT(att) as times, COLLECT(a) AS attempts, team
WITH player,apps, times, LENGTH([a in attempts WHERE a:Goal]) AS goals, team
WHERE times > 10
RETURN player.name, team.name, apps, goals, times, (goals * 1.0 / times) AS conversionRate
ORDER BY times DESC
LIMIT 10
 
==> +-------------------------------------------------------------------------------------------+
==> | player.name          | team.name             | apps | goals | times | conversionRate      |
==> +-------------------------------------------------------------------------------------------+
==> | "Cristiano Ronaldo"  | "Real Madrid"         | 12   | 10    | 69    | 0.14492753623188406 |
==> | "Lionel Messi"       | "Barcelona"           | 12   | 10    | 51    | 0.19607843137254902 |
==> | "Robert Lewandowski" | "FC Bayern München"   | 12   | 6     | 43    | 0.13953488372093023 |
==> | "Carlos Tévez"       | "Juventus"            | 12   | 7     | 34    | 0.20588235294117646 |
==> | "Gareth Bale"        | "Real Madrid"         | 10   | 2     | 32    | 0.0625              |
==> | "Luis Suárez"        | "Barcelona"           | 9    | 6     | 30    | 0.2                 |
==> | "Neymar"             | "Barcelona"           | 11   | 9     | 29    | 0.3103448275862069  |
==> | "Hakan Calhanoglu"   | "Bayer 04 Leverkusen" | 8    | 2     | 29    | 0.06896551724137931 |
==> | "Edinson Cavani"     | "Paris Saint Germain" | 8    | 6     | 27    | 0.2222222222222222  |
==> | "Alexis Sánchez"     | "Arsenal"             | 9    | 4     | 25    | 0.16                |
==> +-------------------------------------------------------------------------------------------+

Maybe you can think of some cooler ones? I’d love to see them. Grab the code from github and give it a try.

Categories: Blogs

Custom Fit Your ALM at the RallyON Hackathon

Rally Agile Blog - Fri, 05/29/2015 - 16:00

Give a developer an app, and she’ll use it for a narrowly defined task. Teach a developer to build an app, and she’ll have the power to solve your toughest business challenges as they arise. In today’s fast-changing technology environment, that adaptability is powerful — and necessary. Hackathons are a great place to build that adaptability into your organization.

Participating in a Rally hackathon is like tailoring your favorite dress or suit. It adds a whole new dimension to your style. Take it in a little for the perfect fit. Add an extra hidden pocket. Accessorize with a pocket square to match your Chuck Taylor sneakers.

Just like a good suit, the software feels better and works better as you customize the fit. And once you start, new solutions appear to help with your changing needs.  

From my experiences running several hackathons for Rally and other organizations, I’ve discovered that few events give you the sense of satisfaction you gain from this kind of event. I'm talking about the satisfaction of walking out the door having solved a complex problem in an amazingly fun environment.

On June 18 and 19, after the RallyON!™ 2015 Agile conference, we’re hosting a Rally Hackathon. As a developer, you’ll learn how to work on Rally’s App SDK to create custom visualizations and applications to get the information you need now — and the firsthand experience to build what you need in the future. We’ll pair each developer with a Rally engineer for two days of hands-on coding.  

And if you like challenges, the winning pair will head home with the prized golden sombrero (and an Oculus Rift headset to match). We built some great apps last year and can’t wait to see what everyone creates June 18–19 in Phoenix, Arizona.

Chase Doelling
Categories: Companies

Knowledge Sharing


SpiraTeam is a agile application lifecycle management (ALM) system designed specifically for methodologies such as scrum, XP and Kanban.