The High Level Issue

In my post about Interests vs Positions,  I alluded that the parties involved in my fictional example could also have improved their outcome if they had widened their options – but that that was another post.  Well, this is another post.

Widening one’s available options is a great technique to improve the outcome of many situations – day to day decisions, major life decisions, actual “negotiations” with other parties, etc.   For purposes of this post, when I use the word ‘option’, I mean a potential way to achieve one’s goal.

It is yet another interesting phenomenon of human behavior that we tend to restrict ourselves to a very small number of options for meeting our goals.  The biggest pitfall is restricting yourself to the dichotomy: “do x or don’t do x“.  Slightly better but still pretty bad is: “do either x or y.”

Usually, there is a whole array of options available in a given situation.  Our instinct, though, is to focus exclusively on the first one or two that occur to us.  This is a huge mistake.  The first option(s) that you consider will likely have significant drawbacks.  They might not even really accomplish your goal.  You will likely end up agonizing over, fretting over, and debating these trade-offs (even if just with yourself).  Even if you don’t, there is likely a much better option available to you that you are ignoring.

Back to Bob and Alice

Consider the example of Bob from the last post.  His goal was catching up on sleep.  His plan (option) for achieving that goal was to get to bed early.  His plan (option) for that was getting home from the movie early.  His plan (option) for that was getting to the movies quickly.  His plan (option) for that was making a decision about which movie to see quickly.  And, finally, his plan (option) for that was to have a suggestion ready to go when he and Alice discussed it.  Unfortunately, Bob didn’t actually lay it out explicitly like that – even in his own mind.

Instead, Bob’s mind (like everyone else’s) was too clever by half, as they say.  His mind immediately leaped all the way back to the beginning of the process (the making a decision step) and came up with a way to speed it up.  In a sense, Bob’s mind skipped over the forest and went straight to thinking about the trees.  This issue of not stepping “outside” of a process before trying to improve it, though, is another post 😉

If Bob had paused and enunciated – even just to himself – that what he really wanted was to catch up on sleep, he could have gone further.  He could have thought creatively about the problem and widened the options available to him.  For instance, catching up on sleep doesn’t necessarily mean getting to bed early.  He could also accomplish that by getting to bed at his normal time and then sleeping in.  Perhaps that would require him to rearrange his schedule for Saturday morning.  Perhaps that’s no problem at all.  Perhaps it is a problem – but the point is that he didn’t take the time to explore the option.

Instead, he conceived of the problem very narrowly.  There was a process – going to see a movie – and he had to speed it up.  The fact that he devised this plan independently (without consulting Alice) only compounded the problem.  But that’s another post…

To be fair, there is something to be said for trying to make a decision easy for someone else – especially when you believe you’re working in their best interests – or, at least, not against them.  In this case, though, Bob didn’t know what Alice’s interests were.  At best, he assumed that Alice had an interest in seeing a movie tonight – but he didn’t confirm that assumption or check to see whether there were other interests at stake.

How to Widen Your Options

It’s one thing to point out that someone should consider more options when charting a path to a goal.  It’s quite another to actually be that person and be able to recognize or generate more options.  In subsequent posts, I’ll describe some of my favorite ways of widening options based on my experience and some of the popular literature on the subject.

Stay tuned 🙂

Comments Off on Widening Your Options – Part 1
 | Posted by | Categories: Uncategorized |

Interests vs. Positions

27 August 2014

The Story

Imagine a couple, Bob and Alice.  Every Friday, they go out to see a movie.  Today is Friday.  They have yet to choose which movie they are going to see.

Bob doesn’t have a strong opinion about which movie to see but would like to make a decision quickly.  Thus, he suggests to Alice: “I was thinking we could see Die Hard tonight.”

Alice responds: “But you picked the movie the last two weeks in a row.”

Somewhat taken aback, Bob replies: “Um, yeah, but you picked all four weeks before that…,” implying he was still behind rather than ahead.

“But that’s only fair.  You spend every Sunday afternoon watching sports.”

“Wait.  What does that have to do with anything?  You always say that that’s fine since you have other things to do.”

“That doesn’t mean I like it!”

“But you’ve never said anything about not liking it!  Even if you had, what does that have to do with who gets to pick the movie?”

And so on.

