Showing posts with label how-to. Show all posts
Showing posts with label how-to. Show all posts

Friday, 14 February 2014

Experience report from the Kanban Coaching Exchange - Exploring Kanban through it's values

I enjoyed a great evening last night at the Kanban Coaching Exchange, hearing Mike Burrows explore Kanban via a value system. This post summarises my notes and observations from the evening.

Some sub-titles were:

  • Kanban is "a humane start with what you do now approach to change"
  • Kanban encourages "Leadership at every level"

We kicked of with some quick exercises to familiarise ourselves with the values (Mike's posted them on his blog). I enjoyed being part of a very like-minded group (including @drewpreston and @jose_casal), which finished the first exercise quickly and got full-marks :-) The beer and success must have gone to our heads though, as we missed 100% on the second :-(


The values were grouped into three Agendas:

1 - Sustainability


  • Transparency
  • Balance
  • Collaboration
Collaboration is more than just "being nice to each other"; it's about creative relationships that, together, achieve something. Surprise, dissappointment or frustration in the team is often a sign that collaboration is missing or sub-optimal.

2 - Service Orientation


  • Customer focus - how quickly does the team validate that they've met the customer's needs. Can they even do this (does the data exist and can they access it)?
  • Flow
  • Leadership (at every level)


3- Survivability


  • Understanding
  • Agreement
  • Respect

These are disciplines (that take time and effort to do well), particularly relevant to making changes to a system/process. A related anti-pattern is "unsafe change", comprised of:

  • Bravado (too fast)
  • Complacency (too slow)
  • Tampering (too random)

This was my first time at the meetup and I really enjoyed it. Great location, speaker, beer, pizza, discussion and people.

Tuesday, 27 August 2013

Hiring well

How you do hire the best people, in the most efficient way?

This question was the essence of a great conversation I had this evening with a young Agile Manager from a fast growing, Polish start-up. We're both in Bucharest for the grass roots Agile Lean Europe 2013 conference, so this will no doubt be one of many great conversations.

We compared notes and shared ideas. The take away was:

  1. Attract the best talent. Through community involvement over a number of years, his company is way ahead in this area (thankfully they're in Poland, so not direct competition :). Joking apart, this reinforced the importance of developing and promoting your R&D Team as a brand - it pays off in the search for new talent.
  2. Always phone screen first. If using agencies, have them do a pre-call, and get them to collect information to dig into on your own phone screen. Give the agencies a mix of open-ended and specific questions, e.g. "how to you learn?", "what have you learnt most recently?". Design these to give an early indication of height and cultural fit.
  3. Show-me-your-code. If the candidate passes the phone screen, send them a coding exercise to complete. Their solution will give lots of insights, at very low cost.
  4. Always meet face-to-face. If the candidate passes the coding exercise, then either do a Skype call (if remote working will be a significant part of the role) or skip straight to a face-to-face. The goal of the face-to-face is mostly to determine cultural fit. My friend put it this way: "only hire people you'd want to go for a beer with, so go for a beer with them". Our approach in more reserved England is a four-part face-to-face involving a code review and kata with an Engineer, a technical discussion with an Architect/Engineer and Engineering Manager, followed by a "cultural" discussion with a couple more Managers. The CTO often gets involved at this point too. A tour of Engineering is also done.
  5. Use a tool that makes it easier to scale this process out to lots of people (in terms of both candidates and those doing the hiring). What was hilarious was that we both use Trello for this, and both have recently set up Zapier to allow candidates to be added by email (this was ahead of Trello's recent addition of their email-to-card feature).

Tuesday, 28 May 2013

A systemic approach to coaching agile teams

Last week I was privileged enough to be part of Johanna Rothman's Coaching for Leaders Masterclass.

Four of us from NewVoiceMedia attended and we had a fantastic time. There was much to learn, take away and apply. For me particularly, I saw significant overlap between coaching principles and systemic practice, which my wife is currently studying.

Our first exercise used origami to explore coaching stances, through a very simple, but effective means.
The origami from our coaching session
We then progressed onto "speed-coaching", in triplets of coach, coachee and observer:
  1. The coach coaches the coachee for seven minutes, whilst the observer, well, observes. 
  2. The observer provides feedback to the coach, for three minutes. 
  3. The three rotate roles and repeat.
The triplet I was part of found this massively useful, with each reaching a SMART action within the time set. The systemic links that then came out for me were circularity, curiosity, reflection and neutrality.

Circularity and curiosity

Part of the coach's role is to frame the problem or goal, provide context and explore options. In each case, we saw this being done through ever tightening circles of questions, answers and reflecting back, until the root of the problem or actual goal was established. The tightening of the circle was often achieved by the coach asking curious questions. This process to me fitted well with the principles of circularity and curiosity used by a systemic practitioner to explore a client's situation.

Reflection

It was my first experience of being observed as a coach, and not only did the observer provide great insights into improving my coaching technique, they also provided additional input to the coaching session itself. In fact, many observers in the room found it hard not to be drawn into helping with the coaching. This combination reminded me of the systemic concept of a reflecting team, who observe a therapist and client, then provide additional insights to both.

Neutrality

As the group shared their experiences of speed-coaching, the question came up of whether a coach must be an expert in the coachee's problem domain. Furthermore, what would the impact be if they were a negative expert (i.e. bad at the problem domain)? We concluded that there was a middle sweet spot, but the most important strength was in coaching itself. If the coach did have an opinion on the problem domain, then the concept of neutrality becomes very relevant. In systemic practice, the therapist endeavours to be concious of how their own background might be influencing the session. It's important that they don't inflict their own views or solutions on the client, but rather guide the client in discovering next steps or possible outcomes. This is achieved by practising neutrality.

What's next?

Johanna's fantastic workshop was a great encouragement to me and reinforced many of the good things we're doing at NVM. It's also made me keen to explore further how systemic practice could be applied to agile teams, so watch this space, I'll be posting more on this topic!

Tuesday, 16 August 2011

Posting JSON to a Restful WCF service

This should be simple, but WCF isn't very forthcoming when it comes to deserialization errors.


To get this working with an out-of-the-box .Net 4 Rest WCF service:

  1. Start Fiddler.
  2. Go to Fiddler's Request Builder, and select the Raw tab.
  3. Establish the POST URI, and the format of the POST data (this will be shown on the service's help page).
  4. Copy, paste and edit the below sample request.
  5. Execute the request.
Points to note:

  1. The POST address must end in a slash: http://localhost:57036/endpoint/.
  2. The Content-Type must be set to application/json.
  3. The Content-Length must be match the size of the body.
  4. The body's format must be the correct JSON representation of the object. If in doubt check the service's help page.

Saturday, 13 August 2011

Julian Treasure: 5 ways to listen better | Video on TED.com

Julian Treasure: 5 ways to listen better | Video on TED.com

Just watched this great video on listening. Julian provides five steps, of which I found the following useful:

1. Practice 3 minutes a day of silence.
2. Listen in a noisy environment - how many different channels of sound can you hear?
5. RASA - receive, appreciate, summarise, ask.

Thursday, 28 July 2011

Publishing a website to the filesystem with msbuild and config transforms

Ever since I read Scott Hanselman's post Web Deployment Made Awesome: If You're Using XCopy, You're Doing It Wrong I've wanted to leverage Visual Studio's config transforms, but never had the opportunity until last week. I also took the opportunity to investigate Web Deploy. Here's a summary of my findings:

On Web Deploy
I followed Troy Hunt's excellent series on this topic, in order to learn how to set up an end-to-end build process that uses Web Deploy. Whilst it is indeed an excellent technology, the following notes need bearing in mind:
  1. The target web site, file-system folder and app-pool must all exist to start with. I was quite disappointed to find this, as it means an alternative technology is required to create these in the first place (such as the MSBuild Extension Pack's Web tasks or MSDeploy).
  2. Visual Studio needs to "know" about all files and folders that need deploying. Most cases are covered by marking the file as either Content or as a reference. If your project had files copied into the distribution by either a pre or post-build event then these files won't be deployed.
On MSBuild
The build pipeline I was integrating into used MSBuild Extension Pack's web tasks to deploy to IIS. This meant that my part of the build had to create a transformed web-site as a complete file-set, ready to deploy. I achieved this using the following MSBuild command:

<MSBuild
   Projects="$(SolutionPath)"
   Targets="Clean;Rebuild;ResolveReferences;Package"
   Properties=
"Configuration=$(Configuration);
OutDir=$(MSBuildProjectDirectory)\bin\; 
AutoParameterizationWebConfigConnectionStrings=false;
_PackageTempDir=$(OutDir)"
/>


The items in italics are the important ones:
  1. Package invokes the package step (creating the web-site as a complete file-set), which includes transformation of web.config.
  2. _PackageTempDir=$(OutDir) tells msbuild where to place the resultant package.
  3. AutoParameterizationWebConfigConnectionStrings=false ensures that the package step fully transforms ConnectionString elements. Read more on what happens if this is omitted, or set to true at Troy Hunt's Stack Overflow question.

Monday, 20 June 2011

Get name, table and column of all indexes in a SQL Server database

Inspired by a Stack Overflow post:

select
t.name as [Table Name], col.name as [Column Name], ind.name as [Index Name]
from
    sys.indexes ind
inner join
    sys.index_columns ic on
      ind.object_id = ic.object_id and ind.index_id = ic.index_id
inner join
    sys.columns col on
      ic.object_id = col.object_id and ic.column_id = col.column_id
inner join
    sys.tables t on
      ind.object_id = t.object_id
where
    ind.is_primary_key = 0
    and ind.is_unique = 0
    and ind.is_unique_constraint = 0
    and t.is_ms_shipped = 0
order by
    t.name, ind.name, ind.index_id, ic.index_column_id

Sunday, 25 April 2010

Hiding Skype in the Windows 7 task bar

Windows 7 on the whole is great. It rocks.

However, something that's bugged me since moving to it is that Skype's window always shows on the task bar, unlike it used to hide on Windows Vista and earlier OS's.

Update
Since writing this, Skype have added a UI setting for this: see Skype's Options->Advanced->Advanced settings.

Old fix
  1. Locate the Skype folder under Start->All Programs.
  2. Move the Skype shortcut from the Skype folder to the All Programs->Startup folder (note this requires Administrator rights).
  3. Open the context menu for the newly-moved shortcut.
  4. On the compatibility tab, select the compatibility mode to be Windows Vista (Service Pack 2).
  5. Quit Skype and start it from the Startup folder.
  6. Enjoy not seeing Skype in the task bar!

Wednesday, 3 June 2009

Calling one WCF service from another

Over a year ago I hit this problem, and no amount of work would fix it. A year later, having found myself facing it again, I finally found the solution, thanks to this post.

Whilst the solution was simple, I've written my services so they can be unit-tested. Hence references to instances that require the presence of an HttpRequest are not allowed.

The picture below shows my eventual solution. Whilst it has a large number of classes/interfaces, they are each very small and focussed. They combine together extremely well to allow one service to call another, using Inversion of Control to access the child-service's client.

From Tiny drops of knowledge

Wednesday, 29 April 2009

Hiding the WCF .svc extension on IIS 5 or 6

If you're setting up a WCF web service, its nicer to present a URL that does not have the .svc extension in it, i.e.

http://moviesite.com/movies/123

Instead of
http://moviesite.com/service.svc/movies/123


A simple way of achieving this on IIS versions 5 or 6 is using the free ISAPI Rewrite tool, with the following configuration:

# Don't rewrite url's that already contain .svc.


RewriteRule .*\.svc.* - [L]


# Rewrite requests for host
moviesite.com to be moviesite.com/service.svc/whatever.

RewriteCond %{HTTP:Host}
moviesite.com

RewriteRule ^/(.*)$ /service.svc/$1 [L]

Tuesday, 28 April 2009

Load testing a WCF web-service gives a 403 error on IIS 5.1 (XP Pro)

If you're hosting a WCF web service using XP Pro's IIS and checking its thread-safety by hitting with > 20 threads, then its likely you'll be seeing some 403 errors.

This is unfortunately by design. See Jeff Atwood's article on why and how to get around IIS 5.1's shackles.

Thursday, 23 April 2009

Configuring the Identity of an IIS Application Pool

If a web-site needs to run under a specific identity, IIS application pools provide a convenient means of achieving this. However, a reoccurring problem I come up against in setting these up is forgetting to ensure the identity is also a member of the local IIS_WPG group. TechNet has the full story.

So if you get one of these red icons on your Application Pool, check the IIS_WPG group.

Tuesday, 21 April 2009

NUnit's EqualTo tolerance modifier

Comparing generated DateTime values can always be a bit tricky, but today I discovered NUnit's Within modifier that makes life so much easier:

[Test]
public void CreatedOnDefaultsToNow()
{
SomeClass someObject = new SomeClass();
Assert.That(someObject.CreatedOn,
Is.EqualTo(DateTime.Now).Within(new TimeSpan(1000)));
}

Tuesday, 14 October 2008

Serialising, streams and strings

A common operation is to serialise and object to a string. I'm still finding better and better ways of doing this. My current favourite makes use of .Net 3.0's DataContract. It uses a UTF8Encoding and a MemoryStream as this ensures that the output XML is UTF8.

Enjoy!

using (MemoryStream stream = new MemoryStream())
{
DataContractSerializer serializer = new DataContractSerializer(typeof(SomeClass));
serializer.WriteObject(stream, instanceOfSomeClass);

// Serialisation defaults to UTF8Encoding when used with a stream.
// See Simple Serialization at http://msdn.microsoft.com/en-us/library/ms731073.aspx
string data = Encoding.UTF8.GetString(stream.ToArray());

// Do something useful with the data.
}

Filtering log4net messages

I can never remember how to do this: filter out logging message based on where they come from.

The solution is to use a LoggerMatchFilter. The code below can be inserted into any appender definition:

<filter type="log4net.Filter.LoggerMatchFilter">
<loggertomatch value="NHibernate.Loader.Loader"/>
<acceptonmatch value="false"/>
</filter>

Wednesday, 3 September 2008

Redundancy, L=V+E and being a great leader

I pleased to read in Clusters words that I often say to others. When describing my aim at work, I often state that I strive to make myself redundant, so that:
  1. The team grow to be able to do all that I do, but without me.
  2. I can focus on higher-level goals.
p.159 of Clusters states that "the intention of a good leader ought to be to do themselves out of a job and to do this they need to be aware of the seasons of leadership that God takes them through"

It then goes on to list these seasons/steps (as modelled by a great leader 2000 years ago):
  1. State a clear vision.
  2. Adopt a "I do, you watch" approach ...
  3. Followed by "I do, you help" ...
  4. Followed by "You do, I help" ...
  5. Followed by "You do, I watch".
The final point I noted on leadership was from p.178, where the useful formula was stated of:

Leadership = Vision + Empowerment

A useful exercise is to consider what a team would feel like to be in if either Vision or Empowerment is Low or High, e.g.
  1. Low vision + low empowerment = dead
  2. High vision + low empowerment = burnt-out
  3. Low vision + high empowerment = cosy
  4. High vision + high empowerment = dynamic

Accountability in life

Was given the book Clusters to read this Summer and thoroughly enjoyed it whilst on holiday. It was a great book to read following on from my trip to Karamoja and then reading Velvet Elvis.

The following points stayed with me about being accountable to each other (in a small faith group, or equally at work). Several references were made to the John Wesley Class-meeting System, which would also be worth researching.
  • p83. "Relational, rather than institutional accountability is entirely different ... the relationship is indispensable."
  • p81. Accountability questions:
    1. "What do you want to see changed in your life?"
    2. "What do you sense God is challenging you on?"

Effective evangelism requires ...

Went to a great talk at New Wine by David Parker on what evangelism requires. It is based on Mark 14. Here are the key points I took away:

Effective evangelism requires:
  • Self-denial - personal sacrifice for the good of others.
  • A broken heart for the lost.
  • Demonstrative love: "evangelism is an outward demonstration of all other gifts".
  • Consistency in:
    1. Friendly contact.
    2. Meaningful connections.
    3. Significant content.
  • Creating a climate of pleasant surprise, instead of disappointment.
  • Embracing ultimate joy - anticipation of the good to come.

Thursday, 14 August 2008

SQL errors don't cause exceptions if nocount is off

We had a strange problem today: an end-user was getting unexpected results (no data), but no exceptions were occurring.

The cause was traced to incorrect database permissions, i.e.

Server: Msg 229, Level 14, State 5, Procedure xyz, Line 123
SELECT permission denied on object 'abc', database 'pqr', owner 'dbo'.

The question was, why did this not cause an exception? A possible cause is our use of SqlDataReader, but I was unhappy with the suggested fix. The underlying cause however was that nocount was set to off (its default setting). This caused the row count messages to mask the error, and thus no exception was raised.

Lesson learned: always set nocount on at the start and off at the end of each stored procedure, e.g.

create procedure xyz
as
begin

set nocount on

-- SP SQL

set nocount off

end

go

Thursday, 17 July 2008

Deciding between ref and out

C# defines two keywords for parameter passing modes: ref and out. For a full discussion of why this is, see this msdn article, from where the below examples are taken. This is a summary of which to choose and why.

When to use neither

ref and out are used for methods that pass back two or more values to the caller. This is often a code smell indicative of the need for a new encapsulating struct or class. As a rule of thumb, where three or more ref’s or out’s are required, use a struct or class to encapsulate them into a single parameter instead.

When to use 'out'

Use out when the method’s focus is to provide two or more new return values, some of which may be null/empty.

In the following example, the firstName and lastName parameter values are only of interest after the call to SplitName. Neither the callee nor the caller require knowledge of their initial value, and its valid that either or both remain null/empty.

class OutExample
{
static void SplitName(string fullName, out string firstName, out string lastName)
{
// NOTE: firstName and lastName have not been assigned to yet. Their values cannot be used.
int spaceIndex = fullName.IndexOf(' ');
firstName = fullName.Substring(0, spaceIndex).Trim();
lastName = fullName.Substring(spaceIndex).Trim();
}

static void Main()
{
string fullName = "Yuan Sha";
string firstName;
string lastName;

// NOTE: firstName and lastName have not been assigned yet. Their values may not be used.
SplitName(fullName, out firstName, out lastName);
// NOTE: firstName and lastName have been assigned, because the out parameter passing mode guarantees it.

System.Console.WriteLine("First Name '{0}'. Last Name '{1}'", firstName, lastName);
}
}


When to use 'ref'

Use ref when the method’s focus is to return a value and make use of and potentially update a second value.

In the following example, the index parameter’s value is of interest before and after the call to FindNext. Both the callee and the caller require knowledge of its initial value, and its valid that it may be modified by the call to FindNext.


class RefExample
{
static object FindNext(object value, object[] data, ref int index)
{
// NOTE: index can be used here because it is a ref parameter
while (index < data.Length)
{
if (data[index].Equals(value))
{
return data[index];
}
index += 1;
}
return null;
}

static void Main()
{
object[] data = new object[] {1,2,3,4,2,3,4,5,3};

int index = 0;
// NOTE: must assign to index before passing it as a ref parameter
while (FindNext(3, data, ref index) != null)
{
// NOTE: that FindNext may have modified the value of index
System.Console.WriteLine("Found at index {0}", index);
index += 1;
}

System.Console.WriteLine("Done Find");
}
}