The tragic thing here is that, somewhat unbeknownst to both Bob and Alice, neither one of them cares who chooses the movie tonight.  Bob only cares about making a decision quickly since he would like to be home early because he’s low on sleep.  Alice’s only concern is that she doesn’t want to see an action movie.  She really doesn’t care what they see – so long as it’s not an action movie.

Despite that, both Bob and Alice are now heavily engaged in an emotional argument about the equitable distribution of weekly choices in general, who gets to choose tonight, why, what other considerations tip the scales, AND (at least implicitly) what the right way to communicate is.

They’re going to miss the movie.  They’re going to end the day pretty angry at one another.  They’ve opened a whole can of worms that did not need to be opened.  And all they cared about was a) choosing quickly and b) not choosing an action movie.

How did they get here?

Recognizing and Refining Interests

First, neither one of them took a moment to reflect on what their interests were – at least, not enough to be able to enunciate them.  Bob never paused to enunciate “I just want to make a decision quickly.”  Further, he never bothered to ask himself “why?”.  If he had, he might have refined it to “all I really want is to catch up on sleep.”

Enunciating Interests

Bob’s next misstep was that he never bothered telling Alice about his only real concern: catching up on sleep.

Up until now, Bob had made several mistakes – but they were still contained and easily fixable.  For instance, if Bob had started the conversation with “I’d really like to make a decision quickly so I can catch up on some sleep tonight,” the conversation could have gone very quickly and his plan would have worked.  Alice could have then responded with “No problem – all I care about is not seeing an action movie.”

The key is that, for the conversation to be salvageable at this point, Bob needed to enunciate his interest.

Responding with a Counter Argument

The next misstep was Alice’s.

It’s a funny thing about human nature but we assume that we need to respond to everything rationally – which often means “with a counter argument.”  In Alice’s case, all she had to do was say “Actually, I don’t care what we see but I’m really not up for an action movie this week.”  Interestingly, we humans tend to think that that is not a “valid” answer – at least, not when we’re the ones saying it out loud.  Bob would have considered it a perfectly “valid” answer.  After all, he wants them both to enjoy the movie they’re going to see.  That’s the whole point.

In Alice’s mind, though, Bob has offered a proposal – Die Hard.  Since she doesn’t want to see Die Hard, the “rational” thing to do is come up with an objective line of argumentation that will culminate in them not seeing Die Hard.  If she can convince Bob that she should really be the one to pick this week, she’ll just pick something else.  She really doesn’t care if she picks this week – perhaps she would even prefer not to be bothered with picking this week.  But she foregoes all of that in a snap decision about how to preserve her interest which seems endangered.

Taking Positions –  Hook, Line, and Sinker

Unfortunately, Bob falls into the same trap.  Alice just made an argument about why he shouldn’t pick this week.  He really doesn’t care about picking this week.  But human nature takes over and he can’t help but respond to Alice’s argument, which he finds flawed, with one of his own.  All of a sudden, his interest in making a decision quickly is not foremost in his mind.  Several other things have now become urgent, including the issue of what is an equitable distribution of weekly choices and just winning a debate.

Both Bob and Alice have now taken positions – and then proceed to dig in and defend.  Alice’s interest is not seeing an action movie – but her position is a combination of several things all hinging on who should get to choose and why.  Bob’s original interest has now been crowded out by several other interests and his position is that it’s only fair that he choose this week.

Unfortunately, it would now be pretty difficult to get Bob and Alice back on a smooth track.  They’re both firmly planted in arguing about their positions rather than their interests.  Neither one of them really cares about the positions.  Their interests are perfectly compatible.  They could have had a great evening.  Instead, it’s going to be rather unpleasant.  And it all hinges on interests versus positions.

Interests are what you really want or need.  Positions are just the arguments you think will achieve or preserve your interests.  Always focus both on your interests and those of the other parties.  Don’t worry about positions.  They’ll just make things worse.

Getting to Yes

The Interests vs. Positions distinction was popularized in the book, Getting to Yes: Negotiating Agreement Without Giving In by Roger Fisher, William L. Ury, and Bruce Patton.  While the situation presented above might not seem like a “negotiation” in the typical sense, it is a situation in which multiple parties have different interests and need to work together to achieve them (either by necessity or because of circumstance).  The book goes into far more detail about how to navigate the waters of interests and positions, truly difficult negotiations, and other related topics.  It’s an easy and worthwhile read.  I recommend it.


In addition to focusing on issues rather than positions, Bob and Alice would have benefited from widening their options – but that is another post.

 | Posted by | Categories: Uncategorized |

7 March 2012

Via Evolving Excellence, I’ve learned of, which is noteworthy for two reasons: 1) it is a cool business model, in my opinion, and 2) they have an absolutely fantastic introductory video on their website (warning: it autoplays).  As you watch it, notice the guy reading The Lean Startupin the background.

Comments Off on
 | Posted by | Categories: Business |

Contained Failure

16 February 2011

I assume that almost everyone has by now heard the maxim “fail early, fail often” at least once.

I hope everyone has also heard the explanation that the point is not to fail early and often per se but rather to fail earlier rather than later, i.e., avoid large catastrophic failures by accepting small, frequent ones.

The practical advice is quite clear:  When you embark on a new project or task, set up the situation so that you get early warning signs of failure.  Pay attention to those signs of failure.  Be willing to accept that the time, money, and energy you’ve already put into the project is a sunk cost and don’t throw good money after bad.  Etc.  All of this focuses on the idea of preventing a larger, more catastrophic failure.  If you’re going to fail, at least fail small.

Many authors also go to lengths to emphasize the the “learn” aspect of the “fail early, fail often” maxim – which is great.

What I often find lacking is a discussion of the practical implications for how one should coach teams or individuals.

There are inevitably situations where a person or team are faced with a problem and someone else knows that their planned solution is going to fail.  Perhaps this person is formally the team’s coach.  Perhaps they’re one member of a pair (as in pair programming).  Perhaps it’s a manager.  Perhaps it’s just someone tangentially related to the situation.  It doesn’t really matter.

The question is: what should that person do?

The natural inclination is to try to prevent the mistake – for obvious reasons.  Sometimes this takes the form of explaining why the plan won’t work.  Sometimes it’s telling a story about how that has been tried in the past and never works.  Sometimes it’s someone with authority just overruling the plan.  None of these approaches is terribly effective.  Sure, they may work sometimes.  Sure, the overruling approach can “work” 100% of the time, at least on the surface.  Anyone who’s been on the other side of that equation, though, knows pretty well the negative side effects of a team (or an individual) just being overruled when they’re convinced they’re right or having to argue endlessly with someone who thinks they’re wrong.

The fundamental problem with these situations is, in my opinion, the hidden premise that all mistakes should be avoided if at all possible.  In other words, never allow failure to occur.

The problem with this premise is twofold: 1) it’s impossible, 2) it prevents learning.

The trick is to craft the situation such that, if you fail, the failure is small, contained, and teaches you something valuable.  It’s not that the advice is “fail early, fail often so as to avoid catastrophic failure and, whenever possible, avoid failing at all.”  It’s “allow small failure both for the sake of avoiding larger failure and for the sake of learning.”

For example, if I’m working on a task with someone and my partner wants to do something that I am certain will not work, what should I do?  Rather than spending valuable time and effort arguing about it, the best thing to do is probably do it their way – so long as I can craft the situation to ensure that, if and when it fails, we haven’t spent a lot of time/energy/money doing it.  After all, there are only two possibilities: either I’m right and we will fail or I’m wrong and it will work.  Either way, we both win.  If I’m right, my partner has now learned something valuable in perhaps the most effective way possible (by experience) and with a small amount of expenditure (of time/energy/money) and we can peacefully move on to doing it my way.  On the other hand, if I’m wrong, I’ve learned something valuable AND the task is now done.

For this to end up being a win/win, though, you must contain the size of the experiment (what is potentially going to fail), for two reasons:

  1. It contains the cost associated with the benefit of the learning to be achieved so that the cost/benefit still works out in your favor.
  2. It limits externalities.  That is, it limits the number of variables to which the failure can later be attributed.  If the experiment (task) has too many variables (is too big), if and when it fails, it will be all too easy for people to argue about what really caused the failure.  The smaller the experiment, the more self-evident it becomes what went wrong.  The larger the failure, the less likely anyone is to learn anything since they will be able to rationalize the failure according to their own biases.

In sum, failure is not something to be avoided always and everywhere.  Because experience is often the most powerful teaching mechanism and because experience inevitably involves failures, failure is an excellent way to learn.  The critical distinction, though, is between contained, low-cost, high-yield failure on the one hand and open-ended, high-cost, no-yield failure on the other.  To get the first and avoid the second, craft your experiments well:

  • When you embark on a new project or task, set up the situation so that you get early warning signs of failure.
  • Pay attention to those signs of failure.
  • Be willing to accept that the time, money, and energy you’ve already put into the project is a sunk cost and don’t throw good money after bad.
  • And, the point of this post, be willing to allow others to conduct experiments you know are going to fail.  Don’t try to “save” them from failure.  Save them from that second kind of failure.
 | Posted by | Categories: Lean Principles, Project Management | Tagged: |

Imagine you have a single organization (choose your own scale: a single team or a group of teams arranged into a single, bigger organization).  Now imagine that you have multiple – perhaps many – products to manage concurrently.  By ‘manage’, I mean everything from the smallest bug fix or tweak to new major releases.  Now imagine that the customer/user bases of those disparate products are not coextensive.  That is, some users only care about their particular product to the exclusion of the rest – and they might be the only user base that cares about that particular product.

Lastly, imagine that your users/customers are generally dissatisfied with the speed with which enhancements or fixes are being rolled out to the product(s) they care about.  After all, with a single organization handling all of the products, and the efficiency gains to be had by grouping similar work items together, it is often going to be the case that a significant amount of time goes by without a particular product seeing any updates – because there is a major release for other products, for example.

What would you do?

One option is to use allocation based project or portfolio management.  I’m deliberately avoiding the phrase “resource allocation” because I object to using ‘resource’ as a euphemism for people – thus, I turn the phrase around and coming at it from the project side.

In any event, what I mean is a situation where you step away from having a single backlog (which you presumably have since we’re talking about a single organization) and break the work into multiple backlogs (or value streams, as the case may be) – allocating a portion of your people or teams to each.  The idea being that this new situation will ensure a slow but steady flow of improvements to each product, thus reassuring users that progress is being made, even if it is slow.

As with every tool or principle in any toolbox or framework, there are times when this will work and times when it will not (and times when it will make the situation worse).

Here are the things one must consider:

1. The stability of the allocation

If you can foresee that the allocation of people/teams to each product is going to be pretty stable, then this strategy might work for you (assuming the other conditions below obtain).  If, on the other hand, you’re going to have to adjust the allocation frequently based on changing market needs or customer demands, then this will probably make the situation worse.  By the time a person or team has been working with a particular product to be familiar with it and really productive, they will be pulled off and have to come up the learning curve on another product before being as productive as possible.  Fast forward a few more cycles and you’ll have a lot of wasted horse trading and lower morale on your hands.

2. The distribution of knowledge and skills

That is, will each product have allocated to it a set of people who have sufficient knowledge and skill sufficient to make the desired enhancements?  Often times, this will not be the case.  For example, say there is a team of eight people responsible for eight products but six team members are only familiar with 3 of the products and the other five products are really only understood well by the other two team members.  Assuming having those two team members float between teams is not a viable solution (for whatever reason: too much task switching, etc.), one could not really make any progress on all five of those systems in an allocation based system.  (I’m assuming that the team as a whole can make progress on these products due to the mentorship of those two team members.)

3. The ease with which you can deploy to Production

If your products are such that you can fairly easily, quickly, and reliably deploy new builds (for software; models for other types of products), allocation will possibly be a winning strategy (again, assuming the other conditions obtain).  As the cost/pain of deployment rises, the benefits of allocation decline because the frequency with which users receive updates will decline because of the transaction cost associate with deployment.

4. The type of work to be done for each product

If your products are mature and stable and on going work takes the form of minor enhancements, new features, the occasional bug, etc., allocating might work.  If this is the case, your users will indeed feel a slow but steady stream of improvements coming their way.

If, on the other hand, your working on major releases and cannot be deployed piecemeal because they represent pieces of a completely new paradigm which have to be deployed in a large batch, your customers will not experience this feeling of steady progress – because they’ll still of necessity be receiving them in “big bang” releases.

Given that we’re positing multiple products, it is likely that different products will fall into different camps.  Without knowing specifics, the only guiding principle I can offer is that allocation will be a relatively better idea as the  importance of the products that are mature and stable relative to the other products increases.

So, assuming those four issues are favorable, allocation might work and is certainly a valid experiment to run to see if you get the intended result.  If, however, any one of them seems problematic, allocation will probably not work and will create a slew of other problems.

I’m interested to hear your take on this, especially if you’ve ever tried allocation in this way.  Please share experiences in the comments.


Update: This post has been modified following clarification of a few points by SimplyBox.

ReadWriteWeb has a nice writeup of SimplyBox, a new product from SocialCast intended to bring activity streams to existing IT systems rather than forcing users to maintain yet another application (web or desktop) for enterprise activity streams.  I recommend watching the demo video:

In general, I think it’s a great idea.  I definitely feel the pain of having too many different tools to use.  Granted, most of this pain (for me, anyway) is the number of different sets of credentials I have to maintain.  I am not nearly as hesitant to adopt a new tool if it allows for single sign on.  Still, fewer tools are better, in my opinion.

That being said, I think SimplyBox may take the mantra of decentralized collaboration one step too far.  While I wholeheartedly agree that allowing users to instantly access a tool or context-specific activity stream for different applications is a great idea, I think the reason email continues to have such a strangle hold on collaboration is precisely because it is a centralized place where one can quickly search, sort, and organize messages and contacts.  The video above didn’t showcase any ability of a user to quickly find a conversation whose “location” they’ve forgotten.  Perhaps this is simply a feature that wasn’t showcased or is still on the roadmap.  I hope so.  Update: SimplyBox does have centralized management functionality.

The fundamental point that I think needs to be made is that there is a very important difference between decentralizing the app in terms of how one can access it and tie it to specific contexts and decentralizing the data such that users have to spend more time hunting for information they’re after.

Comments Off on SimplyBox and Decentralized Collaboration
 | Posted by | Categories: Collaboration |

I’ve been thinking a lot about retrospectives lately both because our team has been struggling with them being ineffective/wasteful and because retrospectives were the subject of conversation at the last DC/NOVA Scrum Users Group meetup.

Our team has been tweaking and experimenting with various modifications to our process but one thing that we’ve left untouched for a year now is our retrospectives.  Every sprint, we ask “What went well?” “What went badly?” and “What can we improve?”  Rarely, though, do we follow through on those items under “What can we improve?”  We’ve tried forcing ourselves to make these items concrete, posting them near our board, bringing them up in the standup meeting, etc. but to no avail.

We’re now experimenting with changing the meeting itself to better foster improvement.  First: we’re going into the meeting with an agenda rather than having it be a free form discussion.  Generally, when we treat it as free form, memories are dull and it is difficult to start a conversation.  We’re hoping that a prepared agenda (to which anyone can contribute) will help grease the skids, so to speak.

Secondly, the “What can we improve?” section will now be more explicitly a “What experiments should we run?” discussion – things like “should we be using Selenium instead of our current solution?” or “what if we only tasked out half of the stories at the beginning of the sprint and left the second half until the middle of the sprint?”

The “What went well?” and “What went badly?” topics, then, can focus not only on unexpected things that came up but also on the results of these process, tooling, and workflow experiments that we’re running.

Hopefully, this will prove to be a true PDCA loop and really drive improvement.  After all, that what retrospectives are supposed to do.


A number of recent problems has caused our team to tweak our weekly Backlog Review meeting.  Specifically, we’ve added two items to the agenda: 1) a review of the stories tentatively scheduled for the next sprint (and possibly the next one after that) and 2) providing our PO with an estimate of our story point capacity for the next sprint.  If you’re thinking “why weren’t you reviewing upcoming stories already and why don’t you just use your velocity?” read on.

The first problem we experienced dealt with a specific story – a new database report that was needed.  The report was originally conceived and designed a few months ago but the project was postponed for several (valid) reasons.  The story, though, had been estimated months ago and then not touched again.  When business priorities were such that the report was again a priority, we simply dropped it into a sprint.  That’s when things got ugly.

In the intervening months, the estimate had become stale.  We had learned several rather critical lessons about this particular type of database report (we had developed similar ones in the meantime) but never incorporated that learning into this story or its estimate.  What we originally thought was an 8 point story instantly became 6 different 5 point stories.

That’s all fine and good – estimates are estimates and it is expected that the team will gain new knowledge and refine estimates as time goes on.  That’s not what happened, though.  Instead, we only realized the problem during our sprint planning meeting.  Since our velocity was hovering in the low 30’s, the revised set of stories ate an entire sprint.  Product Management was not expecting that at all.  Though they were prepared for estimates to shift and priorities to have to be moved around, they were not prepared for a sprint that they thought (and were basically told) would hold 4 or 5 different stories being eaten up by one story.

The lesson we learned was that we simply couldn’t allow stories and their estimates to become stale – there was too much risk that the story itself no longer made sense or that the estimate was now widely off.  Ideally, stories would never get stale because the backlog would be a pull system and stories would be planned and estimated very close to when development would begin.  Unfortunately, a huge piece of prioritization is weighing costs and Product Management can’t gauge the cost/benefit of each story relative to others without estimates.  Thus, it sometimes happens that stories are estimated and then shelved for a while.

To deal with this, both the team and Product Management now know to be on the look out for any stale stories or estimates that might be making their way to the top of the backlog.  Additionally, we’ve now broken our backlog review into two parts: estimated new stories and reviewing the one or two sprint’s worth of stories at the top of the backlog in case anything needs to be tweaked.  This uncovers problems a lot earlier than the sprint planning meeting and gives Product Management a chance to move around other priorities and reset customer expectations.

Secondly, our team’s capacity over the last several sprints has been somewhat erratic due to overlapping vacations, conference attendance, and other circumstances.  As a result, Product Management has been subjected to a few rude surprises on the first day of a new sprint when we tell them that our capacity for this sprint is half of what it was last time.  The fix for this (at least until our schedules settle down and we can really rely on our velocity again) is to take 2-3 minutes in the backlog review and estimate (in story points) our capacity for the next sprint.  This again gives Product Management so early warning and time to shift things around as necessary.

I’d be interested to hear if anyone else has had similar problems and what their solutions were.

 | Posted by | Categories: Scrum |

On Monday of last week, our network and desktop support team (what we call our “IT Team” as distinct from our software development teams) began experimenting with Kanban as our project management framework.  Heretofore, we’d simply been handling our project management and priorities in a sort of ad-hoc fashion.  We knew we wanted to ratchet it down, but didn’t want to use Scrum since the IT team is more of a support organization that would not operate well using time boxes.  We decided to experiment with Kanban for multiple reasons, including its suitability for support organizations and its focus on lean principles.

Our first week of experimenting with Kanban went quite well.  The major benefit we saw was the visualization of our work and workflow.  On Monday, we held our first retrospective and identified the first major process issue we want to address: widening the ownership of the backlog to the entire team.  Up until now, I had generally been the one ultimately responsible for what we worked on and in what order.  Obviously, there was input from the rest of the team and other stakeholders but there was a sense that I was the gatekeeper for priorities.

Kanban has highlighted the inefficiencies in that arrangement and we’re now trying to actively discuss the backlog and new issues at least once a day in our daily meeting – if not more often throughout the day.  This is definitely going to be an ongoing improvement effort so I expect we’ll keep this as an action item for at least several weeks until we get to a point where we think the entire team has full ownership of the backlog.

Comments Off on IT Experimenting with Kanban
 | Posted by | Categories: Kanban |


19 March 2010

Today was the opening of AgileCoachCamp 2010 (#ACCNC) here in Durham.  So far, we’ve had a few rounds of lightning talks which were limited to 3 minutes and no slides as well as a lot of networking and generally good conversation.

In my lightning talk, I mentioned that I like to refer to our previous methodology (what we were doing prior to moving to Scrum) as “Waterhocking.”  I think it accurately captures the nature of our previous process.  It was definitely ad-hoc in so far as we weren’t following any particular project management framework and just handling things as they came up on a case-by-case basis.  It was similar to heavyweight “waterfall” methods in that we had extensive requirements gathering and documentation phases (BDUF), lengthy periods where the team would keep heads down and just try to build exactly what was documented, and too little user and acceptance testing too late.  Lastly, our releases often felt like we were hocking the product up since we were often under a fixed deadline and killing ourselves to get a product out the door only to find that the customer wasn’t happy with what was delivered.

Apparently, this label struck a chord with my fellow participants – it has a few mentions on twitter.  I’m definitely looking forward to tomorrow’s sessions; my only regret is that I can’t be in six or seven places at once.  There are so many really experienced, really insightful people here it is impossible not to miss great talks.

Comments Off on Waterhocking
 | Posted by | Categories: Software Development | Tagged: , |